| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für PTC CREO |
| |
 | Optimieren Sie Ihr Rechenzentrumsn, eine Pressemitteilung
|
Autor
|
Thema: Programmabstürze im DURCH Lispprogramm (1468 / mal gelesen)
|
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 26. Jan. 2017 15:29 <-- editieren / zitieren --> Unities abgeben:         
Hallo, habe mal wieder eine Frage an die erfahrenen Lisp-Schreiber. Ich habe jetzt ein doch etwas umfassenderes Lisp-Programm wo zum Ende viele dotimes und when Schleifen drin sind. Jetzt stelle ich fest, wenn ich das Lisp-Programm ein paar mal ausführe stürzt mir das Creo-elemtens ab, also reagiert nicht mehr. Das kann ich etwas verzögern wenn ich das 3D Modell neu lade. Kann es irgendwie sein das es da einen internen Puffer oder speicher für das Lisp gibt und der irgendwie voll ist oder wie kann man sowas verhindern oder weiß jemand woran das liegen kann. Das Programm stürzt nicht ständig ab, die ersten 1-2 mal läuft es so durch, dann bleibt das CAD hängen. Für Hilfe wäre ich dankbar. ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
 
 Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 27. Jan. 2017 09:27 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Hallo Peter, ich sehe mich nicht als erfahrener Lisp-Schreiber, jedoch wollte ich trotzdem aus meinen (begrenzten) Erfahrung in diesem Bereich berichten. Im Regelfall hat sich der SolidDesigner als äußerst robuste Anwendung erwiesen. Auch bei hoher Speicherauslastung läuft die Anwendung sehr Stabil. So habe ich es vor kurzem fertig gebracht, die Speicherauslastung auf über 20 GB zu prügeln und das ohne 3D-Modelle (besser nicht nachfragen ). Wenn man in Erfahrung bringen möchte wie das Speichermanagment funktioniert kann sich hier ein wenig einlesen: http://tinyurl.com/h4krt4z (Design and lmplementation of Kyoto Common Lisp) Kapitel 4 Memory Managment. Abstürze, nicht mehr reagierende Anwendung & Co. sind bei mir auch mehr oder weniger an der Tagesordnung. Jedoch liegt es bei mir in 99.99...% aller Fälle an mir selbst, oder besser gesagt an meinem Code und nicht der Anwendung. Soweit meine Erfahrung. Daher ist das auch nicht als eine Aussage/Wertung deines Programms zu verstehen. Aber vielleicht magst du ja doch kurz verraten, was du vor hast und wie du das bewerkstelligst. Gruß, Alex ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 27. Jan. 2017 10:12 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alex, danke das du dich dazu überhaupt meldest. Irgendwie liegt es ja schon am Programm, wenn ich die Zeilen auskommentiere läuft es ja stabil Nur ist es auch so das es 1 oder 2 mal sauber durchläuft, und dann abschmiert, so nach dem Motto dann ist da was voll oder was weiß ich. Hier die Zeilen die es Probleme machen, vielleicht erkennt da ja jemand einen Fehler. Code:
(setq Richtiger_Schnittkreis ()) (setq Verkleinern_Schablonenlaenge 0) (setq ENDEN 5) (setq DURCHLAUF T) (setq LAUFEN 0) (setq RENNEN 0) (setq laenge_Schablo UR_laenge_Schablo) (dotimes (LAUFEN 10) (setq DURCHLAUF T) (sd-call-cmds(current_wp Aktive_AE)) (sd-call-cmds(c_circle :cen_rad NULL_PUNKT_2D laenge_Schablo )) ; schlägt den ersten Kreis für Schnittpunkte (setq ALTER_NULLPUNKT_3D (sd-vec-xform NULL_PUNKT_2D :source-space (sd-inq-curr-wp) :Dest-space :global)) (setq Schnitt_Kreise (ALLE_HILFSGEO_KREISE)) ; holt sich alle Hilfskreise (dolist (ITEM Schnitt_Kreise) ; ermittelt (setq Hilfs_Laenge (sd-call-cmds (measure_dist :edge_length ITEM))) (IF (< (abs (- Hilfs_Laenge (* laenge_Schablo PI 2))) *Umfang_Abweichung* ) (setq Richtiger_Schnittkreis (cons ITEM Richtiger_Schnittkreis)) ) );ENDE DOLIST (setq Anzahl_AEUSSERER_Schnittpunkte (length (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :local))) (WHEN (= Anzahl_AEUSSERER_Schnittpunkte 0) (delete_2d (first Richtiger_Schnittkreis)) ) (WHEN (> Anzahl_AEUSSERER_Schnittpunkte 0) (setq AEUSSERER_Schnittpunkt_2D (sd-gpnt3d-to-2d(first (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :local)))) (setq AEUSSERER_Schnittpunkt_3D (first (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :global))) ) (WHEN (= Anzahl_AEUSSERER_Schnittpunkte 2) (setq AEUSSERER_Schnittpunkt_3D_2 (nth 1 (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :global))) (setq Abstand1 (sd-call-cmds(measure_dist :between_points Nullpunkt_3D AEUSSERER_Schnittpunkt_3D))) (setq Abstand2 (sd-call-cmds(measure_dist :between_points Nullpunkt_3D AEUSSERER_Schnittpunkt_3D_2))) (IF (> Abstand1 Abstand2) (progn (setq AEUSSERER_Schnittpunkt_2D (sd-gpnt3d-to-2d(nth 0 (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :local)))) (setq AEUSSERER_Schnittpunkt_3D (nth 0 (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :global))) (setq Anzahl_AEUSSERER_Schnittpunkte 1) ) (progn (setq AEUSSERER_Schnittpunkt_2D (sd-gpnt3d-to-2d(nth 1 (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :local)))) (setq AEUSSERER_Schnittpunkt_3D (nth 1 (sd-inq-edge-edge-int-pts (first sel_KanteE) (first Richtiger_Schnittkreis) :dest-space :global))) (setq Anzahl_AEUSSERER_Schnittpunkte 1) ) );ENDE IF );ENDE WHEN (WHEN (= Anzahl_AEUSSERER_Schnittpunkte 1) (sd-call-cmds(c_line_inf :perpendicular 0,0 AEUSSERER_Schnittpunkt_2D )) (delete_2d (first Richtiger_Schnittkreis)) (setq Lotrechte (ALLE_HILFSGEO_LINIEN)) (setq INNERER_SCHNITT_PUNKT_2D (sd-gpnt3d-to-2d(nth 0 (sd-inq-edge-edge-int-pts (first sel_KanteE2) (first Lotrechte) :dest-space :local)))) (setq Schnitt_Zwischenpunkt_2D (make-gpnt2d :x (/ (+ (gpnt2d_x AEUSSERER_Schnittpunkt_2D) (gpnt2d_x INNERER_SCHNITT_PUNKT_2D)) 2) :y (/ (+ (gpnt2d_y AEUSSERER_Schnittpunkt_2D) (gpnt2d_y INNERER_SCHNITT_PUNKT_2D) ) 2))) (setq Schnitt_Zwischenpunkt_3D (sd-vec-xform Schnitt_Zwischenpunkt_2D :source-space (sd-inq-curr-wp) :Dest-space :global)) (dotimes (RENNEN (length Reihenfolge_Mittelpunkte_sort_klein)) (setq Abstand_Nullpunkt_Zwischenpunkt (sd-call-cmds(measure_dist :between_points Schnitt_Zwischenpunkt_3D (first (second (nth RENNEN Reihenfolge_Mittelpunkte_sort_klein)))))) (WHEN (< Abstand_Nullpunkt_Zwischenpunkt *Abstand_Trennung_Loch*) (setq laenge_Schablo (- laenge_Schablo (- *Abstand_Trennung_Loch* Abstand_Nullpunkt_Zwischenpunkt))) (delete_2d (first Lotrechte)) (setq DURCHLAUF NIL) ) );ENDE DOTIMES (setq Abstand1 (sd-call-cmds(measure_dist :between_points Nullpunkt_3D ALTER_NULLPUNKT_3D))) (setq Abstand2 (sd-call-cmds(measure_dist :between_points Nullpunkt_3D AEUSSERER_Schnittpunkt_3D))) (WHEN (> Abstand1 Abstand2) (return (progn (display "Das ENDE ist erreicht" ) (delete_2d (first Lotrechte)) (delete_2d (first Richtiger_Schnittkreis)))) );ENDE WHEN (WHEN (equal DURCHLAUF T) (sd-call-cmds(line :two_points AEUSSERER_Schnittpunkt_2D INNERER_SCHNITT_PUNKT_2D)) (delete_2d (first Lotrechte)) (setq NULL_PUNKT_2D AEUSSERER_Schnittpunkt_2D) (setq laenge_Schablo UR_laenge_Schablo) );ENDE WHEN ); ENDE WHEN );ENDE DOTIMES (setq Richtiger_Schnittkreis ()) (setq Verkleinern_Schablonenlaenge 0) (setq ENDEN 5) (setq DURCHLAUF T)
------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lix b Mitglied Konstrukteur, CAD-Admin
 
 Beiträge: 296 Registriert: 03.10.2014 Creo Elements / Direct Modeling 20.4 Creo Elements / Direct Model Manager 20.4 <P>Notepad++ Win 11
