FmVectorEditor.pas 5.1 KB

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