| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ZNG nach allen Blöcken dursuchen (444 mal gelesen)
|
gerhard123 Mitglied techn.Angestellter
Beiträge: 151 Registriert: 29.11.2007
|
erstellt am: 03. Mrz. 2009 16:39 <-- editieren / zitieren --> Unities abgeben:
Hallo, wie kann ich die komplette Zeichnung nach allen Blöcken (auch verschachtelten Blöcke) durchsuchen und den Namen und die Anzahl der der Blöcke zurückgeben, toll wäre es auch den Einfügepunkt zu von jedem Block auszulesen? Vielleicht hat jemand schon ein ähnlichen Problem gelöst und könnte mir eine Codeauszug zu einem der Punkt zukommen lassen. Vorab schon mal Danke.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Mrz. 2009 16:49 <-- editieren / zitieren -->
Hi, hast Du auch was dazu? Code an dem Du gerade arbeitest? Das mit den verschachtelten Blöcken ist mehr Aufwand (und fraglich, welche Aufgabe es betrifft, mir fehlt da in der Regel die Sinnhaftigkeit, wenn es sich nicht um XRef's handelt). Und was hilft der Einfügepunkt, wenn das Layout dazu nicht bekannt ist? Ich schreib mal was (nur für ModelSpace, ohne Verschachtelung) und Du versuchst Dich weiter, bei Bedarf nochmals melden. Code nicht getestet, nur getipt: Code: Dim tEnt as AcadEntity for each tEnt in ThisDrawing.ModelSpace if TypeOf tEnt is AcadBlockReference then debug.Print tEnt.Name 'da ist der Blockname debug.Print tEnt.InsertionPoint(0) 'das ist Einfügepunkt X debug.Print tEnt.InsertionPoint(1) 'das ist Einfügepunkt Y debug.Print tEnt.InsertionPoint(2) 'das ist Einfügepunkt Z End If Next
Und wenn es grosse Zeichnungen sind, dann nicht durchscannen, sondern zuerst die BlockReferenzen in einem SelectionSet fangen und das dann durchgehen. - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 03. Mrz. 2009 editiert.] |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 03. Mrz. 2009 17:08 <-- editieren / zitieren --> Unities abgeben: Nur für gerhard123
|
gerhard123 Mitglied techn.Angestellter
Beiträge: 151 Registriert: 29.11.2007
|
erstellt am: 04. Mrz. 2009 06:15 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, vorab schon mal Danke für eure Hilfe. Ich pastle gerade an einem Typenkonfigurator. Die Blockinfos benötige ich um auf Daten aus dem ERP-System zugreifen zu können bzw. Die Daten in einer DB zu speichern. Verschachtelte Blöcke deshalb, weil zB. ein Fachboden aus 2 Konsolen mit einer Artikelnummer=Blockname und einem Blechboden=Artikelnummer besteht Annahme: Block der eingefügt wird heisst zB. Fachboden 100x40 SubBlock1 123456 Konsole links Subblock2 123457 Konsole rechts SubBlock3 123458 Blechboden Ich benötige nun die 6-stelligen Artikelnummen der Subblöcke. Hoffe ich konnte es halbwegs erleutern was ich meine. Lg. Gerhard
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2009 07:57 <-- editieren / zitieren -->
Hi Gerhard, zu Theorie: in diesem Fall musst Du, nachdem Du eine BlockReferenz gefunden hast, die Blockdefinition dafür öffnen, diese durchsuchen nach BlockReferenzen (dieser Vorgang muss dann rekursiv sein, könnte ja wiederum aus Subblöcken bestehen). Hat die Blockdefinition ihrerseits Subblöcke, dann musst Du den Einfügepunkt des Subblocks in der Blockdefinition ermitteln, dieser Einfügepunkt muss dann über Verschiebung/Skalierung/Rotation des übergeordneten Blocks umgerechnet werden. Geometrische Vektoren und Matrizen rechnen. Zur Praxis: Wenn Du einen Block 100x40 in der Zeichnung hast, dann weisst Du doch schon, dass der Subblock1-3 inkludiert! Die Auswertung, wenn Du schon mit Datenbank hantierst, ist in der Datenbank leichter lösbar (die Datenbank darf ja wissen, dass 'Fachboden 100x40' aus Subblock1-3 besteht). - alfred - ------------------ www.hollaus.at |
gerhard123 Mitglied techn.Angestellter
Beiträge: 151 Registriert: 29.11.2007
|
erstellt am: 04. Mrz. 2009 08:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, du hast schon recht mit der Blockdefinition in der DB. Auber ich möchte so vorgehen, dass wenn der Block "Fach 100x40" in der DB noch nicht existiert, ich mir zu diesem Block einen Datensatz erstelle mit den Informationen aus dem Block (Artikelnummern, Mengen und Positioniertung, und den Datensatz mit Informationen aus den ERP-System vervollstäntige). Damit habe ich keine Probleme, habe schon einige Programme mit VB.net gemacht. Probleme machen mir eher die Infos auf dem Autocad. Hast du zum Thema " Blockdefinition öffnen und diese durchsuchen nach BlockReferenzen" auch ein kleines Codebeispiel für mich? Das würde mir sehr weiterhelfen. Danke nochmals für deine Hilfe Gerhard
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2009 08:20 <-- editieren / zitieren -->
ergänzend zu obigem Code: Code: dim tBlock as AcadBlock dim tSubEnt as AcadEntity set tBlock = ThisDrawing.Blocks(tEnt.Name) for each tSubEnt in tBlock if TypeOf tSubEnt is AcadBlockReference then 'hier hast du einen Subblock end if next
- alfred - ------------------ www.hollaus.at
[Diese Nachricht wurde von a.n. am 04. Mrz. 2009 editiert.] |
gerhard123 Mitglied techn.Angestellter
Beiträge: 151 Registriert: 29.11.2007
|
erstellt am: 04. Mrz. 2009 08:24 <-- editieren / zitieren --> Unities abgeben:
|
gerhard123 Mitglied techn.Angestellter
Beiträge: 151 Registriert: 29.11.2007
|
erstellt am: 04. Mrz. 2009 14:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ich komme da nicht so richtig zusammen. Kannst du mir zu der rekursiven Schleife noch ein paar Tips geben. Mit deinem Code bekomme ich alle Blöcke in der obsersten Ebenen aber ich schaffe es nicht auf die Blöcke aus der Zeiten oder Dritten Ebene zuzugreifen. Steh da voll auf der Leitung Lg. Gerhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2009 14:42 <-- editieren / zitieren -->
Hi Gerhard, alternativer Vorschlag (für rekursive Geschichte hab ich jetzt nicht die Zeit ): Wenn Du die Bestandteile einer Blockzusammenstellung sowieso in die Datenbank schreibst, dann mach zuerst mal eine temporäre Tabelle, in der Du die Blockdefinitionen (samt Blockreferenzen der ersten Hierarchie) anlegst, Tabelle sieht dann z.B. so aus: Code: BLNAME | SUBBLNAME | PNT_X | PNT_Y FACHBODEN_100x40 | SubBlock1 123456 Konsole links | 9.99 | 9.99 FACHBODEN_100x40 | Subblock2 123457 Konsole rechts | 9.99 | 9.99 FACHBODEN_100x40 | SubBlock3 123458 Blechboden | 9.99 | 9.99und sollten diese SubBlockXXX weiter SubBlöcke inkludieren, dann halt auch für diesen die Zeilen dazu Subblock2 123457 Konsole rechts | Schraube M10x36 | 0.00 | 0.00
Damit brauchst Du dann nurmehr die obersten Blockreferenzen aus der Zeichnung rausspielen, da Du in der Datenbank schon die Bestandteile dazu hast.Die Blockdefinitionen gehst Du so durch:
Code: dim tBlDef as AcadBlock for each tBlDef in ThisDrawing.Blocks if left(tBlDef.Name) <> "*" then 'ModelSpace und anonyme nicht berücksichtigen 'eventuell hier noch prüfen, ob es sich um ein XRef handelt dim tSubEnt as AcadEntity for each tSubEnt in tBlDef if typeof tSubEnt is AcadBlockReference then 'das ist ein in der Blockdefinition vorhandene Blockreferenz endif next end if next
BTW hast Du schon mal den Befehl 'EATTEXT' probiert?- alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 04. Mrz. 2009 editiert.] |
gerhard123 Mitglied techn.Angestellter
Beiträge: 151 Registriert: 29.11.2007
|
erstellt am: 05. Mrz. 2009 12:28 <-- editieren / zitieren --> Unities abgeben:
|