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