| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Objektauswahl mit Handle (2123 mal gelesen)
|
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 02. Nov. 2018 14:48 <-- editieren / zitieren --> Unities abgeben:
Moin, ich bin VBA Anfänger, deswegen bitte nicht über die Frage wundern. Ich möchte mit Hilfe von VBA ein Objekt bewegen, von welchen ich die Object Handel als String in der Variable "Opjekt_gefundener_Block" gespeichert habe. Leider habe ich keine Ahnung wie der Befehl ThisDrawing.SendCommand aufgebaut sein muss, damit der die Variabel "Opjekt_gefundener_Block" übernimmt. Hat da einer einen Tipp für mich? 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: 02. Nov. 2018 15:15 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Ich würde die Variable "O bjekt_gefundener_Block" nennen. Wenn du von Sendcommand sprichst und einen Standard-AutoCADbefehl nutzen möchtest, dann versteht dieser (fast immer) wenn man den EntityName(ename) übergibt, also ein Ausflug in die Lispwelt wäre ein einfacher Weg. Wenn die Objektwahl startet, dann folgenden String senden // alles was in der nächsten Zeile steht muß als String in der Befehlszeile ankommen. (handent "3AB") wobei hier 3AB das Handle als Beispiel verwendet wurde.
Kannst es ja in Acad mal in der Befehlszeile testen: Hiermit mal eben schnell ein Handle abfragen: (alert(cdr(assoc 5 (entget(car(nentsel)))))) Und dann den Befehl Schieben aufrufen, wenn die Objektwahl ansteht gibst du folgendes ein (handent "3AB") wobe 3AB gegen das entsprechende Handle zu tauschen ist, anschließend beendest du die Objektwahl und kannst das Objekt verschieben.. Andernfalls: Mußt du einen Auswahlsatz(selectionset) erstellen mit dem/den Objekt(en) und diesen nutzen. Von Handle zu Objekt kommst du mit der Methode HandleToObject [Diese Nachricht wurde von cadffm am 02. Nov. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 02. Nov. 2018 15:42 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadffm, vielen vielen Dank, das klappt wunderbar, habe es direkt in meinen Code eingebaut. Gut dass meine Variable schon "Objekt_gefundener_Block" hieß, das "Opjekt" war nur ein Tippfehler hier in dem Forum. Dir noch ein schönes Wochenende!
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: 02. Nov. 2018 16:55 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Hallo Woppi, Dumme Frage, wenn Du das Objekt schon in VBA hast, warum bemühst Du dann erst Sendcommand? Wäre es nicht einfacher nur den Block.InsertionPoint zu ändern? Du schreibst ja Du bist VBA-Anfänger, verstehe ich so dass Du evtl. mehr damit möchtest. Bei Problemen kannst Du auch gerne deinen Code hier einstellen dann könnte man auch gezieltere Hilfe geben. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 02. Nov. 2018 17:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, das mit dem Verschieben war nur ein Beispiel, mir ging es vor allem darum wie bekomme ich die "Handel Nummer" an den Commandbefehl. Block.InsertionPoint ist natürlich auch eine super Möglichkeit. Wie wäre da der Syntax? Und für dann Fall das Du so nett bist, kann ich damit auch die aktuellen Einfügepunkte abfragen? Beste Grüße
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: 02. Nov. 2018 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
|
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 02. Nov. 2018 22:21 <-- editieren / zitieren --> Unities abgeben:
|
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 06. Nov. 2018 12:40 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe da schon wieder eine Frage. Es hängt nochmals mit den Blöcken zusammen, ich bin Dank Eurer Hilfe schon weiter gekommen, habe aber jetzt das Problem des ich mit den Objektzuweisungen nicht zurechtkomme. Kann ich auch direkt die "GetDynamicBlockProperties" eines Blockes auslesen, von dem ich den Namen weiß?
Code: Dim props As Variant 'Blockparameter Dim prop As AcadDynamicBlockReferenceProperty Dim I As Integer
' was muss an die Stelle von XXXXXXX? Ich habe den Blocknamen, oder die ID etc. weiß aber nicht wie ich das eingeben oder declarieren muss. Code:
props = XXXXXXX.GetDynamicBlockProperties For I = 0 To UBound(props) Set prop = props(I) If Not UCase(prop.PropertyName) = "ORIGIN" Then 'verhindern das "ORIGIN" auch bei den Parametern angezeigt wird 'MsgBox "Gefundener Parameter: " & Chr$(9) & prop.PropertyName & Chr$(13) & "mit dem Wert: " & Chr$(9) & Chr$(9) & prop.Value Else Debug.Print prop.PropertyName End If 'ORGINE Next Next
ich hoffe, ich habe mit verständlich ausgedrückt 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: 06. Nov. 2018 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
|
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 06. Nov. 2018 17:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, fast, nur wird da der Block auch in der Zeichnung ausgewählt. Bei mir wird der Block in einem UserForm ausgewählt, daher habe ich den Namen des Blocks (ListBox1.Value) oder (ListBox1.Name) ich weiß nur nicht wie ich den dann in dem Code Anstelle von XXXXXX einsetzten kann. 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: 06. Nov. 2018 19:43 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Hallo woppi, So ganz verstehe ich nicht was Du meinst. Wenn Du den Blocknamen aus Deinem UserForm hast, was soll das darstellen? Ist es ein ausgewähler Block, somit Blockreferenz? Oder ist es der Name des Blockes und damit die Zeichenanweisung? Die Methode "GetDynamicBlockProperties" gilt für Objekte vom Typ: BlockReference, MInsertBlock aber nicht für AcadBlock Kannst ja auch mal hier lesen, da geht es ziemlich ausführlich um dynamische Blöcke. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 07. Nov. 2018 11:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, nochmals vielen Dank für Deine Hilfe. Ich habe mir das durchgelesen, und auch Deinen Code ausprobiert. Einen Teil davon verwendet, und meinem Ziel ein ganzes Stück näher gekommen. Aber schon ist das nächste Problem da: Ich versuche (auch mit Hilfe von deinem Code) jetzt noch eine Schleife zu bauen, die alle in der Zeichnung enthaltenden dyn.Blöcke durchläuft. Und möchte dort die rausfiltern die auf einer bestimmten Blockreferenz beruhen (z.B.: "Profil_Vorsatzplatte_2_Nuten_Variabel") Von all denen auf die das zutrifft möchte ich dann Werte eines bestimmten Parameters auslesen. (das bekomme ich glaube ich auch hin) Das Problem ist das Filtern der Blöcke und das Übergeben des Blocks an die Variable "tBlockRef" damit ich mit den Parametern weiter machen kann. Code: Sub GetParameter_alle_Blöcke_einer_Sorte() Dim Ent As AcadObject Dim tBlock As AcadBlock Dim tBlockRef As AcadBlockReference For Each Ent In ThisDrawing.Blocks If Left(Ent.Name, 2) = "*U" And Not Ent.Name = "*Model_Space" And Not Left(Ent.Name, 6) = "*Paper" Then ' nur anonyme Blöcke Debug.Print Ent.Handle & "als anonymer Block: " & Ent.Name & Chr$(13) 'Hier soll noch der Filter für den Blockreferenzname hin. 'und dann muss hier der Block an die Variable "tBlockRef" übergeben werden, '(neu Einfügen geht ja nicht, dann habe ich ja nur die Standard Werte in den Parametern) Set tBlockRef = ThisDrawing.ModelSpace.InsertBlock(InsertionPnt, Ent.Name, 1#, 1#, 1#, 0)
Vieleicht kann man das ja auch gar nicht so verwirklichen, wie ich mir das vorstelle. Verzweifelte Grüße Woppi 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: 07. Nov. 2018 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Hi, das dürfte durchaus gehen. Ist aber komplex da die dynamischen Blockreferenzen anonymisiert vorliegen. Nun begebe ich mich etwas auf das Glatteis, da ich das noch nie so wirklich untersucht habe. Wenn man den Ursprungsblock (da kommt man mit blockref.effectivename dran) rekursiv durchläuft um an die Blocknamen der Unterblöcke zu kommen dürften man nicht an die Parameter der Dynamischen Eigenschaften kommen da die alle auf "Default" stehen. Deswegen denke ich das man sich rekursiv durch die die anonymen Blöcke hecheln muss. Also erst die (anonyme) Referenz suchen und dann deren Block definition aufmachen um an die (anonymen) Unterblöcke zu kommen. Es sind ja automatisch erzeugte Kopien des Originalblockes. Sie heißen üblicherweise "*U[Nummer]". Da nur diese die ersehnten Parametereinstellungen aufweisen dürften. Zum Thema Blöcke habe ich mal eine Library hier gepostet. Da sollte auch ein Beispiel für eine Rekursion drin sein. Lieben Gruß Thomas ------------------ 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 |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 07. Nov. 2018 13:10 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Dann steuere ich mein Halbwissen bei (halb, da nicht aus VBA-Sicht betrachtet ) Zitat: Original erstellt von woppi: Und möchte dort die rausfiltern die auf einer bestimmten Blockreferenz beruhen (z.B.: "Profil_Vorsatzplatte_2_Nuten_Variabel")
Entweder du möchtest etwas unmögliches oder du wirfst die Vokablen weiterhin durcheinander.. Blockreferenzen referenzieren einen Block, nie anders herum (es sei denn es geht um eine in einem Block verschachtelte Blockreferenz). Also: Die Datenbank durchlaufen und für jede Blockreferenz prüfen ob der effektivename dem gewünschten entspricht, falls JA hast du eine Blockreferenz deines dynamischen Blockes und der blockNAME zeigt die wirkliche Blockdefinition auf die diese Referenz verweist. <Ich lasse jetzt mal "Problemfälle" bei Seite, denn so eine dynamische Verbindung kann auch mal brechen und dann hat plötzlich auf noch mehr zu achten > Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 07. Nov. 2018 14:14 <-- editieren / zitieren --> Unities abgeben:
Zitat: Also: Die Datenbank durchlaufen und für jede Blockreferenz prüfen ob der effektivename dem gewünschten entspricht, falls JA hast du eine Blockreferenz deines dynamischen Blockes und der blockNAME zeigt die wirkliche Blockdefinition auf die diese Referenz verweist.
so habe ich mir das auch gedacht. deswegen hier alle Blöcke mit "*U*:
Code: If Left(Ent.Name, 2) = "*U" And Not Ent.Name = "*Model_Space" And Not Left(Ent.Name, 6) = "*Paper" Then ' nur anonyme Blöcke Debug.Print Ent.Handle & "als anonymer Block: " & Ent.Name & Chr$(13)
Und dann wollte ich mit so was ähnlichen wie: Code: If Ent.Name = ListBox1.Value Then
weiter machen, um nur die von mir gewünschten Blöcke zu haben. aber mit ent.Name geht es nur wenn es so declariert ist: Dim Ent As AcadEntity Aber um alle Blöcke in der Zeichnung zu durchlaufen muss es doch so declarieren: Dim Ent As AcadObject ,oder? Und dann komme ich nicht mehr an den "echten" Namen, nur noch an die ObjektID oder "*U..." oder Handle, und kann die anderen Blöcke nicht auschließen.
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: 07. Nov. 2018 15:29 <-- editieren / zitieren --> Unities abgeben: Nur für woppi
Hallo Woppi, gerade keine Zeit zum testen und nur mal Deinen Code gesehen. Bist Du Dir sicher dass Du mit dem Durchlaufen von ThisDrawing.Blocks Dein gewünschtes Ergebnis bekommst? Du suchst doch die Blockreferenzen in der Zeichnung. Somit müßtest Du ThisDrawing.ModellSpace durchsuchen nach ent.ObjectName = AcadDbBlockReference dann testen ob dieser Block ein dynamischer ist ent.IsDynamicBlock = True dann holst Du Dir den Ausgangsnamen des Blocks ent.EffectiveName und vergleichst mit Deinem Listennamen Hoffe die Eigenschaften und Methoden sind richtig geschrieben, war nur mal schnell ausd dem Gedächtnis Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 08. Nov. 2018 07:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, das waren die richtigen Tipps, jetzt sieht es gut aus. Der Abgleich der Blocknamen (If Ent.EffectiveName = ListBox1.Value Then...) funktioniert. Danke!! Ich hoffe ich habe heute etwas Zeit neben der Arbeit um mit dem Programm weiter zu kommen. Beste Grüße Ludger
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
woppi Mitglied cnc-programmierung
Beiträge: 65 Registriert: 16.01.2009 Acad Architecture 2020
|
erstellt am: 13. Nov. 2018 10:27 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich wollte nur noch mal Danke für die Hilfe sage. Ich habe mein Makro Dank Eurer Unterstützung jetzt fertig, und es klappt wunderbar und Hilft mir sehr bei meiner Arbeit. Beste Grüße
Ludger
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |