| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blockref.explode (2193 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008 ACAD 2019 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 08. Feb. 2012 13:57 <-- editieren / zitieren --> Unities abgeben:
Hallo, eine Frage an die Profis. Mit dem Code unten, versuche ich Blöcke auf zu lösen. Leider bekomme ich bei ungleichmäßig skalierten Blöcken eine Fehlermeldung. Gibt es eine Möglichkeit auch ungleichmäßig skalierte Blöcke zu sprengen? Danke Theo <Autodesk.AutoCAD.Runtime.CommandMethod("testex")> _ Public Sub testex()
Dim DBDoc As Database DBDoc = HostApplicationServices.WorkingDatabase Dim Splitter As DatabaseServices.DBObjectCollection Dim Myblock As DatabaseServices.BlockReference Dim MyID As ObjectId Dim myEditor As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor Dim Editorresult As PromptEntityResult Dim myPDO As New PromptEntityOptions("Quellobjekt wählen: ") myPDO.AllowObjectOnLockedLayer = True Editorresult = myEditor.GetEntity(myPDO) If Editorresult.Status = PromptStatus.None Then Exit Sub If Editorresult.Status = PromptStatus.Cancel Then Exit Sub If Editorresult.Status = PromptStatus.OK Then MyID = Editorresult.ObjectId Splitter = New DBObjectCollection Using TrAct As Transaction = DBDoc.TransactionManager.StartTransaction() MyObjekt = CType(TrAct.GetObject(MyID, OpenMode.ForRead, False, True), Entity) Myblock = MyObjekt Myblock.ExplodeToOwnerSpace() TrAct.Commit() End Using End If DBDoc.Dispose() End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 08. Feb. 2012 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo Theo37, nein. Du kanst aber einen Workaround machen, in dem du die Objekte der Blockdefinition hernimmst, und diese auf die Matrix der aufzulösenden Blockreferenz transformierst. Das wird nicht bei allen Objekten funktionieren, weshalb du dies in einer try/catch geschützten Umgebung machen solltest. Im Ergebnis hast du zumindest die Objekte, die ungleich skaliert werden können. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 08. Feb. 2012 14:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, meine Gedanken gingen in eine ähnliche Richtung. ich wollte die scalefaktoren des Blocks auf 1 setzen. Dann hätte ich ihn aufgelöst. Und dann wollte ich die Fragmente des Blocks wieder mit den ursprünglichen Scalefaktoren des Blocks skalieren. Und da liegt mein Problem, wie kann ich Objekte ungleichmäßig skalieren? du schreibst....und diese auf die Matrix der aufzulösenden Blockreferenz transformierst.... Dieses Transformieren?, könntest Du mir da ein Beispiel zeigen? Oder Stichpunktartig die Vorgenhensweise zeigen. Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 08. Feb. 2012 14:21 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 09. Feb. 2012 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, ich hab jetzt mal ein bischen Quelltext geschrieben. Steht unten. Leider bekomme ich immer nur eine Fehlermeldung: "eCannotScaleNonUniformly". Mein englisch ist nicht so gut. Aber das heist wohl, man kann nicht ungleichmässig skalieren. Jetzt meine Frage. Mache ich was falsch, oder geht es schlichtweg nicht? Der Block mit dem ich probiert habe enthielt nur eine einfache Polylinie. Daran lag es wohl nicht. Bitte schau Dir den Code unten mal an, und schreib mir was du grundsätzlich anders machen würdest. Danke, Theo <Autodesk.AutoCAD.Runtime.CommandMethod("textex")> _ Public Sub textex() Dim DBDoc As Database Dim Myblock As DatabaseServices.BlockReference Dim MyBlockob As DBObjectCollection = New DBObjectCollection Dim Mymatrix As Geometry.Matrix3d DBDoc = HostApplicationServices.WorkingDatabase Dim MyID As ObjectId Dim myEditor As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor Dim Editorresult As PromptEntityResult Dim myPDO As New PromptEntityOptions("Quellobjekt wählen: ") myPDO.AllowObjectOnLockedLayer = True Editorresult = myEditor.GetEntity(myPDO) If Editorresult.Status = PromptStatus.None Then Exit Sub If Editorresult.Status = PromptStatus.Cancel Then Exit Sub If Editorresult.Status = PromptStatus.OK Then MyID = Editorresult.ObjectId Using TrAct As Transaction = DBDoc.TransactionManager.StartTransaction() MyObjekt = CType(TrAct.GetObject(MyID, OpenMode.ForWrite, False, True), Entity) Myblock = MyObjekt Mymatrix = New Matrix3d(Myblock.BlockTransform.ToArray) Myblock.ScaleFactors = New Scale3d(1, 1, 1) Myblock.Explode(MyBlockob) For Each MyObjekt In MyBlockob MyObjekt.TransformBy(Mymatrix) TrAct.AddNewlyCreatedDBObject(MyObjekt, True) Next TrAct.Commit() End Using End If DBDoc.Dispose() End Sub End Class Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2012 14:42 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Zitat: Original erstellt von Brischke: ... Das wird nicht bei allen Objekten funktionieren, weshalb du dies in einer try/catch geschützten Umgebung machen solltest. Im Ergebnis hast du zumindest die Objekte, die ungleich skaliert werden können. ...
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 09. Feb. 2012 14:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, Ich hatte die Hoffnung eine Polylinie würde sich ungleich skalieren lassen. Welche Objekte denkst Du lassen sich ungleich skalieren? Was ich nicht brauche sind Texte, attribute,Bemaßungen, Schraffuren und solche Sachen. Was ich brauche sind: Polylinien, Linien, Kreise und zB. auch Blöcke. Ich hab jetzt mal nen Block erstellt der nur aus einer Linie besteht. Und auch bei dem flieg ich ab, wenn er ungleichmässig skaliert ist. Was mach ich falsch? Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2012 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Zitat: Original erstellt von Theo37: ... Was mach ich falsch?
Mensch Theo, du liest nicht richtig! Zitat: Original erstellt von Brischke: ... Du kanst aber einen Workaround machen, in dem du die Objekte der Blockdefinition hernimmst, und diese auf die Matrix der aufzulösenden Blockreferenz transformierst.
Du nimmst die Blockreferenz und machst damit ein Explode - das funktioniert ja nicht, weil diese ungleichmäßig skaliert ist. Du bist keinen mm weiter mit dem neuen Code, und das, was ich geschrieben habe, ist bei dir nicht im Ansatz zu sehen. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 09. Feb. 2012 15:32 <-- editieren / zitieren --> Unities abgeben:
OK, ich hab ne andere Vorgenhensweise. Wenn ich dich richtig verstehe, würdest Du die Objekte aus der Blockdef. nehmen und diese dann mit TransformBy behandeln. Aber egal woher die Objekte kommen. Die Frage bleibt: Kann ich eine Linie ungleichmässig mit TransformBy skalieren? Ich hab mal folgendes gemacht: Myline = New Line(New Point3d(0, 0, 0), New Point3d(1, 1, 1)) Myline.TransformBy(Mymatrix) Auch das bringt die Fehlermeldung: "eCannotScaleNonUniformly". Ich habe den Verdacht, daß es nicht geht. Oder ich hab doch noch nen Denkfehler drin. Vielen Dank. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2012 15:36 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
.. die Fehlermeldung ist eindeutig: Du kannst eine Linie nicht ungleichmäßig skalieren. Du kannst aber, denke ich mal, den Anfangs und Endpunkt skalieren und mit dem Ergebnis die Liniendaten ändern. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |