Einzelnen Beitrag anzeigen

Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#4

AW: wie kann ich bestimmte Infos aus Textdokument einlesen?

  Alt 23. Mai 2012, 22:27
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
Do the best job, leave the rest in the hands of God!

Geändert von Boyington (24. Mai 2012 um 06:33 Uhr)
  Mit Zitat antworten Zitat