Il Bar dell'Ingegneria

Riga di comando Autocad

« Older   Newer »
 
  Share  
.
  1.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Circa un mese e mezzo fa mi sono creato un piccolo programma, una utility, per la gestione di distinte di materiali che mi servono per il mio lavoro.

    Sono riuscito ad implementare una sorta di input automatico facendo leggere al programma un file di testo che riesco a generare direttamente da Autocad.

    Nei disegni da 'interrogare' posiziono un bel po' di blocchi con attributi, e quindi con il comando ESTRATT (in inglese ATTEXT), creo il file di testo in questione, dovendo però prima creare un file "template" (un altro semplice file di testo, in cui con la sintassi prevista da Autocad, specifico cosa voglio 'prelevare' dai vari blocchi).

    Devo solamente indicare al programma il file .txt da leggere, perchè un bel po' di input me lo ritrovi 'magicamente' già fatto.

    Il problema è che oggi io so perfettamente cosa e come fare. Ma domani? Ricorderò la sequenza delle operazioni?
    E se cancello o perdo il file "template"?
    E se faccio adoperare il programma ad altri? Riusciranno facilmente a replicare tutti i passi che oggi io seguo con sicumera?

    Quindi circa una settimana fa mi sono posto il problema di far leggere direttamente al mio programma il contenuto di un file dwg.
    Ovviamente fin da principio non era affatto mia intenzione infilarmi proprio dentro il dwg. Ma più semplicemente facendo fare ad Autocad quel che fa da sempre per me, ma automatizzando il più possibile la procedura.

    In sintesi il mio intendimento era:

    1) Selezionare all'interno del mio programma un file .dwg
    2) Aprire dall'interno del mio programma Autocad
    3) Far aprire automaticamente ad Autocad il disegno selezionato
    4) Una volta aperto il disegno lanciare in automatico all'interno di Autocad un file di script
    5) Chiudere Autocad e 'ritornare' al mio programma

    Mi sono quindi messo alla ricerca dei parametri di linea di comando di Autocad perchè erano ingrediente essenziale alla mia ricetta.
    E sono andato alla ricerca di alcuni semplicissimi file di script per Autocad che avevo scritto oltre una decina di anni fa, in quanto non mi ricordavo più granchè di codesti file di script.
    Pur con questo 'programma' tutto sommato minimale ho impiegato circa una settimana per venirne a capo con ripetute prove serali, e senza farmi scoraggiare dai fallimenti.
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Per quanto riguarda il punto 1 della mia lista, selezionare un file .dwg, non ho avuto problemi.
    Con il mio ambiente di sviluppo è bastato utilizzare il dialogo standard per l'apertura dei file e dare come filtro l'estensione .dwg. In questo modo posso navigare in tutte le directory, rete, dischi esterni, ecc.

    Per il punto 2, aprire Autocad dal mio programma, informandolo di dover aprire proprio il file .dwg selezionato, la cosa è stata anche questa, a primo impatto, assai semplice.
    Sempre il mio ambiente di sviluppo mi mette a disposizione il componente: ActionList.
    Si tratta di un componente che permette di fare tante cose, tra cui proprio lanciare una applicazione esterna. In particolare ho utilizzato la proprietà Run di ActionList (si poteva utilizzare il metodo Open, Print, ecc.).

    Sotto-proprietà di Run sono: FileName e Parameters.

    A questo punto pensavo di essere a cavallo.
    Infatti per esperienze pregresse sapevo che basta inserire il nome del file (con la sua estensione) nella proprietà FileName, perchè sarà il sistema a lanciare l'applicativo a cui quella estensione è associata. Il tutto senza nemmeno sapere dove l'applicativo effettivamente risiede, nè tantomeno dover specificare effettivamente quale applicativo.

    Ad esempio se io scrivo:

    CODICE
    Run->FileName="Testo.rtf";
    Run->Execute();


    Il comando Execute() cercherà nel sistema il programma cui sono associati i file con estensione .rtf (potrà essere Word, o WordPad, oppure Open Office, o qualsiasi altro word processor), per avviarlo e fargli aprire quindi proprio il file Testo.rtf (sempre ammesso che esso realmente esista).

    Quindi pensavo di essermi messo alle spalle sia il punto 2 che il 3 (aprire un file automaticamente all'interno di Autocad).

    In realtà arrivando al punto 4, lanciare automaticamente uno script di Autocad, mi sono accorto di dover tornare indietro sui miei passi.

    Da nemmeno tanto lunga ricerca in rete ho subito trovato le opzioni con cui Autocad può essere lanciato.
    Stranamente queste opzioni sono veramente poche. Forse una sola decina. Da un programma così blasonato mi sarei aspettato di più......(ma d'altra parte se non ho mai utilizzato le opzioni all'avvio di Autocad i programmatori si saran chiesti.....a che pro?)
    L'opzione che fa al caso mio è semplicissima: /b seguita dal nome del file di script.

    Tra le altre opzioni segnalo la: /nologo che senza alcun parametro ulteriore non fa comparire in fase di caricamento del programma la splash window, visualizzando a video direttamente la schermata del programma (seppur inattiva fino al caricamento effettivo di tutto quanto ad Autocad serve per funzionare).

    Queste opzioni possono essere rese 'permanenti' semplicemente smanettando tra le proprietà del collegamento sul Desktop.
     
    Top
    .
  3.     +1   +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Vediamo prima di tutto in cosa consiste un file di script di Autocad.

    Si tratta di una cosa banale. Un semplice file di testo (in formato ASCII) in cui ad ogni riga viene memorizzato un comando. Così come lo digiteremmo da tastiera (o come lo selezioneremmo, il che è lo stesso, dalle varie icone ed iconette dell'interfaccia).

    Si tratta di un 'primitivo' e larvale sistema di MACRO che da sempre Autocad mette a disposizione. Larvale, perchè al contrario di Excel che almeno permetteva di 'registrare' le sue prime macro, semplicemente memorizzando una serie di operazioni che l'operatore faceva a video, qui il file dello script va creato e digitato materialmente dall'utente.

    Per poter lanciare uno script già pronto basta digitare script nella riga dei comandi di Autocad , oppure selezionare il comando "Esegui script..." dal menù "Strumenti".
    Viene chiesto il nome del file di script da eseguire (estensione .scr).
    Dopo di che Autocad esegue tutti i comandi che all'interno del file script sono contenuti.

    Nel mio caso il file di script avrebbe dovuto contenere questo testo:

    CODICE
    filedia
    0
    _attext
    c
    C:\Estrazione.txt
    C:\DatiTxt.txt
    filedia
    1
    _quit


    Il primo comando è importante, se si vuole il completo automatismo dello script. La variabile di ambiente filedia viene settata a 0. Ovvero quando Autocad deve aprire un file (dwg, o di qualsiasi altro genere), invece della finestra di dialogo di Windows di selezione dei file, esso si accontenta della descrizione del percorso dove trovare il file digitato nella area dei comandi. Scomodo, ovvio, nell'uso di tutti i giorni, ma che evita, specie se so che file devo aprire, di scomodare finestre di dialogo che non mi servono e che interrompono il flusso automatico dello script.
    Il secondo comando è proprio lo "Estrai Attributi" che mi serviva automatizzare, con le 3 linee successive che sono opzioni della riga di comando, che altrimenti avrei inserito dalla finestra di dialogo.
    Infine viene ripristinata la visualizzazione delle finestre di dialogo (filedia=1) e quindi si esce da Autocad con il comando _quit.

    Ho inserito i comandi in inglese, antesposti con l'underscore _, in modo che qualsiasi versione di Autocad (italiana, inglese, ecc.) possa eseguire lo script.
     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,170
    Reputation
    +295

    Status
    Offline
    Potrei replicare i comandi anche da VBA per excel o anche da Lazarus?
    Io penso di si e ritengo tu abbia trovato in queste tue ultime ricerche l lista dei comandi inglesi da poter utilizzare per comporre lo script.
    Nel progetto in cui sto tentando di tradurre il Lights di Arcaro, viene creato un file script per autocad che però usa i comandi locali per lo script e quindi non viene letto dal mio autocad.
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Afazio in questo link (che immagino abbia trovato subito anche tu) una carrellata di comandi con la corrispondenza nella doppia lingua: italiano-inglese.

    Comandi Autocad in Italiano ed in Inglese

    Qui invece l'elenco sterminato delle variabili d'ambiente utilizzate dal software (per fortuna con nome univoco - inglese - e non localizzate in base alla lingua):

    Elenco variabili d'ambiente
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Torno al mio problema.
    Risolto con la Run->Execute() i punti 2 e 3, mi sono bloccato al momento della risoluzione del punto 4.

    Infatti con la procedura prima descritta, riuscivo ad aprire Autocad, a fargli aprire il disegno voluto, ma di far partire automaticamente lo script nemmeno a parlarne.
    Ho provato ad aggiungere alla proprietà Run->FileName oltre al nome del file la stringa "\b script.scr" con il risultato di non riuscire ad aprire più nemmeno il file. Autocad si avviava, ma mi segnalava che il file da aprire non era esistente.
    Ho pensato allora di utilizzare la proprietà Run->Parameters, convinto che inizializzarla a "\b script.scr" avrebbe risolto il problema, ma senza sortire l'effetto sperato.

    Da una lettura attenta dell'help online del mio compilatore rilevo che Parameters funziona solamente se l'altra proprietà FileName è "empty" vuota.
    Non capisco quindi a cosa possa servire la proprietà Parameters, ma certamente non serve a quanto avevo in mente io.

    Inoltre il risultato parziale che avevo ottenuto (apertura di Autocad, apertura del disegno), mi ha fatto capire che in ogni caso si tratta di un processo 'parallelo' e che il mio programma nel frattempo continuava la sua esecuzione anche quando Autocad perdeva tempo a caricarsi.

    E poichè al mio programma serve il file di testo creato da Autocad, si ottiene sempre che per il mio programma il file cercato non esiste (perchè non ancora creato quando il mio programma lo cerca).

    Quindi avrei dovuto 'bloccare' l'esecuzione del programma, o metterlo in una sorta di loop infinito fino a quando non fosse comparso il file di testo.

    A mali estremi, estremi rimedi, mi sono detto.
    Ed ho deciso di 'rispolverare', letteralmente, vecchie funzioni di libreria C di cui ho sempre letto, ma mai utilizzato.

    Sarebbero funzioni presenti nelle librerie dei compilatori C praticamente da sempre. Inizialmente pensate per Unix, di fatto funzionavano anche sotto DOS, figurarsi oggi sotto Windows.

    Mi riferisco alla famiglia delle funzioni: spawnxx()
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Intanto qui link alle opzioni della riga di comando, direttamente dal sito Autodesk, per l'avvio "personalizzato" di Autocad.

    http://knowledge.autodesk.com/support/auto...DF093A-htm.html
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Le funzioni spawnxx() sono una intera famiglia.
    I loro nomi paiono uno scioglilingua e si parte dalla semplice spwanl(), passando per spawnle(), fino ad arrivare a spawnlpe() e spawnvp(), ecc.

    Sono circa una dozzina di funzioni che a prima vista sembrano tutte uguali, ma che pur facendo le stesse operazioni (caricare un altro programma dal proprio programma) lo fanno in modo lievemente diverso.

    Esisterebbe anche analogo elenco di funzioni che iniziano con exec, anche queste una dozzina almeno, con analoghe letterine finali, ma che scopro hanno una sostanziale differenza dalle spawn.
    Infatti anche queste funzioni caricano un altro programma, ma si sovrappongono al programma chiamante, non consentendo di riprendere il programma che chiama queste funzioni dal punto in cui era arrivato. In definitiva non sono funzioni che per lo specifico problema mi potevano interessare.

    Le funzioni spawnxx() hanno una caratteristica particolare del C. Ovvero si tratta di funzioni che accettano un numero variabile di parametri in ingresso.

    La mia attenzione tra le tante alternative si è concentrata infine sulla funzione che normalmente è al capo della lista.

    int spawnl( int mode, const char * path, const char * arg0, const char * arg1..., const char * argn, NULL )

    E' una funzione che restituisce un valore intero (solito -1 se qualcosa è andato storto), e che accetta come primo parametro, il mode, una opzione che me l'ha fatta piacere subito.
    Infatti se a mode si assegna il valore MACRO P_WAIT ecco che il programma chiamante si ferma in attesa che il programma chiamato con spawnl() sia stato terminato.
    I valori per mode sono in totale 4, l'ultimo valore P_OVERLAY rende di fatto spawnl() identica a execl().

    Il secondo parametro è il nome del programma, comprensivo di percorso, che si vuol lanciare. E quindi nel mio specifico caso ho la necessità, per far funzionare bene il mio programma di sapere dove nel sistema in cui lo eseguo risieda l'installazione di Autocad. Ne parliamo dopo.

    Il secondo parametro è.....identico al primo. Anzi, nella documentazione si dice che il parametro arg0 deve per forza esserci, e di fatto è la replica del primo parametro path.

    Se non si vuol altro, basta inserire al posto di arg1 il valore NULL e chiudere la chiamata alla funzione. Altrimenti si può approfittare dei parametri arg1, arg2, .... argn per introdurre 1, 2, 1000 opzioni alla linea di comando. E' importante che alla fine dell'elenco l'ultimo sia NULL.

    Io ovviamente ho approfittato del solo arg1 inserendo come stringa "/b Script.scr", dove Script.scr è il file di script (con il suo percorso, ovviamente) che intendo far eseguire automaticamente ad Autocad non appena esso si carica. Ho fatto anche delle prove con l'opzione "/nologo". Ma senza la splash windows i tempi di attesa a volte sono tali che pare che il tutto si sia bloccato.
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Insomma, pare che utilizzando infine la spawnl() io abbia risolto tutto.

    In effetti c'è ancora un piccolo problema irrisolto consistente nel percorso di Autocad nel sistema dove il mio programma andrà ad installarsi.
    In più ho introdotto io un ulteriore piccolo problema.

    Ad un certo punto, e non chiedetemi perchè, ho deciso di non passare ad Autocad il file da aprire (dovrebbe essere il parametro arg1 della funzione spawnl(), shiftando ad arg2 il successivo comando "/b script.scr"), ma di inserirlo direttamente nel file di script.
    D'altra parte se nel file di script si replicano i comandi da tastiera sarà pur semplice 'invocare' l'apertura di un file, no?

    Infatti il mio file di script a questo punto ha preso la seguente forma:

    CODICE
    filedia
    0
    _open
    Nome del file con il suo percorso
    _attext
    c
    C:\Estrazione.txt
    C:\DatiTxt.txt
    filedia
    1
    _quit


    E quindi pensavo di essere a cavallo.
    Ma come al solito, basta spostarsi di un computer, da quello di casa in ufficio, o viceversa, che ciò che funziona da una parte non funziona dall'altra......

    Il problema che ho riscontrato era che il percorso, ma anche il nome del file che i file di script "desiderano" non devono contenere spazi.
    Ora, si può sempre risolvere non inserendo spazi nel nome file da selezionare (bisogna però avvertire l'ignaro utente), ma basta essere in un sistema XP e che il file dwg 'da processare' risieda nel desktop, perchè la directory "Documents and Settings" mandi tutto a carte e quarantotto.
    Come ben sappiamo, fin dalle versioni 'primitive' di Autocad la barra spazio, ed il tasto Enter, hanno ambedue la stessa funzione. E gli sviluppatori di Autocad sono sempre stati attentissimi ad aggiungere nuove funzionalità, ma mai a cancellarne qualcuna di quelle vecchie. (Ho scoperto di recente che ancora esisterebbe il 'mitico' comando 'zoom dinamico' allora come oggi quasi incomprensibile nel suo funzionamento).

    Con una chiave di ricerca fortunata (non riesco a trovare più il link dove ho trovato il suggerimento), ho trovato un topic in un forum italiano con 2 soli post. Nel primo l'autore del topic chiedeva alla platea come risolvere la questione. Nel secondo topic, sempre lo stesso autore rispondeva: Ho risolto. Basta mettere il nome del file, con tutto il percorso, tra virgolette.

    Vi comunico che è vero.

    E vi do questo link, reperito adesso che scrivo, dove probabilmente l'autore ha attinto la sua informazione:

    http://exchange.autodesk.com/autocadmep/it...a30d6b-7fe1.htm

    Oltre alla storia delle virgolette è presente qualche altra interessante considerazione su altri comandi che si possono dare in pasto agli script.

    Mi dispiace non poter ringraziare l'utente italiano del forum italiano che ha fatto la domanda e si è poi preso la briga di comunicare al mondo intero non soltanto di aver risolto, ma anche come. Poteva anche non farlo. Ma avendolo fatto mi ha dato una buona mano di aiuto.
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,170
    Reputation
    +295

    Status
    Offline
    CITAZIONE (zax2013 @ 29/6/2015, 13:52) 
    Mi dispiace non poter ringraziare l'utente italiano del forum italiano che ha fatto la domanda e si è poi preso la briga di comunicare al mondo intero non soltanto di aver risolto, ma anche come. Poteva anche non farlo. Ma avendolo fatto mi ha dato una buona mano di aiuto.

    Mi piace quotare questa parte del tuo messaggio.
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    3,345
    Reputation
    +213

    Status
    Offline
    CITAZIONE (zax2013 @ 29/6/2015, 13:52) 
    Con una chiave di ricerca fortunata (non riesco a trovare più il link dove ho trovato il suggerimento), ho trovato un topic in un forum italiano con 2 soli post.

    prova a cercare nella cronologia del browser.
    in genere conserva i link dei siti visitati anche dopo mesi.
    in questo modo io spesse volte riesco a ripercorrere i miei passi.
     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Seguendo il suggerimento di Reversi ho risolto la questione dei rigraziamenti.

    Il link che avevo trovato era questo:

    Problema negli script con gli spazi vuoti nei percorsi

    Il forum è questo: Forum CAD3D

    (non lo conoscevo, forse molto più orientato al CAD meccanico che a quello civile)
    Ed infine il ringraziamento ad ale.paoli che circa 5 anni ha lasciato traccia del suo passaggio.

    Per quanto riguarda il mio specifico problema, l'utilizzo della funzione spawnl() ha risolto buona parte degli inconvenienti riscontrati, ma ci ho 'guadagnato' un problema nuovo. Ovvero quello di conoscere il percorso di installazione del programma Autocad in ogni computer in cui il mio programma andrà ad installarsi.

    Provare con una ricerca 'automatica' è operazione che ho scartato a priori. Tra acad.exe e acadlt.exe, tra directory di installazione che iniziano con Autodesk ed altre con Autocad, con sistemi in cui la cartella dei programmi è "Programmi", oppure "Programmi (x86)" ci ho subito rinunciato.

    Semplicemente installo il programma nella nuova macchina senza uno specifico file di configurazione. Al primo avvio il programma non trova il file di configurazione e quindi per prima cosa visualizza una finestra di dialogo in cui si chiede all'utente di navigare alla ricerca del suo CAD con cui aprire i dwg (perchè potrebbe anche non essere Autocad ma un suo 'quasi' clone che comunque riesce a gestire gli script). Alla chiusura della finestra viene memorizzato il file di configurazione che contiene proprio il percorso selezionato.

    Quindi al successivo riavvio del programma il file di configurazione esiste, esso di avvia quindi normalmente, viene aperto il file di configurazione, letto il percorso di autocad e memorizzato in una variabile interna, pronto ad essere utilizzato alla bisogna.

    Ragazzi, è tutto.
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    L'appetito vien mangiando.

    Nei miei disegni per prefabbricatori faccio un uso esteso di blocchi con attributi. Ed è da un po' di tempo che vorrei automatizzare il più possibile determinate procedure numeriche.
    Ad esempio utilizzo blocchi con attributi per le tabelle delle armature. Ogni singolo blocco una posizione: sigla, diametro, sviluppo, n.pezzi, kg totali.

    Adesso mi è venuto in mente che potrei creare un programma "magico". Ovvero un programma senza interfaccia che riesca a prelevare gli attributi da un file dwg e che quindi li modifichi senza uscire da Autocad.
    "Magico" perchè parrebbe che il programma operi in maniera diretta sul file .dwg, come se ne conoscesse la struttura, e senza che l'utente capisca come il programma fa.

    Ho scoperto che da autocad è possibile lanciare programmi esterni.
    In sintesi basta creare un nuovo comando. Il nuovo comando si crea manipolando opportunamente il file acad.pgp

    Quindi a grandi linee il mio progetto prevederebbe:

    a) Creazione di un file di script che estrae gli attributi che mi interessano generando un file di testo e lanciando quindi il mio programma. Script che rimane in attesa delle elaborazioni del mio programma.

    b) Intervento del mio programma che legge il file di testo con gli attributi dei blocchi, procede a fare determinate operazioni aritmetiche, e genera a sua volta un ulteriore file di script che dovrebbe modificare gli attributi dei blocchi.

    c) chiusura del programma e proseguimento dello script di cui al punto a) che altro non fa che 'lanciare' il file di script generato dal programma al punto b)

    Questo 'meccanismo' funzionerebbe con tutte le versioni di Autocad, comprese quelle LT (in passato avevo utilizzato un programma commerciale che eseguiva qualcosa del genere, appoggiandosi ad Excel, ma esistevano versioni specifiche per ogni versione di Autocad).
    Il problema che avevo fino a poco tempo fa era relativo all'ultimo punto c).
    Come informare Autocad che proprio uno specifico blocco era da modificare e con determinati valori degli attributi?

    Oggi pare che le nebbie si siano schiarite. Infatti in fase di estrazione dei blocchi tre attributi 'standard' sono proprio i punti di inserimento x,y,z del blocco.
    Nel file di script (punto b) alla selezione con mouse del blocco con attributi da modificare mi basta sostituire queste coordinate perchè il blocco venga selezionato e quindi editato nei suoi attributi.

    Vediamo se riesco.
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Primo passo - aggiungere un comando in Autocad

    Tutto sommato si tratta di operazione banale ed abbastanza facile. Bisogna aprire, con un qualsiasi editor di testo (Notepad.exe va più che bene), il file acad.pgp.

    Vi trovate qualcosa del genere:

    png

    Il file di testo è splendidamente commentato e praticamente non è necessario cercare null'altro in rete per eseguire l'operazione di aggiunta di un altro comando.
    L'unico problema 'serio' è andare a trovare la corretta posizione nel vostro hard-disk di questo benedetto file.
    Nelle versioni più 'antiche' di Autocad esso risiedeva nella stessa directory di installazione del programma.
    Invece nelle versioni più recenti si dovrebbe trovare qui: C:\Users\NOME_UTENTE\AppData\Roaming\AutodeskAutoCAD 2xxx – Italiano\R19.0\ita\Support
    Ovviamente se avete Autocad in italiano, altrimenti i vari ita, ecc. vanno intesi come en.
    Aggiungo che la directory AppData è generalmente nascosta di default da Windows, quindi non è detto che la vediate e la troviate, a meno di non intervenire nelle opzioni di visualizzazione di Explorer richiedendo di vedere anche le directory nascoste.

    In ogni caso, ogni riga del file acad.pgp che inizia con un ( ; ) è un commento. E parecchi sono i commenti nella intestazione.

    Come vedete nella stessa immagine che ho postato, l'aggiunta di un comando si compone di 4 parametri separati da virgole (,).
    E' importante che i 4 parametri vengano a loro volta terminati con una virgola (,).

    Il primo parametro non è altro che il nome del comando che si digiterà da tastiera all'interno di Autocad.

    Il secondo parametro sarà il percorso ed il nome del programma che si intende lanciare alla invocazione del comando. Eventualmente questa stringa potrà contenere anche eventuali parametri specifici da linea di comando con il quale il programma potrà essere lanciato (per i 'vecchi' i famosi -a o /a o letterine similari con cui a volte si potevano lanciare i programmi DOS)

    Il terzo parametro è un flag e può avere differenti valori: a me interessa il valore 0, che corrisponde allo stop di Autocad finchè il programma invocato non abbia terminato il suo lavoro.
    In ogni caso di tratta di un campo di bit. Quindi "bit 2, bit 4, ecc, impostato" indica che nella espressione binaria del numero che inserirete come flag i bit n.2 o n. 4 dovranno avere valore 1.

    Infine il 4° parametro sarebbe la frase che al prompt comparirebbe dopo aver invocato il comando (sempre se serve).

    Non tutti i 4 parametri sono necessari. Ma in ogni caso bisogna mettere le virgole (,) di separazione tra un parametro e l'altro anche se il parametro non c'è.

    Io mi sono divertito ad aggiungere questo comando:

    png

    A quanto pare il comando può essere digitato senza problemi di lettere maiuscole o minuscole, sia nel file .pgp che nella linea di comando di Autocad.

    Io ho provato. Funziona.
    E se funziona digitando il comando da tastiera sarà possibile farlo funzionare anche all'interno di un file di script.

    Una raccomandazione: prima di modificare il file in oggetto fatene una copia. In modo da ripristinare eventuali sfracelli che si possano combinare.
    Io vi ho avvisato. Non è colpa mia!
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Secondo passo - Estrarre gli attributi dei blocchi

    Ne ho accennato in precedenza. Ma l'estrazione dei blocchi deve essere preceduta da una fastidiosa operazione. Ovvero la definizione all'interno di un file di testo delle informazioni che si vuole Autocad prelevi dai vari blocchi che compongono un disegno.
    Questa 'personalizzazione' è una bella cosa ma ha l'inconveniente della creazione del file in oggetto.

    Anzi tutto dobbiamo osservare che tutti iblocchi, anche quelli a cui esplicitamente non abbiamo assegnato alcun attributo, possiedono una quindicina di attributi interni.
    Questo quanto recuperato dall'help online del mio Autocad LT:

    png

    A questi attributi interni si aggiungono gli attributi inseriti nel blocco dall'utente.

    Per non stare troppo generici vi faccio vedere il blocco su cui io vorrei operare:

    png

    Numero della posizione (che potrebbe essere anche una lettera), il diametro, lo sviluppo, in numero delle ricorrenze della posizione, i kg complessivi di peso.
    Ovviamente si tratta di una riga che sta all'interno di una tabellina più o meno popolata di altre righe, e nello spazio tra diametro e sviluppo si inserisce la sagoma della posizione con relative lunghezze parziali.

    Se esplodo questo blocco ottengo:

    png

    Ovvero il nome degli attributi che a suo tempo ho inserito quando ho costruito il blocco (il simbolo del diametro è in effetti il testo %%C).

    A questo punto con il comando ESTRATT posso estrarre dal disegno tutti i dati di ogni singolo blocco. Previa definizione nel file "modello" in cui definiamo cosa e come vogliamo che autocad estragga.

    Nella fattispecie il mio file modello, un file di testo, avrebbe questa 'forma':

    CITAZIONE
    BL:NAME C030000
    BL:X N020004
    BL:Y N020004
    BL:Z N020004
    POS C018000
    %%C N020000
    LUNG N020002
    N. N020000
    PESO N020002

    Dove ho voluto estrarre gli attributi "interni" nome del blocco e punto di inserimento, oltre a quelli da me definiti.
    Dopo ogni singolo TAG dell'attributo va inserito un codice di 7 caratteri.
    La C indica che l'attributo da estrarre è una stringa alfanumerica. La N indica che l'attributo da estrarre è un numero.
    I successivi 6 numeri indicano, a coppie di 3 cifre, rispettivamente il numero di caratteri da estrarre dall'attributo, ed il numero di cifre decimali nel caso l'attributo fosse un numero.
    Con l'identificatore C va da se che gli ultimi 3 numeri saranno sempre 000.

    Ad esempio l'attributo LUNG ha la stringa: N020002
    Ovvero si tratta di un Numero, si vorranno prelevare fino a 20 cifre (compreso il punto decimale e le cifre dopo la virgola), ed il numero verrà formattato con 2 cifre decimali.
    Altro esempio: l'attributo BL:NAME. Si tratta di una stringa alfa numerica e si vuole prelevare 30 caratteri complessivi.

    A questo punto, creato il file "modello" così come vuole la Autodesk, lanciato il comando ESTRATT, e sperando che tutto vada a buon fine, si ottiene un file con estensione .txt (per default il nome del disegno) che più o meno si presenta così:

    png

    Potete osservare che le stringhe (quelle definite dalla C nella stringa alfanumerica) sono state esportate tra virgolette (') (') (RIG_TAB_ARM_FE44K è il nome del mio blocco), invece i numeri hanno il numero di cifre decimali definiti nel file "modello".
    La separazione tra un attributo e l'altro avviene con la virgola (,) ma si tratta di una opzione gestibile dal comando ESTRATT.

    Ciò che voglio farvi notare è che nel file modello io non sono stato costretto a dire ad Autocad di estrarre gli attributi solamente del blocco RIG_TAB_ARM_FE44K, ma ho invece detto di estrarre gli attributi LUNG, POS, ecc. dal mio disegno. A qualsiasi tipo di blocco questi appartengano.
    Quindi se io avessi avuto un ulteriore blocco, faccio una ipotesi, RIG_TAB_ARM_FE32K, che avesse avuto il nome degli attributi identici (PSO, %%C, ecc.) me li ritroverei nel file di testo che vi ho appena mostrato.

    Il mio futuro programma leggendo questo file di testo sarà poi in grado di eseguire le somme di tutte le barre Fe44k sommando a parte le Fe32k, se mi servisse questa logica.

    E se un blocco, qualsiasi, avesse solamente l'attributo POS, e non tutti gli altri indicati nel file modello, nel file di testo esso comparirebbe anche, con l'unico campo, il POS, riempito del valore opportuno, e con gli altri campi, che in quel blocco non esistono, settati a 0 se numerici o '' nel caso di caratteri.

    Edited by zax2013 - 25/8/2015, 14:12
     
    Top
    .
35 replies since 26/6/2015, 12:57   4811 views
  Share  
.