Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Dynamische Blöcke nach Namen ausfiltern

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von M.Seitz an!   Senden Sie eine Private Message an M.Seitz  Schreiben Sie einen Gästebucheintrag für M.Seitz

Beiträge: 5
Registriert: 13.02.2006

erstellt am: 13. Feb. 2006 20:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Proxy an!   Senden Sie eine Private Message an Proxy  Schreiben Sie einen Gästebucheintrag für Proxy

Beiträge: 1629
Registriert: 13.11.2003

Tastaturen, Mäuse,
Pladden, ...,
AutoCADs 200X, SWX 2kX

erstellt am: 13. Feb. 2006 21:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von CAD-Huebner an!   Senden Sie eine Private Message an CAD-Huebner  Schreiben Sie einen Gästebucheintrag für CAD-Huebner

Beiträge: 9732
Registriert: 01.12.2003

One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11

erstellt am: 13. Feb. 2006 22:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von M.Seitz an!   Senden Sie eine Private Message an M.Seitz  Schreiben Sie einen Gästebucheintrag für M.Seitz

Beiträge: 5
Registriert: 13.02.2006

erstellt am: 14. Feb. 2006 15:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von caddonner an!   Senden Sie eine Private Message an caddonner  Schreiben Sie einen Gästebucheintrag für caddonner

Beiträge: 166
Registriert: 24.05.2005

erstellt am: 03. Aug. 2015 11:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 03. Aug. 2015 12:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 03. Aug. 2015 12:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von caddonner an!   Senden Sie eine Private Message an caddonner  Schreiben Sie einen Gästebucheintrag für caddonner

Beiträge: 166
Registriert: 24.05.2005

erstellt am: 03. Aug. 2015 12:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 03. Aug. 2015 13:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 03. Aug. 2015 13:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von caddonner an!   Senden Sie eine Private Message an caddonner  Schreiben Sie einen Gästebucheintrag für caddonner

Beiträge: 166
Registriert: 24.05.2005

erstellt am: 03. Aug. 2015 13:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich


Zeichnung1.dwg

 
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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 03. Aug. 2015 13:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

"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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 03. Aug. 2015 13:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von caddonner an!   Senden Sie eine Private Message an caddonner  Schreiben Sie einen Gästebucheintrag für caddonner

Beiträge: 166
Registriert: 24.05.2005

erstellt am: 03. Aug. 2015 14:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für M.Seitz 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz