
12.08.2016, 07:47
|
Новичок
|
|
Регистрация: 17.08.2010
Сообщения: 74
Репутация: 518
|
|
Прочитать могу только < примерно 40000 треугольников и а если ставлю больше то Stack Overflow, если не ставлю размер - то вообще не компилит.
Вот моя полная процедура:
Код:
procedure TForm1.Button1Click(Sender: TObject); // загрузить файл точек/бинарник/треугольники
type
striangle=packed record // 50_и байтная запись 1 треугольника
trnormx:single; // 4
trnormy:single; // 4
trnormz:single; // 4
tr3dx1: Single; // 4
tr3dy1: Single; // 4
tr3dz1: Single; // 4
tr3dx2: Single; // 4
tr3dy2: Single; // 4
tr3dz2: Single; // 4
tr3dx3: Single; // 4
tr3dy3: Single; // 4
tr3dz3: Single; // 4
trattr: word; // 2
end;
type
StlRec= packed record
SName: array[1..80] of Char;//string[80]; // array of char сработал правильно
Snum: dword;
msstri: array [0..60000]of striangle; // множество записей треугольничных записей - 60000 уже не берёт
end;
var
i,ii,jj,sl:integer;
sss,stru:string;
Buf: array[1..127] of Char;
mash:single;
NumRead: integer;
Infl: file of Single;
//stlf: file;
stlperm: StlRec;
stlf: file of StlRec;
begin
mash:=strtofloat(Edit1.text);
if OpenDialog1.Execute then
begin
if OpenDialog1.FilterIndex=3 then // STL bin file
begin
AssignFile(stlf,OpenDialog1.FileName);
Reset(stlf);
DlnStr:=80;
// BlockRead(stlf,,DlnStr,NumRead); //читаем файл в массив
read(stlf,stlperm);
// SetLength(stlperm.msstri, stlperm.Snum); // попытка дать размер массиву треугольников
DlnStr:=1;
// ntri:=FilePos(stlf);// - возвращает текущую позицию чтения/записи в файл
// BlockRead(stlf,ntri,DlnStr,NumRead);
DlnStr:=NumRead; //получили реальную длину файла
CloseFile(stlf);
ii:=21;
i:=0;
// ntri:=Fbind[20]; // запоминаем число треугольников для процедуры вывода графики
// memo1.Clear;
// SendMessage(memo1.Handle, WM_SETREDRAW, 0, 0) ; // запрещаем перерисовку для ускорения вывода
jlc:=stlperm.Snum;
// while i<(stlperm.Snum-1) do
while i<(19999) do
begin
// ii:=ii+1;
// stlperm.msstri[] // перепрыгиваем направление нормали треугольника
triangle3dx1[i]:= stlperm.msstri[i].tr3dx1; // заполняем массив точками
triangle3dy1[i]:= stlperm.msstri[i].tr3dy1; // заполняем массив точками
triangle3dz1[i]:= stlperm.msstri[i].tr3dz1; // заполняем массив точками
triangle3dx2[i]:= stlperm.msstri[i].tr3dx2; // заполняем массив точками
triangle3dy2[i]:= stlperm.msstri[i].tr3dy2; // заполняем массив точками
triangle3dz2[i]:= stlperm.msstri[i].tr3dz2; // заполняем массив точками
triangle3dx3[i]:= stlperm.msstri[i].tr3dx3; // заполняем массив точками
triangle3dy3[i]:= stlperm.msstri[i].tr3dy3; // заполняем массив точками
triangle3dz3[i]:= stlperm.msstri[i].tr3dz3; // заполняем массив точками
i:=i+1;
ii:=i;
// memo1.Lines.Add(floattostrf(points3dx[i],fffixed,6,3)+' '+floattostrf(points3dy[i],fffixed,6,3)+' '+floattostrf(points3dz[i],fffixed,6,3));
// i:=i+1;
end;
// SendMessage(memo1.Handle, WM_SETREDRAW, 1, 0); // разрешаем перерисовку
// RedrawWindow(memo1.Handle, nil, 0,RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end; // open STL
end;// open file
l_point:=true;
label1.Tag:=ii;
end;
В принципе работает он но на малое число - 20000 точно берёт.
Видел примеры что делают через Read/Seek по записям - но там нет заголовочной инфы и какие-то примеры не полноценные...
Спасибо, попробую.
|