Newsgroup: it.comp.software.cad
Titolo: Programmazione in Autolisp

Mi piacerebbe avere scambi di opinione con qualcuno che programma in
Autolisp come me.
Ciao Giovanni.

...


 ha scritto nel messaggio
news:8dcq79$fr$1...@pegasus.tiscalinet.it...


Autolisp come me.
Che manuale per imparare Autolisp mi consigli ?

 (...)  Che manuale per imparare Autolisp mi consigli ?
Giovanni risponde:
Ho iniziato con un piccolo manuale nero (che ora non ho più o non trovo), mi
pare di un certo Mauro Agosto, adatto soprattutto per iniziare perchè
spiegava le cose con semplici esempi.
Ho anche:
- A.Gesner - J.Smith, Autolisp tecniche di programmazione, Jackson, 1993.
Abbastanza ben fatto, con molte informazioni, ma l'ho usato molto poco ed è
un po' vecchiotto.
Il manuale che ho usato di più  è:
- AutoCAD Release 13 - manuale di personalizzazione, Autodesk, 1995.
il suo punto di forza è la completezza e la presenza del manuale del "Dialog
Language Control (DCL)" per creare finestre di dialogo e che raramente trovi
negli altri manuali.
Dovresti avercelo, lo danno con il programma ...
Ho letto sulle News che il cuggino di un tale, che aveva sul comp. l'AC2K,
un giorno, cercando  con "cerca file: *.pdf" la guida del CD-ROM ha trovato
in una sottocartella del suddetto programma tre files molto interessanti.
Questo ho letto.
Ciao Giovanni.

 Autolisp come me.
Ha trovato [per il momento] tre persone interessate. Quindi:
---------------------------------------------------------------------------
Propone qualche convenzione:
 §      = stringa di testo
 £      = lista
 #      = numero intero
 #.#   = numero reale
 PT   = punto 2D (#.#   #.#) o 3D (#.#   #.#   #.#)
 ca    = comando autocad [ad es: line]
 fl     = una funzione lisp preconfezionata della Autodesk
           [ad es. (getpoint PT §)  oppure (nth # £)]
 flp   = una funzione lisp personale ovvero "fatta in casa" [o ufficio]
 cl    = comando lisp: una flp del tipo   [ (defun c:nome ( / ) ...) ]
 pl    = procedura lisp: una flp del tipo [ (defun p:nome ( / ) ...) ] *
 ar    = argomento di una flp [o di un ca] ed eventualm. prefisso **
 vi    = variabile privata (interna) di una flp ed eventualm. prefisso **
 ve    = variabile pubblica (esterna) di una flp ed eventualm. prefisso **
* uso il prefisso p: (del tutto trasparente per il lisp) per meglio
distinguerlo dal precedente caso.
** ecco un esempio cumulativo per ar, vi, ve nella  seguente flp:
  (defun p:patetica ( ar1 ar2 / vi1 vi2)
     (setq vi1 (car ar1) vi2 (car ar2))
     (setq ve1 (+ vi1 vi2) ) ) )
N.B.: sono richiesti pareri discordi, altrimenti di che parliamo?
---------------------------------------------------------------------------
Sperando di non essere rimasto nuovamente solo lancia qualche spunto di
discussione:
--
1) Quale è la differenza tra il lisp e l'autolisp? Personalmente sono
arrivato alle seguenti conclusioni:
- il lisp è uno dei primi linguaggi di programmazione bla, bla...
- l'autolisp è uno dei tanti "dialetti" derivati dal primo.
- io non lispo, autolispo come del resto credo faccia chiunque stia
leggendo, ma per comodità e del tutto in buona fede ciascuno di noi dichiara
di lispare.
[se qualcuno lispa-lispa, nel senso che conosce la "lingua antica", non mi
dispiacerebbe se mi facesse un fischio, navigando qua e la ho trovato dei
files con delle flp in "latino" di cui mi piacerebbe conoscere la traduzione
]
--
2) Ieri sono stato "folgorato" dalla fl (initget # §);  sono finalmente
riuscito a far accettare al lisp il fatto che ad un (getpoint PT §) si
potesse rispondere con una §.
Premetto quello che non sono riuscito a fare: usare un ca di cui non si
conoscano in partenza gli ar all'interno di una flp [che dite ho esagerato
con le convenzioni?]; in altre parole avrei voluto disegnare "in tempo
reale" una polilinea restando all'interno di una flp [vedi sotto c:utopia?],
per poi elaborare le coordinate dei punti [che so già come estrarre dalla
pline].
Per aggirare il problema, ho fatto in modo che al "getpoint" si potesse
rispondere con Orto per settare il segmento successivo come ortogonale, o
con Indietro per eliminare il segmento precedente, o con Invio per
interrompere la richiesta di PT, o con Chiudi per interrompere la richiesta
di PT e chiudere la pline; questo mi ha permesso di creare una pline o
analogamente una spline restando dentro alla flp.
N.B. Se qualcuno sapesse come farlo meglio o usando in maniera opportuna
(command "pline") e volesse aiutarmi, grazie mille; quella che segue può
essere una traccia; inoltre allego un paio di funzioncine FREE interessanti
e funzionanti fatte da me:
(defun p:prendipunti (pol / vi1 ... vin) ...)
(defun p:fai_ciò_che_sai_dei_punti (£PT / vi1 ... vin) ...)
(defun c:utopia? (/ pol £PT )
 (command "pline")
 (setq pol (entget (entlast)))
 (setq £PT (p:prendipunti pol))
 (p:fai_ciò_che_sai_dei_punti £PT))
-
(defun £COM (£)
 (mapcar 'command £))
(defun DPLINE (£PT §)
 (£COM (append (list "_PLINE")   £PT   (list (if § "c" "")))))
--
 3) Il calcolo matriciale con l'Autolisp se interessa a qualcuno [a me
molto] se ne puo parlare. Per darne "general barlume in conciso" dirò che
per le operazioni su matrici [ho fatto qualcosa ma va ottimizzato] le ho
definite come ££ ovvero liste di liste:
  M3x2 = ((#.#   #.#) (#.#   #.#) (#.#   #.#))
  M2x3 = ((#.#   #.#   #.#) (#.#   #.#   #.#))
--
4) A chi non lo conoscesse consiglio di seguire Reini Urban su uno dei
seguenti newsgroup [ed in particolare a Spider che chiedeva cosa usare per
imparare]:
-   comp.cad.autocad   -   alt.cad.autocad   -   alt.answers   -
comp.answers
-   news.answers
ed in particolare di leggere i due seguenti files (di cui esiste anche una
versione in francese ma non in italiano)
- comp.cad.autocad AutoLISP FAQ (part 2/2) - samples, code
- comp.cad.autocad AutoLISP FAQ (part 1/2) - general
---------------------------------------------------------------------------
Per il momento crede di aver buttato la abbastanza argomenti e vi saluta
ciao Giovanni

Attenzione siamo sparsi su due NG:
che ne dite di fondere i due gruppi?
E se si quale?
it.comp.software.architettura
it.comp.software.cad
Ciao Giovanni

Ciao Giovanni.
Certo che tutte quelle abbreviazioni un pò confondono, comunque proviamo.
1) Io scrivo solo in Autolisp per autocad per ovvie ragioni di necessità,
però ho letto qualche strana cosa sul common lisp, come se anche queste
varianti fossero in grado di operare su autocad (mi sembra strano).
2) A suo tempo ho risolto facendo disegnare la polilinea successivamente ai
punti dati:
	(initget 1)
	(setq pt (getpoint "\nPrimo vertice: " ))
	(setq ptlist (append ptlist (list pt)))
	(setq ptold pt)
	(while (setq pt (getpoint "\nAltro vertice: " pt))
		(grdraw ptold pt 7 1) 
		(setq ptold pt)
		(setq ptlist (append ptlist (list pt)))
	)
	(command "_pline")
	(foreach pt ptlist (command pt))
	(command "")
Un problema che vorrei risolvere per un applicativo più corposo a cui stò
pensando/lavorando è la necessità di creare Dialog box non con il dcl ma in
VB (questo perchè mi servono più pagine sullo stesso dialog box).
Hai un'idea su come far leggere le variabili utente (ve) definite in lisp a
vb e viceversa?
Saluti Mario S.
A proposito, com'e che funzionano anche gli altri prefiissi m: , p: alla
funzione defun?

 [...] com'e che funzionano [i] prefissi m: , p: alla funzione defun?
----------------------------------------------------------------
- m:  Io non ne ho parlato, non c'ero e se c'ero dormivo. Non so che dirti,
credo non esista, poi provo.
- p:  Si torna qua alle convenzioni: nell'ottica di distinguere nell'insieme
delle flp (funzioni lisp personali)
 i cl (comandi lisp) dalle pl (procedure lisp) proponevo di aggiungere il
prefisso p: alle seconde che e' pero' del tutto fittizio; se chiamassi una
tua pl "p:pippo" per autocad questa si chiamerebbe per intendersi
"pduepuntipippo"; diverso e' (come credo saprai) il prefisso "c:", di modo
che un eventualo cl "p:pippo" per autocad si chiamerebbe "pippo" ed in più
sarebbe da potersi eseguire scrivendo al Command: pippo,
mentre l'altra cosi' Command (p:pippo). Forse questa e un po' troppo una
sega mentale e quindi credo che si possa lasciar perdere il "p:", che
potrebbe in effetti confondere.
-------------------------------------------------------------
Ciao Giovanni

Ciao Giovanni
Anche io uso sempre gli stessi nomi per le variabili e sintassi tipiche per
le funzioni ma è probabile che dopo anni passati ad utilizzare certi
criteri, i propri sembrino leggibilissimi e quelli degli altri meno.
Di solito uso sintassi del tipo:
ss - gruppo di selezione
p1 - primo punto
p2 - secondo punto
ent - entità selezionata
noment - nome entità
datent - dati entità
cont - contatore
ecc. 
Comunque serco di date nomi che abbiano un senso (anche superando 6
caratteri).
Per quato riguarda la tua funzione ho capito cosa intendi, devo avere il
tempo di guardarmela più a fondo.
Ho capito il discorso del c: o p: o m:, semplicemente i nomi che vedevo
tipo m:qwert erano solo nomi di funzioni e non di comandi, molte grazie.
Scusa se sono stato sintetico ma a volte il tempo è poco per fare tutto.
Darò un'occhiata alla tua funzione.
Se ti serve qualche "pezzo"  di programma fammi sapere, magari mi è già
capitato di buttarlo giu. 
Saluti Mario S.

 Scusa se sono stato sintetico ma a volte il tempo č poco per fare tutto.
Scusatissimo, anch'io in questo massaggio mi tratterro' dall'essere troppo prolisso
A presto
___________
Ciao Giovanni

Ciao Giovanni, ti ringrazio ma la soluzione dcl mi stà stretta. Avrei
voglia di studiarmi l'ARX ma io non sono un programmatore e non so se il C
è accessibile in breve tempo.
Con un amico sto cercando di fare un applicativo nel ramo impianti (ma dato
che il lavoro normale è necessario per la pappa quotidiana, la cosa và un
pò alle lunghe).
Saluti Mario S.