123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- //
- // The multimedia graphics platform GLScene https://github.com/glscene
- //
- unit FmVectorEditor;
- (* Editor for a vector *)
- interface
- {$I GLScene.inc}
- uses
- System.Classes,
- System.SysUtils,
- VCL.Forms,
- VCL.ComCtrls,
- VCL.StdCtrls,
- VCL.ToolWin,
- VCL.ExtCtrls,
- VCL.Buttons,
- VCL.Graphics,
- VCL.Controls,
- GLS.VectorGeometry,
- GLS.Utils,
- GLS.VectorTypes;
- type
- TGLVectorEditorForm = class(TForm)
- EDx: TEdit;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- EDy: TEdit;
- EDz: TEdit;
- BBok: TBitBtn;
- BBcancel: TBitBtn;
- IMx: TImage;
- IMy: TImage;
- IMz: TImage;
- SpeedButton1: TSpeedButton;
- SBmX: TSpeedButton;
- SpeedButton3: TSpeedButton;
- SBmY: TSpeedButton;
- SpeedButton5: TSpeedButton;
- SBmZ: TSpeedButton;
- SpeedButton7: TSpeedButton;
- SBUnit: TSpeedButton;
- SpeedButton9: TSpeedButton;
- Bevel1: TBevel;
- SBInvert: TSpeedButton;
- procedure TBxClick(Sender: TObject);
- procedure TByClick(Sender: TObject);
- procedure TBzClick(Sender: TObject);
- procedure TBnullClick(Sender: TObject);
- procedure EDxChange(Sender: TObject);
- procedure EDyChange(Sender: TObject);
- procedure EDzChange(Sender: TObject);
- procedure SBmXClick(Sender: TObject);
- procedure SBmYClick(Sender: TObject);
- procedure SBmZClick(Sender: TObject);
- procedure SBUnitClick(Sender: TObject);
- procedure SpeedButton9Click(Sender: TObject);
- procedure SBInvertClick(Sender: TObject);
- private
- vx, vy, vz: Single;
- procedure TestInput(edit: TEdit; imError: TImage; var dest: Single);
- public
- function Execute(var x, y, z: Single): Boolean;
- end;
- function GLVectorEditorForm: TGLVectorEditorForm;
- procedure ReleaseVectorEditorForm;
- // ------------------------------------------------------------------
- implementation
- // ------------------------------------------------------------------
- {$R *.dfm}
- var
- vGLVectorEditorForm: TGLVectorEditorForm;
- function GLVectorEditorForm: TGLVectorEditorForm;
- begin
- if not Assigned(vGLVectorEditorForm) then
- vGLVectorEditorForm := TGLVectorEditorForm.Create(nil);
- Result := vGLVectorEditorForm;
- end;
- procedure ReleaseVectorEditorForm;
- begin
- if Assigned(vGLVectorEditorForm) then
- begin
- vGLVectorEditorForm.Free;
- vGLVectorEditorForm := nil;
- end;
- end;
- function TGLVectorEditorForm.Execute(var x, y, z: Single): Boolean;
- begin
- // setup dialog fields
- vx := x;
- vy := y;
- vz := z;
- EDx.Text := FloatToStr(vx);
- EDy.Text := FloatToStr(vy);
- EDz.Text := FloatToStr(vz);
- // show the dialog
- Result := (ShowModal = mrOk);
- if Result then
- begin
- x := vx;
- y := vy;
- z := vz;
- end;
- end;
- procedure TGLVectorEditorForm.TestInput(edit: TEdit; imError: TImage;
- var dest: Single);
- begin
- if Visible then
- begin
- try
- dest := StrToFloat(edit.Text);
- imError.Visible := False;
- except
- imError.Visible := True;
- end;
- BBok.Enabled := not(IMx.Visible or IMy.Visible or IMz.Visible);
- end;
- end;
- procedure TGLVectorEditorForm.TBxClick(Sender: TObject);
- begin
- EDx.Text := '1';
- EDy.Text := '0';
- EDz.Text := '0';
- end;
- procedure TGLVectorEditorForm.TByClick(Sender: TObject);
- begin
- EDx.Text := '0';
- EDy.Text := '1';
- EDz.Text := '0';
- end;
- procedure TGLVectorEditorForm.TBzClick(Sender: TObject);
- begin
- EDx.Text := '0';
- EDy.Text := '0';
- EDz.Text := '1';
- end;
- procedure TGLVectorEditorForm.TBnullClick(Sender: TObject);
- begin
- EDx.Text := '0';
- EDy.Text := '0';
- EDz.Text := '0';
- end;
- procedure TGLVectorEditorForm.EDxChange(Sender: TObject);
- begin
- TestInput(EDx, IMx, vx);
- end;
- procedure TGLVectorEditorForm.EDyChange(Sender: TObject);
- begin
- TestInput(EDy, IMy, vy);
- end;
- procedure TGLVectorEditorForm.EDzChange(Sender: TObject);
- begin
- TestInput(EDz, IMz, vz);
- end;
- procedure TGLVectorEditorForm.SBmXClick(Sender: TObject);
- begin
- EDx.Text := '-1';
- EDy.Text := '0';
- EDz.Text := '0';
- end;
- procedure TGLVectorEditorForm.SBmYClick(Sender: TObject);
- begin
- EDx.Text := '0';
- EDy.Text := '-1';
- EDz.Text := '0';
- end;
- procedure TGLVectorEditorForm.SBmZClick(Sender: TObject);
- begin
- EDx.Text := '0';
- EDy.Text := '0';
- EDz.Text := '-1';
- end;
- procedure TGLVectorEditorForm.SBUnitClick(Sender: TObject);
- begin
- EDx.Text := '1';
- EDy.Text := '1';
- EDz.Text := '1';
- end;
- procedure TGLVectorEditorForm.SpeedButton9Click(Sender: TObject);
- var
- v: TAffineVector;
- begin
- SetVector(v, StrToFloatDef(EDx.Text, 0),
- StrToFloatDef(EDy.Text, 0), StrToFloatDef(EDz.Text, 0));
- if VectorLength(v) = 0 then
- v := NullVector
- else
- NormalizeVector(v);
- EDx.Text := FloatToStr(v.x);
- EDy.Text := FloatToStr(v.y);
- EDz.Text := FloatToStr(v.z);
- end;
- procedure TGLVectorEditorForm.SBInvertClick(Sender: TObject);
- var
- v: TAffineVector;
- begin
- SetVector(v, StrToFloatDef(EDx.Text, 0),
- StrToFloatDef(EDy.Text, 0), StrToFloatDef(EDz.Text, 0));
- NegateVector(v);
- EDx.Text := FloatToStr(v.x);
- EDy.Text := FloatToStr(v.y);
- EDz.Text := FloatToStr(v.z);
- end;
- // ------------------------------------------------------------------
- initialization
- // ------------------------------------------------------------------
- finalization
- ReleaseVectorEditorForm;
- end.
|