MathgeomGLS
334 строки · 7.9 Кб
1unit fVolumeX;
2
3interface
4
5uses
6Winapi.Windows,
7Winapi.Messages,
8System.SysUtils,
9System.Variants,
10System.Classes,
11System.Math,
12Vcl.Clipbrd,
13Vcl.Graphics,
14Vcl.Controls,
15Vcl.Forms,
16Vcl.Dialogs,
17Vcl.Menus,
18Vcl.StdCtrls,
19Vcl.Buttons,
20Vcl.ComCtrls,
21Vcl.ExtCtrls;
22
23type
24TVolumeXForm = class(TForm)
25Label3: TLabel;
26Label4: TLabel;
27Label5: TLabel;
28Label6: TLabel;
29Label1: TLabel;
30Label2: TLabel;
31Label7: TLabel;
32Label8: TLabel;
33PositiveButton: TSpeedButton;
34NegativeButton: TSpeedButton;
35TotalVolumeLabel: TLabel;
36EditIntegMin: TEdit;
37EditIntegMax: TEdit;
38EditCount: TEdit;
39UpDown1: TUpDown;
40EditOpacity: TEdit;
41UpDown2: TUpDown;
42RecalcBtn: TBitBtn;
43CloseBtn: TBitBtn;
44KeepRangeCheckBox: TCheckBox;
45ColorDialog: TColorDialog;
46HideFunctionCheckBox: TCheckBox;
47PositivePanel: TPanel;
48NegativePanel: TPanel;
49SurfaceAreaLabel: TLabel;
50procedure FormShow(Sender: TObject);
51procedure FormActivate(Sender: TObject);
52procedure FormKeyPress(Sender: TObject; var Key: Char);
53procedure FormDeactivate(Sender: TObject);
54procedure ParseKeyPress(Sender: TObject; var Key: Char);
55procedure IntKeyPress(Sender: TObject; var Key: Char);
56procedure EditIntegMinKeyUp(Sender: TObject; var Key: Word;
57Shift: TShiftState);
58procedure EditIntegMaxKeyUp(Sender: TObject; var Key: Word;
59Shift: TShiftState);
60procedure EditCountKeyUp(Sender: TObject; var Key: Word;
61Shift: TShiftState);
62procedure EditOpacityKeyUp(Sender: TObject; var Key: Word;
63Shift: TShiftState);
64procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
65procedure UpDown2Click(Sender: TObject; Button: TUDBtnType);
66procedure UpDown1MouseUp(Sender: TObject; Button: TMouseButton;
67Shift: TShiftState; X, Y: Integer);
68procedure PositiveButtonClick(Sender: TObject);
69procedure NegativeButtonClick(Sender: TObject);
70procedure RecalcBtnClick(Sender: TObject);
71procedure IntegLabelClick(Sender: TObject);
72procedure KeepRangeCheckBoxClick(Sender: TObject);
73procedure CloseBtnClick(Sender: TObject);
74procedure HideFunctionCheckBoxClick(Sender: TObject);
75private
76
77procedure UpdateRangeData;
78public
79
80procedure ShowData;
81end;
82
83var
84VolumeXForm: TVolumeXForm;
85
86//===============================================================
87implementation
88//===============================================================
89
90uses
91uParser,
92uGlobal,
93fFuncts,
94fPlot1D;
95
96{$R *.dfm}
97
98procedure TVolumeXForm.FormShow(Sender: TObject);
99begin
100KeepRangeCheckBox.Checked := KeepRange;
101ShowData;
102end;
103
104procedure TVolumeXForm.HideFunctionCheckBoxClick(Sender: TObject);
105begin
106MainForm.GLViewer.Invalidate;
107end;
108
109procedure TVolumeXForm.FormActivate(Sender: TObject);
110begin
111EditIntegMin.SetFocus;
112EditIntegMin.SelText;
113end;
114
115procedure TVolumeXForm.FormKeyPress(Sender: TObject; var Key: Char);
116begin
117case Key of
118#13:begin
119RecalcBtnClick(Sender);
120Key := #0;
121end;
122#27:begin
123Key := #0;
124Close;
125end;
126end;
127end;
128
129procedure TVolumeXForm.FormDeactivate(Sender: TObject);
130begin
131if KeepRange then UpdateRangeData;
132end;
133
134procedure TVolumeXForm.ParseKeyPress(Sender: TObject; var Key: Char);
135begin
136with Sender as TEdit do
137begin
138if not CharInSet(UpCase(Key),
139[' ', '!', '(', ')', '*', '+', '-', '.', ',', '/', '0'..'9',
140'A'..'C', 'E', 'G'..'I', 'L', 'N'..'T', 'X', '^', '`', #8]) then
141begin
142Key := #0;
143Exit;
144end;
145if Key = '`' then Key := '�';
146end;
147end;
148
149procedure TVolumeXForm.RecalcBtnClick(Sender: TObject);
150begin
151MainForm.GLViewer.Invalidate;
152end;
153
154procedure TVolumeXForm.IntegLabelClick(Sender: TObject);
155begin
156Clipboard.Clear;
157with Sender as TLabel do
158Clipboard.AsText := Copy(Caption, pos('=', Caption)+2, Length(Caption));
159end;
160
161procedure TVolumeXForm.IntKeyPress(Sender: TObject; var Key: Char);
162begin
163with Sender as TEdit do
164if not CharInSet(Key, ['0'..'9', #8]) then Key := #0
165end;
166
167procedure TVolumeXForm.KeepRangeCheckBoxClick(Sender: TObject);
168begin
169KeepRange := KeepRangeCheckBox.Checked;
170end;
171
172procedure TVolumeXForm.NegativeButtonClick(Sender: TObject);
173begin
174ColorDialog.Color := GraphData.NegAreaColor;
175if ColorDialog.Execute then
176begin
177GraphData.NegAreaColor := ColorDialog.Color;
178NegativePanel.Color := GraphData.NegAreaColor;
179MainForm.GLViewer.Invalidate;
180Altered := TRUE
181end;
182end;
183
184procedure TVolumeXForm.PositiveButtonClick(Sender: TObject);
185begin
186ColorDialog.Color := GraphData.PosAreaColor;
187if ColorDialog.Execute then
188begin
189GraphData.PosAreaColor := ColorDialog.Color;
190PositivePanel.Color := GraphData.PosAreaColor;
191MainForm.GLViewer.Invalidate;
192Altered := TRUE
193end;
194end;
195
196procedure TVolumeXForm.UpDown1Click(Sender: TObject; Button: TUDBtnType);
197var
198k: word;
199
200begin
201k := 0;
202EditCountKeyUp(Sender, k, []);
203end;
204
205procedure TVolumeXForm.UpDown1MouseUp(Sender: TObject; Button: TMouseButton;
206Shift: TShiftState; X, Y: Integer);
207begin
208RecalcBtnClick(Sender);
209end;
210
211procedure TVolumeXForm.UpDown2Click(Sender: TObject; Button: TUDBtnType);
212var
213k: word;
214
215begin
216k := 0;
217EditOpacityKeyUp(Sender, k, []);
218end;
219
220procedure TVolumeXForm.EditIntegMinKeyUp(Sender: TObject; var Key: Word;
221Shift: TShiftState);
222var
223s: string;
224e: byte;
225
226begin
227s := ScanText(EditIntegMin.Text);
228IntegMin := ParseAndEvaluate(s, e);
229// if isNAN(IntegMin) then IntegMin := 0;
230// if e > 0 then IntegMin := 0;
231if isNAN(IntegMin) or isInfinite(IntegMin) or (e > 0) then IntegMin := 0;
232end;
233
234procedure TVolumeXForm.EditIntegMaxKeyUp(Sender: TObject; var Key: Word;
235Shift: TShiftState);
236var
237s: string;
238e: byte;
239
240begin
241s := ScanText(EditIntegMax.Text);
242IntegMax := ParseAndEvaluate(s, e);
243//if isNAN(IntegMax) then IntegMax := 0;
244//if e > 0 then IntegMax := 0;
245if isNAN(IntegMax) or isInfinite(IntegMax) or (e > 0) then IntegMax := 0;
246end;
247
248procedure TVolumeXForm.CloseBtnClick(Sender: TObject);
249begin
250Close;
251end;
252
253procedure TVolumeXForm.EditCountKeyUp(Sender: TObject; var Key: Word;
254Shift: TShiftState);
255begin
256with GraphData do
257begin
258try
259IntegCount := StrToInt(EditCount.Text);
260if IntegCount = 0 then IntegCount := IntegCountPos;
261except
262IntegCount := IntegCountPos;
263end;
264if IntegCount > IntegCountMax then IntegCount := IntegCountMax;
265end;
266Altered := true;
267end;
268
269procedure TVolumeXForm.EditOpacityKeyUp(Sender: TObject; var Key: Word;
270Shift: TShiftState);
271var
272n: integer;
273
274begin
275try
276n := StrToInt(EditOpacity.Text);
277except
278n := 1;
279end;
280GraphData.AreaAlpha := n/100;
281Altered := true;
282MainForm.GLViewer.Invalidate;
283end;
284
285procedure TVolumeXForm.UpdateRangeData;
286begin
287KeptMin := IntegMin;
288KeptMax := IntegMax;
289end;
290
291procedure TVolumeXForm.ShowData;
292begin
293with GraphData, PlotData do
294begin
295EditCount.Text := IntToStr(IntegCount);
296UpDown2.Position := round(AreaAlpha*100);
297if TextStr = '' then Caption := '' else Caption := 'y = '+TextStr;
298
299KeepRangeCheckBox.Checked := KeepRange;
300PositivePanel.Color := PosAreaColor;
301NegativePanel.Color := NegAreaColor;
302
303if IsSegment then
304begin
305if KeepRange then
306begin
307IntegMin := KeptMin;
308IntegMax := KeptMax;
309end
310else
311begin
312IntegMin := SegMin;
313IntegMax := SegMax;
314end;
315end
316else
317begin
318if KeepRange then
319begin
320IntegMin := KeptMin;
321IntegMax := KeptMax;
322end
323else
324begin
325IntegMin := xMin;
326IntegMax := xMax;
327end;
328end;
329end;
330EditIntegMin.Text := FloatToStrF(IntegMin, ffGeneral, 13, 4);
331EditIntegMax.Text := FloatToStrF(IntegMax, ffGeneral, 13, 4);
332end;
333
334end.
335