Guida Ad Auto Lisp

Autolisp per utonti

Date: Cominciato il 1/1/2005

Sommario:

Questa guida spero possa essere utile a chi si e' mai chiesto se con autolisp e' possibili velocizzare il lavoro con Autocad. Dalla versione 12, che girava su Unix/Linux, ad oggi, il linguaggio non e' cambiato, mantenendo quindi la compatibilita' con il passato, e anche un sistema di manipolazione dei dati alquanto complicato.

Tutto il materiale e' coperto da copyleft, potete farci quello che volete. Questo e' un wiki, potete anche editarlo.

Se volete una versione pdf basta che clicchiate sull'apposito link in alto o in basso.

Attenzione

Tutti i programmi LISP esistenti in internet fanno riferimento alla versione in lingua INGLESE, NON USATE ALTRE VERSIONI!

La versione corretta di un AutoCAD e' quella in inglese, perche' i comando, sfortunatamente, sono tradotti. Se Provate ad usare un qualunque programma AutoLisp su internet, nella vostra versione localizzata, 9 volte su 10 non vi funzionera'.

Ce' un rimedio!, Basta sostituire il file acad.pgp' presente con quello della versione inglese, eccolo (zippato): Attach:acad.pgp.zip

Introduzione

Autolisp, ma il LISP in generale, e' un linguaggio di programmazione che ha una struttura ben determinata, fortemente diversa da altri linguaggi. Ogni funzione o comando deve essere racchiuso tra parentesi tonde (), inoltre ogni comando e' la prima parola all'interno delle parentesi; la struttura e' quindi la seguente:

 (COMANDO ARGOMENTO1 ARGOMENTO2)
 (COMANDO ARGOMENTO1 (comando argomento))

Per esempio per sommare due numeri:

 (+ 1 2)

Un file Autolisp e' un normalissimo file di testo con estensione .lsp, e puo' essere scritto con qualunque editor di testi, come il semplice Blocco di windows. (mi raccomando non usate mai Word che combina solo pasticci con i file, perche' e' un word-processor e perche' e' micro$oft ;-) ).

Per caricare un file Autolisp e' necessario lanciare il comando:

 appload

In Lisp, come altri linguaggi di programmazione, il valore come FALSO viene considerato il valore 0 (zero), mentre viene considerato come VERO qualsiasi altro valore. Per facilitare la comprensione dei programmi si puo' mettere anche la lettere F al posto del valore FALSO e la lettera T (true) al posto del valore vero.

 (getstring T "Scrivi nome e cognome:")

Convenzioni tipografiche

Quando in questo testo verra mostrato come si scrive un comando, si seguira' la seguente sintassi:

 (comando argomento_obbligatorio [argomento opzionale])

Prima di cominciare

E' bene conoscere dei comandi che ci risparmiano del tempo prezioso per ottenere alcuni risultati, senza dover ricorrere ad autolisp:

BOUNDARY
Crea una polilinea da una serie di linee chiuse
CAL
Calcolatrice multifunzione
DIVIDE
Divide un oggetto in numero uguale di parti facendo apparire dei punti di demarcazione (non divide nulla effettivamente)
DONUT
Crea ciambelle bidimensionali
DRAWORDER
Come scegliere quello che appare sopra al resto
DSVIEWER
Metodo molto comodo per muoversi nel disegno, usa i tasti dx e sx del mouse per fermarti
FILTER
per selezionare oggetti che corrispondono a determinati requisiti
FIND
Cerca test all'interno del disegno
GROUP
come i blocchi, si possono fare i gruppi, ma sono piu' difficili da esplodere
IMAGE
Gestore delle immagini
IMAGEADJUST
Editor di immagini
IMAGECLIP
Decidi i limiti dell'immagine
LIST
Lista l'elenco delle informazioni di un elemento
MENU
Carichi le macro dei menu
MINSERT
I blocchi inseriti con questo comando non possono essere esplosi
PASTEBLOCK
incolla la clipboard come un blocco
PASTEORIG
incolla la selezione con la stessa origine di dove e' stata presa, cosi' si evita di dover riposizionare precisamente
PEDIT
Poliline edit
PUBLISH
Crea un documento autocad non editabile che si vede con VoloView
PUBLISHTOWEB
Crea un documento autocad non editabile che si vede in un browser
QDIM
Quotatura rapida, si seleziona un oggetto, e dopo partono in automatiche le quote nella direzione che indicate
QSELECT
La soluzione finale a tutti i problemi, o quasi, volete selezionare qualcosa che e' difficile, con questo comando si riesce a selezionare qualsiasi cosa in base ad un qualunque criterio: provare per credere.
RENAME
cambia il nome di un oggetto
SKETCH
Scarabocchiare il disegno come i programmi di grafica
TIME
Da' varie informazioni

Struttura di un file Autolisp

Un file autolisp e' un normalissimo file di testo con estensione LSP, per poter essere eseguito deve essere caricato dal programma autocad con il comando APPLOAD. Il punto e virgola (;) e' interpretato da autocad come l'inizio di un commento, percio' tutto quello che segue il punto e virgola e' ignorato fino alla fine della riga.

Impostare una variabile

Per impostare una variabile c'e' il comando SETQ, per esempio per impostare la variabile x con il valore 3:

 (setq x 3)

Per richiamare il valore di una variabile, si usa il punto esclamativo (!), per esempio per richiamare il valore della variabile x:

 !x

Inoltre, si puo' lavorare con le variabili di sistema di autocad, per esempio CLAYER e' la variabile contiene il numero del layer corrente.

Impostare una variabile di sistema

Le varibili di sistema, sono variabili gia' impostate da Autocad il cui valore indica uno stato o una impostazione, per esempio se la varibile SNAPMODE ha il valore 1 allora lo SNAP e' attivo, se ha il valore 0 lo SNAP e' disattivato.

Le varibili di sistema sono di tre tipi:

Stringhe
Il valore viene sempre indicato fra virgolette, e puo' essere un qualunque insieme di carattere (lettere o numeri) compreso di spazi, esempi:
"C:", "3.1", "tanto va la gatta al lardo..."
Interi
Sono numeri senza virgola, sia positivi che negativi, compresi tra -32768 e +32761 (16 bit). Se si utilizzano valori maggiori o minori di essi sorge un errore che pero' non viene segnalato. Esempi:
115, 23, -12, -1156
Reali
Sono numeri con il punto, deve sempre essere indicata una cifra sia prima che dopo il punto. La lettera E indica "per 10 elevato", quindi 5E+2 significa 5*10^2 .Esempi:
0.43, 12.0, 56.87, 1.23E+17, 4.6E-5
Liste
Le liste sono insiemi di valori raggruppati da parentesi, i punti, per esempio, sono liste di almeno due valori reali, la coordinata X e la coordinata Y del punto. Se si lavora in 3 dimensioni allora i punti avranno tre coordinate (X Y Z), esempio:
(10.2 2.5 5.0)

Non tutte le variabili di sistema possono essere modificate, alcune sono in "sola lettura". L'area di una figura geometrica rimane cio' che e' non e' possibile modificarla (bisogna modificare la figura); la variabile che indica il layer corrente non puo' essere impostata con un nome immaginario, il nome deve corrispondere ad un layer gia' esistente.

Le variabili di sistema sono totalmente scollegate dalle variabili normali, e possono avere anche lo stesso nome, tanto per richiamarle e modificarle si utilizzano comandi diversi.

Per conoscere tutte la variabili di sistema basta digitare SETVAR, poi ? e infine *:

 SETVAR
 Enter variable name or [?]: ?
 Enter variable(s) to list <*>: *
 ACADLSPASDOC      0 
 ACADPREFIX         
 "C:\Programmi\ACAD2000\support;C:\Programmi\ACAD2000\fonts;C:..." (read only) 
 ACADVER           "15.0"                               (read only) 
 ACISOUTVER        40 
 AFLAGS            0 
 ANGBASE           0 
 ANGDIR            0 
 APBOX             0 
 APERTURE          10 
 AREA              0.0000                               (read only) 
 ATTDIA            0 
 ATTMODE           1 
 ATTREQ            1 
 AUDITCTL          0 
 AUNITS            0 
 AUPREC            0 
 AUTOSNAP          55 
 BACKZ             0.0000                               (read only) 
 BINDTYPE          0 
 BLIPMODE          0 
 CDATE             20050209.11534074                    (read only) 
 Press ENTER to continue: 
 CECOLOR           "BYLAYER" 
 CELTSCALE         1.0000 
 CELTYPE           "BYLAYER" 
 CELWEIGHT         -1 
 CHAMFERA          10.0000 
 CHAMFERB          10.0000 
 CHAMFERC          20.0000 
 CHAMFERD          0 
 CHAMMODE          0 
 CIRCLERAD         0.0000 
 CLAYER            "0" 
 CMDACTIVE         1                                    (read only) 
 CMDDIA            1 
 CMDECHO           1 
 CMDNAMES          "SETVAR"                             (read only) 
 CMLJUST           0 
 CMLSCALE          20.0000 
 CMLSTYLE          "STANDARD" 
 COMPASS           0 
 COORDS            1 
 CPLOTSTYLE        "ByColor" 
 CPROFILE          "<<Unnamed Profile>>"                (read only) 
 CTAB              "Model" 
 Press ENTER to continue: 
 CURSORSIZE        5 
 CVPORT            2 
 DATE              2453411.60437235                     (read only) 
 DBMOD             4                                    (read only) 
 DCTCUST           "C:\Programmi\ACAD2000\support\sample.cus" 
 DCTMAIN           "enu" 
 DEFLPLSTYLE       "ByColor" 
 DEFPLSTYLE        "ByColor" 
 DELOBJ            1 
 DEMANDLOAD        3 
 DIASTAT           0                                    (read only) 
 DIMADEC           0 
 DIMALT            OFF 
 DIMALTD           3 
 DIMALTF           0.0394 
 DIMALTRND         0.0000 
 DIMALTTD          3 
 DIMALTTZ          0 
 DIMALTU           2 
 DIMALTZ           0 
 DIMAPOST          "" 
 DIMASO            ON 
 DIMASZ            2.5000 
 Press ENTER to continue: 
 DIMATFIT          3 
 DIMAUNIT          0 
 DIMAZIN           0 
 DIMBLK            "" 
 DIMBLK1           "" 
 DIMBLK2           "" 
 DIMCEN            2.5000 
 DIMCLRD           0 
 DIMCLRE           0 
 DIMCLRT           0 
 DIMDEC            2 
 DIMDLE            0.0000 
 DIMDLI            3.7500 
 DIMDSEP           "," 
 DIMEXE            1.2500 
 DIMEXO            0.6250 
 DIMFIT            3 
 DIMFRAC           0 
 DIMGAP            0.6250 
 DIMJUST           0 
 DIMLDRBLK         "" 
 DIMLFAC           1.0000 
 DIMLIM            OFF 
 Press ENTER to continue: 
 DIMLUNIT          2 
 DIMLWD            -2 
 DIMLWE            -2 
 DIMPOST           "" 
 DIMRND            0.0000 
 DIMSAH            OFF 
 DIMSCALE          1.0000 
 DIMSD1            OFF 
 DIMSD2            OFF 
 DIMSE1            OFF 
 DIMSE2            OFF 
 DIMSHO            ON 
 DIMSOXD           OFF 
 DIMSTYLE          "ISO-25"                             (read only) 
 DIMTAD            1 
 DIMTDEC           2 
 DIMTFAC           1.0000 
 DIMTIH            OFF 
 DIMTIX            OFF 
 DIMTM             0.0000 
 DIMTMOVE          0 
 DIMTOFL           ON 
 DIMTOH            OFF 
 Press ENTER to continue: 
 DIMTOL            OFF 
 DIMTOLJ           0 
 DIMTP             0.0000 
 DIMTSZ            0.0000 
 DIMTVP            0.0000 
 DIMTXSTY          "Standard" 
 DIMTXT            2.5000 
 DIMTZIN           8 
 DIMUNIT           2 
 DIMUPT            OFF 
 DIMZIN            8 
 DISPSILH          0 
 DISTANCE          0.0000                               (read only) 
 DONUTID           10.0000 
 DONUTOD           20.0000 
 DRAGMODE          2 
 DRAGP1            10 
 DRAGP2            25 
 DWGCHECK          0 
 DWGCODEPAGE       "ANSI_1252"                          (read only) 
 DWGNAME           "Drawing1.dwg"                       (read only) 
 DWGPREFIX         "C:\Programmi\ACAD2000\"             (read only) 
 DWGTITLED         0                                    (read only) 
 Press ENTER to continue: 
 EDGEMODE          0 
 ELEVATION         0.0000 
 EXPERT            0 
 EXPLMODE          1 
 EXTMAX            -1.0000E+20,-1.0000E+20,-1.0000E+20  (read only) 
 EXTMIN            1.0000E+20,1.0000E+20,1.0000E+20     (read only) 
 EXTNAMES          1 
 FACETRATIO        0 
 FACETRES          0.5000 
 FILEDIA           1 
 FILLETRAD         10.0000 
 FILLMODE          1 
 FONTALT           "simplex.shx" 
 FONTMAP           "C:\Programmi\ACAD2000\support\acad.fmp" 
 FRONTZ            0.0000                               (read only) 
 FULLOPEN          1                                    (read only) 
 GRIDMODE          0 
 GRIDUNIT          10.0000,10.0000 
 GRIPBLOCK         0 
 GRIPCOLOR         5 
 GRIPHOT           1 
 GRIPS             1 
 GRIPSIZE          3 
 Press ENTER to continue: 
 HANDLES           1                                    (read only) 
 HIDEPRECISION     0 
 HIGHLIGHT         1 
 HPANG             0 
 HPBOUND           1 
 HPDOUBLE          0 
 HPNAME            "ANGLE" 
 HPSCALE           1.0000 
 HPSPACE           1.0000 
 HYPERLINKBASE     "" 
 IMAGEHLT          0 
 INDEXCTL          0 
 INETLOCATION      "C:\Programmi\ACAD2000\Home.htm" 
 INSBASE           0.0000,0.0000,0.0000 
 INSNAME           "" 
 INSUNITS          4 
 INSUNITSDEFSOURCE 4 
 INSUNITSDEFTARGET 4 
 ISAVEBAK          1 
 ISAVEPERCENT      50 
 ISOLINES          4 
 LASTANGLE         0                                    (read only) 
 LASTPOINT         326.0832,118.2193,0.0000 
 Press ENTER to continue: 
 LASTPROMPT        "LASTANGLE         0                                     
 (read..." (read only) 
 LENSLENGTH        50.0000                              (read only) 
 LIMCHECK          0 
 LIMMAX            420.0000,297.0000 
 LIMMIN            0.0000,0.0000 
 LISPINIT          1 
 LOCALE            "ITA"                                (read only) 
 LOGFILEMODE       0 
 LOGFILENAME       "C:\Programmi\ACAD2000\Drawing1_1_1_0041.log" (read only) 
 LOGFILEPATH       "C:\Programmi\ACAD2000\" 
 LOGINNAME         "max"                                (read only) 
 LTSCALE           1.0000 
 LUNITS            2 
 LUPREC            4 
 LWDEFAULT         25 
 LWDISPLAY         OFF 
 LWUNITS           1 
 MAXACTVP          64 
 MAXSORT           200 
 MBUTTONPAN        1 
 MEASUREINIT       1 
 MEASUREMENT       1 
 MENUCTL           1 
 Press ENTER to continue: 
 MENUECHO          0 
 MENUNAME          "C:\Programmi\ACAD2000\support\acad" (read only) 
 MIRRTEXT          1 
 MODEMACRO         "" 
 MTEXTED           "Internal" 
 NOMUTT            0 
 OFFSETDIST        1.0000 
 OFFSETGAPTYPE     0 
 OLEHIDE           0 
 OLEQUALITY        1 
 OLESTARTUP        0 
 ORTHOMODE         0 
 OSMODE            39 
 OSNAPCOORD        2 
 PAPERUPDATE       0 
 PDMODE            0 
 PDSIZE            0.0000 
 PELLIPSE          0 
 PERIMETER         0.0000                               (read only) 
 PFACEVMAX         4                                    (read only) 
 PICKADD           1 
 PICKAUTO          1 
 PICKBOX           3 
 Press ENTER to continue: 
 PICKDRAG          0 
 PICKFIRST         1 
 PICKSTYLE         1 
 PLATFORM          "Microsoft Windows NT Version 5.1 (x86)" (read only) 
 PLINEGEN          0 
 PLINETYPE         2 
 PLINEWID          0.0000 
 PLOTID            "" 
 PLOTROTMODE       2 
 PLOTTER           0 
 PLQUIET           0 
 POLARADDANG       "" 
 POLARANG          90 
 POLARDIST         0.0000 
 POLARMODE         0 
 POLYSIDES         4 
 POPUPS            1                                    (read only) 
 PROJECTNAME       "" 
 PROJMODE          1 
 PROXYGRAPHICS     1 
 PROXYNOTICE       1 
 PROXYSHOW         0 
 PSLTSCALE         1 
 Press ENTER to continue: 
 PSPROLOG          "" 
 PSQUALITY         75 
 PSTYLEMODE        1                                    (read only) 
 PSTYLEPOLICY      1 
 PSVPSCALE         0.00000000 
 PUCSBASE          "" 
 QTEXTMODE         0 
 RASTERPREVIEW     1 
 REFEDITNAME       ""                                   (read only) 
 REGENMODE         1 
 RTDISPLAY         1 
 SAVEFILE          ""                                   (read only) 
 SAVEFILEPATH      "C:\DOCUME~1\max\IMPOST~1\Temp\" 
 SAVENAME          ""                                   (read only) 
 SAVETIME          15 
 SCREENBOXES       0                                    (read only) 
 SCREENMODE        3                                    (read only) 
 SCREENSIZE        725.0000,358.0000                    (read only) 
 SDI               0 
 SHADEDGE          3 
 SHADEDIF          70 
 SHORTCUTMENU      11 
 SHPNAME           "" 
 Press ENTER to continue: 
 SKETCHINC         1.0000 
 SKPOLY            0 
 SNAPANG           0 
 SNAPBASE          0.0000,0.0000 
 SNAPISOPAIR       0 
 SNAPMODE          0 
 SNAPSTYL          0 
 SNAPTYPE          0 
 SNAPUNIT          10.0000,10.0000 
 SOLIDCHECK        1 
 SORTENTS          96 
 SPLFRAME          0 
 SPLINESEGS        8 
 SPLINETYPE        6 
 SURFTAB1          6 
 SURFTAB2          6 
 SURFTYPE          6 
 SURFU             6 
 SURFV             6 
 SYSCODEPAGE       "ANSI_1252"                          (read only) 
 TABMODE           0 
 TARGET            0.0000,0.0000,0.0000                 (read only) 
 TDCREATE          2453411.47756546                     (read only) 
 Press ENTER to continue: 
 TDINDWG           0.12690797                           (read only) 
 TDUCREATE         2453411.43589880                     (read only) 
 TDUPDATE          2453411.47756546                     (read only) 
 TDUSRTIMER        0.12690924                           (read only) 
 TDUUPDATE         2453411.43589880                     (read only) 
 TEMPPREFIX        "C:\DOCUME~1\max\IMPOST~1\Temp\"     (read only) 
 TEXTEVAL          0 
 TEXTFILL          1 
 TEXTQLTY          50 
 TEXTSIZE          2.5000 
 TEXTSTYLE         "Standard" 
 THICKNESS         0.0000 
 TILEMODE          1 
 TOOLTIPS          1 
 TRACEWID          1.0000 
 TRACKPATH         0 
 TREEDEPTH         3020 
 TREEMAX           10000000 
 TRIMMODE          1 
 TSPACEFAC         1.0000 
 TSPACETYPE        1 
 TSTACKALIGN       1 
 TSTACKSIZE        70 
 Press ENTER to continue: 
 UCSAXISANG        90 
 UCSBASE           "" 
 UCSFOLLOW         0 
 UCSICON           3 
 UCSNAME           ""                                   (read only) 
 UCSORG            0.0000,0.0000,0.0000                 (read only) 
 UCSORTHO          1 
 UCSVIEW           1 
 UCSVP             1 
 UCSXDIR           1.0000,0.0000,0.0000                 (read only) 
 UCSYDIR           0.0000,1.0000,0.0000                 (read only) 
 UNDOCTL           5                                    (read only) 
 UNDOMARKS         0                                    (read only) 
 UNITMODE          0 
 VIEWCTR           301.1597,148.5000,0.0000             (read only) 
 VIEWDIR           0.0000,0.0000,1.0000                 (read only) 
 VIEWMODE          0                                    (read only) 
 VIEWSIZE          297.0000                             (read only) 
 VIEWTWIST         0                                    (read only) 
 VISRETAIN         1 
 VSMAX             1806.9580,891.0000,0.0000            (read only) 
 VSMIN             -1204.6387,-594.0000,0.0000          (read only) 
 WHIPARC           0 
 Press ENTER to continue: 
 WMFBKGND          ON 
 WORLDUCS          1                                    (read only) 
 WORLDVIEW         1 
 WRITESTAT         1                                    (read only) 
 XCLIPFRAME        0 
 XEDIT             1 
 XFADECTL          50 
 XLOADCTL          1 
 XLOADPATH         "C:\DOCUME~1\max\IMPOST~1\Temp\" 
 XREFCTL           0 
 ZOOMFACTOR        10

COMMAND

Il comando COMMAND permette di dare tutta una serie di comandi, come se si digitasse direttamente con la tastiera nel programma autocad. Per esempio se si vuole ottenere una circonferenza di raggio 3, centrata nel punto (2,5) basta scrivere:

 (command CIRCLE "2,5" 3)

Questo perche' digitando su autocad il comando circle, succede quanto segue:

 circle
 CIRCLE 3P/2P/TTR/<Center point>:2,5
 Diameter/<Radius>:3

Prendere l'input dall'utente

Per richiedere un input dall'utente come un punto, sia attraverso il mouse sia attraverso la tastiere, esiste la funzione GETPOINT:

 (setq primopunto (getpoint "Immetti le coordinate del primo punto"))

Per immettere dei caratteri esiste la funzione getstring, che peremette di contenere al massimo 132 caratteri. Sfortunatamente il comandi interpretata gli spazi come dei comandi di enter:

 (setq nome (getstring "Digitare il proprio nome (senza spazi):"))

GETPOINT

 (getpoint [puntodipartenza] ["frase"])

Serve per prendere un punto, il punto di partenza indica dove far partire una linea elastica che aiuta a capire dove si sta per cliccare, mentre generalmente nelle alttre funzioni sostituisce il primo input nel caso di piu' input.

Se si preme ENTER, invece di indicare un punto, e' restituito il valore nil.

GETCORNER

 (getcorner puntodipartenza ["frase"])

Serve per prendere un punto, pero' verra' disegnato un rettangolo elastico a partire dal puntobase indicato (obbligatoriamente). Cio' aiuta quando un punto serve per costruire un rettangolo ad esempio, ma anche in tante altre situazioni.

GETDIST

 (getdist [puntodipartenza] ["frase"])

Fornisce la distanza fra 2 punti e basta, ne' img2.png ne' altro.

GETANGLE

 (getangle [puntodipartena] ["frase"])

Restituisce l'angolo in RADIANTI (anche se usate altre unita' di misura) del segmento che unisce i due punti rispetto all'orizzontale, contando in senso antiorario.

GETREAL

 (getreal ["frase"])

Si usa per prendere un numero reale dall'utente. (Se si digita 9, per esempio, diventera' 9.0)

GETINT

 (getint ["Frase"])

Si usa per prendere un numero intero dall'utente. Se l'utente non inserisce un intero, verra' visualizzato un messaggio di errore e il programma continuera' a chiedere un intero finche' l'utente non inserira' un intero, e poi il programma continuera' normalmente.

GETSTRING

 (getstring [flag] ["frase"])

Serve a prendere delle frasi dall'utente, se flag e' VERO (cioe' un qualsiasi valore diverso da 0) allora accetta anche gli spazi e per dare il comando di fine inserimento l'utente puo' solo digitare invio. Se il flag non e' indicato, si suppone falso, e percio' lo spazio sara' considerato come invio.

Un altro problema con le stringhe riguarda il massimo numero di caratteri digitabili in autocad (non in un file autolisp) durante un comando e' 132, questo limita fortemente l'input dell'utente (se dovesse scriverci una lettera...); comunque le variabili non hanno limiti nel contenere i dati stringa, quindi e' possibile unire piu' input nella stessa variabile grazie a piu' comandi (e' solo molto scomodo).

Comandi pericolosi: INITGET

Un comando molto comodo quanto insidioso e' INITGET, questo comando permette di definire il tipo di input per tutte le funzioni GETxxx (GETPOINT, GETCORNER, ecc.), ma il suo funzionamento e' talmente semplice, che puo' accadere di averlo attivato:

 (initget [bit] [stringa])

Come vedete non contiene fra parentesi tonde i comandi su cui ha effetto, ma una volta attivato ha effetto sempre e bisgna ridigitarlo per elimiare il suo effetto. Ma quale effetto ha?

Il bit permette di decidere il formato dell'input secondo la tabella sotostante:

Bit di controlloRisultato del controllo
1Non nullo
2Non zero
4Maggiore di zero
8Solo punti contenuti nella variabile LIMCHECK
32Utilizza una linea elastica grafica
64Ignora la coordinata Z
128Accetta tutto

La stringa permette di definire delle parole chiave che digitando poche lettere verranno immediatamente interpretate, per esempio il comando CIRCLE quando lo chiamate fa apparire:

 CIRCLE Specify center point fo circle or [3P/2P/Ttr (tan tan radius)]:

Digitando semplicemente 2P, 3P o T, il computer capisce immediatamente cosa volete, con il comando INITGET si possono aggiungere delle nostre parole:

 (initget "Ciao Mondo")
 (getpoint)
 M             ;digito M
 "Mondo"       ;appare "Mondo"
 (getpoint)
 c
 "Ciao"

La parte che scriviamo in maiuscolo e' l'abbreviazione che possiamo usare, quindi se scriviamo come stringa "Ciao MONDO" dovremo scrivere tutto mondo, altrimenti non verra' interpretato.

Pero' usate initget con attenzione, una volta attivato non si torna indietro...

Esempio di un programma

Ecco come puo' essere scritto un programma:

 ;Programma per ottenere un riquadro ombreggiato
 (setq bs (getpoint "\nIndica il punto in basso a sinistra del riquadro:"))
 (setq ad (getcorner bs "\nIndica il punto in alto a destra del riquadro:"))
 (setq x1 (car bs))
 (setq y1 (cadr bs))
 (setq x2 (car ad))
 (setq y2 (cadr ad))
 (setq as (list x1 y2))
 (setq bd (list x2 y1))
 (setq tx (/ (- y2 y1) 4))
 (setq pw (/ tx 3.0))
 (setq deltax (- x2 x1))
 (setq hdeltax (/ deltax 2.0))
 (setq deltay (- y2 y1))
 (setq hdeltay (/ deltay 1.75))
 (setq pt (list (+ x1 hdeltax) (+ y1 hdeltay)))
 (command "_.PLINE" bs "_W" pw "" bd ad "_W" 0 "" as "_C")
 (command "_.TEXT" "_S" "STANDARD" "_C" pt tx 0 "INSIDE" "_.TEXT" "" "AutoLISP")
 (command "_.FILLET" "_R" tx "_.FILLET" "_P" bs)

Analizziamo cosa fa:

  1. Chiede il punto in basso a sinistra del quadrato da disegnare e lo memorizza nella variabile bs. (Il simbolo img3.png indica di iniziare il testo con una nuova riga)
  2. Ciede il punto in alto a destra del quadrato con la funzione getcorner, cosi' apparira' un quadrato elastioche da' l'idea di come verra fuori il quadrato che stiamo facendo. (se avessimo utilizzato il comado getpoint nuovamente, sarebbe apparsa una linea elastica invece del quadrato.)
  3. Memorizza il valore dell'ascissa x del punto bs, nella variabile x1
  4. Memorizza il valore dell'ordinata y del punto bs, nella variabile y1
  5. Memorizza il valore dell'ascissa x del punto ad, nella variabile x2
  6. Memorizza il valore dell'ordinata y del punto ad, nella variabile y2
  7. Memorizza le coordinate del vertice in alto a sinistra del quadrato che vogliamo disegnare, dentro la variabile as.
  8. Memorizza le coordinate del vertice in basso a destra del quadrato che vogliamo disegnare, dentro la variabile bd.
  9. Memorizza il valore dell'altezza del testo, prendendola dalla variabile di sistema TEXTSIZE, e la mette nella variabile tx.
  10. pw=tx/3
  11. deltax=x2-x1
  12. hdeltax=deltax/2
  13. deltay=y2-y1
  14. hdeltay=deltay/1.75
  15. pt=(hdeltax+x1 , hdeltay+y1)
  16. Crea una poligonale con il comando PLINE e i primi due segmenti li fa' di spessore pari ad un terzo del testo (pw).
  17. Scrive all'interno del riquadro "Indise Autolisp".
  18. Arrotonda gli angoli del quadrato con il COMANDO FILLET.

I comandi SETQ e COMMAND si potevano raggruppare per evitare di doverli digitare ogni volta come segue:

 ;Programma per ottenere un riquadro ombreggiato
 (setq bs (getpoint "\nIndica il punto in basso a sinistra del riquadro:")
       ad (getcorner bs "\nIndica il punto in alto a destra del riquadro:")
       x1 (car bs)
       y1 (cadr bs)
       x2 (car ad)
       y2 (cadr ad)
       as (list x1 y2)
       bd (list x2 y1)
       tx (/ (- y2 y1) 4))
       pw (/ tx 3.0)
       deltax (- x2 x1)
       hdeltax (/ deltax 2.0)
       deltay (- y2 y1)
       hdeltay (/ deltay 1.75)
       pt (list (+ x1 hdeltax) (+ y1 hdeltay))
       )
 (command "_.PLINE" bs "_W" pw "" bd ad "_W" 0 "" as "_C"
          "_.TEXT" "_S" "STANDARD" "_C" pt tx 0 "INSIDE" "_.TEXT" "" "AutoLISP"
          "_.FILLET" "_R" tx "_.FILLET" "_P" bs
 	 )

Le funzioni matematiche

Le funzioni matematiche sono considerate al pari di una qualunque altra funzione. La sottrazione e la divisione creano sempre grossi problemi se non si capisce come funzionino.

Altra nota dolente, soprattutto in campo scientifico, e' la precisione di Autocad; quando i valori rimangono all'interno di variabili, la precisione e' di 14 cifre, ma se vengono mostrati i risultati all'utente, la precisione cala a 6 cifre, quindi se si richiede all'utente, e non al programma, di reinserire un risultato, potreste ottenere effetti inaspettati.

+

 (+ numero [numero] [numero] ...)

Si ottiene la somma di tutti i numeri. Con un numero solo viene resituito il numero.

*

 (* numero [numero] [numero] ...)

Si ottiene il prodotto di tutti i numeri. con un numero solo viene restituito il numero

-

 (- numero [numero] [numero] ...)

Si ottiene la differenza tra il primo numero e LA SOMMA degli altri numeri. Con un numero solo si sottrae a 0 il numero:

 (- 6)
 -6

/

 (/ numero [numero] [numero] ...)

Si ottiene la divisione fra il primo numero e il PRODOTTO dei restanti. Con un numero solo viene restiuito il numero. Se i numeri sono tutti interi verra' restituito come numero il risultato della divisione con la soppressione del decimale:

 (/ 5 2)
 2

min

 (min numero numero [numero] ...)

Resituisce il numero piu' piccolo.

max

 (max numero numero [numero] ..)

Restituisce il numero piu' grande.

Massimo comune divisore

 (gcd intero intero)

Resituisce il massimo comune divisore fra due interi.

Resto della divisione

 (rem numero numero [numero] [numero] ...)

Resistuisce il resto della divisione fra il primo numero e il PRODOTTO dei rimanenti.

Valore assoluto

 (abs numero)

Restituisce il valore assoluto (o modulo) del numero dato.

Radice quadrata

 (sqrt numero)

Restituisce la radice quadrata del numero dato, ma il numero deve essere posistivo (non esiste la radice di un numero negativo e autocad non usa i numeri immaginari). Si consiglia di utilzzare la funzione ABS per rendere il numero positivo.

Logaritmo

 (log numero)

Restituisce il logaritmo naturale (img4.png) di un numero, che deve essere positivo. Si consiglia di utilzzare la funzione ABS per rendere il numero positivo.

Elevamento a potenza

 (expt base potenza)

Restituisce la base elevata alla potenza.

Elevamento di e

 (exp potenza)

Eleva il numero e (numero di Nepero, pari a 2.718281828) alla potenza desiderata.

Funzioni con le stringhe

Le stringhe sono variabili che contengono testo, sono utili sia per guidare l'utente dicendogli cosa fare, sia per disegnare scritte o altri oggetti letterari.

Concatenazione

 (strcat [stringa] [stringa] [stringa] ...)

Restituisce una stringa che e' l'unione di tutte le stringhe date, se non sono fornite strighe, e' restituita una stringa vuota:

 ""

Caratteri tutti maiuscoli o tutti minuscoli

 (strcase stringa [flag])

La funzione strcase trasforma tutti i caratteri di una stringa in caratteri maiuscoli, sia che il flag non ci sia o sia impostato su VERO, mentre se il flag e' impostato su FALSO, allora la stringa verra' convertita in caratteri tutti minuscoli.

Lunghezza di una stringa

 (strlen [stringa] [stringa] ...)

Restituisce la somma di tutti i caratteri di tutte le stringhe date.

Estrarre stringhe

 (substr stringa inizio_intero [lunghezza_intero])

Restituisce la parte della striga a cominciare dal carattere numero inizio e per un numero di caratteri pari alla lunghezza. Se lunghezza non viene indicato o e' piu' lingo della rimanente parte della stringa, verra' comunque estratta tutta la rimanente parte della stringa a partire dal carattere numero inizio.

Funzioni con liste

Le liste sono una serie di valori raggruppati da parentesi, sfortunatamente non e' possibile manipolarli o immetterli direttamente, ma e' necessario utilizzare delle funzioni.

Ricordiamo che i punti, per esempio, sono una lista dove il primo valore e' X, il secondo e' Y ed il terzo e' Z.

Creazione

 (list espressione)

Con questo comando si crea una lista a prescindere dai tipi di dati che si raggruppano, esempio:

 (list 0 2.3 "Ciao mondo")
 (0 2.3 "Ciao mondo")

Si possono creare liste dentro liste:

 (setq a (list (list 1 aaa) (list 2 bbbb) (list 3 cccccc) ))
 !a
 ((1 aaa) (2 bbbb) (3 cccccc))

Estrazioni di elementi

Esistono tanti modi per estrarre i valori da una lista, tutti complicati, ecco le funzioni piu' semplici.

 (car lista)

Restituisce il primo elemento della lista.

 (last lista)

Restituisce l'ultimo elemento dell lista.

 (nth ennesimo_intero lista)

Resituisce l'ennesimo elemento della lista, ATTENZIONE, comincia a contare a 0, non da 1; quindi il per ottenere il terzo elemento della lista:

 (nth 2 mialista)

Inoltre se il numero ennesimo inserito non e' valido (per esempio 7 in una lista di 3 elementi), non verra' estratto nulla.

 (member elemento lista)

Restituisce la lista solo a partire dall'elemento indicato.

 (cdr lista)

Restituisce la lista senza il primo elemento.

Ordinare una lista al contrario

 (reverse lista)

Restituisce la lista data con l'rdine degli elementi invertito (l'ultimo diventa il primo e cosi' via).

Numero di elementi di una lista

 (lenght lista)

Restituisce il numero di elementi di una lista.

Fusione di liste

 (append [lista] [lista] ...)

Unisce tutte le liste in un'unica lista.

Definire funzioni personalizzate

La potenza maggiore di Autolisp risiede nel poter creare una serie di funzioni utili al proprio lavoro da poter chiamare quando si vuole.

Le funzioni permettono di scrivere una volta sola una serie di comandi e di richiamarli tutte le volte che si vuole, rimparmiando un sacco di tempo nella scrittura dei programmi.

Fino ad ora, dopo aver scritto un file Autolisp, appena caricato venivano immediatamente eseguite tutte le operazioni descritte. Creando una funzione, quando si carica il file autolisp, e' caricata anche la funzione (o le funzioni, se ne abbiamo scritte piu' di una all'interno dello stesso file autolisp) pronta per l'uso. Bastera' digitare il nome della funzione per attivarla.

E' importante sapere che quando autocad crea un nuovo disegno, va a caricare immediatamente il file ACAD.LSP (dalla versione 2000 in poi hanno complicato le cose, acad.lsp viene caricato goni volta che si avvia autocad, acaddoc.lsp e' caricato per ogni nuovo disegno1). Dentro questo file possimo aggiungere tutte le funzioni che vogliamo, quelle che cominciano per S: saranno eseguite automaticamente all'avvio; quelle che cominciano per C: saranno considerate come dei comando Autocad a tutti gli effetti, pronti per essere esguiti.

ATTENZIONE Se date alla vostra funzione un nome uguale a quello di una funzione di Autocad, quella funzione sara' sovrascritta fino a che o non chiudete il disegno o autocad.

Vediamo la sintassi per indicare una funzione, tutte le parentesi tonde sono obbligatorie:

 (defun nomefunzione ( [argomento] [argomento] ... / [variabilelocale]
 [variabile locale] ...)  espressione )

Esempi:

 (defun prova () (prompt "\n Prova!\n"))
 (defun prova2 (a b ) (prompt "\n Prova 2"))
 (defun prova3 (a / b c d e) (prompt "\n Prova 3"))
 (defune prova4 (/ a b ) (prompt "\n Prova 4"))

Gli argomenti sono delle finestre per passare dei dati direttamente alla funzione in modo che li possa utilizzare, per esempio se dichiaro la seguente funzione:

 (defun ciaobello (nome) (prompt (strcat "Ciao" nome)))
 (setq a (getstring "Inserisci il tuo nome"))
 (ciaobello a)

Il primo, e in questo caso l'unico, argomento viene passato alla funzione per essere elaborato.

Le funzioni da poter chiamare come comandi autocad debbono cominciare per C: e non debbono avere argomenti.

Se si incasina di brutto Autocad con le nostre funzioni digitare reset e verranno ripristinate le variabili di ambiente.

Funzioni logiche

I test si eseguono attraverso l'uso di funzioni, percio' usano la notazione con le parentesi, vediamo che tipi di test sono possibili.

AND

 (and espressione [espressione] ...)

Ritorna il valore vero solo se tutte le espressioni sono vere, altrimenti falso.

OR

 (or espressione [espressione] ...)

Ritorna il valore vero se almeno una delle espressioni e' vera.

NOT

 (not espressione)

Ritona l'opposto del valore logico dell'espressione, se l'espressione e' vera, ritorna falso, e viceversa.

EQ, equal, =

Sia EQ, EQUAL che = servono per verificare se 2 espressioni sono uguali, ma si usano in maniera leggermente diversa:

 (eq espressione1 espressione2)

EQ verifica che il risultato dell'espressione1 sia identico a quello dell'espressione2, restituitendo T se e' vera, nil se e' falsa.

 (equal espressione1 espressione2 [approssimazione])

Equal e' identico a EQ, ma si puo' dichiarare con quale approssimazione vanno uguagliati i risultati delle due espressioni.

 (= valor1 valor2 [valor3] ... )

La funzione = funziona come EQ, controlla se tutti i valori sono uguali, pero' accetta solo come valori numeri e stringhe (o funzioni che danno tali risultati).

Maggiore, minore, diverso

I confronti maggiore minore e diverso si fanno con le seguenti funzioni:

img6.png
Minore, serve a confrontare degli elementi e verificare se ogni elemento e' minore del successivo
img7.png
Minore o uguale, serve a confrontare degli elementi e verificare se ogni elemento e' minore o uguale del successivo
img8.png
Maggiore, serve a confrontare degli elementi e verificare se ogni elemento e' maggiore del successivo.
img9.png
Maggioreo uguale, serve a confrontare degli elementi e verificare se ogni elemento e' maggiore o uguale del successivo.
/=
Diverso, serve a confrontare degli elementi e verificare se ogni elemento e' diverso dal successivo.

Esempi:

 (= (+ 3 2) (- 10 5))
 T
 (< 3 5 7 9 12)
 T

Scegliere (IF)

Come in tanti altri linguaggi di programmazione, anche in AutoLisp e' possibile compiere delle scelte, grazie a una funzione: IF.

 (IF test espressione1 [espressione2])

Il computer esegue un test, se il risultato e' vero, allora verra' eseguita l'espressione1 altrimenti l'espressione2. Esempio:

 (if (< a 50) (prompt "a maggiore di 50")
 (prompt "a minore o ugugale di 50") )

Chiaramente noi vorremo eseguire piu' di una istruzione se un test e' vero o falso, per fare cio' bisogna utilizzare la funzione PROGN che serve ad eseguire piu' espressioni in un solo paio di parentesi, e restituisce il valore dell'ultima espressione:

 (progn espressione [espressione]...)

Esecuzioni cicliche

Esistono alcune funzioni fondamentali per la ripetizione piu' volte degli stessi comandi.

Repeat

 (repeat intero espressione [espressione] ...)

Ripete il numero di volte indicato dall'intero tutte le espressioni.

while

 (while test espressione [espressione] ...)

