Questo come base, poi sistemala tu con errori (record malformati) oppure usa un classe al posto del record:
//Definizione del record VERTEX
type TVertex = record
Dummy1: integer;
Dummy2: integer;
Dummy3: integer;
X: double;
Dummy4: integer;
Y: double;
Dummy5: integer;
Dummy6: double;
Dummy7: integer;
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
fVertici: array of TVertex;
public
{ Public declarations }
function Carica(const NomeFile: string): boolean;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
//Funzione per il caricamento dei dati
function TForm1.Carica(const NomeFile: string): boolean;
var tempFile: TEXTFILE;
valore: string;
begin
Result := false;
try
if Fileexists(NomeFile) then
begin
//File da aprire
AssignFile(tempfile, NomeFile);
//Sola lettura
Reset(tempfile);
//finchè non siamo a fine file
while not eof(tempfile) do
begin
//leggi una riga
readln(tempfile, valore);
//Se abbiao terminato esci dal loop
if UPPERCase(Trim(valore)) = 'SEQEND' then
break;
//Iniziamo la procedura per la lettura dei vertici
if UPPERCase(Trim(valore)) = 'VERTEX' then
begin
//Incrementa di 1 la dimensione dell'array
setlength(fVertici, length(fVertici)+1);
//Inserisci nell'ultima posizione appena "aggiunta"
with fVertici[length(fVertici)-1] do
begin
readln(tempfile, Dummy1);
readln(tempfile, Dummy2);
readln(tempfile, Dummy3);
readln(tempfile, X); // !!!!!!!!!!!!! ATTENZIONE AL FORMATO DEL DECIMALE (punto o virgola)
readln(tempfile, Dummy4);
readln(tempfile, Y); // !!!!!!!!!!!!! ATTENZIONE AL FORMATO DEL DECIMALE (punto o virgola)
readln(tempfile, Dummy5);
readln(tempfile, Dummy6);
readln(tempfile, Dummy7);
end;
end;
end;
Result := True;
CloseFile(tempfile);
end;
except on e: exception do
begin
Result := false;
CloseFile(tempfile);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Carica('prova.txt');
//Qua ha il tuo array dei vertici, inserire nella griglia non dovrebbe essere un problema.
end;
end.
Ciao
Non chiedermi anche le mesh .... ;)
.....
type TVertex = record
Dummy1: integer;
Dummy2: integer;
Dummy3: integer;
X: double;
Dummy4: integer;
Y: double;
Dummy5: integer;
Dummy6: double;
Dummy7: integer;
end;
type TPoligono = array of TVertex;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
//fVertici: TPoligono;
//Rcoolta di vertici (eg POLIGONI)
fFiguraComplessa: array of TPoligono;
public
{ Public declarations }
function Carica(const NomeFile: string): boolean;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
function TForm1.Carica(const NomeFile: string): boolean;
var tempFile: TEXTFILE;
valore: string;
tempindice: integer;
begin
Result := false;
SetLength(fFiguraComplessa, 1);
SetLength(fFiguraComplessa[0], 0);
try
if Fileexists(NomeFile) then
begin
AssignFile(tempfile, NomeFile);
Reset(tempfile);
while not eof(tempfile) do
begin
readln(tempfile, valore);
if UPPERCase(Trim(valore)) = 'SEQEND' then
break;
//se leggo "POLIGONOxxxxx" senza aver trovato almeno un vertice allora non incremento la struttura
if (Pos('POLIGONO', UPPERCase(Trim(valore))) > 0) and (Length(fFiguraComplessa[0]) > 0) then
begin
setlength(fFiguraComplessa, length(fFiguraComplessa)+1);
setlength(fFiguraComplessa[length(fFiguraComplessa)-1], 0);
end;
if UPPERCase(Trim(valore)) = 'VERTEX' then
begin
setlength(fFiguraComplessa[length(fFiguraComplessa)-1], length(fFiguraComplessa[length(fFiguraComplessa)-1])+1);
//per semplicità .....
tempindice := length(fFiguraComplessa[length(fFiguraComplessa)-1])-1;
with fFiguraComplessa[length(fFiguraComplessa)-1][tempindice] do
begin
readln(tempfile, Dummy1);
readln(tempfile, Dummy2);
readln(tempfile, Dummy3);
readln(tempfile, X);
readln(tempfile, Dummy4);
readln(tempfile, Y);
readln(tempfile, Dummy5);
readln(tempfile, Dummy6);
readln(tempfile, Dummy7);
end;
end;
end;
Result := True;
end;
except on e: exception do
begin
Result := false;
CloseFile(tempfile);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Carica('prova.txt');
end;
Ciao
EDIT: PER LEGGERE I VERTICI DAL FILE DXF CHE HAI POSTATO NON VA' BENE IL CODICE CHE IO TI HO POSTATO. CI SONO DA LEGGERE ANCHE LE ALTRE INTESTAZIONI ..... VEDO UN ATTIMO DI SISTEMARTI LA COSA ....
Se cicli all'interno dell'array:
var poligonoN: integer;
VerticeXX: integer;
begin
for poligonoN := Low(FormaComplessa) to High(FormaComplessa)
begin
//In questo punto "parte" un Poligono nuovo"
for VerticeXX := Low(FormaComplessa[poligonoN]) to High(FormaComplessa[poligonoN])
begin
//Qui cicli all'interno dei elenco dei Vertici
Grid1.Cell[VerticeXX,1] := FormaComplessa[poligonoN][VerticeXX].X;
Grid1.Cell[VerticeXX,2] := FormaComplessa[poligonoN][VerticeXX].Y;
end;
end;
end;
Più o meno .... Ad ogni poligono nuovo, devi ovviamente disegnare su una griglia diversa ... basta mettere un "case of" ...
Non è allineata la griglia ai dati perchè nel dxf ci sono diverse polilinee (non ho un cad a portata di mano per vedere dove sono).
Le polilinee che non hanno un nome tra i quattro definiti nel programma generano degli array vuoti.
Per verificare quale array è "operativo", testa la proprietà:
ReadDXF.Poligoni[x][0].NomeLayer <-- Ritorna il nome del layer (ad esempio "POLIGONO_1") se appartiene ad uno dei quattro, altrimenti ritorna un '' (cioè vuoto)
[x] è l'indice dell'array da testare, -------> ( Low(ReadDXF.Poligoni) <= x <= High(ReadDXF.Poligoni)