habe ein Programm zur 3DDarstellung einer Punktewolke geschrieben. Das funktioniert auch ganz gut- aber.
Mit Lazarus 2.2.2 bekomme ich GLScene gar nicht installiert.

Mit Lazarus 2.0.12 ist GLScene installierbar.
Ich habe GLScene in der Version: im onlinePaketManager steht 1.0.0.0 (ich glaube aber eher dass es sich um V2.1 handelt)
wenn ich das Programm Starte und gleich wieder schließe ist alles ok.
Wenn ich die Daten dazu lade kommt beim Beenden ein "External SIGSEGV".
Eigentlich denke ich dass ich alles was erstellt wurde auch wieder frei gegeben wird, aber irgendwas mache ich falsch oder es liegt an GlScene oder an sonstwas.
Hier mal das Hauptprogramm, wäre super wenn da mal jemand drüber schauen könnte.
Im Anhang ist das ganze Programm mit daten File
Im Voraus mal vielen Dank
Stefan
Code: Alles auswählen
unit uTkpGLScene;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Menus, ExtCtrls,
ComCtrls, GLScene, GLLCLViewer, GLVectorGeometry, GLObjects, Types,
utkpmessungen;
type
{ TForm1 }
TForm1 = class(TForm)
GLCam: TGLCamera;
GLCube1: TGLCube;
GLLightSource1: TGLLightSource;
GLLightSource2: TGLLightSource;
GLPoints: TGLPoints;
GLReference: TGLDummyCube;
GLScene1: TGLScene;
GLSceneViewer1: TGLSceneViewer;
MainMenu1: TMainMenu;
mnuEnd: TMenuItem;
mnuOpen: TMenuItem;
mnuDatei: TMenuItem;
openFile: TOpenDialog;
StatusBar1: TStatusBar;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure GLSceneViewer1MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
procedure mnuEndClick(Sender: TObject);
procedure mnuOpenClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
messungen : Array of TTkpMessung;
aPoint : TGLPoints;
startX, startY : integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
startX := X;
startY := Y;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
myCol : TVector;
begin
aPoint := TGLPoints(GLReference.AddNewChild(TGLPoints));
myCol.X:=0;
myCol.Y:=0;
myCol.Z:=0;
myCol.W:=1;
aPoint.Colors.Add(myCol);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
aPoint.Positions.Free;
aPoint.Free;
setLength(messungen,0);
end;
procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if (ssLeft in Shift) then
if startX > X then GLReference.PitchAngle:= GLReference.PitchAngle-1
else GLReference.PitchAngle:= GLReference.PitchAngle+1;
if (ssMiddle in Shift) then
if startX >X then GLReference.TurnAngle:= GLReference.TurnAngle-1
else GLReference.TurnAngle:= GLReference.TurnAngle+1;
if (ssRight in Shift) then
if startX >X then GLReference.RollAngle:= GLReference.RollAngle-1
else GLReference.RollAngle:= GLReference.RollAngle+1;
startX := X;
end;
procedure TForm1.GLSceneViewer1MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if wheelDelta > 1 then GLCam.SceneScale:= GLCam.SceneScale*1.1
else GLCam.SceneScale:= GLCam.SceneScale*0.9;
end;
procedure TForm1.mnuEndClick(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.mnuOpenClick(Sender: TObject);
var
sFile, aLine : string;
i,j , pointAnz: integer;
sList : TStringList;
begin
pointAnz :=0;
// get file
if openFile.Execute then
begin
sList := TStringList.Create;
sFile := openFile.FileName;
sList.LoadFromFile(sFile);
// jede Zeile enspricht einer Messung
setLength(messungen, sList.Count);
for i:= 0 to sList.Count-1 do
begin
aLine := sList.Strings[i];
messungen[i].extract(aLine);
messungen[i].setObereLage;
messungen[i].xSort;
end;
for i:=0 to sList.Count-1 do
begin
for j:= 0 to messungen[i].anzahl-1 do
begin
aPoint.Positions.Add(messungen[i].messung[j].x,messungen[i].messung[j].y,messungen[i].messung[j].z);
pointAnz := pointAnz+1;
end;
end;
sList.Free;
statusBar1.Panels[0].Text:= 'Dargestellte Punkte :'+intToStr(pointAnz);
end;
end;
end.