Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  StartUndoMark EndUndoMark?

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:  StartUndoMark EndUndoMark? (548 mal gelesen)
kadirozen
Mitglied
Technischer Zeichner


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

Beiträge: 22
Registriert: 13.07.2023

AutoCAD LT 2024

erstellt am: 08. Aug. 2023 10:05    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 zusammen. 

Wenn ich nur ein paar Zeilen Code mit ein paar lokalen Variablen und start-endundo-Marke ist es wie erwartet funktioniert.

Nach dem Ausführen des zweiten Codes funktioniert es wie erwartet, aber wenn ich mit ctrl+z rückgängig machen will, werden alle Befehle von LISP nacheinander ausgeführt. Ich würde es gerne so haben, dass, wenn ich ctrl+z drücke, es einfach alle Aktionen zurücknimmt (außer dem Speichern, ich muss vor allem die Aktionen mirror align und osnap auf den Standard zurücksetzen). Ich habe versucht, *error* nil zu entfernen und es durch vla-endundomark doc zu ersetzen, aber ohne Erfolg.

Code:
(defun c:MDXF ( / *error* global:ans
              ans
              mlist
              allelayers
              layerName
              dxf_name
              folder_MDXF
              msg
              OSM
              ss
              sscenter
              ssctop
              centerpt
              pt1
              pt2
              c
              dist
              doc
              text-entity
              text-content
              num-entities
              num-text
              i
              entity
              entity-type
              totalsp
              current_name
              name-list)
              (vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) 
(vla-startundomark doc) 
(defun *error* ( msg )
  (setvar "filedia" 1)
        (if OSM (setvar 'osmode OSM));OSnap mode other than nil, change it back to OSM
        (if (not (member msg '("Function cancelled" "quit / exit abort" "*QUIT*,*CANCEL*")))
            (princ (strcat "\nError: " msg))
        )
  (princ)
  (vla-endundomark doc)
  (exit)
)
(setq name-list '())
(if (null global:ans)
(setq global:ans "Ja"))
(setq totalsp 0)
(setq folder_MDXF "C:\\Users\\kadir.oezen\\Desktop\\AutoLISP\\MaschineDXF\\") ; Set the R12 format destination folder path
(setq mlist '("CNC"
"SEQ"
"CUT"
"DRILL"
"POLISH"
"WJ"
"Ausschnitt"
"Bemassung Maschine"
"Nachschneiden"
"Granit"
))  ; set CNC Maschine Readable Layer names and keywords,
(setq OSM (getvar 'osmode));OSM mode saved
 
    (if (vl-file-directory-p folder_MDXF);if folder presents go on
        (progn
          (vlax-for allelayers (vla-get-layers doc)
            (vla-put-layeron allelayers :vlax-false);vlax command takes all layers and turns them off one by one
            (setq layerName (vla-get-name allelayers));set layername to the all layers
            ; Check if any of the keywords are present in the layer name
            (foreach keyword mlist
            (if (vl-string-search keyword layerName)
            (vla-put-layeron allelayers :vlax-true) ; if the name is on the list Turn on the layer there is no else command.
            )
            )
    );--vlaxfor alle layers ende
          (while (= global:ans "Ja")
            (setq ss (ssget));ask user to make selection
            (if ss ;if ss is valid go with this
              (progn
                (setq num-entities (sslength ss))
                (setq i 0)
                (setq num-text 0)
                (while (< i num-entities)
                  (setq entity (ssname ss i))
                  (setq entity-type (cdr (assoc 0 (entget entity))))
                    (cond ((= entity-type "TEXT") (setq num-text (+ num-text 1)) (setq text-entity entity))
                    )
                  (setq i (+ i 1))
                );--while end
                (if (= num-text 0)
                  (progn
                  (alert "Es gibt kein Text Elemente in Auswähl. Programm gestoppt.")
                  (*error* "Kein Text")
                  );if numtext 0 else
                    (progn
                      (if (= num-text 1)
                        (progn 
                        (setq text-content (cdr (assoc 1 (entget text-entity))))
                        ;(alert (strcat "Text content: " text-content))
                        (setq dxf_name (strcat (substr text-content 1 5) (substr text-content 7 3) (substr text-content 11 3)));dxf_name from textcontent extract 45000001A01 zB.
                        ;(alert (strcat "DXF NAME für Maschine; " dxf_name))     
                        );if num text else
                          (progn
                          (alert "Es gibt mehr als 1 Text Elemente in Auswähl. Programm gestoppt.")
                          (*error* "mehr als 1 Text")
                          )
                      );--if num text 1 end
                    )     
                );--if numtext 0 ende
              );--if ss not validelse
              (progn
                (alert " Kein Objekt ist ausgewählt.")
                (*error* "kein Objekt")
              )
            ); --if ss ended
              (if (or (not(findfile (strcat folder_MDXF dxf_name ".dxf"))) (vl-file-delete (strcat folder_MDXF dxf_name ".dxf"))); if no old file found or it is deleted go on
                (progn
                 
                    (setq pt1 (getpoint "n/ Links"))
                    (setq pt2 (getpoint "n/ Rechts"))
                    (setq dist (distance pt1 pt2))
                    (setq c (getvar "viewctr"))
                    (setq sscenter (polar c 0 (/ dist 2)))
                    (setq ssctop (polar sscenter (/ pi 2) 100))
                    (setq centerpt (polar c 0 dist))
                    (setvar 'osmode 0)
                    (command-s "_.align" ss "" pt1 c pt2 centerpt "" "n")
                    (command-s "_.mirror" ss "" sscenter ssctop "_y")
                    (setvar 'osmode OSM)
                    (command "SICHALS" "d" "v" "2000" "o" ss "" "16" (strcat folder_MDXF dxf_name ".dxf"))
                    (setq current_name dxf_name)
                    (setq name-list (cons current_name name-list))
                    (setq totalsp (+ totalsp 1));total dxf count
                    (initget "Ja Nein")
                      (if (setq ans (cond ((getkword (strcat "\nHaben Sie mehr Daten zu speichern? [Ja/Nein] <" global:ans ">"))) (global:ans)));cond testes if first getkword has value, if not goes to second option which is global ans
                        (progn
                        (setq global:ans ans)
                        )
                          (progn
                          )
                      )
                  ;--while globalans end
                 
                )
                (progn ;if else not findfile or delete
                  (alert "Programm gestoppt, Datei kann nicht überschrieben werden. Schließen Sie die geöffneten Dateien und versuchen Sie es erneut")
                  (*error* "Data kann man nicht überschreiben.")
                )
              );--end if or not findfile file delete
           
        );if and folder else
    );--while global ans ja end
        (progn
        (alert "Sie haben keinen Zugriff auf den Server. Stellen Sie sicher, dass Sie die Dateien auf T: lesen können.")
        (*error* "kein zugriff laufwerk T:")
        )
    );-- if end both folders
  (if (= totalsp 1)
    (progn   
    (alert (strcat (apply 'strcat (append (list (car name-list))(mapcar '(lambda (x) (strcat "\n" x)) (cdr name-list)))) " Die Datei ist im MaschineDXF Ordner gespeichert. AutoCAD Zeichnung wird jetzt ohne Speichern geschlossen."))
    )
    (progn
      (alert (strcat (apply 'strcat (append (list (car name-list))(mapcar '(lambda (x) (strcat "\n" x)) (cdr name-list)))) "\nDateien sind im MaschineDXF Ordner gespeichert. AutoCAD Zeichnung wird jetzt ohne Speichern geschlossen."))
    )
  )
  ;(command "._close" "_y")
  (*error* nil)
);--defun end

 

Mit freundlichen Grüßen Kadir

------------------
kadir

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

archtools
Mitglied



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

Beiträge: 864
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 08. Aug. 2023 11:11    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 kadirozen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von kadirozen:
Hallo zusammen. 

Wenn ich nur ein paar Zeilen Code mit ein paar lokalen Variablen und start-endundo-Marke ist es wie erwartet funktioniert.


Tu den Leuten, die Dir eventuell helfen können und wollen, den Gefallen, und bastle ein kleines Beispielprogramm, um das Fehlerverhalten zu veranschaulichen, anstatt so viel Code zu posten, der offenkundig nichts mit dem Problem zu tun hat. Ich jedenfalls gucke mir sowas gar nicht erst an.

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

kadirozen
Mitglied
Technischer Zeichner


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

Beiträge: 22
Registriert: 13.07.2023

AutoCAD LT 2024

erstellt am: 08. Aug. 2023 11:19    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

Zitat:
Original erstellt von archtools:

Tu den Leuten, die Dir eventuell helfen können und wollen, den Gefallen, und bastle ein kleines Beispielprogramm, um das Fehlerverhalten zu veranschaulichen, anstatt so viel Code zu posten, der offenkundig nichts mit dem Problem zu tun hat. Ich jedenfalls gucke mir sowas gar nicht erst an.


Ich danke Ihnen für den Vorschlag.

Ich habe dies als Beispiel geschrieben. Wenn ich es ausführe, entstehen 4 Punkte in der Mitte des Bildschirms. Wenn ich Strg Z drücke, werden alle 4 Punkte gleichzeitig entfernt und nicht einer nach dem anderen.

Code:
(defun c:zBeispiel ( / *error* c pt1 pt2 pt3 msg)
(vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) 
(vla-startundomark doc) 
(defun *error* ( msg )
  (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*"))
  (princ (strcat "\nError: " msg))
  )
(princ)
(vla-endundomark doc)
)

(setq c (getvar "viewctr"))
(setq pt1 (polar c 0 100))
(setq pt2 (polar c (/ pi 2) 100))
(setq pt3 (polar c pi 100))
(command "_.point" c)
(command "_.point" pt1)
(command "_.point" pt2)
(command "_.point" pt3)
(vla-endundomark doc)
(princ)
)


------------------
kadir

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

archtools
Mitglied



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

Beiträge: 864
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 08. Aug. 2023 12: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 Nur für kadirozen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von kadirozen:

Ich danke Ihnen für den Vorschlag.

Ich habe dies als Beispiel geschrieben. Wenn ich es ausführe, entstehen 4 Punkte in der Mitte des Bildschirms. Wenn ich Strg Z drücke, werden alle 4 Punkte gleichzeitig entfernt und nicht einer nach dem anderen.

Code:
(defun c:zBeispiel ( / *error* c pt1 pt2 pt3 msg)
(vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) 
(vla-startundomark doc) 
(defun *error* ( msg )
  (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*"))
  (princ (strcat "\nError: " msg))
  )
(princ)
(vla-endundomark doc)
)

(setq c (getvar "viewctr"))
(setq pt1 (polar c 0 100))
(setq pt2 (polar c (/ pi 2) 100))
(setq pt3 (polar c pi 100))
(command "_.point" c)
(command "_.point" pt1)
(command "_.point" pt2)
(command "_.point" pt3)
(vla-endundomark doc)
(princ)
)



Das ist auch logisch so, denn man kann keine verschiedenen UNDO-Ebenen ineinander verschachteln. Mit dem letzten vla-endundomark wird eine Marke für einen Block von Operationen gesetzt, der bis zum letzten vla-startundomark zurück reicht. Alles, was in der Zeichnungsdatenbank dazwischen verändert wird, wird dann als kompletter Block mit einem einzigen (command "_U") zurück gesetzt.

Nur wenn Du in Deinem Code auf vla-startundomark und vla-endundomark verzichtest, dann werden die einzelnen COMMAND-Aufrufe jeweis einzeln durch ein (command "_U") oder ähnlich zurück gesetzt.

https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-7C669949-1327-4CFD-96CF-CE65EC38DAA8
https://www.afralisp.net/archive/methods/lista/startundomark_method.htm


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

Andreas Kraus
Mitglied
Elektrotechniker


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

Beiträge: 1412
Registriert: 11.01.2006

WIN 10
ACAD 2022

erstellt am: 08. Aug. 2023 15:49    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 kadirozen 10 Unities + Antwort hilfreich

Hab deinen Code mal kurz durchsucht.
vla-startundomark hast du am Anfang drin aber vla-endundomark hast du nur im Errorhandler.
Wenn kein Fehler auftaucht wird also vla-endundomark nicht ausgeführt.
Du musst das auch noch ans Programmende setzen.

------------------
Geht nicht, gibts nicht

Gruß
Andreas

http://kraus-cad.de

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

kadirozen
Mitglied
Technischer Zeichner


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

Beiträge: 22
Registriert: 13.07.2023

AutoCAD LT 2024

erstellt am: 08. Aug. 2023 15: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

Ich danke Ihnen für die Antworten. Wie ich in meinem ersten Beitrag sagte, habe ich versucht, endundomark in die letzte Zeile des Codes vor dem Ende hinzuzufügen. Es macht immer noch alles schrittweise rückgängig und nicht alles zusammen. Aber wie ich in der Befehlszeile sehe, hat es tatsächlich versucht, autolisp als gruppe rückgängig zu machen. Ich bin mir aber nicht sicher, warum es nicht funktioniert.

Code:
Haben Sie mehr Daten zu speichern? [Ja/Nein] <Ja>N
Befehl: _u (LISP-Ausdruck) GRUPPE
Befehl: _u (LISP-Ausdruck) GRUPPE
Befehl: _u GRUPPE
Befehl: _u
Befehl: _u GRUPPE


Vielleicht mache ich einen Denkfehler, aber sollte es nicht durch die letzte Zeile mit (*error* nil) aktiviert werden, sollte es doch den Errorhandler ausführen und endundomark setzen, oder?

------------------
kadir

[Diese Nachricht wurde von kadirozen am 08. Aug. 2023 editiert.]

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

archtools
Mitglied



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

Beiträge: 864
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 08. Aug. 2023 16:59    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 kadirozen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von kadirozen:
Ich danke Ihnen für die Antworten. Wie ich in meinem ersten Beitrag sagte, habe ich versucht, endundomark in die letzte Zeile des Codes vor dem Ende hinzuzufügen. Es macht immer noch alles schrittweise rückgängig und nicht alles zusammen.

Dann fehlt vermutlich das startundomark.

In dem kleinen Beispiel funktioniert's ja. Jetzt musst Du nur noch nachgucken, was im umfangreichen Code anders ist.

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: 21748
Registriert: 03.06.2002

Alles

erstellt am: 08. Aug. 2023 19:37    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 kadirozen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von kadirozen:
Vielleicht mache ich einen Denkfehler,
Nein

aber sollte es nicht durch die letzte Zeile mit (*error* nil) aktiviert werden,
Ja

sollte es doch den Errorhandler ausführen und endundomark setzen, oder?
So wie von dir angedacht, funktioniert es. So wie von dir geschrieben, nicht.



Und so helfe ich dir auf die Sprünge:


[IMG]Teste deinen Errorhandler doch mal! Der ist nämlich nicht identisch zu deinem kleinen Beispiel.[/IMG]
(BTW: Wir wollten ein kleines Beispiel wo es NICHT funktioniert, damit man sich eben nicht durch so viel irrelevanten Code klicken muss)


Mach mal:

Nimm deinen Errorhandle und geh in eine saubere Umgebung = neue Datei
und sorge dafür das DOC vorhanden ist, ich packe es jetzt einfach mal mit in deinen Code rein:

Einfach copy&paste in die Befehlszeile, fetig.

(defun *error* ( msg )

  ;; NUR FÜR DEN TEST ;;
  (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  ;;                  ;;
 
  (setvar "filedia" 1)
        (if OSM (setvar 'osmode OSM))
        (if (not (member msg '("Function cancelled" "quit / exit abort" "*QUIT*,*CANCEL*")))
            (princ (strcat "\nError: " msg))
        )
  (princ)
  (vla-endundomark doc)
  (exit)
)


Jetzt teste diesen mit folgender Eingabe, die soll einen echten Abbruch darstellen:
Befehl: (*error* "oho")

oder warum darstellen, sorgen wir einfach für ein echtes Problem:

Befehl: (*error* (/ 1 0))


und jetzt versuche mal folgenden Aufruf:
Befehl: (*error* (command))

wobei ein (command) ja immer nur nichts, also nil zurückgibt..
also dasselbe wie auch diese Zeile:
Befehl: (*error* nil)

Du siehst was das Programm dir als Rückgabe zeigt? [F2]

Und jetzt musst du mit Blick auf deinen Code das Problem erblicken      

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

kadirozen
Mitglied
Technischer Zeichner


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

Beiträge: 22
Registriert: 13.07.2023

AutoCAD LT 2024

erstellt am: 09. Aug. 2023 08: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 bin mir nicht ganz sicher, ob ich Sie richtig verstanden habe.
Sie haben Recht mit der Darstellung des Codes. Ich werde mein Bestes geben, wenn ich das nächste Mal auf ein Problem stoße.

Wie Sie sagten, habe ich den Code wie folgt versucht.

Ich glaube, es funktioniert wie erwartet.

Ich habe den Fehlerhandler geändert und das Rückgängigmachen ist immer noch vorhanden. Ich habe in diesem Thema gesucht und herausgefunden, dass verschachtelte UndoMarks problematisch sind, d.h. ich brauche eine einzelne Undo-Marke, die beginnt und endet, um es einfach zu machen.

Nach den lokalen Variablen kommt also das Dokument-Setup und die Startundo-Marke. Dann kommt der Error-Handler mit der Endundomarke und mein Code mit allen möglichen Ergebnissen, der zum Error-Handler führt, der die Endundomarke aktiviert.


Sollte in der Theorie funktionieren, tut es aber nicht, ich mache irgendwo anders einen Fehler.

Code:
*ERROR*
Befehl: (*error* "oho")
Error: oho
Error: quit / beenden abbrechenquit / beenden abbrechen
Befehl: (*error* (/ 1 0))
Error: Division durch 0quit / beenden abbrechen
Befehl: (*error* (command))
*Abbruch*
Befehl:
Error: Fehlerhafter Argumenttyp: stringp nilquit / beenden abbrechen
Befehl: (*error* nil)
Error: Fehlerhafter Argumenttyp: stringp nilquit / beenden abbrechen

------------------
kadir

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

archtools
Mitglied



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

Beiträge: 864
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 09. Aug. 2023 09:55    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 kadirozen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von kadirozen:

Nach den lokalen Variablen kommt also das Dokument-Setup und die Startundo-Marke. Dann kommt der Error-Handler mit der Endundomarke und mein Code mit allen möglichen Ergebnissen, der zum Error-Handler führt, der die Endundomarke aktiviert.

Für die Fehlersuche würde ich die komplette *error* Definition rauswerfen. Der Fehler tritt ja auf, ohne dass der Code auf einen Fehler stößt. Baue ein einfaches funktionierendes Beispiel auf, und erweitere das dann Schritt für Schritt um die von Dir gewünschte Funktionalität.

Im Übrigen würde ich grundsätzlich nur mit (defun C:xxx ...) definierte "Befehle" mit einem Errorhandler versehen, der ein Endundomark setzt, weil man sonst bei jedem Aufruf einer Lisp-Funktion in Teufels Küche kommt.

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: 21748
Registriert: 03.06.2002

Alles

erstellt am: 09. Aug. 2023 19: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 kadirozen 10 Unities + Antwort hilfreich


align_endundomark.JPG

 
Zitat:
Original erstellt von kadirozen:
Ich glaube, es funktioniert wie erwartet.
Nein (aber*) - Dann hebe ich das Offensichtliche noch einmal hervor:

Code:
*ERROR*
Befehl: (*error* "oho")
Error: oho
Error: quit / beenden abbrechenquit / beenden abbrechen
Befehl: (*error* (/ 1 0))
Error: Division durch 0quit / beenden abbrechen
Befehl: (*error* (command))
*Abbruch*
Befehl:
Error: Fehlerhafter Argumenttyp: stringp nilquit / beenden abbrechen
Befehl: (*error* nil)
Error: Fehlerhafter Argumenttyp: stringp nilquit / beenden abbrechen


Das FETT hervorgehobene sind FEHLERmeldungen!
Es läuft also nicht rund.
"stringp" ist die interne Prädikatfunktion welche prüft ob etwas ein STRING ist oder nicht,
in deinem Fall geht es um den übergebenen Wert von MSG an STRCAT, welches ausschließlich Strings erwartet (in der Error-Routine).
Das ist bei (*error* nil) eben nicht der Fall und du prüfst das in der Errorfunktion auch nicht,
sondern lässt immer ein (princ (strcat "\nError: " msg)) ausführen, was zu einem Crash führt.

Bei einem Crash startet Acad dann ... die Errorfunktion (also praktisch erneut und bevor diese komplett ausgeführt wurde, da es eben zu einem Crash kam)
und dieses Mal ist ein string an msg gebunden welcher dann endlich zum kompletten ausführen der *error*  Funktion führt.

Du solltest dir mal ein paar ALERTs einbauen welche das Schauspiel offenlegt.
Zum Beispiel so:

(defun c:MDXF (/ usw.....)
(vl-load-com)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-startundomark doc)
 
(setq MESSa 0 MESSb 0)

(defun *error* ( msg )
  (setq MESSa (+ MESSa 100) MESSb (+ MESSb 100))
 
  (alert (strcat "error-START - " (itoa(setq MESSa (1+ MESSa)))))
 
        (if (and
              (not (member msg '("Function cancelled" "quit / exit abort" "*QUIT*,*CANCEL*")))
            )
            (alert (strcat "\nError CUSTOM message: " msg))
        )
 
  (princ)
  (alert (strcat "error-END (set endundomark) " (itoa(setq MESSb (1+ MESSb)))))
  (vla-endundomark doc)
  (exit)
)

..und der Rest vom Code

So SIEHST du maletwas mehr von dem Ablauf.

; - - -

Jetzt habe ich mir die Geschichte mal näher angesehen für dich:
*Der Fehler um den es dir geht hat mit meinem angesprochenen Problem nichts zutun!

Es wäre dennoch schön (und für dich / deine Programme ja auch sinnvoll), wenn du dir das von mir angesprochene Problem
einmal unter die Lupe nimmst und den Code entsprechend anpasst.

Dein Problem ist der AutoCAD-Befehl AUSRICHTEN, welchen du über (Command steuerst,
dieser Befehl setzt ein endundomark und somit hast du am Ende von MDXF keine Gruppe mehr,
welche man in einem Schritt zurückgehen kann.

Als Schnelltest füge mal drei Zeilen bei dir ein: <siehe Bildanhang>
führe MDXF aus und danach nutzt du Undo/Zurück.
Du wirst sehen: An deinem Problem hat sich nichts geändert bis zu
bei den drei Linien angekommen bist, die verschwinden dann in einem Schritt,
eben weil dort eine endundomarke gesetzt wurde, durch den Befehl Ausrichten.

Hier ein Beispiel Thread zum Thema, welche ich gefunden habe nachdem ich den Übertäter Dingfest gemacht hatte:
https://ww3.cad.de/foren/ubb/Forum145/HTML/001769.shtml

     

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: 21748
Registriert: 03.06.2002

Alles

erstellt am: 11. Aug. 2023 09:13    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 kadirozen 10 Unities + Antwort hilfreich

Um Rückmeldung wird gebeten 

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

kadirozen
Mitglied
Technischer Zeichner


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

Beiträge: 22
Registriert: 13.07.2023

AutoCAD LT 2024

erstellt am: 11. Aug. 2023 11: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

Danke für die wunderbare Erklärung. Das ist genau das gleiche Ausrichten Problem, das ich habe, wie die andere Person auf anderes Thema hat.

Ich nehme auch einen Blick auf seine Lösung, UCS verschieben und drehen und beschlossen, das nicht zu implementieren.

Wir schließen die Daten, ohne sie am Ende dieser Routine zu speichern. Ich werde unsere Mitarbeiter informieren, dass sie, wenn sie während dieses Prozesses UNDO machen müssen, stattdessen den Befehl Schließen des Dokuments ohne Speichern und erneutes Öffnen beenden sollten.

Meine derzeitige Aufgabe besteht darin, die Attribute in den Blöcken zu prüfen und sie nach Möglichkeit zu automatisieren.

Vielen Lieben Dank

------------------
kadir

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: 21748
Registriert: 03.06.2002

Alles

erstellt am: 11. Aug. 2023 11:29    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 kadirozen 10 Unities + Antwort hilfreich

>>"Danke für die wunderbare Erklärung"
Also korrigierst du die *error* Routine noch? Schön wenn ich helfen konnte.

>>"Das ist genau das gleiche Ausrichten Problem, das ich habe, wie die andere Person auf anderes Thema hat."
Der Befehl ist bei uns allen gleich  

>>" Ich werde unsere Mitarbeiter informieren, dass sie, wenn sie während dieses Prozesses UNDO machen müssen,"
>>" stattdessen den Befehl Schließen des Dokuments ohne Speichern und erneutes Öffnen beenden sollten."

Warum nicht einfach Undo - back / Zurück rück , wahlweise als Befehl, oder auch über das DropDown im Schnellwerkzeugkasten.
Nein, Schließen&Öffnen ist schon okay, denn es ist relativ Deppensicher

>>"Meine derzeitige Aufgabe besteht darin, die Attribute in den Blöcken zu prüfen"
Was (wie) "prüft" man da? Ach egal, wenn es Fragen gibt, dann machst du einfach ein neues Thema auf

 

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

kadirozen
Mitglied
Technischer Zeichner


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

Beiträge: 22
Registriert: 13.07.2023

AutoCAD LT 2024

erstellt am: 11. Aug. 2023 11: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

UNDO Befehl könnte man sicher noch hinzufügen.

Ich weiß, Schließen&Öffnen scheint etwas unnötig, aber es ist genau so, wie Sie schreiben.

Aufgrund der Art dieser letzten Schritte (Spiegeln und Ausrichten) wird es für die Arbeitnehmer schwieriger sein, die Teile zu erkennen, die richtig ausgerichtet und gespiegelt sind. Wenn sie sich nicht sicher sind, wäre es einfacher, von Anfang anzufangen, anstatt zurückzugehen.

Und eines der ärgerlichen Ergebnisse ist, dass die OSnap-Einstellung auch mit dem UNDO-Befehl rückgängig gemacht wird.

Ansonsten höre ich schon die Telefonanrufe bezüglich dieses letzten Schrittes (ich kann den Endpunkt nicht wählen, irgendetwas stimmt mit AutoCAD nicht usw.), wenn ich es Schritt für Schritt zurückgehen lasse. Keiner merkt, dass sein OSnap zurückgesetzt wurde, weil das sowieso niemand deaktiviert. 

------------------
kadir

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