| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Element von Liste in Liste auf NIL prüfen (1416 mal gelesen)
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 14. Mai. 2009 20:23 <-- editieren / zitieren --> Unities abgeben:
Ich habe eine Liste mit 4000 Elementen, die alle auch Listen mit je 15 Elementen sind. Jetzt hole ich mir laufend die Elemente aus den Listen, z.B. Code: 5. Element der 438. Liste 12. Element der 932. Liste
mein Zugriff erfolgt so:
Code: (setq mein_wert1 (rtos (nth 4 (nth 437 grossliste)) 2 0) mein_wert2 (strcase (nth 6 (nth 437 grossliste)))
Die Elemente der Unterlisten sind aber sehr bunt gemischt - REAL, STR und NIL:
Code: (25.0 nil nil nil nil "Guten Tag " nil nil nil nil nil "0" nil nil)
Jetzt klappt mein Code (z.B. mit RTOS) natürlich nicht, wenn dieser Wert NIL oder STR ist. Jetzt graut mir ein wenig vor den Fehlerabfragen wie
Code: if NIL then ... if STR then ...
Gibt es da eine sparsame Lösung?Schönen Abend Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 14. Mai. 2009 21:20 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 14. Mai. 2009 22:04 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
...ausserdem kommt es darauf an, was Du danach machen willst. brauchst Du immer einen String, dann nimm vl-princ-to-string. oder Du fängst einfach die Fehler ab: (if (vl-catch-all-error-p (setq val (vl-catch-all-apply 'rtos (list val)))) (setq val "")) Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 14. Mai. 2009 22:59 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von cadffm: ...Du mußt doch wissen (können) ob das 5.Element der50.Liste ein String ist oder nicht !?...
Die Liste sind eingelesene Excel-Daten in unterschiedlichen Inhalten - und daher weiß ich es leider nicht. Zitat: Original erstellt von wronzky: ...brauchst Du immer einen String, dann nimm vl-princ-to-string....
Das ist ein interessanter Ansatz - werde ich prüfen. Zitat: Original erstellt von wronzky: ...(if (vl-catch-all-error-p (setq val (vl-catch-all-apply 'rtos (list val)))) (setq val ""))...
Das sagt mir derzeit noch nicht viel, aber ich werde es auch testen. Danke und schönen Abend Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) 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: 15. Mai. 2009 06:43 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Hi, mix die beiden Vorschläge mit vl-catch-all-apply ne Sub aufrufen Sub: (cond ((= (type input) 'VLA-OBJECT) input) ((= (type input) 'ENAME)(vlax-ename->vla-object input)) ;;............ (T Nil) ) mfg heiko Edit: oder Eingsngswert mit type auswerten und je nach Ausgabetype, mittels diversen kleinen subs, den Wert konvertieren [Diese Nachricht wurde von Dorfy am 15. Mai. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 15. Mai. 2009 17:01 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Wenn es nur die 4 Varianten gibt ('str 'real 'int 'nil) dann ist das doch nicht so schlimm. (defun val2str (val / tp) (setq tp (type val)) (cond ((= tp 'str) val) ((= tp 'real) (rtos val 2 3)) ((= tp 'int) (itoa val)) ((= tp 'nil) "") ('T (alert "Typ nicht definiert") "") ) ) Grüße Andi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 15. Mai. 2009 17:38 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Hallo Peter, aus meiner Sicht gibt es nun verschiedene Möglichkeiten an das Thema zu gehen: 1) Ein NIL wird ja bestimmt nicht aus Excel geliefert, deshalb sollte man an der Stelle des Auswertens der Excel-Daten vielleicht einen Leerstring anstelle des NIL's erzeugen. 2) Wenn du die NIL-Elemente nicht benötigst und die Position der anderen Elemente innerhalb dieser Liste keine Bedeutung haben, dann schmeiß einfach alle NIL's aus der Liste raus: (vl-remove-if 'Not [LISTE]) 3) Du bearbeitest die Liste in der Art wie das hier bereits formuliert wurde: (defun VAL2STRING (val / valtyp) (setq valtyp (type val)) (cond ((not val)"") ((= valtyp 'STR) val) ((= valtyp 'INT) (itoa val)) ((= valtyp 'REAL) (rtos val)) ((= valtyp 'LIST) (apply 'strcat (mapcar 'VAL2STRING val))) (T "*ERROR*") ) ) (Ich habe das nur hier im Editor runter getippt, Syntax noch prüfen!) ) (setq LISTE (mapcar 'VAL2STRING LISTE)) Bei Fragen ... Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 15. Mai. 2009 20:23 <-- editieren / zitieren --> Unities abgeben:
Dank an alle - die Sache scheint jetzt recht klar. Ich kann aber erst nächste Woche (oder nach dem Urlaub) das vertieft betrachten. Zitat: Original erstellt von Dorfy: ...Edit: oder Eingsngswert mit type auswerten und je nach Ausgabetype, mittels diversen kleinen subs, den Wert konvertieren...
Wie oben gesagt - gerade das hat mich nicht übermäßig verlockt ... Zitat: Original erstellt von Brischke: ... 1) Ein NIL wird ja bestimmt nicht aus Excel geliefert, deshalb sollte man an der Stelle des Auswertens der Excel-Daten vielleicht einen Leerstring anstelle des NIL's erzeugen.
Das ist sicher das Beste. Da dieser Codeteil aber ein komplexeres Internet-Fundstück ist habe ich gar nicht so recht hineingeschaut. Das sollte ich aber nachholen. Zitat: Original erstellt von Brischke: ... 2) Wenn du die NIL-Elemente nicht benötigst und die Position der anderen Elemente innerhalb dieser Liste keine Bedeutung haben, dann schmeiß einfach alle NIL's aus der Liste raus: (vl-remove-if 'Not [LISTE])
Das geht nicht, weil die Position absolut wichtig ist. Zitat: Original erstellt von Brischke: ... 3) Du bearbeitest die Liste in der Art wie das hier bereits formuliert wurde: (defun VAL2STRING (val / valtyp) (setq valtyp (type val)) (cond ((not val)"") ((= valtyp 'STR) val) ((= valtyp 'INT) (itoa val)) ((= valtyp 'REAL) (rtos val)) ((= valtyp 'LIST) (apply 'strcat (mapcar 'VAL2STRING val))) (T "*ERROR*") ) )(Ich habe das nur hier im Editor runter getippt, Syntax noch prüfen!) ) (setq LISTE (mapcar 'VAL2STRING LISTE))...
Siehe oben - muss ich anschauen. Noch ein schönes Wochenende an alle. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |