Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Hilfe bei command schleife

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:  Hilfe bei command schleife (1431 mal gelesen)
cadplayer
Ehrenmitglied
CADniker


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

Beiträge: 1832
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 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 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



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

Beiträge: 1111
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 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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 24. Aug. 2012 12:19    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

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


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

Beiträge: 1832
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 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

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




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: 27. Aug. 2012 11: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 Nur für cadplayer 10 Unities + Antwort hilfreich

Sorry, aber ich find den Code bloß schrottig... Lese dir bitte mal die letzten Kapitel von MAPCAR durch ....

--> Eine Funktion für eine Aufgabe
--> Eingabeparameter , lokale Variablen , Rückgaben
  so wird aus (importPcode) --> (setq PLIST(importcode))
  und aus
  (defun playCol (PLAY COL /) --> (defun playCol ( VERGLEICH / PLAY COL) .. mit der Rückggabe (list PLAY COL) ...
usw.

So blickst nämlich Du und die dir helfenden nie durch!


Tipp: Man kann auch die Daten als Asscoliste vorhalten :

ala (setq FARBLISTE '((Blockname1  FarbNr1)(Blockname2  FarbNr2)...)

und dann mit
(or(setq FARBE (cadr(assoc BLOCKNAME FARBLISTE)))
  (setq FARBE 1)
)

oder ähnlich drauf zugreifen ..

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 27. Aug. 2012 11:28    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

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



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

Beiträge: 1111
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 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 cadplayer 10 Unities + Antwort hilfreich

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




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: 28. Aug. 2012 10:14    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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 28. Aug. 2012 12: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

Danke für die grosse Mühe euch beiden, ich sollte mein Vorhaben jetzt gebacken kriegen... heute lässt es der Chef nicht zu - hat mich voll gepackt mit Arbeit  .

------------------
Gruss Dirk

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: 28. Aug. 2012 12: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 cadplayer 10 Unities + Antwort hilfreich

Jaja .. ich hab auch nie Zeit die Axt zu schärfen, weil ich Bäume fällen muss ...

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 29. Aug. 2012 10:59    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


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 ist

2)

Code:
(while(=(type(setq ZEILE(read-line DATEI)))'STR)

...lies solange aus wie die ZEILE ein String ist

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


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

Beiträge: 1832
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 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

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



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

Beiträge: 1111
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 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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 29. Aug. 2012 15: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

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



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

Beiträge: 1111
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 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 cadplayer 10 Unities + Antwort hilfreich

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




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: 29. Aug. 2012 15:48    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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 29. Aug. 2012 16:59    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


pruefung.LSP

 
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



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

Beiträge: 1111
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 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 cadplayer 10 Unities + Antwort hilfreich


pruefung_modi.lsp

 
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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 30. Aug. 2012 09:42    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

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

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