Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  command-Befehl mit variabler Länge

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:  command-Befehl mit variabler Länge (1126 mal gelesen)
romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 29. Feb. 2008 11: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

Hallo Forum!
Folgende Frage: Wie kann mann einen command-Befehl mit variabler Länge gestalten?
Und zwar möchte ich über einen command Befehl Blöcke mit unterschiedlich vielen Attributen einlesen.

Codefragment:
(command "_-insert" blockname "z" zskal "y" yskal "x" xskal "d" rotat koord "att-inhalt1" "att-inhalt2"))

obiger Code paßt also für einen Block mit 2 Attributen.
Ich möchte aber über die gleiche Zeile (die dann eben [vom Programm selbst] anders gestaltet werden muß Blöcke mit 1, 3 oder beliebig vielen Attributen einlesen.

Hat jemand eine Idee?
Gruß,
Roman

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

tunnelbauer
Ehrenmitglied V.I.P. h.c.
Bauingenieur



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

Beiträge: 7085
Registriert: 13.01.2004

ich hab eh keine Probleme damit...

erstellt am: 29. Feb. 2008 11: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 romi1 10 Unities + Antwort hilfreich

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 29. Feb. 2008 11: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 romi1 10 Unities + Antwort hilfreich

Hallo Roman,

ich mache das so, dass vor dem Einfügen des Blockes die Sysvar ATTREQ auf 0 gesetzt wird. Damit wird das Abfragen der Attribute unterbunden.
Im zweiten Step fülle ich dann die Attribute des eingefügten Blockes.
Dabei arbeite ich mit Assoziationslisten:
'(("ATT1" . "Wert1")("ATT2" . "Wert2") ... ("ATTX" . "WertX"))

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

romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 29. Feb. 2008 11: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

Hi tunnelbauer!
Danke für den Tipp, aber ich schnipsle jetzt mittlerweile ca. 3 Tage an dem lisp zum Blöcke einlesen, und möchte nicht so kurz vor dem Ziel aufgeben. Ist ja auch egal für was ich's brauche, die Frage lautet: wie kann ich die command-Zeile so gestalten bzw. gestalten lassen (z. B. mit strcat ... aber der schluckt keine Strings, die Anführungszeichen enthalten), das sie mit einer variablen Anzahl von Attributen fertig wird?
Gruß,
Roman

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

romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 29. Feb. 2008 11:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Holger!

Guter Tipp, aber mit welchem Befehl befüllst bzw. editierst du dann die Attribute?

-attedit ist ja nicht sonderlich dafür geeignet, oder?

Roman

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 29. Feb. 2008 11: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 Nur für romi1 10 Unities + Antwort hilfreich

ja klar, das ist eine eigene SUB.

durchlaufe mal mit einer (while ..) die Elemente, die nach der Blockreferenz kommen.
(setq ename insert)
(while (setq ename (entnex ename))
(entget ename)
...
)
so kommst du an die Attribute(Elemente), die du dann ja mit entmod entsprechend aktualisieren kannst. (ist zumindest ein Weg)

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

tunnelbauer
Ehrenmitglied V.I.P. h.c.
Bauingenieur



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

Beiträge: 7085
Registriert: 13.01.2004

ich hab eh keine Probleme damit...

erstellt am: 29. Feb. 2008 11:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für romi1 10 Unities + Antwort hilfreich

Tja - im Link von mir wird dies so gemacht... nachschauen wäre halt auch 'ne Möglichkeit, nicht immer gleich sagen: Ich mach's anders... - vor allem dann nicht wenn es nicht anders geht...   

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

Thomas

Korrekturen zum Kochbuch AutoLISP

[Diese Nachricht wurde von tunnelbauer am 29. Feb. 2008 editiert.]

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 29. Feb. 2008 11:57    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 romi1 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von romi1:
Hi tunnelbauer!
Danke für den Tipp, aber ich schnipsle jetzt mittlerweile ca. 3 Tage an dem lisp zum Blöcke einlesen, und möchte nicht so kurz vor dem Ziel aufgeben. Ist ja auch egal für was ich's brauche, die Frage lautet: wie kann ich die command-Zeile so gestalten bzw. gestalten lassen (z. B. mit strcat ... aber der schluckt keine Strings, die Anführungszeichen enthalten), das sie mit einer variablen Anzahl von Attributen fertig wird?
Gruß,
Roman

In dem Fall wohl gar nicht.
Commands kann man sehr wohl dynamisch aufbauen. Das Command kann auch in mehreren Commands enthalten sein

(setq pkt_liste (list (list 0 0) (list 1 0) (list 1 1) (list 0 1)))
(command "._pline")
(foreach pkt pkt_liste
(command pkt)
)
(command "_close")


Da du aber nicht weisst, wieviele Attribute dein Block hat, geht das so nicht.

Also wirklich die einzige Möglichkeit mittels Systemvariable ATTREQ das Abfragen der Attribusteingabe unterdrücken.
, dann den Blockeinfügen, und dann den eingefügten Block die Attribute abarbeiten

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

Ing. Anton Fuchs
WWW.FFZELL.AT.TC

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 29. Feb. 2008 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 Nur für romi1 10 Unities + Antwort hilfreich

Hallo nochmal,

klar geht das auch ohne ATTREQ
man muss eben nur die Attwerte in eine Liste packen und dann das INSERT-command ''offen'' lassen.
(command "_-insert" blockname "z" zskal "y" yskal "x" xskal "d" rotat koord)
(mapcar 'command '("att-inhalt1" "att-inhalt2"))

das geht dann auch mit variabler Anzahl:
(mapcar 'command '("att-inhalt1" "att-inhalt2" "att-inhalt3" "att-inhalt4" ... "att-inhaltX"))

ich habe diese Möglichkeit nicht erwähnt, weil mir diese sehr unsympatisch ist .. ist der Block aus welchen Gründen auch immer, nicht so, wie er vom Programm erwartet wird, dann erzeugt man absolut falsche Eintragungen oder das Tool fährt gegen die Wand.

Deshalb, Roman, geh den langen Weg mit ATTREQ=0 und fülle dann die ATTRIBS - du wirst diese SUB öfter brauchen können.

Bei Fragen ...

Grüße Holger

Bei Fragen ...

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 29. Feb. 2008 12: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 romi1 10 Unities + Antwort hilfreich

Hallo,
eins vorweg, Holger's Weg finde ich besser und mache es eigentlich auch selber so.
Folgendes wäre aber auch noch möglich:
1. Über (tblobjname "BLOCK" Blockname) die Anzahl der definierten Attribute aus der Blockdefinition abfragen
2. Einen Command Befehl in eine LISP-Datei schreiben
3. Diese LISP Datei laden

z.B.

Code:

(command "_.insert"
"BOFKP"
"-153.275000000000,-18.187000000000,0.0"
0.250000000000
0.250000000000
0
"Attwert1"
"Attwert2"
)

Ich bin der Meinung, daß ich irgendwann mal einen guten Grund hatte so zu verfahren, habe ich aber leider vergessen 

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

Jörn

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 29. Feb. 2008 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 romi1 10 Unities + Antwort hilfreich

Anbei 2 ganz praktische Routinen, um Attribute zu lesen, schreiben


Code:
;
; schreibt in einen Block ein Attribut
;
(defun pltSchreibeAttribute (ename daten / edate name ename0)
  (setq ename0 ename)
  (while (and (setq ename (entnext ename))
      (setq edate (entget ename))
      (= (cdr (assoc 0 edate)) "ATTRIB")
)
        (setq name (cdr (assoc 2 edate)))
        (if (and (assoc name daten)(cdr (assoc name daten)))  (entmod (subst (cons 1 (cdr (assoc name daten))) (assoc 1 edate) edate)))
  )
  (entupd ename0)
)
;
; gibt alle Attribute eines Blockes als Assoc liste zurück
;
(defun pltLeseAttribute (ename / edate daten)
  (while (and (setq ename (entnext ename))
      (setq edate (entget ename))
      (= (cdr (assoc 0 edate)) "ATTRIB")
)
        (setq daten (cons (cons (cdr (assoc 2 edate)) (cdr (assoc 1 edate))) daten))
  )
  daten
)

Damit kann man das jetzt sehr einfach machen

(setq svAttReq (getvar "ATTREQ"))
(setvar "ATTREQ" 0)
(command "_-insert" blockname "z" zskal "y" yskal "x" xskal "d" rotat koord)
(setvar "ATTREQ" svAttReq)
(pltSchreibeAttribute (entlast) (list (cons "ATTNAME1" "ATTWERT1") (cons "ATTNAME2" "ATTWERT2") ...))

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

Ing. Anton Fuchs
WWW.FFZELL.AT.TC

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

romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 29. Feb. 2008 13:08    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!
Danke euch für die vielen Tipps!!
Ich werd's auf Holger's Anraten auf seine Weise probieren ("den langen Weg"). Wenn ich's nicht schaffe, probier ich's mit dem dynamischen command-Befehl lt. fuchsi.
Danke,
Roman

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 29. Feb. 2008 13: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 romi1 10 Unities + Antwort hilfreich

ähmmm .. fuchsi liefert genau den Code, den du für ''meinen'' Weg benötigst. Da gibts nichts weiter zu testen / zu programmieren .. !!??

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

romi1
Mitglied
Bautechniker


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

Beiträge: 638
Registriert: 09.02.2006

Xeon E3-1245V2
16GB RAM
Windows 10 Professional 64 bit
AutoCAD 2014

erstellt am: 29. Feb. 2008 13:18    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!
Ja schon, aber ich wills ja schließlich auch kapieren, was da läuft, und nicht nur "copy" & "paste" ...
Gruß,
Roman

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