| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Blöcke mit Zeichnungsreihenfolge auflösen (2532 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 04. Jul. 2014 08:51 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte in meiner Zeichnung Blöcke auflösen. Diese Blöcke enthalten oft Schraffuren und Solids. Diese sollten nach dem Auflösen auch wieder in der Zeichnungsreihenfolge dargestellt werden wie sie ursprünglich in der Blockdefinition waren. Kann ich irgendwie diese Drawordertable des Blocktablerecord auf die aufgelösten Elemente anwenden. Hat sich mit diesem Problem schon mal jemand beschäftigt? Oder weiß jemand ein Beispiel von dem ich abkupfern könnte. Unten, ein Teil meines bisherigen Codes. Ich schiebe die Attribute schon mal in den Voredergrund, damit diese auf jeden Fall lesbar sind. Aber das ist natürlich nur ne Teillösung. Danke im Vorraus. Rest = New DBObjectCollection MyBlockref.Explode(Rest) MyBlockref.Erase() For Each Myentity In Rest If Myentity.Color.IsByBlock Then Myentity.Color = MyBlockref.Color End If If Myentity.LineWeight = -2 Then Myentity.LineWeight = MyBlockref.LineWeight End If If Myentity.Linetype = "ByBlock" Then Myentity.Linetype = MyBlockref.Linetype End If If Myentity.GetType.Name = "AttributeDefinition" Then Else MyBTR.AppendEntity(Myentity) acTrans.AddNewlyCreatedDBObject(Myentity, True) End If Next dot = acTrans.GetObject(MyBTR.DrawOrderTableId, OpenMode.ForWrite) dot.MoveToTop(Attriids)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 04. Jul. 2014 09:51 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 04. Jul. 2014 10:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Karlovac, Das wäre eine Alternative die funktionieren würde, wenn ich die Einzelteile danach irgendwie packen könnte. wenn ich diese ID's irgenwie raus bekämme, könnte ich diese Funktion verwenden. ich möchte bei diesen Einzelteilen noch ein paar Eigenschaften einstellen. Gruß Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 04. Jul. 2014 10:49 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 04. Jul. 2014 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Du kannst doch prüfen welche Objekte NEU in der Datei sind PS: Auch wenn dich das weniger Interessieren dürfte: Wenn man Acad als User normal bedient, dann liegen die zuletzt "aufgelösten" Objekte sogar als "letzter Auswahlsatz" vor ! ------------------ 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: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 04. Jul. 2014 12:04 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe "explodetoownerspace" jetzt mal geprüft. Da ist meiner meinung nach kein wesentlicher Unterschied zu "Explode". Die ursprüngliche Zeichnungsreihenfolge wird ignoriert. Kann auch an meinen Blöcken liegen, die oft etwas chaotisch aufgebaut sind. Mit meiner ursprünlichen Frage mit der Zeichnungsreihenfolge, kann keiner was anfangen? Haben die gesprengten Einzelteile wirklich keinen Bezug mehr zu den ursprünlichen Blockteilen? Wenn ich diesen Zusammenhang herstellen könnte, könnte ich auch die ursprüngliche Zeichnungsreihenfolge wieder herstellen. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 04. Jul. 2014 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Es sind ja neue Objekte die du erstellst, die haben weder mit dem Block noch der Blockreferenz zutun(die wird nur gelöscht). Anzeigereihenfolge der Objekte zueinander kannst du auslesen, dann an die Anzeigestelle der Blockreferenz setzen. Aber da ich nicht .Net reden kann lasse ich es hier auch mit dem Erklären. Du willst ja den Acad-Ursprung Befehl nachprogrammieren.. Wenn es nur für dich ist und nur für die aktuelle Datei, sende einen Command _explode und fertig. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 07. Jul. 2014 08:43 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
BTW : ist es möglich, dass sich die DrawOrder-Problematik nur auf Texte (insbesondere Attribute) bezieht? Dazu findet man im Netz nämlich so einige Beiträge. Habe das Thema Explode & DrawOrder mit einigen Blöcken mit Geometrie-Elementen (Line, PolyLine, Solid, Hatch) getestet und mit verschiedenen Methoden (.Explode, .ExplodeToOwnerSpace bzw. auch SendCommand "_explode") die gleichen (richtigen) Ergebnisse erhalten; während ein DrawOrder-Problem mit einem Attribute relativ leicht nachzustellen ist. Schöne Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 08. Jul. 2014 16:02 <-- editieren / zitieren --> Unities abgeben:
Hallo euch Beiden, ich glaube die Probleme mit der Zeichnungsreihenfolge, treten nur auf wenn die Zeichnungsreihenfolge manuel also mit dem Befehl Zeichnungsreihenfolge verändert wurde. Oft wurde z.B. ein Text oder ein Attribute nachträglich mit einem Solid hinterlegt. Dieser wurde dann nachträglich hinter den Text oder Attribut geschoben. im Augenblick behelfe ich mir damit, dass ich Attribute und Text einfach in den Vordergrund schiebe und Solids und Schraffuren dahinter. Bei einem Ring oder einer dicken Polylinie funktionert das aber schon nicht mehr(ist nicht sicher im Vorder oder Hintergrund). Schöner wäre es wenn wirklich die alte Zeichnungsreihenfolge wieder hergestellt würde. Anbei mal ein Beispiel mit was ich eigentlich kämpfe. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 08. Jul. 2014 18:02 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Ich kann dir nur Mut zusprechen dich da rein zu knien oder zu googeln, denn ich kann es dir auch nur in der Theorie erzählen (weil ich ja kein .Net kann, nur die Dateistruktur ein wenig kenne). Oder es ist noch jemand so nett und hilft dir hier im Board weiter. Ziel: Nachprogrammierung des _explode Befehls. <Attribute an Blockreferenzen lasse ich erst mal weg und nehme zunächst nur Blockelemente an, wie 3 Solids zB> Problem1: Die "aufgelösten" Objekte sind neue Objekte Problem2: Die (Anzeige)Reihenfolge untereinander, sofern diese nicht der Erstellreihenfolge entspricht, stimmt nicht mehr. // Problem1 Also mußt du nachsehen an welcher (Anzeige)Stelle die Blockreferenz war und dort müssen nun alle anderen Objekte hin (Anzeigereihenfolge) // Problem2 Die Reihenfolge der neuen Objekte entspricht der Objektreihenfolge in der ursprünglichen Blockdefinition, sollte die Anzeigereihenfolge also manipuiert worden sein, so ist diese nun auch durcheinander,weil jungfräulich. Also die Anzeigereihenfolge der Objekte in der Blockdefinition auslesen und entsprechend die neuen Objekte sortieren(Anzeigereihenfolge). Ich schreibe mal in Listenform, da ich etwas lispel Block mit 3 Solids, wobei das letzte Objekt in der Anzeigereihenfolge unter den beiden anderen liegt. Merkliste: '((Objekt1 AnzeigeObjekt2) ((Objekt2 AnzeigeObjekt3) ((Objekt3 AnzeigeObjekt2) ) Wenn du nun die Anzeigereihenfolge der neuen Objekte dementsprechend geändert hast, liegen alle Objekte zueinander richtig und auch in der DWG an der richtigen Stelle. Ich habe Funktionen wie die Optionen des AutoCAD-Befehl _draworder zur Verfügung, also Anzeigereihenfolge ganz hoch,runter/unterObjekt,überObjekt ------------------ 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: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 10. Jul. 2014 10:05 <-- editieren / zitieren --> Unities abgeben:
Hi Cadffm, Problem 1 hatte ich gar nicht, wäre aber leicht zu lösen gewesen. Problem 2 beschreibt genau das Problem das ich hatte. Da hat mir Deine Lispliste viel weitergeholfen. Ich habe das ganze mal in .Net ausgeführt und es klappt jetzt einwandfrei. Ich hänge die Sub mal unten an, wenn es jemand brauchen kann oder Verbesserungsvorschläge hat. Übrigens. Du schreibst "Ziel: Nachprogrammierung des _explode Befehls" Das stimmt nicht ganz, ich versuche den "Burst" Befehl von den Expresstools nach zu programmieren. Der hat ein paar echt gute Eigenschaften, aber auch ein paar Nachteile die ich versuche heraus zu bekommen. Gruß, Theo Sub SetDrawOrder(Blockdefid As ObjectId, ByRef MyOrder() As Integer) Dim MyBlockdef As BlockTableRecord Dim OrgID As ObjectId Dim DraworderIds As ObjectIdCollection Dim Mydot As DrawOrderTable Dim i As Integer = 0 Dim MyEnum As BlockTableRecordEnumerator Using aT As Transaction = dbdoc.TransactionManager.StartTransaction() MyBlockdef = aT.GetObject(Blockdefid, OpenMode.ForRead) Mydot = aT.GetObject(MyBlockdef.DrawOrderTableId, OpenMode.ForRead) DraworderIds = Mydot.GetFullDrawOrder(False) MyEnum = MyBlockdef.GetEnumerator() ReDim MyOrder(i) While MyEnum.MoveNext OrgID = MyEnum.Current If DraworderIds.Contains(OrgID) Then MyOrder(i) = DraworderIds.IndexOf(OrgID) i = i + 1 ReDim Preserve MyOrder(i) End If End While ReDim Preserve MyOrder(i - 1) End Using End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 10. Jul. 2014 10:37 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Wow, da bin ich aber Stolz wie Bolle auf mich! Burst ist freilich ein netter Anfang, aber es fehlte wohl die Motivation es richtig zu machen ;D Aber es gibt ja andere Routinen die das besser können. Wir, COD, bietet auch alle sinnvollen Optionen in unserer "Burstroutine" an, dies ist auch alles in .Net (C#) umgesetzt, aber das machen bei uns die Programmierer, nicht ich. Wenn ich dir dann dennoch helfen konnte, um so schöner. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |