1 {
2 *****************************************************************************
3 * *
4 * This file is part of the ZCAD *
5 * *
6 * See the file COPYING.modifiedLGPL.txt, included in this distribution, *
7 * for details about the copyright. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
12 * *
13 *****************************************************************************
14 }
15 {
16 @author(Andrey Zubarev <zamtmn@yandex.ru>)
17 }
18 {$MODE OBJFPC}
19 unit zcmultiobjectcreateundocommand;
20 {$INCLUDE def.inc}
21 interface
22 uses uzbmemman,UGDBOpenArrayOfPV,zeundostack,zebaseundocommands,uzbtypes,
23 gzctnrvectortypes,uzeentity,uzcdrawings;
24
25 {DEFINE TCommand := TGDBMultiCreateCommand}
26 {DEFINE PTCommand := PTGDBMultiCreateCommand}
27 {DEFINE TData := GDBObjOpenArrayOfPV}
28
29
30 type
31 generic TGMultiObjectProcessCommand<_LT> =object(TCustomChangeCommand)
32 DoData,UnDoData:tmethod;
33 ObjArray:_LT;
34 FreeArray:boolean;
35 public
36 constructor Assign(const _dodata,_undodata:tmethod;const objcount:Integer);
37 //procedure StoreUndoData(var _undodata:_T);virtual;
38 procedure AddObject(PObject:PGDBaseObject);virtual;
39
40 procedure UnDo;virtual;
41 procedure Comit;virtual;
42 destructor Done;virtual;
43 end;
44
45 PTGDBMultiCreateCommand=^TGDBMultiCreateCommand;
46 TGDBMultiCreateCommand=specialize TGMultiObjectProcessCommand<GDBObjOpenArrayOfPV>;
47
48
CreateMultiObjectCreateCommandnull49 function CreateMultiObjectCreateCommand(var dodata,undodata:tmethod;objcount:integer):PTGDBMultiCreateCommand;overload;
PushMultiObjectCreateCommandnull50 function PushMultiObjectCreateCommand(var us:TZctnrVectorUndoCommands; var dodata,undodata:tmethod;objcount:integer):PTGDBMultiCreateCommand;overload;
51
52
53 implementation
54 constructor TGMultiObjectProcessCommand.Assign(const _dodata,_undodata:tmethod;const objcount:Integer);
55 begin
56 DoData:=_DoData;
57 UnDoData:=_UnDoData;
58 self.ObjArray.init({$IFDEF DEBUGBUILD}'{108FD060-E408-4161-9548-64EEAFC3BEB2}',{$ENDIF}objcount);
59 FreeArray:={false}true;
60 end;
61 procedure TGMultiObjectProcessCommand.AddObject(PObject:PGDBaseObject);
62 var
63 p:pointer;
64 begin
65 p:=PObject;
66 objarray.PushBackData(P);
67 end;
68 procedure TGMultiObjectProcessCommand.UnDo;
69 type
70 TCangeMethod=procedure(const data:GDBASEOBJECT)of object;
71 //PTMethod=^TMethod;
72 var
73 p:PGDBASEOBJECT;
74 ir:itrec;
75 begin
76 p:=ObjArray.beginiterate(ir);
77 if p<>nil then
78 repeat
79 TCangeMethod(UnDoData)(p^);
80 if FreeArray then
81 PGDBObjEntity(p)^.YouChanged(drawings.GetCurrentDWG^);
82 p:=ObjArray.iterate(ir);
83 until p=nil;
84 FreeArray:=not FreeArray;
85 end;
86 procedure TGMultiObjectProcessCommand.Comit;
87 type
88 TCangeMethod=procedure(const data:GDBASEOBJECT)of object;
89 //PTMethod=^TMethod;
90 var
91 p:PGDBASEOBJECT;
92 ir:itrec;
93 begin
94 p:=ObjArray.beginiterate(ir);
95 if p<>nil then
96 repeat
97 TCangeMethod(DoData)(p^);
98 if FreeArray then
99 PGDBObjEntity(p)^.YouChanged(drawings.GetCurrentDWG^);
100 p:=ObjArray.iterate(ir);
101 until p=nil;
102 FreeArray:=not FreeArray;
103 end;
104 destructor TGMultiObjectProcessCommand.Done;
105 begin
106 inherited;
107 if {not} FreeArray then
108 ObjArray.done
109 else
110 begin
111 ObjArray.clear;
112 ObjArray.done;
113 end;
114 end;
115
116 function {TZctnrVectorUndoCommands.}CreateMultiObjectCreateCommand(var dodata,undodata:tmethod;objcount:integer):PTGDBMultiCreateCommand;overload;
117 begin
118 gdbgetmem({$IFDEF DEBUGBUILD}'{9FE25B12-DEE0-410A-BDCD-7E69A41E4389}',{$ENDIF}result,sizeof(TGDBMultiCreateCommand));
119 result^.Assign(dodata,undodata,objcount);
120 end;
121 function {TZctnrVectorUndoCommands.}PushMultiObjectCreateCommand(var us:TZctnrVectorUndoCommands; var dodata,undodata:tmethod;objcount:integer):PTGDBMultiCreateCommand;overload;
122 begin
123 result:=CreateMultiObjectCreateCommand(dodata,undodata,objcount);
124 us.PushBackData(result);
125 inc(us.CurrentCommand);
126 end;
127
128 end.
129