webForumDet fria alternativet

Parsa textfil

6 svar · 213 visningar · startad av Alpha II

Alpha IIMedlem sedan maj 20002 993 inlägg
#1

Hur läser man igenom en textfil så att man får variablarna X, Y och Z?

Textfilen ser ut så här:

Vertex 0: X:-31.8621 Y:29.8309 Z:5.7799
Vertex 1: X:-31.8621 Y:-20.1691 Z:5.7799
Vertex 2: X:-21.1474 Y:29.8309 Z:0.9133
Vertex 3: X:-21.1474 Y:-20.1691 Z:0.9133
Vertex 4: X:-31.8621 Y:29.8309 Z:21.3961
osv...

testade med:

      X := StrToFloat(Trim(Copy(S, 12 + Length(IntToStr(i)), 13)));
      Y := StrToFloat(Trim(Copy(S, 27 + Length(IntToStr(i)), 13)));
      Z := StrToFloat(Trim(Copy(S, 39 + Length(IntToStr(i)), 13)));

Men jag får bara felmedelanden...

Alpha IIMedlem sedan maj 20002 993 inlägg
#2

Glöm den där frågan... Tror jag vet hur jags ska fixa det. Men jag måste ersätta '.' med ',' hur gör jag det??

Marcus EMedlem sedan maj 20021 466 inlägg
#3

Funktionen StringReplace?

Alpha IIMedlem sedan maj 20002 993 inlägg
#4

Gick inte så bra som jag trodde.... grrrr..... blir hel konstigt.... varför returnerar inte StrPos en integer istllet för en PChar pekare??? :o Blir acces violation eller nått :OO

  for i := 0 to Vertices-1 do begin
    glBegin(GL_TRIANGLES);

    ReadLn(F, S);
    Pos := StrToInt(StrPos(PChar(S), PChar('X')));
    X := StrToFloat(StringReplace(Trim(Copy(S, Pos + 2, 10)), '.', ',', [rfReplaceAll]));
    Pos := StrToInt(StrPos(PChar(S), PChar('Y')));
    Y := StrToFloat(StringReplace(Trim(Copy(S, Pos + 2, 10)), '.', ',', [rfReplaceAll]));
    Pos := StrToInt(StrPos(PChar(S), PChar('Z')));
    Z := StrToFloat(StringReplace(Trim(Copy(S, Pos + 2, Length(S)-(Pos+29)-1)), '.', ',', [rfReplaceAll]));
    glVertex3f(X, Y, Z);

    glEnd();
  end;
jtMedlem sedan juni 2000350 inlägg
#5

Du kanske skulle testa Pos istället.

Såg att du använder en variabel som heter Pos, jag menar funktionen System.Pos.

Alpha IIMedlem sedan maj 20002 993 inlägg
#6

Hmm fattor inte varför men Position får värdet 0 :(

procedure TASCObject.LoadASCFile(Filename: String);
var
  F: TextFile;
  S: String;
  Position: Integer;
  I: Integer;
  Vertices: Integer;
  X, Y, Z: GLfloat;
begin
  AssignFile(F, Filename);
  Reset(F);
  ReadLn(F, S);
  ReadLn(F, S); 
  Vertices := StrToInt(Trim(Copy(S, 20, 8)));
  ReadLn(F, S); // Move down 1 line

  Obj := glGenLists(1);
  glNewList(Obj, GL_COMPILE);
  for i := 0 to Vertices-1 do begin
    glBegin(GL_TRIANGLES);

    ReadLn(F, S);
    Position := Pos(S, 'X:');
    X := StrToFloat(StringReplace(Trim(Copy(S, Position + 2, 10)), '.', ',', [rfReplaceAll]));
    Position := Pos(S, 'Y:');
    Y := StrToFloat(StringReplace(Trim(Copy(S, Position + 2, 10)), '.', ',', [rfReplaceAll]));
    Position := Pos(S, 'Z:');
    Z := StrToFloat(StringReplace(Trim(Copy(S, Position + 2, Length(S)-(Position+2)-1)), '.', ',', [rfReplaceAll]));
    glVertex3f(X, Y, Z);

    glEnd();
  end;
  glEndList();
end;

ojdå ;) hade skrivit pos(s, 'x') istället för pos('x', s) som det skulle vara :)

Alpha IIMedlem sedan maj 20002 993 inlägg
#7

Eller finns det nån färdig kod för delphi att ladda 3d objekt i format som man kan spara i från 3dsmax?

Hittade en kod att ladda 3ds filer. problemet var att det var c++ och 1000 rader... lite för mycket att konvertera :(

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)