Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  rtos - Error?

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:  rtos - Error? (1179 mal gelesen)
Zweistein
Mitglied
Dipl.-Ing. Bau / SFI


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

Beiträge: 16
Registriert: 07.07.2005

erstellt am: 07. Jul. 2005 14: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!

Das folgende Lisp-Modul soll Messpunkte aus einer *.txt lesen und auswerten.
Dabei sollen Attribute eines Blocks mit den Einzelinformationen
Punktnummer, x-Wert, y-Wert,z-Wert,bestückt werden.

Wenn z.B.  "pkt-re (atof (substr zeile 14 11))" an den Block übergeben wird,
dann habe ich zu viele sichtbare Nachkommastellen in den Attributen eingetragen.
=> mein Versuch mit "(setq pkt-re (rtos (atof (substr zeile 14 11)) 2 3))"
führt zwar zu dem gewünschten Format, jedoch scheint rtos hier falsch umzurechnen!
Jedenfalls entsprechen die angezeigten Koordinaten nicht mehr dem Blockbasispunkt.
Wird die rtos-Funktion deaktiviert, sind die Koordinaten wieder richtig.
(Dimzin = 1 oder = 0 wurde ausprobiert)

Wäre schön, wenn jemand auf meinen ersten Beitrag im Forum zu einer Lösung beitragen könnte.


;--------------------------------------------------------------------------------
;TopIn-Modul: Erzeugt französische Toppunkte als Block mit XYZ und PNr-Attributen
;--------------------------------------------------------------------------------

(defun einzelpunkt ( / )
(command "-layer" "se" layer "")

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

          ;(setq pkt-re (rtos (atof (substr zeile 14 11)) 2 3) ;wenn dieser Bereich aktiviert ist,
            ;    pkt-ho (rtos (atof (substr zeile 26 11)) 2 3) ;werden die Variablen mit falschen
            ;    pkt-z  (rtos (atof (substr zeile 38 9)) 2 3) ) ;Werten belegt

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


        (command "_-insert" blockname pkt-3d "1" "1" "0" pktnum pkt-re pkt-ho pkt-z)
); end einzelpunkt


(defun C:tinf ( / ) (command "cmdecho" "0" "setvar" "dimzin" "1")
(command "ofang" "kei" "bks" "w" "-layer" "ei" "*" "tauen" "*" "")
(setq zaehler 0)
(setq dat (open "Z:\_TopImport\Top.txt" "r"))

(cond
  ((/= dat "nil") ;wenn Datei vorhanden...
(setq zeile (read-line dat)) ;1.Zeile lesen aus Datei
(while (/= zeile nil) ;solange Zeile nicht leer...
  (setq pktart (substr zeile 3 1) ;lese Punktart aus 3.Zeilenspalte
idcode (atoi (substr zeile 4 3)) ;lese id-Code aus 4. bis 6. Spalte
pktnum (itoa (atoi (substr zeile 7 6))) ;lese Punktnummer aus 7. bis 12. Spalte
pkt-re (atof (substr zeile 14 11)) ;lese Rechtswert aus 16. bis 27. Spalte
pkt-ho (atof (substr zeile 26 11)) ;lese Hochwert aus 28. bis 39. Spalte
      pkt-z  (atof (substr zeile 38 9)) ;lese Z-Höhe aus 40. bis 49. Spalte
      pkt-2d (list pkt-re pkt-ho) ;bilde 2D-Punkt
      pkt-3d (list pkt-re pkt-ho pkt-z) ;bilde 3D-Punkt
      wsv-code (substr zeile 53 3) ;lese Punkt-Code aus 53. bis 55. Spalte
zeile  (read-line dat) ;lese nächste Zeile komplett
blockname "47"
layer "WS-M-Topo"
  ); setq
  (cond
    ((= pktart "0") (einzelpunkt) )                    ;Einzelpunkt erkannt
    ((= pktart "1") ) ;Startpunkt einer Plinie
    ((= pktart "2") ) ;Zwischenpunkt einer Plinie
    ((= pktart "3") ) ;Endpunkt einer Plinie
  ); end 2.cond

  (setq pkt-3d-vor pkt-3d zaehler (+ zaehler 1))
); end while
  ); end Datei-Bedingung
  (T (Prompt "\nDie Eingabedatei wurde im Standardpfad nicht gefunden!"))
); Ende cond

(close dat)
; (princ)
); tin
(princ "\nTopIN-Modul-> erfolgreich geladen \nStart mit <tinf> in der AutoCAD-Befehlszeile")

;-------------------------------------------------------------------------------;


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

WolfgangGutke
Mitglied
Konstrukteur


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

Beiträge: 109
Registriert: 28.09.2004

AutoCAD 2002
AutoCAD 2006
ObjectDCL 2.02

erstellt am: 07. Jul. 2005 14: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 Zweistein 10 Unities + Antwort hilfreich

Hast du mal paar Probezeilen aus der TXT ??

