FVectorEditor.pas 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. //
  2. // This unit is part of the GLScene Engine, http://glscene.org
  3. //
  4. {
  5. Editor for a vector.
  6. }
  7. unit FVectorEditor;
  8. interface
  9. {$I GLScene.inc}
  10. uses
  11. System.Classes,
  12. System.SysUtils,
  13. VCL.Forms,
  14. VCL.ComCtrls,
  15. VCL.StdCtrls,
  16. VCL.ToolWin,
  17. VCL.ExtCtrls,
  18. VCL.Buttons,
  19. VCL.Graphics,
  20. VCL.Controls,
  21. GLVectorGeometry,
  22. GLUtils,
  23. GLVectorTypes;
  24. type
  25. TGLVectorEditorForm = class(TForm)
  26. EDx: TEdit;
  27. Label1: TLabel;
  28. Label2: TLabel;
  29. Label3: TLabel;
  30. EDy: TEdit;
  31. EDz: TEdit;
  32. BBok: TBitBtn;
  33. BBcancel: TBitBtn;
  34. IMx: TImage;
  35. IMy: TImage;
  36. IMz: TImage;
  37. SpeedButton1: TSpeedButton;
  38. SBmX: TSpeedButton;
  39. SpeedButton3: TSpeedButton;
  40. SBmY: TSpeedButton;
  41. SpeedButton5: TSpeedButton;
  42. SBmZ: TSpeedButton;
  43. SpeedButton7: TSpeedButton;
  44. SBUnit: TSpeedButton;
  45. SpeedButton9: TSpeedButton;
  46. Bevel1: TBevel;
  47. SBInvert: TSpeedButton;
  48. procedure TBxClick(Sender: TObject);
  49. procedure TByClick(Sender: TObject);
  50. procedure TBzClick(Sender: TObject);
  51. procedure TBnullClick(Sender: TObject);
  52. procedure EDxChange(Sender: TObject);
  53. procedure EDyChange(Sender: TObject);
  54. procedure EDzChange(Sender: TObject);
  55. procedure SBmXClick(Sender: TObject);
  56. procedure SBmYClick(Sender: TObject);
  57. procedure SBmZClick(Sender: TObject);
  58. procedure SBUnitClick(Sender: TObject);
  59. procedure SpeedButton9Click(Sender: TObject);
  60. procedure SBInvertClick(Sender: TObject);
  61. private
  62. vx, vy, vz : Single;
  63. procedure TestInput(edit : TEdit; imError : TImage; var dest : Single);
  64. public
  65. function Execute(var x, y, z : Single) : Boolean;
  66. end;
  67. function GLVectorEditorForm : TGLVectorEditorForm;
  68. procedure ReleaseVectorEditorForm;
  69. // ------------------------------------------------------------------
  70. implementation
  71. // ------------------------------------------------------------------
  72. {$R *.dfm}
  73. var
  74. vGLVectorEditorForm : TGLVectorEditorForm;
  75. function GLVectorEditorForm : TGLVectorEditorForm;
  76. begin
  77. if not Assigned(vGLVectorEditorForm) then
  78. vGLVectorEditorForm:=TGLVectorEditorForm.Create(nil);
  79. Result:=vGLVectorEditorForm;
  80. end;
  81. procedure ReleaseVectorEditorForm;
  82. begin
  83. if Assigned(vGLVectorEditorForm) then begin
  84. vGLVectorEditorForm.Free; vGLVectorEditorForm:=nil;
  85. end;
  86. end;
  87. function TGLVectorEditorForm.Execute(var x, y, z : Single) : Boolean;
  88. begin
  89. // setup dialog fields
  90. vx:=x;
  91. vy:=y;
  92. vz:=z;
  93. EDx.Text:=FloatToStr(vx);
  94. EDy.Text:=FloatToStr(vy);
  95. EDz.Text:=FloatToStr(vz);
  96. // show the dialog
  97. Result:=(ShowModal=mrOk);
  98. if Result then begin
  99. x:=vx;
  100. y:=vy;
  101. z:=vz;
  102. end;
  103. end;
  104. procedure TGLVectorEditorForm.TestInput(edit : TEdit; imError : TImage; var dest : Single);
  105. begin
  106. if Visible then begin
  107. try
  108. dest:=StrToFloat(edit.Text);
  109. imError.Visible:=False;
  110. except
  111. imError.Visible:=True;
  112. end;
  113. BBOk.Enabled:=not (IMx.Visible or IMy.Visible or IMz.Visible);
  114. end;
  115. end;
  116. procedure TGLVectorEditorForm.TBxClick(Sender: TObject);
  117. begin
  118. EDx.Text:='1'; EDy.Text:='0'; EDz.Text:='0';
  119. end;
  120. procedure TGLVectorEditorForm.TByClick(Sender: TObject);
  121. begin
  122. EDx.Text:='0'; EDy.Text:='1'; EDz.Text:='0';
  123. end;
  124. procedure TGLVectorEditorForm.TBzClick(Sender: TObject);
  125. begin
  126. EDx.Text:='0'; EDy.Text:='0'; EDz.Text:='1';
  127. end;
  128. procedure TGLVectorEditorForm.TBnullClick(Sender: TObject);
  129. begin
  130. EDx.Text:='0'; EDy.Text:='0'; EDz.Text:='0';
  131. end;
  132. procedure TGLVectorEditorForm.EDxChange(Sender: TObject);
  133. begin
  134. TestInput(EDx, IMx, vx);
  135. end;
  136. procedure TGLVectorEditorForm.EDyChange(Sender: TObject);
  137. begin
  138. TestInput(EDy, IMy, vy);
  139. end;
  140. procedure TGLVectorEditorForm.EDzChange(Sender: TObject);
  141. begin
  142. TestInput(EDz, IMz, vz);
  143. end;
  144. procedure TGLVectorEditorForm.SBmXClick(Sender: TObject);
  145. begin
  146. EDx.Text:='-1'; EDy.Text:='0'; EDz.Text:='0';
  147. end;
  148. procedure TGLVectorEditorForm.SBmYClick(Sender: TObject);
  149. begin
  150. EDx.Text:='0'; EDy.Text:='-1'; EDz.Text:='0';
  151. end;
  152. procedure TGLVectorEditorForm.SBmZClick(Sender: TObject);
  153. begin
  154. EDx.Text:='0'; EDy.Text:='0'; EDz.Text:='-1';
  155. end;
  156. procedure TGLVectorEditorForm.SBUnitClick(Sender: TObject);
  157. begin
  158. EDx.Text:='1'; EDy.Text:='1'; EDz.Text:='1';
  159. end;
  160. procedure TGLVectorEditorForm.SpeedButton9Click(Sender: TObject);
  161. var
  162. v : TAffineVector;
  163. begin
  164. SetVector(v, GLUtils.StrToFloatDef(EDx.Text, 0), GLUtils.StrToFloatDef(EDy.Text, 0), GLUtils.StrToFloatDef(EDz.Text, 0));
  165. if VectorLength(v)=0 then
  166. v:=NullVector
  167. else NormalizeVector(v);
  168. EDx.Text:=FloatToStr(v.X);
  169. EDy.Text:=FloatToStr(v.Y);
  170. EDz.Text:=FloatToStr(v.Z);
  171. end;
  172. procedure TGLVectorEditorForm.SBInvertClick(Sender: TObject);
  173. var
  174. v : TAffineVector;
  175. begin
  176. SetVector(v, GLUtils.StrToFloatDef(EDx.Text, 0), GLUtils.StrToFloatDef(EDy.Text, 0), GLUtils.StrToFloatDef(EDz.Text, 0));
  177. NegateVector(v);
  178. EDx.Text:=FloatToStr(v.X);
  179. EDy.Text:=FloatToStr(v.Y);
  180. EDz.Text:=FloatToStr(v.Z);
  181. end;
  182. // ------------------------------------------------------------------
  183. initialization
  184. // ------------------------------------------------------------------
  185. finalization
  186. ReleaseVectorEditorForm;
  187. end.