| |
| 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 – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Finde Fehler nicht ... (1408 mal gelesen)
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 29. Dez. 2008 08:58 <-- editieren / zitieren --> Unities abgeben:
Hallo! Habe ein Lisp "lihe" geschrieben, welches die Z-Koordinate von Linien-Anfangs- und Endpunkt auf den Wert von bestimmten Blockattributen hebt (im eingestellten Fall müssen die Blockattribute den Namen "HOEHE" oder "PHOH" haben). Vorrausgesetzt ist immer, die X- und Y-Koordinaten der Linienendpunkte decken sich mit dem Blockeinsetzpunkt. Nun wollte dich das Prog. erweitern, habe aber entdeckt, das irgendwas faul daran ist. Ich finde es aber beim besten Willen nicht heraus ... Folgendes Problem: Habe nun mal einige Debug-Zeilen eingebaut (princ "_debug1_") bzw. (princ "_debug2_"). Wenn ich nun über beiligende Test-Dwg das Prog laufen lasse, werden mir die Debug-Prints nicht angezeigt. Irgendwo bleibt das Prog scheinbar hängen, obwohl es die primäre Aufgabe (Linien heben) erfüllt Wenn ich aber aus beiliegender DWG nur die Blöcke in eine neue, leere Datei kopiere, die Linien neu zeichne, und das Prog drüberlaufen lasse, funktioniert alles - auch die Debug-Ausgabe ... Habe den Eindruck, als ob das irgendwie mit dem mehrmaligen nachladen des Lisp-Codes, oder mit dem speichern der Datei zu tun haben könnte. Habt Ihr eine Ahnung ?? Anbei der Code: Code: (setq h_attnam (list "HOEHE" "PHOH") laynam "P_3D-LINIEN" layfar 196 )(defun heben (x y z) (setq syss (ssget "X" (list '(0 . "INSERT") '(-4 . "=,=,=") (list 10 x y))) ; Auswahlsatz ermitteln z_neu z ) (if syss ; wenn ein Block gefunden, ... (progn (setq enameatt (entnext(ssname syss 0)) ; Durchlauf beginnt mit 1. Attribut treffer 0 ) (while (and (/= (cdr(assoc 0 (entget enameatt))) "SEQEND") ; wenn Attributsname nicht SEQEND ist, ... (= treffer 0) ; und treffer gleich 0 ist ) (if (member (cdr (assoc 2 (entget enameatt))) h_attnam) (setq treffer 1 z_neu (atof(cdr (assoc 1 (entget enameatt)))) ) (setq enameatt (entnext enameatt)) ) ) (if (= treffer 0) (princ (strcat "kein passendes Attribut bei Block " (cdr (assoc 2 (entget (ssname syss 0)))) " gefunden ...\n"))) ) (princ (strcat "kein Block bei Koordinate " (rtos x 2 10) " / " (rtos y 2 10) " gefunden ...\n")) ) (setq z_neu z_neu) ) (defun c:lihe ()
(entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 laynam) ; Gruppe 2: Layername (cons 70 64) ; Gruppe 70: Layereigenschaften (64 = benutzt) (cons 62 layfar) ; Gruppe 62: Layerfarbe ) ) (if (ssget "X" (list (cons 8 laynam))) (progn (setq antw "dmy") (while (and (/= antw "J") (/= antw "j") (/= antw "N") (/= antw "n") ) (setq antw (getstring (strcat "Es sind Elemente im Layer " laynam " vorhanden; trotzdem fortfahren? [Ja/Nein]: "))) ) (if (or (= antw "N") (= antw "n")) (exit)) ) ) (setq liss (ssget "X" (list (cons 0 "LINE")))) (while (> (sslength liss) 0) (setq ename (ssname liss 0)) (entmake (list (cons 0 "LINE") (cons 8 laynam) (list 10 (cadr (assoc 10 (entget ename))) (caddr (assoc 10 (entget ename))) (heben (cadr (assoc 10 (entget ename))) (caddr (assoc 10 (entget ename))) (cadddr (assoc 10 (entget ename))))) (list 11 (cadr (assoc 11 (entget ename))) (caddr (assoc 11 (entget ename))) (heben (cadr (assoc 11 (entget ename))) (caddr (assoc 11 (entget ename))) (cadddr (assoc 11 (entget ename))))) ) ) (ssdel ename liss) (princ "_debug1_") ) (princ "_debug2_") ;(setq lwplss (ssget "X" (list (cons 0 "LWPOLYLINE")))) )
Gruß, Roman [Diese Nachricht wurde von romi1 am 29. Dez. 2008 editiert.] [Diese Nachricht wurde von romi1 am 29. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 29. Dez. 2008 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Hi, bei mir läuft deine Lisp+Testdatei... Arbeite doch mit Haltepunkten und der Überwachungsfunktion!? vllt. hast du dir ne Variable verstellt... Bevor du den Layer erzeugst, könntest du testen ob er existiert. Von Exit bin ich kein Freund (muss aber jeder selbst wissen), da hast du eh schon ne if-Abfrage... mfg Heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 29. Dez. 2008 15:26 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Ich habe mit Dein Lisp nicht genau angesehen, aber mir fällt auf, daß Du alle keine lokalen Variablen delariet hast. Da kann es leicht sein, daß bei mehrmaligem Aufruf noch 'Altlasten' zurückbleiben und somit die Programmlogik durcheinander purzelt ! Tatsächliche globale Variablen solletst Du kennzeichnen (z.B. *h_attnam* ) In der Funktion 'heben' suchst Du mit ssget alle Inserts mit einem bestimmten Einfügepunkt. Wenn der Einfügepunk aber nicht EXAKT mit dem Punkt übereinstimmt kann es hier zu einem Fehler kommen. Hier könntest Du evtl. einen Fuzzy-Faktor einbauen. Mittels einer Filterliste mit 2 Punkten ist das machbar (einer etwas größer, einer etwas kleiner als der gesuchte Punkt z.B 1e-6 -> diese Punkte mit >= bzw <= und einer AND-Verknüpfung vergleichen) Die Debug Meldungen sollten aber immer angezeigt werden. Grüße Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003 If you want to help and want to respect other people's questions, then, please: Please, ALWAYS assume that I already tried to search for an answer to my question. Thx. Also, please, DON'T ask me what the "actual" goal of my question is. Please, firstly just answer it directly as stated - if you know an answer and want to give it. Only secondly, add other commments. Many, many, many thanks in advance!
|
erstellt am: 30. Dez. 2008 07:23 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Hallo Roman! Mich würde interessieren, warum du überhaupt die Debug-Zeilen eingebaut hast. Es muss ja schon vorher ein Problem gegeben haben, sonst gäbe es keinen Grund für die Debug-Zeilen. Ansonsten: Bricht das Programm bei dir mit einer Fehlermeldung ab, oder werden einfach die princ-Aufrufe (scheinbar) nicht exekutiert - aber ohne Fehlermeldung? ------------------ Gruß, Stephan www.stbartl.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 30. Dez. 2008 07:51 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen! Vorerst Danke für eure Hinweise! @Dorfy: Habe das mit der Layererzeugung mal komplett rausgenommen => Problem existiert weiterhin; mit Haltepunkten und Überw.-Funkt. kenn ich mich leider (noch) nicht aus. Ich arbeite nicht mit dem vlisp-Editor, sondern mit Crimson-Editor (= Texteditor); bezüglich exit: wie sonst soll ich Programmabbruch erzeugen? @Andi2050: glaube nicht, das es am fehlen der Def. von lokalen Variablen liegt. Könnte ja auch möglich sein, das ich alle auch global verwenden will, oder ...; hab's aber noch nicht ausprobiert; das mit dem ev. nicht ganz exakten Übereinstimmen der Koordinaten ist mir bewußt, ist aber nicht das Problem, das ich meine ... @autocart: Ich wollte das Prog. dahingehend erweitern, das ich auch LW-Polylinen heben (in 3D-Polylinien umwandeln) möchte. Wollte da fortsetzen und einen neuen Auswahlsatz erstellen (die Zeile ist im Code als vorletzte Zeile (ssget lwplss ...) enthalten, aber nun auskommentiert), und da hat er per du keinen LW-Polylinienauswahlsatz erstellen wollen, obwohl welche in der Datei vorhanden waren; so bin ich draufgekommen, das er da wohl vorher schon irgendwo hängen bleibt und habe mal die debug-Zeilen eingebaut. Das komische ist, das bei einer neuen Datei beim 1. Durchlauf alles klappt. Aber bei mehrmaligen Durchlauf, ev. nach einen Nachladung des Lisps bzw. nach dem Datei speichern fangt es dann irgendwann zum bocken an und die princ-Aktionen werden nicht mehr exekutiert. Wenn es bei einer dwg mal nicht mehr klappt, hilft es auch nichts, wenn man AutoCAD komplett beendet. Wenn ich wieder einsteitge, die Datei öffne und das Lisp probiere, werden die Debugg-Meldungen trotzdem nicht gezeigt ....; Aber die primäre Funktion (das heben der Linien) funktioniert ... Keine Ahnung wo da der Hund begraben ist ... Gruß, Roman Grüße [Diese Nachricht wurde von romi1 am 30. Dez. 2008 editiert.] [Diese Nachricht wurde von romi1 am 30. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003
|
erstellt am: 30. Dez. 2008 07:57 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 30. Dez. 2008 08:00 <-- editieren / zitieren --> Unities abgeben:
Hi! Es erfolgt ja in dem Sinne kein Programmabbruch; Die Linien werden ja alle schön brav gehoben, aber die princ-Anweisungen werden nicht ausgegeben. Es gibt keine Fehlermeldung dabei ... [Diese Nachricht wurde von romi1 am 30. Dez. 2008 editiert.] [Diese Nachricht wurde von romi1 am 30. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
autocart Mitglied Technischer Redakteur
Beiträge: 698 Registriert: 08.09.2003
|
erstellt am: 30. Dez. 2008 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Frage: Vielleicht bin ich da nicht up-to-date, aber was bewirkt eigentlich der ssget-Filter (-4 . "=,=,=")? In der Hilfe-Datei lese ich eigentlich: "The grouping operators are specified by -4 groups, like the relational operators. They are paired and must be balanced correctly in the filter list or the ssget call will fail." Trotzdem hat es in meinem AutoCAD funktioniert. Ich bin zugegebener Maßen leicht verwirrt. ------------------ Gruß, Stephan www.stbartl.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Dez. 2008 10:30 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Was verwirrt dich denn - die fehlende Z-Koordinate bei dem gc10-Filter (" aber bei gc-4 werden 3 Koordinaten geprüft =,=,= ") oder ist es die Tatsache das die gc-4 Geschichte nicht wieder "geschlossen" wird, also kein abshließendes gc-4 kommt ? Dein Zitat stammt von "Logical Tests" und da geht es um => AND OR XOR und NOT und da stimmt das auch, die Aussage bezieht sich jedoch nicht auf die Verwendung von "Relational Tests" welche man ebenfalls über gc-4 angibt.
Schau dir das Hilfethema "Relational Tests" der Entwicklerhilfe an - da ist dann auch erklärt was "=,=,=" macht, dann sieht man auch das es in deinem Lisp total überflüssig untergebracht ist. das (10 x y) gibt an das nur Objekte gewählt werden welche diesen x UND y Wert im gc10 haben - ohne das es dasteht geht SSget hier auch noch von dem Z-Wert NULL aus. {PS: Ich persönlich lasse bei sowas die betreffende Angabe NICHT einfach weg sondern gebe es an, auch wenn nicht zwingend nötig - es dient aber dem Verständnis und der Übersichtlichkeit. (10 x y)= 2 Werte, aber es werden 3 geprüft!, also gebe ich dann lieber (10 x y 0.0) an } Der -4 Filter ändert daran garnichts, es ist also doppelt-gemoppelt, er lässt nur Objekte zu die eben genau den X, den Y und den Z-Wert haben (hier immer 0). ------------------ die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk) [Diese Nachricht wurde von cadffm am 30. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 30. Dez. 2008 10:52 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 30. Dez. 2008 18:18 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Hi, Zum vlisp-Editor gibt es hier von Jörn Bosse eine gute Anleitung(in deutsch). Zitat: Original erstellt von romi1: ... bezüglich exit: wie sonst soll ich Programmabbruch erzeugen? ...
Klammer auf ... wenn ja dann mache was sonst mache nix Klammer zu... mfg heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 02. Jan. 2009 11:46 <-- editieren / zitieren --> Unities abgeben:
Hi! Ihr habt recht; das bei ssget mit dem (-4 . "=,=,=")-Filter ist in diesem Fall unnötig und noch dazu falsch bzw. irreführend weil 3 Operatoren, aber nur 2 Werte zum vergleichen. Ich hab's mal rausgenommen, und siehe da: das Problem mit den unter bestimmten Umständen nicht exekutierten princ-Anweisungen hat sich scheinbar damit erledigt. Zumindest ist es bis jetzt nicht mehr aufgetreten. Vielen Dank! Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |