| |
| 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, eine Pressemitteilung
|
Autor
|
Thema: Layerschlüssel in ACAD-Mechanical (1077 mal gelesen)
|
TK_KE Mitglied
Beiträge: 67 Registriert: 15.07.2003
|
erstellt am: 16. Jul. 2003 08:33 <-- editieren / zitieren --> Unities abgeben:
Hallo! ACad-Mechanical verwendet ein eigenes Layermanagment. Dieses funktioniert über Layer- und Objektschlüssel (einfach mal "amlayer" aufrufen), die mit in der Zeichnung abgespeichert werden. Nun mein Problem : Weiß zufällig eine(r), wie man diese Schlüsseltabelle mit eines Lisproutine auslesen bzw. schreiben kann ? Viele Grüße Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 16. Jul. 2003 08:38 <-- editieren / zitieren --> Unities abgeben: Nur für TK_KE
Ich habe zwar keine Ahnung von Mecanicel, aner ich tippe mal darauf, das das genauso gemacht wird wie das anlegen von Layerständen mit dem Lman in acad (express)oder den Filtern Was sagt denn der GC -3 eines Layers? ------------------ Gruß CADwiesel bin auch im Urlaub: 29.07 - 27.08 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TK_KE Mitglied
Beiträge: 67 Registriert: 15.07.2003
|
erstellt am: 16. Jul. 2003 09:23 <-- editieren / zitieren --> Unities abgeben:
Erstmal Danke, aber das meine ich nicht. Ich vermute so eine Art Tabelleneintrag wie "LAYER" "LTYPE" usw. habe aber mit den herkömmlichen Lisproutinen nichts gefunden ( vielleicht auch falsch gesucht ???). Diese Tabelle wird dann z.B. bei Bemaßung oder Schraffur- Mittellinienbefehlen von ACAD-Mechanical genutzt. Öffnet man die Zeichnung mal mit einem Hex ( oder auch Text-) editor findet man die Einträge. ... Ich möchte aber innerhalb eines Lispprogrammes da rankommen... Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 16. Jul. 2003 09:50 <-- editieren / zitieren --> Unities abgeben: Nur für TK_KE
Es ist nur verständlich, dass alle Informationen in der Zeichnung in irgendeiner Form gespeichert werden - wo auch sonnst? Nur bringt dir das betrachten einer dwg - mit 'ne Hex-editor überhaupt nix. Du musst schließlich an die Infos per (v)lisp ran. Ich vermute immernoch sehr stark, dass die Informationen im GC -3 enthalten sind. Nimm mal einige Lisp's, die den auslesen, oder sich mit Layern beschäftigen und lass sie mal im debuggmodus laufen.
------------------ Gruß CADwiesel bin auch im Urlaub: 29.07 - 27.08 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TK_KE Mitglied
Beiträge: 67 Registriert: 15.07.2003
|
erstellt am: 16. Jul. 2003 10:31 <-- editieren / zitieren --> Unities abgeben:
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 16. Jul. 2003 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für TK_KE
Sieh dir das mal an: (defun C:RemLayerFilters (/ eprLayFilt lstTemp lstFilters enaFilter) (setq eprLayFilt (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 330 (entget (tblobjname "LAYER" "0")))))))))))) (foreach lstTemp eprLayFilt (if (= (car lstTemp) 360) (progn (princ lstTemp) (setq lstFilters (append lstFilters (list (cdr lstTemp)))) ) ) ) (if lstFilters (foreach enaFilter lstFilters (entdel enaFilter)) ) (princ) ) (defun C ELFILTERS ( / lext-dict ldict lay_entity lay_filters filter_names);das smily ist ein c:'D' (vl-load-com) (setq lext-dict (entget (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) ) ) ) (if (setq ldict (member (cons 3 "ACAD_LAYERFILTERS") lext-dict)) (cdr (assoc 360 ldict)) nil ) (if ldict (progn (setq lay_entity (cdr (assoc 360 ldict))) (setq lay_filters (entget lay_entity)) (while (assoc 3 lay_filters) (progn (setq filter_names (cdr (assoc 3 lay_filters))) (dictremove lay_entity filter_names) (setq lay_filters (entget lay_entity)) ) ) ) ) (princ) ) ;;; use (setq layerfilters(entget(jb:GetAcadLayerFilterDictionary))) (defun jb:GetAcadLayerFilterDictionary (/ lext-dict ldict) (setq lext-dict (entget (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) ) ) ) (if (setq ldict (member (cons 3 "ACAD_LAYERFILTERS") lext-dict)) (cdr (assoc 360 ldict)) nil ) ) (DEFUN C ELFIL();das smily ist ein c:'D' (progn (vl-load-com) (defun ax:GetAcadLayerFilterDictionary (/ dict) (setq dict (member (cons 3 "ACAD_LAYERFILTERS") (entget (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) ) ) ) ) (if dict (cdr (assoc 360 dict)) nil ) ) (entdel (ax:GetAcadLayerFilterDictionary)) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; und das: (defun C:list_layerstates ( / lst a b n ) (setq a (getstring "\nLayer states to list <*>:"));setq (if (equal a "") (setq a "*"));if (setq a (strcase a));setq (if (setq lst (get_layerstates));setq (progn (setq n 0);setq (repeat (length lst) (setq b (nth n lst));setq (if (wcmatch b a) (princ (strcat "\n" b)) );if (setq n (+ n 1));setq );repeat );progn then (princ "\nNo saved layer states found") );if (princ "\n") );defun list_layerstates (defun get_layerstates ( / e1 xd lst lst2 lst3 a b n j) (setq lst (tnlist "layer")) (setq b (length lst));setq (setq n 0);setq (repeat b ;;;;(length lst) (setq e1 (entget (TBLOBJNAME "layer" (nth n lst)) '("RAK")) xd (cdr (assoc -3 e1)) lst2 (cdr (assoc "RAK" xd)) ;lst2 (m_assoc 1000 lst2) );setq (setq j 0);setq (repeat (length lst2) (setq a (nth j lst2));setq (if (or (not (equal (car a) 1000)) (not (equal "{" (substr (cdr a) 1 1))) );or (setq a nil) (progn (setq a (substr (cdr a) 2)) (if (not (member a lst3)) (setq lst3 (append lst3 (list a)));setq then );if );progn else );if (setq j (+ j 1));setq );repeat (setq n (+ n 1));setq );repeat (if lst3 (setq lst3 (acad_strlsort lst3));setq then );if lst3 );defun get_layerstates (defun C:del_layerstates (/ e1 xd lst lste lstate lstatewar lst2 lst3 a a1 b n za zasta zastate ) (setq lste (tnlist "layer") lstate (get_layerstates) lstatewar lstate za (length lste) zasta (length lstate) zastate (length lstate) n 0 ) ;setq (repeat za (setq e1 (entget (TBLOBJNAME "layer" (nth n lste)) '("RAK")) xd (cdr (assoc -3 e1)) ) ;_ end of setq (if xd (progn (setq count (/ (- (length (car xd)) 1) 5)) (repeat count (setq lst (cdr (assoc "RAK" xd)) a (nth 0 lst) ;(cons 1000 (strcat "{" (car lstate))); a1 (substr (cdr a) 2) b (cons 1000 (strcat a1 "}")) ; ) ;setq (if (member a lst) (progn (setq lst2 (reverse (cdr (member a (reverse lst)))) lst3 (cdr (member b lst)) lst (append lst2 lst3) lst (append (list "RAK") lst) xd (subst lst (assoc "RAK" xd) xd) xd (append (list -3) xd) e1 (subst xd (assoc -3 e1) e1) ) ;setq (entmod e1) (setq xd (cdr (assoc -3 e1))) ) ;progn ) ;if ) ;_ end of repeat ) ;_ end of progn ) ;_ end of if (setq n (+ n 1)) ;setq ) ;repeat (if lstatewar (progn (princ "\n\nGELÖSCHTE STATI :\n") (foreach zastate lstatewar (princ (strcat zastate "\n")) ) ;_ end of foreach ) ;_ end of progn (princ "\n\nKeine Layerstati zum löschen vorhanden.\n") ) ;_ end of if (princ) ) ;_ end of defun (defun tnlist ( tbna / a lst) (if (and (equal (type tbna) 'LIST) (equal (cadr tbna) 16) );and (progn (setq tbna (car tbna));setq (while (setq a (tblnext tbna (not a))); a acts as a rewind first time (if (not (equal 16 (logand 16 (cdr (assoc 70 a))))) (setq lst (append lst (list (cdr (assoc 2 a))) );append );setq );if );while );progn then local only (progn (while (setq a (tblnext tbna (not a))); a acts as a rewind first time (setq lst (append lst (list (cdr (assoc 2 a))) );append );setq );while );progn else );if lst );defun tnlist
------------------ Gruß CADwiesel bin auch im Urlaub: 29.07 - 27.08 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TK_KE Mitglied
Beiträge: 67 Registriert: 15.07.2003
|
erstellt am: 16. Jul. 2003 16:10 <-- editieren / zitieren --> Unities abgeben:
Danke für die Mühe.... .. aber so ganz klappts doch nicht. Kann auch an der Version liegen (z.B ....................... (defun get_layerstates ( / e1 xd lst lst2 lst3 a b n j) (setq lst (tnlist "layer")) (setq b (length lst));setq (setq n 0);setq (repeat b ;;;;(length lst) (setq e1 (entget (TBLOBJNAME "layer" (nth n lst)) '("RAK")) xd (cdr (assoc -3 e1)) ====> immer nil da -3 nicht da Ich denke , vielleicht kommt man über "AcDbSymbolTableRecord" und "AcDbLayerTableRecord" ran, hab aber das mit dem Auslesen noch nicht auf die Reihe bekommen
(entget (tblobjname "layer" "AM_4") ) ... liefert ja z.B. ... ((-1 . <Objektname: 1aa12f0> ) (0 . "LAYER") (330 . <Objektname: 1aa0810> ) (5 . "113E") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "AM_4") (70 . 0) (62 . 80) (6 . "Continuous") (290 . 1) (370 . 20) (390 . <Objektname: 1aa0878> ))
Durchhangeln von (entget(namedobjdict))); ==> alle nichtgrafischen Einträge führte nicht zum Ziel...
noch einen Vorschlag??????????????????????
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 17. Jul. 2003 08:26 <-- editieren / zitieren --> Unities abgeben: Nur für TK_KE
Hallo Thomas, die Zeilen: (setq e1 (entget (TBLOBJNAME "layer" (nth n lst)) '("RAK")) xd (cdr (assoc -3 e1)) Fragen nur EED's der Applikation 'RAK' ab. Dies wird jedoch nicht die sein, die für das Mechanical-Layermanagement verantwortlich ist. Nimm mal an Stelle des RAK ein *, dann werden alle EED's ausgegeben. (setq e1 (entget (TBLOBJNAME "layer" (nth n lst)) '("*")) xd (cdr (assoc -3 e1)) Bei Fragen ...
Grüße Holger ------------------ Holger Brischke CADlon - Lisp over night! Irgendwann muß man schlafen, deshalb: +!+!+Urlaub vom 01.08.-30.08.2003+!+!+ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TK_KE Mitglied
Beiträge: 67 Registriert: 15.07.2003
|
erstellt am: 17. Jul. 2003 21:30 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger Das mit "RAK" weglassen oder "*" hatte ich schon probiert... mit dem gleichen Ergebnis: "nil" - vielleicht doch eine Versionsfrage??? ... zum ursprünglichen Problem : Layerverwaltung usw. Das scheint ein "Proxy" von MECHANICAL zu sein. Kann man "Proxys" irgentwie auslesen , oder kann das nur die geladenen Anwendung ???? Aber da die Daten ja in der Zeichnung stehen muß doch auch ranzukommen sein !!!! Ich bleibe dran. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 18. Jul. 2003 08:58 <-- editieren / zitieren --> Unities abgeben: Nur für TK_KE
|
TK_KE Mitglied
Beiträge: 67 Registriert: 15.07.2003
|
erstellt am: 18. Jul. 2003 13:37 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADwiesel: Proxys? Schonmal die Suche bemüht? oder bei mir geckuckt? killproxy!
...... aber sicher doch!!!! Ich habe mich wohl auch ein bißchen unglücklich ausgedrückt! Also : Die ganzen Layerschlüssel werden won der Anwendung amglay.arx erstellt ( Bestandteil von Mechanical )und auch in der Zeichnung mit abgespeichert. Mechanical liefert ja auch eine im Dialog integrierte Funktion zum Importieren dieser Einstellungen aus einer anderen Zeichnung..... ... Mit "AMlayer ..." kann ich mir die Tabelle auch ins Fenster ausgeben lassen.... ABER ICH MÖCHTE WISSEN über welches "ENTGET" ich da so rankomme!!! ( Oder ein blöder Gedanke : kann ich mir die im Fenster ausgegebenen Texte in eine Datei umleiten ????? ) Gruß und schönes Wochenende Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |