Cercare un’etichetta o una nota particolare in un disegno DWG non deve necessariamente significare aprire il file in un editor CAD e controllare manualmente ogni annotazione. Con Python, è possibile ispezionare le entità di testo del disegno e identificare i nomi delle stanze corrispondenti, le etichette delle apparecchiature o altre annotazioni.

Questo articolo mostra come cercare testo in un file DWG usando Python con Aspose.CAD for Python via .NET. Caricherai un file DWG, cercherai testo a riga singola e multilinea, stamperai il contenuto corrispondente e il suo layer, e opzionalmente limiterai la ricerca a un solo layer. L’esempio legge il disegno senza modificarlo o esportarlo.

Installa Aspose.CAD for Python via .NET

Per seguire l’esempio, è necessario un ambiente Python supportato da Aspose.CAD, un file DWG che contiene annotazioni di testo e il pacchetto Aspose.CAD. La pagina del prodotto Aspose.CAD Python elenca Python 3.9 o versioni successive tra i requisiti.

Installa il pacchetto da PyPI:

pip install aspose-cad

Puoi anche consultare la guida all’installazione di Aspose.CAD per i dettagli di configurazione del pacchetto.

Per questo tutorial, posiziona un file chiamato drawing.dwg nella tua directory di lavoro. Idealmente, utilizza un disegno che contenga sia annotazioni TEXT a riga singola sia annotazioni MTEXT multilinea, così potrai verificare entrambi i casi.

Come cercare testo in un file DWG usando Python

I file DWG memorizzano il contenuto del disegno come entità. Per la ricerca di testo, due tipi di entità utili sono:

  • TEXT (CadText): Tipicamente rappresenta un’annotazione a riga singola. La sua proprietà default_value fornisce il valore del testo.
  • MTEXT (CadMText): Rappresenta testo multilinea. La sua proprietà full_clear_text restituisce il testo senza i codici di formattazione CAD.

È possibile cercare queste entità senza prima convertire il disegno in un’immagine o in un PDF. Il flusso di lavoro è semplice:

  1. Carica il file DWG con Image.load() e accedilo come CadImage.
  2. Itera attraverso la collezione entities del disegno.
  3. Identifica le entità TEXT e MTEXT e leggi il loro contenuto.
  4. Confronta ogni valore con il tuo termine di ricerca.
  5. Visualizza ogni corrispondenza e il layer a cui appartiene l’entità.

Il seguente esempio implementa questi passaggi. Cerca le entità TEXT e MTEXT di livello superiore del disegno; il testo all’interno di blocchi nidificati e attributi è discusso separatamente di seguito.

Trova testo in un disegno DWG programmaticamente

Supponiamo che tu debba individuare ogni annotazione contenente la parola valve in un disegno tecnico. Il codice seguente cerca quella parola indipendentemente dalla capitalizzazione e riporta il livello di ciascuna entità corrispondente.

import aspose.cad as cad
from aspose.pycore import cast

# Path to the source drawing and the text to find.
dwg_path = "drawing.dwg"
keyword = "valve"

if not keyword:
    raise ValueError("The search keyword must not be empty.")

# Load the DWG as a CAD image.
image = cad.Image.load(dwg_path)
cad_image = cast(cad.fileformats.cad.CadImage, image)

entity_types = cad.fileformats.cad.cadconsts.CadEntityTypeName
matches = 0

# Search top-level text entities.
for entity in cad_image.entities:
    text_value = None

if entity.type_name == entity_types.TEXT:
        text_entity = cast(
            cad.fileformats.cad.cadobjects.CadText, entity
        )
        text_value = text_entity.default_value

elif entity.type_name == entity_types.MTEXT:
        mtext_entity = cast(
            cad.fileformats.cad.cadobjects.CadMText, entity
        )
        text_value = mtext_entity.full_clear_text

# Match a word or phrase without case sensitivity.
    if text_value and keyword.casefold() in text_value.casefold():
        matches += 1
        print(f"Match: {text_value}")
        print(f"Layer: {entity.layer_name}")
        print("---")

print(f"Total matches: {matches}")

Come funziona il codice

Il metodo Image.load() apre il file DWG. L’helper cast() ti consente di accedere ai membri di CadImage, inclusa la sua collezione entities.

Ogni entità ha un type_name che identifica che tipo di oggetto di disegno rappresenta. Quando quel tipo è TEXT, il codice legge CadText.default_value. Quando il tipo è MTEXT, utilizza CadMText.full_clear_text per ottenere il valore leggibile multilinea.

Il metodo casefold() di Python rende il confronto insensibile al maiuscolo/minuscolo, quindi valve, Valve e VALVE sono tutti potenziali corrispondenze. La condizione supporta anche corrispondenze parziali: cercare valve corrisponderà a un’annotazione come Main Valve.

Infine, entity.layer_name identifica il layer CAD che contiene ciascun risultato. Questo può aiutarti a individuare una nota corrispondente quando il disegno contiene layer separati per apparecchiature, dimensioni e annotazioni.

Output previsto

Per un disegno di esempio con due annotazioni corrispondenti, l’output potrebbe apparire così:

Match: Main Valve
Layer: Plumbing
---
Match: VALVE CONTROL ROOM
Layer: Annotations
---
Total matches: 2

Questo è un output illustrativo. I tuoi risultati dipendono dalle effettive entità di testo nel tuo file DWG. Se la ricerca non trova alcuna entità TEXT o MTEXT di livello superiore corrispondente, la riga finale riporterà Total matches: 0.

Cerca testo in un livello DWG specifico

Alcuni disegni organizzano il contenuto in livelli dedicati, come Annotations, Equipment o Plumbing. Se conosci già il livello che contiene il testo di cui hai bisogno, puoi filtrare le entità prima di controllare i loro valori.

Nell’esempio principale, definisci il livello di destinazione prima del ciclo:

target_layer = "Annotations"

Quindi inserisci questa condizione immediatamente dopo for entity in cad_image.entities::

if entity.layer_name.casefold() != target_layer.casefold():
    continue

Il resto del codice di ricerca rimane invariato. Solo le entità il cui nome del layer corrisponde a Annotations verranno esaminate per la parola chiave. Questa comparazione ignora anche la differenza tra maiuscole e minuscole nel nome del layer.

Il filtro funziona sul livello assegnato a ciascuna entità; non espande da solo il contenuto dei blocchi nidificati né ricerca riferimenti esterni.

Trova testo esatto o estrai testo da DWG

L’esempio principale utilizza una ricerca di sottostringhe senza distinzione tra maiuscole e minuscole. Puoi adattare il confronto per soddisfare il tuo compito.

Trova un valore di testo esatto: Sostituisci la condizione di corrispondenza con la seguente espressione per escludere annotazioni più lunghe che contengono semplicemente la parola chiave:

if text_value and text_value.casefold() == keyword.casefold():

Usa una ricerca sensibile al maiuscolo/minuscolo: Mantieni la capitalizzazione originale su entrambi i lati del confronto:

if text_value and keyword in text_value:

Estrai tutti i valori TEXT e MTEXT di livello superiore: Rimuovi il confronto della parola chiave e elabora ogni text_value non vuoto. Ad esempio, dopo i controlli del tipo di entità nel ciclo principale, puoi aggiungere il testo a una lista invece di testare la parola chiave:

if text_value:
    extracted_text.append(text_value)

Inizializza extracted_text = [] prima del ciclo se utilizzi questa variante. Puoi quindi scrivere le stringhe raccolte in un file di testo o usarle in un flusso di lavoro separato di ricerca o indicizzazione. Questa variante copre ancora solo i tipi di entità gestiti dal ciclo.

Perché alcuni testi DWG potrebbero non apparire nei risultati di ricerca

Un disegno DWG può contenere testo in più posizioni rispetto alla raccolta di livello superiore TEXT e MTEXT. Se il codice restituisce meno corrispondenze del previsto, controlla le seguenti possibilità:

  • Testo all’interno dei blocchi: Un blocco può contenere le proprie entità. È necessario un ulteriore attraversamento per ispezionare quelle entità.
  • Attributi del blocco: Alcuni valori di testo sono memorizzati nelle entità CadAttrib o CadAttDef associate ai blocchi inseriti. Questi non sono inclusi nell’esempio principale.
  • Riferimenti esterni: Il testo in un disegno referenziato esternamente può richiedere l’elaborazione del contenuto referenziato separatamente.
  • Contenuto raster: Le lettere che appaiono solo come pixel in un’immagine allegata non sono entità di testo CAD. Trovare quelle parole richiede OCR piuttosto che questo approccio basato sulle entità.
  • Altri tipi di annotazione: Dimensioni, leader e oggetti CAD specializzati possono memorizzare o generare testo in modo diverso e necessitano di una gestione separata.

La documentazione di Aspose.CAD sul lavoro con il testo identifica CadText, CadMText, CadAttrib e CadAttDef come tipi di entità pertinenti che contengono testo. Per una ricerca più ampia, estendi l’attraversamento per includere quegli oggetti aggiuntivi e testalo contro la struttura dei tuoi disegni.

Se Image.load() fallisce, controlla prima il percorso del file, quindi conferma che il file DWG sia valido e utilizzi un formato supportato. Per risultati inattesi, inizia con un disegno piccolo i cui valori di annotazione e livelli puoi verificare in un visualizzatore CAD.

Domande Frequenti

Python può cercare testo all’interno di un file DWG senza AutoCAD?

Sì. Con Aspose.CAD for Python via .NET, è possibile aprire un file DWG supportato e ispezionare le entità di testo programmaticamente. AutoCAD non deve essere installato per questo flusso di lavoro.

Come posso trovare una parola specifica in un disegno DWG usando Python?

Carica il file come CadImage, itera attraverso le sue entità, leggi i valori TEXT e MTEXT e confronta ogni valore con la tua parola chiave. L’esempio sopra utilizza casefold() e l’operatore in di Python per trovare corrispondenze parziali senza distinzione tra maiuscole e minuscole.

Posso estrarre tutto il testo da un file DWG usando Python?

Puoi raccogliere il testo dai tipi di entità supportati, inclusi CadText e CadMText. Un processo di estrazione completo dovrebbe anche ispezionare i contenuti dei blocchi pertinenti, gli attributi e altri oggetti di annotazione invece di fare affidamento solo sul ciclo delle entità di livello superiore.

Ottieni una licenza temporanea gratuita

Puoi richiedere una licenza temporanea gratuita di 30 giorni per valutare Aspose.CAD for Python via .NET senza restrizioni di valutazione. Il processo di richiesta della licenza temporanea richiede un indirizzo email aziendale idoneo.

Consulta la Aspose.CAD licensing guide per informazioni su come applicare una licenza nella tua applicazione Python.

Risorse di apprendimento gratuite

Esplora queste risorse per ulteriori informazioni sull’elaborazione dei disegni DWG e sul lavoro con le entità CAD in Python:

Conclusione

È possibile cercare testo in un file DWG usando Python caricando il disegno, ispezionando le entità TEXT e MTEXT e confrontando i loro valori con una parola chiave. Lo stesso flusso di lavoro può segnalare i layer corrispondenti, restringere le ricerche a un layer specifico o raccogliere il testo per ulteriori elaborazioni. Per i disegni che contengono attributi di blocco o annotazioni nidificate, estendere l’attraversamento delle entità prima di fare affidamento sui risultati come inventario completo del testo.

Vedi anche