1075 lines
29 KiB
ObjectPascal
1075 lines
29 KiB
ObjectPascal
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
|
||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||
unit DrawManField;
|
||
|
||
//#savepcu false
|
||
|
||
interface
|
||
|
||
uses GraphABC,DMCollect,System.Drawing;
|
||
|
||
const
|
||
IniFileName = 'ABC.ini';
|
||
colorTask = clRed;
|
||
colorSolve = clBlue;
|
||
|
||
var
|
||
BackColor: Color;
|
||
LabelReadyColor: Color;
|
||
LabelDoColor: Color;
|
||
LabelStopColor: Color;
|
||
LabelErrorColor: Color;
|
||
LabelBadEndColor: Color;
|
||
LabelGoodEndColor: Color;
|
||
ZazX1 := 18;
|
||
ZazY1 := 5;
|
||
ZazX2 := 10;
|
||
ZazY2 := 16;
|
||
|
||
HelpStr := 'Разработчик исполнителя Чертежник: Михалкович С.С., 2002-17 '#10#13#10#13+
|
||
'Команды исполнителя Чертежник:'#10#13+
|
||
' PenDown - опустить перо'#10#13+
|
||
' PenUp - поднять перо'#10#13
|
||
' ToPoint(x,y) - переместиться в точку с координатами (x,y)'#10#13+
|
||
' OnVector(a,b) - переместиться из текущей точки на вектор (a,b)'#10#13
|
||
' a>0 - вправо, a<0 - влево, b>0 - вверх, b<0 - вниз'#10#13
|
||
' Task(name) - вызвать задание с указанным именем'#10#13
|
||
' StandardField - вызвать стандартное поле'#10#13
|
||
' Field(n,m) - вызвать поле размера n на m'#10#13#10#13;
|
||
|
||
type
|
||
TDMField = class
|
||
private
|
||
orx,ory: integer;
|
||
DMColl, DMMakerColl: SortedCollection;
|
||
DMX, DMY: integer;
|
||
PenIsUp: boolean;
|
||
MakerX, MakerY: integer;
|
||
MakerPenIsUp: boolean;
|
||
Interval: integer;
|
||
StepFlag: boolean;
|
||
movenum: integer;
|
||
CellSize,DimX,DimY,X0,Y0: integer;
|
||
DMPicture: Picture;
|
||
procedure Draw0;
|
||
procedure DrawFieldOnly;
|
||
procedure DrawXY;
|
||
public
|
||
dmwidth := 2;
|
||
// Добавил - МА
|
||
TaskName: string;
|
||
//
|
||
constructor Create(sizex,sizey,cellsize: integer);
|
||
procedure DrawCentered;
|
||
procedure Draw;
|
||
procedure DrawDMDrawing;
|
||
procedure DrawDMMakerDrawing;
|
||
procedure DMLine(x1,y1,x2,y2: integer; c: GraphABC.Color);
|
||
procedure Clear;
|
||
procedure SetSpeed(speed: integer);
|
||
property StepState: boolean read StepFlag;
|
||
property SizeX: integer read DimX;
|
||
property SizeY: integer read DimY;
|
||
function IsSolution: boolean;
|
||
procedure CheckTaskCall;
|
||
// примитивы для постановщика (Maker)
|
||
procedure SetOrigin(x0,y0: integer);
|
||
procedure SetDim(DX,DY,CellSz: integer);
|
||
procedure TaskText(s: string);
|
||
|
||
procedure AddMakerLine(x1,y1,x2,y2: integer);
|
||
procedure MakerPenUp;
|
||
procedure MakerPenDown;
|
||
procedure MakerToPoint(x,y: integer);
|
||
procedure MakerOnVector(x,y: integer);
|
||
|
||
procedure SetDrawManWidth(w: integer);
|
||
|
||
// примитивы для выполнителя
|
||
procedure DrawDM;
|
||
procedure ClearDM;
|
||
|
||
procedure PenUp;
|
||
procedure PenDown;
|
||
procedure ToPoint(x,y: integer);
|
||
procedure OnVector(x,y: integer);
|
||
|
||
procedure Pause;
|
||
|
||
procedure Start;
|
||
procedure Stop;
|
||
end;
|
||
|
||
procedure CorrectWHLT;
|
||
procedure SetTaskCall;
|
||
|
||
procedure DrawmanError(s: string);
|
||
procedure DrawmanError(s,s1: string);
|
||
|
||
var
|
||
DMField: TDMField;
|
||
|
||
///--
|
||
procedure __InitModule__;
|
||
///--
|
||
procedure __FinalizeModule__;
|
||
|
||
implementation
|
||
|
||
uses
|
||
System,
|
||
System.Windows.Forms,
|
||
System.Drawing,
|
||
GraphABCHelper,GraphABC,
|
||
IniFile;
|
||
|
||
type
|
||
TLabel = System.Windows.Forms.Label;
|
||
IniSettings = record
|
||
Width: integer;
|
||
Height: integer;
|
||
Left: integer;
|
||
Top: integer;
|
||
Speed: integer;
|
||
end;
|
||
|
||
var
|
||
BottomPanel: Panel;
|
||
panelBottomLeft: Panel;
|
||
buttonHelp: Button;
|
||
buttonExit: Button;
|
||
buttonStep: Button;
|
||
buttonStart: Button;
|
||
tableLayoutPanelBottom: TableLayoutPanel;
|
||
labelExState: TLabel;
|
||
groupBoxExState: GroupBox;
|
||
tableLayoutPanel1: TableLayoutPanel;
|
||
labelState: TLabel;
|
||
labelStep: TLabel;
|
||
trackBarSpeed: TrackBar;
|
||
labelSpeed: TLabel;
|
||
tableLayoutPanelTop: TableLayoutPanel;
|
||
labelZad: TLabel;
|
||
|
||
TaskIsCalled: boolean;
|
||
|
||
t: System.Threading.Thread;
|
||
|
||
ScreenScale: real := 1;
|
||
|
||
//------------ Вспомогательные -------------
|
||
procedure SetLabelStepText(s: string);
|
||
begin
|
||
labelStep.Text := s;
|
||
end;
|
||
|
||
procedure SetSafeLabelStepText(s: string);
|
||
begin
|
||
labelStep.Invoke(SetLabelStepText,s);
|
||
end;
|
||
|
||
procedure SetLabelZadText(s : string);
|
||
begin
|
||
labelZad.Text := s;
|
||
end;
|
||
|
||
procedure SetSafeLabelZadText(s: string);
|
||
begin
|
||
labelZad.Invoke(SetLabelZadText,s);
|
||
end;
|
||
|
||
procedure SetLabelExStateText(s: string);
|
||
begin
|
||
labelExState.Text := s;
|
||
end;
|
||
|
||
procedure SetTrackBarSpeedValue(speed: integer);
|
||
begin
|
||
trackBarSpeed.Value := speed;
|
||
end;
|
||
|
||
procedure SetSafeTrackBarSpeedValue(speed: integer);
|
||
begin
|
||
trackBarSpeed.Invoke(SetTrackBarSpeedValue,speed);
|
||
end;
|
||
|
||
//------------ TDMField -------------
|
||
constructor TDMField.Create(sizex,sizey,cellsize: integer);
|
||
begin
|
||
orx := 0;
|
||
ory := 0;
|
||
Self.CellSize := cellsize;
|
||
DimX := sizex;
|
||
DimY := sizey;
|
||
X0 := 0;
|
||
Y0 := 0;
|
||
|
||
DMX := 0;
|
||
DMY := 0;
|
||
PenIsUp := True;
|
||
|
||
MakerX := 0;
|
||
MakerY := 0;
|
||
MakerPenIsUp := True;
|
||
|
||
DMColl := new SortedCollection;
|
||
DMMakerColl := new SortedCollection;
|
||
|
||
DMPicture := new Picture(9,9);
|
||
// DMRedrawPicture := new Picture(9,9);
|
||
|
||
StepFlag := False;
|
||
movenum := 0;
|
||
end;
|
||
|
||
procedure TDMField.Draw;
|
||
begin
|
||
if (MainForm.windowstate=formwindowstate.Minimized) then
|
||
Exit;
|
||
LockDrawing;
|
||
ClearWindow(BackColor);
|
||
Draw0;
|
||
UnLockDrawing;
|
||
end;
|
||
|
||
procedure TDMField.DrawDMDrawing;
|
||
begin
|
||
for var i:=0 to DMColl.Count-1 do
|
||
DMLine(DMColl[i].p.x,DMColl[i].p.y,DMColl[i].p.x+DMColl[i].v.x,DMColl[i].p.y+DMColl[i].v.y,colorSolve);
|
||
end;
|
||
|
||
procedure TDMField.DrawDMMakerDrawing;
|
||
begin
|
||
for var i:=0 to DMMakerColl.Count-1 do
|
||
DMLine(DMMakerColl[i].p.x,DMMakerColl[i].p.y,DMMakerColl[i].p.x+DMMakerColl[i].v.x,DMMakerColl[i].p.y+DMMakerColl[i].v.y,colorTask);
|
||
end;
|
||
|
||
procedure TDMField.DrawCentered;
|
||
var w,h: integer;
|
||
begin
|
||
if (DimX=0) or (DimY=0) then
|
||
exit;
|
||
w := CellSize*DimX+ZazX1+ZazX2;
|
||
h := CellSize*DimY+ZazY1+ZazY2;
|
||
X0 := (GraphABCControl.Width - w) div 2;
|
||
Y0 := (GraphABCControl.Height - h) div 2;
|
||
Draw;
|
||
end;
|
||
|
||
procedure TDMField.DrawFieldOnly;
|
||
begin
|
||
var w := CellSize*DimX;
|
||
var h := CellSize*DimY;
|
||
Brush.Color := clWhite;
|
||
FillRectangle(X0,Y0,X0+ZazX1+w+1+ZazX2,Y0+ZazY1+h+1+ZazY2);
|
||
Pen.Width := 1;
|
||
Pen.Color := RGB(191,191,191);
|
||
for var ix:=0 to DimX do
|
||
Line(X0+ZazX1+ix*CellSize,Y0+ZazY1,X0+ZazX1+ix*CellSize,Y0+ZazY1+h);
|
||
for var iy:=0 to DimY do
|
||
Line(X0+ZazX1,Y0+ZazY1+iy*CellSize,X0+ZazX1+w,Y0+ZazY1+iy*CellSize);
|
||
Pen.Color := clGray;
|
||
if (orx>-DimX) and (orx<0) then
|
||
Line(X0+ZazX1-orx*CellSize,Y0+ZazY1,X0+ZazX1-orx*CellSize,Y0+ZazY1+h);
|
||
if (ory>-DimY) and (ory<0) then
|
||
Line(X0+ZazX1,Y0+ZazY1+(DimY+ory)*CellSize,X0+ZazX1+w,Y0+ZazY1+(DimY+ory)*CellSize);
|
||
|
||
Pen.Color := clBlack;
|
||
DrawRectangle(X0+ZazX1,Y0+ZazY1,X0+ZazX1+w+1,Y0+ZazY1+h+1);
|
||
end;
|
||
|
||
procedure TDMField.DrawXY;
|
||
var ww: integer;
|
||
s: string;
|
||
interval: integer;
|
||
bs: BrushStyleType;
|
||
begin
|
||
interval:=2;
|
||
case CellSize of
|
||
0..1: interval:=20;
|
||
2..3: interval:=10;
|
||
4..5: interval:=5;
|
||
6..7: interval:=3;
|
||
8..100: interval:=2;
|
||
end;
|
||
bs := Brush.Style;
|
||
Brush.Style := bsClear;
|
||
Font.Name := 'MS Sans Serif';
|
||
Font.Size := 8;
|
||
for var x:=0 to DimX do
|
||
if (x+orx) mod interval = 0 then
|
||
begin
|
||
s:=IntToStr(x+orx);
|
||
ww:=TextWidth(s);
|
||
// hh:=Canvas.TextHeight(s);
|
||
TextOut(X0+ZazX1+x*CellSize-ww div 2+1,Y0+ZazY1+DimY*CellSize+1+2,s);
|
||
end;
|
||
for var y:=0 to DimY do
|
||
if (y+ory) mod interval = 0 then
|
||
begin
|
||
s:=IntToStr(y+ory);
|
||
ww:=TextWidth(s);
|
||
if (y+ory>=10) or (y+ory<0) then
|
||
Dec(ww);
|
||
// hh:=Canvas.TextHeight(s);
|
||
TextOut(X0+ZazX1-ww-3,Y0+ZazY1+(DimY-y)*CellSize+1-8,s);
|
||
end;
|
||
Brush.Style := bsSolid;
|
||
end;
|
||
|
||
procedure TDMField.DMLine(x1,y1,x2,y2: integer; c: GraphABC.Color);
|
||
begin
|
||
Pen.Width := dmwidth;
|
||
Line(X0+ZazX1+(x1-orx)*CellSize,Y0+ZazY1+(DimY-y1+ory)*CellSize,X0+ZazX1+(x2-orx)*CellSize,Y0+ZazY1+(DimY-y2+ory)*CellSize,c);
|
||
end;
|
||
|
||
procedure TDMField.Draw0;
|
||
begin
|
||
DrawFieldOnly;
|
||
DrawXY;
|
||
DrawDMMakerDrawing;
|
||
DrawDMDrawing;
|
||
DrawDM;
|
||
end;
|
||
|
||
procedure TDMField.SetDim(DX, DY, CellSz: integer);
|
||
begin
|
||
Clear;
|
||
DimX := DX;
|
||
DimY := DY;
|
||
CellSize := CellSz;
|
||
// DrawCentered;
|
||
end;
|
||
|
||
procedure TDMField.SetOrigin(x0,y0: integer);
|
||
begin
|
||
orx := x0;
|
||
ory := y0;
|
||
if orx<=-10 then
|
||
ZazX1 := 23
|
||
else ZazX1 := 18;
|
||
end;
|
||
|
||
procedure TDMField.AddMakerLine(x1,y1,x2,y2: integer);
|
||
begin
|
||
DMMakerColl.Insert(x1,y1,x2,y2);
|
||
end;
|
||
|
||
procedure TDMField.MakerPenUp;
|
||
begin
|
||
MakerPenIsUp := True;
|
||
end;
|
||
|
||
procedure TDMField.MakerPenDown;
|
||
begin
|
||
MakerPenIsUp := False;
|
||
end;
|
||
|
||
procedure TDMField.MakerToPoint(x,y: integer);
|
||
begin
|
||
if not MakerPenIsUp then
|
||
AddMakerLine(MakerX,MakerY,x,y);
|
||
MakerX := x;
|
||
MakerY := y;
|
||
end;
|
||
|
||
procedure TDMField.MakerOnVector(x,y: integer);
|
||
begin
|
||
MakerToPoint(MakerX+x,MakerY+y);
|
||
end;
|
||
|
||
procedure TDMField.SetDrawManWidth(w: integer);
|
||
begin
|
||
dmwidth := 2;
|
||
end;
|
||
|
||
procedure TDMField.DrawDM;
|
||
var
|
||
ZZ: integer;
|
||
r,r1: System.Drawing.Rectangle;
|
||
begin
|
||
if PenIsUp then
|
||
ZZ := 4
|
||
else ZZ := 2;
|
||
r := new System.Drawing.Rectangle(0,0,8,8);
|
||
r1 := r;
|
||
r1.Offset(X0+ZazX1+(DMX-orx)*CellSize-4+1,Y0+ZazY1+(DimY-DMY+ory)*CellSize-4+1);
|
||
DMPicture.CopyRect(r,GraphBufferBitmap,r1);
|
||
Pen.Width := 1;
|
||
DrawRectangle(X0+ZazX1+(DMX-orx)*CellSize-ZZ+1,Y0+ZazY1+(DimY+ory-DMY)*CellSize-ZZ+1,X0+ZazX1+(DMX-orx)*CellSize+ZZ,Y0+ZazY1+(DimY+ory-DMY)*CellSize+ZZ);
|
||
end;
|
||
|
||
procedure TDMField.ClearDM;
|
||
begin
|
||
DMPicture.Draw(X0+ZazX1+(DMX-orx)*CellSize-4+1,Y0+ZazY1+(DimY-DMY+ory)*CellSize-4+1)
|
||
end;
|
||
|
||
procedure TDMField.PenUp;
|
||
begin
|
||
CheckTaskCall;
|
||
ClearDM;
|
||
PenIsUp := True;
|
||
DrawDM;
|
||
Inc(movenum);
|
||
SetSafeLabelStepText('Шаг: ' + IntToStr(movenum));
|
||
end;
|
||
|
||
procedure TDMField.PenDown;
|
||
begin
|
||
CheckTaskCall;
|
||
ClearDM;
|
||
PenIsUp := False;
|
||
DrawDM;
|
||
Inc(movenum);
|
||
SetSafeLabelStepText('Шаг: ' + IntToStr(movenum));
|
||
end;
|
||
|
||
procedure TDMField.ToPoint(x,y: integer);
|
||
begin
|
||
CheckTaskCall;
|
||
ClearDM;
|
||
if (x<orx) or (x>DimX+orx) or (y<ory) or (y>DimY+ory) then
|
||
DrawmanError('Чертежник: вышел за границы поля рисования','Задание прервано');
|
||
if not PenIsUp then
|
||
begin
|
||
DMLine(DMX,DMY,x,y,colorSolve);
|
||
DMColl.Insert(DMX,DMY,x,y);
|
||
end;
|
||
DMX := x;
|
||
DMY := y;
|
||
DrawDM;
|
||
Inc(movenum);
|
||
SetSafeLabelStepText('Шаг: ' + IntToStr(movenum));
|
||
end;
|
||
|
||
procedure TDMField.OnVector(x,y: integer);
|
||
begin
|
||
ToPoint(DMX+x,DMY+y);
|
||
end;
|
||
|
||
procedure TDMField.TaskText(s: string);
|
||
begin
|
||
SetSafeLabelZadText(s);
|
||
end;
|
||
|
||
procedure TDMField.SetSpeed(speed: integer);
|
||
begin
|
||
if speed<0 then speed := 0;
|
||
case speed of
|
||
0: Interval := 2*1024;
|
||
1: Interval := 2*512;
|
||
2: Interval := 2*256;
|
||
3: Interval := 2*128;
|
||
4: Interval := 2*64;
|
||
5: Interval := 2*32;
|
||
6: Interval := 2*16;
|
||
7: Interval := 2*8;
|
||
8: Interval := 2*4;
|
||
9: Interval := 2*2;
|
||
10: Interval := 2*1;
|
||
1000: Interval := 0;
|
||
end;
|
||
if speed>10 then speed := 10;
|
||
SetSafeTrackBarSpeedValue(speed);
|
||
end;
|
||
|
||
procedure TDMField.Stop;
|
||
begin
|
||
buttonStart.Text := 'Пуск (Enter)';
|
||
buttonStep.Enabled := True;
|
||
t.Suspend;
|
||
end;
|
||
|
||
procedure TDMField.Start;
|
||
begin
|
||
buttonStart.Text := 'Стоп (Enter)';
|
||
buttonStep.Enabled := False;
|
||
t.Resume;
|
||
end;
|
||
|
||
procedure TDMField.Pause;
|
||
begin
|
||
Sleep(Interval);
|
||
end;
|
||
|
||
procedure TDMField.Clear;
|
||
begin
|
||
DMColl.Clear;
|
||
DMMakerColl.Clear;
|
||
DMX := 0;
|
||
DMY := 0;
|
||
PenIsUp := True;
|
||
MakerX := 0;
|
||
MakerY := 0;
|
||
MakerPenIsUp := True;
|
||
end;
|
||
|
||
function TDMField.IsSolution: boolean;
|
||
begin
|
||
DMColl.Normalize;
|
||
DMColl.Normalize;
|
||
DMMakerColl.Normalize;
|
||
|
||
{ for i:=0 to DMColl.Count-1 do
|
||
writeln(DMColl[i]);
|
||
writeln;
|
||
for i:=0 to DMMakerColl.Count-1 do
|
||
writeln(DMMakerColl[i]);
|
||
}
|
||
Result := IsEqualSC(DMColl,DMMakerColl) and (DMX=0) and (DMY=0) and (PenIsUp);
|
||
end;
|
||
|
||
procedure TDMField.CheckTaskCall;
|
||
begin
|
||
if not TaskIsCalled then
|
||
DrawManError('Процедура Task вызова задания должна быть первой','Выполнение программы прервано');
|
||
end;
|
||
|
||
//--------- Интерфейс и обработчики
|
||
procedure LoadIni(var settings: IniSettings);
|
||
var Ini: TIniFile;
|
||
begin
|
||
Ini := new TIniFile(IniFileName);
|
||
settings.Width := Ini.ReadInteger('DrawmanWindow','Width',Round(679*ScreenScale));
|
||
settings.Height := Ini.ReadInteger('DrawmanWindow','Height',Round(490*ScreenScale));
|
||
settings.Left := Ini.ReadInteger('DrawmanWindow','Left',(Screen.PrimaryScreen.Bounds.Width-settings.Width) div 2);
|
||
settings.Top := Ini.ReadInteger('DrawmanWindow','Top',(Screen.PrimaryScreen.Bounds.Height-settings.Height) div 2);
|
||
|
||
if settings.Width>screen.PrimaryScreen.Bounds.Width then
|
||
settings.Width := Screen.PrimaryScreen.Bounds.Width;
|
||
|
||
if settings.Height>Screen.PrimaryScreen.Bounds.Height then
|
||
settings.Height := Screen.PrimaryScreen.Bounds.Height;
|
||
|
||
if settings.Left < 0 then
|
||
settings.Left := 0;
|
||
|
||
if settings.Top < 0 then
|
||
settings.Top := 0;
|
||
|
||
if (settings.Left > Screen.PrimaryScreen.Bounds.Width - 10) or
|
||
(settings.Top > Screen.PrimaryScreen.Bounds.Height - 10) then
|
||
begin
|
||
settings.Left := 0;
|
||
settings.Top := 0;
|
||
end;
|
||
|
||
settings.Speed := Ini.ReadInteger('DrawmanWindow','Speed',3);
|
||
Ini := nil;
|
||
end;
|
||
|
||
procedure SaveIni;
|
||
var Ini: TIniFile;
|
||
begin
|
||
if (MainForm.Left<0) or (MainForm.Top<0) then
|
||
exit;
|
||
Ini := new TIniFile(IniFileName);
|
||
Ini.WriteInteger('DrawmanWindow','Width',MainForm.Width);
|
||
Ini.WriteInteger('DrawmanWindow','Height',MainForm.Height);
|
||
Ini.WriteInteger('DrawmanWindow','Left',MainForm.Left);
|
||
Ini.WriteInteger('DrawmanWindow','Top',MainForm.Top);
|
||
Ini.WriteInteger('DrawmanWindow','Speed',trackBarSpeed.Value);
|
||
Ini.Save;
|
||
end;
|
||
|
||
procedure buttonExitClick(o: Object; e: EventArgs);
|
||
begin
|
||
SaveIni;
|
||
halt;
|
||
end;
|
||
|
||
procedure ABCWindowResize(o: Object; e: EventArgs);
|
||
begin
|
||
CorrectWHLT;
|
||
end;
|
||
|
||
procedure MainWindowClose;
|
||
begin
|
||
SaveIni;
|
||
end;
|
||
|
||
procedure buttonStartClick(o: Object; e: EventArgs);
|
||
begin
|
||
if t=nil then
|
||
exit;
|
||
if t.ThreadState = System.Threading.ThreadState.Suspended then
|
||
begin
|
||
DMField.StepFlag := False;
|
||
labelExState.Text := 'Чертежник: Выполняю задание';
|
||
DMField.Start;
|
||
end
|
||
else
|
||
begin
|
||
DMField.StepFlag := True;
|
||
labelExState.Text := 'Чертежник: Остановился';
|
||
DMField.Stop;
|
||
end;
|
||
(GraphABCControl as Control).Focus;
|
||
end;
|
||
|
||
procedure buttonStepClick(o: Object; e: EventArgs);
|
||
begin
|
||
if t=nil then
|
||
exit;
|
||
DMField.StepFlag := True;
|
||
t.Resume;
|
||
(GraphABCControl as Control).Focus;
|
||
labelExState.Text := 'Чертежник: Команда выполнена';
|
||
end;
|
||
|
||
procedure buttonHelpClick(o: Object; e: EventArgs);
|
||
begin
|
||
MessageBox.Show(HelpStr,'Исполнитель Чертежник - Справка');
|
||
(GraphABCControl as Control).Focus;
|
||
end;
|
||
|
||
procedure trackBarSpeedScroll(o: Object; e: EventArgs);
|
||
begin
|
||
DMField.SetSpeed(trackBarSpeed.Value);
|
||
end;
|
||
|
||
procedure MainWindowKeyDown(o: Object; e: KeyEventArgs);
|
||
begin
|
||
if (e.KeyCode = Keys.Return) and buttonStart.Enabled then
|
||
buttonStartClick(o,e)
|
||
else if e.KeyCode = Keys.Escape then
|
||
buttonExitClick(o,e)
|
||
else if (e.KeyCode = Keys.Space) and buttonStep.Enabled then
|
||
buttonStepClick(o,e)
|
||
else if (e.KeyCode = Keys.Right) then
|
||
DMField.SetSpeed(trackBarSpeed.Value+1)
|
||
else if (e.KeyCode = Keys.Left) then
|
||
DMField.SetSpeed(trackBarSpeed.Value-1)
|
||
else if (e.KeyCode = Keys.F1) then
|
||
buttonHelpClick(o,e)
|
||
end;
|
||
|
||
procedure CorrectWHLT;
|
||
begin
|
||
if DMField = nil then
|
||
exit;
|
||
if GraphABCControl = nil then
|
||
exit;
|
||
if (DMField.DimX=0) or (DMField.DimY=0) then
|
||
exit;
|
||
var mw := (GraphABCControl.Width - Zazx1 - ZazX2 - 30) div DMField.DimX;
|
||
var mh := (GraphABCControl.Height - ZazY1 - ZazY2 - 20) div DMField.DimY;
|
||
DMField.CellSize := min(mw,mh);
|
||
{ if DMField.CellSize mod 2 = 1 then
|
||
DMField.CellSize := DMField.CellSize - 1;}
|
||
DMField.DrawCentered;
|
||
end;
|
||
|
||
procedure SetTaskCall;
|
||
begin
|
||
TaskIsCalled := True;
|
||
end;
|
||
|
||
procedure InitControls;
|
||
begin
|
||
BottomPanel := new Panel();
|
||
panelBottomLeft := new Panel();
|
||
buttonHelp := new Button();
|
||
buttonExit := new Button();
|
||
buttonStep := new Button();
|
||
buttonStart := new Button();
|
||
tableLayoutPanelBottom := new TableLayoutPanel();
|
||
labelExState := new TLabel();
|
||
groupBoxExState := new GroupBox();
|
||
tableLayoutPanel1 := new TableLayoutPanel();
|
||
labelState := new TLabel();
|
||
labelStep := new TLabel();
|
||
trackBarSpeed := new TrackBar();
|
||
labelSpeed := new TLabel();
|
||
tableLayoutPanelTop := new TableLayoutPanel();
|
||
labelZad := new TLabel();
|
||
// CenterPanel := new Panel();
|
||
|
||
BottomPanel.SuspendLayout();
|
||
panelBottomLeft.SuspendLayout();
|
||
tableLayoutPanelBottom.SuspendLayout();
|
||
groupBoxExState.SuspendLayout();
|
||
tableLayoutPanelTop.SuspendLayout();
|
||
MainForm.SuspendLayout();
|
||
//
|
||
// BottomPanel
|
||
//
|
||
BottomPanel.Controls.Add(panelBottomLeft);
|
||
BottomPanel.Controls.Add(groupBoxExState);
|
||
BottomPanel.Dock := DockStyle.Bottom;
|
||
BottomPanel.Location := new Point(0, 407);
|
||
BottomPanel.Size := new Size(679, 83)*ScreenScale;
|
||
//
|
||
// panelBottomLeft
|
||
//
|
||
panelBottomLeft.Anchor := ((System.Windows.Forms.AnchorStyles)((integer(System.Windows.Forms.AnchorStyles.Bottom) or integer(System.Windows.Forms.AnchorStyles.Left))));
|
||
panelBottomLeft.Controls.Add(buttonHelp);
|
||
panelBottomLeft.Controls.Add(buttonExit);
|
||
panelBottomLeft.Controls.Add(buttonStep);
|
||
panelBottomLeft.Controls.Add(buttonStart);
|
||
panelBottomLeft.Controls.Add(tableLayoutPanelBottom);
|
||
panelBottomLeft.Location := new Point(0, 0);
|
||
panelBottomLeft.Size := new Size(474, 83)*ScreenScale;
|
||
|
||
var x := 10;
|
||
var h := 116;
|
||
//
|
||
// buttonStart
|
||
//
|
||
//buttonStart.FlatStyle := FlatStyle.System;
|
||
buttonStart.Location := new Point(x, 14)*ScreenScale;
|
||
buttonStart.Size := new Size(107, 24)*ScreenScale;
|
||
buttonStart.TabStop := false;
|
||
buttonStart.Text := 'Пуск (Enter)';
|
||
// buttonStart.UseVisualStyleBackColor := true;
|
||
x += h;
|
||
//
|
||
// buttonStep
|
||
//
|
||
//buttonStep.FlatStyle := FlatStyle.System;
|
||
buttonStep.Location := new Point(x, 14)*ScreenScale;
|
||
buttonStep.Size := new Size(107, 24)*ScreenScale;
|
||
buttonStep.TabStop := false;
|
||
buttonStep.Text := 'Шаг (Space)';
|
||
// buttonStep.UseVisualStyleBackColor := true;
|
||
x += h;
|
||
//
|
||
// buttonExit
|
||
//
|
||
//buttonExit.FlatStyle := System.Windows.Forms.FlatStyle.System;
|
||
buttonExit.Location := new System.Drawing.Point(x, 14)*ScreenScale;
|
||
buttonExit.Size := new System.Drawing.Size(107, 24)*ScreenScale;
|
||
buttonExit.TabStop := false;
|
||
buttonExit.Text := 'Выход (Esc)';
|
||
// buttonExit.UseVisualStyleBackColor := true;
|
||
x += h;
|
||
//
|
||
// buttonHelp
|
||
//
|
||
//buttonHelp.FlatStyle := System.Windows.Forms.FlatStyle.System;
|
||
buttonHelp.Location := new Point(x, 14)*ScreenScale;
|
||
buttonHelp.Size := new Size(107, 24)*ScreenScale;
|
||
buttonHelp.TabStop := false;
|
||
buttonHelp.Text := 'Справка (F1)';
|
||
// buttonHelp.UseVisualStyleBackColor := true;
|
||
//
|
||
// tableLayoutPanelBottom
|
||
//
|
||
tableLayoutPanelBottom.BackColor := LabelReadyColor;
|
||
tableLayoutPanelBottom.CellBorderStyle := System.Windows.Forms.TableLayoutPanelCellBorderStyle.Outset;
|
||
tableLayoutPanelBottom.ColumnCount := 1;
|
||
tableLayoutPanelBottom.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
|
||
tableLayoutPanelBottom.Controls.Add(labelExState);
|
||
tableLayoutPanelBottom.ForeColor := System.Drawing.Color.White;
|
||
tableLayoutPanelBottom.Location := new Point(9, 49)*ScreenScale;
|
||
tableLayoutPanelBottom.RowCount := 1;
|
||
tableLayoutPanelBottom.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
|
||
tableLayoutPanelBottom.Size := new Size(457, 23)*ScreenScale;
|
||
//tableLayoutPanelBottom.AutoSize := True;
|
||
//
|
||
// labelExState
|
||
//
|
||
labelExState.AutoEllipsis := true;
|
||
labelExState.AutoSize := true;
|
||
labelExState.Dock := DockStyle.Fill;
|
||
//labelExState.FlatStyle := FlatStyle.System;
|
||
labelExState.Font := new System.Drawing.Font('Microsoft Sans Serif', 8, System.Drawing.FontStyle.Bold{, System.Drawing.GraphicsUnit.Point, ((byte)(204))});
|
||
labelExState.Location := new Point(5, 2);
|
||
labelExState.Margin := new Padding(3, 3, 3, 3);
|
||
labelExState.Size := new Size(453, 15)*ScreenScale;
|
||
labelExState.Text := 'Чертежник: Готов';
|
||
labelExState.TextAlign := ContentAlignment.MiddleCenter;
|
||
//
|
||
// groupBoxExState
|
||
//
|
||
groupBoxExState.Controls.Add(tableLayoutPanel1);
|
||
groupBoxExState.Controls.Add(labelState);
|
||
groupBoxExState.Controls.Add(labelStep);
|
||
groupBoxExState.Controls.Add(trackBarSpeed);
|
||
groupBoxExState.Controls.Add(labelSpeed);
|
||
groupBoxExState.Dock := DockStyle.Right;
|
||
groupBoxExState.Location := new Point(475, 0)*ScreenScale;
|
||
groupBoxExState.Size := new Size(204, 83)*ScreenScale;
|
||
groupBoxExState.TabStop := false;
|
||
//
|
||
// tableLayoutPanel1
|
||
//
|
||
tableLayoutPanel1.BackColor := LabelDoColor;
|
||
tableLayoutPanel1.CellBorderStyle := TableLayoutPanelCellBorderStyle.Outset;
|
||
tableLayoutPanel1.ColumnCount := 1;
|
||
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(System.Windows.Forms.SizeType.Percent, 50));
|
||
tableLayoutPanel1.Location := new Point(78, 50)*ScreenScale;
|
||
tableLayoutPanel1.RowCount := 1;
|
||
tableLayoutPanel1.RowStyles.Add(new RowStyle(System.Windows.Forms.SizeType.Percent, 50));
|
||
tableLayoutPanel1.Size := new Size(22, 22)*ScreenScale;
|
||
//
|
||
// labelState
|
||
//
|
||
labelState.AutoSize := true;
|
||
labelState.Location := new Point(6, 54)*ScreenScale;
|
||
labelState.Margin := new Padding(0);
|
||
labelState.Size := new Size(83, 17)*ScreenScale;
|
||
labelState.Text := 'Состояние:';
|
||
//
|
||
// labelStep
|
||
//
|
||
labelStep.BackColor := SystemColors.Control;
|
||
//labelStep.Font := new System.Drawing.Font('Microsoft Sans Serif', 8, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
|
||
labelStep.ForeColor := System.Drawing.Color.Black;
|
||
labelStep.Location := new Point(130, 54)*ScreenScale;
|
||
labelStep.Size := new Size(66, 18)*ScreenScale;
|
||
labelStep.Text := 'Шаг: 0';
|
||
//labelStep.TextAlign := ContentAlignment.MiddleLeft;
|
||
//
|
||
// trackBarSpeed
|
||
//
|
||
trackBarSpeed.CausesValidation := false;
|
||
trackBarSpeed.LargeChange := 1;
|
||
trackBarSpeed.Location := new Point(72, 11)*ScreenScale;
|
||
trackBarSpeed.Size := new Size(121, 53)*ScreenScale;
|
||
trackBarSpeed.TabStop := false;
|
||
//
|
||
// labelSpeed
|
||
//
|
||
labelSpeed.AutoSize := true;
|
||
labelSpeed.Location := new Point(6, 16)*ScreenScale;
|
||
labelSpeed.Margin := new Padding(0);
|
||
labelSpeed.Size := new Size(73, 17)*ScreenScale;
|
||
labelSpeed.Text := 'Скорость:';
|
||
//
|
||
// tableLayoutPanelTop
|
||
//
|
||
tableLayoutPanelTop.BackColor := System.Drawing.Color.FromArgb(238,238,238);
|
||
tableLayoutPanelTop.CellBorderStyle := TableLayoutPanelCellBorderStyle.Outset;
|
||
tableLayoutPanelTop.ColumnCount := 1;
|
||
tableLayoutPanelTop.ColumnStyles.Add(new ColumnStyle(System.Windows.Forms.SizeType.Percent, 50));
|
||
tableLayoutPanelTop.Controls.Add(labelZad);
|
||
tableLayoutPanelTop.Dock := DockStyle.Top;
|
||
tableLayoutPanelTop.Location := new Point(0, 0);
|
||
tableLayoutPanelTop.RowCount := 1;
|
||
tableLayoutPanelTop.RowStyles.Add(new RowStyle(System.Windows.Forms.SizeType.Percent, 50));
|
||
tableLayoutPanelTop.AutoSize := True;
|
||
tableLayoutPanelTop.Size := new Size(679, 23)*ScreenScale;
|
||
//
|
||
// labelZad
|
||
//
|
||
labelZad.AutoEllipsis := true;
|
||
//labelZad.AutoSize := true;
|
||
labelZad.Dock := DockStyle.Fill;
|
||
//labelZad.FlatStyle := FlatStyle.System;
|
||
labelZad.Font := new System.Drawing.Font('Microsoft Sans Serif', 8, System.Drawing.FontStyle.Bold{, System.Drawing.GraphicsUnit.Point, ((byte)(204))});
|
||
labelZad.ForeColor := SystemColors.HotTrack;
|
||
labelZad.Location := new Point(6, 3);
|
||
labelZad.Margin := new Padding(4, 1, 3, 0);
|
||
labelZad.Size := new Size(668, 14)*ScreenScale;
|
||
labelZad.Text := 'Задание';
|
||
labelZad.TextAlign := ContentAlignment.MiddleLeft;
|
||
//
|
||
// ExecutorForm
|
||
//
|
||
MainForm.BackColor := SystemColors.Control;
|
||
// MainWindow.ClientSize := new Size(679, 490);
|
||
MainForm.Controls.Add(tableLayoutPanelTop);
|
||
MainForm.Controls.Add(BottomPanel);
|
||
|
||
var ssz := 692;
|
||
var sw := ScreenSize.Width;
|
||
var ww := ssz*ScreenScale;
|
||
if ww>sw then
|
||
ssz := Round(sw/ScreenScale) - 10;
|
||
|
||
MainForm.MinimumSize := new Size(ssz, 240)*ScreenScale; // Уменьшить до размера экрана!!!
|
||
MainForm.Text := 'Исполнитель Чертежник';
|
||
BottomPanel.ResumeLayout(false);
|
||
panelBottomLeft.ResumeLayout(false);
|
||
tableLayoutPanelBottom.ResumeLayout(false);
|
||
tableLayoutPanelBottom.PerformLayout();
|
||
groupBoxExState.ResumeLayout(false);
|
||
groupBoxExState.PerformLayout();
|
||
tableLayoutPanelTop.ResumeLayout(false);
|
||
tableLayoutPanelTop.PerformLayout();
|
||
MainForm.ResumeLayout(false);
|
||
MainForm.PerformLayout();
|
||
MainForm.KeyPreview := True;
|
||
|
||
MainForm.KeyDown += MainWindowKeyDown;
|
||
|
||
(GraphABCControl as Control).Resize += ABCWindowResize;
|
||
buttonStart.Click += buttonStartClick;
|
||
buttonStep.Click += buttonStepClick;
|
||
buttonHelp.Click += buttonHelpClick;
|
||
buttonExit.Click += buttonExitClick;
|
||
trackBarSpeed.Scroll += trackBarSpeedScroll;
|
||
end;
|
||
|
||
procedure NonSafeDrawmanError(s: string);
|
||
begin
|
||
buttonStart.Enabled := False;
|
||
buttonStep.Enabled := False;
|
||
tableLayoutPanel1.BackColor := LabelErrorColor;
|
||
labelExState.BackColor := LabelErrorColor;
|
||
labelExState.Text := s;
|
||
tableLayoutPanelBottom.BackColor := LabelErrorColor;
|
||
t.Suspend;
|
||
end;
|
||
|
||
procedure DrawmanError(s: string);
|
||
begin
|
||
buttonStart.Invoke(NonSafeDrawmanError,s);
|
||
end;
|
||
|
||
procedure DrawmanError(s,s1: string);
|
||
begin
|
||
//labelZad.Text := s1;
|
||
SetSafeLabelZadText(s1);
|
||
DrawmanError(s);
|
||
end;
|
||
|
||
var
|
||
settings: IniSettings;
|
||
|
||
procedure _InternalAssignBackColor;
|
||
begin
|
||
BackColor := MainForm.BackColor;
|
||
end;
|
||
|
||
procedure _HideInternal;
|
||
begin
|
||
MainForm.Hide;
|
||
end;
|
||
|
||
procedure _SetBoundsInternal;
|
||
begin
|
||
MainForm.Bounds := new System.Drawing.Rectangle(settings.Left,settings.Top,settings.Width,settings.Height);
|
||
end;
|
||
|
||
procedure _ShowInternal;
|
||
begin
|
||
MainForm.Show;
|
||
end;
|
||
|
||
procedure _SetButtonStartEnabled(value : boolean);
|
||
begin
|
||
buttonStart.Enabled := value;
|
||
end;
|
||
|
||
procedure _SetButtonStepEnabled(value : boolean);
|
||
begin
|
||
buttonStep.Enabled := value;
|
||
end;
|
||
|
||
procedure SetSafeTextLabelExState(s : string);
|
||
begin
|
||
labelExState.Text := s;
|
||
end;
|
||
|
||
// Добавил - МА
|
||
procedure ResDM(TaskName: string);
|
||
external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'resdm';
|
||
//
|
||
|
||
var __initialized := false;
|
||
|
||
procedure __InitModule;
|
||
begin
|
||
MainForm.Shown += (o,e)->
|
||
begin
|
||
MainForm.Hide;
|
||
BackColor := MainForm.BackColor;
|
||
end;
|
||
|
||
//MainForm.Invoke(_HideInternal); // было до 08.05.24
|
||
//MainForm.Hide;
|
||
//MainForm.Invoke(_InternalAssignBackColor);
|
||
//BackColor := MainForm.BackColor;
|
||
|
||
LabelReadyColor := RGB(95,109,154);
|
||
LabelDoColor := RGB(95,109,154);
|
||
LabelStopColor := RGB(95,109,154);
|
||
LabelErrorColor := clRed;
|
||
LabelBadEndColor := clBlack;
|
||
LabelGoodEndColor:= RGB(0,156,0);
|
||
|
||
TaskIsCalled := False;
|
||
|
||
ScreenScale := GraphABC.ScreenScale;
|
||
|
||
Brush.Color := MainForm.BackColor;
|
||
FillRectangle(0,0,1280,1024);
|
||
|
||
LoadIni(settings);
|
||
MainForm.Invoke(_SetBoundsInternal);
|
||
|
||
MainForm.Invoke(InitControls);
|
||
|
||
OnClose := MainWindowClose;
|
||
|
||
// CenterWindow;
|
||
|
||
DMField := new TDMField(0,0,50);
|
||
DMField.SetSpeed(settings.Speed);
|
||
// DMField.DrawCentered;
|
||
t := System.Threading.Thread.CurrentThread;
|
||
|
||
//MainForm.Bounds := new System.Drawing.Rectangle(settings.Left,settings.Top,settings.Width,settings.Height);
|
||
SetSmoothingOff;
|
||
//GraphABCControl.BackColor := MainForm.BackColor;
|
||
var del : procedure := MainForm.Show;
|
||
MainForm.Invoke(del);
|
||
end;
|
||
|
||
procedure __InitModule__;
|
||
begin
|
||
if not __initialized then
|
||
begin
|
||
__initialized := true;
|
||
GraphABC.__InitModule__;
|
||
__InitModule;
|
||
end;
|
||
end;
|
||
|
||
procedure __FinalizeModule;
|
||
begin
|
||
buttonStart.Invoke(_SetButtonStartEnabled, false);
|
||
buttonStep.Invoke(_SetButtonStepEnabled, false);
|
||
//buttonStart.Enabled := False;
|
||
//buttonStep.Enabled := False;
|
||
if DMField.DimX*DMField.DimY=0 then
|
||
DrawmanError('Чертежник: Не вызвана процедура Task','Задание отсутствует')
|
||
else if DMField.IsSolution then
|
||
begin
|
||
tableLayoutPanel1.BackColor := LabelGoodEndColor;
|
||
labelExState.BackColor := LabelGoodEndColor;
|
||
tableLayoutPanelBottom.BackColor := LabelGoodEndColor;
|
||
labelExState.Invoke(SetSafeTextLabelExState,'Чертежник: Задание выполнено');
|
||
//labelExState.Text := 'Чертежник: Задание выполнено';
|
||
// Добавил - МА
|
||
try
|
||
ResDM(DMField.TaskName);
|
||
except
|
||
end;
|
||
//
|
||
end
|
||
else
|
||
begin
|
||
labelExState.Invoke(SetSafeTextLabelExState,'Чертежник: Работа окончена, задание не выполнено');
|
||
//labelExState.Text := 'Чертежник: Работа окончена, задание не выполнено';
|
||
end;
|
||
end;
|
||
|
||
var __finalized := false;
|
||
|
||
procedure __FinalizeModule__;
|
||
begin
|
||
if not __finalized then
|
||
begin
|
||
__finalized := true;
|
||
__FinalizeModule;
|
||
end;
|
||
end;
|
||
|
||
initialization
|
||
__InitModule;
|
||
finalization
|
||
__FinalizeModule;
|
||
end. |