| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Aktiven Layer einschalten (1526 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 14. Apr. 2014 17:18 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, leider kommt es ab und zu vor , daß der aktive Layer ausgeschalten ist. Jetzt wollte ich diesen tauen und einschalten. Bekomme aber sofort die Fehlermeldung "einvalidelayer". Kann ich den Aktiven Layer irgendwie direkt einschalten? Oder muß ich kurzfristig einen anderen Layer aktiv machen? Hat damit schon mal jemand zu tun gehabt? <Autodesk.AutoCAD.Runtime.CommandMethod("Layontau")> _ Public Sub Laytau() Dim MyId As ObjectId Using TrAct As Transaction = MyDoc.TransactionManager.StartTransaction() MyLayerTable = TrAct.GetObject(MyDB.LayerTableId, OpenMode.ForWrite) For Each MyId In MyLayerTable If MyDB.Clayer = MyId Then MyLayer = TrAct.GetObject(MyId, OpenMode.ForWrite) MyLayer.IsFrozen = False MyLayer.IsOff = False End If Next TrAct.Commit() End Using End Sub Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 14. Apr. 2014 21:23 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
myDb.CLayer ist ja schon gegeben, wozu zuerst den Zugriff auf die LayerTable und dann noch eine Schleife durch alle Layer machen? Wozu die Schleife durch alle Layer, wenn der aktuelle Layer ja durch MyDB.Clayer schon gegeben ist? Code: Using TrAct As Transaction = MyDoc.TransactionManager.StartTransaction() MyLayer = TrAct.GetObject(MyDoc.Database.Clayer, OpenMode.ForWrite) MyLayer.IsFrozen = False MyLayer.IsOff = False TrAct.Commit() End Using
Und sollte hier eine Fehlermeldung kommen, dann könnte es sein, dass es notwendig ist, das Document zu "locken", ansonsten bitte angeben, welcher Fehler genau(!) und bei welcher Zeile im Code. ------------------
[Diese Nachricht wurde von Ingenieur Studio HOLLAUS am 14. Apr. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 15. Apr. 2014 08:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Studio Hollaus, die Schleife rührt da her, daß ich mit den anderen Layern auch was anstellen möchte. Ich habe nur hier für meine Frage den Code der mir unwichtig erschien etwas zusammen gekürzt.Die Fehlermeldung kommt in der Zeile: "MyLayer.IsFrozen = False". Und zwar nur beim Aktiven Layer. Egal ob dieser wirklich gefroren war oder nicht. Das mit dem Document-Locken, das hatte ich schon mal. Muß ich mal probieren. Danke für die schnelle Antwort. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 15. Apr. 2014 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Ich sage mal so (ohne Ahnung zu haben) - Der aktive Layer kann nicht gefroren sein (ein gefrorener Layer kann nicht zum aktuellen gemacht werden), vielleicht haben die Adeskler sich da nun wieder ein Schmankerl ausgedacht. (Frage die Eigenschaft mal ab - ob sie überhaupt "existiert"/schreibbar ist bei dem aktuellen Layer) ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 15. Apr. 2014 08:53 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadffm, ich glaube Du hast viel Ahnung. es stimmt der aktive Layer kann gar nicht gefroren sein. Ich hatte das gar nicht geprüft und wollte einfach auf Nummer sicher gehen. Mein Code sieht jetzt so aus und funktioniert einwandfrei.(habe natürlich noch nicht viel getestet) Danke und Gruß, Theo Public Sub Laytau() Dim MyId As ObjectId Using TrAct As Transaction = MyDoc.TransactionManager.StartTransaction() MyLayerTable = TrAct.GetObject(MyDB.LayerTableId, OpenMode.ForWrite) For Each MyId In MyLayerTable MyLayer = TrAct.GetObject(MyId, OpenMode.ForWrite) If MyLayer.IsFrozen Then MyLayer.IsFrozen = False MyLayer.IsOff = False Next TrAct.Commit() MyEditor.WriteMessage("Alle Layer wurden getaut und eingeschalten.") MyEditor.Regen() End Using End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 15. Apr. 2014 09:13 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Zitat: Ich hatte das gar nicht geprüft
Grundsätzlich sollte bei solchen Schleifen immer geprüft werden, bevor man ein Element zum Schreiben öffnet, spart (Un)Menge an Laufzeit, als erst zum Lesen öffnen, in diesem Zustand prüfen, ob .IsFrozen und .IsOff einen Zustand haben, den/die man ändern müsste und erst dann (z.B. mit UpgradeOpen, denn eine TransAction ist ja schon aktiv) in den modifizierbaren Zustand bringen und ändern. In wenigen Worten: wenn .IsOff schon false ist, brauch ich nicht nochmals .IsOff = false ausführen. Just my 2c. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 15. Apr. 2014 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 15. Apr. 2014 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Zitat: Warum denn überhaupt prüfen und nicht gleich schreiben ?
Zum einen, wenn das Objekt zum Schreiben geöffnet wird, ist mehr Arbeit erforderlich (z.B. locken) als wenn ein Objekt zum Lesen geöffnet wird, damit auch höherer Zeitaufwand. Weiters wenn eine Eigenschaft überschrieben wird, wird auch der Undo-Buffer erweitert, auch wenn der Wert vorher schon gleich war, auch dieses Handling kostet Performance. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 15. Apr. 2014 09:37 <-- editieren / zitieren --> Unities abgeben:
Hallo euch Beiden, ich bin mir nicht sicher ob ich Studio Hollaus richtig verstanden habe. Ich habe mal versucht seinen Vorschlag um zusetzen. Bei einer großen Datei, die auch noch einige Xrefs reinläd habe ich einen Zeitgewinn von etwa zwei Sekunden erreicht. Also eine Verbesserung von 15 auf 13 Sekunden. Auch wenn es hier nicht viel zu sein scheint, werde ich diesen Vorschlag auf jeden Fall bei Anderen Makros verwenden. Da habe ich noch einige die wirklich sehr langsam sind. Gruß, Theo Public Sub Laytau() Dim MyId As ObjectId Using TrAct As Transaction = MyDoc.TransactionManager.StartTransaction() MyLayerTable = TrAct.GetObject(MyDB.LayerTableId, OpenMode.ForWrite) For Each MyId In MyLayerTable MyLayer = TrAct.GetObject(MyId, OpenMode.ForRead) If MyLayer.IsFrozen Or MyLayer.IsOff Then MyLayer.UpgradeOpen() If MyLayer.IsFrozen Then MyLayer.IsFrozen = False MyLayer.IsOff = False End If Next TrAct.Commit() MyEditor.WriteMessage("Alle Layer wurden getaut und eingeschalten.") MyEditor.Regen() End Using End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 15. Apr. 2014 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Zitat: Bei einer großen Datei, die auch noch einige Xrefs reinläd habe ich einen Zeitgewinn von etwa zwei Sekunden erreicht. Also eine Verbesserung von 15 auf 13 Sekunden
Das hängt wohl davon ab, wie viele Layer vorher gefroren/ausgeschaltet waren. Wenn vorher alle schon getaut/ein waren, dann wird der Zeitgewinn mit vorher prüfen größer sein. Wenn (nahezu) alle Layer gefroren/ausgeschaltet waren, dann ist vielleicht sogar eine Verschlechterung der Situation möglich, da dann eine Prüfung eingebaut ist, die immer JA ruft, in diesem Fall eigentlich nur Zeit kostet. Ich gehe schon "des Speichers wegen" den Weg, zuerst eine Eigenschaft zu prüfen und nur dann umstellen, wenn es auch notwendig ist. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |