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