Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: alexarmato66 - Marzo 13, 2024, 01:47:06 pm

Titolo: Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: alexarmato66 - Marzo 13, 2024, 01:47:06 pm
Buondì,Qualcuno avrebbe un esempio di come estrarre da un file dwg di autocad i dati estesi (xdata)?

ho provato a scrivere qualcosa ma senza risultati:
Codice: [Seleziona]
program ReadAutoCADXData;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, Variants, ComObj, ActiveX;

var
  AutoCADApp: Variant;
  Document: Variant;
  ModelSpace: Variant;
  Entity: Variant;
  XData: Variant;
  XDataItem: Variant;
  i, j: Integer;

begin
  CoInitialize(nil);

  try
    // Creazione di un'istanza dell'applicazione AutoCAD
    AutoCADApp := CreateOleObject('AutoCAD.Application.22');

    // Verifica che AutoCAD sia in esecuzione
    if VarIsEmpty(AutoCADApp) then
    begin
      Writeln('AutoCAD non è in esecuzione.');
      Exit;
    end;

    // Ottiene il documento attivo
    Document := AutoCADApp.ActiveDocument;

    // Verifica che ci sia un documento attivo
    if VarIsEmpty(Document) then
    begin
      Writeln('Nessun documento attivo.');
      Exit;
    end;

    // Ottiene il modello dello spazio carta
    ModelSpace := Document.ModelSpace;

    // Ciclo attraverso tutte le entità nello spazio modello
    for i := 0 to ModelSpace.Count - 1 do
    begin
      Entity := ModelSpace.Item(i);

      // Ottiene il set degli XData dell'entità
      XData := Entity.XData;

      // Verifica se ci sono XData
      if not VarIsEmpty(XData) then
      begin
        // Stampa un'intestazione per l'entità corrente
        Writeln('Entità ', i + 1, ':');

        // Ciclo attraverso gli XData
        for j := 0 to XData.Count - 1 do
        begin
          // Ottiene l'elemento XData corrente
          XDataItem := XData.Item(j);

          // Stampa dettagli su ogni XData
          Writeln('  XData ', j + 1, ' - TypeCode: ', XDataItem.TypeCode);

          // Verifica se il codice dell'XData è 1000
          if XDataItem.TypeCode = 1000 then
          begin
            // Stampa il valore ASCII string dell'XData
            Writeln('    Value (ASCII string): ', XDataItem.StringValue);
          end;
        end;
      end
      else
      begin
        // Se non ci sono XData, stampa un messaggio
        Writeln('Entità ', i + 1, ': Nessun XData trovato.');
      end;

      // Aggiunge una riga vuota per separare le informazioni sulle entità
      Writeln;
    end;
  finally
    // Rilascia le risorse COM
    CoUninitialize;
  end;
end.         
Titolo: Re:Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: DragoRosso - Marzo 13, 2024, 02:30:34 pm
Hai errori ? o hai risultati vuoti ?

Grossomodo quello che fai dovrebbe essere corretto. Fermo restando le proprietà e i metodi: ricordavo che ai miei tempi c'era il metodo GetXData ... o qualcosa di simile come ActiveX per rilevare l'elenco delle proprietà XData di un oggetto.

Poi, hanno mantenuto ancora gli XData, visto che Autocad non li ha mai usati ?

Ciao
Titolo: Re:Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: alexarmato66 - Marzo 13, 2024, 03:10:27 pm
Ho risultati vuoti.Dopo un pò il programma esce senza stampare alcun risultato.
Titolo: Re:Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: DragoRosso - Marzo 13, 2024, 08:11:32 pm
Confermo che devi usare GetXData e non XData, almeno per quanto vedo ... non c'è una proprietà o metodo chiamato XData.

Stò esplorando la TLB di ACAD 2018 (dovrebbe essere la tua versione).

Non ho Acad per provare.

EDIT: ... forse sono troppo avanti ... notare il 2038 .... ho come il sospetto che ci sarà a breve un grosso problema "universale" con lo UNIX TIME (si, è OT, ma quello quotato è la data di creazione della type library  ...)

Citazione
  custom(DE77BA65-517C-11D1-A2DA-0000F8773CE9, "Created by MIDL version 8.01.0620 at Mon Jan 18 19:14:07 2038
Titolo: Re:Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: alexarmato66 - Marzo 14, 2024, 08:42:06 am
Grazie , avevo dimenticato il Get.
In ogni caso ho un problema in
 // Creazione di un'istanza dell'applicazione AutoCAD
    AutoCADApp := CreateOleObject('AutoCAD.Application.22');   

HO cercato su internet e per autocad2018 devo mettere AutoCAD.Application.22.
Mah
Titolo: Re:Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: DragoRosso - Marzo 14, 2024, 11:37:27 am
Ti confermo (vedi allegato).
Titolo: Re:Estrazione dati estesi(XData) da file dwg di AutoCad
Inserito da: alexarmato66 - Marzo 15, 2024, 08:13:15 am
Purtroppo non mi funziona ancora.Il programma parte ma dopo un pò si spegne senza esiti.