| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Attribut in Text umwandeln und Blocksymbollayer (3188 mal gelesen)
|
cm-Zeichner Mitglied Vermessungstechniker
Beiträge: 162 Registriert: 23.07.2009 Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit
|
erstellt am: 21. Feb. 2017 10:29 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, habe in einem alten Beitrag fast die Lösung meines Problems gefunden. http://forum.cad.de/foren/ubb/Forum54/HTML/023573.shtml Beim versuchten Antworten auf den Beitrag wurde angezeigt das er schon älter als ein Jahr ist, da ich keine Ahnung habe ob ich den wieder "aktivieren" kann deshalb ein neuer Beitrag. Meine Grundlagen Block = Symbol (mehrere Linien) und dazu 3 sichtbare Attribute alles auf dem Layer "0" definiert Beim Einfügen in die Zeichnung wird das Symbol (Linien) auf dem aktuellen Layer eingefügt (können verschiedene Layer sein). Die 3 Attribute bekommen dann auch immer verschiedene andere Layer zugewiesen Wenn ich den Block nun mit dem Programm von CAD-Huebner explodiere werden die Attribute in Text umgewandelt und haben auch den richtigen Layer. Genial D A N K E Lediglich das Symbol (die Linien) werden auf dem ursprünglichen Layer "0" angezeigt. Wie wäre der Code zu ergänzen damit die Linien am Layer liegen auf dem der Block eingefügt wurde? Danke
------------------ Grüße Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 21. Feb. 2017 10:43 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
OT "Beim versuchten Antworten auf den Beitrag wurde angezeigt das er schon älter als ein Jahr ist, da ich keine Ahnung habe ob ich den wieder "aktivieren" kann deshalb ein neuer Beitrag." Das ist nur ein Texthinweis (als hättest du ihn selbst als Antwort getippt!), mehr nicht. Kannst du löschen oder stehen lassen und ganz normal antworten. Da dieser Thread nun aber bereits erstellt ist, kann es auch hier weiter gehen.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 381 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 21. Feb. 2017 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
|
cm-Zeichner Mitglied Vermessungstechniker
Beiträge: 162 Registriert: 23.07.2009 Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit
|
erstellt am: 21. Feb. 2017 13:35 <-- editieren / zitieren --> Unities abgeben:
Könnte es mit XPLODE statt EXPLODE irgendwie funktionieren? Code: (command "._XPLODE" bn "" "Global" "von Hauptblock übernehmen")
Dürfte da allerdings die Objektauswahl in der Variablen bn nicht übernehmen können. ------------------ Grüße Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 21. Feb. 2017 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
Theoretisch ja, praktisch nein. Oder bekommst du XPLODE über deine (Command ..)-Anweisung gesteuert? Du bist hier im Programmier-Forum, also programmiere: Merke die den Layer des Objektes(der Blockreferenz), also an passender Stelle dann (setq oldLayer (assoc 8 el)) nach auflösen der Blockreferenz änderst du den Layer der neuen Einzel-Objekte, das kannst du unten in der vorhandenen while-Schleife einbauen (entmod(subst oldLayer (assoc 8 (entget le)) (entget le))) Aber wieso immer kaputt machen, man sollte sich freuen wenn mal etwas Struktur in einer Datei ersichtlich ist
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 381 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 21. Feb. 2017 14:17 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
nur so ne Überlegung. tausche mal Code: (command "._EXPLODE" bn)
durch Code: (setq Akt_Layer (tblobjname "Layer" (cdr(assoc 8 (entget bn)))) (command "._EXPLODE" bn) (setq ExplodeELEMENTE (ssget "_P")) (foreach teil (mapcar 'cadr (ssnamex ExplodeELEMENTE)) (if (/= "ATTDEF" (cdr (assoc 0 (entget teil)))) ;Achtung im Block enthaltene texte werden mit geändert. (setpropertyvalue teil "LayerId" Akt_Layer) ) )
------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 21. Feb. 2017 14:20 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
|
cm-Zeichner Mitglied Vermessungstechniker
Beiträge: 162 Registriert: 23.07.2009 Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit
|
erstellt am: 21. Feb. 2017 16:01 <-- editieren / zitieren --> Unities abgeben:
So hab jetzt mal gemacht wie vorgeschlagen: und die FETTEN Zeilen im Code ergänzt. Funktioniert, Nur die Layerfarbe ist durch das EXPLODIEREN auf VON BLOCK geändert Mit der nächsten Zeile (KURSIV)wollte ich das ändern, macht er auch, aber am Schluß nachdem er alles auf VON LAYER geändert wurde bekomme ich trotzdem noch die Fehlermeldung: ; Fehler: Fehlerhafte DXF-Gruppe: "256" und es wird abgebrochen. Wie kann ich das verhindern - probiere das jetzt schon eine Stunde lang mit verschiedenen Varianten aus, Ergebnis bleibt immer gleich. Code:
(if (setq as (ssget "_C" neup neup2 ALLE_GRENZPUNKTE_KVZ)) (progn (setq i 0) (while (setq e (ssname as i)) (setq el (entget e))(setq oldLayer (assoc 8 el)) (if (/= (assoc 66 el) nil) (progn (setq bn e) (while (/= (cdr (assoc 0 (setq el (entget e)))) "SEQEND") (if (and (= (cdr (assoc 0 el)) "ATTRIB") (/= (logand (cdr (assoc 70 el)) 1) 1) ) (progn (setq nl (cdr el)) (setq nl (subst '(0 . "TEXT") (assoc 0 nl) nl)) (setq l1 (cdr (member (assoc 2 nl) nl))) (setq l2 (reverse (cdr (member (assoc 2 nl) (reverse nl))))) (setq nl (append l2 l1)) (setq l1 (cdr (member (assoc 70 nl) nl))) (setq l2 (reverse (cdr (member (assoc 70 nl) (reverse nl))))) (setq nl (append l2 l1)) (setq nl (subst (cons 73 (cdr (assoc 74 nl))) (assoc 74 nl) nl)) (setq nl (vl-remove (assoc 280 nl) nl)) (entmake nl) (setq el (subst '(1 . "") (assoc 1 el) el)) ) ) (setq e (entnext e)) ) (setq le (entlast)) (command "._EXPLODE" bn) (while (setq le (entnext le)) (if (= (cdr (assoc 0 (entget le))) "ATTDEF") (entdel le) ) (entmod(subst oldLayer (assoc 8 (entget le)) (entget le))) ;(entmod(subst "256" (assoc 62 (entget le)) (entget le)))
) ) ) (setq i (1+ i)) ) (command "._REGEN") ) )
------------------ Grüße Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 21. Feb. 2017 17:10 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
zunächst mal sietzt die Entmod-Zeile nicht in der IF-Abfrage. Den zuvor gelöschten Attributdefinitionen möchstest du dann den Layer ändern.. (wenn Attributdefinition (dann Objekt löschen) (andernfalls den Layer des Objektes ändern) ) Dann die eigentliche Sache: 256 ist kein zulääsiges DottedPair in einer Elementliste, es müßte '(62 . 256) lauten{256 als Integer, nicht als Textstring}. Jedoch prüfst du überhaupt nicht ob das Obekt überhaupt einen gc62 hat, damit wirst du in einen Fehler laufen sobald Objekte mit der Farbe "von Layer" zu bearbeiten sind. In diesem Fall entählt die Elementliste kein gc62 und Subst wird in einer Fehler getrieben. (if (assoc 62 (entget le)) ; wenn gc62 vorhanden (= nicht VonLayer) (entmod(subst '(62 . 256) (assoc 62 (entget le)) (entget le))) ) Das würde soweit funktionieren bis Objekte mit TrueColor-Farben zu bearbeiten sind, bei diesen kommt zusätzlich der gc420 und ggf 430 ins Spiel. http://forum.cad.de/foren/ubb/Forum145/HTML/003115.shtml ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cm-Zeichner Mitglied Vermessungstechniker
Beiträge: 162 Registriert: 23.07.2009 Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit
|
erstellt am: 21. Feb. 2017 17:27 <-- editieren / zitieren --> Unities abgeben:
Das wars Code: (entmod(subst '(62 . 256) (assoc 62 (entget le)) (entget le)))
brauche vorher nichts prüfen da beim ssget nur solche Blöcke ausgewählt werden wo das passiert. Danke vielmals - cadffm ------------------ Grüße Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 21. Feb. 2017 17:29 <-- editieren / zitieren --> Unities abgeben: Nur für cm-Zeichner
du bearbeitest an dieser Stelle aber keine Blöcke und auch keine Blockreferenzen, du bearbeitest Objekte die es zum Zeitpunkt deines SSGET überhaupt noch nicht gab! (und ssget kann nicht nachsehen ob in einer Blockdefinition Objekte mit Farbe ungleich/VonLayer enthalten sind) ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Projektleiter (m/w/d) Ladenbau | Wir sind 1.500 Mitarbeiter aus über 25 Nationen mit verschiedensten Kulturen, Religionen und Gesichtern. Wir sind Store Makers mit Innovationsgeist, Out of the Box-Thinking, Entschlossenheit und Charisma. Wir sind umdasch The Store Makers - ein vertrauter Partner für außergewöhnliche Ladenbau-Lösungen. Und genau deswegen sucht Umdasch außergewöhnliche Mitarbeiter ? Wir suchen Menschen, die Menschen begeistern.... | Anzeige ansehen | Projektmanagement |
|
cm-Zeichner Mitglied Vermessungstechniker
Beiträge: 162 Registriert: 23.07.2009 Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit
|
erstellt am: 21. Feb. 2017 17:54 <-- editieren / zitieren --> Unities abgeben:
Definiere zuerst ein Auswahlfenster durch 2 Punkte (neup und neup2) Innerhalb dieses Auswahlfenster werden dann alle Blöcke ausgewählt die gewisse Kriterien erfüllen, dies wird in einer anderen Funktion festgelegt: Code: (setq ALLE_GRENZPUNKTE_KVZ (List (cons 0 "INSERT") (cons -4 "<NOT") (cons 8 K-PU-MI) (cons -4 "NOT>") (cons -4 "<OR") (cons 2 PKT-VA_S) (cons 2 PKT-VA_G) (cons 2 PKT-VA_N) (cons -4 "OR>") ))
In der Zeichnung kommen diese Blöcke, und auch andere, zahlreich vor. Teilweise werden nun Bereiche aus der Zeichnung kopiert und in einem Seitenbereich neu dargestellt. Damit in der Zeichnung der Block (Punkt mit zusätzlichen Informationen nur einmal vorkommt wird in der Kopie der Block "explodiert" Die Auswahl der Punkte erfolgt dann mit folgender Zeile: Code: (setq as (ssget "_C" neup neup2 ALLE_GRENZPUNKTE_KVZ))
Es funkt - sorry das ich vorher nicht so detailreich geschrieben habe was ich mache. Danke nochmals ------------------ Grüße Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |