| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Layer aus alt mach neu (676 / mal gelesen)
|
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2023 Inventor 2023 64 bit Win 10 Intel I7 10610U 1.8 GHz Quadro P520 32 GB Ram
|
erstellt am: 24. Mrz. 2023 15:50 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen So ich möchte mal wieder die Wollmilchsau haben... Folgende Datenlage: Ich habe 100erte oder 1000ende Zeichnugnen welche die noch in alter Layerstruktur erstellt worden sind. Dafür haben wir n kleines Tool womit wir die Layer auf "neu" updaten können. Nun hab ich aber ein Phase 2 Problem, viele, viele dieser Zeichungen sind gebundene ehmals Xref Layer, und beim binden wird der Layername angepasst auf aus welcher Datei dass mal kam. "Stahl_verdeckt" heist dann "4156487-Stahl_verdeckt" Und in so ner Datei können ganz viele ehemalig Xrefs sein, was heisst ich hab 10 verschiedene Layer die "xxxxxx-Stahl_verdeckt" heissen. Da greift dann aber die Standard.dws über Laytrans nicht mehr weil ich da nur Layer "Stahl_verdeckt" zu "ST_hidden" machen kann. Ich müsste vorher alle "xxxxxx-Stahl_verdeckt" zusammenfasssen zum orginalen "Stahl_verdeckt" das könnte mit LAYZUSF funktionieren aber da ich ja die Layernamen nicht weiss sonder der präfix immer Variabel ist müsst ich suche nach "*Stahl_verdeckt" füge zusammen nach "Stahl_verdeckt" Einer ne Idee wie ich den präfix veralgemeinere? Es sind nicht soo viele Layer könnte man Prorgammen. Allenfalls geht das auch direkt über Stahl_verdeckt? So wi ich dass sehe sind die layernamen bei LAYERTRANS aber leider auch fix... Gruss PS: In Phase 3 soll natürlich ein Skript sich durch die Ordnerstruktur graben und alle auffindbaren dwg's updaten... :-)
Code: (defun C:XXXLAYERS () (arxload "LAYTRANS.ARX") (acet-laytrans "C:....-layers-old2new.dws" 7) (prompt "\nAll Layers have been transfered.") (princ)
------------------ Es ist kein Zeichen geistiger Gesundheit, gut angepasst an eine zutiefst kranke Gesellschaft zu sein. Jiddu Krishnamurti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 24. Mrz. 2023 16:07 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
Hi, >>", und beim binden wird der Layername angepasst auf aus welcher Datei dass mal kam." Wenn man die Methode Binden statts Einfügen nutzt(e), dann ist das so, ja. >>"Einer ne Idee wie ich den präfix veralgemeinere?" Warum verallgemeinern? Das Programm kannst du nicht ändern und die Funktion funktioniert nunmal nicht mit Wildcards, das ist also der Teil den DU erledigen musst. Durchlaufe die Layertabelle.. dabei prüfst du dann pro Layer ob so ein Fall vorliegt. Hier vereinfacht dargestellt für den alten Layernamen "STAHL": (wcmatch (strcase "Layername" t) (strcat "*$#*$" (strcase "STAHL" t))) >>" Es sind nicht soo viele Layer könnte man Prorgammen. " Auf diese Weise ist die Anzahl irrelevant. >>"Allenfalls geht das auch direkt über Stahl_verdeckt"? >>" So wi ich dass sehe sind die layernamen bei LAYERTRANS aber leider auch fix..." Das ist ja einfach die GUI-Version von deiner genutzten Lispfunktion, also Ja. Daher musst du prüfen ob so ein Fall vorliegt, dann kennst du ja den vollständigen Layernamen den du dann angeben kannst. Laytrans eignet sich daher nicht - der passende Befehl ist LAYMRG / LAYMISCH Gruss PS: Das betrifft ja nicht nur die Layer, das betrifft ALLE BENANNTEN Objekte in der Datei.. aber bleiben wir mal bei Layern: Du bist ja nicht der Einzige den das stört, nicht der Einzige der dies ändern will, also gibt es natürlich schon so Tools die sowas machen. Wenn du also lieber suchst statts zu programmieren (was schneller gehen sollte), dann suche danach - möglichst auf englisch, in Richtung: Strip xref layer name Laymrg wildcard oder ähnlich. Wenn du erst einmal auf 5 *stahl Layer einen erstellst hast, dann kannst du auch wieder Laytrans benutzen, wobei das Ändern des Layers in deinem Code dann auch schnell(er) geschehen wäre. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2023 Inventor 2023 64 bit Win 10 Intel I7 10610U 1.8 GHz Quadro P520 32 GB Ram
|
erstellt am: 24. Mrz. 2023 17:05 <-- editieren / zitieren --> Unities abgeben:
Hi Ich versuch ja schon erst das internet abzugrasen und tools zu finden bevor ich hier fragen stelle :-) Die Programmierkentnisse nehmen leider auch immer mehr ab, aber hab nicht mal was gefunden was ich zusammenkopiern hätte können... LAYMRG / LAYZUSF hab ich ja auch gefunden, scheint das Mittel der Wahl hab ich auch rumgetestet. Was eigentlich an dem Befehl fehlt ist eben ne *Suchfunktion, ich will nicht auswählen/klicken. Gehe hin und nimm alle Layer wo irgendwo "Stahl_verdeckt" drinnsteht und führ die zusammen in einen "Stahl_verdeckt". Wie jede Suchfunktion *Stahl_verdeckt* aber dass lässt sich so nicht eingeben Is auch nich so wildcard ich weiss alle Grundlayernamen die ich suchen will! Wie gesagt dass wären nur n paar. Hab hier noch was gefunden, der findet schonmal alle und ich kann was ranpappen, aber ich will ja alle mit dem gefundenen String zusammenführen... https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-for-changing-layer-names/td-p/862171 Naja nächste Woche ist auch noch n Tag :-) ------------------ Es ist kein Zeichen geistiger Gesundheit, gut angepasst an eine zutiefst kranke Gesellschaft zu sein. Jiddu Krishnamurti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 24. Mrz. 2023 17:41 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
[QUOTE]Original erstellt von nebuCADnezzar: >>"Ich versuch ja schon erst das internet abzugrasen und tools zu finden bevor ich hier fragen stelle"Aber spätestens jetzt nach meiner Silbertablet-Suchanfragen-Unterstützung sollte es doch funktionieren.. >>"Was eigentlich an dem Befehl fehlt ist eben ne *Suchfunktion" Daher: Deine Aufgabe und IMHO bekommst du das auch hin, den Kernpunkt habe ich je schon geschrieben, fehlt also nur noch der Walk durch die Layertabelle und die command-Anweisung für LAYMRG (while (setq a (tblnext "LAYER" (not a))) (foreach lay '("STAHL" "EIS" "ROT") (if (mein WCMATCH-Beispiel einbauen um (cdr(assoc 2 a)) mit LAY zu vergleichen) (command "_.LAYMRG" "_n" (cdr(assoc 2 a)) "" "_n" LAY "_y") ) ) ) >>"Is auch nich so wildcard ich weiss alle Grundlayernamen die ich suchen will!" aber dein "*MEINLAYER" ist und bleibt ein Wildcard-Vergleich.
>>"Hab hier noch was gefunden," Das habe ich mir nicht angesehen und kommentiere es daher auch nicht, aber sicher kannst du davon etwas gebrauchen/anpassen, schneller wirst du aber sicher glücklich mit einem Programm was sich bereits explizit mit den gebundenen Xref-Layerrnamen beschäftigt, Programme welche man mit meinen Suchbegriffen leicht findet. Strip xref layer name
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2023 Inventor 2023 64 bit Win 10 Intel I7 10610U 1.8 GHz Quadro P520 32 GB Ram
|
erstellt am: 27. Mrz. 2023 13:35 <-- editieren / zitieren --> Unities abgeben:
Hi Danke für den Hinweis, hab nochmal nach Strip xref layer name gesucht und bin fündig worden (komischer weise hab ich dass am Freitag noch nicht gefunden...) Dass Ding ist sogar noch besser, dass geht Blöcke etc auch umbenennen! Daran hat ich noch gar nicht gedacht! Du überschätz meine cooding fähigkeiten ich brauchs immer seltner, nimmt leider wirklich rapide ab... glaub nicht dass ich deine Hilfsschipsel zusammne gebacken bekomment hätte Hab dies getestet, dass funktioniert netter weise einfach, mit einer einschränkung, wenn der xref namensteil vor dem $ eine Zahl ist (alse z.B. 736.858 dann meldet der code Layer: 736.858$0$PL_CONT was not renamed. Alle anderen Layer wurden aber abgeändert und wenn/falls ich den code richtig verstanden hab kopiert er sich den strin nach dem zweiten $. Und dem string sollte es ja egal sein ob ne Zahl oder Buchstabe ist? Siehst du dass auf den ersten Blick?
https://autocadtips1.com/2011/10/13/autolisp-remove-binding-prefixes-from-xrefs/ Code: (defun c:RBP(/ ActDoc Name NewName) ; RemoveBindPrefixes ; Renames layers, blocks, dimension styles, text styles, user coordinate systems, and views ; by taking out the bind as bind prefix ; Example Drawing1$0$Layer1 -> Layer1 (vl-load-com) (defun RemoveBindPrefix (String / Pos LastPos) (if (setq Pos (vl-string-search "$" String)) (progn (setq LastPos Pos) (while (setq Pos (vl-string-search "$" String (1+ Pos))) (setq LastPos Pos) ) (substr String (+ 2 LastPos)) ) String ) )
------------------ Es ist kein Zeichen geistiger Gesundheit, gut angepasst an eine zutiefst kranke Gesellschaft zu sein. Jiddu Krishnamurti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2023 Inventor 2023 64 bit Win 10 Intel I7 10610U 1.8 GHz Quadro P520 32 GB Ram
|
erstellt am: 27. Mrz. 2023 13:41 <-- editieren / zitieren --> Unities abgeben:
|
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3067 Registriert: 26.08.2002 ACAD R11 - 2018.1.2 (Plant3D) AVIS ACAD LT 2013- 2020 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 27. Mrz. 2023 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
|
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2023 Inventor 2023 64 bit Win 10 Intel I7 10610U 1.8 GHz Quadro P520 32 GB Ram
|
erstellt am: 27. Mrz. 2023 16:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Hatte mich zu früh gefreut. Leider funktionieren beide Ansätze nicht ganz... der einte vereinigt Layer nicht wenn schon bestehend und der andere macht nen neuen Layer_2 (oder auch _3 _4 _5 _6 je nach dem wiviele male der selbe Layer in verschiedenen XREFS vorkommt). Bin noch am Suchen wie ich dass abfange... Einmal ne grosse Liste machen und alles abfangen :-)
Code: (command "LAYZUSF" "N" "LAYER_2" "" "N" "LAYER" "J") (command "LAYZUSF" "N" "LAYER_3" "" "N" "LAYER" "J") (command "LAYZUSF" "N" "LAYER_4" "" "N" "LAYER" "J")
------------------ Es ist kein Zeichen geistiger Gesundheit, gut angepasst an eine zutiefst kranke Gesellschaft zu sein. Jiddu Krishnamurti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 27. Mrz. 2023 17:21 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
Zitat: Original erstellt von nebuCADnezzar: Du überschätz meine cooding fähigkeiten
Okay, dann nehme es als Kompliment Aus dem RBP kannst du doch genau das Gewünschte basteln. 1. Lassen wir mal alles außer der Layer-Geschichte WEG, also Zeile " (vlax-for Obj (vla-get-Blocks ActDoc)" und Nachfolgendes auskommentieren 2. Es wird getestet (pro Layer) ob der Layernamen auch nach Bearbeitung durch die Funktion RemoveBindPrefix noch immer identisch ist (er wurde nicht verändert) oder nicht (dann hat die Funktion den Layernamen wohl gekürzt).
Eine gute Basis für dein vorhaben, auch wenn die Funktion RemoveBindPrefix nach meinem Geschmack etwas zu einfach zu Werke geht, auch wenn mein wcmatch-Vergleich weiterhin nur ein (zu) simples Beispiel zeigt - für den Fall es sind Sonderzeichen im Einsatz. Original: (vlax-for Obj (vla-get-Layers ActDoc) (setq Name (vla-get-Name Obj)) (if (/= (setq NewName (RemoveBindPrefix Name)) Name) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-Name (list Obj NewName)) ) ;_ end of vl-catch-all-error-p (prompt (strcat "\n Layer: " Name " was not renamed.")) ) ;_ end of if ) ;_ end of if ) ;_ end of vlax-for
Geändert: ; Nicht schön, nicht sicher, aber als Hilfestellung..
(vlax-for Obj (vla-get-Layers ActDoc) (setq Name (vla-get-Name Obj)) (if (/= (setq NewName (RemoveBindPrefix Name)) Name) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-Name (list Obj NewName)) ) ;_ end of vl-catch-all-error-p (command "_.LAYMRG" "_n" Name "" "_n" NewName "_y") ) ;_ end of if ) ;_ end of if ) ;_ end of vlax-for
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |