Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  entmod funktionier nicht

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:  entmod funktionier nicht (803 mal gelesen)
Stefan Michel
Mitglied



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

Beiträge: 40
Registriert: 01.06.2006

erstellt am: 03. Apr. 2007 11:12    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,

ich habe folgendes Problem. Ich möchte gerne via Lisp die Farbe eines Objektes ändern. Dies ist/sollte mit entmod ja eigentlich kein problem sein. Kann mir einer erklären warum nachfolgende LISP-Zeile nicht funktioniert???:

(entmod(list(assoc -1(entget(entnext)))'(62 . 4)))

Ich habe mechanical 2007 im Einsatz.

Wenn ich die komplette Objektliste (also ohne assoc -1) nehme und
dann die neue Farbe an die Liste hinten ahänge funktioniert es??? Bisher ging das aber auch so wie oben geschrieben? Wo liegt mein Fehler? Ich dachte Entmod braucht nur den Elementname (assoc -1) und dann alle geänderten oder neuen Werte und nicht die komplette "alte" elementliste?!?

vielen Dank vorab

Gruß

Stefan

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: 03. Apr. 2007 11:21    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 Stefan Michel 10 Unities + Antwort hilfreich

mach es so:
(setq FARBE 1)
(and(setq OBJ(car(Entsel)))
    (setq OBJ(entget OBJ))
    (or(and(assoc 62 OBJ)
           (setq OBJ(subst (cons 62 FARBE)(assoc 62 OBJ)OBJ))
       )
       (setq OBJ(append OBJ (list(cons 62 FARBE))))
    )
    (entmod OBJ)
)
  
   

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 03. Apr. 2007 11: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 Stefan Michel 10 Unities + Antwort hilfreich

Das gleiche in grün, CADmium war mal wieder schneller 

Code:

(defun c:farbe4 ( / obj)
(setq obj (car(entsel)))
(if (assoc 62(entget obj));;;wenn Farbe vorhanden
  ;;;dann GC 62 austauschen mit Subst
  (entmod(subst'(62 . 4)(assoc 62 (entget obj))(entget obj)))
  ;;;sonst GC 62 anhängen mit append
  (entmod(append (entget obj)'((62 . 4))))))



------------------
viele Grüße

Jörn

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

Stefan Michel
Mitglied



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

Beiträge: 40
Registriert: 01.06.2006

erstellt am: 03. Apr. 2007 11:44    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,

vielen Dank für die Antworten.

Das mit dem ersetzen war mir soweit auch klar.

Meine Frag ist aber vielmehr, warum meine LISP-Zeile nicht funktioniert obwohl sie es doch eigentlich sollte oder???

Gruß

Stefan

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: 03. Apr. 2007 11:52    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 Stefan Michel 10 Unities + Antwort hilfreich

Hast du dir mal spaßeshalber die VLIDE-HILFE zu entmod angeguckt? Da steht eigentlich alles erklärt.

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

Stefan Michel
Mitglied



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

Beiträge: 40
Registriert: 01.06.2006

erstellt am: 03. Apr. 2007 16:22    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

ich habe leider keine Ahnung was du mit VLIDE-HILFE meinst.
In meine AutoCAD-Hilfe habe ich bereits geschaut.
Bislang hatte ich R14 und da gab es eine deutsche Lisp-Hilfe,
jetzt (10 Jahre später) ist der Großteil der LISP-Hilfe
nur noch in Englisch. WAS FÜR EIN FORTSCHRITT!

Dort steht nur, das "entmod" die Datenbankeinträge entsprechend
dem Objektnamen (-1 . "Objektname) ändert.

Ich habe eine alte Lisp-Routinen (welch noch auf R14 entwickelt wurden)
bei denen ebenfalls nur der Objektname aus der Liste rausgeholt wurde und dann mit einer neuen Eigentschaft zusammen in eine Liste und dann an Entmod übergeben wurde (ohne die Komplette Objektliste mit Suspend oder Append zu bearbeiten) und alle funktionieren!

Ich verstehe überhaupt nicht, warum meine im ersten Beitrag geschriebenen Zeile nicht geht!!!!

Vielleicht kann mir ja jemand KONREKT sagen was da falsch ist. ich kann keinen Fehler entdecken! und so undurchschaubar ist die eine Zeile ja schließlich nicht.

danke vorab

Gruß

stefan

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: 03. Apr. 2007 16:30    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 Stefan Michel 10 Unities + Antwort hilfreich

VLisp-Hilfe damit könnte die Hilfe des VisualLisp-Editors gemeint sein,
wobei Hilfe/weitere Ressourcen/Entwickler-Hilfe sicher auch reicht dafür .

(entmod elist)
The entmod function updates database information for the entity name specified by the –1 group in elist.
The primary mechanism through which AutoLISP updates the database is by retrieving entities with entget,
modifying the list defining an entity, and updating the entity in the database with entmod.
The entmod function can modify both graphical and nongraphical objects.

Arguments

elist

A list of entity definition data in a format similar to that returned by the entget function.

------------------
die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk)

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

tunnelbauer
Ehrenmitglied V.I.P. h.c.
Bauingenieur



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

Beiträge: 7085
Registriert: 13.01.2004

ich hab eh keine Probleme damit...

erstellt am: 03. Apr. 2007 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 Stefan Michel 10 Unities + Antwort hilfreich

Hi,

VLIDE Hilfe bedeutet:

Gib mal in der Kommandozeile VLIDE ein - dann dort F1...

zu deiner eigentlichen Frage:

So wie ich es sehe liegt der Fehler darin, dass entmod nicht das Objekt direkt ändert (was du aber versuchst), sondern eine Argumentenliste gemäss eines Objektes benötigt und diese Liste dann an das Element übergibt - aber nicht direkt das Element schreibt...

(so wie du es aufgebaut hast würde es - meiner Meinung nach bei entmake funktionieren... - natürlich aber wieder in Listenform...)

------------------
Grüsse

Thomas

PS: Ich kann mit meinen Formulierungen/Aussagen jetzt aber auch voll daneben liegen - da darf ich dann aber gerne korregiert werden... 

[Diese Nachricht wurde von tunnelbauer am 03. Apr. 2007 editiert.]

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: 03. Apr. 2007 16:38    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 Stefan Michel 10 Unities + Antwort hilfreich

Und hier nochmal aus der R14-Hilfe in Deutsch 


13.70 entmod

Modifiziert die Definitionsdaten eines Objekts (Elements).
(entmod Elem_liste)
Die Funktion entmod verarbeitet eine Liste (Elem_liste) in dem Format, das entget zurückgibt,
und sie aktualisiert die Datenbankinformationen für das Element, dessen Name in der Gruppe -1 von enthalten ist.
Der Hauptmechanismus, mit dem AutoLISP die Daten dann wird die Definitionsliste des Elements verändert, und
anschließend wird das Element in der Datenbankvon entmod aktualisiert. Die Funktion entmod kann sowohl
grafische als auch nichtgrafische Objekte ändern

------------------
die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk)

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

Stefan Michel
Mitglied



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

Beiträge: 40
Registriert: 01.06.2006

erstellt am: 03. Apr. 2007 17:41    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

...nun, das ist ja alles schön und gut aber so wie ich die
Hilfe interpretiere heisst das für mich NICHT, dass ich
die komplette Ojbjektdatenliste an ENTMOD übergeben muss, sonder
dass eben DER ELEMENTNAME (assoc -1) + alles was neu oder geändert werden soll übergeben werden muss. Dies tut mein zuerst genannter Befehl. Das das definitv funktioniert zeigt folgendes Beispiel:

ich hab vor einigen Jahren zusammen mit einigen anderen Leuten (bin mir
nicht mehr sicher ob es in diesem Forum war) folgende LISP entwickelt
welche die Bemaßungsgenauigkeit einer Bemaßung ändert:


;;;*******************************************************************************
;;;*************************                                  *******************
;;;*************************      Bemaßungsgenauigkeit        *******************
;;;*************************                                  *******************
;;;*******************************************************************************

(defun c:bg (/ auswahl progende elementname bemdat bemdatvo bemdathi)


(if (not kommastellenwert) (setq kommastellenwert 0))

(while (= progende nil)
      (princ (strcat "\nAktuelle Genauigkeit (Anzahl Nachkommastellen): " (itoa kommastellenwert)))
      (initget "0 1 2 3 4 5 6 7 8 , ")
      (setq auswahl(entsel "\nBemaßung wählen, oder Anzahl Nachkommastellen [0/1/2/3/4/5/6/7/8/<exit>: "))

(cond ((= (type auswahl) 'str) (if (= auswahl "") (progn (setq progende 'T)(princ"\nBefehl beendet "))
                                                  (setq kommastellenwert (atoi auswahl))))                             
      ((= auswahl nil) (princ"\nKein Objekt gewählt, erneuter Versuch "))
      (T(if (= (cdr(assoc 0 (entget(car auswahl)))) "DIMENSION")
            (progn(setq elementname(assoc -1 (entget(car auswahl))))
                  (setq bemdat (cadr(assoc -3 (entget(car auswahl) '("ACAD"))))) 
                  (if (member '(1070 . 271) bemdat)
                      (progn(setq bemdathi(cddr(member '(1070 . 271) bemdat)))
                            (setq bemdatvo(reverse(cdr(member '(1070 . 271) (reverse bemdat)))))
                      );end progn
                      (progn(setq bemdathi(list(last bemdat)))
                            (setq bemdatvo(reverse(cdr(reverse bemdat))))
                      );end progn
                  );end if
                  (if (not bemdat) (progn(setq bemdathi(list '(1002 . "}")))
                                        (setq bemdatvo(list "ACAD" '(1000 . "DSTYLE") '(1002 . "{")))
                                    );end progn
                  );end if
                  (entmod(list elementname(list -3 (append bemdatvo (list '(1070 . 271)) (list(cons 1070 kommastellenwert)) bemdathi))))
            );end progn
           
            (princ "\nObjekt ist keine Bemaßung, erneuter Versuch ")
            );end if
      );end T
);end cond
(princ)
);end while
);end defun


Wenn man nun oben nach defun alle Variablen rausschmeisst (so dass diese nach beendigung des Befehls noch verfügbar sind) und den Befehl ablaufen lässt und anschließend in autocad direkt die
ENTMODE-Befehlszeile ohne ENTMOD (also quasi "(list elementname(list -3 (append bemdatvo (list '(1070 . 271)) (list(cons 1070 kommastellenwert)) bemdathi)))" reinkopiert) dann sieht man, dass hier mit ENTMOD nicht die kompletten Ojbektdaten übergeben werden sondern nur der Objektname sowie die zu ändernden Einträge. Das LISP hat mir ca. 4 Jahre in R14 gut Dienste geleistet und funkioniert jetzt in Mechanical 2007 immer noch hervorragend!

Kann das nun einer erklären? Woran liegts nun?

Gruß

Stefan

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: 03. Apr. 2007 18: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 Nur für Stefan Michel 10 Unities + Antwort hilfreich

Du änderst in deinem Beispiel XDATA , also quasi an das Objekt herangehängte Daten, aber keine das Objekt ansich beschreibende Daten wenn ich das mal so ausdrücken darf. Ohne diese Daten würde die Bemaßung in Standardeinstellungen erstellt werden, mit den Daten eben in angepasster Form. Deshalb kann man dein Beispiel wohl so nicht verallgemeinern. Siehe dein Startpost: da funktioniert das ja nun nicht,

Das entmod im Falle der Bemaßung und XDATA so funktioniert : Schön!
..., aber was da nun intern abläuft.. keine Ahnung. In ActivX gibts  z.B. für Xdatas auch extra Methoden.

Ich für meinen Fall übergebe komplette Listen, so zusammen gebastelt,dass die  Objectdaten immer zwischen den GC100 des Objektes liegen und die Xdatas am Ende ( wie halt die Rückgabe von (entget(car(nentsel))'("*")) ist.)
------------------
       - 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

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