Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Finde Fehler 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:  Finde Fehler nicht ... (1407 mal gelesen)
romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 29. Dez. 2008 08:58    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


test7.dwg.txt

 
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


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

Beiträge: 900
Registriert: 21.07.2006

AutoCad2007, ProE, HiCad

erstellt am: 29. Dez. 2008 09:43    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 romi1 10 Unities + Antwort hilfreich

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



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

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 29. Dez. 2008 15:26    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 romi1 10 Unities + Antwort hilfreich

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


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

Beiträge: 695
Registriert: 08.09.2003

erstellt am: 30. Dez. 2008 07:23    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 romi1 10 Unities + Antwort hilfreich

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


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 30. Dez. 2008 07:51    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

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


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

Beiträge: 695
Registriert: 08.09.2003

erstellt am: 30. Dez. 2008 07:57    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 romi1 10 Unities + Antwort hilfreich

und Fehlermeldung kommt keine beim "Abbruch"?

------------------
Gruß, Stephan
www.stbartl.at

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

romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 30. Dez. 2008 08:00    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

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


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

Beiträge: 695
Registriert: 08.09.2003

erstellt am: 30. Dez. 2008 08:35    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 romi1 10 Unities + Antwort hilfreich

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
良い精神




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: 30. Dez. 2008 10: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 romi1 10 Unities + Antwort hilfreich

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



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

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 30. Dez. 2008 10: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 romi1 10 Unities + Antwort hilfreich

evtl. ist nach mehrmaligem Aufruf die max. Anzahl der Auswahlsätze überschritten ?
Versuch mal die Variablen in denen AWS gespeichert werden lokal zu setzten
Code:
(defun c:lihe ( / liss)...)

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

Dorfy
Mitglied
Double-Dipl.-Ing. Bleistiftanspitzer


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

Beiträge: 900
Registriert: 21.07.2006

AutoCad2007, ProE, HiCad

erstellt am: 30. Dez. 2008 18:18    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 romi1 10 Unities + Antwort hilfreich

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


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 02. Jan. 2009 11:46    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

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

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