| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Selection Set: Blöcke nach Elementen durchsuchen (2041 mal gelesen)
|
Soldnerkugel Mitglied
Beiträge: 131 Registriert: 29.01.2010 Win 7, AutoCAD Civil 3D 2015, SketchUp, CarlsonSurvCE
|
erstellt am: 13. Jun. 2013 17:23 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich bräuchte mal wieder eure Hilfe. Folgendes Problem habe ich dieses Mal Ich habe in einer Zeichnung diverse Blöcke, in diesen Blöcken sind jeweils mehrere Zeichnungsobjekte (Kreise) enthalten. Es ist kein Problem die Blöcke mit einem Selection Set auszuwählen. Nur: wie komme ich an die Kreise in den Blöcken ran, ohne dass ich diese auflösen muss? Wie kann ich in den durch das Selection Set ausgewählten Blöcken nach den Kreisen suchen (, deren Koordinaten ich benötige)? ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 14. Jun. 2013 15:21 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
Hi, Das Ergebnis von Explode-Methode von Blöcken befindet sich in einer Tabelle. Der originale Block verbleibt. Man kann denn über mit einer Schleife Elemente untersuchen ob die Kreise sind. Nachher kann man die Elemente löschen. Der Code ist ohne Prüfen geschrieben da ich hier kein AutoCAD habe: vTab=Block.Explode For i=Lbound(vTab) To Ubound(vTab) If vTab(i).Entitype=7 then 'Kreis dP(0)=vTab(i).InsertionPoint(0) dP(1)=vTab(i).InsertionPoint(1) dP(2)=vTab(i).InsertionPoint(2) 'hier die Prozedur für Koordinaten von Kreisen End if Next i For i=Lbound(vTab) To Ubound(vTab) vTab(i).Delete Next i Die zweite Möglichkeit ist durch alle Elemente in Block zu iterieren:
For Each oEnt in Block If vTab(i).Entitype=7 then dP(0)=vTab(i).InsertionPoint(0) dP(1)=vTab(i).InsertionPoint(1) dP(2)=vTab(i).InsertionPoint(2) 'hier die Prozedur für Koordinaten von Kreisen End if Next oEnt Gruß Andrzej Zitat: Original erstellt von Soldnerkugel: Hallo zusammen,ich bräuchte mal wieder eure Hilfe. Folgendes Problem habe ich dieses Mal Ich habe in einer Zeichnung diverse Blöcke, in diesen Blöcken sind jeweils mehrere Zeichnungsobjekte (Kreise) enthalten. Es ist kein Problem die Blöcke mit einem Selection Set auszuwählen. Nur: wie komme ich an die Kreise in den Blöcken ran, ohne dass ich diese auflösen muss? Wie kann ich in den durch das Selection Set ausgewählten Blöcken nach den Kreisen suchen (, deren Koordinaten ich benötige)?
Zitat: Original erstellt von Soldnerkugel: Hallo zusammen,ich bräuchte mal wieder eure Hilfe. Folgendes Problem habe ich dieses Mal Ich habe in einer Zeichnung diverse Blöcke, in diesen Blöcken sind jeweils mehrere Zeichnungsobjekte (Kreise) enthalten. Es ist kein Problem die Blöcke mit einem Selection Set auszuwählen. Nur: wie komme ich an die Kreise in den Blöcken ran, ohne dass ich diese auflösen muss? Wie kann ich in den durch das Selection Set ausgewählten Blöcken nach den Kreisen suchen (, deren Koordinaten ich benötige)?
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: 14. Jun. 2013 15:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, vielen Dank, das mit der Tabelle hört sich ja schonmal sehr gut an. was mir allerdings mittlerweile aufgefallen ist: beim explode'n bleibt der originale Block tatsächlich erhalten, aber mit einem anderen Blocknamen. er erhält als suffix noch "_x2" dazu. ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 15. Jun. 2013 08:16 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
|
Soldnerkugel Mitglied
Beiträge: 131 Registriert: 29.01.2010 Win 7, AutoCAD Civil 3D 2015, SketchUp, CarlsonSurvCE
|
erstellt am: 17. Jun. 2013 09:35 <-- editieren / zitieren --> Unities abgeben:
Dzien dobry Andrzej, also irgendwie klappt das bei mir mit der Tabelle nicht. In der Tabelle steht bei mir gar nichts. Meine Blöcke werden selektiert - aber wenn ich die dann auflöse, wird nichts in die Tabelle geschrieben. Wie hast du den "vTab" definiert? soll das eine Variable vom Typ "Variant" sein? Das kann eigentlich nicht sein, weil dann "vTab.Entitype" keinen Sinn macht. ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 17. Jun. 2013 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
Dzien dobry, Moin moin! Die Variable vTab ist bei mir als Variant definiert. Dast ist eine Tabelle (Array) und Ihre Elemente sind AutoCAD-Objekte. Also vTab.Entitype würde nich funktionieren, aber vTab(i).Entitype schon. Das Makro funktioniert bei mir ohne Probleme. Was für AutoCAD-Version hast Du? Versuch mal VBA neu zu instalieren (VBA-Enabler)... Sonnst habe ich keine Ideen... Schöne Grüße AndreasDEU
Zitat: Original erstellt von Soldnerkugel: Dzien dobry Andrzej,also irgendwie klappt das bei mir mit der Tabelle nicht. In der Tabelle steht bei mir gar nichts. Meine Blöcke werden selektiert - aber wenn ich die dann auflöse, wird nichts in die Tabelle geschrieben. Wie hast du den "vTab" definiert? soll das eine Variable vom Typ "Variant" sein? Das kann eigentlich nicht sein, weil dann "vTab.Entitype" keinen Sinn macht.
[Diese Nachricht wurde von AndreasDEU am 17. Jun. 2013 editiert.] 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: 17. Jun. 2013 10:49 <-- editieren / zitieren --> Unities abgeben:
hm. ok, also do Variant. Also ich benutze Civil 3D 2011. hier mal mein Code-Schnipsel: Code:
Dim oSSBlcks as AcadSelection Set Dim oEntity2 as AcadBlockReference Dim intdxfCodes(5) as integer Dim varDXFValues(5) as Variant Dim lngElemente as long Dim mode as string dblCCoords(0 t0 2) as double Dim varTab as Variant [...] ' SelectionSet definieren intDxfCodes(0) = 0: varDxfValues(0) = "INSERT" intDxfCodes(1) = -4: varDxfValues(1) = "<OR" intDxfCodes(2) = 2: varDxfValues(2) = Blockname intDxfCodes(3) = 2: varDxfValues(3) = Blockname2 intDxfCodes(4) = -4: varDxfValues(4) = "OR>" intDxfCodes(5) = 410: varDxfValues(5) = "Model" 'nur Modellbereich ThisDrawing.SelectionSets.Item("SSInsert").Delete ' evtl. vorhandenes SelectionSet löschen [...]
mode = acSelectionSetAll oSSBlcks.Select mode, , , intDxfCodes, varDxfValues lngElemente = oSSBlcks.Count ThisDrawing.Utility.Prompt "Anzahl der Objekte: " & CStr(lngElemente) ' Blöcke auflösen For i = 0 To lngElemente oSSBlcks.Explode For Each oEntity2 In oSSBlcks If varTab(i).Entitype = 7 Then dblCCoords(0) = varTab(i).InsertionPoint(0) dblCCoords(1) = varTab(i).InsertionPoint(1) dblCCoords(2) = varTab(i).InsertionPoint(2) End If Next Next
Das ist doch eigentlich nicht wirklich was anderes als in deinem beispiel, oder? P.S. es befinden sich tatsächlich Kreise in den Blöcken - nicht dass hier da jemand jetzt noch nachfragen will, ob in den Blöcken tatsächlich Kreise vorhanden sind...
------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 17. Jun. 2013 11:13 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
Hallo, Dein Code ist nicht ganz richtig... mode = acSelectionSetAll oSSBlcks.Select mode, , , intdxfCodes, varDXFValues lngElemente = oSSBlcks.Count ThisDrawing.Utility.Prompt "Anzahl der Objekte: " & CStr(lngElemente) ' Blöcke auflösen For Each oEntity2 In oSSBlcks varTab = oSSBlcks(i).Explode For i = LBound(varTab) To UBound(varTab) If varTab(i).Entitype = 8 Then dblCCoords(0) = varTab(i).InsertionPoint(0) dblCCoords(1) = varTab(i).InsertionPoint(1) dblCCoords(2) = varTab(i).InsertionPoint(2) End If Next Next Gruß AndreasDEU 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: 17. Jun. 2013 11:17 <-- editieren / zitieren --> Unities abgeben:
ale jaja... ich hab grad auf eine andere Art versucht Blöcke zu durchsuchen und da ist mir auch grad aufgefallen, dass beim explodieren nichts übergeben wird. Mal schauen, ob es daran liegt. Herzlichen Dank schonmal ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 17. Jun. 2013 11:27 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
... mir ist noch ein Fehler aufgefallen: For Each oEntity2 In oSSBlcks varTab = oEntity2 .Explode For i = LBound(varTab) To UBound(varTab) If varTab(i).Entitype = 8 Then dblCCoords(0) = varTab(i).InsertionPoint(0) dblCCoords(1) = varTab(i).InsertionPoint(1) dblCCoords(2) = varTab(i).InsertionPoint(2) End If Next Next Gruß AndreasDEU [Diese Nachricht wurde von AndreasDEU am 17. Jun. 2013 editiert.] 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: 17. Jun. 2013 12:24 <-- editieren / zitieren --> Unities abgeben:
klappt immer noch nicht ganz Code: For i = 0 To oSSBlcks.Count - 1 varTab = oSSBlcks(i).Explode For j = LBound(varTab) To UBound(varTab) If varTab(j).Entitype = 8 Then dblCCoords(0) = varTab(j).InsertionPoint(0) dblCCoords(1) = varTab(j).InsertionPoint(1) dblCCoords(2) = varTab(j).InsertionPoint(2) End If Next Next
mit diesem Code werden die Blöcke richtig selektiert. Die Anzahl der Elementein den Blöcken wird auch richtig erkannt. allerdings werden die Koordinaten der Kreise nicht auf dblCCoords(0 to 2) übertragen. varTab(j).InsertionPoint(0) varTab(j).InsertionPoint(1) varTab(j).InsertionPoint(2) sind immer = "0"
kann das sein, dass varTab(j).Entitype da irgendwie nicht funktioniert? ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 17. Jun. 2013 12:35 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
Hallo, Schon wieder mein Fehler Der Objekt "Kreis" unterstützt die Metode InsertionPoint nicht. Der Code soll so aussehen: dblCCoords(0) = varTab(j).Center(0) dblCCoords(1) = varTab(j).Center(1) dblCCoords(2) = varTab(j).Center(2) Gruß AndreasDEU 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: 17. Jun. 2013 14:50 <-- editieren / zitieren --> Unities abgeben:
mist, das klappt auch nicht. Gibt es denn irgendwo eine Übersicht wie die Tabelle aussieht, in die die Elemente aus dem Block geschrieben werden? ich finde online leider nichts. ------------------
http://www.stupidedia.org/stupi/Rechter_Winkel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AndreasDEU Mitglied Ingenieur
Beiträge: 15 Registriert: 14.06.2013
|
erstellt am: 17. Jun. 2013 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für Soldnerkugel
|