| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Layer erstellen (1883 mal gelesen)
|
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 17. Jun. 2010 08:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich will in meinem VB.Net Programm einen Layer erstellen und diesen zum LayerTable hinzufügen. Wenn ich aber anschließend den Layer als aktiven Layer setzen will bekomme ich die Meldung ewasopenforwrite. Code: Dim Layer As LayerTableRecord = New LayerTableRecord Layer.Name = "C" Layer.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 32) Dim Layer_Table As LayerTable = CType(TrAct.GetObject(AcadDoc.Database.LayerTableId, OpenMode.ForWrite, False, True), LayerTable) If Not Layer_Table.Has(Layer.Id) Then Layer_Table.Add(Layer) AcadDoc.Database.Clayer = Layer_Table("C")
Ich hoffe mir kann jemand helfen? Grüße und Dank im Vorraus PS: Interessant wäre auch, ob das mit der Farbe so stimmt - Müsste ein Braun sein. [Diese Nachricht wurde von Silvan01 am 17. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 17. Jun. 2010 09:30 <-- editieren / zitieren -->
Hi, TransAction.Commit würde diesem gut tun. 2-fache Vorsicht auch bei: Layer_Table.Has(Layer.Id) IMHO verlangt .Has einen Namen und keine ID. Weiters liefert .Has auch gelöschte Elemente einer SymbolTable. Also wenn Du einen Layer 'C' angelegt hattest, dann löscht und im AutoCAD kein Layer 'C' im Layermanager mehr zu sehen ist, wirst Du mit Layer_Table.Has("C") fündig! - alfred - ------------------ www.hollaus.at |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 17. Jun. 2010 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für Silvan01
Hi, was du außer dem TransAction.Commit() vergessen hast ist: Code: TrAct.AddNewlyCreatedDBObject(Layer, True)
Dies musst du zwischen deinen beiden Zeilen einfügen: Code: If Not Layer_Table.Has(Layer.Id) Then Layer_Table.Add(Layer) TrAct.AddNewlyCreatedDBObject(Layer, True) AcadDoc.Database.Clayer = Layer_Table("C")
Dann funktioniert es jedenfalls schon mal! Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 17. Jun. 2010 09:48 <-- editieren / zitieren --> Unities abgeben: Nur für Silvan01
Hatte gerade auch noch mal das hier durchprobiert: Zitat: IMHO verlangt .Has einen Namen und keine ID. Weiters liefert .Has auch gelöschte Elemente einer SymbolTable. Also wenn Du einen Layer 'C' angelegt hattest, dann löscht und im AutoCAD kein Layer 'C' im Layermanager mehr zu sehen ist, wirst Du mit Layer_Table.Has("C") fündig!
1. Zumindest in meiner Version (AutoCAD 2010) akzeptiert die '.Has'-Methode sowohl einen String als auch eine ObjectID. 2. Wenn ich meinen angelegten Layer manuell über den LayerManager von AutoCAD lösche und dann mit .Has("C") z.B. Abfrage, ob er noch existiert, bekomme ich ein 'False' -> scheint also mittlerweile keine gelöschten Layer mehr zu liefern?! Beste Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 17. Jun. 2010 12:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, danke erstmal für eure Hilfe! Das TrAct.Commit mache ich zu einem späteren Zeitpunkt, da ich anschließend noch Objekte auf dem Layer einfüge. Oder ist es da trotzdem sinnvoll nach dem Erstellen des Layers nochmal ein .commit zu machen? Folgendermaßen funktioniert es auf jeden Fall bei mir: Code: Dim Layer As LayerTableRecord = New LayerTableRecord Layer.Name = "C" Layer.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.None, 32) Dim Layer_Table As LayerTable = CType(TrAct.GetObject(AcadDoc.Database.LayerTableId, OpenMode.ForWrite, False, True), LayerTable)If Not Layer_Table.Has("C") Then Layer_Table.Add(Layer) TrAct.AddNewlyCreatedDBObject(Layer, True) AcadDoc.Database.Clayer = Layer.Id End If
Grüße & Danke nochmal Silvan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 17. Jun. 2010 13:07 <-- editieren / zitieren -->
Hi, ich meine, wenn Du Deine Vorgehensweise wählst, dann wird die Zeichnung/das AutoCAD instabil, natürlich nur für den Fall, dass Du die offene TransAction bewusst NICHT mit .commit beendest. Denn dann steht der CurrentLayer auf einem nicht-existierenden Objekt. Und mir (in meiner begrenzten Denkweise) ist es egal, ob das gerade jetzt mal funktioniert. Fest steht für meine Logik und nach oberer Aussage, das kann irgendwann mal schief gehen (auch wenn es ev. erst mit AutoCAD 2013 sein sollte) ==> drum mach ich's nicht. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|