Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Layer nach variable benennen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 11:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 12:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 13:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

der fehler taucht hier auf:

    Dim NewLayer As AcadLayer
    Set NewLayer = ThisDrawing.Layers.Add(layerName)

in der zweiten zeile. wenn ich die anführungszeichen wieder eingebe, gehts einwandfrei.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

runkelruebe
Ehrenmitglied V.I.P. h.c.
Straßen- / Tiefbau



Sehen Sie sich das Profil von runkelruebe an!   Senden Sie eine Private Message an runkelruebe  Schreiben Sie einen Gästebucheintrag für runkelruebe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für adblue 10 Unities + Antwort hilfreich

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
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 13:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

oh ja. wie recht du hast.
es lag am unterstrich in der variable !!!

thx

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

adblue
Mitglied
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 14:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von runkelruebe an!   Senden Sie eine Private Message an runkelruebe  Schreiben Sie einen Gästebucheintrag für runkelruebe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für adblue 10 Unities + Antwort hilfreich

>> 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 Next

layer_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
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 17:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

so hab alles hinbekommen. eine kleine frage noch: kann man die ebenen in autocad nach bestimmten kriterien sortieren lassen? oder hat man darauf keinen einfluss?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

runkelruebe
Ehrenmitglied V.I.P. h.c.
Straßen- / Tiefbau



Sehen Sie sich das Profil von runkelruebe an!   Senden Sie eine Private Message an runkelruebe  Schreiben Sie einen Gästebucheintrag für runkelruebe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für adblue 10 Unities + Antwort hilfreich

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
.


Sehen Sie sich das Profil von adblue an!   Senden Sie eine Private Message an adblue  Schreiben Sie einen Gästebucheintrag für adblue

Beiträge: 57
Registriert: 22.05.2009

erstellt am: 05. Sep. 2009 18:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 werden

Dim 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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz