| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Block sprengen und Inhalt auswählen (2747 mal gelesen)
|
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 11. Jun. 2015 16:40 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, ich habe mit VBA einen Block eingefügt (Punkt, Richtung), der nur aus einer Multiführungslinie besteht. Diesen hab ich gesprengt. Und jetzt müsste ich diese Multiführungslinie auswählen, sodass die blauen Griffe sichtbar sind. Optimal wäre, wenn dann noch der Griff am MText-Feld gleich an der Mouse hängen würde, damit ich die Schrift korrekt platzieren kann. Wie kann lässt sich das programmieren? Vielen Dank für Eure Hilfe
------------------ Grüße aus München Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 16. Jun. 2015 21:20 <-- editieren / zitieren --> Unities abgeben:
Liebe Forum, vielleicht habe ich meine Frage nicht genau genug formuliert. Ich habe einen Block, der nur aus einer Multiline mit Textinhalt besteht per VBA eingefügt und gesprengt. Jetzt würde ich gerne das, was von der Sprengung übrig bleibt, nämlich die Multilinie, auswählen und den Griff, der am Textfeld hängt an den Mousezeiger hängen, um dann eine neue Position für das Textfeld eingeben zu können. Der Strich am Textfeld soll dort bleiben wo er ist. Wie kann ich auf die Objekte, die nach einer Sprengung aus einem Block entstehen, zugreifen bzw. diese auswählen? Wie kann ich die Griffe sichtbar machen? Und wie kann ich dann den "richtigen" Griff an den Mousezeiger hängen? Stichpunkte würden mir schon weiterhelfen, dann kann ich selber weitersuchen. ------------------ Grüße aus München Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 16. Jun. 2015 23:41 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Hallo Christian, vermutlich liegt es daran, dass Dein Vorhaben nicht ganz banal ist und eine Lösung mit VBA fast unmöglich. Kann mich daran erinnern dass ein ähnliches Vorhaben hier schon einmal diskutiert wurde, konnte aber den Beitrag noch nicht finden. Aber ich glaube damals mußte es dann über Lisp-code gelöst werden. Außerdem ist es immer hilfreich eine Beispielzeichnung und den bisherigen Code zu haben. Ein Bild (Skizze) sagt manchmal mehr als eine unverständliche Erklärung. So ganz klar ist mir noch nicht was Du wirklich vor hast. Warum muß die Multilinie mit Griffen markiert sein während der Text am Mauszeiger verschoben wird? Wenn Du den Block zerlegt hast, müßten die neuen Objekte die letzten Elemente der ModelSpace.item()-Liste sein ( ThisDrawing.ModelSpace.Item(ThisDrawing.ModelSpace.Count - 1) = letztes Element ) In Deinem Fall also die letzten beiden Elemente. Ebenfalls unklar ist die Linie die zum Text führen soll. Ist diese Linie eine Multilinie oder eine Multiführungslinie zum Text im Block? Deinem ersten Beitrag nach bin ich hier von einer normalen Führungsbemaßung ausgegangen ( AcadLeader mit AnnotationObject ) Grüße Klaus
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: 17. Jun. 2015 00:01 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Wenn der Block im Modellbereich explodiert werden sollte, dann kann man sich vor dem Explodieren den Wert ModelSpace.Count merken, dann EXPLODE durchführen und dann wiederum ModelSpace.Count heranziehen (der ja jetzt größer sein müsste). Nun hat man die Elemente im ModelSpace über den Index an der Hand. Aber generell stimme ich zu, wenn es einen Block mit spezieller Ausführung gibt, und schon einen Code, wie der Block eingesetzt/explodiert wird, dann fällt eine Antwort jedenfalls leichter (und gezielter) aus, wenn man sich ansehen kann, was Du tatsächlich hast. Dann wird aus "Raten": "beraten" ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 17. Jun. 2015 09:07 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Zitat: Original erstellt von Ingenieur Studio HOLLAUS: Wenn der Block im Modellbereich explodiert werden sollte, dann kann man sich vor dem Explodieren den Wert ModelSpace.Count merken, dann EXPLODE durchführen und dann wiederum ModelSpace.Count heranziehen (der ja jetzt größer sein müsste).
Nur wenn der ehemalige Block mehr als ein Element enthält 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: 17. Jun. 2015 09:20 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Zitat: Nur wenn der ehemalige Block mehr als ein Element enthält
Hängt von der Explode-Methode ab! Schicke ich den Befehl _EXPLODE mittels SendCommand ==> dann hast Du recht, denn die ursprüngliche Blockreference wird dabei vernichtet. Wird jedoch im Code BlRef.Explode (also die Methode .Explode für BlockRefernces) angewendet, bleibt die BlockReference erhalten! Und da dies die bevorzugte/saubere Variante ist, würde ich meinen, dass ModelSpace.Count nach ".Explode" größer wäre als vorher (Ausnahme: der Block selbst hat keine Elemente erhalten oder wir sprechen nicht von ModelSpace ). ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 17. Jun. 2015 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Seit wann ist das denn der Fall? Gerade getestet, Du hast recht der Block bleibt erhalten Ist mir bisher noch gar nicht aufgefallen aber ich benutze BlockRef.Explode eigentlich nie. Wieder was dazu gelernt ... 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: 17. Jun. 2015 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Ist bei der entsprechenden VLisp-Funktion identisch geregelt, nur mal so am Rande erwähnt. Quick&Dirty kann man halt die AutoCAD-Objektwahl nutzen, denke das war auch die oben erwähnte Richtung mit Lisp. Denn die aufgelösten Objekte eines Explode-Vorganges sind alle im Auswahlsatz "Vorher" abgelegt.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 17. Jun. 2015 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Die Frage die sich mir schon die ganze Zeit stellt: Warum wird ein Block eingefügt und gleich aufgelöst? Kann man da nicht gleich die Führungslinie erstellen (2 x getPoint) und den Text als AnnotationObjekt programmintern dazufügen? Ob jetzt der Blockname anders ist oder der Textinhalt sollte doch keinen Unterschied machen ... (außer dass die Blocktabelle kleiner bleibt) [Edit] Wenn Du unbedingt Zugriff auf die Elemente eines aufgelösten Block brauchst, kannst Du auch über:
Code:
Dim ExplObjs as Variant ExplObjs = oBlockRef.explode
diese in einer Item-Liste zur Verfügung haben [/Edit] [Diese Nachricht wurde von KlaK am 17. Jun. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 17. Jun. 2015 16:55 <-- editieren / zitieren --> Unities abgeben:
Liebes Forum, vielen Dank für die Tipps. Die Antwort warum ich den Block einfüge und gleich auflöse ist folgende. Ich muss den Text der Mulitführungslinie an einem Objekt (Line, PL, Arc) ausrichten. Und da weiß ich nicht, wie ich das machen soll. Außerdem steht im Textfeld bereits der Text drin, den ich haben möchte und der Abstand des Textfeldes zum Objekt soll grundsätzlich gleich sein. Deshalb ist der geringste Aufwand den Block mit der einen Multiführungslinie einzufügen, die Richtung anzugeben und ihn dann zu sprengen. Da dann aber manchmal der Abstand des Textes zum Objekt nicht passt, muss ich händisch nachrücken können. Dazu muss ich die gesprengte Multiführungslinie anklicken, dann den Griff und dann den Text verschieben. Und die Aktionen würde ich gerne automatisieren, damit ich, falls die Position ok ist nur ESC drücken muss. Das ganze wird von vielen einzelnen Subs erledigt. Der Block wird mit "BlkRef.Explode" gesprengt und wir sprechen vom Modelspace. Im anhängenden Bild ist vielleicht zu verstehen, was ich möchte. Danke für's Mitdenken und hoffentlich BEraten.
------------------ Grüße aus München Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Soldnerkugel Mitglied
Beiträge: 131 Registriert: 29.01.2010 Win 7, AutoCAD Civil 3D 2015, SketchUp, CarlsonSurvCE
|
erstellt am: 27. Jul. 2015 16:12 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Schon ein bisserl her dieses Thema, ich hatte da auch mal Fragen bzgl. Block sprengen in VBA, falls du das Problem immer noch hast: evtl hilft das hier weiter http://forum.cad.de/foren/ubb/Forum259/HTML/002107.shtmlentgegen dem Anschein in diesem Thread, konnte ich mein Problem dann doch noch lösen (...und auch noch einige andere) Mir hat v.a. geholfen, dass die Blockreferenz auch nach dem Sprengen immer noch vorhanden ist, ich hab' dann lediglich nachdem ich an die Informationen gekommen bin, dich gebraucht habe, die Objekte gelöscht, die keine Blockreferenz waren. Die beim Sprengen erstellte Tabelle lässt sich mit der Eigenschaft .EntityType gezielt nach bestimmten Objekten durchsuchen. Einfach die Tabelle durchlaufen lassen und bei der richtigen Eigenschaft .EntityType abfragen. Meine Blöcke enthalten durchaus mehr als nur ein oder zwei Objekte, also funktioniert's auch bei komplexeren Fragestellungen bei mir schaut das dann z.B. so aus
Code:
For Each oBlckRefP In oSSetRacksP varTab = oBlckRefP.Explode For i = LBound(varTab) To UBound(varTab) If varTab(i).EntityType = 19 Then ' Hier .EntityTpe angeben ... End If End If Next ' explodierte Elemente löschen For i = LBound(varTab) To UBound(varTab) varTab(i).Delete Next i varTab.Delete varTab.Erase ... Exit For Next
P.S.: Codeschnipsel nicht vollständig ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 266 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 27. Okt. 2015 14:17 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Naja ich würd den Text und das Referenzobjekt auslesen (Selectionset) Anhand der Einfügepunkte von den Elementen lässt sich mit mäßigem Mathematischen Aufwand der gewünschte Referenzpunkt ermitteln. Bei der Linie sind das STARTPOINT und ENDPOINT. Bei nem ARC ist es CENTER(point?) Nun würd ich für uralt ACAD einen Dynablock mit Textattribut machen bei dem sich die Position des Führungspfeil anordnen lässt. (Diesen dann einfügen)
Für neuere Versionen einen MLEADER prorammtechnisch erstellen. Den Text hast du ja ausgelesen, den kann man somit in das ganze als Attributinhalt oder Text einpflegen. So keine Fehler aufgetaucht sind das alte Textobjekt löschen. Bischen rustikal aber einfach ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |