Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Schleifen kontrollieren

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:  Schleifen kontrollieren (1655 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

erstellt am: 01. Feb. 2012 09:05    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

Mir ist ein Fehler unterlaufen und ich weiss nicht wie er zu finden ist. Meine Frage ist jetzt kann man die cond-schleife kontrollieren.
Sie soll ausgeführt werden, wenn die Bedingung aw = "TB" ist

Code:

(setq aw (getstring "\nSelect code : ")
      i 0
      ss (ssget '((0 . "TEXT")))
      ssl (sslength ss)
      )
(cond
  ((= aw "TB")
  (repeat ssl
    (setq ent (entget (ssname ss i)))
    (if (= (cdr (assoc 1 ent)) "TB")
      (progn
(command "insert" "brunn" (cdr (assoc 10 ent)) 1 1 0 "" "?" "")
)
      )
    (setq i (1+ i))
    ))
  )


     
 
 


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

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: 01. Feb. 2012 09: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 cadplayer 10 Unities + Antwort hilfreich

setze sinnvolle Haltepunkte im Editor und überwache die Variablen
vllt. liegt es an der Gorß/Kleinschreibung und strcase könnte Abhilfe schaffen

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."
-Lots of irritating superfluous parentheses!-

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: 01. Feb. 2012 09: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

Danke, der Trick mit strcase funktionierte einwandfrei - die cond-schleife funktioniert also.

Ich habe eine Kodeliste, die entsprechend eines Textes in diesen Fall "tb" einen Block "brunn" setzt.

In Autolisp gibt es doch bestimmt eine Funktion, die sich aus einer Liste entsprechend zu dem Text den Block raussucht.

Die Liste könnte folgendermassen aussehen
(("TB" "BRUNN" "LAYER1") ("SS" "SCHACHT" "LAYER2") ("BL" "MAST" "LAYER3"))

Ich bräuchte jetzt also ein Werkzeug, das sagt wenn die Eingabe BL ist, suche aus der Liste den entsprechenden Blocknahmen (also "MAST") und setze ihn auf den Texteinfügepunkt in den "LAYER3".

Hat jemand eine Idee, welche Funktionen da infrage kämen?

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

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: 01. Feb. 2012 10: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

heute noch nicht munter?

Code:
(setq cplist '(("TB" "BRUNN" "LAYER1") ("SS" "SCHACHT" "LAYER2") ("BL" "MAST" "LAYER3")))
(setq relist (assoc "BL" cplist))

und dann mit car, cdr... weiter

Edit: oder du wertest den Rückgabewert weiter aus, falls dein gesuchter Wert öfters vorkommt, auf die schnell und ungetestet

Code:
(setq cplist '(("TB" "BRUNN" "LAYER1")
      ("SS" "SCHACHT" "LAYER2")
      ("BL" "MAST" "LAYER3")
      ("BL" "MAST1" "LAYER4")
      )
)
(setq re '())
(mapcar '(lambda (x)
  (and (= "BL" (car x))
    (setq re (cons x re))
  )
)
cplist
)

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."
-Lots of irritating superfluous parentheses!-

[Diese Nachricht wurde von Dorfy am 01. Feb. 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: 01. Feb. 2012 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

Nja

Ich meinte, gibt es auch eine andere Möglichkeit als wie mit cond zu sagen, wenn Eingabe so dann setze den entsprechenden Block auf den entsprechenden Text

(cond ((= (strcase antwort) "TB") (if (= (cdr (assoc 1 entity)) "TB") (command "insert" "brunn" ...)

oder kann man das sinnvoll kürzen?


------------------

Moment jetzt haben wir doppelt gepostet, dem muss ich erstmal nachgehen
Gruss Dirk

[Diese Nachricht wurde von cadplayer am 01. Feb. 2012 editiert.]

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

Ich sehe bei Dorfy kein COND und somit lautet die Antwort: Ja

------------------
CAD.de System-Angaben  -  CAD on demand  -  User:FAQ(Acad)

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: 01. Feb. 2012 13:03    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

Auf mapcars Seite hab ich mich mal mehr mit lambda und mapcar auseinandergestzt.
Bezogen auf mein Beispiel erscheint mir deine Konstruktion Dorfy fremd
1)
Was gibt lambda an mapcar
2)
Was erreicht die var re, in der vermutlich eine Liste stehen muss

(setq re '())
(mapcar '(lambda (x)
  (and (= "BL" (car x))
    (setq re (cons x re))
  )
)
cplist
)

Kann mir das jemand ein bissel aufdruseln

------------------
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: 01. Feb. 2012 13: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 cadplayer 10 Unities + Antwort hilfreich

(mapcar '(lambda(X) (+ X 5)) (LISTE 2 6 8))

= wende auf jedes ELEMENT der Liste die Funktion LAMBDA an und gebe eine Liste mit den Rückgaben von Lambda zurück

d.h. hier

zu jedem Element ( 2 6 8 ) wird 5 hinzuadiert, so dass mapcar dann(7 11 13) zurückgibt

mal ganz vereinfacht

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

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: 01. Feb. 2012 13:24    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

zu1) siehe CADmium

zu2) dein Rückgabewert, den du weiter verarbeiten kannst
(die "Unterlisten" welche die Bedingung erfüllen)

geht sicher schöner

Code:
(vl-remove-if-not '(lambda (x) (= (car x) "BL"))

oder gleich
 

Code:
(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) "BL")) cplist))

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."
-Lots of irritating superfluous parentheses!-

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: 01. Feb. 2012 14: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

@cadmium: ja dein Beispiel ist mir völlig einleuchtend

was Dorfy meint ist mir noch unklar.

in cplist stehen meine Kodes von der Kodeliste

(mapcar ; führe aus
  'cdr (vl-remove-if-not ; ???
  '(lambda (x) (= (car x) "BL")) ; entspricht das einer if-schleife
  cplist)); in Verbindung mit mapcar eine Liste

Die Entwicklungshilfe half mir nicht recht weiter...

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

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: 01. Feb. 2012 14: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

X liefert dir die "subliste" dein Element
x1 = ("TB" "BRUNN" "LAYER1")
x2 = ("SS" "SCHACHT" "LAYER2")
x3 = ("BL" "MAST" "LAYER3")


(mapcar ; führe aus
  'cdr ; liefert die Subliste ab zweitem Listenelement zbsp ("MAST" "LAYER3")
(vl-remove-if-not ; ??? --> schmeißt alles raus, was die Bedingung nicht erfüllt
  '(lambda (x) (= (car x) "BL")) ; entspricht das einer if-schleife
so ähnlich - ja
  cplist)); in Verbindung mit mapcar eine Liste


(setq re '()) ;leere liste
(mapcar '(lambda (x)
  (and (= "BL" (car x))(setq re (cons x re));wenn Bedingung für das Element erfüllt, dann Elemet zu re hinzufügen
  )
)
cplist
)

hast du die Schleifen mal probiert? dir die Ergebnisse angeguckt?
man kann auch Haltepunkte in dieser kleinen Schleife setzen und alles überwachen...
passt dir das Ergebniss nicht? oder willst du es nur verstehen?

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."
-Lots of irritating superfluous parentheses!-

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: 01. Feb. 2012 14:56    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 super danke Dorfy - toll für deine Mühe - sicher ich möchte gern mehr erfahren, aber nix infrage stellen. Hab ja selbst wenig Ahnung davon.
Ich denke jetzt weiterzukommen, evtl kommen noch fragen. Ich hoffe es nervt nicht alzu sehr.

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

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: 01. Feb. 2012 15:10    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

Code:
(setq erg (vl-remove-if-not '(lambda (x) (= (car x) "BL"))cplist))
(mapcar 'cdr erg )

vllt ist es so verständlicher


mit member, vl-member..., foreach, while, car, cdr, cons und ... kannst du deine Listen auch beackern
Listenfunktionen...
alles eine Frage des Geschmacks und der Stilblüten

bau dir eine kleine Bibo auf und mach es universal

(vl-remove-if-not '(lambda (x) (= (car x) key))lst) pack es in ein (defun ...
ein, kommt immer wieder

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."
-Lots of irritating superfluous parentheses!-

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

AUF WUNSCH von xxxxxx habe ich da ein REVERSE hinzugefügt.

LACH, ich hatte eine Antwort getippelt, wurde durch Arbeit abgelenkt und nun poste ich es zum trotz      

(mapcar 'cdr
    (vl-remove-if-not '(lambda (x) (= (car x) "BL")) cplist)
)

in deinem Fall das gleiche Ergebnis wie:

(reverse 
(foreach x cplist
    (if (= (car x) "BL")
        (setq Ergebnisliste (cons (cdr x) Ergebnisliste))
    )
  )
)

------------------
CAD.de System-Angaben  -  CAD on demand  -  User:FAQ(Acad)

[Diese Nachricht wurde von cadffm am 01. Feb. 2012 editiert.]

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

archtools
Mitglied



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

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 02. Feb. 2012 21: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 Nur für cadplayer 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von cadplayer:
Ja super danke Dorfy - toll für deine Mühe - sicher ich möchte gern mehr erfahren, aber nix infrage stellen. Hab ja selbst wenig Ahnung davon.
Ich denke jetzt weiterzukommen, evtl kommen noch fragen. Ich hoffe es nervt nicht alzu sehr.


Dorfy hat da eine Technik verwendet, die eine gewisse Bekanntheit mit Lisp voraussetzt. Statt einer IF oder COND Konstruktion verwendet er etwas, worauf letztlich die IF und COND Funktionen beruhen: das AND.

AND gibt genau dann T zurück, wenn alle Übergabeparameter an AND T sind. Lisp ist natürlich so schlau, nicht mehr weiter auf T zu prüfen, wenn schon einer der Parameter zu NIL evaluiert wurde, denn dann ergibt das AND auf jeden Fall NIL.

Das bedeutet, dass man mit einer simplen AND Konstruktion eine IF Konstruktion umgehen kann:

(AND
  (progn1 irgendwas, was zu NIL oder nicht-NIL evaluiert)
  (progn2 irgendwas, was nur ausgeführt wird, wenn (progn1 ..) nicht NIL war)
)

Das lässt sich dann natürlich beliebig verfeinern um eigene Varianten von IF bzw COND zu programmieren. Mit (apply AND <liste> ) oder ähnlichen Funktionen kann man dann richtig zaubern ...

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: 03. Feb. 2012 08:22    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

Prima danke für die Erläterungen - mir ist es jetzt um einiges klarer wie foreach, lambda, mapcar und and zur Listenbearbeitung angewendet werden kann.
Ich habe nun eine cplist, wo meine Codes entprechend Kodename, Blockname und Layername zu finden sind
"AV" "AV" "LAYER1"

Nun habe ich in der Zeichnung Texte die ich selektiere und denen ich entsprechend ihrer Bezeichnung einen Block zuweisen möchte
Ich weiss zum einen nicht, wieviel Texte AV, SS oder BL in der Zeichnung, mapcar sagt lediglich ah da ist ein Text AV

Für mich wäre interessant wieviel Texte AV gibt es, um dann den Block namens AV draufzusetzen.

Vielleicht schaut ihr nochmal auf den Eingangscode, der mit cond ja schon funktioniert
Nur finde ich es umständlich alle Bedingungen mit cond abzufragen, um dann mit command den Block zu setzen.

Der code sollte so intelligent sein, das wenn er den Text findet, sich den Block dazu sucht aus der Kodeliste und ihn anschliessend setzt.

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

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: 03. Feb. 2012 09: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 Nur für cadplayer 10 Unities + Antwort hilfreich

Die Lösung steht doch oben schon mehrfach beschrieben, sogar zwei verschiedene Lösungen
die aber letztendlich beide auf ASSOC beruhen (deswegen haben wir doch auch die Liste
so schön aufgebaut.

------------------
CAD.de System-Angaben  -  CAD on demand  -  User:FAQ(Acad)

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: 03. Feb. 2012 10:53    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 hat ´ne Weile gedauert bis der Funke gefallen ist - verflixt&zugenäht

Code:

; Kodeliste
(setq cplist '(("TB" "TB" "LAYER1")
      ("T"  "LÖVTRÄD" "LAYER2")
      ("BS" "BEL-STOLPE" "LAYER3")
      ("AV" "AV" "LAYER4")
      )
      )

; Hauptprogramm

(defun demo ( / )
  ;(/ i ss ssl ent elist)
  (setq i 0
ss (ssget '((0 . "TEXT")))
ssl (sslength ss)
)
  (repeat ssl
    (setq ent (entget (ssname ss i)))
    (setq erg (mapcar
      'cdr (vl-remove-if-not
    '(lambda (x) (= (car x) (cdr (assoc 1 ent)))) cplist))
  )
    (command "insert" (car (assoc (cdr (assoc 1 ent)) cplist)) (cdr (assoc 10 ent)) 1 1 0)
    (setq i (1+ i))
    )
  )

;;; (reverse
;;;    (foreach x cplist
;;;      (if (= (car x) "AV")
;;; (setq elist (cons (cdr x) elist)
;;;       )
;;; )
;;;      )
;;;    )

   

   


 
 
;;;(setq re '())
;;;(mapcar '(lambda (x)
;;;   (and
;;;     (= "BL" (car x))
;;;     (setq re (cons x re))
;;;     )
;;;   )
;;; cplist
;;; )
;;;(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) "BL")) cplist))


;;;(setq elist
;;;      (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) "AV")) cplist))
;;;      )



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

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: 03. Feb. 2012 11: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 cadplayer 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von cadplayer:
Ja hat ´ne Weile gedauert bis der Funke gefallen ist - verflixt&zugenäht

Code:

; Kodeliste
(setq cplist '(("TB" "TB" "LAYER1")
       ("T"  "LÖVTRÄD" "LAYER2")
       ("BS" "BEL-STOLPE" "LAYER3")
       ("AV" "AV" "LAYER4")
       )
      )

; Hauptprogramm

(defun demo ( / )
  ;(/ i ss ssl ent elist)
  (setq i 0
ss (ssget '((0 . "TEXT")))
ssl (sslength ss)
)
  (repeat ssl
    (setq ent (entget (ssname ss i)))
    (setq erg (mapcar
      'cdr (vl-remove-if-not
     '(lambda (x) (= (car x) (cdr (assoc 1 ent)))) cplist))
  )
    (command "insert" (car (assoc (cdr (assoc 1 ent)) cplist)) (cdr (assoc 10 ent)) 1 1 0)
    (setq i (1+ i))
    )
  )

....



Du ermittelst erg und verwendest es nicht?! (command ... (car erg) (cdr erg)...
Hinter command holst du dir die info mit assoc nochmal - wieso? Liegen doch in erg vor!
Was passiert wenn dein Text nicht in der cplist vorkommt? Verarbeitet der Command-Aufruf das?

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."
-Lots of irritating superfluous parentheses!-

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: 03. Feb. 2012 12: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

War verplüfft, dass ich erg auch umgehen konnte.

Für den Fall, dass es einen Text nicht in der Kodeliste gibt soll sicher eine Fehlermeldung kommen. Das krieg ich so auf die schnelle nicht so besonders hin. Muss mich noch mehr mit if and or beschäftigen

(progn
      (cond ((/= erg nil)
    (command "insert" (caar erg) (cdr (assoc 10 ent)) 1 1 0)
    )
    ((= erg nil)
    (princ "\nText not found in codelist")
    )
    )
      )

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

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: 03. Feb. 2012 12:40    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

Code:
(defun demo ( / ) ;(/ ss i ss VORGABE ent)
  (if (and
        (setq ss (ssget '((0 . "TEXT"))))
        cplist
      )
      (progn
          (setq i 0)
  (repeat (sslength ss)
    (setq ent (entget (ssname ss i)))
    (if (setq VORGABE (assoc (cdr(assoc 1 ent)) cplist))
        (command "_.-INSERT" (car VORGABE) (cdr(assoc 10 ent)) 1 1 0)
        (alert(strcat "'" (cdr(assoc 1 ent)) "' kein gültiger VorgabeBlock"))
    )
    (setq i (1+ i))
  )
      )
      (alert "keine Auswahl getroffen")
  )
)
da ist noch immer nicht der Layer verwendet, auch wird sich nicht um die Möglichkeit
gekümmert das der Block (warum auch immer) Attribute haben könnte usw.

------------------
CAD.de System-Angaben  -  CAD on demand  -  User:FAQ(Acad)

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: 03. Feb. 2012 14: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

Generell haben die Blöcke keine Attribute. Ich kann dir nicht ganz folgen was du mit var VORGABE erreichen willst. Der code fischt doch schon die Blocknamen entsprechend der Kodeliste raus.

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

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: 03. Feb. 2012 14:07    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

Zitat:
Original erstellt von cadplayer:
Das krieg ich so auf die schnelle nicht so besonders hin. Muss mich noch mehr mit if and or beschäftigen

darauf hätte ich auch folgendes posten können:

Code:

"(progn
      (cond ((/= erg nil)
    (command "insert" (caar erg) (cdr (assoc 10 ent)) 1 1 0)
    )
    ((= erg nil)
    (princ "\nText not found in codelist")
    )
    )
      )

"

(progn
Das Progn ist wohl unnötig..?

(/= erg nil)
erg ist immer nicht-nil wenn es "irgendwas" ist

(= erg nil)
erg ist immer nil wenn es nicht "irgendwas"

also wäre es so "schöner"
  (cond
    (erg (command "insert" (caar erg) (cdr (assoc 10 ent)) 1 1 0))
    (T (princ "\nText not found in codelist"))
  )


aber besser wäre es sicher mit einem IF

(if erg
    (command "insert" (caar erg) (cdr (assoc 10 ent)) 1 1 0)
    (princ "\nText not found in codelist")
)



Habe ich aber nicht gemacht, ich habe es dir in einen "fertigen" Code eingebaut der zudem noch eine paar andere Möglichkeiten zeigt.

------------------
CAD.de System-Angaben  -  CAD on demand  -  User:FAQ(Acad)

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: 03. Feb. 2012 14: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

Ja geb mir noch ein wenig Zeit, dann kann ich das noch von dir einbauen - Super spitzenklasse, danke Dir und Euch damit schönes WE (hoffentl. ohne Schneechaos)


(defun c:demo ();(/ i ss ssl ent erg)
  (setq ss (ssget '((0 . "TEXT")))
i 0)
  (progn
    (repeat (sslength ss)
      (setq ent (entget (ssname ss i)))
      (setq ol (getvar "clayer"))
      (cond
((setq erg
    (mapcar
'cdr (vl-remove-if-not
'(lambda (x) (= (car x) (cdr (assoc 1 ent)))) cplist))
    )
(if
  (not
    (tblsearch "layer" (cadar erg))
    )
  (command "layer" "M" (cadar erg) ""))
(setvar "clayer" (cadar erg))
(command "insert" (caar erg) (cdr (assoc 10 ent)) 1 1 0)
)
((setq erg (= T (princ "\nText not found in codelist\n") ))
)
)
      (setq i (1+ i))
      )
    (setvar "clayer" ol)
    )
  )

Sorry hab den Fehler gefunden - so gehts vielleicht

[Diese Nachricht wurde von cadplayer am 06. Feb. 2012 editiert.]

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