VG
Wolfgang

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

Zweistein
Mitglied
Dipl.-Ing. Bau / SFI


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

Beiträge: 16
Registriert: 07.07.2005

erstellt am: 07. Jul. 2005 15: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

Hier die gewünschten Testpunkte
(Hinweis: es sollten immer 4 Werte in einer Zeile stehen, am Zeilenanfang müssen die Blanks erhalten bleiben...)


  0005000077  43114.129  64225.919  234.089                                 
  0005000088  43114.142  64225.929  234.092                                 
  0010005005  42967.574  64225.992  236.410                       
  0010006000  43072.234  64233.985  234.152                       
  0010006001  43142.477  64230.495  234.294                       
  0010007000  42964.516  64208.170  236.667                       
  0100000002  42940.505  64205.305  237.552                                 
  0100000026  42987.560  64221.244  235.798                                 
  0100000029  42988.777  64222.168  235.674                                 
  0100000068  43093.835  64234.522  234.302                                 
  0100000070  43095.347  64234.559  234.285                                 
  0101000009  42967.147  64222.029  236.688                                 
  0101000010  42967.609  64222.306  236.711                                 
  0101000018  42963.219  64212.022  236.782                                 
  0101000019  42967.782  64212.498  236.648                                 
  0101000038  43003.585  64228.924  235.590                                 
  0101000039  43004.069  64229.163  235.563                                 
  0101000046  43011.480  64244.272  235.230                                 
  0101000054  43025.691  64238.292  235.011                                 
  0101000061  43072.773  64237.967  234.510                                 
  0101000062  43073.321  64237.835  234.521                                 
  0101000078  43114.240  64230.070  234.385                                 
  0101000079  43114.723  64229.940  234.381                                 
  0101000085  43135.221  64226.015  234.252                                 
  0102000012  42963.931  64223.462  236.662                                 
  0102000016  42960.921  64209.765  236.765                                 
  0102000017  42962.065  64209.961  236.869                                 
  0102000023  42984.154  64217.271  235.842                                 
  0102000036  43002.202  64226.183  235.568                                 
  0102000044  43009.372  64245.744  235.521                                 
  0102000051  43021.214  64235.701  235.319                                 
  0102000059  43070.040  64236.974  234.529                                 
  0102000066  43090.969  64232.793  234.374                                 
  0102000075  43111.626  64229.195  234.353                                 
  0102000082  43129.292  64225.376  234.355                                 

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: 07. Jul. 2005 16: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 Nur für Zweistein 10 Unities + Antwort hilfreich

Hallo Zweistein,
Du liest innerhalb Deiner while Schleife bereits die nächste Zeile ein, fügst dann aber erst den Punkt mit den Daten ein => Der Einfügepunkt bekommt die Daten der n.ten Zeile, während die Attribute die Daten der n+1.ten zeile bekommen.
Tausche mal den folgenden Teil aus und probier es nochmal


;(setq zeile (read-line dat)) ;1.Zeile lesen aus Datei
(while (setq zeile (read-line dat)) ;solange Zeile nicht leer...
  (setq pktart (substr zeile 3 1) ;lese Punktart aus 3.Zeilenspalte
idcode (atoi (substr zeile 4 3)) ;lese id-Code aus 4. bis 6. Spalte
pktnum (itoa (atoi (substr zeile 7 6))) ;lese Punktnummer aus 7. bis 12. Spalte
pkt-re (atof (substr zeile 14 11)) ;lese Rechtswert aus 16. bis 27. Spalte
pkt-ho (atof (substr zeile 26 11)) ;lese Hochwert aus 28. bis 39. Spalte
      pkt-z  (atof (substr zeile 38 9)) ;lese Z-Höhe aus 40. bis 49. Spalte
      pkt-2d (list pkt-re pkt-ho) ;bilde 2D-Punkt
      pkt-3d (list pkt-re pkt-ho pkt-z) ;bilde 3D-Punkt
      wsv-code (substr zeile 53 3) ;lese Punkt-Code aus 53. bis 55. Spalte
;zeile  (read-line dat) ;lese nächste Zeile komplett

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

Jörn

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

Zweistein
Mitglied
Dipl.-Ing. Bau / SFI


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

Beiträge: 16
Registriert: 07.07.2005

erstellt am: 07. Jul. 2005 17:50    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 Jörn, danke für die Antwort.
deinem Hinweis kann ich nur teilweise zustimmen,
denn bevor die Variablen mit den Werten aus der nächsten Zeile neu bestückt werden, wird die Unterfunktion "Einzelpunkt" aufgerufen, die jedoch zuerst noch alle bisherigen Variableninhalte auswertet.
Zu beachten ist auch: wenn rtos abgeschaltet wird, sind die Attributwerte richtig!!! (ohne dass sonst wo Zeilen zu tauschen wären)

mfg Zweistein

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

Zweistein
Mitglied
Dipl.-Ing. Bau / SFI


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

Beiträge: 16
Registriert: 07.07.2005

erstellt am: 07. Jul. 2005 18:06    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 Jörn,
habe deinen Codevorschlag eingebaut -> funktioniert!!!
dennoch ist der Effekt von rtos in der Unterfunktion Einzelpunkt
beachtenswert.

Danke.

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: 07. Jul. 2005 19: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 Zweistein 10 Unities + Antwort hilfreich

Hallo Zweistein,
also, diesen rtos-Effekt gibt es nicht. Wenn Du spaßeshalber in der alten Version mal die Punkte 5005 und 6000 vergleichst (in der Koordinatenliste aufeinanderfolgende Punkte) wirst Du feststellen, daß z.B. die Attributsanschriebe des Punktes 5005 exakt mit den Koordinaten des Basispunktes von Punkt 6000 übereinstimmen.

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

Jörn

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: 07. Jul. 2005 19:31    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 Zweistein 10 Unities + Antwort hilfreich

Kleiner Nachtrag zu der Funktion Einzelpunkt:

So wie sie im Original steht wird der Z-Wert nie stimmen, da der Einleseprozess (bzw. die "Formatierung der Zahl") zu spät beginnt - derzeit steht ...zeile 38 9))... drinnen, sollte aber 37 sein (ausser da will wer im nachhinein was addieren  ).

(Zumindest wertet er bei mir immer nur 34 oder 35 aus - nie aber 234/235...)

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

Thomas

[Diese Nachricht wurde von tunnelbauer am 07. Jul. 2005 editiert.]

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

WolfgangGutke
Mitglied
Konstrukteur


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

Beiträge: 109
Registriert: 28.09.2004

AutoCAD 2002
AutoCAD 2006
ObjectDCL 2.02

erstellt am: 07. Jul. 2005 23: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 Zweistein 10 Unities + Antwort hilfreich

Wenn ich dein Problem richtig erkannt habe, liegt es daran, dass die Nachkommastellen nicht richtig ausgelesen werden ??

Folgenden Tipp:
Lese jede Zeile ein und mache hieraus eine Liste (erspart dir auch das viiiiiiiiiiiiiele SUBSTR). Nun kannst du auf jedes Listenelemente (was mal eine Zeile war!!) gemütlich zugreifen, um dir z.B. den Einfügepunkt aus der Liste zusammen zu schreiben.

Hier das Proggy:

(defun STRING_TO_LIST (str tz / lst pos)
;Erzeugen einer Liste
      (if (and str tz)
  (progn
(setq pos (vl-string-search tz str))
(while pos
      (setq lst (cons (substr str 1 pos) lst)
    str (substr str (+ pos (1+ (strlen tz))))
    pos (vl-string-search tz str)); setq
      ); while
(if (> (strlen str) 0)
    (setq lst (cons str lst))
    ); if
); progn
  ); if
      (reverse lst)
      );

Hier eine Probezeile aus deiner TXT, die als Liste umgewandelt wird:
(setq Zeile (string_to_list " 0005000077  43114.129  64225.919  234.089                " " "))

und hier das Ergebnis :
("" "0005000077" "" "43114.129" "" "64225.919" "" "234.089" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "")

Und hier der Einfügepunkt:

(setq pkt (strcat (nth 3 zeile) "," (nth 5 zeile) "," (nth 7 zeile)))

Ich denke, dass ist einfacher auf jedes Element der Liste zuzugreifen ??


VG
Wolfgang

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: 08. Jul. 2005 08: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 Zweistein 10 Unities + Antwort hilfreich

also ... dann schmeiß doch auch noch gleich die Leerzeichen raus

(vl-remove-if '(lambda(X) (= X "")) ZEILE)
macht aus
("" "0005000077" "" "43114.129" "" "64225.919" "" "234.089" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "")
dann
("0005000077" "43114.129" "64225.919" "234.089")

ich denke , das wertet sich dann besser aus

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

WolfgangGutke
Mitglied
Konstrukteur


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

Beiträge: 109
Registriert: 28.09.2004

AutoCAD 2002
AutoCAD 2006
ObjectDCL 2.02

erstellt am: 08. Jul. 2005 10:27    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 Zweistein 10 Unities + Antwort hilfreich

... und wenn du schon am "Aufräumen" bist, noch'n paar kleine Tipps:
- Lese die TXT in eine Liste ein und dann den Rest des Progy
  (defun c:... ()
    ... Datei lesen und schließen
    ... Restprogramm
  Hintergrund: Wenn dein Prog in der jetzigen Struktur abstürzt, 
              bleibt die Datei bis zum schließen der Zeichnung offen

- Mache dir mal Gedanken über lokale/globale Symbole sowie Argumente an eine SubRoutine. Spart öfter mal Ärger mit irgendwelchen Werten aus irgenwelchen "alten" Symbolen in neuen Programmen

VG
Wolfgang

------------------
LISP = Lots of Insane Stupid Parantheses

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