Libreria di "moduli" autolisp

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#1
Quando ero piccolo, c'era un giocattolo (che ho sempre sognato e mai ricevuto!), che era composto da tanti cubi colorati e con dei contatti elettrici su alcuni lati. Questi cubi contenevano dei circuiti elettrici ed elettronici, che eseguivano una specifica funzione. Accostando questi cubi gli uni agli altri, era possibile creare degli apparecchi di una certa complessità, seguendo le istruzioni di un piccolo manuale.
Il concetto è esattamente quello delle sub di autolisp.
Fino ad ora, quando intendevo creare un nuovo comando, incominciavo ad aprire i miei vecchi listati ed andavo di "Copia & Incolla". Ora vorrei iniziare a mantenere separati in miei "cubi" in file singoli e creare il nuovo comando "assemblando" i vari cubi mediante (load"nomedelcubo").
Quest'idea dei file separati è di per se simile all'approccio ottenibile con i Progetti in Visual Lisp (PRJ), tuttavia anche in quel caso i file facenti parte del progetto li mettevo tutti in una cartella e quindi riscrivevo le routine ogni volta.

Vorrei in questo post iniziare a mettere a disposizione una serie di "moduli" in modo che divengano una "libreria" dal quale caricare i moduli (o cubi!) che mi servono. Il vantaggio consiste nell'ottenere un risultato molto più velocemente e nel poter migliorare in tempi successivi il singolo modulo, propagando il miglioramento a tutti i comandi che lo usano.
Questo comporta la necessità di creare dei moduli molto ben strutturati, con chiare indicazioni delle variabili richieste in input e quelle che si ottengono in output e soprattutto fare attenzione a non variare il n. e la tipologia di variabili in ingresso e uscita, pena il mancato funzionamento dei listati precedenti. Per maggior chiarezza ho pensato che quelle in uscita, essendo "globali", le voglio contrassegnare con una & davanti nel nome, in modo da riconoscerle: autolisp a differenza di altri linguaggi non va molto per il sottile sui caratteri usati per i vari tipi di variabili!
Quindi inizio con 2 moduli chiamati 'x11:tasto' e 'x11:messaggio' (notare l'x11 come prefisso: si tratta di un piccolo vezzo!), questi vengono utilizzati nel comando 'scelta' e 'scelta1', entrambi contenuti nel file 'SCELTA.LSP'.

Bene: io ho lanciato la prima pietra.... a voi il compito di "lapidarmi" con altri moduli!
 

Allegati

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#2
In questa seconda puntata, il programma principale è SELEZIONI.lsp che una volta caricato con (load"selezioni") ---ipotizzando che tutti i file si trovino in un percorso riconosciuto da Autocad --- poi va lanciato con:

SELEZSING per la selezione di un singolo oggetto, oppure con
SELEZMULT per la selezione di molti oggetti

La prima sub proposta è x11:GWORD contenuta nel file GWORD.LSP che serve per immettere una lettera o una parola fra quelle "autorizzate" dal comando INITGET. E' il classico sistema per dire ad Autolisp che cosa fare. A differenza di x11:tasto, qui è necessario immettere Invio dopo la scelta anche perchè in questo caso la scelta può essere una parola (Si/No) e non solo un tasto singolo. Un parametro (bit) ci consente di accettare o meno la risposta nulla (Invio o Spazio) e di sostituire la risposta nulla con un valore di default predeterminato.

Lo scopo principale di questa nuova serie di moduli, è però un altro: la selezione di 1 o più entità del disegno.

Con la sub x11:SELSINGOLA contenuta nel file SELSINGOLA.lsp, ci viene chiesto di cliccare su una singola entità del disegno: da questa verranno estratti i dati richiesti mediante una lista contenente i codici di gruppo. Per es. di un'entità ci può interessare sapere su che layer si trova, di conoscerne il colore ecc.

La sub x11:GWORD ci ha consentito, per blocchi e polilinee, di scegliere se selezionare le entità "esterne",

o quelle che vi si trovano all'interno, mentre per le altre entità, le 2 scelte si equivalgono:
nel caso dei blocchi, cliccando su qualunque elemento che ne fa parte, se la scelta è stata quella di ottenere l'entità esterna, ci viene restituito il nome del blocco; viceversa ci viene restituita la linea, il cerchio... cioè quell'entità che otterremmo se esplodessimo il blocco. Cliccando su un attributo otterremo il dati dell'attributo.

- La lista in uscita è una cosa tipo:
((0 . "LINE") (8 . "ASSI") (10 6540.91 6920.91 0.0) (11 2540.91 6920.91 0.0))

La scelta di una o dell'altra tipologia, dipende dalle elaborazioni che si intendono fare successivamente.

Come esempio abbiamo selezionato una linea ed utilizzato i seguenti codice di gruppo:

Codice Descrizione Valore trovato
0 Nome entità (Linea) "LINE"
8 Nome del layer "ASSI"
10 Coord. punto inizio (6540.91 6920.91 0.0)
11 Coord. punto fine (2540.91 6920.91 0.0)

La sub x11:SELEZMULT contenuta nel file SELEZMULT.lsp è molto più articolata della precedente, poichè permette di scegliere gli oggetti del disegno, con tutte le modatità previste dalle varie tipologie di selezione: se non si immette nessuna modalità (premendo invio alla richiesta), è possibile selezionare le entità cliccando singolarmente ed aggiungendo (o togliendo) nuove entità con finestre ecc. ed accettando poi con Invio; viceversa se viene ad es. scelta la modalità Window (finestra), ci verranno richiesti i 2 vertici e poi si passerà immediatamente all'elaborazione.
Per non complicare ulteriormente la subrutine (essendo sostanzialmente solo dimostrativa), non ho aggiunto un sistema che creasse dei filtri di selezione delle entità o dei dati da visualizzare in uscita. Questo compito è affidato all'utente che, se vuole dei filtri, assegna dei valori alle variabili LSTC e LSTFILT e lo fa modificando manualmente il file. Viceversa se queste variabili hanno valore NIL, non avverrà alcun filtraggio.
 

Allegati