From 713ddf52b41babd4f408c78cc3079af04d95ff1d Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 18 Jul 2025 19:23:53 +0300 Subject: [PATCH] First commit --- POWERCAD30/UNITS/form3d.dfm | 5 +- POWERCAD30/UNITS/form3d.pas | 14 +- SRC/Main/USCS_Main.dfm | 22 +-- SRC/Main/USCS_Main.pas | 86 ++++++++- SRC/Main/U_CAD.pas | 321 +++++++++++++++++++++++++++++-- SRC/Main/U_Common.pas | 26 ++- SRC/SCSNormBase/U_BaseCommon.pas | 82 ++++++-- readme.txt | 4 +- 8 files changed, 506 insertions(+), 54 deletions(-) diff --git a/POWERCAD30/UNITS/form3d.dfm b/POWERCAD30/UNITS/form3d.dfm index 5055772..fc2fb75 100644 --- a/POWERCAD30/UNITS/form3d.dfm +++ b/POWERCAD30/UNITS/form3d.dfm @@ -156,7 +156,7 @@ object frm3D: Tfrm3D end object sbApplyScsModel: TSpeedButton Left = 1091 - Top = 8 + Top = 13 Width = 161 Height = 22 Anchors = [akTop, akRight] @@ -169,7 +169,6 @@ object frm3D: Tfrm3D Font.Style = [] ParentFont = False OnClick = sbApplyScsModelClick - ExplicitLeft = 1003 end object SpeedButton4: TSpeedButton Left = 1258 @@ -3405,7 +3404,7 @@ object frm3D: Tfrm3D Left = 100 Top = 57 Bitmap = { - 494C01013A00B000DC0210001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C01013A00B000E40210001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 000000000000360000002800000040000000F0000000010020000000000000F0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/POWERCAD30/UNITS/form3d.pas b/POWERCAD30/UNITS/form3d.pas index c763276..3729344 100644 --- a/POWERCAD30/UNITS/form3d.pas +++ b/POWERCAD30/UNITS/form3d.pas @@ -12531,6 +12531,7 @@ var SelList: TList; selCatalog: TSCSCatalog; CameraPos: T3DPoint; + UndoAct: TListUndoAction; procedure SynchronizeCoordsToCad(aPoint: TDoublePoint; aSide: integer); var SCSConn: TConnectorObject; @@ -12601,7 +12602,15 @@ var if aLine.FSCSObject <> nil then SCSLine := aLine.FSCSObject; // сама трасса на каде - + //Tolik 18/07/2025 -- Undo када(если не было) + if G3dUndoList.IndexOf(TF_CAD(TPowerCad(SCSLine.Owner).Owner)) = -1 then + begin + UndoAct := TF_CAD(TPowerCad(SCSLine.Owner).Owner).SaveForUndo(uat_None, true, false, 0, false, true); + G3dUndoList.Add(TF_CAD(TPowerCad(SCSLine.Owner).Owner)); + if UndoAct <> nil then + G3dUndoActList.Add(UndoAct); + end; + // FaceList := TList.Create; ObjList := TList.Create; Obj3dList := TList.Create; @@ -13111,7 +13120,7 @@ var GLSceneViewer.Camera.Position.z := CameraPos.z; GCadForm := SavedGCadForm; - + GisChangeFrom3D := True; // 11/07/2025 -- выставить флаг, чтоб были изменения в проекте из 3Д ... end; // begin @@ -22243,6 +22252,7 @@ begin FreeAndNil(UndoFormsList); EndProgress; // EndProgress; + SaveCurrProjectToUndoFiles(True); end; (* diff --git a/SRC/Main/USCS_Main.dfm b/SRC/Main/USCS_Main.dfm index bd509ea..33e73ba 100644 --- a/SRC/Main/USCS_Main.dfm +++ b/SRC/Main/USCS_Main.dfm @@ -1,7 +1,7 @@ object FSCS_Main: TFSCS_Main Left = -8 Top = -8 - Width = 1376 + Width = 1380 Height = 744 HorzScrollBar.Color = clBtnFace HorzScrollBar.ParentColor = False @@ -46,7 +46,7 @@ object FSCS_Main: TFSCS_Main ExplicitHeight = 641 end object sDiv2: TSplitter - Left = 1352 + Left = 1356 Top = 188 Height = 474 Align = alRight @@ -82,7 +82,7 @@ object FSCS_Main: TFSCS_Main OnUnDock = PDock1UnDock end object pDock2: TPanel - Left = 1355 + Left = 1359 Top = 188 Width = 5 Height = 474 @@ -102,7 +102,7 @@ object FSCS_Main: TFSCS_Main object pCADList: TPanel Left = 0 Top = 662 - Width = 1360 + Width = 1364 Height = 23 Align = alBottom BevelOuter = bvNone @@ -111,7 +111,7 @@ object FSCS_Main: TFSCS_Main object pageCADList: TPageControl Left = 0 Top = 0 - Width = 1358 + Width = 1362 Height = 21 Align = alClient Font.Charset = RUSSIAN_CHARSET @@ -129,7 +129,7 @@ object FSCS_Main: TFSCS_Main AlignWithMargins = True Left = 3 Top = 0 - Width = 1354 + Width = 1358 Height = 136 HelpContext = 76000 Margins.Top = 0 @@ -1214,7 +1214,7 @@ object FSCS_Main: TFSCS_Main object pnHintBar: TRzSizePanel Left = 0 Top = 136 - Width = 1360 + Width = 1364 Height = 52 Align = alTop BorderHighlight = clBtnFace @@ -5860,7 +5860,7 @@ object FSCS_Main: TFSCS_Main Left = 496 Top = 232 Bitmap = { - 494C0101D2008C01980310001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C0101D2008C01A80310001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000005003000001002000000000000050 0300000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -12870,7 +12870,7 @@ object FSCS_Main: TFSCS_Main Left = 248 Top = 280 Bitmap = { - 494C010123008C01B00320001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010123008C01C00320001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000800000009000000001002000000000000020 0100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -15442,7 +15442,7 @@ object FSCS_Main: TFSCS_Main Left = 240 Top = 408 Bitmap = { - 494C010112008C01A4030E000E00FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010112008C01B4030E000E00FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 000000000000360000002800000038000000460000000100200000000000403D 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -19945,7 +19945,7 @@ object FSCS_Main: TFSCS_Main Left = 240 Top = 344 Bitmap = { - 494C0101DE008C018C0618001800FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C0101DE008C019C0618001800FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 00000000000036000000280000006000000040050000010020000000000000E0 070000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009D9188003D2413003D241300FFFF diff --git a/SRC/Main/USCS_Main.pas b/SRC/Main/USCS_Main.pas index 5e8b3be..3840558 100644 --- a/SRC/Main/USCS_Main.pas +++ b/SRC/Main/USCS_Main.pas @@ -20054,8 +20054,11 @@ begin end; {$IFEND} -// 22.07.2011 + // 22.07.2011 G3DModelForProject := False; + //Tolik 11/07/2023 -- + SaveCurrProjectToUndoFiles(true); + // BeginProgress; if not Assigned(frm3D) then Application.CreateForm(Tfrm3D, frm3d); @@ -20086,6 +20089,10 @@ begin Application.ProcessMessages; frm3d.ShowModal; FreeAndNil(frm3D); + //Tolik 11/07/2025 -- восстановить проект, если были изменения через 3Д... + if GisChangeFrom3D then + UndoListInPM(-1, GetPathToSCSUndoUniqDir(true), true, 0, 0); + // // Tolik 23/07/2018 -- GCadForm.PCad.Refresh; // @@ -21459,7 +21466,11 @@ var SubstrateFileName: String; currGLPlane: TGLPlane; SubstrateFileList: TStringList; - + // Tolik 17/07/2025 -- + VList: TList; + //tmpCad: TF_Cad; + Dir3dUndoName: string; + UndoAct: TListUndoAction; { procedure InsertIntoHList(Cad: TF_CAD); var @@ -21688,6 +21699,49 @@ begin LLists := Nil; SubstrateFileList := TStringList.Create; // список подложек (чтобы потом удалить созданные jpeg, дабы не засорять диск) // + //Tolik 11/07/2025 -- UNDO for 3D + {for i := 0 to F_ProjMan.GSCSBase.CurrProject.ProjectLists.Count - 1 do + begin + TmpCad := GetListbyID(F_ProjMan.GSCSBase.CurrProject.ProjectLists[i].SCSID); + if TmpCad <> nil then + begin + if TmpCad <> nil then + begin + if TmpCad.FListType = lt_Normal then + begin + + end; + end; + end; + end; + } + //SaveCurrProjectToUndoFiles(true); + //Tolik 17/07/2025 -- Save Project Undo + G3dUndoList := TList.create; + G3dUndoActList := TList.Create; + {VList := TList.create; + for i := 0 to F_ProjMan.GSCSBase.CurrProject.ChildCatalogs.Count - 1 do + begin + if F_ProjMan.GSCSBase.CurrProject.ChildCatalogs[i] is TSCSList then + begin + TmpCad := GetListByID(F_ProjMan.GSCSBase.CurrProject.ChildCatalogs[i].SCSID); + if TmpCad <> nil then + VList.Add(TmpCad); + end; + end; + + Dir3dUndoName := GetPathToSCSUndoDir +'\3D'; + + if DirectoryExists(Dir3dUndoName) then + FullRemoveDir(Dir3dUndoName, true, true); + if Not DirectoryExists(Dir3dUndoName) then + begin + CreateDir(Dir3dUndoName); + if DirectoryExists(Dir3dUndoName) then + SaveForProjectUndo(vList, true, false, true); + end; + // + } {$ifdef 3D} ctrlDown:=(IsKeyDown(VK_LCONTROL) or IsKeyDown(VK_RCONTROL)); if ActiveMDIChild <> nil then @@ -21904,6 +21958,13 @@ begin frm3d.FCAD := GCadForm; frm3d.ShowModal; FreeAndNil(frm3D); + //Tolik 11/07/2025 -- восстановить проект, если были изменения через 3Д... + //if GisChangeFrom3D then + //begin + // UndoListInPM(-1, GetPathToSCSUndoUniqDir(true), true, 0, 0); + // GCadForm.PCad.Refresh; + ///end; + // end else begin @@ -21958,6 +22019,27 @@ begin end; end; SubstrateFileList.Free; + if G3dUndoActList.Count > 0 then + begin + j := G3dUndoActList.Count; + while G3dUndoList.Count > 0 do + begin + if j = 0 then + break; + GCadForm.SCSUndoNormalList(true); + dec(j); + end; + + { + for j := G3dUndoActList.Count - 1 downto 0 do + begin + cad := TF_CAD(G3dUndoList[j]); + cad.SCSUndoNormalList(true); + end; + } + end; + FreeAndNil(G3dUndoList); // Tolik 18/07/2025 -- + FreeAndNil(G3dUndoActList); // Tolik 18/07/2025 -- // end; // При проверке на соответствие масштабов иногда возникают казусы в плане соответствия "на глаз" и diff --git a/SRC/Main/U_CAD.pas b/SRC/Main/U_CAD.pas index f872329..93632a5 100644 --- a/SRC/Main/U_CAD.pas +++ b/SRC/Main/U_CAD.pas @@ -536,7 +536,9 @@ type // Toilk 03/06/2021 - - здесь добавляем флажок, чтобы видеть, когда ундо приходит с применения свойств листа, // чтобы сделать одинаковый откат для всех типов листов, иначе не сможем откатить на всех схемах применение свойств листа + //Tolik 15/07/2025 -*- тут чуть поправим, чтобы сделать и перед 3Д (и не потерять, чтобы потом вернуть ) //function SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; + { function SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; aFromMasterNewList: Boolean = false): TListUndoAction; // function SaveForUndoNormalList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; @@ -545,8 +547,22 @@ type function SaveForUndoELScheme(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; // function SaveForUndoDesignList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; + } + //function SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; + + function SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; aFromMasterNewList: Boolean = false; a3D: boolean = false): TListUndoAction; + // + function SaveForUndoNormalList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; + function SaveForUndoProjectPlan(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; + // Tolik 12/02/2021 + function SaveForUndoELScheme(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; + // + function SaveForUndoDesignList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; // поднять предыдущее состояние из темпового файла - procedure SCSUndoNormalList; + //Tolik 18/07/2025 -- + //procedure SCSUndoNormalList; + procedure SCSUndoNormalList(a3d: Boolean = False); + // procedure SCSUndoProjectPlan; procedure SCSUndoDesignList; procedure SCSUndoElScheme; // Tolik 12/02/2021 -- @@ -11219,7 +11235,8 @@ end; //Tolik 03/06/2021 -- //function TF_CAD.SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; -function TF_CAD.SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; aFromMasterNewList: Boolean = false): TListUndoAction; +//function TF_CAD.SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; aFromMasterNewList: Boolean = false): TListUndoAction; +function TF_CAD.SaveForUndo(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; aFromMasterNewList: Boolean = false; a3D: boolean = false): TListUndoAction; // var SavedGCadForm: TF_CAD; @@ -11246,28 +11263,44 @@ begin // Tolik 03/06/2021 -- if aFromMasterNewList then begin - Result := SaveForUndoNormalList(aType, aSavePM, aIsProject, aProjectIndex); + //Tolik 18/07/2025 -- + //Result := SaveForUndoNormalList(aType, aSavePM, aIsProject, aProjectIndex); + Result := SaveForUndoNormalList(aType, aSavePM, aIsProject, aProjectIndex, a3D); + // GCadForm := SavedGCadForm; exit; end; if FListType = lt_Normal then - Result := SaveForUndoNormalList(aType, aSavePM, aIsProject, aProjectIndex) + // + //Result := SaveForUndoNormalList(aType, aSavePM, aIsProject, aProjectIndex) + Result := SaveForUndoNormalList(aType, aSavePM, aIsProject, aProjectIndex, a3D) + // else if FListType = lt_ProjectPlan then - Result := SaveForUndoProjectPlan(aType, aSavePM, aIsProject, aProjectIndex) + // + //Result := SaveForUndoProjectPlan(aType, aSavePM, aIsProject, aProjectIndex) + Result := SaveForUndoProjectPlan(aType, aSavePM, aIsProject, aProjectIndex, a3D) + // else if FListType = lt_DesignBox then - Result := SaveForUndoDesignList(aType, aSavePM, aIsProject, aProjectIndex) + // + //Result := SaveForUndoDesignList(aType, aSavePM, aIsProject, aProjectIndex) + Result := SaveForUndoDesignList(aType, aSavePM, aIsProject, aProjectIndex, a3D) // Tolik 12/02/2021 -- если тип листа -- электрическая схема однолинейная else if FListType = lt_ElScheme then //SaveListToUndoStack(GCadForm.FCADListID); - Result := SaveForUndoELScheme(aType, aSavePM, aIsProject, aProjectIndex) + // + //Result := SaveForUndoELScheme(aType, aSavePM, aIsProject, aProjectIndex) + Result := SaveForUndoELScheme(aType, aSavePM, aIsProject, aProjectIndex, a3D) + // else if FListType = lt_AScheme then //SaveListToUndoStack(GCadForm.FCADListID); - Result := SaveForUndoELScheme(aType, aSavePM, aIsProject, aProjectIndex); + //, a3D + //Result := SaveForUndoELScheme(aType, aSavePM, aIsProject, aProjectIndex); + Result := SaveForUndoELScheme(aType, aSavePM, aIsProject, aProjectIndex, a3D); // GCadForm := SavedGCadForm; except @@ -11275,7 +11308,10 @@ begin end; end; -function TF_CAD.SaveForUndoNormalList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +//Tolik 16/07/2025 -- +//function TF_CAD.SaveForUndoNormalList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +function TF_CAD.SaveForUndoNormalList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; +// var i, j: integer; Count: Integer; @@ -11305,7 +11341,8 @@ begin BasePath := ''; if (aSavePM) and ((not aIsProject) or (aProjectIndex = 0)) then begin - BasePath := SavePMForUndo(FCADListID, aIsProject); + //BasePath := SavePMForUndo(FCADListID, aIsProject); + BasePath := SavePMForUndo(FCADListID, aIsProject, a3D); CanProcess := BasePath <> ''; end; if CanProcess then @@ -11360,7 +11397,11 @@ begin // записать последнее изменение в файл, название в FUndoList Count := FSCSUndoList.Count; // SetUndoName := FUndoDir + FCADListName + IntTostr(FCADListIndex) + '_' + IntToStr(Count); - SetUndoName := FUndoDir + FCADListFileName + '_' + IntToStr(Count); + //Tolik 18/07/2025 -- +{ if a3d then + SetUndoName := FUndoDir + '3D\'+ FCADListFileName + '_' + IntToStr(Count) + else} + SetUndoName := FUndoDir + FCADListFileName + '_' + IntToStr(Count); // сохранить в список файлов ListUndoAction.FCadFileName := SetUndoName; ListUndoAction.FIndex := Count; @@ -11403,7 +11444,10 @@ begin GCanRefreshCad := SaveGCadRefreshFlag; end; -function TF_CAD.SaveForUndoProjectPlan(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +//Tolik 16/07/2025 -- +//function TF_CAD.SaveForUndoProjectPlan(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +function TF_CAD.SaveForUndoProjectPlan(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; +// var i, j: integer; Count: Integer; @@ -11478,8 +11522,10 @@ begin on E: Exception do addExceptionToLogEx('TF_CAD.SaveForUndoProjectPlan', E.Message); end; end; + // Tolik 12/02/2021 -- -function TF_CAD.SaveForUndoELScheme(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +//function TF_CAD.SaveForUndoELScheme(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +function TF_CAD.SaveForUndoELScheme(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; //Tolik 16/7/2025 var i, j: integer; Count: Integer; @@ -11555,8 +11601,10 @@ begin end; end; // - -function TF_CAD.SaveForUndoDesignList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +//Tolik 16/074/2025 -- +//function TF_CAD.SaveForUndoDesignList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0): TListUndoAction; +function TF_CAD.SaveForUndoDesignList(aType: TListUndoActionType; aSavePM: Boolean; aIsProject: Boolean; aProjectIndex: Integer = 0; a3D: boolean = false): TListUndoAction; +// var i, j: integer; Count: Integer; @@ -11641,7 +11689,249 @@ begin on E: Exception do addExceptionToLogEx('', E.Message); end; end; +//Tolik 18/07/2025 -- +procedure TF_CAD.SCSUndoNormalList(a3d: Boolean = False); +var + FName: string; + Figure: TFigure; + i, j: integer; + ListUndoAction: TListUndoAction; + LinkUndoObject: TLinkUndoObject; + Stream: TMemoryStream; + size: integer; + CountInPrj: Integer; + OldTick1, OldTick2, OldTick3, CurTick1, CurTick2, CurTick3: Cardinal; + CurListParams: TListParams; + ListOfLists: TList; + SavedGCadForm, CurrCad: TF_CAD; + NetObj: TNet; + //Tolik + CadFigList: TList; + SaveGCadRefreshFlag: boolean; + +begin + try + SaveGCadRefreshFlag := GCanRefreshCad; + GCanRefreshCad := false; + SavedGCadForm := GCadForm; + ListOfLists := nil; // Tolik 11/12/2020 -- + + // IGOR 2017-04-25 если это не сделать, дебагить после анду/реду потом нереально при включенном стоп-он АВ + self.UnSnapFigure; + GPrevFigureTraceTo := nil; + GPrevFigureSnap := nil; + GFigureSnap := nil; + + FullEndUpdateCad(true); // Tolik 24/03/2021 -- + + BeginProgress; + if (FSCSUndoList.Count > 0) or (G3dUndoActList.Count > 0) then + begin + if a3d then + ListUndoAction := TListUndoAction(G3dUndoActList[0]) + else + ListUndoAction := TListUndoAction(FSCSUndoList[FSCSUndoList.Count - 1]); + + FName := ListUndoAction.FCadFileName; + // есть файл + if FileExists(FName) then + begin + // если на 3Д + CountInPrj := 0; + if not a3d then + begin + // Перед UNDO, создается слепок текущего состояния для REDO + if ListUndoAction.ActionType = uat_Floor then + begin + CountInPrj := 0; + ListOfLists := TList.Create; + for i := 0 to ListUndoAction.FProjectUndoAction.FLinkUndoObject.Count - 1 do + begin + LinkUndoObject := TLinkUndoObject(ListUndoAction.FProjectUndoAction.FLinkUndoObject[i]); + if LinkUndoObject.FCad.FListType = lt_Normal then + begin + CountInPrj := CountInPrj + 1; + ListOfLists.Add(LinkUndoObject.FCad); + end; + end; + SaveForProjectRedo(ListOfLists, ListUndoAction.FSavePM, ListUndoAction.FIsProject); + //FreeAndNil(ListOfLists); + end + else + begin + CountInPrj := 1; + SaveForRedo(ListUndoAction.ActionType, ListUndoAction.FSavePM, ListUndoAction.FIsProject, CountInPrj); + end; + end; + // + if FListType <> lt_Normal then + PCad.RecordUndo := False; + // перед очисткой сбросим чтобы сработала проверка в TConnectorObject.Destroy; + PCad.OnObjectInserted := nil; + + //ClearSCSFigures; + Try + F_ProjMan.Tree_Catalog.Items.BeginUpdate; + //ClearFiguresOnListUndoRedo; + GProjectClose := True; + GClearFigures := True; + GCadForm.FCadClose := True; + GProjectClose := True; + //ClearFiguresOnListDelete(GCadForm); + ClearSCSFigures; + Finally + F_ProjMan.Tree_Catalog.Items.EndUpdate; + GProjectClose := false; + GClearFigures := false; + GCadForm.FCadClose := false; + GProjectClose := false; + End; + //PCad.OnObjectInserted := nil; + FUndoFiguresList.Clear; + PCad.LoadSCSFiguresFromFile(FName); + PCad.OnObjectInserted := PCadObjectInserted; + + FUndoStatus := True; + try + if GListWithEndPoint = Self then + begin + GEndPoint := nil; + GListWithEndPoint := nil; + end; + + GNeedReRaiseProperties := False; + //Tolik + CadFigList := TList.Create; + for i := 0 to PCad.FigureCount - 1 do + CadFigList.Add(TFigure(PCad.Figures.Items[i])); + + for i := 0 to CadFigList.Count - 1 do + begin + Figure := TFigure(CadFigList[i]); + + if CheckFigureByClassName(Figure, 'TNet') then + begin + NetObj := TNet(PCad.Figures.Items[i]); + if NetObj.FComponID = 0 then + begin + FActiveNet := NetObj; + ActiveNet := FActiveNet; + end; + end + else if CheckFigureByClassName(Figure, cTConnectorObject) then + begin + TConnectorObject(Figure).RaiseProperties(CadFigList); + TConnectorObject(Figure).FJoinedListIDForBox := -1; + end + else if CheckFigureByClassName(Figure, cTOrthoLine) then + TOrthoLine(Figure).RaiseProperties(CadFigList) + else if CheckFigureByClassName(Figure, cTSCSFigureGrp) then + TSCSFigureGrp(Figure).RaiseProperties(CadFigList) + else if CheckFigureByClassName(Figure, cTCabinet) then + TCabinet(Figure).RaiseProperties(CadFigList) + else if CheckFigureByClassName(Figure, cTCabinetExt) then + TCabinetExt(Figure).RaiseProperties(CadFigList) + else if CheckFigureByClassName(Figure, cTHouse) then + THouse(Figure).RaiseProperties(CadFigList); + end; + FreeAndNil(CadFigList); + + finally + FUndoStatus := False; + end; + + FindObjectsForConvertClasses; + PCad.DrawFigures(True); + + // удалить файл + if FileExists(FName) then + DeleteFile(FName); + // удалить последний который поднимается из спика + if a3d then + G3dUndoActList.delete(0) + else + FSCSUndoList.Delete(FSCSUndoList.Count - 1); + + // *UNDO ProjectManager* + UndoListInPM(FCADListID, ListUndoAction.FBasePath, ListUndoAction.FIsProject, 0, CountInPrj); + + // есть связи с другими этажами - поднять со всех связанных листов + if not a3d then + begin + if ListUndoAction.ActionType = uat_Floor then + begin + LoadProjectUndoActions(Self, ListUndoAction); + end; + end; + + if CountInPrj = 1 then + begin + // List Params + CurListParams := GetListParams(FCADListID); + FCanSaveForUndo := False; + LoadSettingsForListByParams(CurListParams, True); + SetVisibleCabinetsNumbers(FShowCabinetsNumbers); + SetVisibleCabinetsBounds(FShowCabinetsBounds); + FCanSaveForUndo := True; + OnAfterUndo; + end + else + if CountInPrj > 1 then + begin + if ListOfLists <> nil then + begin + for i := 0 to ListOfLists.Count - 1 do + begin + GCadForm := TF_CAD(ListOfLists[i]); + CurListParams := GetListParams(GCadForm.FCADListID); + GCadForm.FCanSaveForUndo := False; + LoadSettingsForListByParams(CurListParams, True); + SetVisibleCabinetsNumbers(GCadForm.FShowCabinetsNumbers); + SetVisibleCabinetsBounds(GCadForm.FShowCabinetsBounds); + GCadForm.FCanSaveForUndo := True; + GCadForm.OnAfterUndo; + end; + FreeAndNil(ListOfLists); + end; + end; + // + end + else + FSCSUndoList.Remove(ListUndoAction); + // удалить объект UndoAction + FreeAndNil(ListUndoAction); + // Tolik --28/06/2016 -- + if Assigned(F_SCSObjectsProp) then + if F_SCSObjectsProp.Showing then + F_SCSObjectsProp.ClearAllProperties; + // + end; + except + on E: Exception do addExceptionToLogEx('TF_CAD.SCSUndoNormalList', E.Message); + end; + + //Tolik 04/06/2021 -- + if FListType <> lt_Normal then + PCad.RecordUndo := True; + // + + // Tolik 26/09/2017 -- + if FListSettings.ShowTracesCrossPoints > 0 then + ShowTracesIntersections(2, FListSettings.ShowTracesCrossPoints); + // + GCadForm := SavedGCadForm; + GCanRefreshCad := SaveGCadRefreshFlag; + EndProgress; + + {append(f); + writeln(f, 'END'); + writeln(f, '---------------------------------------------------------------------------'); + CloseFile(f);} + PCad.refresh; +end; + +(* procedure TF_CAD.SCSUndoNormalList; var FName: string; @@ -11927,6 +12217,7 @@ begin CloseFile(f);} PCad.refresh; end; +*) procedure TF_CAD.SCSUndoProjectPlan; var diff --git a/SRC/Main/U_Common.pas b/SRC/Main/U_Common.pas index f738ae7..96093b2 100644 --- a/SRC/Main/U_Common.pas +++ b/SRC/Main/U_Common.pas @@ -1074,7 +1074,10 @@ type procedure SetIsCableChannel(aListID, aLineID: Integer; aFlag: Boolean); // UNDO для проекта ... - procedure SaveForProjectUndo(aLists: TList; aSavePM: Boolean; aIsProject: Boolean); + //Tolik 17/07/2025 - + //procedure SaveForProjectUndo(aLists: TList; aSavePM: Boolean; aIsProject: Boolean); + procedure SaveForProjectUndo(aLists: TList; aSavePM: Boolean; aIsProject: Boolean; a3d: boolean = false); + // // удалить всю цепочку Undo в связке с другими этажами procedure DeleteProjectUndoActions(aCad: TF_CAD; aListUndoAction: TListUndoAction); // поднять всю цепочку UNdo в связке с другими этажами @@ -1653,6 +1656,10 @@ var GFtpFromDisk: Boolean = True; // Tolik 23/12/2024 GFtpToDisk: Boolean = True; // Tolik 23/12/2024 + GisChangeFrom3D: Boolean = false; // Tolik 11/07/2025 -- (если были изменения на каде через 3Д) + G3dUndoList: TList = nil; + G3dUndoActList: TList = nil; + //************* Hot Keys ********************* hkCtrlN, hkCtrlL, @@ -48568,8 +48575,9 @@ begin on E: Exception do addExceptionToLogEx('U_Common.SetIsCableChannel', E.Message); end; end; - -procedure SaveForProjectUndo(aLists: TList; aSavePM: Boolean; aIsProject: Boolean); +//Tolik 17/07/2025 -- +procedure SaveForProjectUndo(aLists: TList; aSavePM: Boolean; aIsProject: Boolean; a3d: boolean = false); +//procedure SaveForProjectUndo(aLists: TList; aSavePM: Boolean; aIsProject: Boolean); var i, j: integer; vList: TF_CAD; @@ -48596,18 +48604,18 @@ begin ListUndoAction := nil; //#From Oleg# //14.09.2010 // if vList.FListType = lt_Normal then - ListUndoAction := vList.SaveForUndoNormalList(uat_Floor, aSavePM, aIsProject, i) + ListUndoAction := vList.SaveForUndoNormalList(uat_Floor, aSavePM, aIsProject, i, a3D) else if vList.FListType = lt_ProjectPlan then - ListUndoAction := vList.SaveForUndoProjectPlan(uat_Floor, aSavePM, aIsProject, i) + ListUndoAction := vList.SaveForUndoProjectPlan(uat_Floor, aSavePM, aIsProject, i, a3D) else if vList.FListType = lt_DesignBox then - ListUndoAction := vList.SaveForUndoDesignList(uat_Floor, aSavePM, aIsProject, i) - // Tolik 12/02/2021 -- + 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); - + ListUndoAction := vList.SaveForUndoELScheme(uat_Floor, aSavePM, aIsProject, i, a3d); + // ListUndoAction := vList.SaveForUndo(uat_Floor, aSavePM, aIsProject, i); // if ListUndoAction <> nil then diff --git a/SRC/SCSNormBase/U_BaseCommon.pas b/SRC/SCSNormBase/U_BaseCommon.pas index 40875fd..0a81528 100644 --- a/SRC/SCSNormBase/U_BaseCommon.pas +++ b/SRC/SCSNormBase/U_BaseCommon.pas @@ -5547,7 +5547,10 @@ function GetPathToRepDesignLang: String; function GetPathToSCSCADDir(AWithCreate: Boolean=false): string; // Путь к папке, где хранятся открытые КАД листы function GetPathToSCSTmpDir: String; function GetPathToSCSUndoDir(ADefine: Boolean=true): String; -function GetPathToSCSUndoUniqDir: String; +//Tolik 11/07/2025 -- +//function GetPathToSCSUndoUniqDir: String; +function GetPathToSCSUndoUniqDir(aFor3D: Boolean = false): String; +// function GetPathToUndoDir(ADefine: Boolean=true): String; function GetPathToUnPackedTmp(AFileNoExists: Boolean): String; function GetPathToUserReportFile(ARepFileName: String): String; @@ -5743,13 +5746,20 @@ procedure UndoListInPM(aListID: Integer; aBasePath: string; AIsProject: Boolean; // Удалить слепок листа проекта для отката - Вызов из CAD procedure DeleteUndoFromPM(aListID: Integer; aBasePath: string; AIsProject: Boolean); // Создать слепок листа для отката - Вызов из CAD -function SavePMForUndo(aID: Integer; AIsProject: Boolean): String; - +//Tolik 18/07/2025 -- +//function SavePMForUndo(aID: Integer; AIsProject: Boolean): String; +function SavePMForUndo(aID: Integer; AIsProject: Boolean; a3D: Boolean = false): String; +// // Создат undo слепок для проекта -function SaveCurrProjectToUndoFiles: String; +//Tolik 11/07/2025 -- +//function SaveCurrProjectToUndoFiles: String; +function SaveCurrProjectToUndoFiles(aFor3D: Boolean = false): String; +// // Создат undo слепок для листа -function SaveListToUndoFiles(AListID: Integer): String; - +//Tolik 18/07/2025 -- +//function SaveListToUndoFiles(AListID: Integer): String; +function SaveListToUndoFiles(AListID: Integer; a3D: Boolean = false): String; +// // Сохранит текущий проект в UNDO стек function SaveCurrProjectToUndoStack: String; // сохранит лист в UNDO стек @@ -32145,6 +32155,29 @@ begin Result := GetAnsiTempPath; end; +//Tolik 11/07/2025 -- +function GetPathToSCSUndoUniqDir(aFor3D: Boolean = false): String; +var + i: Integer; +begin + Result := ''; + if aFor3D then + begin + Result := GetPathToSCSUndoDir +'\' + '3D'; + end + else + begin + i := 0; + while True do + begin + Result := GetPathToSCSUndoDir +'\'+ GetUniqueFileName('', ''); + Inc(i); + if (i=15) or DirectoryExists(Result) then + Break; //// BREAK //// + end; + end; +end; +{ function GetPathToSCSUndoUniqDir: String; var i: Integer; @@ -32159,6 +32192,7 @@ begin Break; //// BREAK //// end; end; +} function GetPathToUndoDir(ADefine: Boolean=true): String; begin @@ -42250,23 +42284,35 @@ begin FullRemoveDir(aBasePath, true, true); end; -function SavePMForUndo(aID: Integer; AIsProject: Boolean): String; +function SavePMForUndo(aID: Integer; AIsProject: Boolean; a3D: Boolean = false): String; begin Result := ''; if AIsProject then Result := SaveCurrProjectToUndoFiles else - Result := SaveListToUndoFiles(AID); + //Tolik 18/07/2025 -- + //Result := SaveListToUndoFiles(AID); + Result := SaveListToUndoFiles(AID, a3d); + // end; +//Tolik 11/07/2025 -- +function SaveCurrProjectToUndoFiles(aFor3D: Boolean = false): String; +begin + Result := GetPathToSCSUndoUniqDir(aFor3D); + + if Not F_ProjMan.GSCSBase.CurrProject.ComplexSaveToDir(Result) then + Result := ''; +end; +{ function SaveCurrProjectToUndoFiles: String; begin Result := GetPathToSCSUndoUniqDir; if Not F_ProjMan.GSCSBase.CurrProject.ComplexSaveToDir(Result) then Result := ''; end; - -function SaveListToUndoFiles(AListID: Integer): String; +} +function SaveListToUndoFiles(AListID: Integer; a3d: Boolean = false): String; var SCSList: TSCSList; begin @@ -42274,7 +42320,21 @@ begin SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(AListID); if SCSList <> nil then begin - Result := GetPathToSCSUndoUniqDir; + Result := GetPathToSCSUndoUniqDir(a3D); + //Tolik18/7/2025 -- + if a3d then //тут практически будет 2 новых каталога, потому не создаст...нужно создать один, а второй (3Д) + //уже создастся далее + begin + if Not DirectoryExists(Result) then + CreateDir(Result); + if DirectoryExists(Result) then + Result := Result + '\' + GetUniqueFileName('', '') + else + Result := ''; + end; + // + if Result = '' then + exit; if Not SCSList.ComplexSaveToDir(Result) then Result := ''; end; diff --git a/readme.txt b/readme.txt index 3a5bf6f..c362258 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1,3 @@ -тут РґРѕ изменения UNDO перед 3Р”, чтобы потом РЅРѕСЂРј восстановить, так как придется внести слишком РјРЅРѕРіРѕ изменений \ No newline at end of file +Undo for 3d Project РїРѕРєР° черновик, переписать/дописать РІ плане запрета УНДО для када, если 3Р” +РЎР±СЂРѕСЃ Рё перезапуск РїРѕ РєРЅРѕРїРєРµ применения СЃ 3Р” модели, Р° назакрытии 3Р” как раз откат, +если что останется Рё тогда будет РћРљ \ No newline at end of file