expertcad/SRC/ARCH/U_ArchWndDoorParams.pas
2025-05-12 10:07:51 +03:00

416 lines
12 KiB
ObjectPascal

unit U_ArchWndDoorParams;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
U_BaseCommon, U_BaseConstants, U_ArchCommon, RzButton, Mask, RzEdit,
RzPanel, ExtCtrls, siComp, siLngLnk, RzRadChk;
type
TF_ArchWndDoorParams = class(TForm)
pnMain: TRzPanel;
pnOkCancel: TRzPanel;
btOk: TRzBitBtn;
btCancel: TRzBitBtn;
lng_Forms: TsiLangLinked;
pnGeneral: TRzPanel;
lbCoordz: TLabel;
lbWidth: TLabel;
lbHeight: TLabel;
fCoordz: TRzNumericEdit;
fWidth: TRzNumericEdit;
fHeight: TRzNumericEdit;
pnOuterSlope: TRzPanel;
RzGroupBox2: TRzGroupBox;
fosLbWidth: TLabel;
fosLbHeight: TLabel;
fosLbDepth: TLabel;
fosWidth: TRzNumericEdit;
fosHeight: TRzNumericEdit;
fosDepth: TRzNumericEdit;
fosSlopeOn: TRzCheckBox;
pnInnerSlope: TRzPanel;
RzGroupBox1: TRzGroupBox;
fisLbWidth: TLabel;
fisLbHeight: TLabel;
fisLbDepth: TLabel;
fisWidth: TRzNumericEdit;
fisHeight: TRzNumericEdit;
fisDepth: TRzNumericEdit;
fisSlopeOn: TRzCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure pnOkCancelResize(Sender: TObject);
procedure SlopeOnClick(Sender: TObject);
procedure fHeightChange(Sender: TObject);
procedure fWidthChange(Sender: TObject);
private
GForm: TForm;
FPropsUOM: TStringList;
FType: Integer;
FIsEditing: Boolean;
FIsSettingParams: Boolean; // Ôëàã - óñòàíîâêà ïàðàìåòðîâ íà ôîðìó
function GetSlopeParams(AArchWndInfo: TArchWndInfo; const APropPrefix: string): TArchSlopeInfo;
procedure AutoChangeSlopeParams(AEditingControl, AParam1, AParam2: TRzNumericEdit);
procedure SetCaptions;
procedure SetControls;
procedure SetSlopeParams(AChecked: Boolean; ASlopeInfo: TArchSlopeInfo; const APropPrefix: string);
public
Constructor Create(AOwner: TComponent; AForm: TForm);
Destructor Destroy; override;
function Execute(AType: Integer; AArchWndInfo: TComponent): TArchWndInfo;
published
property PropMainForm: TForm read GForm;
property PropsUOM: TStringList read FPropsUOM;
end;
function ShowArchWndDoorParams(AType: Integer; AArchWndInfo: TComponent): TArchWndInfo;
var
F_ArchWndDoorParams: TF_ArchWndDoorParams;
implementation
Uses U_Main;
{$R *.dfm}
constructor TF_ArchWndDoorParams.Create(AOwner: TComponent; AForm: TForm);
begin
GForm := AForm;
inherited Create(AOwner);
end;
destructor TF_ArchWndDoorParams.Destroy;
begin
inherited;
end;
function TF_ArchWndDoorParams.Execute(AType: Integer; AArchWndInfo: TComponent): TArchWndInfo;
var
WndInfo: TArchWndInfo;
//Slope: ^TArchSlopeInfo;
Obj: TObject;
InnerSlopeType: Integer;
OuterSlopeType: Integer;
begin
Result := nil;
FType := AType;
FIsEditing := AArchWndInfo <> nil;
InnerSlopeType := -1;
OuterSlopeType := -1;
case AType of
ctArhWindow:
begin
InnerSlopeType := ctArhWndInnerSlope;
OuterSlopeType := ctArhWndOuterSlope;
end;
ctArhDoor:
InnerSlopeType := ctArhDoorInnerSlope;
end;
SetCaptions;
SetControls;
WndInfo := TArchWndInfo.Create(nil);
if AArchWndInfo <> nil then
WndInfo.Assign(AArchWndInfo)
else
begin
if LoadArchObjDefaultParams(WndInfo, AType) = nil then
//if LoadArchObjDefaultParams(TComponent(WndInfo), AType) = nil then
begin
// Ïàðàìåòðû ïî óìîë÷àíèþ
if (AType = ctArhWindow)then
WndInfo.Coordz := 0.8;
if (AType = ctArhDoor) or (AType = ctArhArc) then
begin
WndInfo.Height := 2.1;
WndInfo.Width := 1;
end
else
begin
WndInfo.Height := 1.4;
WndInfo.Width := 1.4;
end;
end;
WndInfo.CreateChilds;
if LoadArchObjDefaultParams(WndInfo.InnerSlope, InnerSlopeType) = nil then
//if LoadArchObjDefaultParams(TComponent(Pointer(@WndInfo.InnerSlope)^), InnerSlopeType) = nil then
begin
if (AType = ctArhDoor) or (AType = ctArhArc) then
begin
WndInfo.InnerSlope.Height := 2.0;
WndInfo.InnerSlope.Width := 1;
WndInfo.InnerSlope.Depth := 0.1
end
else
begin
WndInfo.InnerSlope.Height := 1.4;
WndInfo.InnerSlope.Width := 1.4;
WndInfo.InnerSlope.Depth := 0.1
end;
end;
LoadArchObjDefaultParams(WndInfo.OuterSlope, OuterSlopeType);
//LoadArchObjDefaultParams(TComponent(Pointer(@WndInfo.OuterSlope)^), OuterSlopeType);
end;
fHeight.OnChange := nil;
fWidth.OnChange := nil;
FIsSettingParams := true;
try
ObjectPropsToForm(WndInfo, Self);
SetSlopeParams(WndInfo.InnerSlopeOn, WndInfo.InnerSlope, 'fis');
SetSlopeParams(WndInfo.OuterSlopeOn, WndInfo.OuterSlope, 'fos');
// Ïðèìåíèòü ïàðàìåòðû îáúåêòà äëÿ îòêîñîâ
fHeightChange(fHeight);
fWidthChange(fWidth);
finally
FIsSettingParams := false;
fHeight.OnChange := fHeightChange;
fWidth.OnChange := fWidthChange;
end;
//if WndInfo.InnerSlope = nil then
// //if AArchWndInfo = nil then
// begin
// if (AType = ctArhDoor) or (AType = ctArhArc) then
// begin
// fisHeight.Value := 2.0;
// fisWidth.Value := 1;
// fisDepth.Value := 0.1
// end
// else
// begin
// fisHeight.Value := 1.4;
// fisWidth.Value := 1.4;
// fisDepth.Value := 0.1
// end;
// end;
WndInfo.Free;
if ShowModal = mrOk then
begin
Result := TArchWndInfo.Create(nil);
ObjectPropsFromForm(Result, Self);
Result.InnerSlope := GetSlopeParams(Result, 'fis');
Result.OuterSlope := GetSlopeParams(Result, 'fos');
Result.InnerSlopeOn := fisSlopeOn.Checked;
Result.OuterSlopeOn := fosSlopeOn.Checked;
// Ñîõðàíÿåì ïàðàìåòðû êàê ïî-óìîë÷àíèþ
SetArchObjToDefaultParams(Result, AType);
SetArchObjToDefaultParams(Result.InnerSlope, InnerSlopeType);
SetArchObjToDefaultParams(Result.OuterSlope, OuterSlopeType);
end;
end;
function TF_ArchWndDoorParams.GetSlopeParams(AArchWndInfo: TArchWndInfo; const APropPrefix: string): TArchSlopeInfo;
var
CheckBox: TRzCheckBox;
begin
Result := nil;
CheckBox := TRzCheckBox(Self.FindComponent(APropPrefix + 'SlopeOn'));
if (CheckBox <> nil) then
//if (CheckBox <> nil) and CheckBox.Checked then
begin
Result := TArchSlopeInfo.Create(AArchWndInfo);
ObjectPropsFromForm(Result, Self, APropPrefix);
end;
end;
procedure TF_ArchWndDoorParams.AutoChangeSlopeParams(AEditingControl, AParam1, AParam2: TRzNumericEdit);
begin
if AParam1.Enabled then
AParam1.Value := AEditingControl.Value;
if AParam2.Enabled then
AParam2.Value := AEditingControl.Value;
end;
procedure TF_ArchWndDoorParams.SetCaptions;
var
i: integer;
Labl: TLabel;
lbCaptionLen: String;
begin
if FType = ctArhWindow then
Caption := cArchWndDoorParams_Msg01
else if FType = ctArhDoor then
Caption := cArchWndDoorParams_Msg02
else if FType = ctArhArc then
Caption := cArchWndDoorParams_Msg03;
// //lbCoordz.Caption := cArchParams_Msg05 +', '+ GetNameUOM(TF_Main(GForm).FUOM, true);
// //lbWidth.Caption := cArchParams_Msg02 +', '+ GetNameUOM(TF_Main(GForm).FUOM, true);
// //lbHeight.Caption := cArchParams_Msg06 +', '+ GetNameUOM(TF_Main(GForm).FUOM, true);
//
// for i := 0 to ComponentCount - 1 do
// begin
// if Components[i] is TLabel then
// begin
// Labl := TLabel(Components[i]);
// lbCaptionLen := '';
// if Pos('Coordz', Labl.Name) <> 0 then
// lbCaptionLen := cArchParams_Msg05
// else if Pos('Width', Labl.Name) <> 0 then
// lbCaptionLen := cArchParams_Msg02
// else if Pos('Height', Labl.Name) <> 0 then
// lbCaptionLen := cArchParams_Msg06
// else if Pos('Depth', Labl.Name) <> 0 then
// lbCaptionLen := cArchParams_Msg07
// else if Pos('Length', Labl.Name) <> 0 then
// lbCaptionLen := cArchParams_Msg10;
//
// if lbCaptionLen <> '' then
// Labl.Caption := lbCaptionLen +', '+ GetNameUOM(TF_Main(GForm).FUOM, true);
// end;
// end;
SetLableCaptions(Self, TF_Main(GForm).FUOM);
end;
procedure TF_ArchWndDoorParams.SetControls;
begin
{// Âíåøíèé îòêîñ
pnOuterSlope.Visible := (FType = ctArhWindow) and Not FIsEditing;
// Âíóòðåííèé îòêîñ
pnInnerSlope.Visible := (FType in [ctArhWindow, ctArhDoor]) and Not FIsEditing;
Self.AutoSize := false;
pnMain.AutoSize := false;
pnMain.AutoSize := true;
Self.AutoSize := true;}
Self.AutoSize := false;
pnMain.AutoSize := false;
//pnMain.Height := pnGeneral.Height + pnInnerSlope.Height + pnOuterSlope.Height + 1;
// Âíóòðåííèé îòêîñ
pnInnerSlope.Visible := (FType in [ctArhWindow, ctArhDoor]) and Not FIsEditing;
// Âíåøíèé îòêîñ
pnOuterSlope.Top := pnInnerSlope.Top + pnInnerSlope.Height;
pnOuterSlope.Visible := (FType = ctArhWindow) and Not FIsEditing;
pnMain.AutoSize := true;
Self.AutoSize := true;
{Self.AutoSize := false;
pnMain.AutoSize := false;
Self.AutoSize := true;
pnMain.AutoSize := true;}
end;
procedure TF_ArchWndDoorParams.SetSlopeParams(AChecked: Boolean; ASlopeInfo: TArchSlopeInfo; const APropPrefix: string);
var
CheckBox: TRzCheckBox;
begin
CheckBox := TRzCheckBox(Self.FindComponent(APropPrefix + 'SlopeOn'));
if Assigned(ASlopeInfo) then
begin
ObjectPropsToForm(ASlopeInfo, Self, APropPrefix);
if (CheckBox <> nil) and AChecked then
CheckBox.Checked := true;
SlopeOnClick(CheckBox);
end
else
SlopeOnClick(CheckBox);
end;
procedure TF_ArchWndDoorParams.FormCreate(Sender: TObject);
begin
pnOkCancelResize(pnOkCancel);
FPropsUOM := TStringList.Create;
//FPropsUOM.Add(fCoordz.Name);
//FPropsUOM.Add(fWidth.Name);
//FPropsUOM.Add(fHeight.Name);
fisSlopeOn.OnClick := SlopeOnClick;
fosSlopeOn.OnClick := SlopeOnClick;
FIsSettingParams := false;
SetFormControlDisplayFormat(Self);
end;
procedure TF_ArchWndDoorParams.FormDestroy(Sender: TObject);
begin
FreeAndNil(FPropsUOM);
end;
function ShowArchWndDoorParams(AType: Integer; AArchWndInfo: TComponent): TArchWndInfo;
begin
Result := nil;
try
if F_ArchWndDoorParams = nil then
F_ArchWndDoorParams := TF_ArchWndDoorParams.Create(F_ProjMan, F_ProjMan);
Result := F_ArchWndDoorParams.Execute(AType, AArchWndInfo);
except
on E: Exception do AddExceptionToLogEx('ShowArchWndDoorParams', E.Message);
end;
end;
procedure TF_ArchWndDoorParams.pnOkCancelResize(Sender: TObject);
begin
SetMiddleControlChilds(TControl(Sender), TControl(Self));
end;
procedure TF_ArchWndDoorParams.SlopeOnClick(Sender: TObject);
var
Prefix: String;
i: integer;
Compon: TWinControl;
begin
Prefix := Copy(TComponent(Sender).Name, 1, 3);
if Prefix <> '' then
begin
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TWinControl) then
begin
Compon := TWinControl(Components[i]);
if (Compon <> Sender) and (Pos(Prefix, Compon.Name) = 1) then
Compon.Enabled := TRzCheckBox(Sender).Checked;
end;
end;
end;
// Àâòîèçìåíåèå ñâîéñòâ îòêîñîâ ïðè âêëþ÷åíèè îòêîñîâ
if TRzCheckBox(Sender).Checked and Not FIsSettingParams then
begin
if Sender = fisSlopeOn then
begin
fisHeight.Value := fHeight.Value;
fisWidth.Value := fWidth.Value;
end
else if Sender = fosSlopeOn then
begin
fosHeight.Value := fHeight.Value;
fosWidth.Value := fWidth.Value;
end;
end;
end;
procedure TF_ArchWndDoorParams.fHeightChange(Sender: TObject);
begin
AutoChangeSlopeParams(fHeight, fisHeight, fosHeight);
end;
procedure TF_ArchWndDoorParams.fWidthChange(Sender: TObject);
begin
AutoChangeSlopeParams(fWidth, fisWidth, fosWidth);
end;
end.