La funzione while esegue il test se e' vero esegue tutte le espressioni, poi esegue di nuovo il test, se e' vero riesegue tutte le espressioni, e cosi' via. E' molto utile come funzione, ma e' facile costruire dei circoli da cui non si esce piu'. Esempi corretti:

 (setq a 0)
 (while (< a 5) (promt "Ciao!") (setq a (+ a 1))
 Ciao!Ciao!Ciao!Ciao!Ciao!nil

foreach

 (foreach var lista espressione [espressione]...)

La funzione foreach serve per eseguire un'operazione su tutti gli elementi di una lista, la variabile var serve per indicare nelle espressione dove va l'elemento della lista. Esempio:

 line
 (foreach punto listapunti (command punto))

Visualizzare lo schermo del prompt

Puo' capitare spesso che si debbano visualizzare piu' righe di quelle 2 o 3 che si vedono in basso del promt di Autocad, per far apparire una bella finestra ampia con tutte le righe che ci servono basta usare la funzione textscr:

 (textscr)

Per far tornare tutto a posto basta usare la funzione graphscr:

 (graphscr)

Visualizzazione e stampa di dati

Una funzione per visualizzare sullo schermo una stringa e' la funzione PROMPT:

 (prompt "Ciao a tutti,\n io sono una stringa!")
 Ciao a tutti,
 io sono una stringa!nil

Chiaramente la funzione restituisce anche il valore nil.

Altre funzioni visualizzare su schermo o stampare sono PRINT, PRINC e PRIN1:

 (print espressione [file-desc])
 (princ espressione [file-desc])
 (prin1 espressione [file-desc])

Tutte e tre scrivono l'espressione o su schermo o, se indicato sul file file-desc, e restituiscono l'espressione. La differenza risiede in:

  • PRINT aggiunge sempre una nuova riga prima di un'espressione e uno spazio dopo.
  • PRINC non elabora i caratteri come
 \n, 

Approssimazioni

Autocad permette, attraverso il comando UNITS, di decidere come e con che precisione verranno prese le distanze e gli angoli e quindi tutte le altre misure. Comunque di un qualunque risultato e' sempre possibile modificarne l'approssimazione con il comando RTOS:

 (rtos numero [modo] [precisione])

Il modo rappresenta il formato con cui deve essere restituito il numero, la prescisione il numero di decimali dell'approssimazione.

ModoSistema di misuraOutput
1Scientifico8.42E+00
2Decimale8.42
3Ingegneristico8.42''
4Architettonico8 1/2''
5Frazionario8 1/2

Approssimazioni con gli angoli

Gli angoli vengono trattati in una maniera completamente diversa dalle altre unita' di misura (che discendono dalle distanze). La funzione per le approssimazione degli angoli e' ANGTOS:

 (angtos angolo [modo] [precisione])

Il numero restituito dipende dal modo scelto (vedi tabella piu' in basso) e dalla precisione.

ModoSistema di misuraOutput
Gradi decimali45.0000
1Gradi/Minuti/Secondi45d0'0''
2Gradi centesimali50.0000g
3Radianti0.784r
4Unita' topograficheN 45d0'0''E

Conversioni di unita' di misura

Il file ACAD.UNT contiene le definizioni di tutte le unita' di misura che il comando CVUNIT puo' convertire:

 (cvunit numero da_unit a_unit)

Restituisce il numero convertito dall'unita' da_unit all'unita' a_unit. Mi raccomando le unita' sono stringhe, quindi vanno messe tra virgolette.

 (cvunit 1 "minute" "second")
 60.0

Ecco il contenuto del file ACAD.UNT, che potete modificare a vostro piacimento per aggiungere o corregere le conversioni (fatevi una copia di riserva, non si sa mai...):

 ;
 ;  AutoCAD unit definition file -- ACAD.UNT
 ;

 ; Basic SI units
 *meter(s),metre(s),m
 -1,0,1,0,-1,4.1214856408e11,0
 *kilogram(s),kg
 0,0,0,0,1,1.0977481015e30,0
 *second(s),sec
 -2,0,1,0,-1,1.235590484e20,0
 *ampere(s),amp(s)
 2,1,-1,0,1,0.050513907838,0
 *kelvin,k
 2,0,0,-1,1,1.6863043358e-10,0
 *candela,cd
 4,0,-1,0,2,9.885226216e-8,0

 ; Derived SI units
 *celsius,centigrade,c
 2,0,0,-1,1,1.6863043358e-10,4.6061402932e-8
 *rankine
 2,0,0,-1,1,9.3683574212e-11,0
 *fahrenheit
 2,0,0,-1,1,9.3683574212e-11,4.30635285578e-8
 *gram(s),gm,g
 =kg 0.001
 *newton(s),n
 =meter kilogram / second^2
 *pascal,pa
 =newton/meter^2
 *joule(s)
 =newton meter

 ; Exponent synonyms
 *square,sq
 ^2
 *cubic,cu
 ^3

 ; Units of time
 *centur(y.ies)
 =100 year
 *day(s)
 =86400 second
 *decade(s)
 =10 year
 *fortnight(s)
 =14 day
 *hour(s),hr
 =3600 second
 *milleni(um.a)
 =1000 year
 *minute(s),min
 =60 second
 *sidereal_year(s)
 =365.25636 day
 *tropical_year(s)
 =365.24220 day
 *week(s),wk
 =604800 second
 *year(s),yr
 =365 day

 ; Units of length
 *Angstrom(s)
 =meter 1E-10
 *astronomical_unit(s),au       
 =meter 149597870000       
 *bolt(s)
 =meter 36.576
 *cable(s)                     ; U.S. cable length
 =meter 219.456
 *caliber
 =meter 0.000254
 *centimeter(s),centimetre(s),cm(s)
 =meter 0.01
 *chain(s)                     ; Gunther's chain length
 =meter 20.1168
 *cubit(s)
 =meter 0.4572
 *decimeter(s),decimetre(s),dm
 =meter 0.1
 *dekameter(s),dekametre(s),dam
 =meter 10
 *fathom(s),fath
 =meter 1.8288
 *f(oot.eet),ft,'
 =meter 0.3048
 *furlong(s),fur
 =meter 201.168
 *gigameter(s),gigametre(s)
 =meter 1E9
 *hand(s)
 =meter 0.1016
 *hectometer(s),hectometre(s),hm
 =meter 100
 *inch(es),in(s),"
 =meter 2.54E-2
 *kilometer(s),kilometre(s),km
 =meter 1000
 *league_nautical
 =meter 5556
 *league_statute
 =meter 4828.032
 *light_year(s)
 =meter 9.46053E15
 *link(s)                      ; Gunther's link length
 =meter 0.201168
 *microinch(es)
 =meter 2.54E-8
 *micron(s)
 =meter 1E-6
 *mil(s)
 =meter 2.54E-5
 *mile_nautical,inm            ; International Nautical Mile
 =meter 1852
 *mile_statute,mile(s),mi
 =meter 1609.344
 *millimeter(s),millimetre(s),mm(s)
 =meter 0.001
 *millimicron(s),nanometer(s),nanometre(s),nm(s)
 =meter 1E-9
 *pace(s)
 =meter 0.762
 *palm(s)
 =meter 0.0762
 *parsec(s)
 =meter 3.085677E16
 *perch(es)
 =meter 5.0292
 *pica(s)
 =meter 0.0042175176
 *point(s)
 =meter 0.0003514598
 *rod(s),pole(s)
 =meter 5.0292
 *rope(s)
 =meter 6.

Selezionare un'oggetto

Ogni linea, cerchio o elemento che disegnamo con Autocad, e' conservato in un database, quindi ogni elemento puo' essere richiamato conoscendo il nome che ha nel database. Sfortunatamente il nome usa una convenzione assurda (166766, 166e544), quindi e' impossibile stabilire a priori il nome che ha un oggetto senza prima averlo selezionato e chiesto il suo nome.

Per chiedere il nome di un oggetto esiste la funzione ENTSEL:

 (entsel [messaggio])

Restituisce il nome dell'elemento e il punto dove si e' cliccato. Il messaggio rappresenta la frase da far apparire quando chiediamo di selezionare un oggetto.

 (entsel) ;selezioniamo qualcosa
 (<Entity name: 151123> (4.3 1.0 0.0))

Poiche' a noi serve solamente la prima voce, cioe' il nome, possiamo associare la funzione CAR che estrae il primo elemento di una lista:

 (car (entsel)) ;selezioniamo qualcosa
 <Entity name: 151123>

Quindi se vogliamo memorizzare il nome di un'entita' in una varibaile basta:

 (setq a (car (entsel)))

Solo in questa maniera potremo maneggiare agevolmente le entita'.

E' possibile scorrere tutte le voci del database con il comando ENTNEXT:

 (entnext [enome])

Restituisce il nome dell'oggetto successivo nel database al nome (enome) dato, altrimenti il da' il primo nome presente nel database.

Il comando ENTLAST permette di ottenere il nome dell'ultimo oggetto inserito non cancellato:

 (entlast)

Eliminare un oggetto

Per eliminare un oggetto esiste la funzione ENTDEL:

 (entdel enome)

Far scomparire e riapparire un oggetto

La funzione REDRAW permette di visualizzare un oggetto tratteggiato come se fosse selezionato, farlo diventare invisibile e farlo riapparire.

 (redraw [enome] [modo])

Se non si specifica il nome (e quindi il modo) verra' ridisegnato tutto il disegno (equivale a rigenera), altrimenti verra' applicato all'oggetto il modo scelto:

  1. L'oggetto e' semplicemente ridisegnato
  2. L'oggeto diventa invisibile
  3. L'oggeto e' evidenziato
  4. L'oggetto e' disevidenziato (non e' piu' evidenziato).

Selezionare piu' oggetti

Per seleziona piu' oggetti c'e' la funzione SSGET, che e' piena di opzioni. Come principiio di base, SSGET permette di selezionare piu' oggetti:

 (ssget)  ;selezioniamo un gruppo di oggetti
 <Selection set: 4>

La frase img6.pngSelection set: 4img8.png indica che c'e' una parte della RAM (la quarta) del pc che conserva in memoria la selezione, anche in questo caso possiamo memorizzare in una variabile:

 (setq a (ssget))

Un limite di Autocad e' che non pou' memorizzare contemporaneamente piu' di 128 gruppi distinti di oggetti, quindi non potremo mai usare piu' di 128 variabili distinte per i gruppi di oggetti.

Ora che abbiamo preso dimestichezza con la funzione SSGET, possiamo passare alle sue opzioni:

 (ssget [modo] [punto1 [punto2]] [lista_di_punti] [filtro])

Il modo rappresenta la maniera con cui sono scelti gli oggetti:

'
Seleziona l'entita' che passa per il punto selezionato:
 (ssget ' ( 10 5))
L
Seleziona l'ultima entita' disegnata:
 (ssget "L")
P
Seleziona il precedente gruppo.
 (ssget "P")
I
Seleziona il gruppo di selezione implicito di un altro comando.
 (ssget "I")
W
Seleziona gli oggetti interni completamente la finestra:
 (ssget "W" ' (0 10) ' (10 15))
C
Seleziona gli oggetti interni e che intersecano la finestra:
 (ssget "C" ' (0 10) ' (10 15))
WP
Seleziona gli oggetti interni al poligono definito dalla lista di punti:
 (ssget "WP" listadipunti)
CP
Seleziona gli oggetti interni e che intersecano il poligono definito dalla lista di punti:
 (ssget "CP" listadipunti)
F
Seleziona solo gli oggetti che intersecano la polilinea definita dalla lista di punti:
 (ssget "F" listadipunti)
X
Seleziona tutto:
 (ssget "X")

Inoltre e' possibile filtrare gli oggetti che vogliamo nella selezione, per fare questo bisogna indicare un codice (per esempio per indicare il colore) seguito da un valore (per esempio rosso). La tabella seguente spiega i codici possibili:

CodiceDescrizioneTipo di datoEsempio
Tipo di entita'Stringa(0 . LINE)
2Nome del blocco inseritoStringa(2 . ARROW)
3Entita' di quotatura (dimstyle)Stringa(3 . TOLERANCE)
6Nome del tipo di lineaStringa(6 . CENTER)
7Nome dello stile di testoStringa(7 . STANDARD)
8Nome del layerStringa(8 . OBJ02)
39SpessoreReale(39 . 6.0)
62Numero del coloreIntero(62 . 1)
66Attributi per il blocco inseritoIntero(66 . 1)
210Direzione di estrusione 3DLista di punti(210 1.0 0.0 -0.5)

Esempio:

 (ssget "X"  '((0 . "CIRCLE") (8 . "ciccio")))

Cosi' selezioniamo tutti i cerchi sul layer ciccio.

Ho usato ' al posto di LIST e . al posto di CONS; ma e' uguale.

Tutto quello che scrivete nel filtro e' sensibile ai caratteri jolly di Autocad, quindi potete sfruttarlo a vostro vantaggio.

Altra nota molto importante e' la possibibilta' di indicare espressioni come minore di... o maggiore di... o qualsiasi test ci venga in mente, grazie al codice -4:

 (ssget "X"  '((0 . "CIRCLE") (-4 . "<=") (39 .  1.0))

Abbiamo selezionato tutti i cerchi con spessore minore o uguale di 1mm.

Se facciamo test con punti o altri tipi di liste l'espressione va scritta cosi', per indicare dove va il test:

 ... (-4 . ",,<=") (10 . (0.0 0.0 1.0) ...

Scegliamo cose con quota Z minore o uguale a 1.

Come se tutto questo non bastasse possiamo gli operatori logici AND, OR, XOR e NOT per filtrare ancora meglio. Ogni operatore logico apre con, per esempio AND, '' (ssget "X" ;selezioniamo tutto '( ;inizia il filtro ("<OR") ;inizia OR ("<AND") ;inizia AND (0 . "LINE");solo linee (62 . 5) ;con colore blu ("AND>") ;chiudiamo AND ("<AND") ;apriamo AND (0 . "POLYLINE");polilinee (6 . "DASHED");tratteggiate ("AND>") ;chiudiamo AND ("OR>") ;chiudiamo OR ) ) Quindi selezioneremo linee blu e polilinee tratteggiate.

Gestione dei gruppi di selezione

Molto comodi sono i seguenti comandi:

 (sslength selection-set)

Resituisce il numero di elementi diun gruppo (il selection-set).

 (ssmemb enome selectio-set)

Restituisce l'enome se fa parte del selection-set.

 (ssadd enome selection-set)

Aggiunge l'elemento enome alla selezione.

 (ssdel enome selection-set)

Cancella l'elemento enome dal gruppo selection-set.

Le proprieta' delle entita'

Ogni oggeto ha delle propriet� basta cliccare sul pulsante proprieta' e poi su un oggetto per leggerle, anche AutoLisp ha la possibilita' di accedere alle proprieta'.

 (entget enome [opzioni])

Restituisce una lista delle proprieta' dell'oggetto che ha l'enome.

 (setq a (entget (car (entsel))));selezioniamo una linea
 !a
 ((-1 . <Entity name: 1641158>) (0 . "LINE") (330 . <Entity name: 16410f8>) (5 .
 "2B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
 "AcDbLine") (10 158.265 217.772 0.0) (11 301.16 112.412 0.0)

Come vedete la lista delle proprieta' e' formata da un numero che indica la proprieta' seguito dal valore della proprieta'.

Per maneggiare meglio queste liste di liste esiste il comando ASSOC che restituisce solamente la sottolista (proprieta') che vogliamo noi:

 (assoc identificativo lista)

L'identificativo e' il primo elemento della sottolista che deve essere estratta, facendo riferimento all'esempio precedente:

 (assoc 0 a)
 (0 . "LINE")

oppure

 (assoc 5 a)
 (5 . "2B")

Ecco una tabella con la spiegazione di tutti i codici DXF, cioe' le proprieta' possibili degli oggetti:

CodiceDescrizione
-3Dato entita' esteso
-2Nome entita' secondario
-1Nome entita' primario
Tipo entita'
1Contenuto del testo primario
2Nome: modello, blocco, tag
3Prompt
5Identificatore
6Nome del tipo linea
7Nome stile testo
8Nome piano
10X: di partenza, del punto centrale, del punto angolare, di definizione, del punto di elevazione (2d ply).
11X finale: della linea, del punto angolare, del punto di allineamento, del punto medio di Dim.
12X del punto angolare, di inserimento.
13X del punto angolare, di definizione.
14, 15, 16X del punto di inserimento di DIMENSION.
20Y: di partenza, del punto centrale, del punto angolare, di definizione, del punto di elevazione (2d ply).
21Y finale: della linea, del punto angolare, del punto di allineamento, del punto medio di Dim.
22Y del punto angolare, di inserimento.
23Y del punto angolare, di definizione.
24, 25, 26Y del punto di inserimento di DIMENSION.
30Z: di partenza, del punto centrale, del punto angolare, di definizione, del punto di elevazione (2d ply).
31X finale: della linea, del punto angolare, del punto di allineamento, del punto medio di Dim.
32X del punto angolare, di inserimento.
33X del punto angolare, di definizione.
34, 35, 36X del punto di inserimento di DIMENSION.
38Elevazione entita'.
39Spessore entita'.
40Raggio, misura, larghezza o lunghezza principale.
41Fattore di scala X o larghezza.
42Fattore di scala Y o convessita'.
43Fattore di scala Z.
44Spaziatura colonne.
45Spaziatura righe.
50Angolo ri rotazione o di partenza, curva tangente.
51Angolo finale, inclinazione angolo, angolo dall'orizzontale, Dim. direzione orizzontale.
52Dim. inclinazione angolo.
53Dim. angolo di rotazione testo.
62Colore.
66Flag entita' seguente.
67Flag spazio foglio.
70Tipo dimensione, flag vertice o polilinea, flag attribbuto, contatore colonna, flag bordo invisibile.
71Flag generazione testo, contatore riga, contatore vertice mesh M.
72Giustificazione testo, contatore vertice mesh N.
73Lunghezza campo, Densita M supreficie liscia, Giustofocazione verticale testo.
74Densita' N superficie liscia.
75Tipo superficie liscia.
210Punto X di trascinamento.
220Punto Y di trascinamento.
230Punto Z di trascinamento.

I valori negativi vengono utilizzati solo temporaneamente e non vengono salvati su file.

Tre dei valori precedenti vengono riportati dal comando assoc e simili, SOLO se non hanno il valore di default: 39 (0.0), 6 (BYLAYER), 62 (BYLAYER).

Modificare le proprieta' di un oggetto

Ora sappiamo come ottenere le proprieta' di un oggetto, pero' e' anche possibile modificarle. Per fare questo bisogna solo aggiornale il database di autocad, cambiando i dati della lista che contiene le proprieta'.

Passiamo ad un esempio pratico per capire bene:

 (setq linea (entget (car (entsel))));selezioniamo una linea
 ((-1 . <Entity name: 1641158>) (0 . "LINE") (330 . <Entity name: 16410f8>) (5 .
 "2B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
 "AcDbLine") (10 158.265 217.772 0.0) (11 301.16 112.412 0.0)

Immaginiamo di volerla fare partire dal punto (0.0 0.0 0.0) invece dell'attuale (158.265 217.772 0.0), allora selezioniamo questo dato con il comando SUBST:

 (subst nuovo_valore vecchio_valore lista)

usandolo cosi':

 (subst (10 0.0 0.0 0.0) (10 158.265 217.772 0.0) linea)

Poi aggiorniamo il database, con il comando ENTMOD, in modo che le nostre modifiche abbino effetto:

 (entmod linea)

Il comando entmod se riesce nell'aggiornamento resituisce i dati aggiornati, se fallisce restituisce nil.

Modificare le proprita' di ogggetti complessi come polilinee e blocchi

In Autocad esistono oggetti complessi, formati da piu' oggetti, come le polilinee e i blocchi.

Le polilinee sono oggetti formatti da tante linee o archi, tutti attaccati ognuno all'estremo di quello precedente. Quando si seleziona un oggetto della polilinea, si seleziona tutta la polilinea.

I blocchi sono simili, sono un insieme di elementi associati ad un nome, il nome del blocco in questione. Quando si seleziona un elemento del blocco, si seleziona tutto il blocco; se si modifica il blocco, si modificano automaticamente tutti i blocchi con lo stesso nome. In un disegno con la ripetizione di uno stesso oggetto in piu' parti del disgno i blocchi sono utilissimi: immaginiamo di aver disegnato una piastra con 20 viti del diametro di 6mm e decidiamo di sostituire con viti del diametro da 12, bastera modificarne una, se e' un blocco, e tutte le altre si modificheranno nella stessa maniera.

In autocad le polilinee e i blocchi sono memorizzati nel database degli oggetti in una maniera alquanto scomoda da maneggiare, cioe' sono suddivisi in tanti elementi separati tutti uno dietro l'altro e con l'ultimo elemento che si chiama SEQEND (ricordo che il nome e' la proprieta' 0) e generalmente non contiene dati riguardanti l'oggetto. La tabella sottostante dovrebbe dare un'idea:

NomeLayerecc.
POLYLINE
VERTEX
VERTEX
VERTEX
SEQEND

In una polilinea ogni elemento e' chiamato vertice, anche se una curva.

Abbiamo visto che per maneggiare un oggetto complesso, bisgona per forza utilizzare un ciclo while che ci permetta di memorizzare tutti i dati e che esca quando incontra il nome SEQEND.

Creare un'entita'

Per creare un'entita' da zero, basta usare il comando ENTMAKE:

 (entmake edati)

Gli edati sono una lista di dati che definisce l'entita'. Se volete sapere come deve essere scritta li lista date il comando:

 (entget(car(entsel)))

Per esempio, una linea e':

 (
 (0 . "LINE")
 (330 . <Entity name: 16410f8>)
 (5 . "2B")
 (100 . "AcDbEntity")
 (67 . 0)
 (410 . "Model") 
 (8 ."0")
 (100 . "AcDbLine" )
 (10 63.5551 243.49 0.0)
 (11 273.744 124.856 0.0)
 (210  0.0 0.0 1.0)
 )

Comunque per creare una entita' c'e' non e' necessario dare molti dati, vediamo come si descriva un punto:

 (entmake '((0 . "POINT") (10 0.0 0.0 0.0)))

oppure un testo:

 (enmake '((0 . "TEXT") (10 2.0 1.0 0.0) (40 . 0.25) (1 . "Autolisp e'
 complicato")))

Se bisogna fare un'entita' complessa, come una polilinea, allora si da un comando ENTMAKE col nome dell'entita' (per es. "POLYLINE"), e poi si creano gli elementi ("VERTEX") e poi si crea il "SEQEND":

 (entmake '((0 . "POLYLINE") (62 . 2)))
 (entmake '((0 . "VERTEX") (10 1.0 1.0 0.0) ))
 (entmake '((0 . "VERTEX") (10 2.0 1.0 0.0) ))
 (entmake '((0 . "VERTEX") (10 2.0 2.0 0.0) ))
 (entmake '((0 . "VERTEX") (10 3.0 1.0 0.0) ))
 (entmake '((0 . "SEQEND")))

Identificatori degli elementi del disegno

Una delle cose piu' insopportabili di AutoLisp e' che in un disegno i nomi che sono assegnati agli elementi sono del tutto casuali, e ogni volta che un disegno e' riaperto, i nome nel database degli elementi del disegno cambiano nuovamente in una maniera del tutto imprevedibile.

Per evitare di far impazzire i programmatori di Autolisp, e' stata introdotta la possibilita' di immettere degli identificatori nel file Autocad che diano dei nomi fissi alle entita', in modo che non cambiano ogni volta che il disegno venga riperto: tali identificatori prendono il nome di Handles. Gli Handles possono essere disattivati solo da parte dell'utente, ma non da Autolisp direttamente.

Come se non bastasse a complicare il tutto, gli Handles sono scritti nel file in esadecimale, e oltre un certo numero, benche' scritti correttamente da Autocad, AutoLisp non riesce piu' a gestirli.

Per vedere se gli handles sono attivati, o per attivarli c'e' il comando HANDLES:

 HANDLES

Per avere il nome associato ad un handle, c'e' il comando HANDGET:

 (handget handle)

Esempio:

 (handget "1")
 <Entity name: 1641008>

Le tabelle dei simboli

I simboli, in autolisp, sono i rappresentanti degli elementi costituenti un file autocad, i simboli sono i layer, le linee, i testi, e cosi' via. Le tabelle dei simboli sono un modo per organizzare i dati in un disegno autocad, tutti i layer sono indicati nella tabella layer e cosi' via. Poiche' autocad raggruppa i simboli, e' possibile sia ottenere i dati rigurdanti un simbolo, molto velocemente; come al solito l'ordine di memorizzazione e' causale, quindi si dovra' scorrere una tabella fino a trovare l'elemento cercato.

I comando per le tabelle sono i seguenti:

 (tblsearch nome_tabella nome_elemento [flag])

Ritorna l'elemento cercato (per esempio il layer 0), se il flag e' posto a T, restituira' il valore successivo.

Input/Output sui files

Autocad per lavorare un file, cioe' per editare un file su cui noi possiamo salvare alcuni dati, tipo il numero di linee o di blocchi, deve dire al sistema operativo che il file e' in uso e altri programmi non debbono interferire con esso. In gergo questa operazione e' chiamata aprire uno stream verso un file.

Per aprire uno stream si usa il comando open:

 (open nome_file modo)

Il modo di aprire uno stream puo' essere:

  • Sola lettura (r)
  • Scrittura (w)
  • Aggiuntadati ad un files esistente (a)

La funzione OPEN, restituisce un descrittore del file, il descrittore del file e' la sigla che utilizza il sistema operativo per identificare il file. Una volta conosciuto il descrittore di un file, non ci serve piu' sapere la posizione o in quale periferica si trova il file.

Attenzione: i sistemi operativi hanno un numero elevato, ma non infinito, di possibili file da poter tenere aperti; ricordatevi sempre di chiudere lo stream verso un file quando siete sicuri che non dovrete piu' utilizzarlo. Per chiudere un file si usa il comano CLOSE:

 (close descrittore_file)

MOLTA ATTENZIONE: quando non si chiude un file e si spegne il sistema operativo, ogni file non chiuso diventa UN FILE PERSO, lo spazio occupato dal file sul disco fisso e' considerato a tutti gli effetti come UN CLUSTER PERSO.

Esistono dei nomi di files particolari, che in realta' rappresentano particolari dispositivi del pc, ecco un elenco:

CON
Monitor
PRN
Stampante collegata alla prima porta
COM1
Prima porta seriale
COM2
Seconda porta seriale
LPT1
Prima porta parallela
LPT2
Seconda porta parallela
NULL
L'output viene mandato a NULL, che lo elimina e basta, senza farlo vedere

Scrivere

Vediamo come aprire un file e scriverci:

 (setq fdescr (open "TEST" "w"))
 (write-line "Questa e' una linea con CR e CL alla fine." fdescr)
 (princ (* 3(/ 146.0 4)) fdescr)
 (close fdescr)

Chiariamo subito il programma:

  • Prima di tutto apriamo il file con la funzione OPEN, e salviamo il descrittore del file nella ariabile fdescr
  • Scriviamo, con la funzione WRITE-LINE, una frase con tutti gli accapo di windows a fine riga (CR-CL)
  • Scriviamo qualcosa che non e' una stringa grazie alla funzione PRINC, sempre nel file TEST

La funzione WRITE-LINE scrive una stringa nel file aperto, mentre la funzione PRINC scrive una qualsiasi cosa nel file aperto.

 (write-line "stringa" file_descrittore)
 (princ dato file_descrittore)

Leggere

Vediamo come leggere su un file:

 (setq fdescr (open "TEST" "r"))
 ;ora leggiamo la prima riga e memorizziamola
 (setq primariga (read-line fdescr))
 ;ora leggiamo la seconda
 (setq secondariga (readline fdescr))

Per scegliere di aprire un file esiste la comodissima funzione GETFILED, che permette di visualizzare una comoda finestra per indicare il dove si trova il file di nostro interesse.

 (getfiled "titolo" nomefile "estensione" flags)

Il titolo e' il titolo della finestra, il nomefile puo' essere preimpostato per facilitare la visualizzazione, e puo' essere comprensivo del percorso del file. La estensione serve per poter mettere un filtro alla visualizzazione, ed e' possibile mettere caratteri jolly. Il flag e' un numero pari alla somma di dei seguenti numeri, tale da ottenere la finestra come si vuole:

1
Richiede un nuovo nome di file per un'operazione di scrittura. Se l'utente sceglie un nome gia' esistente appare un messaggio di avvertimento che di conferma alla sovrascrittura.
2
Disabilita la possibilita' di scrivere il nome all'utente.
4
Permette di scegliere qualsiasi estensione
8
Fa partire la directory come quella libreria standard.

Esempio:

 (getfiled "" "" "" 0)

Trovare i file

Autocad possiede un solo comando per sapere se un file c'e' o dove si trova: FINDFILE

 (findfile nomefile)

L'output di questo comando e' il percorso del file se esiste, oppure nil se non esiste. Il comando e' molto veloce, perche' cerca solo nei percorsi stabdard del procramma, cioe' la directory dove si trova, quelle delle librerie e quelle dei file aperti.

Formattazione dei dati in un file

Autolisp puo' leggere i file solo riga per riga (al massimo carattere per carattere con alcune funzioni), quindi maneggare molti dati puo' risultare frustante. Un metodo e' quello di separare i vari dati con degli spazi, questo metodo e' detto in inglese SDF, cioe' Space Delimited Field.

Il metodo SDF e' lo standard nei file lavorati con autolisp, questo perche', benche' si potrebbe pensare di separare i dati su una riga con altri metodi, tipo interporre una virgola (,), autocad e' veloce e efficiente solo nel nel separare le righe con degli spazi; altri metodi sono possibili, ma richiedono cicli e clicli.

Vediamo due esempi:
uno difficile

 (setq str "Pipe-1     12.5    3000 1800 0  134.0")
 (foreach tab '(11 10 5 5 3 5)
   (princ (read (substr str 1 tab)))
   (terpri)
   (setq str (substr str (+ 1 tab)))
   (prompt str)
   (terpri)
   )


e uno semplice e logico:

 (setq str "(Pipe-1     12.5      3000 1800 0  134.0)")
 (setq lista (read str))
 (foreach dato lista (princ dato) (terpri))

Vi ricordo che il comando TERPRI serve solo per andare a capo.

Usare gli attributi di Autocad

Gli attributi in Autocad sono utilissimi, già conosciamo i blocchi, elementi che ci permettono di definire un disegno, ripeterlo piu' volte, e modificarne uno solo per avere ripercussioni su tutti gli altri.

Per prima cosa bisogna distinguere gli attdef dagli attrib. Gli attdef sono memorizzati in una tabella a parte e descrivono come debbono essere memorizzati e gestiti tutti i vari attributi. Gli attrib sono gli attributi veri e propri, che vengono memorizzati all'interno di un blocco.

Ma vediamo praticamente cos si puo' fare con questi attributi. Immaginiamo che il nostro scopo si di vole costruire una tabella punteggio di un gioco con quattro giocatori. Per prima cosa lanciamo il comando ATTDEF:

 ATTDEF

Ci apparira' una maschera con una serie di campi:

TAG
E' l'identificativo del campo, non puo' contenere spazi.
PROMPT
E' la domanda che vi verra' fatta quando dovra' essere riempito il campo
DEFAULT
E' il valore di default con cui verra' riempito il campo se si preme direttamente Enter all'immissione, invece di scrivere qualcosa e poi premere enter.
Invisible
Mettete la spunta a quetsa opzione per rendere il campo invisibile (generalmente dovrebbe essere visibile)
Constant
Se volete che il campo non sia modificabile

In piu' ci sono altre opzione per la forma e la posizione del testo.

Dovete fare un attributo che sia visibile, con:

  • TAG=Giocatore
  • PROMPT=Come si chiama il giocaotre?
  • DEFAULT=

E poi uno con:

  • TAG=Punteggio
  • PROMPT=Che punteggio ha ottenuto?
  • DEFAULT=0

Ora sistemate questi tag uno vicino all'altro, su una stessa linea, poi copiateli e mettene 4 in colonna, in modo da avere una specia di tabella 4 righe e due colonne. Adesso abellite la tabella con una corice, dei titoli, e quello che vi pare, poi lanciate il comando pre creare i blocchi BLOCK, e selezionate tutto, stando attenti a selezionare gli attributi nello stesso ordine con cui volete vi verra' richiesto di riempire i campi; chiamate il blocco TABELLAPUNTEGGIO

Una volta inserito il blocco TABELLAPUNTEGGIO, vi verranno fatte delle domande per riempire la tabella. Provate da soli e vedete cosa succede.

Estrarre i dati

E' molto complicato, se volete usare il mouse lanciate

 (entget (car (nentsel)))

Funzioni geometriche

Ecco una lista di funzioni geometriche:

Angle

 (angle punto punto)

Restituisce l'angolo in radianti fra due punti.

Distance

 (distance punto punto)

Restituisce la distanza fra due punti (sia 2D che 3D).

Polar

 (polar punto angolo distanza)

La funzione polar restituisce il punto che si trova ad un certo angolo ed ad una certa distanza dal punto dato.

Programmi

Ecco un po' di programmi (forse) utili.

Scrivere del testo lungo un arco di circonferenza

 ; Programma che crea una funzione per scrivere lungo un arco di circonferenza

 ;ma prima una funzione utile
 (defun angtoc (ang)
   (setq ang (rtos (atof (angtos ang 0 8)) 2 6))
   (strcat "<<" ang)
   )

 (defun C:ATEXT ( / midp radp txt radi txtlen txtspc txthgt arclen arcang sang
    orent txtang txtp char)
   (setq cmdech (getvar "CMDECHO")) ;memoriziamo lo stato dell'ECHO dei comandi
   (setvar "CMDECHO" 0); ora possiamo metterlo a zero e poi lo rimetteremo al
                       ; valore a cui era prima
   (graphscr);modalita' grafica

   ;INSERIMENTO DATI

   (setq
     radp (getpoint "\nImmetti il punto centrale del raggio: ")
     midp (getpoint "\nImmetti il punto medio del testo: " radp)
     txthgt (getdist (strcat "\nAltezza del testo < " (rtos (setq txt (getvar
                "TEXTSIZE"))) " >: " ));Chiede l'altezza del testo, mostrando il
                                       ;valore di default
     txthgt (if txthgt txthgt txt) ;controlla se txthgt contiene un valore, se si
                                   ;lo assegna, altrimenti assegna quello di
                                   ;default
     txt (getstring  T "\nTesto: ")
     radi (distance radp midp)
     txtlen (strlen txt)
     orent (strcase (getstring "\nTesto rivolto verso il centro dell'arco? <S>:
            "))
     )

   ;Elaborazione seria

   (if (or (= orent "") (= orent "S"))
     (setq radi (- radi (/ txthgt 2))) ;se e' vero
     (setq radi (+ radi (/ txthgt 2))) ;se e' falso
     )

   (setq
     arclen (* txtlen txthgt)
     txtspc (/ arclen txtlen)
     arcang (/ arclen radi)
     sang (- (+ (angle radp midp) (/ arcang 2)) (/ txtspc radi 2));angolo di
                                                                  ;partenza
     count 1
     )

   ;attenzione alla magia!

   (repeat txtlen
     (if (or (= orent "") (= orent "S"))
       (setq                             ;se e' vera
 	txtang (angtoc (- sang (/ pi 2)))
 	txtpos count
 	)
       (setq                             ;se e' falsa
 	txtang (angtoc (- sang (* pi 1.5) 0) )
 	txtpos (- (1+ txtlen) count)
 	)
       )
     (setq
       txtp (polar radp sang radi)
       char (substr txt txtpos 1)
       )
     (command "_.TEXT" "_C" txtp txthgt txtang char)
     (setq
       count (1+ count)
       sang (- sang (/ txtspc radi))
       )
     )

   ;chiudiamo rimettendo tutto come era prima

   (setvar "CMDECHO" cmdech)
   (princ)
   )

Selezionare uno ad uno tutti gli oggetti

Questo programma non fa nulla di molto pratico ma evidenzia graficamente ogni elemento de disegno, uno alla volta:

 (setq ent (entnext))
 (redraw ent 3)
 (while (setq ent (entnext ent))
     (command "_.DELAY" 500)
     (redraw ent 3)
     )
 ;puliamo tutto
 (command "_.DELAY" 500)
 (redraw)

Footnotes

... disegno
In realta' per complicare ancora di piu' l'esistenza a noi utonti, le variabili cambiano a seconda della versione di autocad, nella versione 2000 i file si chiamano acad2000.lsp e acad2000doc.lsp.