FastFiber

Kan een lisproutine zelf lisproutines aanmaken?

Gestart door Reimer, do 08 07 2010, 11:48:02

Vorige topic - Volgende topic

Reimer

Ik heb nu een aantal lisproutines om kaders in te voegen (kA1, kA2, etc)
(defun c:kA1 (...
(defun c:kA2 (...
etc.

Kan een lisproutine aan de hand van een lijst (setq LIJST (list "A1" "A2" ect)) zelf de diverse lisproutines aanmaken in autocad? Ik kan denk ik wel een manier bedenken om de juiste tekst op een rijtje te krijgen, maar hoe laad ik die in autocad vanuit de lopende routine?

Ik hoop dat mijn probleemstelling duidelijk is.

Reimer

roy_043

#1
Citaat van: Reimer op do 08 07 2010, 11:48:02Kan een lisproutine aan de hand van een lijst (setq LIJST (list "A1" "A2" ect)) zelf de diverse lisproutines aanmaken in autocad?
Antwoord:
Ja

Voorbeeld:

(defun c:maaklisp ( / lst)
 (setq lst '("c:test0" "c:test1" "c:test2" "c:test3" "c:test4"))
 (foreach item lst
   (set (read item) (list '() (list 'princ item)'(princ)))
   (princ (strcat "\nfunctie " item " aangemaakt "))
 )
 (princ)
)

Vreemd genoeg moeten de functies in Bricscad aangeroepen worden met (c:test0) etc.

Leesvoer:
http://www.autolisp.mapcar.net/templates.html

Advies:
Gebruik liever deze constructie:

(defun InsertKader (formaat / )
 (setq formaat (strcase formaat))
 (cond
   ((= (formaat "A0"))
     ...
   )
   ((= (formaat "A1"))
     ...
   )
   ...
 )
)

(defun c:kA1 ()
 (InsertKader "A1")
 (princ)
)


<EDIT>In de functie c:maaklisp stond een quote teveel</EDIT>

EddyBeerke

Citaat van: roy_043 op do 08 07 2010, 12:59:37
<EDIT>In de functie c:maaklisp stond een quote teveel</EDIT>
Volgens mij kun je beter een nieuw antwoord geven in de post dan met EDIT iets wijzigen.
Wanneer je dat tocht doet krijgt de gene die de post al gelezen hebben niet de melding dat het om een gewijzigde post (eigenlijk nieuw qua tekst) gaat.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

EddyBeerke

Je kunt in je lisp toch (load "joulisp.lsp") zetten en dan aanroepen met een commando:
(command "joucommando")

De code die jou lisp heeft gemaakt:
(defun C:joucommando ()
(princ "Mijn commando werkt!")
(princ)
)

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

Reimer

Bedankt voor jullie reacties. Ik ben al aan het testen gegaan. Het (2e) advies van Roy en de tip van EddyBeerke lijken volgens mij op elkaar. Dit principe gebruik ik nu al.

Met de eerste tip van Roy is het mij nu gelukt om een variabele te vullen, waarbij de variabele naam uit een lijst gehaald wordt. Toch heb ik hiermee nog niet een nieuw commando gemaakt.
Eigenlijk wil ik graag dat de hoofd lisproutine de volgende regels laad in acad:

(setq REGEL0 "(defun c:kA0 (/) (princ \"Het commando kA0 is aangemaakt\"))")
(setq REGEL1 "(defun c:kA1 (/) (princ \"Het commando kA1 is aangemaakt\"))")

Dit lukt me nog niet met de tip van Roy.
Het doel is eigenlijk dat ik straks voor het aanmaken van een extra papierformaat alleen maar 1 of 2 regels aan de lisp hoef toe te voegen, waarna de lisp automatisch een nieuwe functie aanmaakt. (setq LST '("kA1" "kA2" "kNew"))

Zijn er nog meer ideeën? Of moet ik iets anders doen?

Reimer

roy_043

Citaat van: Reimer op vr 09 07 2010, 08:39:38Het (2e) advies van Roy en de tip van EddyBeerke lijken volgens mij op elkaar.
Nee, volgens mij niet.

Het helpt als je vertelt wat het verschil is tussen, bijvoorbeeld, het commando KA0 van het commando KA1.

HofCAD

ACADcadabra

Reimer

Ik weet nog niet of ik dit project ga afmaken aangezien we net besloten hebben om het aanmaken van layouts op een totaal andere manier te gaan aanpakken. Desondanks vind ik dit een zeer interessant onderwerp.

De huidige commando's kA1, kA2, etc doen niets anders dan een block inserten op de juiste plaats.
(defun c:kA1 () (command "-insert" "kaderA1" "0,0" "1" ""  "0"))
Op deze manier heb ik al onze bestaande formaten in een lisproutine opgenomen.
Wat nu mijn bedoeling is, is dat andere gebruikers (zonder lisp kennis) bijvoorbeeld aan het begin van onze lisp-file een regel kunnen toevoegen met daarin een nieuwe kadernaam (bv. A0verlengd) met het daarbij horende blocknaam (kaderA0verlengd.dwg). Dit kan bijvoorbeeld in lijsten worden gezet. Vervolgens wil ik graag dat de lisproutine bij het openen van een dwg zelf de verschillende routines gaat aanmaken.

Ik heb nog niet nagedacht over hoe dit allemaal moet werken, maar voordat ik daaraan begin wil ik wel graag weten of het mogelijk is om automatisch voor ieder kadernaam in de lijst een aparte commando aan te maken.

Met de tip van Hofcad heb ik in iedergeval weer iets nuttigs geleerd: eval.

(setq name (strcase (getstring "\nNaam van de funktie <BLOND>: "))); vraag de gebruiker om een naam
(setq deffunc (strcat "(defun " name "(X)" "(sqrt X))")); stel een regel samen die de lisproutine vormt
(eval (print (read deffunc))); evalueer de regel, hierbij wordt hij als commando in acad geladen.

Voorlopig zal ik niet actief met dit onderwerp bezig zijn omdat we ons nu richten op een nieuw tekeningbeheersysteem.
Iedereen bedankt voor de moeite.

Reimer

roy_043

Voor wat het waard is. Ik zou het zo oplossen:
(defun c:kL0 () (InsertKader "kaderA0verlengd"))
(defun c:kA0 () (InsertKader "kaderA0"))
(defun c:kA1 () (InsertKader "kaderA1"))
(defun c:kA2 () (InsertKader "kaderA2"))

(defun InsertKader (blocknaam) (command "-insert" blocknaam "0,0" "1" ""  "0"))