| |
| 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, eine Pressemitteilung
|
Autor
|
Thema: Hilfe bei command schleife (1496 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 24. Aug. 2012 10:16 <-- editieren / zitieren --> Unities abgeben:
Hallo vielleicht kann mir einer von Euch weiterhelfen bzw. sieht den Hacken Im Prinzip funktionieren die 2 command Aufrufe nur nicht so wie ich es gern hätte - es liegt an der Konstruktion - ich weiss. Nur nicht wie ich es anders machen könnte. Zur Erklärung es soll ein Block eingefügt werden, der in der Punktliste PLIST steht und auf einen bestimmten Layer gesetzt werden , der in CLIST definiert ist. Was die Routine nun macht ist erst alle Layer umstellen entsprechend dem Code aus CLIST und anschliessend setzt den Block auf den aktuellen Layer. Weiss einer Abhilfe, wie das besser aufgebaut werden könnte. Code: (while (/= PLIST nil) (setq DATA (STD-STRTOK (car PLIST) " , ") PKT (list (atof (caddr DATA)) (atof (cadr DATA)) (atof (cadddr DATA))) PNR (car DATA) ZKO (rtos (caddr PKT) 2 3) PCODE (last DATA) ) (if (/= DATA nil) (progn (repeat (length CLIST) (setq TMP (STD-STRTOK (car CLIST) " , ")) (setq CLIST (cdr CLIST)) (setq BLIST (cons TMP BLIST)) (foreach M BLIST (= (nth 4 DATA) (nth 2 M)) (setq PLAY (nth 0 M)) (command "_layer" "_s" PLAY "") ) ) ) ) (command "_.INSERT" "meas" PKT (getvar "dimscale") (getvar "dimscale") 0 PNR ZKO PCODE) (setq PLIST (cdr PLIST)) ) (command "_zoom" "_e") (princ) )
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 24. Aug. 2012 11:04 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, bist Du Dein Prog mal im VLIDE schrittweise durchgegangen und hast geprüft, was Du machst? Irgendwie werde ich aus den Zeilen nicht so recht schlau, woher Du den zu setzenden Layer nimmst. In Deinem (repeat ... (foreach ..)) Konstrukt läufst Du x mal durch die CLIST, verkürzt diese jedesmal um das erste Element, hängst dieses vor die BLIST, die Du dann auch jedesmal wieder neu durchläufst und für jedes Element einmal eine Layer setzt (zum Schluss sollte dann immer der letze in BLIST stehende Layer gesetzt sein). Und was die Zeile (= (nth 4 DATA) (nth 2 M)) soll, erschließt sich mit auch nicht, die liefert einfacht "true" oder "false", aber ausgewertet wird das nicht. Hier würde sicher mal eine Datenbeispiel helfen, wie die Elemente in PLIST und CLIST aussehen, und was wie zusammenhängen soll. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 24. Aug. 2012 12:19 <-- editieren / zitieren --> Unities abgeben:
Danke für die Rückmeldung, vielleicht stelle ich es auch wiedermal ein bissel komplizierter an als es eigenlich ist. Zu den Variablen, die schauen wie folgt aus: PLIST: - Koordinatenliste ("1345,6427008.9477,157460.8603,11.0625,vg" "1342,6427009.2738,157460.8029,11.9911,TR") CLIST: - Codeliste ("0,28,HPS,Hjälppunktstation" "M-1MATPKT,20,PP,Polygonpunkt" "M-1MATPKT,90,FIX,Fixpunkt" ) DATA: - einzelner Punkt ("1345" "6427008.9477" "157460.8603" "11.0625" "vg") TMP: - einzelner Punktcode ("0" "28" "HPS" "Hjälppunktstation") BLIST: - abgewandelte Punktcodeliste (("M-1MATPKT" "20" "PP" "Polygonpunkt") ("0" "28" "HPS" "Hjälppunktstation")) Mit folgenden Zeilen, möchte ich überprüfen ob der Punktcode in DATA "vg" in der BLIST vorhanden ist und dann den Layer entsprechend aus BLIST setzen. In meinem Beispiel gibt es keinen Layer, der auf den code "vg" zutrifft.
Code:
(foreach M BLIST (= (nth 4 DATA) (nth 2 M))
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 27. Aug. 2012 10:41 <-- editieren / zitieren --> Unities abgeben:
Wie kann man eine Funktion mit Symbolen aufbauen. Da blicke ich irgendwie nicht durch... Ich habe zwei Funktionen, die erste fügt mir den Block entsprechend seinen Punktdaten ein (Koordinate,Phöhe,Pnr,Pcode) ein
Code: [/ (defun c:VermessungTool_Main_cmdImport_OnClicked (/) (setvar "ATTREQ" 1) (importPcode) (while (/= PLIST nil) (setq DATA (STD-STRTOK (car PLIST) " , ") PKT (list (atof (caddr DATA)) (atof (cadr DATA)) (atof (cadddr DATA))) PNR (car DATA) ZKO (rtos (caddr PKT) 2 3) PCODE (last DATA) ) (command "color" COL) (command "_layer" "_s" PLAY "") (command "_.INSERT" "meas" PKT (getvar "dimscale") (getvar "dimscale") 0 PNR ZKO PCODE) (setq PLIST (cdr PLIST)) ) (command "_zoom" "_e") (princ) )CODE] die zweite Funktion definiert auf welchen Layer mit welcher Farbe der Block gezeichnet werden soll. [CODE] (defun playCol (PLAY COL /) (foreach M BLIST (cond ((= (nth 4 DATA) (nth 2 M)) (setq PLAY (nth 0 M)) (setq COL (nth 1 M)) ) ((= M nil) (setq PLAY "0") (setq COL "7") ) ) ) )
Jetzt bin ich mir unsicher, wo ich die Funktion playCol einbauen muss, damit nicht der Block xFach eingefügt wird. Wie kann ich so eine Funktion mit den Symbol PLAY und COL aufbauen, die in die obige Funtion dann eingreifen ? ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 27. Aug. 2012 11:13 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 27. Aug. 2012 11:28 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Antwort cadmium, komm gerade nicht dazu das mal durchzuprobieren... Bei Fragen melde ich mich nochmal edit: Ich hab´s mir durchgelesen, es geht ja auch darum sinnvolle Funktionen und deren "notwendige" Variablen auszuschöpfen Mein 1. Problem besteht darin, nicht zu wissen, wie ich bei der Funktion (defun name (a1 a2 / v1 v2) .... Argumente richtig einsetze. Am Beispiel Ich habe eine Funktion, die lediglich die Aufgabe hat eine PunktCode Liste aus einem Textfile einzulesen in ein bestimmtes Listenformat zu konvertieren und anschliessend als Variable CLIST zur Verfügung zu stellen. Code:
(defun importPcode ( BLIST / file Openfile Line TMP CLIST ) (setq file (findfile (strcat ACTION "PCODELIST.txt"))) (progn (setq OpenFile (open file "r")) (while (setq Line (read-line OpenFile)) (if (not (wcmatch line "")) (setq CLIST (append CLIST (list line))) ) ) (close OpenFile) ) (if (/= CLIST nil) (progn (repeat (length CLIST) (setq TMP (STD-STRTOK (car CLIST) " , ")); umgewandelte codezeile ("0" "28" "HPS" "Hjälppunktstation")... (setq BLIST (cons TMP BLIST)) ; umgewandelte codeliste (("0" "28" "HPS" "Hjälppunktstation") ("M-5VEGET" "130" "BU" "Buskar" "plantering")... (setq CLIST (cdr CLIST)) ) ) ) )
Was hier vielleicht etwas verwirrend aussieht, ich aber keine andere Lösung dafür finde, dass ich die Codeliste erst in CLIST einlese mit der Eingabe: ("LAYER,FARBE,CODE,BESCHREIBUNG" "LAYER,FARBE,CODE,BESCHREIBUNG" "LAYER,FARBE,CODE,BESCHREIBUNG".... und anschliessend konvertiere in die BLIST (("LAYER" "FARBE" "CODE" "BESCHREIBUNG") ("LAYER" "FARBE" "CODE" "BESCHREIBUNG") ("LAYER" "FARBE" "CODE" "BESCHREIBUNG")...Jetzt habe ich aber eine Codeliste mit der ich gut weiterarbeiten kann. Als nächstes habe ich eine einzelne Punktzeile als Liste, die umgewandelt so aussieht ("NUMMER" "X-KOOR" "Y-KOOR "Z-KOOR" "CODE") Die wiederum soll anhand dem Wert in "CODE" ermitteln welche Farbe und welchen Layer der Block erhält. Alle Funktionen laufen getrennt ohne Probleme, meine Frage ist aber wie kann ich sie zusammen laufen lassen. Dass mir am Ende ein Block mit der festgelegten Farbe auf den festgelegten Layer gesetzt wird. Beispiel so vielleicht Hilfsprogramm
(defun CodelistenImport ()... (defun PunktlistenImport ()... (defun Vergleich ()... ; gibt es den gesuchten Code in beiden Listen Hauptprogramm (defun c:BlockInsert ()... Wer kann mir eventuell eine praktische Idee zur Durchführung geben (es muss keine Lösung auf meine Aufgabenstellung sein...)
[Diese Nachricht wurde von cadplayer am 27. Aug. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 28. Aug. 2012 09:28 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, wie Cadmium schon anmerkte, ist Dein Code nicht wirklich übersichtlich. Hast Du Dir mal den Link, den Cadmium angibt durchgelesen? Dann siehtst Du, das Du fast alles machst, was man nicht machen sollte. Ich habe mal versucht Deinen Code zu importPcode zu vereinfachen. Rausgekommen ist m. E. eine Funktion mit der Du genauso auch Deine Punktliste oder ähnlich aufgebaute Eingabedateien einlesen kannst. (Es ist ungetestet, da ich Deine Funktion STD-STRTOK nicht habe, aber probiere es mal aus) Code:
(defun importListe (datei / Openfile line ErgListe) ; geht dann sogar fuer beide Listendateien (setq OpenFile (open datei "r")) ; wass soll bei dir das (progn ) ? (while (setq line (read-line OpenFile)) (if (not (wcmatch line "")) ; kannst du in der Punktcodedatei nicht leere Zeilen von vornherein ausschliessen? Dann koenntest du dir das (if Konstrukt) sparen (setq ErgListe (cons (STD-STRTOK line " , ") ErgListe)) ; und hier kannst du dann gleich die Liste so bauen, wie du sie brauchst, der Zwischenschritt ueber clist kann entfallen ) ) ErgListe ; zur Rückgabe der Liste ); im aufrufenden Programm muss dann die Datei ausgewaehlt und die funktion aufgerufen werden z. B. so (setq pcodedatei (irgendwie die punktcode datei auswaehlen oder festlegen)) (setq BLIST (importListe pcodedatei)) (setq plistedatei (irgendwie die punktliste datei auswaehlen oder festlegen)) (setq PLIST (importListe plistedatei))
Schau es Dir mal an, und dann überlege wie Du aus BLIST z. B. eine Assoc-Liste bauen kannst, die etwa so aussehen könnte ("code" "layer" "farbe" "beschreibung") und dann erinnere Dich an dieses. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 28. Aug. 2012 10:14 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
wie sieht dir Datendatei denn nun überhaupt aus ? bis dahin ein paar Funktionen mit nur einer Aufgabe ;; Funktion zum Einlesen einer Datei (defun DT:TEXTFILE->LST (DATEINAME / DATEI ZEILE BASE-LST ) (if (and(=(type DATEINAME) 'STR) (setq DATEINAME(findfile DATEINAME)) (setq DATEI (open DATEINAME "r")) ) (progn (while(=(type(setq ZEILE(read-line DATEI)))'STR) (setq BASE-LST (cons (vl-string-trim " " ZEILE) BASE-LST)) ) (setq DATEI(close DATEI)) BASE-LST ) ) ) ;; Funktion zum Textzeile aufteilen (defun DT:STR-DIVS(STRING SEPARATOR / POS OFFSET LISTE) (if(and(=(type STRING) 'STR)(=(type SEPARATOR) 'STR)) (progn (setq POS (vl-string-search SEPARATOR STRING)) (setq OFFSET (1+(strlen SEPARATOR))) (while POS (setq LISTE (cons (substr STRING 1 POS) LISTE) STRING (substr string (+ POS OFFSET)) POS (vl-string-search SEPARATOR STRING) ) ) (reverse (cons STRING LISTE)) ) ) ) ;Funktion zum bauen einer Assocliste (defun TRANSLATESTRING(STRING FORMAT / Y R) (if(=(type STRING)'STR) (progn (setq Y(DT:STR-DIVS STRING ",")) (while (and Y FORMAT) (setq R(cons (list (car FORMAT) (vl-string-trim " " (car Y))) R)) (setq Y(cdr Y)) (setq FORMAT(cdr FORMAT)) ) (reverse R) ) ) ) Aufruf z.B.;(TRANSLATESTRING "1.234,10.43,100.4,56,OBEN" '("X" "Y" "Z" "FARBE" "LAYER")) ------------------ - 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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 28. Aug. 2012 12:11 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 28. Aug. 2012 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 29. Aug. 2012 10:59 <-- editieren / zitieren --> Unities abgeben:
Absolut klasse, wie systematisch und strukturell du in deinem Code vorgehst ... ist eigentlich meine Art (nur nicht leicht umsetzbar), da ich nicht genau weiss, wie man vorgeht, wenn man eine Unterfunktion aufbaut. An deinem Beispiel habe ich zwar eine sehr gute Vorlage. Aber irgendwie platzt der Knoten nicht. Beispiel der DT:TEXTFILE->LST (DATEINAME /... 1)
Code: (if (and(=(type DATEINAME) 'STR)
...Abfrage die Eingabe ein String ist2)
Code: (while(=(type(setq ZEILE(read-line DATEI)))'STR)
...lies solange aus wie die ZEILE ein String ist3) und jetzt die Frage, warum muss man hier das BASE-LST nochmal eintragen ... gehört das zu progn-funktion dazu?
Code: (progn (while(=(type... (setq BASE-LST (... ) (setq DATEI(close DATEI)) BASE-LST )
Meine übung soll jetzt sein eine Unterfunktion aufzubauen, die einen Vergleich zwischen Codeliste und Punktliste durchführt. Aus vorangegangenen Thema ist das ja kein Problem
Code: (defun PlayCol ( VGL / ) (foreach M CLIST (foreach N PLIST (cond ((= (assoc "CODE" M) (assoc "CODE" N)) (setq PLAY (cadr (assoc "LAYER" M))) (setq COL (cadr (assoc "COLOR" M))) ) ) ) ) )
Tja hier ist jetzt die Frage, wie sage ich in meinem Code, dass bevor der Block gesetzt wird, die Funktion
Code: (PlayCol...
prüft ob die ausgelesene Zeile aus der Codeliste mit der ausgelesenen Zeile aus der Punktliste übereinstimmt und dann die Variablen PLAY (BlockLayer) und COL (Blockfarbe) bestimmt.Denke ich falsch oder zu kompliziert. Wie gesagt Problem ist, Unterfunktionen sinnvoll aufzubauen (wie es Cadmium bereits getan hat)
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 29. Aug. 2012 12:02 <-- editieren / zitieren --> Unities abgeben:
Code:
(defun LAYSET (STRING / ) (if (= (type STRING) 'STR) (command "_layer" "_s" STRING "") ) (princ) )(defun c:ls (/ LAY) (if (setq LAY (car (entsel "\nWähle einen Layer! "))) (LAYSET (cdr (assoc 8 (entget LAY)))) ) )
Vielleicht wird so mein Problem einleuchtender (mein erster Versuch eine Unterfunktion zu schreiben, wenn es auch sinnlos erscheint - aber wie gesagt nur eine übung) In meinem Hauptprogramm durchlaufe ich jetzt meine Punktliste Zeile für Zeile die so hier aussieht (("PNR" "1123") ("X" "6426904.5312") ("Y" "157497.4679") ("Z" "13.7868") ("CODE" "VK")) In meiner Codeliste sind alle "CODE"zeilen definiert (("LAYER" "0") ("COLOR" "28") ("CODE" "HPS") ("BESCHREIBUNG" "Hjälppunktstation")) Jetzt möchte ich gern übereinstimmungen in den beiden Listen finden, das erreiche ich mit (= (cdr (assoc "CODE" (car PLIST))) (cdr (assoc "CODE" (car CLIST)))) wenn nicht dann soll die "CODE"zeile von der Punktliste in der "CODE"zeile von der Codeliste gefunden werden Hier soll eine Unterfunktion greifen, die in einer foreach schleife zum Erfolg führt ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 29. Aug. 2012 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, zu Deiner Frage zu Pkt. 3) Der Rückgabewert einer (defun ...) Funktion ist das Ergebnis des letzten ausgewerteten Ausdrucks. BASE-LST wird ausgewerter zum Inhalt der Variablen, also liefert die Funtion als Ergebnis den aktuellen Inhalt von BASE-LST. Zu Deiner angegebenen Funktion PlayCol: So wie sie da steht, klapperst Du für alle Elemente der CLIST alle Element der PLIST durch und weist bei Übereinstimmung des Codes PLAY und COL zu. Nach Durchlauf der Funktion erhälst Du zum Schluss damit die zum letzten Element von CLIST gefundenen Werte von PLAY und COL (oder wenn zum letzten Wert von CLIST keine passender Code in CLIST gefunden wird, dann halt die zum vorletzten Wert gefundenen). Und was machst Du eigentlich mit dem an die Funktion übergebenen Argument VGL? Das tauch bei Dir in der Funktion gar nicht auf. Was Du aber m. E. willst, ist für jeden Wert von PLIST die über den CODE definierten, zugehörigen Werte für Layer und Color aus der CLIST zu erhalten. Somit musst Du Deiner Funktion genau einen Wert aus PLIST übergeben und den zugehörigen Wert aus CLIST ermitteln. Ob Du dann dafür eine Unterfunktion brauchst? Eigene Funktionen sind immer dann sinnvoll, wenn gleiche Aufgaben mit gleichen Datenstrukturen immer wieder mit anderen Daten gelöst werden sollen. Oft hilft es, sich die Aufgabe erstmal verbal zu strukturieren und sich so, bevor man sich dann ans eigentliche Programmschreiben (und dann egal mit welcher Programmiersprache) macht, eine Algorithmus aufzubauen. Zu Deinem Beispiel könnte ein Algorithmus so aussehen: - Für alle Elemente der Punktliste - nimm den CODE des Punktlisteelementes - übergebe einer Funktion den CODE und die Codeliste aus der das Ergebnis bei gleichen Code stammen soll - diese Funktion muss den zugehörigen Layer und die Farbe zurückgeben - Setze eine Referenz des Blocks mit der zugehörigen Farbe auf den zugehörigen Layer - Ende für alle Punktlistenelemente Funktion: - Übergebene Argumente: Codewort, Suchliste z. B. (defun meinefunct (codewort suchliste / lokale variablen) (...)(Ergebnis)) - Suche in der Suchliste den CODE Codewort - Ermittle die zugehörigen Werte für Layer und Farbe - Packe diese in eine rückgabefähige Struktur (z. B. eine Liste) - Liefere das Ergebnis Gruß Thomas [Diese Nachricht wurde von spider_dd am 29. Aug. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 29. Aug. 2012 15:31 <-- editieren / zitieren --> Unities abgeben:
Ja gut mein Ansatz ist jetzt folgender, ich habe sehr lange daran getüftelt... Code:
; Hauptprogramm (defun c:VT () (ImportPcode) (setvar "ATTREQ" 1) (if (ImportPliste) (while (/= PLIST nil) (setq PKT (list (atof (cadr (assoc "X" (car PLIST)))) (atof (cadr (assoc "Y" (car PLIST)))) (atof (cadr (assoc "Z" (car PLIST)))) ) PNR (cadr (assoc "PNR" (car PLIST))) PH (cadr (assoc "Z" (car PLIST))) CODE (cadr (assoc "CODE" (car PLIST))) );;; kontrolliert ob der "CODE" aus PLIST in "CODE" aus CLIST vorhanden ist (setq STR (cadr (assoc "CODE" (car PLIST)))) ; var entpricht der "CODE"silbe (while (/= CLIST nil) (cond ((= STR (cadr (assoc "CODE" (car CLIST)))) (setq PLAY (cadr (assoc "LAYER" (car CLIST)))) (setq COL (cadr (assoc "COLOR" (car CLIST)))) (command "color" COL) (command "_layer" "_s" PLAY "") (setq STR nil) ) ((/= STR (cadr (assoc "CODE" (car CLIST)))) (princ "\nKeine übereinstimmung gefunden! ") ) ) (setq CLIST (cdr CLIST)) ) ;;; Hier endet die Suche nach übereinstimmungen (command "_.INSERT" "meas" PKT (getvar "dimscale") (getvar "dimscale") 0 PNR PH CODE) (setq PLIST (cdr PLIST)) ) ) (command "_zoom" "_e") (princ) )
Kann es sein das so ein while-konstrukt nicht akzeptiert wird... Mir wird der Layer aus der ersten PLIST-zeile richtig gesetzt, anschliessend sollte er wieder auf nil stehen - tut er aber nicht sondern alle Blöcke (meas) werden auf dem selben Layer mit der selben Farbe gesetzt. Kann mir einer auf die Sprünge helfen. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 29. Aug. 2012 15:47 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, folgender Fehler steckt noch in Deinem Prog: mit dem Werten aus dem ersten Element der Punktliste gehts Du in die (while (/= CLIST nil) ... Schleife. Dort findest Du irgenwann die zugehörige Farbe und den Layer, dann machst Du aber weiter, jedesmal mit (setq CLIST (cdr CLIST)) bis CLIST leer ist. Wenn Du dann beim nächsten Element aus PLIST an die (while CLIST Schleife kommst gibt es CLIST nicht mehr!!! Also wird diese Schleife gleich übersprungen und Layer und Farbe ändern sich nicht! Du musst also entweder immer mit einer frischen Kopie von der originalen CLIST arbeiten oder besser mit einer foreach Schleife durch CLIST gehen und den zugehörigen Wert suchen ohne CLIST zu ändern. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Aug. 2012 15:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
## DAS Posting kann getrost übergangen werden, DEIN eigentliches Problem hatte ich nicht erkannt ## AutoCAD-Basics (gilt für den Fall das Objekte per AutoCAD-Befehl erstellt werden, was du ja mit Command "_.Insert" machst..): Ein neues Objekt wird immer in der aktuellen Farbe, dem aktuellen Linientyp, aktuellem Layer usw. erzeugt. Auf was gerade ein Lispvariable "Play" steht interessiert Acad dabei nicht. ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) [Diese Nachricht wurde von cadffm am 29. Aug. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 29. Aug. 2012 16:59 <-- editieren / zitieren --> Unities abgeben:
Hallejulia... was ich schwitze, bastel heute schon den lieben langen Tag darum und komme langsam in den grünen Bereich. Die Funktion arbeitet jetzt schon ganz gut, aber das i-tüpferl wäre noch, dass mir gesagt wird, wenn der "CODE" in der Punktliste PLIST nicht als "CODE" in der Codeliste CLIST definiert ist. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 29. Aug. 2012 23:34 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, es entwickelt sich. Ich habe Deine Lisp mal etwas (nicht nur bezüglich Deiner Fragestellung) bearbeitet und mit ein paar Kommentaren in ## eingeschlossen versehen. Ungetestet (auch hinsichtlich Klammerabgleich) ist diese anbei. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 30. Aug. 2012 09:42 <-- editieren / zitieren --> Unities abgeben:
Echt grosse Klasse Thomas (spider_dd)!!! Habe alle deine Vorschläge zum Laufen gekriegt. Tolle Hilfe von dir nochmal meinen Code zu überarbeiten. Abschliessend danke ich Cadmium, dass er mir viel Arbeit abgenommen hat durch seinen übersichtlichen Code zum Einlesen/Konvertieren von Listen. Ich bin begeistert ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |