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
19 unit UGDBSelectedObjArray;
20 {$INCLUDE def.inc}
21 interface
22 uses uzbgeomtypes,uzepalette,uzgldrawcontext,uzecamera,uzeentwithmatrix,uzeentity,
23 UGDBControlPointArray,gzctnrvectordata,sysutils,uzbtypes,uzegeometry,
24 uzbtypesbase,uzbmemman;
25 type
26 {Export+}
27 PSelectedObjDesc=^SelectedObjDesc;
28 SelectedObjDesc=packed record
29 objaddr:PGDBObjEntity;
30 pcontrolpoint:PGDBControlPointArray;
31 ptempobj:PGDBObjEntity;
32 end;
33 PGDBSelectedObjArray=^GDBSelectedObjArray;
34 GDBSelectedObjArray={$IFNDEF DELPHI}packed{$ENDIF} object(GZVectorData{-}<selectedobjdesc>{//})
35 SelectedCount:GDBInteger;
36
addobjectnull37 function addobject(PEntity:PGDBObjEntity):pselectedobjdesc;virtual;
38 procedure free;virtual;
39 procedure remappoints(pcount:TActulity;ScrollMode:GDBBoolean;var camera:GDBObjCamera; ProjectProc:GDBProjectProc;var DC:TDrawContext);virtual;
40 procedure drawpoint(var DC:TDrawContext;const GripSize:GDBInteger; const SelColor,UnSelColor:TRGB);virtual;
41 procedure drawobject(var DC:TDrawContext{infrustumactualy:TActulity;subrender:GDBInteger});virtual;
getnearesttomousenull42 function getnearesttomouse(mx,my:integer):tcontrolpointdist;virtual;
getonlyoutboundnull43 function getonlyoutbound(var DC:TDrawContext):TBoundingBox;
44 procedure selectcurrentcontrolpoint(key:GDBByte;mx,my,h:integer);virtual;
45 procedure selectcontrolpointinframe(f1,f2: GDBvertex2DI);virtual;
46 procedure RenderFeedBack(pcount:TActulity;var camera:GDBObjCamera; ProjectProc:GDBProjectProc;var DC:TDrawContext);virtual;
47 //destructor done;virtual;
48 procedure freeclones;
49 procedure Transform(dispmatr:DMatrix4D);
50 procedure SetRotate(minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
51 procedure SetRotateObj(minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
52 procedure TransformObj(dispmatr:DMatrix4D);
53
54 procedure drawobj(var DC:TDrawContext{infrustumactualy:TActulity;subrender:GDBInteger});virtual;
55 procedure freeelement(PItem:PT);virtual;
56 procedure calcvisible(frustum:cliparray;infrustumactualy:TActulity;visibleactualy:TActulity;var totalobj,infrustumobj:GDBInteger; ProjectProc:GDBProjectProc;const zoom,currentdegradationfactor:GDBDouble);virtual;
57 procedure resprojparam(pcount:TActulity;var camera:GDBObjCamera; ProjectProc:GDBProjectProc;var DC:TDrawContext);
58 end;
59 {EXPORT-}
60 implementation
61 //uses uzedrawingabstract,uzeentgenericsubentry;
62 procedure GDBSelectedObjArray.resprojparam;
63 var tdesc:pselectedobjdesc;
64 i:GDBInteger;
65 begin
66 if count<>0 then
67 begin
68 tdesc:=GetParrayAsPointer;
69 for i:=0 to count-1 do
70 begin
71 //dec(tdesc^.objaddr^.vp.LastCameraPos);
72 tdesc^.objaddr^.Renderfeedback(pcount,camera,ProjectProc,dc);
73 inc(tdesc);
74 end;
75 end;
76 end;
77 procedure GDBSelectedObjArray.freeelement;
78 begin
79 if PSelectedObjDesc(PItem).pcontrolpoint<>nil then
80 begin
81 PSelectedObjDesc(PItem).pcontrolpoint^.Done;
82 gdbfreemem(GDBPointer(PSelectedObjDesc(PItem).pcontrolpoint));
83 end;
84 if PSelectedObjDesc(PItem).ptempobj<>nil then
85 begin
86 PSelectedObjDesc(PItem).ptempobj^.done;
87 gdbfreemem(GDBPointer(PSelectedObjDesc(PItem).ptempobj));
88 end;
89 //PGDBObjBlockdef(p).Entities.ClearAndDone;
90 end;
dummyseldesccomparenull91 function dummyseldesccompare(const a, b: selectedobjdesc):Boolean;
92 begin
93 if a.objaddr=b.objaddr then
94 result:=true
95 else
96 result:=false;
97 end;
98
GDBSelectedObjArray.addobjectnull99 function GDBSelectedObjArray.addobject;
100 var dummyseldesc:selectedobjdesc;
101 i:GDBInteger;
102 begin
103 dummyseldesc.objaddr:=PEntity;
104 dummyseldesc.pcontrolpoint:=nil;
105 dummyseldesc.ptempobj:=nil;
106 i:=PushBackIfNotPresentWithCompareProc(dummyseldesc,dummyseldesccompare);
107 result:=@PArray^[i];
108 {i:=IsDataExistWithCompareProc(dummyseldesc,dummyseldesccompare);
109 if i<0 then
110 begin
111 i:=PushBackData(dummyseldesc);
112 end;
113 result:=@PArray^[i];}
114 end;
115 procedure GDBSelectedObjArray.free;
116 var tdesc:pselectedobjdesc;
117 i:GDBInteger;
118 begin
119 tdesc:=GetParrayAsPointer;
120 if count<>0 then
121 begin
122 for i:=0 to count-1 do
123 begin
124 if tdesc^.pcontrolpoint<>nil then
125 begin
126 tdesc^.pcontrolpoint^.done;
127 GDBFreeMem(GDBPointer(tdesc^.pcontrolpoint));
128 end;
129 if tdesc^.ptempobj<>nil then
130 begin
131 tdesc^.ptempobj^.done;
132 GDBFreeMem(GDBPointer(tdesc^.ptempobj));
133 end;
134 inc(tdesc);
135 end;
136 end;
137 clear;
138 end;
139 procedure GDBSelectedObjArray.drawpoint;
140 var tdesc:pselectedobjdesc;
141 i:GDBInteger;
142 begin
143 if count<>0 then
144 begin
145 tdesc:=GetParrayAsPointer;
146 dc.drawer.SetPointSize(GripSize);
147 for i:=0 to count-1 do
148 begin
149 if tdesc^.pcontrolpoint<>nil then
150 begin
151 tdesc^.pcontrolpoint^.draw(dc,SelColor,UnSelColor);
152 end;
153 inc(tdesc);
154 end;
155 dc.drawer.SetPointSize(1);
156 end;
157 end;
158 procedure GDBSelectedObjArray.RenderFeedBack;
159 var tdesc:pselectedobjdesc;
160 i:GDBInteger;
161 begin
162 if count<>0 then
163 begin
164 tdesc:=GetParrayAsPointer;
165 for i:=0 to count-1 do
166 begin
167 if tdesc^.objaddr<>nil then
168 begin
169 tdesc^.objaddr^.RenderFeedbackIFNeed(pcount,camera,ProjectProc,dc);
170 end;
171 if tdesc^.ptempobj<>nil then
172 begin
173 tdesc^.ptempobj^.RenderFeedbackIFNeed(pcount,camera,ProjectProc,dc);
174 end;
175 inc(tdesc);
176 end;
177 end;
178 end;procedure GDBSelectedObjArray.drawobject;
179 var tdesc:pselectedobjdesc;
180 i:GDBInteger;
181 begin
182 if count<>0 then
183 begin
184 tdesc:=GetParrayAsPointer;
185 for i:=0 to count-1 do
186 begin
187 if tdesc^.objaddr<>nil then
188 begin
189 tdesc^.objaddr^.DrawWithOutAttrib({infrustumactualy,}dc{subrender}); //DrawGeometry(tdesc^.objaddr^.CalculateLineWeight);
190 end;
191 inc(tdesc);
192 end;
193 end;
194 end;
195 procedure GDBSelectedObjArray.remappoints;
196 var tdesc:pselectedobjdesc;
197 i:GDBInteger;
198 begin
199 if count<>0 then
200 begin
201 tdesc:=GetParrayAsPointer;
202 for i:=0 to count-1 do
203 begin
204 if tdesc^.pcontrolpoint<>nil then
205 begin
206 tdesc^.objaddr^.remapcontrolpoints(tdesc^.pcontrolpoint,pcount,ScrollMode,camera,ProjectProc,dc);
207 end;
208 inc(tdesc);
209 end;
210 end;
211 end;
GDBSelectedObjArray.getnearesttomousenull212 function GDBSelectedObjArray.getnearesttomouse;
213 var i: GDBInteger;
214 // d: GDBDouble;
215 td:tcontrolpointdist;
216 tdesc:pselectedobjdesc;
217 begin
218 td.pcontrolpoint := nil;
219 td.disttomouse:=9999;
220 if count > 0 then
221 begin
222 tdesc:=GetParrayAsPointer;
223 for i := 0 to count - 1 do
224 begin
225 if tdesc^.pcontrolpoint<>nil then tdesc^.pcontrolpoint^.getnearesttomouse(td,mx,my);
226 inc(tdesc);
227 end;
228 end;
229 result:=td;
230 end;
231
232 (*procedure processobject(pobj:PGDBObjEntity;minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
233 var i: GDBInteger;
234 m,m2,oplus,ominus:DMatrix4D;
235 tv,P_insert_in_OCS,P_insert_in_WCS:gdbvertex;
236 begin
237 pobj^.Transform(minusd);
238
239 //1) Делаем M единичной
240 m:=onematrix;
241 //2) Сдвигаем в начало координат. Для этого выдираем из матрицы объекта элементы
242 //отвечающие за смещение, и строим на них матрицу сдвига в начало координат - minus
243 //и вторую, для сдвига обратно - plus.Умножаем М на матрицу сдвига в начало системы
244 m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
245 P_insert_in_OCS:=PGDBVertex(@m[3])^;
246 ominus:=uzegeometry.CreateTranslationMatrix(uzegeometry.MinusVertex(P_insert_in_OCS));
247 oplus:=uzegeometry.CreateTranslationMatrix(P_insert_in_OCS);
248 m:=uzegeometry.MatrixMultiply(m,ominus);
249
250 //3) Выравниваем оси по глобальной СКО. Берем матрицу из объекта Mobj и удаляем
251 //у нее элементы сдвига, потом инвертируем (или транспонируем, для матриц
252 //вращения это одно и то же). M = M*Mobj_inv
253 m2:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
254 PGDBVertex(@m2[3])^:=nulvertex;
255 matrixinvert(m2);
256 m:=uzegeometry.MatrixMultiply(m,m2);
257
258 //4) Выравниваем оси по СКО приемника. Выдираем матрицу из приемника - Mdest,
259 //обнуляем ей элементы сдвига и умножаем на M: M = M*Mdest
260 m:=uzegeometry.MatrixMultiply(m,rm);
261
262 //5) Двигаем объект обратно. M = M*plus
263 m:=uzegeometry.MatrixMultiply(m,oplus);
264
265
266 //6) Двигаем объект в точку крепежа на приемнике. Составляем матрицу сдвига
267 //Мpick на основе вектора Vpick - Vobj (точка крепежа минус положение объекта).
268 //M = M*Mpck.
269 //7) Двигаем объект с учетом смещения точки крепежа исходного объекта внутри
270 //его локальной системы координат. Ну думаю сообразишь.
271
272 pobj^.Transform(m);
273
274 pobj^.Transform(plusd);
275 PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;
276 PGDBObjWithMatrix(pobj)^.Format;
277 end;
278
279 *)
280 procedure processobject(pobj:PGDBObjEntity;minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
281 var //i: GDBInteger;
282 m{,oplus,ominus}:DMatrix4D;
283 {tv,}P_insert_in_OCS,P_insert_in_WCS:gdbvertex;
284 begin
285 pobj^.Transform(minusd);
286
287 m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
288 P_insert_in_OCS:=PGDBVertex(@m[3])^;
289 PGDBVertex(@m[3])^:=nulvertex;
290 matrixinvert(m);
291 P_insert_in_WCS:=VectorTransform3D(P_insert_in_OCS,m);
292 m:=onematrix;
293 PGDBVertex(@m[3])^:=P_insert_in_wCS;
294 PGDBObjWithMatrix(pobj)^.ObjMatrix:=m;
295 pobj^.Transform(rm);
296
297 pobj^.Transform(plusd);
298 PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;
299 //PGDBObjWithMatrix(pobj)^.FormatEntity(gdb.GetCurrentDWG^);
300 end;
301
302 (*procedure processobject(pobj:PGDBObjEntity;minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
303 var i: GDBInteger;
304 // d: GDBDouble;
305 // td:tcontrolpointdist;
306 m,m2,oplus,ominus:DMatrix4D;
307 tv:gdbvertex;
308 l1,l2:GDBObj2dprop;
309 {
310 pobj^.Transform(minusd);
311 m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
312 PGDBVertex(@m[3])^:=nulvertex;
313 matrixinvert(m);
314 pobj^.Transform(m);
315 pobj^.Transform(rm);
316 pobj^.Transform(plusd);
317 PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;
318 PGDBObjWithMatrix(pobj)^.Format;
319 }
320 begin
321 l1:=PGDBObjWithLocalCS(pobj)^.Local;
322 m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
323 pobj^.Transform({minusd}onematrix);
324 l2:=PGDBObjWithLocalCS(pobj)^.Local;
325 //m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
326 //PGDBVertex(@m[3])^:=nulvertex;
327 //matrixinvert(m);
328 //pobj^.Transform(m);
329 //pobj^.Transform(rm);
330 pobj^.Transform({plusd}onematrix);
331 m2:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
332 l2:=PGDBObjWithLocalCS(pobj)^.Local;
333 //PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;
334 m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
335 PGDBObjWithMatrix(pobj)^.Format;
336 m2:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
337 {pobj^.Transform(minusd);
338 m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;
339 tv:=vectortransform3d(nulvertex,m);
340 oplus:=uzegeometry.CreateTranslationMatrix(tv);
341 ominus:=uzegeometry.CreateTranslationMatrix(createvertex(-tv.x,-tv.y,-tv.z));
342 PGDBVertex(@m[3])^:=nulvertex;
343 matrixinvert(m);
344 PGDBObjWithMatrix(pobj)^.ObjMatrix:=onematrix;
345 //pobj^.Transform(m);
346 pobj^.Transform(oplus);
347 pobj^.Transform(rm);
348 pobj^.Transform(plusd);
349 PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;
350 PGDBObjWithMatrix(pobj)^.Format;}
351 end;
352 *)
353 procedure GDBSelectedObjArray.SetRotate(minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
354 var i: GDBInteger;
355 // d: GDBDouble;
356 // td:tcontrolpointdist;
357 tdesc:pselectedobjdesc;
358 //m,oplus:DMatrix4D;
359 //tv:gdbvertex;
360 begin
361 if count > 0 then
362 begin
363 tdesc:=GetParrayAsPointer;
364 for i := 0 to count - 1 do
365 begin
366 if tdesc^.pcontrolpoint<>nil then
367 if tdesc^.pcontrolpoint^.SelectedCount<>0 then
368 begin
369 processobject(tdesc^.ptempobj,minusd,plusd,rm,x,y,z);
370 end;
371 inc(tdesc);
372 end;
373 end;
374 {if save then
375 gdb.GetCurrentROOT.FormatAfterEdit;}
376 end;
377 procedure GDBSelectedObjArray.SetRotateObj(minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
378 var i: GDBInteger;
379 // d: GDBDouble;
380 // td:tcontrolpointdist;
381 tdesc:pselectedobjdesc;
382 //m,tempm,oplus,ominus:DMatrix4D;
383 //tv:gdbvertex;
384 begin
385 if count > 0 then
386 begin
387 tdesc:=GetParrayAsPointer;
388 for i := 0 to count - 1 do
389 begin
390 if tdesc^.pcontrolpoint<>nil then
391 //if tdesc^.pcontrolpoint^.SelectedCount<>0 then
392 begin
393 processobject(tdesc^.objaddr,minusd,plusd,rm,x,y,z);
394 {tdesc^.objaddr^.Transform(minusd);
395 m:=PGDBObjWithMatrix(tdesc^.objaddr)^.ObjMatrix;
396 PGDBVertex(@m[3])^:=nulvertex;
397 matrixinvert(m);
398 tdesc^.objaddr^.Transform(m);
399 tdesc^.objaddr^.Transform(rm);
400 tdesc^.objaddr^.Transform(plusd);
401 PGDBObjWithMatrix(tdesc^.objaddr)^.ReCalcFromObjMatrix;
402 PGDBObjWithMatrix(tdesc^.objaddr)^.Format;}
403 end;
404 inc(tdesc);
405 end;
406 end;
407 {if save then
408 gdb.GetCurrentROOT.FormatAfterEdit;}
409 end;
410
411 procedure GDBSelectedObjArray.Transform(dispmatr:DMatrix4D);
412 var i: GDBInteger;
413 // d: GDBDouble;
414 // td:tcontrolpointdist;
415 tdesc:pselectedobjdesc;
416 begin
417 if count > 0 then
418 begin
419 tdesc:=GetParrayAsPointer;
420 for i := 0 to count - 1 do
421 begin
422 if tdesc^.pcontrolpoint<>nil then
423 if tdesc^.pcontrolpoint^.SelectedCount<>0 then
424 begin
425 tdesc^.ptempobj^.Transform(dispmatr);
426 //tdesc^.ptempobj^.Format;
427
428 //tdesc^.objaddr^.Transform{At}(dispmatr);
429 //tdesc^.objaddr^.Format;
430 //gdb.rtmodify(tdesc^.objaddr,tdesc,dist,wc,save);
431 end;
432 inc(tdesc);
433 end;
434 end;
435 {if save then
436 gdb.GetCurrentROOT.FormatAfterEdit;}
437 end;
438 procedure GDBSelectedObjArray.TransformObj(dispmatr:DMatrix4D);
439 var i: GDBInteger;
440 tdesc:pselectedobjdesc;
441 begin
442 if count > 0 then
443 begin
444 tdesc:=GetParrayAsPointer;
445 for i := 0 to count - 1 do
446 begin
447 if tdesc^.pcontrolpoint<>nil then
448 //if tdesc^.pcontrolpoint^.SelectedCount<>0 then
449 begin
450 tdesc^.objaddr^.Transform(dispmatr);
451 //tdesc^.objaddr^.Format;
452
453 //tdesc^.objaddr^.Transform{At}(dispmatr);
454 //tdesc^.objaddr^.Format;
455 //gdb.rtmodify(tdesc^.objaddr,tdesc,dist,wc,save);
456 end;
457 inc(tdesc);
458 end;
459 end;
460 {if save then
461 gdb.GetCurrentROOT.FormatAfterEdit;}
462 end;
463 procedure GDBSelectedObjArray.freeclones;
464 var i: GDBInteger;
465 // d: GDBDouble;
466 // td:tcontrolpointdist;
467 tdesc:pselectedobjdesc;
468 begin
469 if count > 0 then
470 begin
471 tdesc:=GetParrayAsPointer;
472 for i := 0 to count - 1 do
473 begin
474 if tdesc^.ptempobj<>nil then
475 begin
476 tdesc^.ptempobj^.done;
477 GDBFreeMem(GDBPointer(tdesc^.ptempobj));
478 tdesc^.ptempobj:=nil;
479 end;
480 inc(tdesc);
481 end;
482 end;
483 end;
484
485 procedure GDBSelectedObjArray.calcvisible;
486 {var
487 p:pGDBObjEntity;
488 q:GDBBoolean;}
489 var i: GDBInteger;
490 // d: GDBDouble;
491 // td:tcontrolpointdist;
492 tdesc:pselectedobjdesc;
493 begin
494 {result:=false;
495 p:=beginiterate;
496 if p<>nil then
497 repeat
498 q:=p^.calcvisible;
499 result:=result or q;
500 p:=iterate;
501 until p=nil;}
502 if count > 0 then
503 begin
504 tdesc:=GetParrayAsPointer;
505 for i := 0 to count - 1 do
506 begin
507 if tdesc^.ptempobj<>nil then
508 begin
509 //tdesc^.ptempobj^.getoutbound;
510 tdesc^.ptempobj^.calcvisible(frustum,infrustumactualy,visibleactualy,totalobj,infrustumobj, ProjectProc,zoom,currentdegradationfactor);
511 end;
512 inc(tdesc);
513 end;
514 end;
515
516 end;
GDBSelectedObjArray.getonlyoutboundnull517 function GDBSelectedObjArray.getonlyoutbound(var DC:TDrawContext):TBoundingBox;
518 var
519 i: GDBInteger;
520 tdesc:pselectedobjdesc;
521 begin
522 if count > 0 then
523 begin
524 tdesc:=GetParrayAsPointer;
525 tdesc^.objaddr^.getonlyoutbound(dc);
526 result:=tdesc^.objaddr^.vp.BoundingBox;
527 inc(tdesc);
528 for i := 1 to count - 1 do
529 begin
530 if tdesc^.objaddr<>nil then
531 begin
532 tdesc^.objaddr^.getonlyoutbound(dc);
533 concatbb(result,tdesc^.objaddr^.vp.BoundingBox);
534 end;
535 inc(tdesc);
536 end;
537 end
538 else
539 begin
540 result.LBN:=NulVertex;
541 result.RTF:=NulVertex;
542 end;
543
544 end;
545 procedure GDBSelectedObjArray.drawobj;
546 var i: GDBInteger;
547 // d: GDBDouble;
548 // td:tcontrolpointdist;
549 tdesc:pselectedobjdesc;
550 begin
551 if count > 0 then
552 begin
553 tdesc:=GetParrayAsPointer;
554 for i := 0 to count - 1 do
555 begin
556 if tdesc^.ptempobj<>nil then
557 tdesc^.ptempobj^.DrawWithAttrib({infrustumactualy,subrender}dc);
558 inc(tdesc);
559 end;
560 end;
561
562 end;
563 procedure GDBSelectedObjArray.selectcontrolpointinframe(f1,f2: GDBvertex2DI);
564 var i: GDBInteger;
565 tdesc:pselectedobjdesc;
566 begin
567 if count > 0 then
568 begin
569 tdesc:=GetParrayAsPointer;
570 for i := 0 to count - 1 do
571 begin
572 if tdesc^.pcontrolpoint<>nil then
573 tdesc^.pcontrolpoint^.selectcontrolpointinframe(f1,f2);
574 inc(tdesc);
575 end;
576 end;
577
578 end;
579 procedure GDBSelectedObjArray.selectcurrentcontrolpoint;
580 var i: GDBInteger;
581 // d: GDBDouble;
582 //td:tcontrolpointdist;
583 tdesc:pselectedobjdesc;
584 begin
585 //td.pcontrolpoint := nil;
586 //td.disttomouse:=9999;
587 SelectedCount:=0;
588 if count > 0 then
589 begin
590 tdesc:=GetParrayAsPointer;
591 for i := 0 to count - 1 do
592 begin
593 if tdesc^.pcontrolpoint<>nil then tdesc^.pcontrolpoint^.selectcurrentcontrolpoint(key,mx,my,h);
594 SelectedCount:=SelectedCount+tdesc^.pcontrolpoint^.SelectedCount;
595 inc(tdesc);
596 end;
597 end;
598 end;
599 {destructor GDBSelectedObjArray.done;
600 begin
601 if pa then
602
603 GDBFreeMem(PArray);
604 end;}
605 begin
606 end.
607