|
erstellt am: 27. Jan. 2017 12:02 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Schonmal probiert das Fehlverhalten weiter einzugrenzen? Macht es einen Unterschied bei der Anzahl der möglichen Durchlaufen, ob ein speicherintensives Modell oder eine vereinfachte Umgebung geladen ist? Mir ist öfter schomal aufgefallen, dass Befehle auf die Komplexität der Teilestruktur ansprechen auch wenn sie nicht direkt darauf zugreifen. ------------------ Viele Grüße Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 30. Jan. 2017 06:30 <-- editieren / zitieren --> Unities abgeben:         
also an der Struktur kann es irgendwie nicht liegen, ein Teil und eine Arbeitsebene. Auch die Durchläufe sind es wohl nicht, eben ist es beim 2. Durchlauf abgeschmiert und die DOTIMES waren nicht oft. ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
 
 Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 30. Jan. 2017 17:37 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Hallo Peter, ich habe mir den Teil deines Programmes einmal angesehen... besser als mit dem Emoticon vermag ich es leider nicht ausdrücken. Vielleicht kannst du ein wenig mehr an Infos bereitstellen oder optimaler Weise ein lauffähiges Programmstück und wenn es Operationen an 3D-Modellen ausführt auch noch ein passendes Set an 3D-Daten dazu. Alternativ wäre auch eine exakte Beschreibung von dem was du eigentlich vor hast nicht schlecht. Ansonsten kann ich nur ins blaue raten: Sollten die Variablen deines Codes global definiert sein, kracht es vermutlich beim erneuten Aufruf deines Programmes bei der Variablen null_punkt_2d. Beim durchlaufen aller zehn Schleifen wird die Variablen auf den Wert von aeusserer_schnittpunkt_2d gesetzt. Sollte allerdings die Bedingung (> abstand1 abstand2) erfüllt sein wird ja vorzeitig aus der Schleife zurückgekehrt, ohne das dort ein Wert (erneut) zugeordnet wird. Aber das sind solange man nur diesen Abschnitt betrachtet Hypothese. Zum Thema Variablen noch einmal kurz ein Link: http://www.gigamonkeys.com/book/variables.html * Generell wirkt dein Code sehr "wuchtig". Aus meiner Erfahrung heraus empfiehlt es sich ein Programm in mehrere Teilsegmente (einzelne Funktionen) zu zerlegen und nicht alles in einer Funktion unterzubringen - das erhöht klar die Lesbarkeit und erleichtert die Fehlersuche ganz ungemein. * BTW: (Wurde hier zwar schon erwähnt, aber) Ein wirklich lesenswertes Buch zum Thema Lisp Programmierung. Gruß, Alex ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sinan Akyar Mitglied Maschinenbau Ingenieur, SW Entwickler

 Beiträge: 64 Registriert: 17.09.2004 Creo Elements/Direct, SolidGenius, SpaceCable, ExtrusionPower, ProgressivePower, FramesLink, SpacePipe
|
erstellt am: 07. Feb. 2017 05:43 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Hallo Peter, ich habe mir dein Programm kurz angesehen. Meiner Erfahrung nach liegt der Grund des Absturzes in einem der (DELETE_2D ..) Befehlen - wenn auf ein nicht vorhandenes Element zugegriffen wird. Probiere mal folgendes : - kommentiere alle (DELETE_2D ..) aus und sehe, ob der Absturz noch passiert oder nicht ? - wenn nicht, schalte die auskommentierten (DELETE_2D ..) Befehlen eins nach dem anderen wider ein und schau, welcher den Absturz verursacht Gruss Sinan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 07. Feb. 2017 16:49 <-- editieren / zitieren --> Unities abgeben:         
Hallo Sinan, danke das du dir das mal angeschaut hast. Dein Vorschlag sieht erst mal gar nicht so verkehrt aus. Ich habe bis auf eine
Code: delete_2d
ausgeschlossen, aber jetzt ist die Frage wie bekomme ich das ohne den Befehl hin, da das Programm dann natürlich was falsches macht. Aber es ist das delete_2d was im WHEN, dann im DOTIMES und dann nochmal im WHEN verschachtelt ist. Also wenns das ist, wäre das super. ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sinan Akyar Mitglied Maschinenbau Ingenieur, SW Entwickler

 Beiträge: 64 Registriert: 17.09.2004 Creo Elements/Direct, SolidGenius, SpaceCable, ExtrusionPower, ProgressivePower, FramesLink, SpacePipe
|
erstellt am: 07. Feb. 2017 18:25 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Hallo Peter, wenn Du Glück hast, geht es problemlos mit einer (sd-call-cmds (BEFEHL :failure ()) ) Hülle Dh (sd-call-cmds (DELETE_2D xxx :failure ())) (In einem Dialog solltest Du sowieso alle Modeling-Befehle nur in einer (sd-call-cmds ()) Hülle anwenden) Die Lösung ist zwar nicht sauber, weil Du den Grund des Absturzes nicht korrigierst, failure () fängt aber wenigstens den Absturz ab Wenn das aber nicht helfen sollte, solltest Du am Ende der ersten DOLIST Schleife einen get_selection Vergleich machen und die unnötigen Elemente finden und sie am Ende des Programmes löschen Am Anfang: (setf temp1 (sd-call-cmds (get_selection :focus_type *sd-edge-2d-seltype* :curr_wp_only :select :all_2d))) Am Ende: (setf temp2 (sd-call-cmds (get_selection :focus_type *sd-edge-2d-seltype* :curr_wp_only :select :all_2d))) und dann die beiden Listen temp1 und temp2 vergleichen und die neuen Elemente finden. Aus der Liste der neuen Elementen findest Du dann alle Elemente, die Du nicht behalten möchtest und löschst Du sie mit einem (sd-call-cmds (DELETE_2D )) BEfehl Grüße Sinan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 08. Feb. 2017 07:13 <-- editieren / zitieren --> Unities abgeben:         
Hallo Sinar, der Befehl müsste dann so heißen? Code:
(sd-call-cmds(delete_2d (first Lotrechte)) :failure () )
Wenn das so stimmt, stürzt mir das Programm zwar nicht ab, aber danach kann ich nicht weiter arbeiten und dann stürzt das Programm ab.. ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003 MS: Windows 10 64bit OSD: 20.1 M020 ModelManager: 20.1 M020 NX 1899 TC 12.3
|
erstellt am: 08. Feb. 2017 08:56 <-- editieren / zitieren --> Unities abgeben:         
Ich nochmal, also irgendwie scheint es ja doch an dem delete_2d gelegen zu haben. ich habe das jetzt zumindest aus der Schleife rausgenommen und unten eine neue WHEN Funktion aufgebaut die dann das delete_2d ausführt, und so klappt es bis jetzt wunderbar. Also Sinan, danke für den Hinweis, bei dem delete_2d scheint es zu Abstürzen zu kommen. ------------------ Gruß Peter [Diese Nachricht wurde von Greskamp am 08. Feb. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |