| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | NVIDIA GTC Paris und ISC High Performance-Konferenz 2025, eine Pressemitteilung
|
Autor
|
Thema: mein erstes Makro! bitte um verbesserungsvorschläge!! (1547 mal gelesen)
|
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 06. Feb. 2007 14:28 <-- editieren / zitieren --> Unities abgeben:         
hallo ich war schon lange nicht mehr aktiv (noch mit VBA noch hier im Forum). stelle aber nun aber mal mein erstes Makro hier rein!! wäre fein, wenn jemand mal ein auge darauf wirft und mir vielleicht tipps gibt, wie ich das ganze verbessern könnte (Code) schon mal thx Sub Vorziehung_einfach() Dim StrRadius As String Dim StrAbstand_1 As String Dim StrAbstand_2 As String Dim cstrBlockDWG As String Dim aceBlock As AcadBlockReference Dim ObjNewLayer As AcadLayer Dim VarPt As Variant Dim StarPt(0 To 2) As Double Dim EndPt(0 To 2) As Double Dim CenterPt(0 To 2) As Double Dim IntPt(0 To 2) As Double Dim ObjHelpLine(5) As AcadLine Dim ObjLine(3) As AcadLine Dim ObjOffsetLine As Variant Dim ObjCircle(3) As AcadCircle Dim ObjArc(2) As AcadArc StrRadius = InputBox("geben sie bitte den Radius ein:", "Vorziehung") StrAbstand_1 = InputBox("geben sie bitte den 1. Vorziehungsabstand ein:", "Vorziehung") StrAbstand_2 = InputBox("geben sie bitte den 2. Vorziehungsabstand ein:", "Vorziehung") '1. Schritt: Set ObjNewLayer = ThisDrawing.Layers.Add("Hilf") 'Hilfslayer wird erstellt ObjNewLayer.Color = acYellow 'Farbe zuweisen ObjNewLayer.Plottable = False 'kann nicht geplotte werden 'Punkte für Hilfslinien werden vom User angegeben VarPt = ThisDrawing.Utility.GetPoint(, "Bitte 1. Punkt wählen: ") '1. Punkt für 1. Hilfslinie StarPt(0) = VarPt(0) StarPt(1) = VarPt(1) VarPt = ThisDrawing.Utility.GetPoint(, "Bitte 2. Punkt wählen: ") '2. Punkt für 1. Hilfslinie EndPt(0) = VarPt(0) EndPt(1) = VarPt(1) Set ObjHelpLine(0) = ThisDrawing.ModelSpace.AddLine(StarPt, EndPt) '1. Hilfsline wird gezeichnet ObjHelpLine(0).Layer = ("hilf") VarPt = ThisDrawing.Utility.GetPoint(, "Bitte 3. Punkt wählen: ") '1. Punkt für 2. Hilfslinie StarPt(0) = VarPt(0) StarPt(1) = VarPt(1) VarPt = ThisDrawing.Utility.GetPoint(, "Bitte 4. Punkt wählen: ") '2. Punkt für 2. Hilfslinie EndPt(0) = VarPt(0) EndPt(1) = VarPt(1) Set ObjHelpLine(1) = ThisDrawing.ModelSpace.AddLine(StarPt, EndPt) '2. Hilfsline wird gezeichnet ObjHelpLine(1).Layer = ("hilf") '2. Schritt: Set ObjNewLayer = ThisDrawing.Layers.Add("3s_arsl") 'Randsteinglayer wird erstellt ObjNewLayer.Color = acRed 'Farbe zuweisen
ObjOffsetLine = ObjHelpLine(0).Offset(StrAbstand_1) 'gelbe Hilfslinie wird versetzt ... Set ObjLine(0) = ObjOffsetLine(0) ObjLine(0).Layer = ("3s_arsl") '... und versetzter Linie wird Layer zugewiesen ObjOffsetLine = ObjHelpLine(1).Offset(-StrAbstand_2) 'gelbe Hilfslinie wird versetzt ... Set ObjLine(1) = ObjOffsetLine(0) ObjLine(1).Layer = ("3s_arsl") '... und versetzter Linie wird Layer zugewiesen '3. Schritt (Hilfslinien für Hilfskreis und Hilfskreis werden gezeichnet): ObjOffsetLine = ObjLine(0).Offset(-StrRadius) Set ObjHelpLine(2) = ObjOffsetLine(0) ObjHelpLine(2).Color = acYellow ObjOffsetLine = ObjLine(1).Offset(StrRadius) Set ObjHelpLine(3) = ObjOffsetLine(0) ObjHelpLine(3).Color = acYellow VarPt = ObjHelpLine(2).IntersectWith(ObjHelpLine(3), acExtendBoth) CenterPt(0) = VarPt(0) CenterPt(1) = VarPt(1) Set ObjCircle(0) = ThisDrawing.ModelSpace.AddCircle(CenterPt, StrRadius) ObjCircle(0).Layer = ("3s_arsl") ObjHelpLine(2).Delete ObjHelpLine(3).Delete VarPt = ObjLine(0).IntersectWith(ObjCircle(0), acExtendBoth) IntPt(0) = VarPt(0) IntPt(1) = VarPt(1) Set ObjHelpLine(2) = ThisDrawing.ModelSpace.AddLine(CenterPt, IntPt) ObjHelpLine(2).Layer = ("hilf") VarPt = ObjLine(1).IntersectWith(ObjCircle(0), acExtendBoth) IntPt(0) = VarPt(0) IntPt(1) = VarPt(1) Set ObjHelpLine(3) = ThisDrawing.ModelSpace.AddLine(CenterPt, IntPt) ObjHelpLine(3).Layer = ("hilf") Set ObjArc(0) = ThisDrawing.ModelSpace.AddArc(CenterPt, StrRadius, ObjHelpLine(2).Angle, ObjHelpLine(3).Angle) ObjArc(0).Layer = ("3s_arsl") ObjCircle(0).Delete Set ObjCircle(0) = ThisDrawing.ModelSpace.AddCircle(ObjArc(0).StartPoint, 1) ObjCircle(0).Layer = ("hilf") Set ObjCircle(1) = ThisDrawing.ModelSpace.AddCircle(ObjArc(0).EndPoint, 1) ObjCircle(1).Layer = ("hilf") VarPt = ObjHelpLine(2).IntersectWith(ObjCircle(0), acExtendNone) IntPt(0) = VarPt(0) IntPt(1) = VarPt(1) ObjCircle(0).Delete Set ObjCircle(0) = ThisDrawing.ModelSpace.AddCircle(IntPt, 1) ObjCircle(0).Layer = ("hilf") VarPt = ObjHelpLine(3).IntersectWith(ObjCircle(1), acExtendNone) IntPt(0) = VarPt(0) IntPt(1) = VarPt(1) ObjCircle(1).Delete Set ObjCircle(1) = ThisDrawing.ModelSpace.AddCircle(IntPt, 1) ObjCircle(1).Layer = ("hilf") VarPt = ObjHelpLine(0).IntersectWith(ObjHelpLine(2), acExtendBoth) IntPt(0) = VarPt(0) IntPt(1) = VarPt(1) ObjHelpLine(2).Delete Set ObjHelpLine(2) = ThisDrawing.ModelSpace.AddLine(ObjCircle(0).Center, IntPt) ObjHelpLine(2).Layer = ("hilf") ObjOffsetLine = ObjHelpLine(2).Offset(1) Set ObjLine(2) = ObjOffsetLine(0) ObjLine(2).Layer = ("3s_arsl") ObjHelpLine(2).Delete VarPt = ObjHelpLine(1).IntersectWith(ObjHelpLine(3), acExtendBoth) IntPt(0) = VarPt(0) IntPt(1) = VarPt(1) ObjHelpLine(3).Delete Set ObjHelpLine(2) = ThisDrawing.ModelSpace.AddLine(ObjCircle(1).Center, IntPt) ObjHelpLine(2).Layer = ("hilf") ObjOffsetLine = ObjHelpLine(2).Offset(-1) Set ObjLine(3) = ObjOffsetLine(0) ObjLine(3).Layer = ("3s_arsl") ObjHelpLine(2).Delete Set ObjHelpLine(2) = ThisDrawing.ModelSpace.AddLine(ObjCircle(0).Center, ObjLine(2).StartPoint) ObjHelpLine(2).Layer = ("hilf") Set ObjHelpLine(3) = ThisDrawing.ModelSpace.AddLine(ObjCircle(0).Center, ObjArc(0).StartPoint) ObjHelpLine(3).Layer = ("hilf") Set ObjArc(1) = ThisDrawing.ModelSpace.AddArc(ObjCircle(0).Center, 1, ObjHelpLine(2).Angle, ObjHelpLine(3).Angle) ObjArc(1).Layer = ("3s_arsl") ObjHelpLine(2).Delete ObjHelpLine(3).Delete ObjCircle(0).Delete Set ObjHelpLine(2) = ThisDrawing.ModelSpace.AddLine(ObjCircle(1).Center, ObjLine(3).StartPoint) ObjHelpLine(2).Layer = ("hilf") Set ObjHelpLine(3) = ThisDrawing.ModelSpace.AddLine(ObjCircle(1).Center, ObjArc(0).EndPoint) ObjHelpLine(3).Layer = ("hilf") Set ObjArc(2) = ThisDrawing.ModelSpace.AddArc(ObjCircle(1).Center, 1, ObjHelpLine(3).Angle, ObjHelpLine(2).Angle) ObjArc(2).Layer = ("3s_arsl") ObjHelpLine(0).Delete ObjHelpLine(1).Delete ObjHelpLine(2).Delete ObjHelpLine(3).Delete ObjCircle(1).Delete ObjLine(0).Delete ObjLine(1).Delete Set ObjNewLayer = ThisDrawing.Layers.Add("3___pkp") ObjNewLayer.Color = acWhite cstrBlockDWG = "punkt-voll.dwg" Set aceBlock = ThisDrawing.ModelSpace.InsertBlock(ObjArc(1).StartPoint, cstrBlockDWG, 1, 1, 1, 0) Set aceBlock = ThisDrawing.ModelSpace.InsertBlock(ObjArc(1).EndPoint, cstrBlockDWG, 1, 1, 1, 0) Set aceBlock = ThisDrawing.ModelSpace.InsertBlock(ObjArc(2).StartPoint, cstrBlockDWG, 1, 1, 1, 0) Set aceBlock = ThisDrawing.ModelSpace.InsertBlock(ObjArc(2).EndPoint, cstrBlockDWG, 1, 1, 1, 0) End Sub ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 06. Feb. 2007 19:05 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hi Gambrinus, Warum nimmst du immer VarPt und übergibst diese dann an StrtPt oder EndPt?! Da kannst du ja auch direkt StartPt = This Drawing... nehmen. Code:
VarPt = ThisDrawing.Utility.GetPoint(, "Bitte 2. Punkt wählen: ") '2. Punkt für 1. Hilfslinie EndPt(0) = VarPt(0) EndPt(1) = VarPt(1)
Du kannst den Layer auch vo der Erstellung der Linien, Kreise usw. aktiv stellen, dann brauchst du den einzelnen Objekten nicht nachträglich den Layer zuweisen: Dim ActLayer As AcadLayer Set ActLayer = ThisDrawing.Layers("Hilfsl") Aber das ist Geschmackssache. Ich schaue mir das vielleicht Morgen noch mal an. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer

 Beiträge: 9807 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 06. Feb. 2007 20:41 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Gut fände ich noch einen Kommentar im Programm, was das Programm überhaupt bewirkt und welche Voraussetungen gegeben sein müssen. Was z.B. ist "Vorziehung"? ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 08:19 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von Carsten1210: HWarum nimmst du immer VarPt und übergibst diese dann an StrtPt oder EndPt?! Da kannst du ja auch direkt StartPt = This Drawing... nehmen.
das ist eine gute Frage!! habe es mir auch angesehen und es ergibt keinen Sinn, werde es auch gleich umarbeiten!! THX ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator

 Beiträge: 2494 Registriert: 02.11.2001
|
erstellt am: 07. Feb. 2007 09:20 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
|
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 09:34 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von CAD-Huebner: Gut fände ich noch einen Kommentar im Programm, was das Programm überhaupt bewirkt und welche Voraussetungen gegeben sein müssen.Was z.B. ist "Vorziehung"?
das ist ein vorziehung!! wird in einem Kreuzungsbereich an den gehsteig angebaut um die sicht zu verbessern!! ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 09:44 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von marc.scherer: Hi, ich würde ein wenig modularisieren. z.B. wirst Du immer wieder die Anforderung haben einen Layer mit bestimmten Parametern zu erzeugen. Warum baust Du dafür keine Function? z.B. in der Art: Public Function CreateLayer(NAME, DESCRIPTION, COLOR, LINETYPE, LINEWEIGHT, PLOTTABLE, SetCurrentFlag)Die Funktion packst Du in ein immer zu ladendes Projekt und kannst fortan nur noch die Sub aufrufen.
das mit den Layern ist so eine Sache, über die ich auch schon nachgedacht habe!! den "hilf" layer brauche ich nicht(!!), da die objekte die auf diesem layer erstellt werden, wieder gelöscht werden. die anderen zwei Layer die noch in diesem Makro vorkommen sind sowieso in der Vorlagendatei vorhanden!! ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator

 Beiträge: 2494 Registriert: 02.11.2001
|
erstellt am: 07. Feb. 2007 10:06 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
|
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 12:50 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Das ist kein Argument. Was, wenn der User 'ne andere Vorlage gewählt hat oder den Layer bereinigt hat? Du kannst keine Programme schreiben, bei denen Du einfach davon ausgehst das schon was vorhanden ist. Was Du brauchst mußt Du abprüfen und bei Bedarf erzeugen können.
das ist natürlich richtig und ich muss dir bedingungslos recht geben! Nur die große Frage für mich ist, wie ich überprüfe ich das? 1. Ich müsste überprüfen, ob die zwei Layer vorhanden sind, oder? (weiß ich aber nicht, iwe das geht:confused  2. wenn nicht dann müsste ich ich sie erstellen (das sollte ich hinbekommen) 2. sind sie vorhanden, müsste ich sie wiederrum aktivieren (sollte ich schaffen - habe aber gerade ein brett vor dem kopf)
------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 07. Feb. 2007 13:06 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hi, Zu 1: Durchlauf doch einfach die Layer-Collection und vergleiche die Namen, ob deiner schon vorkommt. Edit: Hier noch ein einfacher Code dazu: Public Sub abc() Dim lay As AcadLayer For Each lay In ThisDrawing.Layers 'Durchlaufe jeden Layer in der Zeichnung If lay.Name = "0" Then 'wenn Layer = Layer 0 dann mach folgendes... MsgBox lay.Name End If Next End Sub Zu 2: Hier ein Codeschnipsel aus der Hilfe: Dim newlayer As AcadLayer Set newlayer = ThisDrawing.Layers.Add("LAYER1") Zu 3: ThisDrawing.ActiveLayer = newlayer Gruß, Carsten [Diese Nachricht wurde von Carsten1210 am 07. Feb. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 14:21 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von Carsten1210: [B]Zu 1: Durchlauf doch einfach die Layer-Collection und vergleiche die Namen, ob deiner schon vorkommt.
muss ich aber schon vorher: Dim objLayers As AcadLayers Set objLayers = ThisDrawing.Layers und dann eben in einer Schleife abfragen, ob der Layer vorhanden ist und wenn nicht, dann eben erstellen!?! ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 07. Feb. 2007 14:47 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hi, Hab hier mal schnell was zusammen gebastelt: Public Sub abc() Dim lay As AcadLayer Dim i As Long i = 0 For Each lay In ThisDrawing.Layers 'Durchlaufe jeden Layer in der Zeichnung If lay.Name = "test" Then 'wenn Layer = Layer 0 dann mach folgendes... i = 1 'Setze Variable i auf 1 wenn Layer vorhanden End If Next If i = 0 Then 'Wenn I = 0 (Layer nicht vorhanden), dann Layer erstellen. Set lay = ThisDrawing.Layers.Add("test") lay.color = acRed End If '''Code... '''Layer Aktiv setzen ThisDrawing.ActiveLayer = ThisDrawing.Layers("test") End Sub Gruß, Carsten
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator

 Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 07. Feb. 2007 16:54 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Ich zitiere mal die ActiveX Hilfe: Zitat:
Item Method Gets the member object at a given index in a collection, group, or selection set.Signature RetVal = object.Item(Index) Object: All Collections, Group, SelectionSet The object or objects this method applies to. Index: Variant; input-only The index location in the collection for the member item to query. The index must be either an integer or a string. If an integer, the index must be between 0 and N-1, where N is the number of objects in the collection or selection set. RetVal Object The object at the given index location in the collection or selection set. Remarks This method supports string-based iteration. For example, if a block named BLOCK1 was created with the following statement: Set block1 = Blocks.Add("BLOCK1") you could reference the object through the following statement: Set whichblock = Blocks.Item("BLOCK1") NOTE The Item method is case-sensitive when used with the SelectionSets collection; it is not case-sensitive for other collections.
Alles klar? Auch die Layercollection läßt sich so abfragen.
Code: Set whichlayer = Layers.Item("MeinTollerLayer")
Kein Grund durch die ganze Chose durchzuhecheln.------------------ Ciao, Marc Mein AG sucht u.a. Architekten und Bauzeichner! Mein alter AG sucht 'nen CADMIN [Diese Nachricht wurde von marc.scherer am 07. Feb. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 17:18 <-- editieren / zitieren --> Unities abgeben:         
Danke vorerst mal an euche beide Carsten1210 und marc.scherer für eure Hilfe, die mich echt weiter bringt beim Verstehen (meistens zu mindest) und auch beim Grübeln über meinen Code. Code: For Each ObjLayer In ThisDrawing.Layers If ObjLayer.Name = "3s_arsl" Then i = True End If Next If i = False Then Set ObjLayer = ThisDrawing.Layers.Add("3s_arsl") ObjLayer.color = acRed End If ThisDrawing.ActiveLayer = ThisDrawing.Layers("3s_arsl")
"i" habe ich als boolean gesetzt weil es, finde ich, eh nur ja oder nein gibt!! die methode verstehe ich nich so wirklich, weil ich einfach nicht nachvollziehen kann was da genau passiert!! villeicht könntest du sie mir bitte auf deutsch mit deinen eigenen worten erklären?
------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
   
 Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 07. Feb. 2007 17:35 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hallo, einen boolean ausgerechnet mit i zu deklarieren ist nicht so dolle, aber ansonsten kann man es so machen. Ggf. noch bei 'gefunden' mit Exit For aussteigen. Theoretisch kannste dir aber das Schleifchen schenken und es sozusagen einfach mal 'draufankommen' lassen;-) ich denke so in der Richtung meinte auch Marc.
Code:
Sub asdf() On Error Resume Next ThisDrawing.Layers.Add "3s_arsl" On Error GoTo 0 ThisDrawing.ActiveLayer = ThisDrawing.Layers("3s_arsl") End Sub
Gruss NancyEine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 07. Feb. 2007 17:44 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hi, Wie gesagt, das war eben schnell zusammengebastelt. Normal nutze ich auch kein i für boolean. Bei der Methode von Marc kannst du direkt auf den Layer zugreifen, wenn er denn vorhanden ist, sonst musst du den Fehler abfangen. Aber das ist dann Geschmackssache, wie man es löst. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 17:55 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von startrek: einen boolean ausgerechnet mit i zu deklarieren ist nicht so dolle, aber ansonsten kann man es so machen.
warum nicht mit i und wie sonst? ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 07. Feb. 2007 18:05 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hi, Die Variable i wird normalerweise für Aufzählungen bzw. fürs durchlaufen von Collections genutzt. So wie hier: Sub Ch2_IterateLayer() ' Iterate through the collection On Error Resume Next Dim I As Integer Dim msg As String msg = "" For I = 0 To ThisDrawing.Layers.count - 1 msg = msg + ThisDrawing.Layers.Item(I).Name + vbCrLf Next MsgBox msg End Sub Gruß, Carsten
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
   
 Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 07. Feb. 2007 18:16 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Weil i sich eher als eine Art Usus für einen Zähler eingebürgert hat, aber das auch nur für kleine 'aufdieSchnelleProgs'. Booleans heissen bei mir 'flag', 'found' oder irgendsowas sinniges;-) Generell lässt sich aber aus der Variablenbenennung eine Wissenschaft für sich machen, also durchkonzipiert von Anfang bis Ende (bolVar, intVar, dblVar u.ä.), Herkunft (Prozedur, Klasse, Eigenschaft etcpp), was bei richtig umfangreichen Programmen auch Sinn macht. Aber ich wollt Dich nicht versunsichern wegen des i, des passt/funktioniert schon so;-) Gruss Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator

 Beiträge: 2494 Registriert: 02.11.2001
|
erstellt am: 07. Feb. 2007 18:33 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Zitat: Original erstellt von startrek: Theoretisch kannste dir aber das Schleifchen schenken und es sozusagen einfach mal 'draufankommen' lassen;-) ich denke so in der Richtung meinte auch Marc.
Na ja, ich meinte es schon ein wenig strukturierter ;-) In etwa so was (auch gleich eine Demo Sub Function): Code:
'Option Explicit Sub testLayer() Dim Back As Boolean Back = GetLayer("Layer1") End SubPublic Function GetLayer(strLayer As String) Dim Layers As AcadLayers Dim Layer As AcadLayer Dim retval As Boolean 'Dim strLayer As String Set Layers = ThisDrawing.Layers 'strLayer = "Layer1" On Local Error Resume Next Set Layer = Layers.Item(strLayer) If TypeName(Layer) = "Nothing" Then MsgBox "Layer >" & strLayer & "< NICHT vorhanden" retval = False Else MsgBox "Layer >" & strLayer & "< ist VORHANDEN" retval = True End If GetLayer = retval End Function
...------------------ Ciao, Marc Mein AG sucht u.a. Architekten und Bauzeichner! Mein alter AG sucht 'nen CADMIN Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MA28 Mitglied Bautechnischer Zeichner

 Beiträge: 53 Registriert: 17.03.2003 W2k pro 5.0.2195 SP3; AutoCAD 2002; HP DesignJet 750c & 800
|
erstellt am: 07. Feb. 2007 18:39 <-- editieren / zitieren --> Unities abgeben:         
werde auch diese Anmerkung über das "i" in mich aufnehmen! auch werde ich es in meinem code berücksichtigen! ich glaube ich werde es einfach coin nennen!! warum? eine Münze hat auch nur zwei Seiten genau so wie boolean!! ------------------ mfG Gambrinus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 07. Feb. 2007 18:52 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hallo Gambrinus, da will ich auch noch meinen Senf zum i abgeben Wenn du nur eine Funktion und ein Modul hast ist es vielleicht egal wo die Variable (oder wahr es doch eine Konstante) gilt. SInd es mal mehr ist auch noch interessant wo dir Variable gilt. Einen Typumwandlungsfehler gibt der Compiler ja aus und man kann den Fehler schnell beseitigen. Wenn du aber Variablen an der falschen STelle unbeabsichtigt veränderst kann das schlimmstenfalls nie auffallen bis jemand kommt und fragt warum dein Proggi immer wieder mal falsche Werte liefert. Bei mir würde die Variable vlbo_Egalwie heissen. VariableLokalBoolean oder halt VariableGobalBoolean wenn sie im ganzen Modul gilt. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
   
 Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 10. Feb. 2007 00:21 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Zitat: Original erstellt von marc.scherer:
Na ja, ich meinte es schon ein wenig strukturierter ;-)
*feix* .. ich denke Männer denken viel sensibler in Code's als Frauen. [Glaube zumindest] Für meinen Teil bin ich da ziemlich brutal rangegangen, oder halt minimalistischst, aber du hast recht - dein Code ist ein gutes Beispiel für eine Standardfunction. OT: Hatte mal die Frage mit Axel: - Kann man rein am Code erkennen, ob er von einer Frau oder einem Mann stammt? eine richtige Antwort drauf haben wir beide keine eine gefunden ... lg Nancy
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nepumuk Mitglied Entwicklungsleiter
 
 Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 10. Feb. 2007 14:01 <-- editieren / zitieren --> Unities abgeben:          Nur für MA28
Hallo Nancy, Code: Kann man rein am Code erkennen, ob er von einer Frau oder einem Mann stammt?
Du erwartest jetzt hoffentlich keine "ehrliche" Antwort auf diese Frage. Wir Männer sind doch nicht lebensmüde. Frage an Boris Becker: Was ist der Unterschied zwischen ihnen und Steffi Graf? Antwort von Boris: Ich spiele Tennis, Steffi spielt Damentennis. ------------------ Gruß Nepumuk  [Diese Nachricht wurde von Nepumuk am 10. Feb. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |