Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  String als Variablennamen verwenden

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:  String als Variablennamen verwenden (698 mal gelesen)
dawa
Mitglied
Schreinermeister

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

Beiträge: 4
Registriert: 27.10.2007

erstellt am: 27. Okt. 2007 21:15    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


blerst.txt

 
Hallo zusammen,

ich befasse mich erst seit kurzem mit Lispprogrammierung. Ich bin in diversen Tutorials und Foren bisher nicht auf eine Lösung für mein Problem gestoßen.

Was ich vorhabe: für die Verschachtelung verschiedener Frästeile möchte ich jeweils mehrere Zeichnungselemente zu einer Gruppe zusammenfassen. Eine Gruppe solcher Zeichnungselemente beinhaltet jeweils ein Textelement mit einer Nummerierung, z.B. "17" oder "1b16".

Ein Programm zum Erstellen dieser Gruppen habe ich bereits geschrieben. Dabei wird die Elementauswahl in einer Variablen gespeichert, die sich aus dem Text "block_" und dem Text der Nummerierung zusammensetzt, also z.B. "block_17" oder "block_1b16".

In einem Weiteren Programm möchte ich nun diese verschiedenen Elementgruppen weiter bearbeiten, z.B. verschieben, drehen ect. Und nun zu meinem Problem: das Speichern der jeweiligen Auswahl in einer Variablen funktioniert soweit (siehe Anhang "blerst"), aber mit dem Aufrufen der Variablen in command habe ich so meine Schwierigkeiten, da die Nummerierung keinem festgelegten Schema folgt, sondern höchst unterschiedlich sein kann.

Bisher hab ich versucht, die Gruppe folgendermaßen aufzurufen:

(defun c:blversch ()
  (setq auswahl (car (entsel "Bitte die Zahl der Elementgruppe auswählen)))
  (setq zahl (cdr (assoc 1 (entget auswahl))))
  (setq basis (cdr (assoc 10 (entget auswahl))))
  (setq varname (strcat "block_" zahl))
  (command "_move" varname "" basis pause)
  (princ)
)

Nun ist die Variable varname zwar mit dem Wert "block_17" oder "block_1b16" belegt. Aber eigentlich müsste die Variable selbst ja so lauten, um den vorher global gespeicherten Auswahlsatz aufrufen zu können. Aber das bekomme ich nicht hin.

Vielleicht kennt hier jemand ja eine Lösung. Für Euere Bemühungen schon mal vielen Dank.

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

andi2050
Mitglied



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

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 28. Okt. 2007 09:54    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 dawa 10 Unities + Antwort hilfreich

Hi dawa !

Der Command-Aufruf sollte folgendermaßen aussehen:
(command "_move" (eval (read varname)) "" basis pause)

Du solltest aber beachten, daß Du in ACAD nur eine begrenzte Anzahl von aktiven Auswahlsätzen zur Verfügung hast (ich glaube 127 ???).
Da Du diese AWS in globalen Variablen speicherst könnte diese Grenze schnell erreicht werden.

Evtl. könnest Du die Objekte in eine "assoc-liste" packen z.B.:
(
("block_23" <Objektname: xx> <Objektname: xx> ...)
("block_5u6" <Objektname: xx> <Objektname: xx> ...)
...
)


Grüße

Andi

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

dawa
Mitglied
Schreinermeister

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

Beiträge: 4
Registriert: 27.10.2007

erstellt am: 28. Okt. 2007 11: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

Hi Andi!

Tja, wenn man weiß wie, scheint es einfach. Wenn nicht...

Dein Vorschlag funktioniert auf jeden Fall so wie ich mir das vorgestellt habe.

Zu deinem Vorschlag: Ich denke, dass ich die von dir genannte Grenze nicht so schnell erreichen werde, aber wenn doch komme ich auf jeden Fall darauf zurück.

Um die AWS auch nach dem Schließen der Zeichnung noch verfügbar zu haben wollte ich mich auch mal damit befassen, wie man diese "assoc-listen" in eine externe Datei schreibt, um sie dann daraus wieder lesen zu können (vielleicht hast du das auch schon so gemeint). Aber ich denke, da warte ich erstmal auf mein "Kochbuch", das ich vor zwei Tagen bestellt habe 

So long, vielen Dank

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

andi2050
Mitglied



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

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 28. Okt. 2007 18: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 dawa 10 Unities + Antwort hilfreich

Wenn Du die Gruppierungen auch nach dem Schließen/Öffnen der Zeichnung noch vorhanden sein sollen, dann könntest Du die Daten in einem Dictionary speichern. Leider kannst Du Auswahlsätze oder Enames nicht direkt speichern (spezielle Datentypen).

Hierfür kann man aber einfach das 'Handle' der Objekte verwenden. Jedem Zeichnungsobjekt ist ein eindeutiges Handle zugeordnet (Sozusagen die Hausnummer des Objekts). Dies ist ein String, der als Gruppencode 5 für jedes Objekt gespeichert wird. Diesen String (ggf. in einer Liste verpackt) kann man dann in einem Dictionary speichern. Die Funktion (handent <handle> ) gibt dann den Ename zu dem Handle zurück.

Hier mal ein Beispiel zum Umwandeln von AWS nach Handleliste und zurück:

Code:
;;; NUR TESTFUNKTION !
(defun c:test (/ ss glist ssnr)
  (setq ssnr 1)
  (while (and (princ (strcat "\nAuswahlsatz " (itoa ssnr))) (setq ss (ssget)))
    (setq glist (group:add (ss->handlelist ss) ; SelSet -> Handles
  (strcat "Block_dummy_" (itoa ssnr)) ; Gruppenname
  glist ; Gruppenliste
)
  ssnr (1+ ssnr)
    )
  )
  (princ "\nInhalt der GruppenListe:")
  (print glist)
  (princ "\nErste Gruppe wieder als Auswahlsatz:")
  (print (group:getss (caar glist) glist))
  (princ)
)
;;;-----------------------------------------------------------------------------------------
;;;--------------------------------------
;;; Gruppe aus Gruppenliste holen und als SelectionSet zurückgeben
;;;--------------------------------------

(defun group:getss (gname glist /)
  (handlelist->ss ; Handles in SelSet wandeln
    (cdr (assoc gname glist)) ; Gruppe aus Liste holen
  )
)
;;;--------------------------------------
;;; Neue Gruppe zu Gruppenliste hinzufügen
;;; Argumente: hlist - Liste mit Handles
;;;            gname - Gruppenname
;;;            glist - Gruppenliste
;;; Rückgabe: Gruppenliste mit hinzugefügter Gruppe
;;;          z.B. (("NameNeu" "<Handle>" "<Handle>" ...)
;;;             ("Name1" "<Handle>" "<Handle>" ...)
;;;                ...
;;;                )
;;;--------------------------------------

(defun group:add (hlist gname glist /)
  (cons (cons gname hlist) ; Gruppenname zu Handles hinzu
glist
  )
)
;;;--------------------------------------
;;; Liste mit Handles -> SelectionSet
;;; Argumente: hlist - Liste mit Handles
;;; Rückgabe: Selectionset
;;;--------------------------------------

(defun handlelist->ss (hlist / ss)
  (setq ss (ssadd))
  (foreach handle hlist (ssadd (handent handle) ss))
  ;; Rückgabe
  ss
)
;;;--------------------------------------
;;; SelectionSet -> Liste mit Handles
;;; Argumente: ss - Selectionset
;;; Rückgabe: Liste mit Handles
;;;--------------------------------------

(defun ss->handlelist (ss / i l)
  (setq i -1)
  (if ss
    (repeat (sslength ss)
      (setq l (cons ;; Handle auslesen
    (cdr (assoc 5 (entget (ssname ss (setq i (1+ i))))))
    l
      )
      )
    )
  )
  ;; Rückgabe
  (reverse l)
)

Grüße

Andi

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: 28. Okt. 2007 18:54    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 dawa 10 Unities + Antwort hilfreich

Hallo,
vieles hat Andy ja schon gesagt, hier nochmal eine Variante um das Handle in eine externe Datei ("c:\\test.lsp") zu speichern, und beim wieder laden in einem AWS verwenden.
Code:

;;;Handle von Objekt in Datei sichern
(defun c bj_sichern ( / )
  (JBf_list_sichern(list(cons 1 (cdr(assoc 5 (entget (car (entsel)))))))
    "c:\\test.lsp"))
;;;Objekt in AWS und z.B. schieben
(defun c bj_schieben ( / )
  (command "_.move" (obj_in_aws) "" pause pause))
;;;AWS aus Datei
(defun obj_in_aws ( / )
  (ssadd (handent(cdr(assoc 1 (load "c:\\test.lsp"))))))
;;;Sichern einer Liste in Datei
(defun JBf_list_sichern (liste pfad / datei )
  (setq datei (open pfad "w"))
  (write-line "'(" datei)
  (mapcar '(lambda(A)
    (prin1 A datei))liste)
  (write-line ")" datei)
  (close datei))

Eine Anmerkung noch zum Handle, wenn der Benutzer z.B. Objekte über die Windows-Zwischenablage in eine andere Datei kopiert, dann wird auch ein neues Handle vergeben, dann kann diese Variante nicht funktionieren.

PS: den Smilie bitte in ein "Doppelpunkt" und "o" ändern.

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

Jörn

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

dawa
Mitglied
Schreinermeister

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

Beiträge: 4
Registriert: 27.10.2007

erstellt am: 30. Okt. 2007 18: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

Hallo Andi, hallo Jörn,

erstmal danke euch beiden. Um das zu verdauen (und auch zu testen) werd ich erst mal eine Weile brauchen (Zeitmangel).
Ich werd mich dann demnächst auch wirklich mal meinem Kochbuch widmen. Ab und zu ergibt es auch einen Sinn, wenn man versteht, was man anwendet.

Gruß,
Daniel

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