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