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 uzccommand_move;
20 {$INCLUDE def.inc}
21 
22 interface
23 uses
24   gzctnrvector,zcmultiobjectchangeundocommand,
25   gzctnrvectortypes,zcmultiobjectcreateundocommand,uzgldrawercanvas,
26   uzcoimultiobjects,uzcdrawing,uzepalette,
27   uzgldrawcontext,
28   uzeentpoint,uzeentityfactory,
29   uzedrawingsimple,uzcsysvars,uzcstrconsts,uzccomdrawdase,
30   printers,graphics,uzeentdevice,
31   LazUTF8,Clipbrd,LCLType,classes,uzeenttext,
32   uzccommandsabstract,uzbstrproc,
33   uzbtypesbase,uzccommandsmanager,uzccombase,
34   uzccommandsimpl,
35   uzbtypes,
36   uzcdrawings,
37   uzeutils,uzcutils,
38   sysutils,
39   varmandef,
40   uzglviewareadata,
41   uzeffdxf,
42   uzcinterface,
43   uzegeometry,
44   uzbmemman,
45   uzeconsts,
46   uzbgeomtypes,uzeentity,uzeentcircle,uzeentline,uzeentgenericsubentry,uzeentmtext,
47   uzcshared,uzeentsubordinated,uzeentblockinsert,uzeentpolyline,uzclog,gzctnrvectordata,
48   uzeentlwpolyline,UBaseTypeDescriptor,uzeblockdef,Varman,URecordDescriptor,TypeDescriptors,UGDBVisibleTreeArray
49   ,uzelongprocesssupport,LazLogger;
50 type
51 {EXPORT+}
52   PTCopyObjectDesc=^TCopyObjectDesc;
53   TCopyObjectDesc=packed record
54                  sourceEnt,tmpProxy,copyEnt:PGDBObjEntity;
55                  end;
56   ptpcoavector=^tpcoavector;
57   tpcoavector={-}specialize{//}
58               GZVectorData{-}<TCopyObjectDesc>{//};
59   move_com = {$IFNDEF DELPHI}packed{$ENDIF} object(CommandRTEdObject)
60     t3dp: gdbvertex;
61     pcoa:ptpcoavector;
62     //constructor init;
63     procedure CommandStart(Operands:TCommandOperands); virtual;
64     procedure CommandCancel; virtual;
BeforeClicknull65     function BeforeClick(wc: GDBvertex; mc: GDBvertex2DI; var button: GDBByte;osp:pos_record): GDBInteger; virtual;
AfterClicknull66     function AfterClick(wc: GDBvertex; mc: GDBvertex2DI; var button: GDBByte;osp:pos_record): GDBInteger; virtual;
CalcTransformMatrixnull67     function CalcTransformMatrix(p1,p2: GDBvertex):DMatrix4D; virtual;
Movenull68     function Move(dispmatr:DMatrix4D;UndoMaker:GDBString): GDBInteger;
69     procedure showprompt(mklick:integer);virtual;
70   end;
71 {EXPORT-}
72 var
73    move:move_com;
74 implementation
75 {constructor Move_com.init;
76 begin
77   CommandInit;
78   CommandName := 'Move';
79   CommandGDBString := '';
80 end;}
81 procedure Move_com.showprompt(mklick:integer);
82 begin
83      case mklick of
84      0:ZCMsgCallBackInterface.TextMessage(rscmBasePoint,TMWOHistoryOut);
85      1:ZCMsgCallBackInterface.TextMessage(rscmNewBasePoint,TMWOHistoryOut);
86      end;
87 end;
88 
89 procedure Move_com.CommandStart(Operands:TCommandOperands);
90 var //i: GDBInteger;
91   tv,pobj: pGDBObjEntity;
92       ir:itrec;
93       counter:integer;
94       tcd:TCopyObjectDesc;
95       dc:TDrawContext;
96 begin
97   //self.savemousemode:=drawings.GetCurrentDWG^.wa.param.md.mode;
98   Inherited;
99   counter:=0;
100 
101   pobj:=drawings.GetCurrentROOT^.ObjArray.beginiterate(ir);
102   if pobj<>nil then
103   repeat
104     if pobj^.selected then
105     inc(counter);
106   pobj:=drawings.GetCurrentROOT^.ObjArray.iterate(ir);
107   until pobj=nil;
108 
109 
110   if counter>0 then
111   begin
112   inherited CommandStart('');
113   drawings.GetCurrentDWG^.wa.SetMouseMode((MGet3DPoint) or (MMoveCamera) or (MRotateCamera));
114   showprompt(0);
115    dc:=drawings.GetCurrentDWG^.CreateDrawingRC;
116    GDBGetMem({$IFDEF DEBUGBUILD}'{7702D93A-064E-4935-BFB5-DFDDBAFF9A93}',{$ENDIF}GDBPointer(pcoa),sizeof(tpcoavector));
117    pcoa^.init({$IFDEF DEBUGBUILD}'{379DC609-F39E-42E5-8E79-6D15F8630061}',{$ENDIF}counter{,sizeof(TCopyObjectDesc)});
118    pobj:=drawings.GetCurrentROOT^.ObjArray.beginiterate(ir);
119    if pobj<>nil then
120    repeat
121           begin
122               if pobj^.selected then
123               begin
124                 tv := pobj^.Clone({drawings.GetCurrentROOT}@drawings.GetCurrentDWG^.ConstructObjRoot);
125                 if tv<>nil then
126                 begin
127                     drawings.GetCurrentDWG^.ConstructObjRoot.ObjArray.AddPEntity(tv^);
128                     tcd.sourceEnt:=pobj;
129                     tcd.tmpProxy:=tv;
130                     tcd.copyEnt:=nil;
131                     pcoa^.PushBackData(tcd);
132                     tv^.formatentity(drawings.GetCurrentDWG^,dc);
133                 end;
134               end;
135           end;
136           pobj:=drawings.GetCurrentROOT^.ObjArray.iterate(ir);
137    until pobj=nil
138   end
139   else
140   begin
141     ZCMsgCallBackInterface.TextMessage(rscmSelEntBeforeComm,TMWOHistoryOut);
142     Commandmanager.executecommandend;
143   end;
144 end;
145 
146 procedure Move_com.CommandCancel;
147 begin
148      if pcoa<>nil then
149      begin
150           pcoa^.done;
151           drawings.GetCurrentDWG^.ConstructObjRoot.ObjArray.free;
152           GDBFreemem(pointer(pcoa));
153      end;
154      inherited;
155 end;
156 
Move_com.BeforeClicknull157 function Move_com.BeforeClick(wc: GDBvertex; mc: GDBvertex2DI; var button: GDBByte;osp:pos_record): GDBInteger;
158 //var i: GDBInteger;
159 //  tv,pobj: pGDBObjEntity;
160  //     ir:itrec;
161 begin
162   t3dp:=wc;
163   result:=0;
164   if (button and MZW_LBUTTON)<>0 then
165                                      showprompt(1);
166 end;
Move_com.CalcTransformMatrixnull167 function Move_com.CalcTransformMatrix(p1,p2: GDBvertex):DMatrix4D;
168 var
169     dist:gdbvertex;
170 begin
171         dist:=uzegeometry.VertexSub(p2,p1);
172         result:=uzegeometry.CreateTranslationMatrix(dist);
173 end;
Move_com.Movenull174 function Move_com.Move(dispmatr:DMatrix4D;UndoMaker:GDBString): GDBInteger;
175 var
176     //dist:gdbvertex;
177     im:DMatrix4D;
178     ir:itrec;
179     pcd:PTCopyObjectDesc;
180     m:tmethod;
181     dc:TDrawContext;
182 begin
183     im:=dispmatr;
184     uzegeometry.MatrixInvert(im);
185     PTZCADDrawing(drawings.GetCurrentDWG)^.UndoStack.PushStartMarker(UndoMaker);
186     dc:=drawings.GetCurrentDWG^.CreateDrawingRC;
187     with PushCreateTGMultiObjectChangeCommand(PTZCADDrawing(drawings.GetCurrentDWG)^.UndoStack,dispmatr,im,pcoa^.Count)^ do
188     begin
189      pcd:=pcoa^.beginiterate(ir);
190    if pcd<>nil then
191    repeat
192         m:=tmethod(@pcd^.sourceEnt^.Transform);
193         (*m.Data:=pcd^.sourceEnt;
194         m.Code:={pointer}(@pcd^.sourceEnt^.Transform);*)
195         AddMethod(m);
196 
197         dec(pcd^.sourceEnt^.vp.LastCameraPos);
198         pcd^.sourceEnt^.Formatentity(drawings.GetCurrentDWG^,dc);
199 
200         pcd:=pcoa^.iterate(ir);
201    until pcd=nil;
202    comit;
203    end;
204    PTZCADDrawing(drawings.GetCurrentDWG)^.UndoStack.PushEndMarker;
205    result:=cmd_ok;
206 end;
Move_com.AfterClicknull207 function Move_com.AfterClick(wc: GDBvertex; mc: GDBvertex2DI; var button: GDBByte;osp:pos_record): GDBInteger;
208 var //i:GDBInteger;
209     //dist:gdbvertex;
210     dispmatr{,im}:DMatrix4D;
211     //ir:itrec;
212     //pcd:PTCopyObjectDesc;
213     //m:tmethod;
214     dc:TDrawContext;
215 begin
216       dispmatr:=CalcTransformMatrix(t3dp,wc);
217       drawings.GetCurrentDWG^.ConstructObjRoot.ObjMatrix:=dispmatr;
218       dc:=drawings.GetCurrentDWG^.CreateDrawingRC;
219   if (button and MZW_LBUTTON)<>0 then
220   begin
221    move(dispmatr,self.CommandName);
222 
223    drawings.GetCurrentDWG^.ConstructObjRoot.ObjMatrix:=onematrix;
224    drawings.GetCurrentDWG^.ConstructObjRoot.ObjArray.free;
225    drawings.GetCurrentROOT^.FormatAfterEdit(drawings.GetCurrentDWG^,dc);
226 
227    commandmanager.executecommandend;
228   end;
229   result:=cmd_ok;
230 end;
231 procedure startup;
232 begin
233   move.init('Move',0,0);
234 end;
235 procedure Finalize;
236 begin
237 end;
238 initialization
239   startup;
240 finalization
241   debugln('{I}[UnitsFinalization] Unit "',{$INCLUDE %FILE%},'" finalization');
242   finalize;
243 end.
244