Leggere i DWG con LibreOffice e progeCAD

Automatizzare la lettura dei dati dai disegni

Scritto da Roberto Rossi il 11-2019

Oggi parliamo della suite di office automation LibreOffice e del CAD che utilizzo, progeCAD. In realtà molti dei concetti espressi sono validi per molti altri CAD, come AutoCAD, BricsCAD, IntelliCAD e simili.

Ciò che voglio provare a fare è semplice. Utilizzando il linguaggio Basic presente in LibreOffice, ed in particolare quello del modulo Calc, voglio ottenere una piccola tabella contenente l'elenco di tutte le entità inserite in un semplicissimo disegno salvato in formato DWG.

Non sono state poche le volte che mi sono sentito chiedere come interfacciare LibreOffice con il CAD per la manipolazione dei file DWG. Bene, credo sia arrivato il momento di fare una piccola introduzione all'argomento.

Nulla di particolarmente complesso, un po di concetti di base, qualche linea di codice Basic, alcune indicazioni aggiuntive, e il gioco è fatto.

E quindi? Buona lettura con LibreOffice e progeCAD...

Cosa diamo per scontato?

Per comprendere questo articolo ci sono alcune cose che il lettore deve conosce.

Prima di tutto chi legge deve sapere cos'è LibreOffice Basic oppure deve avere avuto qualche esperienza con i prodotti Microsoft quali Visual Basic, VBA, VB.NET. A dire il vero basterebbe anche una qualche esperienza di programmazione in genere.

Inoltre, per capire ciò che si farà con i file DWG, è bene conosce anche le nozioni base relative ai disegni tecnici realizzabili con AutoCAD, progeCAD o CAD compatibili.

Per chi invece è completamente a digiuno di tutto ciò, nella sezione Riferimenti ho raccolto i link chiave per iniziare il proprio viaggio nel mondo di LibreOffice, Basic e progeCAD.

Per quanto riguarda la dotazione software, in questo articolo ho utilizzato solamente due programmi. LibreOffice Calc e progeCAD.

LibreOffice, ti presento progeCAD

Come possiamo, da LibreOffice, pilotare progeCAD in modo da utilizzarlo come tramite per interagire con i file DWG?

Usando l'interfaccia ActiveX di progeCAD. Per chiarire, l'ActiveX Automation è un "sistema" che consente, a qualsiasi applicazione esterna, di utilizzare le funzionalità di progeCAD. In realtà anche molti altri CAD possiedono una interfaccia ActiveX (es.: AutoCAD, BricsCAD, zwCAD, IntelliCAD, ecc...), alcuni dispongono di una struttura di oggetti simile a quella di progeCAD, altri un po meno, comunque, in senso generale, i concetti espressi qui sono validi in molte altre situazioni.

Modello ad oggetti progeCAD

Quello che è rappresentato qui è il modello ad oggetti adottato dall'interfaccia ActiveX di progeCAD. Cliccando sull'immagine si potrà vedere l'intero albero.

Mediante questi oggetti sarà possibile interagire, quasi completamente, con le entità presenti nel DWG ed, eventualmente, si potrà crearne di nuove.

Chiarito il "come" comunicare con progeCAD, diciamo due cose anche su LibreOffice.

LibreOffice possiede un linguaggio di programmazione interno, molto semplice, e disponibile in tutte le versioni, il suo nome è Basic.

Chiunque sia abituato a una versione di Microsoft Visual Basic e VBA si troverà subito a sui agio con LibreOffice Basic, infatti la sua sintassi è simili e molto codice è portabile tra i vari ambienti. Naturalmente anche il vecchio, e ormai obsoleto, OpenOffice utilizza il medesimo Basic.

La funzione fondamentale, di cui LibreOffice Basic dispone, e che ci permetterà di interagire con progeCAD è piuttosto semplice, il suo nome è CreateObject e questa è la sua sintassi:

oObj = CreateObject ( type )

Con questa istruzione potremo creare un oggetto che incapsulerà interamente il CAD, con il quale effettuare la manipolazione diretta di qualsiasi DWG.

LibreOffice che apre i DWG

Bene. Iniziamo a lavorare.

Le prima cosa che il nostro programma, scritto in linguaggio Basic, farà è quella di aprire un semplicissimo disegno in formato DWG, questo :

Il file DWG

Poco. Solo qualche entità. Due rettangoli, due cerchi e quattro linee, distribuiti su layer diversi. Tutto qui.

Quello che faremo ora è aprire il file DWG che, con molta fantasia, ho chiamato esempio1.dwg.

Apriamo LibreOffice, il modulo Calc, e creiamo una nuova macro Basic, poi inseriamo questo codice:

Apertura e chiusura

A mio parere, la riga più importante è la 15. Viene creato un oggetto che fa riferimento ad una nuova istanza di Icad.Application, che non è altro che il nostro progeCAD. Quello che si ottiene è la variabile pCad.

Una volta ottenuto pCad, usando la proprietà Documents, che rappresenta l'insieme dei documenti presenti nel CAD, accediamo al metodo Open (linea 17) che ci permette di specificare il nome del file da aprire e un valore booleano che indica di aprire il dwg in sola lettura.

La linea 19, in realtà, è superflua. Serve per ottenere l'accesso allo spazio modello, dove sono presenti le entità del nostro disegno. La useremo poi negli esempi successivi.

La procedura si conclude, chiudendo tutti i documenti con il metodo CloseAll, specificando con il parametro False di chiudere i documenti senza salvare.

Ultima istruzione, pCad.Quit(), chiude progeCAD.

Guardiamo dentro progeCAD

Ciò che a questo punto potrebbe passare per la mente di chi legge è:

"Ma come faccio a sapere di Documents, di Open, di CloseAll, ecc...?"

Legittima domanda.

Tutto quello che può fare progeCAD, tutta la documentazione relativa alla sua interfaccia ActiveX, è già incluso nel programma stesso.

Basta aprirlo, andare nel menu Help/Aiuto/? e cliccare sul Developer Reference. Ecco qui tutto ciò che serve per padroneggiare gli oggetti, i metodi e le proprietà supportate dal CAD:

Developer Reference

Certo, se non si sa nulla di CAD non sarà semplice capirne il funzionamento però, con un po di impegno nulla è impossibile.

La cosa interessante è che questa documentazione è valida indipendentemente dal software che pilota progeCAD, che sia LibreOffice, OpenOffice o qualsiasi altro programma, un reference che vale per tutti.

LibreOffice legge i DWG

Ora facciamo sul serio.

Dopo aver visto come aprire un file DWG, proviamo ora a leggere quante entità ci sono nel disegno e proviamo a fare un elenco degli oggetti presenti, del loro tipo e dei layer di appartenenza. In questo modo sarà possibile comprendere meglio come ottenere informazioni dai nostri disegni.

Anche in questo caso nulla di veramente complesso. Quindi, apriamo il nostro LibreOffice Calc, creiamo una macro Basic e utilizziamo questo codice:

Sub ReadDataFromProgeCAD()
  Dim pCad As Object
  Dim pCadDoc As Object
  Dim ent As Object
  Dim i As Integer
  Dim model As Object
  Dim entType As String
  Dim entLayer As String
  Dim entHandle As String

  Dim iLine as Integer
  Dim iColumn as Integer
  Dim Doc As Object
  Dim Sheet As Object
  Dim CellRange As Object
  Dim Cell As Object

  Dim DwgFileName as String

  DwgFileName = "c:\temp\esempio1.dwg"

  Doc = ThisComponent
  Sheet = Doc.Sheets(0)
  iLine = 1
  iColumn = 1

  pCad = CreateObject("Icad.Application")
  pCadDoc = pCad.Documents.Open(DwgFileName, True)
  model = pCadDoc.ModelSpace

  While (i < model.Count)
    ent = model.Item(i)

    entType = ent.EntityName
    entLayer = ent.Layer
    entHandle = ent.Handle

    Cell = Sheet.GetCellByPosition(iColumn, iLine)
    Cell.String = entType
    Cell = Sheet.GetCellByPosition(iColumn + 1, iLine)
    Cell.String = entLayer
    Cell = Sheet.GetCellByPosition(iColumn + 2, iLine)
    Cell.String = entHandle
    iLine = iLine + 1

    i = i + 1
  Wend

  pCad.Documents.CloseAll(false)
  pCad.Quit()

  MsgBox("Procedura Conclusa")
End Sub

In questo codice sorgente sono chiaramente visibili le linee che gia avevamo visto per l'apertura e la chiusura di file DWG e di progeCAD, quindi le tralasceremo.

Ci concentreremo sulle operazioni eseguite sul disegno. In particolare possiamo osservare l'uso della variabile model, che rappresenta l'oggetto che racchiude tutto ciò che esiste nello spazio modello, in pratica il disegno vero e proprio.

La prima proprietà dell'oggetto model ad essere utilizzata è Count, che contiene il numero di entità grafiche presenti nel nostro disegno. In pratica 8.

A seguire abbiamo il metodo item, appartenente a model, che possiamo utilizzare per accedere ai singoli elementi del disegno, semplicemente specificando un indice numerico. In questo modo il programma ottiene un riferimento ad una singola entità grafica memorizzandolo nella variabile ent.

ent contiene un oggetto che, la documentazione di progeCAD, chiama Entity Object. Questo tipo di oggetto contiene le tre proprietà EntityName, Layer e Handle che, rispettivamente, contengono il tipo di entità (linea, cerchio, arco, ecc...), il nome del layer sul quale l'entità si trova e l'identificativo univoco dell'entità.

Una volta in possesso di questi tre dati, il programma non fa altro che andare ad inserirli in alcune celle del foglio corrente, presente in LibreOffice Calc.

Tutto qui. Nulla di più, nulla di meno.

Il risultato finale, in Calc, sarà qualcosa di simile a questa tabella:

Apertura e chiusura

Credo di aver detto tutto, almeno per ora.

Come sempre, un commento è ben accetto.

Riferimenti

Di seguito ecco dove scaricare i protagonisti di questo articolo.

 

Licenza di questo articolo

Ad esclusione dell'immagine di intestazione, l'articolo è distribuito con questa licenza:

Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.

L'immagine di intestazione di questo articolo: