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 @@
F_Reserv
+ +
frm3D
+
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 = 'Задайте высоту трассы';