Autore |
Discussione |
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 11 marzo 2010 : 11:34:00
|
Riporto la discussione sulla manualistica VisualLisp nel suo alveo naturale, aggiungendo altri elenchi più esaustivi. Se sfogliate l'elenco, vi accorgerete che ci sono molte funzioni di Autolisp base, cioè quelle che non hanno bisogno della riga iniziale di codice (vl-load-com) per funzionare, che non vengono normalmente usate.
Elenco-VisualLISP_Functions.pdf 178,43 KB
VLR-VLA-VLAX-tutte-le-funzioni.zip 10,82 KB
elenco-vlax-vl-vlr.pdf 127,67 KB
Vi allego anche tutte le funzioni base che sono utilizzate dagli ExpressTools, contenute nel file ACETUTIL.ARX della cartella Express, ma che possono essere utilizzate anche in modo indipendente in altri codici. ACET-FUNCTIONS.xls 35,42 KB
acetutil.rar 17,21 KB
L'idea di Antonio (su un manuale in Italiano di VisualLisp, di Autolisp esiste già "Il mio LIsp" di Rossi), mi intriga molto, ci devo pensare.
|
Modificato da - joseph in data 11 marzo 2010 11:41:58 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 11 marzo 2010 : 12:12:02
|
ottimo joseph |
|
|
Aniello Annunziata
Amministratore
Regione: Campania
Prov.: Napoli
Città: San Giuseppe Vesuviano
2302 Messaggi |
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 01 giugno 2011 : 09:26:08
|
VisualLISP Books
AutoCADet's Guide to Visual LISP
VisualLISP Developers Bible
VisualLISP Developer's Guide
VisualLISP Tutorials
Autodesk VisualLISP Tutorial |
Modificato da - arri in data 19 dicembre 2012 11:38:39 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 09 febbraio 2013 : 17:06:23
|
Vi allego 2 note sull'uso delle funzioni vla e vlax. Potete caricarle direttamente nell'IDE di VisualLIsp ----
;;; Differenze di comportamento fra le funzioni VLAX... e VLA...
;;; Settaggi iniziali (vl-load-com) (setq acadObj (vlax-get-acad-object)) (setq docObj (vla-get-activedocument acadObj)) (setq MS (vla-get-modelspace docObj)) (setq PS (vla-get-paperspace docObj)) ;;
;;; Esempio: lavorare su un BLOCCO ;;; ;;;Definizione dell'oggetto Blocco (setq obj (car (entsel))) ;<Entity name: 7f734058bc0> (setq obj (vlax-ename->vla-object obj)) ;#<VLA-OBJECT IAcadBlockReference 00000000428ab7e8>
;;; PROPRIETA' ;;; Per estrarre le PROPRIETA' ho a disposizione 3 modalità, che non sempre ;;; forniscono il risultato nella stessa forma.
;;;1^caso: il nome del layer di appartenenza del blocco: (vlax-get-property obj "layer" ) ;--> "0" opp. (vlax-get-property obj 'layer) (vla-get-layer obj) ;--> "0" (vlax-get obj "layer ") ;--> "0" ;;; Tutte le modalità estraggono una stringa dello stesso valore. ;;;2^ caso: estrazione del punto di inserimento del blocco (setq pt (vlax-get-property obj "InsertionPoint")) ;--> #<variant 8197 ...> (setq pt (vla-get-InsertionPoint obj)) ;--> #<variant 8197 ...> (setq pt (vlax-get obj "InsertionPoint")) ;--> (3211.7 1601.06 0.0) ;;; in questo caso le prime due forniscono un variant (un contenitore); ;;; occorre perciò trasformarlo in lista
(setq lst-pt (safearray-value (variant-value pt))) ;--> (3211.7 1601.06 0.0) ;;;naturalmente ottenendo lo stesso valore delle prime 2 modalità
;;; METODI ;;; Per estrarre un METODO ho sempre a disposizione 3 modalità che, come per le proprietà, ;;; non sempre forniscono il risultato nella stessa forma e in più richiedono i dati di ingresso ;;; sotto forme diverse.
;;; Esempio: lavorare su una POLILINEA per trasformarla un Regione ;;; ;;; Definizione dell'oggetto Polilinea (setq pl (car (entsel))) ;<Entity name: <Entity name: 7f734058c10> (setq pl-obj (vlax-ename->vla-object pl)) ;#<VLA-OBJECT IAcadLWPolyline 000000004285fdb8>
;;; La modalità <vlax-invoke> richiede in ingresso una lista e restituisce una lista, per cui semplicemente: (vlax-invoke MS 'addRegion (list pl-obj)) ;--> (#<VLA-OBJECT IAcadRegion 000000002b63dba8>)
;;; Le modalità <vlax-invoke-method> e <vla-addRegion> richiedono invece in ingresso un array ;;; e restituiscono un variant, per cui occorre: ;;; trasformare la lista in array... (setq pl-array (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 0)) (list pl-obj))) ;--> #<safearray...> ;;; applicare una delle due modalità (setq pl-varn (vlax-invoke-method MS 'addRegion pl-array)) ;--> #<variant 8201 ...> (setq pl-varn (vla-addRegion MS pl-array)) ;--> #<variant 8201 ...> ;;;... e infine trasformare il variant in oggetto (setq pl-obj (safearray-value (variant-value pl-varn))) ;--> (#<VLA-OBJECT IAcadRegion 000000002b63bf78>)
;;; Esempio: lavorare su un insieme di 3 polilinee chiuse e 2 cerchi da trasformare in Regioni ;;; applicando il metodo addRegion. ;;; ;Creiamo una selezione di entità (setq selez-ent (ssget "X" '((0 . "*polyline,circle")))) ;--><Selection set: 2eb9>
;trasformiamo la selezione in una lista di oggetti (defun ss2lst (sel / i entNm lst) (setq i -1) (while (setq entNm (ssname sel (setq i (1+ i)))) (setq lst (cons (vlax-ename->vla-object entNm) lst)) ) ) ;_end defun (setq lst-obj (ss2lst selez-ent)) ;;; (#<VLA-OBJECT IAcadLWPolyline 000000004285fdb8> #<VLA-OBJECT IAcadLWPolyline 000000002fedee88> ;;; #<VLA-OBJECT IAcadLWPolyline 000000002feddf88> #<VLA-OBJECT IAcadCircle 000000002feddb08> #<VLA-OBJECT IAcadCircle 000000002fedd748>)
;;;Applichiamo ora il metodo addRegion usando dapprima la 1^ modalità, che accetta in ingresso direttamente una lista di oggetti (setq lst-reg (vlax-invoke MS 'addRegion lst-obj)) ;;;(#<VLA-OBJECT IAcadRegion 000000002b63bc08> #<VLA-OBJECT IAcadRegion 000000002b63cb28> ;;; #<VLA-OBJECT IAcadRegion 000000002b63cff8> #<VLA-OBJECT IAcadRegion 000000002b63be18> #<VLA-OBJECT IAcadRegion 000000002b63b688>)
;;; Le altre due modalità vogliono invece in ingresso un Array, per cui occorre trasformare lst-obj in array... (setq array-obj (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 4)) lst-obj)) ;--> #<safearray...> ;...poi applicare una delle due modalità.... (setq varn-obj (vlax-invoke-method MS 'addRegion array-obj)) ;--> #<variant 8201 ...> (setq varn-obj (vla-addRegion MS array-obj)) ;--> #<variant 8201 ...> ;...e infine trasformare il variant in una lista di oggetti (setq lst-reg (safearray-value (variant-value varn-obj))) ;;;(#<VLA-OBJECT IAcadRegion 000000002b63b738> #<VLA-OBJECT IAcadRegion 000000002b63b898> ;;;#<VLA-OBJECT IAcadRegion 000000002b63bd68> #<VLA-OBJECT IAcadRegion 000000002b63ab88> #<VLA-OBJECT IAcadRegion 000000002b63ac38>)
;;; Se ne deduce che la prima modalità è più veloce. |
Modificato da - joseph in data 09 febbraio 2013 17:07:19 |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 febbraio 2013 : 09:31:32
|
Giusto un integrazione all'intervento di Joseph. Ho scritto tempo fa queste due funzioni per la trasformazione di un variant in una lista e viceversa. La funzione variant2lista usa le funzioni sublist, per costruire una sottolista partendo da un indice nella lista stessa e per una certa lunghezza e la funzione split-list (non opera mia) che sfrutta la recorsività, argomento che digerisco sempre con molta fatica, il mio punto debole.
;;; ***************************FUNZIONE VARIANT2LISTA*******************************
;;; Trasforma un variant in una lista a gruppi con numero elementi per gruppo
(defun variant2lista (listavariant numero / listaparz listafin)
(split-list (safearray-value (variant-value listavariant)) numero)
)
(defun sublist (lst start leng / n r)
(if (or (not leng) (< (- (length lst) start) leng))
(setq leng (- (length lst) start))
)
(setq n (+ start leng))
(repeat leng
(setq r (cons (nth (setq n (1- n)) lst) r))
)
)
(defun split-list (lst n)
(if lst
(cons (sublist lst 0 n)
(split-list (sublist lst n nil) n)
)
)
)
;;; ***************************FUNZIONE LISTA2VARIANT*******************************
;;; Trasforma una lista a gruppi in un variant
(defun lista2variant (listanormale / array)
(setq listanormale(apply 'append listanormale))
(setq array(vlax-make-safearray vlax-vbDouble (cons 0 (- (length listanormale) 1))))
(vlax-make-variant (vlax-safearray-fill array listanormale))
) |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 11 febbraio 2013 : 15:21:19
|
Non parlarmi di ricorsività: ogni volta parto dal fattoriale, faccio due tentativi con le funzioni e poi abbandono subito: non ho ancora trovato chi mi dia la chiave giusta per entrare in questo meccanismo: o forse è il mio cervello che non riesce ad astrarre più di tanto. |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 11 febbraio 2013 : 15:52:24
|
A proposito di recorsività, ho qui una funzione che per me rappresenta ancora un mistero il suo funzionamento e così altre funzioni simili:
(defun remove_doubles (lst)
(if lst
(cons (car lst)(remove_doubles (vl-remove (car lst) lst)))
)
)
E' una semplice funzione per l'eliminazione degli elementi doppi nelle liste, straordinaria e potente nella sua semplicità. Ho provato a verificarla step by step per capire il suo funzionamento ma ancora non ci sono venuto fuori. La lista in questione si riduce man mano che gli elementi scorrono e fin qui tutto bene. Ad un certo punto la funzione richiama se stessa e la lista si ricrea (!). Anch'io sono costretto a rivolgere domande di lisp... |
Modificato da - Terminator in data 11 febbraio 2013 16:06:10 |
|
|
Discussione |
|