SmartFarm/SOURCE/SmartFarmHMI/SmartFarmHMI_FMX/gen_popup.ps1
2026-09-04 10:53:44 +09:00

331 lines
12 KiB
PowerShell
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

$out = @"
procedure TfrmMain.OnIrriCondEdit(Sender: TObject);
var
ActIdx, CondType, CondIdx, FieldID: Integer;
ValPart: Integer;
Act: ^TIrriAction;
ValStr: string;
begin
if FRefreshingAutoUI then Exit;
if Sender is TComboBox then
begin
ActIdx := (Sender as TComboBox).Tag;
ValPart := Trunc((Sender as TComboBox).TagFloat);
end
else if Sender is TEdit then
begin
ActIdx := (Sender as TEdit).Tag;
ValPart := Trunc((Sender as TEdit).TagFloat);
end
else Exit;
if (ActIdx < 0) or (ActIdx > High(FIrriSchedules[FCurrentEditIrriSchedIdx].Actions)) then Exit;
Act := @FIrriSchedules[FCurrentEditIrriSchedIdx].Actions[ActIdx];
CondType := ValPart div 1000;
CondIdx := (ValPart div 10) mod 100;
FieldID := ValPart mod 10;
var PCondArray: ^TArray<TAutoCondItem>;
var PCondMode: ^TAutoCondMode;
case CondType of
0: begin PCondArray := @Act^.StartConds; PCondMode := @Act^.StartCondMode; end;
1: begin PCondArray := @Act^.StopConds; PCondMode := @Act^.StopCondMode; end;
2: begin PCondArray := @Act^.EndConds; PCondMode := @Act^.EndCondMode; end;
else Exit;
end;
if FieldID = 3 then // AND/OR Mode
begin
if (Sender as TComboBox).ItemIndex = 0 then PCondMode^ := acmAND
else PCondMode^ := acmOR;
end
else if (CondIdx >= 0) and (CondIdx < Length(PCondArray^)) then
begin
case FieldID of
0: // NodeID
begin
ValStr := (Sender as TComboBox).Items[(Sender as TComboBox).ItemIndex];
var ss := ValStr.Split([' ']); // ID¸¸ ÃßÃâ
if Length(ss) > 0 then PCondArray^[CondIdx].NodeID := ss[0];
end;
1: // Op
PCondArray^[CondIdx].Op := TAutoCondOp((Sender as TComboBox).ItemIndex);
2: // Value
PCondArray^[CondIdx].Value := StrToFloatDef((Sender as TEdit).Text, 0.0);
end;
end;
SaveIrriSchedules;
end;
procedure TfrmMain.OnIrriCondAdd(Sender: TObject);
var
ActIdx, CondType: Integer;
Act: ^TIrriAction;
Item: TAutoCondItem;
begin
if FRefreshingAutoUI then Exit;
if not (Sender is TRectangle) then Exit;
ActIdx := (Sender as TRectangle).Tag;
CondType := Trunc((Sender as TRectangle).TagFloat) div 1000;
if (ActIdx < 0) or (ActIdx > High(FIrriSchedules[FCurrentEditIrriSchedIdx].Actions)) then Exit;
Act := @FIrriSchedules[FCurrentEditIrriSchedIdx].Actions[ActIdx];
Item.NodeID := '';
Item.Op := acoGT;
Item.Value := 0.0;
case CondType of
0: begin SetLength(Act^.StartConds, Length(Act^.StartConds)+1); Act^.StartConds[High(Act^.StartConds)] := Item; end;
1: begin SetLength(Act^.StopConds, Length(Act^.StopConds)+1); Act^.StopConds[High(Act^.StopConds)] := Item; end;
2: begin SetLength(Act^.EndConds, Length(Act^.EndConds)+1); Act^.EndConds[High(Act^.EndConds)] := Item; end;
end;
SaveIrriSchedules;
RefreshIrriActionPopupUI(FCurrentEditIrriSchedIdx);
end;
procedure TfrmMain.OnIrriCondDel(Sender: TObject);
var
ActIdx, CondType, CondIdx: Integer;
ValPart: Integer;
Act: ^TIrriAction;
begin
if FRefreshingAutoUI then Exit;
if not (Sender is TRectangle) then Exit;
ActIdx := (Sender as TRectangle).Tag;
ValPart := Trunc((Sender as TRectangle).TagFloat);
CondType := ValPart div 1000;
CondIdx := (ValPart div 10) mod 100;
if (ActIdx < 0) or (ActIdx > High(FIrriSchedules[FCurrentEditIrriSchedIdx].Actions)) then Exit;
Act := @FIrriSchedules[FCurrentEditIrriSchedIdx].Actions[ActIdx];
case CondType of
0: Delete(Act^.StartConds, CondIdx, 1);
1: Delete(Act^.StopConds, CondIdx, 1);
2: Delete(Act^.EndConds, CondIdx, 1);
end;
SaveIrriSchedules;
RefreshIrriActionPopupUI(FCurrentEditIrriSchedIdx);
end;
procedure TfrmMain.RefreshIrriActionPopupUI(ASchedIdx: Integer);
type
PIrriAction = ^TIrriAction;
var
i: Integer;
Card: TRectangle;
LblHeader: TLabel;
EdDelay: TEdit;
CbNode: TComboBox;
ChkDel: TCheckBox;
Act: PIrriAction;
TopLyt: TRectangle;
BaseY: Single;
begin
if (ASchedIdx < 0) or (ASchedIdx > High(FIrriSchedules)) then Exit;
lblIrriActionTitle.Text := 'µ¿ÀÛ ¼ø¼­ °ü¸® : ' + FIrriSchedules[ASchedIdx].SchedName;
scrlIrriAction.BeginUpdate;
if Self.Focused <> nil then Self.Focused := nil;
try
for i := scrlIrriAction.Content.ControlsCount - 1 downto 0 do
begin
var C := scrlIrriAction.Content.Controls[i];
if C is TComboBox then (C as TComboBox).OnChange := nil;
if C is TEdit then (C as TEdit).OnExit := nil;
if C is TCheckBox then (C as TCheckBox).OnChange := nil;
C.Parent := nil; // macOS ¾ÈÁ¤
end;
for i := 0 to High(FIrriSchedules[ASchedIdx].Actions) do
begin
Act := @FIrriSchedules[ASchedIdx].Actions[i];
Card := TRectangle.Create(Self);
Card.Parent := scrlIrriAction;
Card.Align := TAlignLayout.Top;
Card.Margins.Rect := RectF(0, 0, 0, 12);
Card.Fill.Color := IfThen(Act^.IsSelected, `$FF3A2020, `$FF333333);
Card.Stroke.Color := `$FF555555;
Card.XRadius := 5; Card.YRadius := 5;
{`$IFDEF ANDROID}
var ChkBg := TRectangle.Create(Self);
ChkBg.Parent := Card;
ChkBg.Position.X := 10; ChkBg.Position.Y := 13;
ChkBg.Width := 29; ChkBg.Height := 29;
ChkBg.Fill.Color := claWhite; ChkBg.Stroke.Kind := TBrushKind.None;
ChkBg.XRadius := 4; ChkBg.YRadius := 4;
ChkBg.HitTest := False;
{`$ENDIF}
ChkDel := TCheckBox.Create(Self);
ChkDel.Parent := Card;
ChkDel.Position.X := 8; ChkDel.Position.Y := 10;
ChkDel.Width := 24; ChkDel.Height := 24;
ChkDel.IsChecked := Act^.IsSelected;
ChkDel.Tag := i;
ChkDel.Scale.X := 1.5; ChkDel.Scale.Y := 1.5;
ChkDel.OnChange := OnIrriActionCheck;
LblHeader := BuildLabel(Card, Format('µ¿ÀÛ ¼ø¹ø %d', [i+1]), 18, TAlignLayout.None, claWhite, True);
LblHeader.SetBounds(42, 10, 150, 30);
var LblNode := BuildLabel(Card, 'ÀÛµ¿ ±¸¿ª (DO):', 16, TAlignLayout.None, claLightgray, False);
LblNode.SetBounds(10, 50, 120, 30);
CbNode := TComboBox.Create(Self);
CbNode.Parent := Card;
CbNode.SetBounds(130, 50, 200, 30);
var kDO: Integer;
for kDO := 0 to High(FNodeConfigs) do
begin
if FNodeConfigs[kDO].ID.StartsWith('DO_') then
begin
var LItm := TListBoxItem.Create(CbNode);
LItm.Parent := CbNode;
LItm.Height := 24 * 1.8;
LItm.Text := FNodeConfigs[kDO].ID + ' [' + (
if FNodeConfigs[kDO].CustomName <> '' then FNodeConfigs[kDO].CustomName
else if FIsKorean then FNodeConfigs[kDO].TitleKO
else FNodeConfigs[kDO].TitleEN) + ']';
CbNode.AddObject(LItm);
end;
end;
var kSelDO: Integer;
CbNode.ItemIndex := -1;
for kSelDO := 0 to CbNode.Items.Count - 1 do
if CbNode.Items[kSelDO].StartsWith(Act^.TargetNodeID + ' ') or
(CbNode.Items[kSelDO] = Act^.TargetNodeID) then
begin CbNode.ItemIndex := kSelDO; Break; end;
CbNode.Tag := i;
CbNode.TagFloat := 10;
CbNode.OnChange := OnIrriActionEdit;
var LblDelay := BuildLabel(Card, 'Äð´Ù¿î(ÃÊ):', 16, TAlignLayout.None, claLightgray, False);
LblDelay.SetBounds(340, 50, 90, 30);
EdDelay := TEdit.Create(Self);
EdDelay.Parent := Card;
EdDelay.SetBounds(435, 50, 65, 30);
EdDelay.Text := IntToStr(Act^.DelaySeconds);
EdDelay.Tag := i; EdDelay.TagFloat := 11;
EdDelay.FilterChar := '0123456789';
EdDelay.OnExit := OnIrriActionEdit;
var LblTimeout := BuildLabel(Card, 'Á¦ÇÑ(ºÐ):', 16, TAlignLayout.None, claLightgray, False);
LblTimeout.SetBounds(510, 50, 80, 30);
var EdTimeout := TEdit.Create(Self);
EdTimeout.Parent := Card;
EdTimeout.SetBounds(590, 50, 65, 30);
EdTimeout.Text := IntToStr(Act^.TimeoutMin);
EdTimeout.Tag := i; EdTimeout.TagFloat := 12;
EdTimeout.FilterChar := '0123456789';
EdTimeout.OnExit := OnIrriActionEdit;
BaseY := 100;
var DrawCondGroup := procedure(ATitle: string; AConds: TArray<TAutoCondItem>; AMode: TAutoCondMode; CondType: Integer)
var
k: Integer;
cSen, cOp, cMode: TComboBox; eVal: TEdit;
btnDel, btnAdd: TRectangle;
begin
var lTitle := BuildLabel(Card, ATitle, 14, TAlignLayout.None, claLightgray, True);
lTitle.SetBounds(10, BaseY, 80, 30);
cMode := TComboBox.Create(Self); cMode.Parent := Card;
cMode.SetBounds(95, BaseY, 70, 30);
cMode.Items.Add('AND'); cMode.Items.Add('OR');
cMode.ItemIndex := Integer(AMode);
cMode.Tag := i; cMode.TagFloat := CondType * 1000 + 3;
cMode.OnChange := OnIrriCondEdit;
btnAdd := CreateCustomButton(Card, '+ Ãß°¡', TAlignLayout.None, 60, OnIrriCondAdd);
btnAdd.SetBounds(175, BaseY, 60, 30);
btnAdd.Fill.Color := `$FF226622;
btnAdd.Tag := i; btnAdd.TagFloat := CondType * 1000 + 4;
if Length(AConds) = 0 then
begin
BuildLabel(Card, ' [Á°Ç ¾øÀ½ - ¹«Á°Ç µ¿ÀÛ]', 14, TAlignLayout.None, claGray, False).SetBounds(250, BaseY, 200, 30);
end;
BaseY := BaseY + 40;
for k := 0 to High(AConds) do
begin
cSen := TComboBox.Create(Self); cSen.Parent := Card;
cSen.SetBounds(80, BaseY, 240, 30);
var kS: Integer;
for kS := 0 to High(FNodeConfigs) do
begin
var strId := FNodeConfigs[kS].ID;
// À¯·®°è ÈùÆ® Ç¥½Ã (³ëµå ID°¡ DI À̰í À¯·®À̸§À» Æ÷ÇÔÇϰųª DI_F µî ±ÔÄ¢ÀÌ ÀÖ´Ù¸é)
var strName := FNodeConfigs[kS].CustomName;
if strName = '' then begin if FIsKorean then strName := FNodeConfigs[kS].TitleKO else strName := FNodeConfigs[kS].TitleEN; end;
if (strId.StartsWith('DI_')) and ((strName.Contains('À¯·®')) or (strName.Contains('Flow'))) then
strName := strName + ' (¸®ÅÍ/ÆÞ½º)';
var LItmS := TListBoxItem.Create(cSen);
LItmS.Parent := cSen;
LItmS.Height := 24 * 1.8;
LItmS.Text := strId + ' [' + strName + ']';
cSen.AddObject(LItmS);
end;
var kSel: Integer;
cSen.ItemIndex := -1;
for kSel := 0 to cSen.Items.Count - 1 do
if cSen.Items[kSel].StartsWith(AConds[k].NodeID + ' ') or
(cSen.Items[kSel] = AConds[k].NodeID) then
begin cSen.ItemIndex := kSel; Break; end;
cSen.Tag := i; cSen.TagFloat := CondType * 1000 + k * 10 + 0;
cSen.OnChange := OnIrriCondEdit;
cOp := TComboBox.Create(Self); cOp.Parent := Card;
cOp.SetBounds(330, BaseY, 50, 30);
cOp.Items.Add('>'); cOp.Items.Add('<'); cOp.Items.Add('=');
cOp.ItemIndex := Integer(AConds[k].Op);
cOp.Tag := i; cOp.TagFloat := CondType * 1000 + k * 10 + 1;
cOp.OnChange := OnIrriCondEdit;
eVal := TEdit.Create(Self); eVal.Parent := Card;
eVal.SetBounds(390, BaseY, 70, 30);
eVal.Text := FloatToStr(AConds[k].Value);
eVal.Tag := i; eVal.TagFloat := CondType * 1000 + k * 10 + 2;
eVal.FilterChar := '0123456789.';
eVal.OnExit := OnIrriCondEdit;
btnDel := CreateCustomButton(Card, 'X', TAlignLayout.None, 30, OnIrriCondDel);
btnDel.SetBounds(470, BaseY, 40, 30);
btnDel.Fill.Color := `$FFFF5555;
btnDel.Tag := i; btnDel.TagFloat := CondType * 1000 + k * 10 + 5;
BaseY := BaseY + 36;
end;
BaseY := BaseY + 8; // ¿©¹é Ãß°¡
end;
DrawCondGroup('½ÃÀÛ Á°Ç:', Act^.StartConds, Act^.StartCondMode, 0);
DrawCondGroup('Á¤Áö Á°Ç:', Act^.StopConds, Act^.StopCondMode, 1);
DrawCondGroup('Á¾·á Á°Ç:', Act^.EndConds, Act^.EndCondMode, 2);
Card.Height := BaseY + 10;
end;
finally
scrlIrriAction.EndUpdate;
end;
end;
"@
Set-Content -Path gen_popup.pas -Value $out -Encoding UTF8