| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Dynamische Blöcke nach Namen ausfiltern (2452 mal gelesen)
|
M.Seitz Mitglied
Beiträge: 5 Registriert: 13.02.2006
|
erstellt am: 13. Feb. 2006 20:31 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle! Ich habe ein kleines Problem mit dynamischen Blöcken: Um Alle Blöcke einer Zeichnung mit dem Namen "Blockname" in einen Auswahlsatz zu bekommen funktionierte früher folgender Befehl: (setq AWA (ssget "X" '((-4 . "<OR") (2 . "Blockname") (-4 . "OR>")))) Bei Dynamischen Blöcken sieht es folgendermaßen aus: Fügt man einen Dyn.Block mit "_insert" in eine Zeichnung ein, so erhält man mit (entget (entlast)) die Entinity-Daten. Dort erscheint unter dem Gruppencode 2 der Name des Blocks. Modifiziert man nun den Block mit seinen Griffen (was ja Sinn eines Dyn.Blocks ist!), so ändert sich der Name hinter Gruppencode 2 in einen Unbenanntenblock, z.B.: "*U30". In der Eigenschaften-Palette wird der Name allerdings noch richtig angezeigt. Kann mir irgendjemand sagen ob man die Blöcke über ihren Namen mit (ssget "X" '(...)) noch ausfiltern kann??? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proxy Ehrenmitglied Stateless-DHCP v6-Paketfragmentierer
Beiträge: 1629 Registriert: 13.11.2003 Tastaturen, Mäuse, Pladden, ..., AutoCADs 200X, SWX 2kX
|
erstellt am: 13. Feb. 2006 21:49 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Code: [...](vla-get-effectivename (vlax-ename->vla-object (car (entsel))))[...]
Damit du jedoch, von den ganzen Parametern der Blöcke auch alle Werte erwischen willst, musst du schon paar Schleifchen bauen. Eine einfache Liste ist jedoch in meinen Augen wertlos, was durch ihre Natur gegeben ist. Ansonten schau dir mal attext-befehl an, vielleicht ist es schon was du willst. ------------------ MfG Proxy [Diese Nachricht wurde von Proxy am 13. Feb. 2006 editiert.] 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: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 13. Feb. 2006 22:28 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Nein, man kann die Dynamischen Blöcke nicht über Ihren Namen herausfiltern, sobald man über die Einstellungen die Standardblock-Einfügung modifiziert hat. Prüfe zuerst, ob der Block überhaupt dynamisch ist. Dann die Normaleinfügungen wie gewohnt über (ssget "X" '((0 . "INSERT")(2 . "<hier blockname>"))) ermitteln, dann zusätzlich die modifizierten Blöcke suchen über (setq aw (ssget "X" '((0 . "INSERT")(2 . "`*U*")))) und dort jede Referenz via (vlax-get-property (vlax-ename->vla-object BlockrefElementname 'EffectiveName) prüfen und auf gesuchten Blocknamen vergleichen. Nicht wirklich schön - das ganze in eine Funktion packen (SSGET-DYN Blockname) wäre wohl sinnvoll. So mehr ist heute Abend nicht drin. ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
M.Seitz Mitglied
Beiträge: 5 Registriert: 13.02.2006
|
erstellt am: 14. Feb. 2006 15:39 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Anregungen! Ich hab mal 'ne kleine Funktion geschrieben, die als Rückgabewert einen Auswahlsatz liefert, der alle Blöcke einer Zeichnung (konventionelle und dynamische) mit dem Namen <BLOCKNAME> zurückgiebt. Wen's interessiert: (defun SSGETD (BLOCKNAME / AWA AWAD i ELNA VLANAM) (setq AWA (ssget "X" (list '(0 . "INSERT")(cons 2 BLOCKNAME)))) (if (not AWA) (setq AWA (ssadd))) (setq AWAD (ssget "X" '((0 . "INSERT")(2 . "`*U*")))) (setq i 0) (if AWAD (progn (repeat (sslength AWAD) (setq ELNA (ssname AWAD i)) (setq VLANAM (vlax-ename->vla-object ELNA)) (if (equal BLOCKNAME (vla-get-EffectiveName VLANAM)) (ssadd ELNA AWA) ) (setq i (1+ i)) ) (setq AWAD nil) ) ) (setq AWA AWA) ) Allerdings gibt es noch weitere Eigenheiten von dynamischen Blöcken, die dazu geführt haben immernoch "konventionelle" Blöcke einzusetzen. MfG Manuel Seitz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 14. Feb. 2006 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Zitat: Original erstellt von M.Seitz: Allerdings gibt es noch weitere Eigenheiten von dynamischen Blöcken, die dazu geführt haben immernoch "konventionelle" Blöcke einzusetzen.
Na ja, es gibt ja gar keinen Grund auf Biegen und Brechen dynamische Blöcke zu verwenden. Das macht ja nur für bestimmte Anwendungen Sinn... ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caddonner Mitglied
Beiträge: 166 Registriert: 24.05.2005
|
erstellt am: 03. Aug. 2015 11:58 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Hallo, ich bringe diese Funktion nicht richtig zum laufen: (defun SSGETD (BLOCKNAME / AWA AWAD i ELNA VLANAM) (setq AWA (ssget "X" (list '(0 . "INSERT")(cons 2 BLOCKNAME)))) (if (not AWA) (setq AWA (ssadd))) (setq AWAD (ssget "X" '((0 . "INSERT")(2 . "`*U*")))) (setq i 0) (if AWAD (progn (repeat (sslength AWAD) (setq ELNA (ssname AWAD i)) (setq VLANAM (vlax-ename->vla-object ELNA)) (if (equal BLOCKNAME (vla-get-EffectiveName VLANAM)) (ssadd ELNA AWA) ) (setq i (1+ i)) ) (setq AWAD nil) ) ) (setq AWA AWA) ) Steh irgend wo am Schlauch. Habe den Code in Datei spiro.lsp kopiert und dann über appload geladen. Was muss ich jetzt in Befehlszeile eingeben damit alle Blöcke (teilw. dynamisch) mit Namen "Spirorohr" oder "Spirobogen" usw. ausgewählt werden ? (ssgetd "spiro*") wählt nur einige aus und warum gerade diese weiß ich nicht. ------------------ mfg Peter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Aug. 2015 12:01 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Na dann schau dir doch den Effectiv-Namen der nicht gewählten Blöcke mal an und vergleiche mit deiner Such-Angabe: (vla-get-EffectiveName(vlax-ename->vla-object (car(entsel)))) anscheinend ist die Rückgabe nicht so !equal" das Equal sagt das es passt. PS: Der WAL ist ein großes Tier und möchte nicht mit einem wal verglichen werden => STRCASE ? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 03. Aug. 2015 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist! Grundsätzlich ist es aber sicher besser/einfacher durch das Layout(ind dem Fall wohl der Modellbereich) per vlax-for zu gehen und alle Blockreferenzen auf Ihren effectivenamen hin zu prüfen, als diesen Augenwischenden Umweg über ssget zu gehen. Wenn nur eine Blockref enthalten ist, die nicht dynamisch verändert wurde, findet dir ssget diese und lässt all die anderen, die ja dann unbenante Referenzen sind, unberücksichtigt
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caddonner Mitglied
Beiträge: 166 Registriert: 24.05.2005
|
erstellt am: 03. Aug. 2015 12:59 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Also an Groß und Kleinschreibung liegt es nicht. Alle Blocknamen sind kleingeschrieben. Wohl eher daran dass nicht alle dynamisch verändert wurden. Zitat:
einfacher durch das Layout(ind dem Fall wohl der Modellbereich) per vlax-for zu gehen und alle Blockreferenzen auf Ihren effectivenamen hin zu prüfen
Dies in code-Form wäre wahrscheinlich die Lösung... ------------------ mfg Peter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Aug. 2015 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Im Auswahlsatz AWA hast du doch alle die nicht dynamisch verändert wurden, daran liegt es also nicht. PS: Wenn du SSGET nutzen willst, dann wählst du explizit nur unverschachtelte "TopLevel" Elemente, das ist klar und du redest hier nun auch nicht von verschachtelten Objekte (Oblock in Block), Ja? Wenn du ja einfach mal ein Beispiel mit mind. einer Referenz die nicht gefunden wird posten würdest.. könnte man auch selbst nachsehen. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Aug. 2015 13:15 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Ich vermute aber zu wissen worüber du stolperst: Du verwertest vermutlich überhaupt nicht die Rückgabe der Funktion, sondern fragst den "letzten Auswahlsatz" ab, und der beinhaltet ALLE U*-Blöcke (TopLevel) der Datei. Liege ich richtig ? Was passiert mit der Zeile: (sssetfirst nil (ssgetd "Blockname")) ? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caddonner Mitglied
Beiträge: 166 Registriert: 24.05.2005
|
erstellt am: 03. Aug. 2015 13:31 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Vermutlich hast du recht. Darum war auch meine Frage was ich in Befehlszeile eingeben muss. Wie geschrieben hab ich nur den Code vom Beitrag aus dem Jahr 2006 kopiert. In der Meinung dass der passt. Mit sauswahl funktioniert es – aber das geht ja nur über Auswahlfenster und nicht in Makro ? Anbei eine referenz dwg
------------------ mfg Peter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Aug. 2015 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
"Was muss ich jetzt in Befehlszeile eingeben damit alle Blöcke (teilw. dynamisch) mit Namen "Spirorohr" oder "Spirobogen" usw. ausgewählt werden ?" Da du das gute Stück in der Befehlszeile zum auswählen nutzen möchtest, eigentlich genau das was du gepostet hast: (ssgetd "spirobogen45-100mm")
Wenn du den "letzten Auswahlsatz" auch noch auf diese Auswahl trimmen willst: _.SELECT;(ssgetd "spirobogen45-100mm");; So könntest du dann bei späterer Objektwahl auch mit "_p" bzw. v für vorheriger darauf zugreifen. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Aug. 2015 13:59 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
STOOOP (ssgetd "spiro*") wählt nur einige aus und warum gerade diese weiß ich nicht. LOGO! Das stimmt. In dem Code wird ja auf EQUAL (also "Gleich") getestet. Du müßtest den Code umbauen und mit WCMATCH vergleichen, da kann man Wildcards nutzen.
(if (equal BLOCKNAME (vla-get-EffectiveName VLANAM))
(if (wcmatch (strcase(vla-get-EffectiveName VLANAM)) (strcase BLOCKNAME)) ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caddonner Mitglied
Beiträge: 166 Registriert: 24.05.2005
|
erstellt am: 03. Aug. 2015 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für M.Seitz
Super mit der Änderung: Zitat: (if (wcmatch (strcase(vla-get-EffectiveName VLANAM)) (strcase BLOCKNAME))
und der Ergänzung: Zitat: _.SELECT;(ssgetd "spiro*");;
funktioniert es !! Danke !
------------------ mfg Peter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |