Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Attribut in Text umwandeln und Blocksymbollayer

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:  Attribut in Text umwandeln und Blocksymbollayer (3188 mal gelesen)
cm-Zeichner
Mitglied
Vermessungstechniker


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

Beiträge: 162
Registriert: 23.07.2009

Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit

erstellt am: 21. Feb. 2017 10:29    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 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
良い精神




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: 21. Feb. 2017 10:43    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 cm-Zeichner 10 Unities + Antwort hilfreich

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



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

Beiträge: 381
Registriert: 15.07.2011

ACA2020
Windows10

erstellt am: 21. Feb. 2017 13:27    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 cm-Zeichner 10 Unities + Antwort hilfreich

------------------
Gruß Wolfgang 

[Diese Nachricht wurde von Meldin am 21. Feb. 2017 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cm-Zeichner
Mitglied
Vermessungstechniker


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

Beiträge: 162
Registriert: 23.07.2009

Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit

erstellt am: 21. Feb. 2017 13:35    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

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




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: 21. Feb. 2017 13:46    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 cm-Zeichner 10 Unities + Antwort hilfreich

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



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

Beiträge: 381
Registriert: 15.07.2011

ACA2020
Windows10

erstellt am: 21. Feb. 2017 14:17    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 cm-Zeichner 10 Unities + Antwort hilfreich

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




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: 21. Feb. 2017 14:20    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 cm-Zeichner 10 Unities + Antwort hilfreich

Die passende While-Schleife gibt es bereits im Code, inkl. Abfrage Attdef ja/nein

------------------
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


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

Beiträge: 162
Registriert: 23.07.2009

Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit

erstellt am: 21. Feb. 2017 16: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

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




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: 21. Feb. 2017 17:10    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 cm-Zeichner 10 Unities + Antwort hilfreich

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


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

Beiträge: 162
Registriert: 23.07.2009

Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit

erstellt am: 21. Feb. 2017 17:27    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

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




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: 21. Feb. 2017 17:29    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 cm-Zeichner 10 Unities + Antwort hilfreich

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 ansehenProjektmanagement
cm-Zeichner
Mitglied
Vermessungstechniker


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

Beiträge: 162
Registriert: 23.07.2009

Win7Pro 64Bit, AutoCAD Map3D 2014 64Bit

erstellt am: 21. Feb. 2017 17:54    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

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

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