Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Layer in allen Blöcken automatisch konvertieren

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:  Layer in allen Blöcken automatisch konvertieren (2106 mal gelesen)
ROAR78
Mitglied
Dipl.-Ing (FH)

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

Beiträge: 9
Registriert: 26.09.2013

Win7(64), MS Office 2010, AutoCAD Mechanical 2014, MS SQLServer 2008(64)

erstellt am: 26. Sep. 2013 10: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

Hallo Leute,

will alte Zeichnungen komplett in neue AM_.. Layer umkonvertieren.

Klapp soweit ganz gut mit den Befehlen:
(if (setq temp (ssget "X" '((0 . "DIMENSION")))) (command "eigändr" temp "" "Layer" "AM_5" ""))
(if (setq temp (ssget "X" '((0 . "MTEXT")))) (command "eigändr" temp "" "Layer" "AM_6" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
(if (setq temp (ssget "X" '((0 . "TEXT")))) (command "eigändr" temp "" "Layer" "AM_6" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
(if (setq temp (ssget "X" '((8 . "MITTE")))) (command "eigändr" temp "" "Layer" "AM_7" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
usw.

Bei Blöcken sind meine LISP-Kenntnisse aber auf ihre die Grenzen gestoßen.

Hab damit versucht:

1) Hiermit bekomme ich wunderbar die Auflistung aller Blöcke (auch die *D.. und *U.., was auch immer das sein soll, vielleicht dynamisch Blöcke???)

(while (setq BL(tblnext "BLOCK" T))  ----> geht durch die Blocktabelle
(command "_-bedit" (princ(strcat "\n"(cdr(assoc 2 BL)))))

                        ;hier sollen die Konvertierungsbefehle (wie oben) kommen

(command "_bclose" "")
)

2) Damit kann ich wunderbar einzelnen Block konvertieren

(command "_-bedit" "Seitenansicht B95")

                        (if (setq temp (ssget "X" '((0 . "DIMENSION")))) (command "eigändr" temp "" "Layer" "AM_5" ""))
                        (if (setq temp (ssget "X" '((0 . "MTEXT")))) (command "eigändr" temp "" "Layer" "AM_6" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
                        (if (setq temp (ssget "X" '((0 . "TEXT")))) (command "eigändr" temp "" "Layer" "AM_6" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
                        (if (setq temp (ssget "X" '((8 . "MITTE")))) (command "eigändr" temp "" "Layer" "AM_7" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
                        usw.

(command "_bclose" "")

3) Und damit habe ich versucht alle Blöcke in der Schleife zu konvertieren

(while (setq BL(tblnext "BLOCK" T))  ----> geht durch die Blocktabelle
(command "_-bedit" (princ(strcat "\n"(cdr(assoc 2 BL)))))

                        (if (setq temp (ssget "X" '((0 . "DIMENSION")))) (command "eigändr" temp "" "Layer" "AM_5" ""))
                        (if (setq temp (ssget "X" '((0 . "MTEXT")))) (command "eigändr" temp "" "Layer" "AM_6" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
                        (if (setq temp (ssget "X" '((0 . "TEXT")))) (command "eigändr" temp "" "Layer" "AM_6" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
                        (if (setq temp (ssget "X" '((8 . "MITTE")))) (command "eigändr" temp "" "Layer" "AM_7" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
                        usw.

(command "_bclose" "")
)

Hier bricht er direkt ab, weil er bei Blocknamen auf Sonderzeichen stößt (*D..), oder ACAD bleibt hängen

..............

Hat da jemand ne Idee, jemand schon was ähnliches gemacht???
Vielleicht muss ich die Blöcke mit Sonderzeichen überspringen?

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 26. Sep. 2013 10:34    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 ROAR78 10 Unities + Antwort hilfreich

Propsedit z.B. kann das ... kann man auch für Mehrfach-Konvertierungen in einer Zeichnung laut einer Liste aufbohren oder via Script auf mehrere Zeichnungen oder ganze Verzeichnisse loslassen .. nur mal so als Idee ..

aber wenn du Mechanical hast und eine ordentliche Vorlage und eine ordentliche "Layerstruktur" in den alten Zeichnungen, hilf vielleicht schon der Befehl amsetupdwg ... ?!

Auch diesen kann man so automatisieren, das er ganze Verzeichnisse in einem Rutsch erledigt ...

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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: 26. Sep. 2013 12: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 ROAR78 10 Unities + Antwort hilfreich

mit diesem codeschnipsel kannst du durch die Blockdefs gehen und diese ändern.
für Attribute kannst du ja noch nach jeder bearbeiteten Blockdef ein attsync nachschieben

Code:
(vl-load-com)
(if(and
    (tblobjname"LAYER""AM_6")
    (tblobjname"LAYER""AM_7")
    )
  (While
    (and(setq BLOCK (tblnext "BLOCK" (null BLOCK)))
        (setq BLOCK(cdr(assoc -2 BLOCK)))
        (setq elem(entget block))
        )
    (repeat (if(setq count(VL-CATCH-ALL-APPLY 'vla-get-Count
                (list
                (vlax-ename->vla-object
                  (cdr (assoc 330 elem))
                  ) ;_ end of vlax-ename->vla-object
                ) ;_ end of vla-get-Count
                ))
              (- count
              1
              ) ;_ end of -
              0
              )
      (setq elem (entget (entnext (cdr (assoc -1 elem)))))
    (if(or
        (member(cdr(assoc 0 elem))'("DIMENSION" "MTEXT" "TEXT"))
            (setq layer(=(cdr(assoc 8 elem))"MITTE"))
          )
      (if layer
        (entmod(subst (cons 8 "AM_7")(assoc 8 elem)elem))
        (entmod(subst (cons 8 "AM_6")(assoc 8 elem)elem))
        ))
    (setq layer nil)
      )
    )
  )

------------------
Gruß
CADwiesel
Besucht uns im CHAT

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

ROAR78
Mitglied
Dipl.-Ing (FH)

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

Beiträge: 9
Registriert: 26.09.2013

Win7(64), MS Office 2010, AutoCAD Mechanical 2014, MS SQLServer 2008(64)

erstellt am: 27. Sep. 2013 12:14    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 Leute,


vielen Dank für den schnellen und nützlichen Input.

Da ich in Script-Datei arbeite, habe direkt das Macro von CADwiesel ausprobiert.

Es funkzt SEHR GUT

Da ich aber nur Anfänger in Sachen LISP-Programmierung bin habe ich mit verschachtelten Bedingung bissle Probleme

    (if(or
        (member(cdr(assoc 0 elem))'("DIMENSION" "MTEXT" "TEXT"))
            (setq layer(=(cdr(assoc 8 elem))"MITTE"))
          )
      (if layer
        (entmod(subst (cons 8 "AM_7")(assoc 8 elem)elem))
        (entmod(subst (cons 8 "AM_6")(assoc 8 elem)elem))
        ))
    (setq layer nil)

Die Frage ist, was diese Bedingung genau tut und ob man damit nach Elementen mit mehreren Eigenschaften (Layer, Typ, usw.) suchen

und mehreren Eigenschaften (Layer, Farbe, usw.) ändern kann?

wie hier z.B.:

(if (setq temp (ssget "X" '((0 . "HATCH") (8 . "SCHRAFFUR")))) (command "eigändr" temp "" "Layer" "AM_8" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
(if (setq temp (ssget "X" '((0 . "ARC") (8 . "SCHRAFFUR")))) (command "eigändr" temp "" "Layer" "GRAVUR" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))
(if (setq temp (ssget "X" '((100 . "AcDbLine") (8 . "SKIZZE")))) (command "eigändr" temp "" "Layer" "GRAVUR" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))


_______________________
Mit freundlichen Grüßen

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: 27. Sep. 2013 16:32    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 ROAR78 10 Unities + Antwort hilfreich

der Ausdruck
Code:
(member(cdr(assoc 0 elem))'("DIMENSION" "MTEXT" "TEXT"))

schaut nach ob das element in der Liste '("DIMENSION" "MTEXT" "TEXT") enthalten ist
dieser Ausdruck
Code:
(=(cdr(assoc 8 elem))"MITTE")

prüft ob der Layername MITTE ist

natürlich ist es möglich - wie du ja am ersten Ausdruck sehen kannst - mehrere Möglichkeiten zuzulassen.

------------------
Gruß
CADwiesel
Besucht uns im CHAT

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

ROAR78
Mitglied
Dipl.-Ing (FH)

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

Beiträge: 9
Registriert: 26.09.2013

Win7(64), MS Office 2010, AutoCAD Mechanical 2014, MS SQLServer 2008(64)

erstellt am: 14. Okt. 2013 15: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

Wie sieht den eine Prozedur aus,

wenn ich in allen Blöcken nach verdeckten Linien (6 . "HIDDEN") suche und diese in Layer "AM_3", Farbe und Linientyp "von Layer" konvertiert haben will.

also das:
(if (setq temp (ssget "X" '((6 . "HIDDEN")))) (command "eigändr" temp "" "Layer" "AM_3" "Farbe" "VonLayer" "LTyp" "ByLayer" ""))

habe ich so geändert:
    (if (setq LTyp (=(cdr(assoc 6 elem))"HIDDEN"))(entmod(subst (cons 8 "AM_3")(assoc 8 elem)elem)))

Das funktioniert auch, aber wie komme ich an Farbe und Linientyp dran?

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

spider_dd
Mitglied



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

Beiträge: 1111
Registriert: 27.11.2003

Win 10Pro
Intel(R) Core(TM) i7-7700
NVIDIA Quadro P1000
ACAD, Civil-3D 2018

erstellt am: 14. Okt. 2013 17:24    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 ROAR78 10 Unities + Antwort hilfreich

Hallo Roar78,

kurz mal etwas ausgeholt. Die Funktionen manipulieren direkt die Daten der Objekte. Gib mal (entget (ssname (ssget) 0)) in die Befehlszeile ein und wähle dann ein beliebiges Objekt (z. B. Linie) aus, dann siehts Du was ich meine.
Der Zugriff auf einzelne Eigenschaften erfolgt über den entprechenden Gruppencode (GC). Hier findest Du eine Aufstellung dieser GC.
Der Linientyp ist hat z. B. den GC 6, die Farbe den GC 62.
Nach dem Beispiel von Dir mit dem Layer (GC 8) sollte Dir die entsprechende Anpassung gelingen.
Aber Achtung: wenn die Eigenschaft "Von Layer" ist, kann der entsprechende GC beim Element auch schon mal fehlen und muss dann an die Objektdaten drangehangen werden.

Gruß
Thomas

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