Versuch es mal hiermit.
Ich habe die von dir gezeigten daten ins Clipboard kopiert
und von dort in die StringList geschrieben.
Alle Daten wurden korrekt gelesen.
Du solltest das mit list.LoadFromFile machen.
Delphi-Quellcode:
type
TVektor =
record
x, y, z: real;
end;
TDreieck =
record
n: TVektor;
// n ist Normalvektor
p:
array[1..3]
of TVektor;
//p hat Koordinaten von 3 Eckpunkten
end;
Var
hDreieck : ^TDreieck;
Dreiecke:
Array of TDreieck;
PROCEDURE TMain.Test;
const
recstart='
facet normal';
recline='
vertex';
var list:TStrings; line:integer; data:TDreieck;
FUNCTION FindLine(
const s:
string; raiseerr:boolean):boolean;
begin
while (line<list.count)
and (Copy(Trim(list[line]),1,Length(s))<>s)
do inc(line);
if line<list.count
then result:=true
else if not raiseerr
then result:=false
else raise Exception.Create(s+'
nicht gefunden.');
end;
FUNCTION ReadNumber(
const s:
string;
var i:integer):real;
var j:integer;
begin
j:=i;
while s[j]<>'
'
do dec(j);
result:=StrToFloat(Copy(s,j+1,i-j));
while s[j]='
'
do dec(j);
i:=j;
end;
PROCEDURE ReadLine(
var v:TVektor);
var s:
string; i:integer;
begin
s:=Trim(list[line]);
i:=Length(s);
v.z:=ReadNumber(s,i);
v.y:=ReadNumber(s,i);
v.x:=ReadNumber(s,i);
inc(line);
end;
PROCEDURE ReadRecord;
var i:integer;
begin
ReadLine(data.n);
for i:=1
to 3
do begin
FindLine(recline,true);
ReadLine(data.p[i]);
end;
SetLength(Dreiecke,Length(Dreiecke)+1);
Dreiecke[High(dreiecke)]:=data;
end;
// var f:TextFile; i,j:integer; // nur zur Kontrolle benutzt
begin
Dreiecke:=nil;
list:=TStringList.Create;
try
try
list.text:=Clipboard.AsText;
// oder List.LoadFromFile('Filename');
line:=0;
while FindLine(recstart,false)
do ReadRecord;
except
On E:
Exception do begin
ShowMessage(E.
Message);
Dreiecke:=nil;
end;
end;
finally
list.free;
end;
end;
Guten Abend, Leute
Zwei Fragen an dich, Klaus:
1)für SetLength(Dreiecke,Length(Dreiecke)+1),
Length(Dreiecke)+1 darf nur zwischen
0...255 sein, oder? Wenn ein 3D-Objekt z.B nur aus weniger als 255 Dreiecken besteht, ist es in Ordnung, aber wenn es aus 10000 Dreiecken besteht, wie mache ich mit dieser Funktion Dreiecke[256], Dreiecke[257]....bis Dreiecke[10000]?
2)wie kann man nach dem Einlesen der *.stl Datei und nach dem Schreiben aller Koordinaten in Variable "Dreiecke"(array of TDreieck) alle dort gespeicherte Koordinaten wieder in Clipboard kopieren? Damit kann ich alle in Variable "Dreiecke" gespeicherten Koordinaten mit den original Koordinaten mal vergleichen und überprüfen, ob es richtig ist.
Danke für die Antwort im Voraus!
l.g
Lee