diff --git a/POWERCAD30/UNITS/form3d.dfm b/POWERCAD30/UNITS/form3d.dfm
index a26d807..cf73709 100644
--- a/POWERCAD30/UNITS/form3d.dfm
+++ b/POWERCAD30/UNITS/form3d.dfm
@@ -1,10 +1,10 @@
object frm3D: Tfrm3D
- Left = 1
- Top = 1
+ Left = -7
+ Top = 7
BorderIcons = [biSystemMenu]
Caption = #1055#1088#1086#1089#1084#1086#1090#1088' '#1074' 3D'
- ClientHeight = 687
- ClientWidth = 1342
+ ClientHeight = 705
+ ClientWidth = 1360
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
@@ -16,7 +16,6 @@ object frm3D: Tfrm3D
OldCreateOrder = False
Position = poMainFormCenter
Scaled = False
- WindowState = wsMaximized
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy
@@ -35,15 +34,15 @@ object frm3D: Tfrm3D
object panMain: TPanel
Left = 0
Top = 0
- Width = 1342
- Height = 687
+ Width = 1360
+ Height = 705
Align = alClient
Caption = 'Panel2'
TabOrder = 0
object Splitter1: TSplitter
- Left = 1338
+ Left = 1356
Top = 42
- Height = 644
+ Height = 662
Align = alRight
AutoSnap = False
ResizeStyle = rsUpdate
@@ -53,14 +52,14 @@ object frm3D: Tfrm3D
object panUpper: TPanel
Left = 1
Top = 1
- Width = 1340
+ Width = 1358
Height = 41
Align = alTop
BevelOuter = bvNone
Color = 15329769
TabOrder = 0
DesignSize = (
- 1340
+ 1358
41)
object SpeedButton1: TSpeedButton
Left = 8
@@ -108,7 +107,7 @@ object frm3D: Tfrm3D
OnClick = SpeedButton3Click
end
object lbViewType: TLabel
- Left = 1168
+ Left = 1186
Top = 25
Width = 163
Height = 16
@@ -155,7 +154,7 @@ object frm3D: Tfrm3D
OnClick = sbSaveModelClick
end
object sbApplyScsModel: TSpeedButton
- Left = 1073
+ Left = 1091
Top = 13
Width = 161
Height = 22
@@ -169,10 +168,9 @@ object frm3D: Tfrm3D
Font.Style = []
ParentFont = False
OnClick = sbApplyScsModelClick
- ExplicitLeft = 1091
end
object SpeedButton4: TSpeedButton
- Left = 1240
+ Left = 1258
Top = 8
Width = 94
Height = 22
@@ -211,16 +209,16 @@ object frm3D: Tfrm3D
object panScene: TPanel
Left = 1
Top = 42
- Width = 1017
- Height = 644
+ Width = 1035
+ Height = 662
Align = alClient
BevelInner = bvLowered
TabOrder = 1
object Panel3: TPanel
Left = 2
Top = 2
- Width = 1013
- Height = 640
+ Width = 1031
+ Height = 658
Align = alClient
BevelOuter = bvNone
Ctl3D = False
@@ -229,12 +227,12 @@ object frm3D: Tfrm3D
object GLSceneViewer: TGLSceneViewer
Left = 0
Top = 0
- Width = 1013
- Height = 595
+ Width = 1031
+ Height = 613
Camera = GLCamera
Buffer.BackgroundColor = 15987957
Buffer.AntiAliasing = aa2x
- FieldOfView = 123.455924987793000000
+ FieldOfView = 124.868827819824200000
Align = alClient
OnClick = GLSceneViewerClick
OnDblClick = GLSceneViewerDblClick
@@ -245,8 +243,8 @@ object frm3D: Tfrm3D
end
object StatusBar1: TStatusBar
Left = 0
- Top = 615
- Width = 1013
+ Top = 633
+ Width = 1031
Height = 25
Panels = <
item
@@ -257,8 +255,8 @@ object frm3D: Tfrm3D
end
object sbView: TPanel
Left = 0
- Top = 595
- Width = 1013
+ Top = 613
+ Width = 1031
Height = 20
Align = alBottom
Alignment = taLeftJustify
@@ -269,40 +267,36 @@ object frm3D: Tfrm3D
end
end
object RzSizePanel1: TRzSizePanel
- Left = 1018
+ Left = 1036
Top = 42
Width = 320
- Height = 644
+ Height = 662
Align = alRight
BorderWidth = 1
HotSpotVisible = True
SizeBarWidth = 7
TabOrder = 2
VisualStyle = vsClassic
- object RzPageControl1: TRzPageControl
+ object PNtTree: TRzPageControl
AlignWithMargins = True
Left = 16
Top = 4
Width = 300
- Height = 636
- ActivePage = TabSheet1
+ Height = 654
+ ActivePage = TabSheet3
ActivePageDefault = TabSheet1
Align = alRight
- TabIndex = 0
+ TabIndex = 2
TabOrder = 0
TabStyle = tsSquareCorners
FixedDimension = 19
object TabSheet1: TRzTabSheet
Caption = #1052#1086#1076#1077#1083#1100
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object panObjects: TPanel
Left = 0
Top = 0
Width = 296
- Height = 610
+ Height = 628
Align = alClient
BevelInner = bvLowered
Font.Charset = RUSSIAN_CHARSET
@@ -314,7 +308,7 @@ object frm3D: Tfrm3D
TabOrder = 0
object Splitter2: TSplitter
Left = 2
- Top = 155
+ Top = 173
Width = 292
Height = 3
Cursor = crVSplit
@@ -328,20 +322,16 @@ object frm3D: Tfrm3D
Left = 2
Top = 2
Width = 292
- Height = 153
- ActivePage = TabScsModel
+ Height = 171
+ ActivePage = TabArchModel
Align = alClient
- TabIndex = 1
+ TabIndex = 0
TabOrder = 0
TabStyle = tsRoundCorners
OnTabClick = pcTreeTabClick
FixedDimension = 19
object TabArchModel: TRzTabSheet
Caption = #1040#1088#1093'. '#1084#1086#1076#1077#1083#1100
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 145
object cxGroupBox1: TcxGroupBox
Left = 0
Top = 0
@@ -396,7 +386,7 @@ object frm3D: Tfrm3D
Left = 0
Top = 47
Width = 288
- Height = 80
+ Height = 98
Align = alClient
BevelOuter = bvNone
BorderStyle = bsNone
@@ -427,10 +417,6 @@ object frm3D: Tfrm3D
end
object TabScsModel: TRzTabSheet
Caption = #1057#1050#1057' '#1084#1086#1076#1077#1083#1100
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object cxGroupBox2: TcxGroupBox
Left = 0
Top = 0
@@ -485,7 +471,7 @@ object frm3D: Tfrm3D
Left = 0
Top = 47
Width = 288
- Height = 80
+ Height = 98
Align = alClient
BevelOuter = bvNone
BorderStyle = bsNone
@@ -525,7 +511,7 @@ object frm3D: Tfrm3D
end
object pcProps: TRzPageControl
Left = 2
- Top = 158
+ Top = 176
Width = 292
Height = 450
ActivePage = TabScsProps
@@ -536,10 +522,6 @@ object frm3D: Tfrm3D
FixedDimension = 19
object TabArchProps: TRzTabSheet
Caption = #1040#1088#1093'. '#1089#1074#1086#1081#1089#1090#1074#1072
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Panel1: TPanel
Left = 0
Top = 0
@@ -2150,10 +2132,6 @@ object frm3D: Tfrm3D
end
object TabSheet2: TRzTabSheet
Caption = #1053#1072#1089#1090#1088#1086#1081#1082#1080
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 628
object Label10: TLabel
Left = 5
Top = 71
@@ -2269,6 +2247,59 @@ object frm3D: Tfrm3D
Text = '0'
end
end
+ object TabSheet3: TRzTabSheet
+ Caption = #1054#1073#1098#1077#1082#1090#1099
+ object Label62: TLabel
+ Left = 3
+ Top = 5
+ Width = 74
+ Height = 16
+ Caption = #1058#1080#1087#1099' '#1089#1077#1090#1077#1081
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -13
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label63: TLabel
+ Left = 3
+ Top = 338
+ Width = 160
+ Height = 16
+ Caption = #1069#1083#1077#1084#1077#1085#1090#1099' '#1072#1088#1093#1080#1090#1077#1082#1090#1091#1088#1099
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -13
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object NTypTree: TRzCheckTree
+ Left = 3
+ Top = 24
+ Width = 290
+ Height = 297
+ OnStateChange = NTypTreeStateChange
+ Indent = 19
+ SelectionPen.Color = clBtnShadow
+ StateImages = NTypTree.CheckImages
+ TabOrder = 0
+ OnChange = NTypTreeChange
+ end
+ object ArchVTree: TRzCheckTree
+ Left = 3
+ Top = 360
+ Width = 290
+ Height = 229
+ OnStateChange = ArchVTreeStateChange
+ Indent = 19
+ SelectionPen.Color = clBtnShadow
+ StateImages = NTypTree.CheckImages
+ TabOrder = 1
+ OnChange = NTypTreeChange
+ end
+ end
end
end
end
@@ -3413,7 +3444,7 @@ object frm3D: Tfrm3D
Left = 100
Top = 57
Bitmap = {
- 494C01013A00B0000C0310001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C01013A00B000280310001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
000000000000360000002800000040000000F0000000010020000000000000F0
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
diff --git a/POWERCAD30/UNITS/form3d.pas b/POWERCAD30/UNITS/form3d.pas
index ed6951c..ecc843a 100644
--- a/POWERCAD30/UNITS/form3d.pas
+++ b/POWERCAD30/UNITS/form3d.pas
@@ -338,7 +338,7 @@ type
N1: TMenuItem;
N2: TMenuItem;
sbView: TPanel;
- RzPageControl1: TRzPageControl;
+ PNtTree: TRzPageControl;
TabSheet1: TRzTabSheet;
TabSheet2: TRzTabSheet;
cbViewCeiling: TCheckBox;
@@ -353,7 +353,12 @@ type
edWallsTransparency: TEdit;
Label53: TLabel;
RzSizePanel1: TRzSizePanel;
- DuplicateNodeTree: TTreeView; //Tolik Дерево дублей
+ DuplicateNodeTree: TTreeView;
+ TabSheet3: TRzTabSheet;
+ NTypTree: TRzCheckTree;
+ Label62: TLabel;
+ ArchVTree: TRzCheckTree;
+ Label63: TLabel; //Tolik Дерево дублей
procedure GLSceneViewerMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
@@ -463,6 +468,12 @@ type
const Rect: TRect);
procedure trWallTransparencyChange(Sender: TObject);
procedure tbSetWallsTransparencyClick(Sender: TObject);
+ procedure NTypTreeChange(Sender: TObject; Node: TTreeNode);
+ procedure Button1Click(Sender: TObject);
+ procedure NTypTreeStateChange(Sender: TObject; Node: TTreeNode;
+ NewState: TRzCheckState);
+ procedure ArchVTreeStateChange(Sender: TObject; Node: TTreeNode;
+ NewState: TRzCheckState);
private
//Tolik 27/05/25 --
{ Private declarations }
@@ -479,6 +490,9 @@ type
procedure RotateConnModel(aObject: TGLFreeForm; aX, aY, aZ: Double);
procedure DeselectGLObjectsT;
public
+ //Tolik 01/09/2025 --
+ NetTypeArray: array of Integer;
+ //
{ Public declarations }
//DuplicateNodeTree: TTreeView; //Tolik 07/05/2025 -- Список дублей узлов для составных объектов, которые показывать в дереве
// которые показывать не надо
@@ -680,7 +694,7 @@ type
function GetPosWithGridStep(aPos: Double): Double;
procedure ApplyCutting;
- procedure ApplyScsModel;
+ procedure ApplyScsModel(aOnClose: Boolean = False);
procedure ValidateActiveControl;
procedure CreateModel;
@@ -2034,7 +2048,8 @@ Procedure Tfrm3D.UpdateFaces(Faces: TList; Yh: Double = 0; aFirstLoad: boolean =
//const
// clrBlack : TVector = (0, 0, 0, 1);
var
- i, pCnt, pCntNormal, j, k, FigureID, glPointIndex: Integer;
+ CanAddNetType: Boolean;
+ i, pCnt, pCntNormal, j, k, l, FigureID, glPointIndex: Integer;
Face:TFaceRecord;
glPoly:TGLPolyGon;
glLine: TGLLines;
@@ -3398,7 +3413,7 @@ var
end;
Procedure AddLineCompon(aParentNode: TTreeNode; aCompon: TSCSComponent; aLine: TOrthoLine; a3DLine: T3dLine);
- var i: Integer;
+ var i, l: Integer;
currNode: TTreeNode;
dir_v: TVector3F;
LinearAngle, LinearAngle1: Double;
@@ -3877,6 +3892,23 @@ var
if CanAddCompon then
begin
+ //Tolik 02/09/2025 --
+ CanAddNetType := true;
+ for l := 0 to Length(NetTypeArray) - 1 do
+ begin
+ if NetTypeArray[l] = aCompon.IDNetType then
+ begin
+ CanAddNetType := False;
+ break;
+ end;
+ end;
+
+ if CanAddNetType then
+ begin
+ SetLength(NetTypeArray, Length(NetTypeArray) + 1);
+ NetTypeArray[Length(NetTypeArray) - 1] := aCompon.IDNetType;
+ end;
+ //
F3DLineCompon := T3DLineComponent.Create(nil, nil,Self.F3DModel);
Self.F3DModel.FScsObjects.Add(F3DLineCompon);
childNode := ScsModelTree.Items.AddChild(aParentNode, aCompon.GetNameForVisible);
@@ -6760,7 +6792,7 @@ try
}
//
{$IFEND}
- glPipe.Parts := [ppOutSide,ppInSide,ppStartDisk,ppStopDisk];
+ //glPipe.Parts := [ppOutSide,ppInSide,ppStartDisk,ppStopDisk];
end
else
if Face.RecType = ftBar then
@@ -6921,12 +6953,12 @@ try
end;
end;
//Tolik 19/03/2025 - игрушка, посмотреть лоток
- glObject := TWireTray.Create(frm3D.DummyCube);
+ //glObject := TWireTray.Create(frm3D.DummyCube);
//TWireTray(glObject).BeginUpdate;
- TWireTray(glObject).SetScene(GLScene);
- TWireTray(glObject).Length := 100;
- TWireTray(glObject).Width := 20;
- TWireTray(glObject).Height := 20;
+ //TWireTray(glObject).SetScene(GLScene);
+ //TWireTray(glObject).Length := 100;
+ //TWireTray(glObject).Width := 20;
+ //TWireTray(glObject).Height := 20;
//TWireTray(glObject).EndUpdate;
//
//// *********** FACES.COUNT *************************************************
@@ -7313,8 +7345,12 @@ end;
*)
procedure Tfrm3D.FormShow(Sender: TObject);
+var i, j: Integer;
+ RootNode, Node: TTreeNode;
+ Tree_proc : TRzCheckTreeChangeEvent; //Tolik 12/09/2025 --
+
Procedure SortChildsInBackOrder;
- var i: Integer;
+ var i, j: Integer;
FirstChild, CurrChild: TGLPlane;
begin
for i := 0 to GLDummyCube1.Count - 1 do
@@ -7422,6 +7458,47 @@ begin
}
//
//sbFirstFaceClick(nil);
+ //Tolik 04/09/2025 --
+ Tree_proc := NTypTree.OnStateChange; // 12/09/2025 - -
+ NTypTree.OnStateChange := nil;
+
+ NTypTree.Items.Clear;
+ if Length(NetTypeArray) > 0 then
+ begin
+ RootNode := NTypTree.Items.Add( nil, cexdAll);
+ for i := 0 to Length(NetTypeArray) - 1 do
+ begin
+ for j := 0 to F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes.Count - 1 do
+ begin
+ if TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).ID = NetTypeArray[i] then
+ begin
+ Node := NTypTree.Items.AddChild(RootNode, TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).Name);
+ break;
+ end;
+ end;
+ end;
+ NTypTree.DropTarget := RootNode;
+ NTypTree.DropTarget.Expand(false);
+ // чекаем все типы сетей по умолчанию
+ if NTypTree.Items.Count > 1 then
+ begin
+ for i := 0 to NTypTree.Items.Count - 1 do
+ begin
+ Node := NTypTree.Items[i];
+ if Node.AbsoluteIndex <> 0 then
+ NTypTree.Itemstate[Node.AbsoluteIndex] := csChecked;
+ end;
+ end
+ else
+ begin
+ if NTypTree.Items.Count = 1 then
+ NTypTree.Itemstate[0] := csChecked;
+ end;
+ end;
+
+ // 12/09/2025 - -
+ NTypTree.OnStateChange := Tree_proc;
+ //
end;
procedure Tfrm3D.GLHeightField1GetHeight(const x, y: Single; var z: Single;
@@ -8002,11 +8079,13 @@ var
xSide: T3DSide;
ItsRoof: Boolean;
Str: string;
- ip: TDoublePoint;
- p: PDoublePoint;
- CornerNode: TTreeNode;
- xCorner: T3DCorner;
- CornerName: string;
+ ip: TDoublePoint;
+ p: PDoublePoint;
+ CornerNode: TTreeNode;
+ xCorner: T3DCorner;
+ CornerName: string;
+ RootNode, Node, ModelNode: TTreeNode;
+ Tree_proc : TRzCheckTreeChangeEvent;//Tolik 12/09/2025 --
begin
try
xSecondWall := nil;
@@ -8286,6 +8365,48 @@ begin
{$IFEND}
//*****************\ROOF**********************
end;
+ //Tolik 11/09/2025 -- дерево вкл/выкл выдимости архитектуры
+ Tree_proc := ArchVTree.OnStateChange;
+ ArchVTree.OnStateChange := nil; // 12/09/2025 Tolik
+
+ ArchVTree.Items.Clear;
+
+ RootNode := ArchVTree.Items.Add( nil, cexdAll);
+ for i := 0 to ModelTree.Items.Count - 1 do
+ begin
+ if TObject(ModelTree.Items[i].data) <> nil then
+ begin
+ if TObject(ModelTree.Items[i].data) is TF_CAD then
+ begin
+ if ModelTree.Items[i].Count > 0 then
+ begin
+ Str := TF_CAD(ModelTree.Items[i].data).FCADListName + ' ' + IntToStr(TF_CAD(ModelTree.Items[i].data).FCADListIndex);
+ Node := ArchVTree.Items.AddChild(RootNode, Str);
+ Node.data := TF_CAD(ModelTree.Items[i].data);
+ end;
+ end;
+ end;
+ end;
+ ArchVTree.DropTarget := RootNode;
+ ArchVTree.DropTarget.Expand(false);
+ // чекаем все типы сетей по умолчанию
+ if ArchVTree.Items.Count > 1 then
+ begin
+ for i := 0 to ArchVTree.Items.Count - 1 do
+ begin
+ Node := ArchVTree.Items[i];
+ if Node.AbsoluteIndex <> 0 then
+ ArchVTree.Itemstate[Node.AbsoluteIndex] := csChecked;
+ end;
+ end
+ else
+ begin
+ if ArchVTree.Items.Count = 1 then
+ ArchVTree.Itemstate[0] := csChecked;
+ end;
+
+ ArchVTree.OnStateChange := Tree_proc; // 12/09/2025 Tolik
+ //
except
on E: Exception do AddExceptionToLogEx('Tfrm3D.UpdateModelTree', E.Message);
end;
@@ -9515,6 +9636,14 @@ var
//
begin
+ //Tolik 11/09/2025 -- архитектура --
+ ArchVTree.Items.Clear;
+ RootNode := ArchVTree.Items.Add( nil, cexdAll);
+ ArchVTree.DropTarget := RootNode;
+ ArchVTree.DropTarget.Expand(false);
+ //
+ SetLength(NetTypeArray, 0); // Tolik 01/09/2025 -- список типов сетей
+
FCadList := TList.Create; // Tolik 23/07/2025 -- список листов проекта
SetLength(FFloorsHeightArray, 0); // массив высот этажей
//
@@ -17513,9 +17642,27 @@ begin
CanClose := True;
if CanClose then
begin
+ //Tolik 30/08/2025 --
+ if GisChangeFrom3D then
+ begin
+ if MessageModal(F3dMmes3, ApplicationName, MB_YESNO or MB_ICONQUESTION) = IDYES then
+ begin
+ ApplyScsModel(true);
+ end
+ else
+ begin
+ //LoadProjectUndoActions3D;
+ end;
+ end
+ else
+ begin
+ DeleteProjectUndoActions3D;
+ end;
+ //
FreeAndNil(F3DModel);
FIdsStream.Clear;
FFilesStream.Clear;
+
Gis3D := false; //Tolik 29/08/2025 --
end;
except
@@ -18640,6 +18787,54 @@ begin
ChangeDesc;
end;
+procedure Tfrm3D.Button1Click(Sender: TObject);
+var i, j: integer;
+ fNode: TTreeNode;
+ NetId: integer;
+begin
+ for i := 0 to NTypTree.Items.Count - 1 do
+ begin
+ fNode := NTypTree.Items[i];
+
+ if fNode.AbsoluteIndex <> 0 then
+ begin
+ NetId := -1;
+
+ for j := 0 to F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes.Count - 1 do
+ begin
+ if TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).Name = FNode.text then
+ begin
+ Netid := TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).ID;
+ break;
+ end;
+ end;
+
+ if Netid <> -1 then
+ begin
+ for j := 0 to DummyCube.Count - 1 do
+ begin
+ if DummyCube.Children[j].TagObject <> nil then
+ begin
+ if TObject(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data) is T3dLineComponent then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon <> nil then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon.IDNetType = NetID then
+ begin
+ if NTypTree.Itemstate[FNode.AbsoluteIndex] = csChecked then
+ DummyCube.Children[j].Visible := true
+ else
+ DummyCube.Children[j].Visible := false;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+
procedure Tfrm3D.NDel3DObjectClick(Sender: TObject);
var
i, j: Integer;
@@ -21782,7 +21977,7 @@ begin
end;
end;
// Tolik 04/12/2018 -- старая закомменчена -- см ниже
-procedure Tfrm3D.ApplyScsModel;
+procedure Tfrm3D.ApplyScsModel(aOnClose: Boolean = False);
var
i, j, k: integer;
dp: T3DPoint;
@@ -22366,7 +22561,84 @@ begin
FreeAndNil(UndoFormsList);
EndProgress;
// EndProgress;
- SaveCurrProjectToUndoFiles(True);
+ //SaveCurrProjectToUndoFiles(True);
+ //Tolik 30/08/2025
+ GisChangeFrom3D := False; //сбросить флажок изменений
+ if not aOnClose then // если не закрытие формы 3д, то сделать слепок проекта заново
+ begin
+ Gis3D := False;
+ DeleteProjectUndoActions3D;
+ SaveUndoProjBefore3D;
+ Gis3D := True;
+ end;
+end;
+
+procedure Tfrm3D.ArchVTreeStateChange(Sender: TObject; Node: TTreeNode;
+ NewState: TRzCheckState);
+var i, j: integer;
+ CurrNode, ParentNode: TTreeNode;
+ SavedEvent: TglProgressEvent;
+
+ Procedure SetRoomVis(aNode: TTreeNode);
+ var i: integer;
+ begin
+ for i := 0 to aNode.Count - 1 do
+ begin
+ if aNode.Item[i].Count > 0 then
+ begin
+ SetRoomVis(aNode.Item[i]);
+ end
+ else
+ if TObject(aNode.Item[i].Data) is T3DSide then
+ begin
+ if T3DSide(aNode.Item[i].Data).FGLObject <> nil then
+ if T3DSide(aNode.Item[i].Data).FGLObject <> nil then
+ TglBaseSceneObject(T3DSide(aNode.Item[i].Data).FGLObject).Visible := (ArchVTree.Itemstate[Node.AbsoluteIndex] = csChecked);
+ end;
+ end;
+ end;
+begin
+ if Node.Data <> nil then
+ begin
+ {SavedEvent := GlCadencer.OnProgress;
+ GlCadencer.OnProgress := nil;}
+ GlCadencer.Enabled := False;
+ GLScene.BeginUpdate;
+ DummyCube.BeginUpdate;
+ if TObject(node.data) is TF_CAD then
+ begin
+ for i := 0 to ModelTree.Items.Count - 1 do
+ begin
+ if ModelTree.Items[i].Data <> nil then
+ begin
+ if TObject(ModelTree.Items[i].Data) is TF_CAD then
+ begin
+ if TF_CAD(ModelTree.Items[i].Data) = TF_CAD(node.data) then
+ begin
+ ParentNode := ModelTree.Items[i];
+ for j := 0 to ParentNode.Count - 1 do
+ begin
+ if ParentNode.Item[j].Count > 0 then
+ begin
+ SetRoomVis(ParentNode.Item[j]);
+ end
+ else
+ if TObject(ParentNode.Item[j].Data) is T3DSide then
+ begin
+ if T3DSide(ParentNode.Item[j].Data).FGLObject <> nil then
+ TglBaseSceneObject(T3DSide(ParentNode.Item[j].Data).FGLObject).Visible := (ArchVTree.Itemstate[Node.AbsoluteIndex] = csChecked);
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ DummyCube.EndUpdate;
+ GLScene.EndUpdate;
+ GlCadencer.Enabled := True;
+ //GlCadencer.OnProgress := SavedEvent;
+ end;
end;
(*
@@ -22738,6 +23010,432 @@ begin
end;
end;
+procedure Tfrm3D.NTypTreeChange(Sender: TObject; Node: TTreeNode);
+var i, j: integer;
+ fNode: TTreeNode;
+ NetId: integer;
+begin
+ { for i := 0 to NTypTree.Items.Count - 1 do
+ begin
+ fNode := NTypTree.Items[i];
+
+ if fNode.AbsoluteIndex <> 0 then
+ begin
+ NetId := -1;
+
+ for j := 0 to F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes.Count - 1 do
+ begin
+ if TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).Name = FNode.text then
+ begin
+ Netid := TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).ID;
+ break;
+ end;
+ end;
+
+ if Netid <> -1 then
+ begin
+ for j := 0 to DummyCube.Count - 1 do
+ begin
+ if DummyCube.Children[j].TagObject <> nil then
+ begin
+ if TObject(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data) is T3dLineComponent then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon <> nil then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon.IDNetType = NetID then
+ begin
+ if NTypTree.Itemstate[FNode.AbsoluteIndex] = csChecked then
+ DummyCube.Children[j].Visible := true
+ else
+ DummyCube.Children[j].Visible := false;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ }
+end;
+
+procedure Tfrm3D.NTypTreeStateChange(Sender: TObject; Node: TTreeNode;
+ NewState: TRzCheckState);
+var i, j: integer;
+ fNode, CurrNode, ParentNode: TTreeNode;
+ NetId: integer;
+ LineNodesList, LineConnList: TList;
+ LineComponent: T3DLineComponent;
+ ObjVisible: Boolean;
+ Conn: T3DConnector;
+ SCSConnID: integer;
+ SavedProc: TGLProgressEvent;
+
+begin
+ //SavedProc := GlCadencer.OnProgress;
+ //GLCadencer.OnProgress := nil;
+ GlCadencer.Enabled := False;
+ GLScene.BeginUpdate;
+ DummyCube.BeginUpdate;
+
+ LineNodesList := TList.Create;
+ LineConnList := TList.Create;
+
+ NetId := -1;
+
+ for j := 0 to F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes.Count - 1 do
+ begin
+ if TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).Name = Node.text then
+ begin
+ Netid := TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).ID;
+ break;
+ end;
+ end;
+
+ if NetId <> -1 then
+ begin
+ for j := 0 to DummyCube.Count - 1 do
+ begin
+ if DummyCube.Children[j].TagObject <> nil then
+ begin
+ if TObject(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data) is T3dLineComponent then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon <> nil then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon.IDNetType = NetID then
+ begin
+ DummyCube.Children[j].Visible := (NTypTree.Itemstate[Node.AbsoluteIndex] = csChecked);
+ LineNodesList.Add(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject));
+ end;
+ end;
+ end;
+ end;
+ end;
+ {
+ else
+ begin
+ //11/09/2025 Tolik для поинтов
+ if TObject(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data) is T3dConnector then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FConnType = ct_Full then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FGLObject <> nil then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon <> nil then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon.IDNetType = NetID then
+ TglBaseSceneObject(T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FGLObject).Visible := (NTypTree.Itemstate[FNode.AbsoluteIndex] = csChecked);
+ end;
+ end;
+ end;
+ end;
+ end;
+ }
+
+ for I := 0 to LineNodesList.Count - 1 do
+ begin
+ currNode := TTreeNode(LineNodesList[i]); //
+ ParentNode := currNode.Parent;
+ while ParentNode.Level > 2 do
+ ParentNode := ParentNode.Parent; // Трасса
+
+ if ParentNode.Data <> nil then //если с трассы все спрятано - трассу спрятать (и наоборот)
+ begin
+ ObjVisible := False;
+ for j := 0 to ParentNode.Count - 1 do
+ begin
+ if ParentNode.Item[j].Data <> nil then
+ begin
+ if TObject(ParentNode.Item[j].Data) is T3DLineComponent then
+ begin
+ if T3DLineComponent(ParentNode.Item[j].Data).FGLObject <> nil then
+ begin
+ if TGLBaseSceneObject(T3DLineComponent(ParentNode.Item[j].Data).FGLObject).Visible then
+ begin
+ ObjVisible := True;
+ break;
+ end;
+ end;
+ end;
+ end;
+ end;
+ TGLBaseSceneObject(T3DLine(ParentNode.Data).FGLObject).Visible := ObjVisible;
+
+ if T3DLine(ParentNode.Data).FJoinConnector1 <> nil then
+ begin
+ if LineConnList.IndexOf(T3DLine(ParentNode.Data).FJoinConnector1) = -1 then
+ LineConnList.Add(T3DLine(ParentNode.Data).FJoinConnector1);
+ end;
+ if T3DLine(ParentNode.Data).FJoinConnector2 <> nil then
+ begin
+ if LineConnList.IndexOf(T3DLine(ParentNode.Data).FJoinConnector2) = -1 then
+ LineConnList.Add(T3DLine(ParentNode.Data).FJoinConnector2);
+ end;
+ end;
+ end;
+ //стыки труб
+ for i := 0 to LineConnList.Count - 1 do
+ begin
+ Conn := T3dConnector(LineConnList[i]);
+ if Conn.FisPipeElement then
+ begin
+ ObjVisible := False;
+ for j := 0 to Conn.FJoinedLinesList.Count - 1 do
+ begin
+ if T3DLine(Conn.FJoinedLinesList[j]).FGLObject <> nil then
+ begin
+ if TglBaseSceneObject(T3DLine(Conn.FJoinedLinesList[j]).FGLObject).Visible then
+ begin
+ ObjVisible := True;
+ break;
+ end;
+ end;
+ end;
+ //в основном дереве
+ if Conn.FGLObject <> nil then
+ begin
+ TglBaseSceneObject(Conn.FGLObject).Visible := ObjVisible;
+ end;
+
+ if Conn.FSCSComponID <> -1 then
+ begin
+ //
+ for j := 0 to SCSModelTree.Items.Count - 1 do
+ begin
+ if SCSModelTree.Items[j].data <> nil then
+ begin
+ if TObject(SCSModelTree.Items[j].data) is T3DConnector then
+ begin
+ if T3DConnector(SCSModelTree.Items[j].data).FSCSComponID = Conn.FSCSComponID then
+ begin
+ if T3DConnector(SCSModelTree.Items[j].data).FGLObject <> nil then
+ TglBaseSceneObject(T3DConnector(SCSModelTree.Items[j].data).FGLObject).Visible := ObjVisible;
+ end;
+ end;
+ end;
+ end;
+ //в скрытом(где дублируются по ай-ди компонента)
+ for j := 0 to DuplicateNodeTree.Items.Count - 1 do
+ begin
+ if DuplicateNodeTree.Items[j].data <> nil then
+ begin
+ if TObject(DuplicateNodeTree.Items[j].data) is T3DConnector then
+ begin
+ if T3DConnector(DuplicateNodeTree.Items[j].data).FSCSComponID = Conn.FSCSComponID then
+ begin
+ if T3DConnector(DuplicateNodeTree.Items[j].data).FGLObject <> nil then
+ TglBaseSceneObject(T3DConnector(DuplicateNodeTree.Items[j].data).FGLObject).Visible := ObjVisible;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ Dummycube.EndUpdate;
+ GLScene.EndUpdate;
+ GlCadencer.Enabled := True;
+ //GLCadencer.OnProgress := SavedProc;
+ end;
+end;
+
+(*
+procedure Tfrm3D.NTypTreeStateChange(Sender: TObject; Node: TTreeNode;
+ NewState: TRzCheckState);
+var i, j: integer;
+ fNode, CurrNode, ParentNode: TTreeNode;
+ NetId: integer;
+ LineNodesList, LineConnList: TList;
+ LineComponent: T3DLineComponent;
+ ObjVisible: Boolean;
+ Conn: T3DConnector;
+ SCSConnID: integer;
+ SavedProc: TGLProgressEvent;
+
+begin
+ SavedProc := GlCadencer.OnProgress;
+ GLCadencer.OnProgress := nil;
+
+ GLScene.BeginUpdate;
+ DummyCube.BeginUpdate;
+ LineNodesList := TList.Create;
+ LineConnList := TList.Create;
+
+ for i := 0 to NTypTree.Items.Count - 1 do
+ begin
+ fNode := NTypTree.Items[i];
+
+ if fNode.AbsoluteIndex <> 0 then
+ begin
+ NetId := -1;
+
+ for j := 0 to F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes.Count - 1 do
+ begin
+ if TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).Name = FNode.text then
+ begin
+ Netid := TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[j]).ID;
+ break;
+ end;
+ end;
+
+ if Netid <> -1 then
+ begin
+ DummyCube.BeginUpdate; //11/09/2025 --Tolik
+ for j := 0 to DummyCube.Count - 1 do
+ begin
+ if DummyCube.Children[j].TagObject <> nil then
+ begin
+ if TObject(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data) is T3dLineComponent then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon <> nil then
+ begin
+ if T3dLineComponent(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon.IDNetType = NetID then
+ begin
+ DummyCube.Children[j].Visible := (NTypTree.Itemstate[FNode.AbsoluteIndex] = csChecked);
+ {
+ if NTypTree.Itemstate[FNode.AbsoluteIndex] = csChecked then
+ DummyCube.Children[j].Visible := true
+ else
+ DummyCube.Children[j].Visible := false;
+ }
+ LineNodesList.Add(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject));
+ end;
+ end;
+ end;
+ {
+ else
+ begin
+ //11/09/2025 Tolik для поинтов
+ if TObject(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data) is T3dConnector then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FConnType = ct_Full then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FGLObject <> nil then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon <> nil then
+ begin
+ if T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FSCSCompon.IDNetType = NetID then
+ TglBaseSceneObject(T3dConnector(TTreeNode(TGLBaseSceneObject(DummyCube.Children[j]).TagObject).Data).FGLObject).Visible := (NTypTree.Itemstate[FNode.AbsoluteIndex] = csChecked);
+ end;
+ end;
+ end;
+ end;
+ end;
+ }
+ end;
+ end;
+ DummyCube.EndUpdate; // 11/*09/2025 --
+ end;
+ end;
+ end;
+
+ for I := 0 to LineNodesList.Count - 1 do
+ begin
+ currNode := TTreeNode(LineNodesList[i]); //
+ ParentNode := currNode.Parent;
+ while ParentNode.Level > 2 do
+ ParentNode := ParentNode.Parent; // Трасса
+
+ if ParentNode.Data <> nil then //если с трассы все спрятано - трассу спрятать (и наоборот)
+ begin
+ ObjVisible := False;
+ for j := 0 to ParentNode.Count - 1 do
+ begin
+ if ParentNode.Item[j].Data <> nil then
+ begin
+ if TObject(ParentNode.Item[j].Data) is T3DLineComponent then
+ begin
+ if T3DLineComponent(ParentNode.Item[j].Data).FGLObject <> nil then
+ begin
+ if TGLBaseSceneObject(T3DLineComponent(ParentNode.Item[j].Data).FGLObject).Visible then
+ begin
+ ObjVisible := True;
+ break;
+ end;
+ end;
+ end;
+ end;
+ end;
+ TGLBaseSceneObject(T3DLine(ParentNode.Data).FGLObject).Visible := ObjVisible;
+
+ if T3DLine(ParentNode.Data).FJoinConnector1 <> nil then
+ begin
+ if LineConnList.IndexOf(T3DLine(ParentNode.Data).FJoinConnector1) = -1 then
+ LineConnList.Add(T3DLine(ParentNode.Data).FJoinConnector1);
+ end;
+ if T3DLine(ParentNode.Data).FJoinConnector2 <> nil then
+ begin
+ if LineConnList.IndexOf(T3DLine(ParentNode.Data).FJoinConnector2) = -1 then
+ LineConnList.Add(T3DLine(ParentNode.Data).FJoinConnector2);
+ end;
+ end;
+ end;
+ //стыки труб
+ for i := 0 to LineConnList.Count - 1 do
+ begin
+ Conn := T3dConnector(LineConnList[i]);
+ if Conn.FisPipeElement then
+ begin
+ ObjVisible := False;
+ for j := 0 to Conn.FJoinedLinesList.Count - 1 do
+ begin
+ if T3DLine(Conn.FJoinedLinesList[j]).FGLObject <> nil then
+ begin
+ if TglBaseSceneObject(T3DLine(Conn.FJoinedLinesList[j]).FGLObject).Visible then
+ begin
+ ObjVisible := True;
+ break;
+ end;
+ end;
+ end;
+ //в основном дереве
+ if Conn.FGLObject <> nil then
+ begin
+ TglBaseSceneObject(Conn.FGLObject).Visible := ObjVisible;
+ end;
+
+ if Conn.FSCSComponID <> -1 then
+ begin
+ //
+ for j := 0 to SCSModelTree.Items.Count - 1 do
+ begin
+ if SCSModelTree.Items[j].data <> nil then
+ begin
+ if TObject(SCSModelTree.Items[j].data) is T3DConnector then
+ begin
+ if T3DConnector(SCSModelTree.Items[j].data).FSCSComponID = Conn.FSCSComponID then
+ begin
+ if T3DConnector(SCSModelTree.Items[j].data).FGLObject <> nil then
+ TglBaseSceneObject(T3DConnector(SCSModelTree.Items[j].data).FGLObject).Visible := ObjVisible;
+ end;
+ end;
+ end;
+ end;
+ //в скрытом(где дублируются по ай-ди компонента)
+ for j := 0 to DuplicateNodeTree.Items.Count - 1 do
+ begin
+ if DuplicateNodeTree.Items[j].data <> nil then
+ begin
+ if TObject(DuplicateNodeTree.Items[j].data) is T3DConnector then
+ begin
+ if T3DConnector(DuplicateNodeTree.Items[j].data).FSCSComponID = Conn.FSCSComponID then
+ begin
+ if T3DConnector(DuplicateNodeTree.Items[j].data).FGLObject <> nil then
+ TglBaseSceneObject(T3DConnector(DuplicateNodeTree.Items[j].data).FGLObject).Visible := ObjVisible;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ Dummycube.EndUpdate;
+ GLScene.EndUpdate;
+
+ GLCadencer.OnProgress := SavedProc;
+end;
+*)
+
function Tfrm3D.GetPointToDivTrace(X, Y: Integer; aLine: TGLLines): T3DPoint;
var
glCursor: TGLCustomSceneObject;
diff --git a/SRC/ExpertCad.dpr b/SRC/ExpertCad.dpr
index b14855a..2d42247 100644
--- a/SRC/ExpertCad.dpr
+++ b/SRC/ExpertCad.dpr
@@ -204,7 +204,8 @@ uses
U_PortsReIndex in 'SCSNormBase\U_PortsReIndex.pas' {F_PortsReIndex},
U_ELCommon in 'Main\U_ELCommon.pas' {/U_SetWallTransparency in 'Main\U_SetWallTransparency.pas' {F_SetWallTransparency},
U_ShieldConfig in 'Main\U_ShieldConfig.pas' {/ Tolik 16/03/2023 формат щитка для монтажной схемы;},
- U_Reserv in 'Main\U_Reserv.pas' {F_Reserv};
+ U_Reserv in 'Main\U_Reserv.pas' {F_Reserv},
+ form3d in '..\POWERCAD30\UNITS\form3d.pas' {frm3D};
// Tolik 16/03/2023 формат щитка для монтажной схемы;
//U_SetWallTransparency in 'Main\U_SetWallTransparency.pas' {F_SetWallTransparency};
diff --git a/SRC/ExpertCad.dproj b/SRC/ExpertCad.dproj
index 079a8d9..91084f8 100644
--- a/SRC/ExpertCad.dproj
+++ b/SRC/ExpertCad.dproj
@@ -708,6 +708,9 @@
+
+
+
Cfg_10
Base
diff --git a/SRC/Main/USCS_Main.dfm b/SRC/Main/USCS_Main.dfm
index 391c4ec..e378962 100644
--- a/SRC/Main/USCS_Main.dfm
+++ b/SRC/Main/USCS_Main.dfm
@@ -4181,6 +4181,11 @@ object FSCS_Main: TFSCS_Main
Caption = #1057#1086#1079#1076#1072#1090#1100' '#1084#1077#1078#1101#1090#1072#1078#1085#1091#1102' '#1074#1077#1088#1090#1080#1082#1072#1083#1100' '#1076#1086#1074#1077#1088#1093#1091
OnExecute = aCreateBFMagistralUpExecute
end
+ object ACreateFloorV: TAction
+ Category = #1052#1077#1085#1102' '#1057#1050#1057' '#1086#1073#1100#1077#1082#1090#1086#1074
+ Caption = #1057#1086#1079#1076#1072#1090#1100' '#1074#1077#1088#1090#1080#1082#1072#1083#1100' '#1085#1072' '#1074#1099#1089#1086#1090#1091' '#1101#1090#1072#1078#1072
+ OnExecute = ACreateFloorVExecute
+ end
end
object PrintDialog: TPrintDialog
Left = 352
@@ -5614,6 +5619,9 @@ object FSCS_Main: TFSCS_Main
object pmCreateBFMagistralUp: TMenuItem
Action = aCreateBFMagistralUp
end
+ object pmCreateFloorV: TMenuItem
+ Action = ACreateFloorV
+ end
object pmiListRefreshDesignList: TMenuItem
Action = aRefreshDesignList
end
@@ -5884,7 +5892,7 @@ object FSCS_Main: TFSCS_Main
Left = 496
Top = 232
Bitmap = {
- 494C0101D2008C01C40310001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C0101D2008C01D00310001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000005003000001002000000000000050
0300000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
@@ -12894,7 +12902,7 @@ object FSCS_Main: TFSCS_Main
Left = 248
Top = 280
Bitmap = {
- 494C010123008C01DC0320001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C010123008C01E80320001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000800000009000000001002000000000000020
0100000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
@@ -15466,7 +15474,7 @@ object FSCS_Main: TFSCS_Main
Left = 240
Top = 408
Bitmap = {
- 494C010112008C01D0030E000E00FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C010112008C01DC030E000E00FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
000000000000360000002800000038000000460000000100200000000000403D
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
@@ -19969,7 +19977,7 @@ object FSCS_Main: TFSCS_Main
Left = 240
Top = 344
Bitmap = {
- 494C0101DE008C01B80618001800FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 494C0101DE008C01C40618001800FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
00000000000036000000280000006000000040050000010020000000000000E0
070000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009D9188003D2413003D241300FFFF
diff --git a/SRC/Main/USCS_Main.pas b/SRC/Main/USCS_Main.pas
index 88b1e86..b00fac5 100644
--- a/SRC/Main/USCS_Main.pas
+++ b/SRC/Main/USCS_Main.pas
@@ -1190,6 +1190,8 @@ type
pmCreateBFMagistralUp: TMenuItem;
aCreateBFMagistralDown: TAction;
aCreateBFMagistralUp: TAction;
+ ACreateFloorV: TAction;
+ pmCreateFloorV: TMenuItem;
// ACTIONs
// создать новый проект
@@ -2007,6 +2009,7 @@ type
procedure aCreateBFMagistralExecute(Sender: TObject);
procedure aCreateBFMagistralDownExecute(Sender: TObject);
procedure aCreateBFMagistralUpExecute(Sender: TObject);
+ procedure ACreateFloorVExecute(Sender: TObject);
{ procedure SelectAllLineObjsHint(var HintStr: String;
var CanShow: Boolean);
@@ -19632,6 +19635,63 @@ begin
//
end;
+procedure TFSCS_Main.ACreateFloorVExecute(Sender: TObject);
+ var i, ListIndex: integer;
+ x,y: Double;
+ FCad, SavedGcadForm: TF_Cad;
+ CadList: TList;
+ CreatedLine: TOrthoLine;
+ p1, p2: TDoublePoint;
+ SavedMoveWithRaise, SSGrid, SSN, SSG: Boolean;
+ SCSList: TSCSList;
+ begin
+ SavedMoveWithRaise := GMoveWithRaise;
+ GMoveWithRaise := False;
+
+ p1.x := GMouseDownPos.x;
+ p1.y := GMouseDOwnPos.y;
+ p1.z := 0;
+
+ p2.x := GMouseDownPos.x + 1;
+ p2.y := GMouseDOwnPos.y + 1;
+ p2.z := 0;
+
+ SSGrid := GCadForm.PCad.SnapToGrids;
+ SSN := GCadForm.PCad.SnapToNearPoint;
+ SSG := GCadForm.PCad.SnapToGuides;
+
+ GCadForm.PCad.SnapToGrids := False;
+ GCadForm.PCad.SnapToNearPoint := False;
+ GCadForm.PCad.SnapToGuides := False;
+
+ CreatedLine := CreateTraceByPoints(GCadForm.PCad, p1, p2);
+ CreatedLine.ActualZOrder[1] := 0;
+ TConnectorObject(CreatedLine.JoinConnector1).actualzOrder[1] := 0;
+
+ TConnectorObject(CreatedLine.JoinConnector2).MoveP(p1.x - p2.x, p1.y - p2.y, False, False);
+ CreatedLine.ActualZOrder[2] := GCadForm.FRoomHeight;
+ TConnectorObject(CreatedLine.JoinConnector2).actualzOrder[1] := GCadForm.FRoomHeight;
+
+ CreatedLine.LengthCalc;
+ CreatedLine.LineLength := CreatedLine.LengthCalc;
+
+ GCadForm.PCad.SnapToGrids := SSGrid;
+ GCadForm.PCad.SnapToNearPoint := SSN;
+ GCadForm.PCad.SnapToGuides := SSG;
+
+ GMoveWithRaise := SavedMoveWithRaise;
+ if GCadForm.cbManualCableTracingMode.Down then
+ begin
+ if F_NormBase.GSCSBase.SCSComponent <> nil then
+ begin
+ if F_NormBase.GSCSBase.SCSComponent.IsLine = biTrue then
+ begin
+ CopyComponentToSCSObject(CreatedLine.ID, F_NormBase.GSCSBase.SCSComponent.ID);
+ end;
+ end;
+ end;
+ end;
+
procedure TFSCS_Main.aCreateFloorRaiseDownExecute(Sender: TObject);
var
RaiseOnFigure: TConnectorObject;
@@ -20087,9 +20147,8 @@ begin
//Tolik 11/07/2023 --
//SaveCurrProjectToUndoFiles(true);
//
- prLists := GetAllProjNormLists;
- SaveForProjectUndo(prLists, true, false, true);
- prLists.Free;
+ SaveUndoProjBefore3D;
+ GIs3D := True;
//
BeginProgress;
if not Assigned(frm3D) then
@@ -21794,9 +21853,10 @@ begin
begin
G3DModelForProject := True;
//Tolik 29/08/2025 --
+ SaveUndoProjBefore3D;
GIs3D := True;
GisChangeFrom3D := False;
- SaveUndoProjBefore3D;
+
//
BeginProgress;
if not Assigned(frm3D) then
@@ -22107,6 +22167,7 @@ begin
end;
end;
SubstrateFileList.Free;
+ (*
if G3dUndoActList.Count > 0 then
begin
j := G3dUndoActList.Count;
@@ -22117,7 +22178,6 @@ begin
GCadForm.SCSUndoNormalList(true);
dec(j);
end;
-
{
for j := G3dUndoActList.Count - 1 downto 0 do
begin
@@ -22126,6 +22186,8 @@ begin
end;
}
end;
+ *)
+
FreeAndNil(G3dUndoList); // Tolik 18/07/2025 --
FreeAndNil(G3dUndoActList); // Tolik 18/07/2025 --
//
diff --git a/SRC/Main/U_CAD.pas b/SRC/Main/U_CAD.pas
index 8cdbbd7..0955de1 100644
--- a/SRC/Main/U_CAD.pas
+++ b/SRC/Main/U_CAD.pas
@@ -7112,12 +7112,14 @@ begin
FSCS_Main.pmCreateBFMagistral.Visible := True;
FSCS_Main.pmCreateBFMagistralUp.Visible := True;
FSCS_Main.pmCreateBFMagistralDown.Visible := True;
+ FSCS_Main.pmCreateFloorV.Visible := True;
end
else
begin
FSCS_Main.pmCreateBFMagistral.Visible := False;
FSCS_Main.pmCreateBFMagistralUp.Visible := False;
FSCS_Main.pmCreateBFMagistralDown.Visible := False;
+ FSCS_Main.pmCreateFloorV.Visible := False;
end;
//
@@ -11346,6 +11348,8 @@ var
SaveGCadRefreshFlag: boolean;
begin
Result := nil;
+ if Gis3D then //Tolik 30/08/2025 -- залочить, пока юзается 3Д вид
+ exit;
//Tolik 16/08/2021 --
GetPathToSCSCADDir;
GetPathToSCSUndoDir;
@@ -11422,19 +11426,34 @@ begin
end;
ListUndoAction := TListUndoAction.Create(aType, aSavePM);
- // записать последнее изменение в файл, название в FUndoList
- Count := FSCSUndoList.Count;
- // SetUndoName := FUndoDir + FCADListName + IntTostr(FCADListIndex) + '_' + IntToStr(Count);
- //Tolik 18/07/2025 --
-{ if a3d then
- SetUndoName := FUndoDir + '3D\'+ FCADListFileName + '_' + IntToStr(Count)
- else}
- SetUndoName := FUndoDir + FCADListFileName + '_' + IntToStr(Count);
+ if a3D then
+ begin
+ Count := G3dUndoList.Count;
+ SetUndoName := FUndoDir + '3D\'+ FCADListFileName + '_' + IntToStr(Count);
+
+ if not DirectoryExists(FUndoDir + '3D\') then
+ CreateDir(FUndoDir + '3D\');
+ end
+ else
+ begin
+ // записать последнее изменение в файл, название в FUndoList
+ Count := FSCSUndoList.Count;
+ // SetUndoName := FUndoDir + FCADListName + IntTostr(FCADListIndex) + '_' + IntToStr(Count);
+ //Tolik 18/07/2025 --
+ {if a3d then
+ SetUndoName := FUndoDir + '3D\'+ FCADListFileName + '_' + IntToStr(Count)
+ else}
+ SetUndoName := FUndoDir + FCADListFileName + '_' + IntToStr(Count);
+ end;
// сохранить в список файлов
ListUndoAction.FCadFileName := SetUndoName;
ListUndoAction.FIndex := Count;
ListUndoAction.FIsProject := aIsProject;
- FSCSUndoList.Add(ListUndoAction);
+
+ if a3D then
+ G3dUndoList.Add(ListUndoAction)
+ else
+ FSCSUndoList.Add(ListUndoAction);
// сохранить в темповый файл
FUndoFiguresList.Clear;
diff --git a/SRC/Main/U_Common.pas b/SRC/Main/U_Common.pas
index 10dc672..0ea21e3 100644
--- a/SRC/Main/U_Common.pas
+++ b/SRC/Main/U_Common.pas
@@ -1357,6 +1357,7 @@ type
Procedure CreateBFMagistralTr(aFull: Boolean = true; aDown: Boolean = False; aUp: Boolean = False; aCompon: TSCSComponent = nil);
function GetAllProjNormLists: TList; // Tolik 29/08/2025 --
procedure SaveUndoProjBefore3D; // Tolik 29/08/2025 --
+ Procedure DeleteProjectUndoActions3D; // Tolik 30/08/2025 --
//
const
{$IF Defined(SCS_PANDUIT) or Defined(SCS_PE)}
@@ -1774,6 +1775,34 @@ uses USCS_Main, Menus, U_main, U_MasterNewList, U_MasterNewListLite, U_AutoTrace
U_InputRadio, U_BaseConstants,
cxSpinEdit, Printers, PCPanel, U_InputMark, U_PEAutotraceDialog{Tolik}, U_SCSClasses, U_MakeEditCrossConnection, U_DimLineDialog, U_ResourceReport;
+ //Tolik 30/08/2025 -- сбросить слепок проекта для 3Д
+ Procedure DeleteProjectUndoActions3D;
+ var ProjectUndoAction: TProjectUndoAction;
+ ListUndoAction: TListUndoAction;
+ Undo3DdirNam: String;
+ begin
+ Undo3DdirNam := GCadForm.FUndodir + '\3D\';
+ if DirectoryExists(Undo3DdirNam) then
+ FullRemoveDir(Undo3DdirNam, true, true);
+ if G3dUndoActList <> nil then
+ begin
+ While G3dUndoActList.Count > 0 do
+ begin
+ TProjectUndoAction(G3dUndoActList[0]).free;
+ G3dUndoActList.delete(0);
+ end;
+ end;
+
+ if G3dUndoList <> nil then
+ begin
+ while G3dUndoList.Count > 0 do
+ begin
+ TListUndoAction(G3dUndoList[0]).free;
+ G3dUndoList.delete(0);
+ end;
+ end;
+ end;
+
//Tolik 29/08/2025 --
function GetAllProjNormLists: TList; // Tolik 29/08/2025 --
var i: integer;
@@ -1794,7 +1823,6 @@ uses USCS_Main, Menus, U_main, U_MasterNewList, U_MasterNewListLite, U_AutoTrace
procedure SaveUndoProjBefore3D;
var prLists: TList;
begin
-
prLists := GetAllProjNormLists;
SaveForProjectUndo(prLists, true, false, true);
prLists.Free;
@@ -1810,6 +1838,8 @@ uses USCS_Main, Menus, U_main, U_MasterNewList, U_MasterNewListLite, U_AutoTrace
p1, p2: TDoublePoint;
SavedMoveWithRaise, SSGrid, SSN, SSG: Boolean;
SCSList: TSCSList;
+ //11/09/2025
+ ObjParams: TObjectParams;
begin
CadList := TList.Create;
//Full
@@ -1897,6 +1927,24 @@ uses USCS_Main, Menus, U_main, U_MasterNewList, U_MasterNewListLite, U_AutoTrace
CreatedLine.ActualZOrder[2] := GCadForm.FRoomHeight;
TConnectorObject(CreatedLine.JoinConnector2).actualzOrder[1] := GCadForm.FRoomHeight;
+ CreatedLine.Name := cCadClasses_Mes32;
+ SetNewObjectNameInPM(CreatedLine.ID, CreatedLine.Name);
+ ObjParams := GetFigureParams(CreatedLine.ID);
+ //11/09/2025--
+ CreatedLine.Name := ObjParams.Name;
+ CreatedLine.FIndex := ObjParams.MarkID;
+ CreatedLine.FIsVertical := True;
+
+ CreatedLine.CalculLength := CreatedLine.LengthCalc;
+ CreatedLine.LineLength := CreatedLine.CalculLength;
+ SetLineFigureLengthInPM(CreatedLine.ID, CreatedLine.LineLength);
+ CreatedLine.ReCreateCaptionsGroup(True, false);
+ CreatedLine.UpdateLengthTextBox(True, false);
+ CreatedLine.ReCreateNotesGroup(True);
+ CreatedLine.ShowCaptions := False;
+ CreatedLine.ShowNotes := False;
+ CreatedLine.IsShowBlock := False;
+
CreatedLine.LengthCalc;
CreatedLine.LineLength := CreatedLine.LengthCalc;
@@ -48754,45 +48802,79 @@ begin
try
SaveGCadRefreshFlag := GCanRefreshCad;
GCanRefreshCad := false;
-
- if GUndoList = nil then
- GUndoList := TList.Create;
- ProjectUndoAction := TProjectUndoAction.create;
-
- SavedGCadForm := GCadForm;
- for i := 0 to aLists.Count - 1 do
+ if a3D then
begin
- vList := TF_CAD(aLists[i]);
- GCadForm := vList;
+ if G3dUndoActList = nil then
+ G3dUndoActList := TList.Create;
+ if G3dUndoList = nil then
+ G3dUndoList := TList.Create;
- ListUndoAction := nil; //#From Oleg# //14.09.2010
- //
- if vList.FListType = lt_Normal then
- ListUndoAction := vList.SaveForUndoNormalList(uat_Floor, aSavePM, aIsProject, i, a3D)
- else
- if vList.FListType = lt_ProjectPlan then
- ListUndoAction := vList.SaveForUndoProjectPlan(uat_Floor, aSavePM, aIsProject, i, a3D)
- else
- if vList.FListType = lt_DesignBox then
- ListUndoAction := vList.SaveForUndoDesignList(uat_Floor, aSavePM, aIsProject, i, a3d)
- // Tolik 12/02/2021 --
- else
- if vList.FListType = lt_ElScheme then
- ListUndoAction := vList.SaveForUndoELScheme(uat_Floor, aSavePM, aIsProject, i, a3d);
+ ProjectUndoAction := TProjectUndoAction.create;
-// ListUndoAction := vList.SaveForUndo(uat_Floor, aSavePM, aIsProject, i);
- //
- if ListUndoAction <> nil then
+ SavedGCadForm := GCadForm;
+ for i := 0 to aLists.Count - 1 do
begin
- ListUndoAction.FProjectUndoAction := ProjectUndoAction;
- LinkUndoObject := TLinkUndoObject.create;
- LinkUndoObject.FCad := vList;
- LinkUndoObject.FListUndoAction := ListUndoAction;
- ProjectUndoAction.FLinkUndoObject.Add(LinkUndoObject);
+ vList := TF_CAD(aLists[i]);
+ GCadForm := vList;
+
+ ListUndoAction := nil; //#From Oleg# //14.09.2010
+ //
+ if vList.FListType = lt_Normal then
+ ListUndoAction := vList.SaveForUndoNormalList(uat_Floor, aSavePM, aIsProject, i, a3D);
+
+ if ListUndoAction <> nil then
+ begin
+ ListUndoAction.FProjectUndoAction := ProjectUndoAction;
+ LinkUndoObject := TLinkUndoObject.create;
+ LinkUndoObject.FCad := vList;
+ LinkUndoObject.FListUndoAction := ListUndoAction;
+ ProjectUndoAction.FLinkUndoObject.Add(LinkUndoObject);
+ end;
end;
+ GCadForm := SavedGCadForm;
+ G3dUndoActList.Add(ProjectUndoAction);
+ end
+ else
+ begin
+ if GUndoList = nil then
+ GUndoList := TList.Create;
+ ProjectUndoAction := TProjectUndoAction.create;
+
+ SavedGCadForm := GCadForm;
+ for i := 0 to aLists.Count - 1 do
+ begin
+ vList := TF_CAD(aLists[i]);
+ GCadForm := vList;
+
+ ListUndoAction := nil; //#From Oleg# //14.09.2010
+ //
+ if vList.FListType = lt_Normal then
+ ListUndoAction := vList.SaveForUndoNormalList(uat_Floor, aSavePM, aIsProject, i, a3D)
+ else
+ if vList.FListType = lt_ProjectPlan then
+ ListUndoAction := vList.SaveForUndoProjectPlan(uat_Floor, aSavePM, aIsProject, i, a3D)
+ else
+ if vList.FListType = lt_DesignBox then
+ ListUndoAction := vList.SaveForUndoDesignList(uat_Floor, aSavePM, aIsProject, i, a3d)
+ // Tolik 12/02/2021 --
+ else
+ if vList.FListType = lt_ElScheme then
+ ListUndoAction := vList.SaveForUndoELScheme(uat_Floor, aSavePM, aIsProject, i, a3d);
+
+ // ListUndoAction := vList.SaveForUndo(uat_Floor, aSavePM, aIsProject, i);
+ //
+ if ListUndoAction <> nil then
+ begin
+ ListUndoAction.FProjectUndoAction := ProjectUndoAction;
+ LinkUndoObject := TLinkUndoObject.create;
+ LinkUndoObject.FCad := vList;
+ LinkUndoObject.FListUndoAction := ListUndoAction;
+ ProjectUndoAction.FLinkUndoObject.Add(LinkUndoObject);
+ end;
+ end;
+ GCadForm := SavedGCadForm;
+ GUndoList.Add(ProjectUndoAction);
end;
- GCadForm := SavedGCadForm;
- GUndoList.Add(ProjectUndoAction);
except
on E: Exception do addExceptionToLogEx('U_Common.SaveForProjectUndo', E.Message);
end;
diff --git a/SRC/SCSNormBase/U_BaseConstants.pas b/SRC/SCSNormBase/U_BaseConstants.pas
index b2d65e7..c482c69 100644
--- a/SRC/SCSNormBase/U_BaseConstants.pas
+++ b/SRC/SCSNormBase/U_BaseConstants.pas
@@ -3185,6 +3185,7 @@ const
cRenewRackDesign = 'Обновить дизайн шкафа?'; // Tolik 23/06/2021 --
F3dMmes1 = 'Левая клавиша мыши - вращение листа. Правая - перемещение.Скролл - увел./уменьш. (зум)';
F3dMmes2 = 'Недоступно в режиме просмотра "От первого лица"!'; // Tolik 08/12/2023
+ F3dMmes3 = 'Применить изменения?'; //Tolik 30/08/2025 --
Trace_Mess = 'Задайте высоту трассы, которая будет использоваться по умолчанию, ';
Trace_Mess_1 = '(вы сможете её изменить в Настройках проекта CTRL-F2)';
Trace_Mess1 = 'Задайте высоту трассы';