| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Attribut als Variable, Variable als Attribut (3167 mal gelesen)
|
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 11. Sep. 2015 12:15 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte gerne die Attribute aus dem Schriftfeld (mech 2014) in Variablen speichern und später wieder die Variablen als Attribut speichern. Bsp: Attribut "GEN-TITLE-NR" als Variable "Zeichnungsnummer" setzen geänderte Variable "Zeichnungsnummer" als Attribut "GEN-TITLE-NR" im selben Schriftfeld speichern (überschreiben) Wie mache ich das? Ich habe auch schon die Suche (hier und google) benutzt, auch was gefunden, aber schlau werde ich nicht daraus... KJ. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Sep. 2015 12:36 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
|
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 11. Sep. 2015 13:53 <-- editieren / zitieren --> Unities abgeben:
Hi CADmium, ich möchte das Schriftfeld austauschen, gegen ein anderes. Ausserdem müssen einige der Einträge (Attribute) gelöscht, andere verschoben und wieder andere geändert werden. Das geht meiner Ansicht nach am einfachsten über Variablen, daher der Gedanke die Attribute als Variablen zu speichern, zu verändern und wieder als Attribut speichern. Das Schriftfeld selbst ist kein Problem, da schieb ich ne neue dwt drunter, in der das neue drin ist, nur teilweis heißen die Attribute anders. Davor also unbedingt die Attribute in Variablen packen, neu zuordnen, verändern... Schriftfeld austauschen, fertig. KJ. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Sep. 2015 14:12 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
|
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 11. Sep. 2015 14:49 <-- editieren / zitieren --> Unities abgeben:
... ick raffs net ... aber der reihe nach... AMTITLE - ja klar, so füge ich Rahmen und Schriftfeld ein, warum fragst du? Das mit dem Programm - so solls mal werden... Zugriff auf die Attribute - krieg ich nicht auf die Reihe... wie krieg ich die in eine Variable? Zu dem Link... da passiert noch so viel nebenher, ich will ja erstmal nur GEN-TITLE-NR in eine Variable packen, (nach dem Motto "setq Zeichnungsnummer (GEN-TITLE-NR)"), der rest kommt dann erst später... KJ. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 11. Sep. 2015 15:38 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
Der verlinkte Code sammelt alle Blockreferenzen ein(wahlweise auf 👆 einen Blocknamen beschränkt) und ändert einen Attributwert. Damit sieht man wie man an Attribute und deren Werte kommen kann, das ist der Teil der dir neu ist. (assoc 1 OBJEKTDATEN) Holt das dottedPair Gruppencode1 mit dem Attributwert. Wenn du also fit genug bist das ganze mit einfachen Texten zu realisieren, so sollte es dir mit dem verlinkten Code auch möglich sein es mit Attributen von Blockreferenzen umzusetzen. Der Code ist schlank, da passiert nichts nebenher, nur Attributwerte lesen und schreiben. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 14. Sep. 2015 14:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, also ich habe mich jetzt ne ganze weile mit dem code beschäftigt, aber ich bekomme ihn nicht zum laufen. Da ist irgendwas faul, aber ich krieg nicht raus was, er fragt mich nicht nach dem Block und auch wenn ich den Blocknamen vorgebe passiert nichts außer dem Regenerieren und meinem Alarm.
Code: (defun DATE_GETSTR ( / ) (setq DATUM "30.04.2015") ) (defun UPDATE-Title-Block (INSERTNAME ATTRIBNAME ATTRIBWERT / AUSWAHL INDEX OBJEKTDATEN) (if (= (type INSERTNAME) 'STR) (setq AUSWAHL (ssget "_X" (list '((0 . "INSERT"))(cons 2 INSERTNAME)))) ) (if(or AUSWAHL (setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) ) (progn (setq INDEX -1) (repeat (sslength AUSWAHL) (setq OBJEKTDATEN (entget (ssname AUSWAHL (setq INDEX (1+ INDEX))))) (if (assoc 66 OBJEKTDATEN) (while (/= (cdr (assoc 0 OBJEKTDATEN)) "SEQEND") (setq OBJEKTDATEN (entget (entnext (cdr (assoc -1 OBJEKTDATEN))))) (if (and(=(cdr (assoc 0 OBJEKTDATEN)) "ATTRIB") (=(strcase (cdr(assoc 2 OBJEKTDATEN))) ATTRIBNAME) ) (progn (setq WERT (cdr(assoc 1 OBJEKTDATEN))) (entmod(subst(cons 1 ATTRIBWERT) (assoc 1 OBJEKTDATEN) OBJEKTDATEN)) ) ;;progn ) ) ) ) ) ) )(defun c:UPDATE-Title-Block () (setq WERT "0") (UPDATE-Title-Block nil "GEN-TITLE-DAT" "30.04.2015") (command "_.regen") (alert WERT) (princ) )
mir kommt das zweite IF mit dem OR komisch vor, weil es kein "oder" gibt, da ist ja nur "AUSWAHL". kann da mal bitte jemand drüberschauen? Meine lisp-Kentnisse sind auch eher bescheiden, da ich das leider viel zu selten mache. Und da ich auch ständig Zeitdruck habe, kann ich auch gar nicht oft und schon gar nicht lange lispeln... ich probiere halt mehr als ich wirklich weiß... ...und eine bescheuerte Frage hab ich noch, was ist den ein SEQEND? Aber eins habe ich schon begriffen, an die Attribute komme ich nur über die Gruppencodes ran... KJ.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009 Win10 64bit CoCreate V19 AutoCad mechanical 2017
|
erstellt am: 14. Sep. 2015 15:00 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 14. Sep. 2015 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
Hallo, also bei mir hat es funktioniert. Sind in der Zeichnung Blöcke mit den Attriuten "GEN-TITLE-DAT" vorhanden?? Durch Einrückungen wird der Code besser lesbar:
Code:
(defun DATE_GETSTR ( / ) (setq DATUM "30.04.2015") ) (defun UPDATE-Title-Block (INSERTNAME ATTRIBNAME ATTRIBWERT / AUSWAHL INDEX OBJEKTDATEN) (if (= (type INSERTNAME) 'STR) (setq AUSWAHL (ssget "_X" (list '((0 . "INSERT"))(cons 2 INSERTNAME)))) ) (if(or AUSWAHL (setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) ) (progn (setq INDEX -1) (repeat (sslength AUSWAHL) (setq OBJEKTDATEN (entget (ssname AUSWAHL (setq INDEX (1+ INDEX))))) (if (assoc 66 OBJEKTDATEN) (while (/= (cdr (assoc 0 OBJEKTDATEN)) "SEQEND") (setq OBJEKTDATEN (entget (entnext (cdr (assoc -1 OBJEKTDATEN))))) (if (and(=(cdr (assoc 0 OBJEKTDATEN)) "ATTRIB") (=(strcase (cdr(assoc 2 OBJEKTDATEN))) ATTRIBNAME) ) (progn (setq WERT (cdr(assoc 1 OBJEKTDATEN))) (entmod(subst(cons 1 ATTRIBWERT) (assoc 1 OBJEKTDATEN) OBJEKTDATEN)) ) ;;progn ) ) ) ) ) ) )
(defun c:UPDATE-Title-Block () (setq WERT "0") (UPDATE-Title-Block nil "GEN-TITLE-DAT" "30.04.2015") (command "_.regen") (alert WERT) (princ) )
Code im Beitrag einfügen: 1. Links auf "Code" drücken =>[CODE][/CODE] 2. den Code zwischen die Tags "CODE" einfügen
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube [Diese Nachricht wurde von joern bosse am 14. Sep. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 14. Sep. 2015 15:42 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn, also das Schriftfeld hat dieses Attribut, aber soweit kommt er ja nicht mal, ich soll ja nicht mal einen Block auswählen... da kommt mir aber noch eine andere Idee... kann das sein das AutoCad das irgendwie blockiert? (Stichwort Vertrauenswürdige Speicherorte, das gabs ja bei 2013 noch nicht) Ich hab mal mein Textfenster mit angehängt, wie gesagt, bei mir fragt er nicht mal nach dem Block... ... da mach ich doch irgendwas falsch? nur was? KJ. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 14. Sep. 2015 15:54 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
Hallo KJ, Du hast den Code nicht wirklich zeilenweise eingegeben, oder?? Pack das ganze mal in eine Datei und benutze den Visual-Lisp-Editor. Dann kannst Du das ganze auch zeilenweise/befehlsweise abarbeiten lassen und suchen, wo der Fehler steckt. Oder Du stellst mal eine Zeichnung mit Deinem Block hier rein, da können dann andere mal testen. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 14. Sep. 2015 16:06 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
Gerade gesehen: Du hast 2 x eine Definition von UPDATE-Title-Block drin! Einmal mit (defun ..., und weiter unten mit (defun c:.... Damit wird wird der eigendliche Code wieder überschrieben, ändere das bei (defun c:.. zu z.B. bef_utb und starte dann mit diesen definierten Befehl Außerdem wird in Deinem "Alert" der alte Wert ausgegeben, ist das so gewollt? gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 14. Sep. 2015 16:30 <-- editieren / zitieren --> Unities abgeben:
Hallo, ja das mit dem WERT ist so gewollt, jedoch gibt er bei mir immer nur "0" aus... zu (defun UPDATE-Title-Block (INSERTNAME ATTRIBNAME ATTRIBWERT / AUSWAHL INDEX OBJEKTDATEN) hiermit wird doch erst die Funktion "UPDATE-Title-Block" mit seinen Argumenten definiert und mit (defun c:UPDATE-Title-Block () wird der Befehlsaufruf definiert... nochmal die Rückfrage an die lisp-Profis: Ist das so richtig erklärt? KJ. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 14. Sep. 2015 16:48 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
Hallo KJ, du hast recht, geht auch mit gleichem Namen (wobei ich persönlich dass nicht machen würde). Dann steckt der Fehler noch woanders bei Dir, bei mir läuft es nämlich. Anbei mal das Lisp als Datei (zum laden ins ACAD, bzw. in den Lisp-Editor). Also doch eine Datei her. Gruß Thomas ps. Prüfe noch mal Deinen Attributsnamen, oben schreibst Du was von GEN-TITLE-NR, im Lisp ist es GEN-TITLE-DAT [Diese Nachricht wurde von spider_dd am 14. Sep. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 15. Sep. 2015 07:24 <-- editieren / zitieren --> Unities abgeben: Nur für RobCraven
Hallo KJ, bei Deinem Code wird von der als Blockname eine NIL (Nothing in List) übergeben, also kommt für die Auswahl der Blöcke folgende Zeile zum tragen: (setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) Ob Dir diese Zeile eine sinnvolle Auswahl gibt kannst Du ganz einfach prüfen: 1. (setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) in die Befehlszeile einfügen und mit ENTER bestätigen. 2. Dann verwendest Du den Befehl "_PSELECT" (entweder in der Befehlszeile eingeben oder den Button aus dem Eigenschaftenfenster verwenden). 3. Bei der Objektauswahl von _PSELECT tippst Du "!auswahl" in die Befehlszeile und bestätigst mit ENTER, dann sind alle Blöcke in der Zeichnung ausgewählt. Sind da dann auch Blöcke mit einem Attribut "GEN-TITLE-DAT" vorhanden??? Wenn ja, dann muss Dein Code meiner Meinung nach funktionieren. Code:
Befehl: Befehl: (setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) <Selection set: 6>Befehl: _.PSELECT Objekte wählen: !auswahl <Selection set: 6> 403 gefunden Objekte wählen:
Wenn Du mit dem Visual-Lisp-Editor (VLIDE) arbeitest kannst Du Dir direkt im Programmcode Haltepunkte erzeugen und dort dann zur Laufzeit des Programms die Variablen überwachen, z.B. die Variable "auswahl". http://www.bosse-engineering.com/JB_Data/Bosse-engineering/090501_VisualLISP-Editor.pdf ------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RobCraven Mitglied Konstrukteur
Beiträge: 107 Registriert: 30.01.2009
|
erstellt am: 15. Sep. 2015 08:50 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle, es tut mir leid, aber ich bin Autodesk auf den Leim gegangen. Auf der Hilfeseite http://exchange.autodesk.com steht:
Zitat: SchriftfelddatenSchriftfeldeinträge werden als Attribute implementiert. Diese haben normalerweise die Form GEN-TITLE-SOMENAME {12.3}. Dabei ist GEN-TITLE-SOMENAME der Name des Attributs. {12.3} das Verhältnis der festgelegten Textbreite zur Texthöhe. Wenn die Texthöhe beispielsweise 5 Einheiten beträgt und die Breite des verfügbaren Raumes 100 Einheiten, beträgt der Wert in den geschweiften Klammern 20.
Bei mir ist es jedoch so, dass das Attribut GEN-TITLE-DAT{5.44} heißt und eben nicht nur GEN-TITLE-DAT... jetzt funktioniert es erstmal so wie ich es erwartet habe, danke für Eure Hilfe. KJ. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |