| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Layer nach variable benennen (2025 mal gelesen)
|
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 11:23 <-- editieren / zitieren --> Unities abgeben:
hi ich möchte über vba einen neuen layer erstellen und dabei soll der name des neuen layers durch eine variable belegt werden. mit Dim NewLayer As AcadLayer Set NewLayer = ThisDrawing.Layers.Add("test") variable = beliebiger_layerName NewLayer.name = variable gehts nicht. wie dann? danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Sep. 2009 11:32 <-- editieren / zitieren -->
Hi, zum einen sehe ich nicht, was sich hinter der Variable 'beliebiger_layerName' verbirgt? Welcher Wert steht in dieser Variable drin. Weiters hast Du keine Prüfung, ob eine Layer mit diesem neue zugewiesenen Namen bereits existiert. Layernamen dürfen auch nur bestimmtem Syntax folgen, also z.B. kein '*' oder '?' oder '/' enthalten. Und last but not least: 'gehts nicht. wie dann?' Sorry, aber mit der Meldung komm ich sonst nicht weiter, denn wo Dein Code beim Debuggen stehen bleibt und welche Meldung dabei ausgegeben wird (oder zumindest irgendeine Beschreibung, was nicht geht und wie sich dies auswirkt), ist nicht nur hilfreich, sondern notwendig! - alfred - ------------------ www.hollaus.at |
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 12:22 <-- editieren / zitieren --> Unities abgeben:
hinter variable = beliebiger_layerName versteckt sich eine kombination von zahlen und text ich bin mir sicher das kein layer bereits so heißt. deshalb keine abfrage. fehlermeldung: laufzeitfehler .... aufrufmethode setObjectID von schnittstelle iacadbaseObject fehlgeschlagen. ? danke
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Sep. 2009 13:16 <-- editieren / zitieren -->
Hi, Zitat: fehlermeldung: laufzeitfehler .... aufrufmethode setObjectID von schnittstelle iacadbaseObject fehlgeschlagen.
...bei welcher Zeile tritt diese Fehlermeldung auf? Das kannst Du probieren:
Code: Dim NewLayer As AcadLayer On Error Resume Next Set NewLayer = ThisDrawing.Layers.Add(beliebiger_layerName) If Err.Number <> 0 Then 'Fehler aufgetreten Else 'Alle ok End If
- alfred - ------------------ www.hollaus.at |
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 13:46 <-- editieren / zitieren --> Unities abgeben:
|
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 sw: Win7-x64 Office 365 ProPlus C3D (& LT ) ET; DACH; Extensions ------------------- hw: FX3800 i5 CPU 670 8GB RAM
|
erstellt am: 05. Sep. 2009 13:56 <-- editieren / zitieren --> Unities abgeben: Nur für adblue
Hi, >> wenn ich die anführungszeichen wieder eingebe, gehts einwandfrei. Ohne ein VBA-fähiges ACAD da zu haben: Die Namensübergabe verlangt einen String. Ist Deine Variable ein String? layer_Name = "123-blabla-456" vor den Aufruf Set NewLayer = ThisDrawing.Layers.Add(layerName) sollte es doch tun? Ich glaube, das war auch schon oben Dein Fehler bei variable = beliebiger_layerName Grundsätzlich würde ich ein Option explicit ganz am Anfang empfehlen, dann fallen solche Fehler besser auf. HTH ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Excel -Suche | RuA-Suche | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 13:59 <-- editieren / zitieren --> Unities abgeben:
|
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 14:52 <-- editieren / zitieren --> Unities abgeben:
nächstes problem: ich will jetzt jeden layer durchschauen und nach einem bestimmten text im namen suchen: For Each objLayer In ThisDrawing.Layers Debug.Print InStr(1, "test", objLayer.name, vbTextCompare) next es kommen layer vor, die den begriff "test" im namen tragen wieso wird dann trotzdem bei der suche mit instr() immer 0 ausgegeben. welche besonderheit von autocad steckt da wieder dahinter? thx
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Sep. 2009 14:59 <-- editieren / zitieren -->
Hi, Du suchst aber nicht nach "test" im Layernamen, sondern ob der Layername im String "test" vorkommt. Gleich dazu: Achten auf Groß-/Kleinschreibung Und vergleichen kannst Du so schneller: if UCase(objLayer.name) like "*TEST*" - alfred - ------------------ www.hollaus.at |
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 sw: Win7-x64 Office 365 ProPlus C3D (& LT ) ET; DACH; Extensions ------------------- hw: FX3800 i5 CPU 670 8GB RAM
|
erstellt am: 05. Sep. 2009 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für adblue
>> es lag am unterstrich in der variable !!! ääh, wie meinen? Der Unterstrich selber spielt keine Geige, die Deklaration und Belegung der Variablen ist entscheidend. Also ich hab oben nen Schreibfehler drin Richtig müßte es heißen: >> layer_Name = "123-blabla-456" >> vor den Aufruf Set NewLayer = ThisDrawing.Layers.Add(layer_Name) Das fett geschriebene muß schon identisch sein, sonst sind es wieder 2 versch. Variablen. Daher auch meine Empfehlung, Option Explicit zu verwenden. Sobald Du was falsch schreibst, ist es für ACAD natürlich ne neue Variable. Die hast Du oben nicht deklariert und schon fängt es an zu meckern. Ist ausnahmsweise nicht nervig, sondern hilfreich, diese Meckerei ;-) Mit Deiner Ursprungszeile >> variable = beliebiger_layerName übergibst Du der Variablen variable eine andere Variable, nämlich beliebiger_layerName. Diese hast Du jedoch nirgendwo deklariert und auch nicht belegt, also ist sie leer, damit ist auch Deine variable leer und es wird kein layer erzeugt. Wenn Du es so machst, mußt Du a) variable = "beliebiger_layerName" schreiben, damit wird variable mit dem String "beliebiger_layerName" belegt. Oder b) beliebiger_layerName = "123-blabla-456" variable = beliebiger_layerName damit wird variable mit dem String "123-blabla-456" belegt. Code: Dim layer_Name$ ' $ = as String Dim NewLayer As AcadLayer On Error Resume Nextlayer_Name = "123-blabla-456" Set NewLayer = ThisDrawing.Layers.Add(layer_Name) If Err.Number <> 0 Then 'Fehler aufgetreten Else 'Alle ok End If
wäre also der vollständige Block.Probier einfach nochmal ein bißchen rum, dann erkennst Du die Unterschiede Tipp: Blende Dir mal das Lokalfenster mit ein und beobachte dort Deine Variablen, während Du den code schrittweise mit F8 durchgehst. Außderdem schau Dir mal die allg. üblichen Konventionen bzgl. VariablenNamen und Datentypen an. Ein recht nettes Tutorial zum Thema findest Du übrigens HIER (die 3 von http://ertls.de/) Viel Spaß mit VBA ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Excel -Suche | RuA-Suche | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope [Diese Nachricht wurde von runkelruebe am 05. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 17:30 <-- editieren / zitieren --> Unities abgeben:
|
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 sw: Win7-x64 Office 365 ProPlus C3D (& LT ) ET; DACH; Extensions ------------------- hw: FX3800 i5 CPU 670 8GB RAM
|
erstellt am: 05. Sep. 2009 17:44 <-- editieren / zitieren --> Unities abgeben: Nur für adblue
Hi, mit Ebenen meinst Du sicherlich Layer. Mit Sortieren meinst Du wahrscheinlich die Zeichnungsreihenfolge und nicht die Ansicht im Layereigenschaftenmanager. Versuch bitte, die passenden Fachbegriffe bei Deinen Fragen zu verwenden. Such dazu im Forum nach DrawOrderX. Anmerkung: Du wirst davon eine Demo finden, keine Vollversion. Es gibt imho noch andere tools, wie gesagt: Forensuche (im Rund um AutoCAD-Brett, link dazu in meiner Signatur) nach Zeichnungsreihenfolge und artverwandte Suchbegriffe. Kannst Dir sowas natürlich auch selber schreiben Solltest Du doch die Ansicht meinen, kannst Du auf- u. absteigend nach den Spaltenüberschriften als Kriterien (wie Name oder Status oder Farbe) sortieren oder Layerfilter nutzen. ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Excel -Suche | RuA-Suche | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
adblue Mitglied .
Beiträge: 57 Registriert: 22.05.2009
|
erstellt am: 05. Sep. 2009 18:57 <-- editieren / zitieren --> Unities abgeben:
hi nochmal noch eine kleine frage: ich frage über eine for each -schleife alle layer ab ob ein layer dabei der einen bestimmten namen hat. wenn es gefunden wurde soll auf diesem layer ein punkt gezeichnet werden. die programmcode für das suchen und punkt setzten sind mir bekannt. nur ein problem habe ich. wenn ich den richtigen layer gefunden habe, weiß ich nicht wie sein "object" heißt. wenn ich layer über vba erstelle würde ich das so lösen: Dim NewLayer As AcadLayer Set NewLayer = ThisDrawing.Layers.Add("Layer_eins") ThisDrawing.ActiveLayer = NewLayer .. hier würde ich den code eingeben für die punkterstellung aber wenn der layer schon besteht kenne ich diesen name nicht: NewLayer den ich bei activeLayer einsetzen muss. habt ihr vorschläge für mich? thx
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Sep. 2009 19:34 <-- editieren / zitieren -->
Hi, Zitat: ich frage über eine for each -schleife alle layer ab ob ein layer dabei der einen bestimmten namen hat .......... ........aber wenn der layer schon besteht kenne ich diesen name nicht
...also kennst Du jetzt den Namen des Layers oder kennst Du den Namen nicht. Deine Frage oben widerspricht sich oder ich verstehe nicht, ist ja auch möglich. ;) Ich mach mal so, dass Du einen Layernamen kennst, dann prüfst, ob dieser vorhanden ist, wenn ja, dann ok, wenn nein, dann wird dieser erstellt:
Code: Dim tNewNameStr as String tNewNameStr = "Layer4711" 'so soll der Layer benannt werdenDim tLayer as AcadLayer On Error Resume Next Set tLayer = ThisDrawing.Layers(tNewNameStr) If tLayer is Nothing then 'dann besteht der Layer mit dem Namen "Layer4711" noch nicht, er muss angelegt werden Set tLayer = ThisDrawing.Layers.Add(tNewNameStr) End If If tLayer is Nothing then 'dann muss abgebrochen werden, denn der Layer ist nicht anlegbar Else 'hier kannst Du jetzt Deinen Punkt zeichnen und den Punkt auf den Layer legen Dim tCoords(2) as Double tCoords(0) = 10.0 'X-Wert tCoords(1) = 5.0 'Y-Wert tCoords(0) = 0.0 'Z-Wert Dim tPnt as AcadPoint Err.Clear Set tPnt = ThisDrawing.ModelSpace.AddPoint(tCoords) If tPnt is Nothing then 'Fehler beim Punkt-Erstellen aufgetreten Else tPnt.Layer = tNewNameStr End If End If
HTH, - alfred - ------------------ www.hollaus.at |