| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: ConvertToStaticBlock (3578 mal gelesen)
|
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 24. Nov. 2008 08:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, auf Wunsch meines Auftraggebers muß ich meinen dynamischen Block in einen statischen Block konvertieren. Ich möchte dafür folgende Routine verwenden: Code: Sub test() Dim block As AcadBlockReference For Each block In ThisDrawing.ModelSpace block.ConvertToStaticBlock (hm) Next block End Sub
Nun bekomme ich aber leider nicht, wie in der Hilfe beschrieben einen benannten Block sondern einen unbenannten Block. Eine Testzeichnung habe ich angefügt. Ich hab´s in Map2009 und in Map2008 probiert. Beidemale unbenannte Blöcke. PS: Das in der Hilfe erwähnte IAcadBlockReference2 Objekt kennt mein Autocad Map gar nicht! Was mache ich da falsch ? Kann mir bitte jemand sagen wie man´s besser macht ? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 24. Nov. 2008 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
|
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8086 Registriert: 09.03.2006 sw: Win7-x64 Office 365 ProPlus C3D (& LT ) ET; DACH; Extensions ------------------- hw: FX3800 i5 CPU 670 8GB RAM
|
erstellt am: 24. Nov. 2008 08:49 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
|
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 24. Nov. 2008 08:53 <-- editieren / zitieren --> Unities abgeben:
Hallo Udo, ja daran hab ich natürlich auch schon gedacht. Aber es ist nich sehr befriedigend. Zumal Adesk ja explizit die Methoden ConvertToAnonymousBlock und ConvertToStaticBlock anbietet. Wenns ein Bug ist, dann muß ich den Weg über umbenenen gehen. Aber wenn nur ich was falsch mache, wäre es sinnvoller zu lernen wie man´s richtig macht. Aber trotzdem, schon mal danke für die Antwort! lg Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 24. Nov. 2008 09:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Runkelrübe, ich hab jetzt mal als Acad gestartet. Leider ändert das gar nix. Immer noch unbennte Blöcke, immer noch keine IAcadBlockReference2 im Objektkatalog. Auch dir ein Dankeschön für die Antwort lg Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 24. Nov. 2008 10:54 <-- editieren / zitieren -->
Hi, Du hast ein Problem, ich hab eine Lösung die Dir nicht gefallen wird Code: Sub test() Dim block As AcadBlockReference Dim tBlName As String: tBlName = "STATIC" Dim tBlIndex As Integer: tBlIndex = 1 For Each block In ThisDrawing.ModelSpace block.ConvertToStaticBlock (tBlName & Format(tBlIndex, "000")) tBlIndex = tBlIndex + 1 Next block End Sub
Das Problem ist, dass ein dynamischer Block (Blockreferenz!) immer unterschiedlich aussehen kann, daher muss zum Ableiten in eine statische BlockReference eine Blockdefinition erzeugt werden, die eben so aussieht, wie die aktuellen dynamischen Eigenschaften der zu konvertierenden Blockreference vorgeben.Ein Beispiel: Du hast eine Blockdefinition 'TISCH' ==> in Deiner Zeichnung hast Du den drin mit 100cm, 120cm, 140cm Länge Willst Du daraus statische Blockdefinitionen machen, musst Du 3 Blockdefinitionen (TISCH100, TISCH120, TISCH140) machen. Und der Haken: AutoCAD erkennt natürlich nicht, wenn Du bei einem weiteren 'TISCH L=120' bist, dass es schon eine statische Blockdefinition dafür gibt. Schlussfolgerung: Du kannst nicht alle Blockreferenzen in statische .. konvertieren und allen den gleichen Zielnamen geben. - alfred - [EDIT]noch was zu der Konvertierung dyn. zu statisch: wenn in den dynamischen Blockdefinitionen 'Sichtbarkeiten' eingebaut sind, dann bitte aufpassen, denn die statischen Blockdefinitionen, die daraus erzeugt werden, sind keineswegs so sauber, dass z.B. ein DXFOUT als R12 richtig funktioniert, es werden im statischen Block alle Elemente des dynamischen Blocks enthalten sein, die durch Sichtbarkeitsparameter deaktivierten Geoemtrieelemente sind nur 'unsichtbar' gestellt. Bei DXFOUT/R12 sind sie alle (auch die unsichtbaren) wieder da. D.h. die Blockdefintionen müssen dann nachgearbeitet werden. [/EDIT] [Diese Nachricht wurde von a.n. am 24. Nov. 2008 editiert.] |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 24. Nov. 2008 18:22 <-- editieren / zitieren --> Unities abgeben:
|
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 25. Nov. 2008 08:45 <-- editieren / zitieren --> Unities abgeben:
|
CADoktor Mitglied Techniker
Beiträge: 35 Registriert: 29.03.2006
|
erstellt am: 27. Nov. 2008 10:21 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Jetzt muss ich auch noch meinen Senf dazugeben ... 1. "For Each block In ThisDrawing.ModelSpace" geht nicht!! Objekttyp prüfen dann zuweisen! 2. Ich würde Blocknamen direkt weiterverwenden ... EffectiveName + Zähler 3. Es sollen ja nur Dynamische Blöcke bearbeitet werden =)> Prüfen ob .IsDynamicBlock Anbei Code Sub DynBlock2StatBlock() Dim objEntity As AcadEntity Dim objBlockRef As AcadBlockReference Dim lngIndex As Integer lngIndex = 1 For Each objEntity In ThisDrawing.ModelSpace If objEntity.ObjectName = "AcDbBlockReference" Then Set objBlockRef = objEntity If objBlockRef.IsDynamicBlock Then objBlockRef.ConvertToStaticBlock (objBlockRef.EffectiveName & Format(lngIndex, "0000")) lngIndex = lngIndex + 1 End If End If Next objEntity End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADoktor Mitglied Techniker
Beiträge: 35 Registriert: 29.03.2006
|
erstellt am: 27. Nov. 2008 11:08 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Das Ganze noch als Variante, bei der alle Bereiche (Modellbereich und Layouts) durchlaufen werden und auch verschachtelte Blöcke bearbeitet werden (wenn dynamische Blöcke innerhalb eines anderen Blockes sind) Sub DynBlock2StatBlock() Dim objEntity As AcadEntity Dim objBlockDef As AcadBlock Dim objBlockRef As AcadBlockReference Dim lngIndex As Integer lngIndex = 1 For Each objBlockDef In ThisDrawing.Blocks If Not objBlockDef.IsXRef Or InStr(objBlockDef.Name, "|") = 0 Then For Each objEntity In objBlockDef If objEntity.ObjectName = "AcDbBlockReference" Then Set objBlockRef = objEntity If objBlockRef.IsDynamicBlock Then objBlockRef.ConvertToStaticBlock (objBlockRef.EffectiveName & Format(lngIndex, "0000")) lngIndex = lngIndex + 1 End If End If Next objEntity End If Next objBlockDef End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 27. Nov. 2008 18:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Doc, herzlichen Dank für deinen Code. Du hast selbstverständlich Recht mit deiner Kritik, aber ich kann dich beruhigen, der von mir gepostete Code sollte so nie verwendet werden. Der war nur zu Testzwecken. Eigentlich habe ich vor zuerst ein Selectionset zu erstellen, und dann dieses abzuarbeiten. Aber dein Code gefällt mir auch sehr gut! lg didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
H-kan84 Mitglied Konstrukteur Yachtinnenausbau
Beiträge: 253 Registriert: 28.07.2006
|
erstellt am: 16. Jan. 2009 14:40 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
hi, ich fange an mich mit dem thema VBA zu beschäftigen..und bin grad auf diesen code gestoßen. Das funktioniert prima außer: die Sichtbarkeitsklassen von den dynmaischen blöcken, werden im blockeditor angezeigt Sprich alle sichtbarkeitsklassen in einer Wäre schön wenn man das noch umgehen könnte. kann mir jmd helfen? grüße
------------------ Aus technischen Gründen befindet sich die Signatur auf der Rückseite dieser Nachricht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Jan. 2009 18:00 <-- editieren / zitieren -->
Hi, Du kannst nachdem der statische Block erstellt wurde, die Elemente der Blockdefinition durchgehen und prüfen, welches Element die Eigenschaft '.Visible' auf false hat, ich glaube so hab ich's mal gelöst, lass mich wissen, wenn es nicht so sein sollte. - alfred - |
H-kan84 Mitglied Konstrukteur Yachtinnenausbau
Beiträge: 253 Registriert: 28.07.2006
|
erstellt am: 16. Jan. 2009 18:09 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
danke, ich werde mich da mal reinlesen und es ausprobieren wenn oich es hin bekomme. wenn man Burst aus den expresstools drüber laufen läßt gehts auch. aber halt aufgelößte blöcke grüße
------------------ Aus technischen Gründen befindet sich die Signatur auf der Rückseite dieser Nachricht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |