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 unit uzcenitiesvariablesextender;
19 {$INCLUDE def.inc}
20 
21 interface
22 uses sysutils,UGDBObjBlockdefArray,uzedrawingdef,uzeentityextender,uzcshared,
23      uzeentdevice,TypeDescriptors,uzetextpreprocessor,UGDBOpenArrayOfByte,
24      uzbtypesbase,uzbtypes,uzeentsubordinated,uzeentity,uzeenttext,uzeblockdef,
25      varmandef,Varman,UUnitManager,URecordDescriptor,UBaseTypeDescriptor,uzbmemman,
26      uzeentitiestree,usimplegenerics,uzeffdxfsupport;
27 
28 type
29 TBaseVariablesExtender={$IFNDEF DELPHI}packed{$ENDIF} object(TBaseEntityExtender)
30   end;
31 PTVariablesExtender=^TVariablesExtender;
32 TVariablesExtender={$IFNDEF DELPHI}packed{$ENDIF} object(TBaseVariablesExtender)
33     entityunit:TObjectUnit;
34     pMainFuncEntity:PGDBObjEntity;
35     DelegatesArray:TEntityArray;
36     pThisEntity:PGDBObjEntity;
CreateEntVariablesExtendernull37     class function CreateEntVariablesExtender(pEntity:Pointer; out ObjSize:Integer):PTVariablesExtender;static;
38     constructor init(pEntity:Pointer);
39     destructor Done;virtual;
40 
41     procedure onEntityClone(pSourceEntity,pDestEntity:pointer);virtual;
42     procedure onEntityBuildVarGeometry(pEntity:pointer;const drawing:TDrawingDef);virtual;
43     procedure onEntitySupportOldVersions(pEntity:pointer;const drawing:TDrawingDef);virtual;
44     procedure CopyExt2Ent(pSourceEntity,pDestEntity:pointer);virtual;
45     procedure ReorganizeEnts(OldEnts2NewEntsMap:TMapPointerToPointer);virtual;
46     procedure PostLoad(var context:TIODXFLoadContext);virtual;
47 
isMainFunctionnull48     function isMainFunction:boolean;
49     procedure addDelegate(pDelegateEntity:PGDBObjEntity;pDelegateEntityVarext:PTVariablesExtender);
50     procedure removeDelegate(pDelegateEntity:PGDBObjEntity;pDelegateEntityVarext:PTVariablesExtender);
51   end;
52 
53 var
54    PFCTTD:GDBPointer=nil;
AddVariablesToEntitynull55 function AddVariablesToEntity(PEnt:PGDBObjEntity):PTVariablesExtender;
56 implementation
isMainFunctionnull57 function TVariablesExtender.isMainFunction:boolean;
58 begin
59   result:=pMainFuncEntity=nil;
60 end;
61 
62 procedure TVariablesExtender.addDelegate(pDelegateEntity:PGDBObjEntity;pDelegateEntityVarext:PTVariablesExtender);
63 begin
64   pDelegateEntityVarext^.entityunit.InterfaceUses.PushBackIfNotPresent(@entityunit);
65   pDelegateEntityVarext^.pMainFuncEntity:=pThisEntity;
66   DelegatesArray.PushBackIfNotPresent(pDelegateEntity);
67 end;
68 procedure TVariablesExtender.removeDelegate(pDelegateEntity:PGDBObjEntity;pDelegateEntityVarext:PTVariablesExtender);
69 begin
70   pDelegateEntityVarext^.entityunit.InterfaceUses.EraseData(@entityunit);
71   pDelegateEntityVarext^.pMainFuncEntity:=nil;
72   DelegatesArray.EraseData(pDelegateEntity)
73 end;
74 
75 procedure TVariablesExtender.onEntitySupportOldVersions(pEntity:pointer;const drawing:TDrawingDef);
76 var
77    vd:vardesk;
78    pvd,pvd2:pvardesk;
79 begin
80                   pvd:=entityunit.FindVariable('DESC_MountingParts');
81                   if pvd<>nil then
82                   begin
83                        //pvd.name;
84                        pvd.username:='Закладная конструкция';
85                        pvd:=entityunit.FindVariable('DESC_MountingDrawing');
86                        if pvd=nil then
87                        begin
88                             entityunit.setvardesc(vd,'DESC_MountingDrawing','Чертеж установки','GDBString');
89                             entityunit.InterfaceVariables.createvariable(vd.name,vd);
90                        end;
91                   end;
92                   pvd:=entityunit.FindVariable('DESC_Function');
93                   if pvd<>nil then
94                   begin
95                        //pvd.name;
96                        pvd.username:='Функция';
97                   end;
98                   pvd:=entityunit.FindVariable('DESC_MountingDrawing');
99                   if pvd<>nil then
100                   begin
101                        //pvd.name;
102                        pvd.username:='Чертеж установки';
103                        pvd2:=entityunit.FindVariable('DESC_MountingPartsType');
104                        if pvd2=nil then
105                        begin
106                             entityunit.setvardesc(vd,'DESC_MountingPartsType','Тип закладной конструкции','GDBString');
107                             entityunit.InterfaceVariables.createvariable(vd.name,vd);
108                        end;
109                        pvd2:=entityunit.FindVariable('DESC_MountingPartsShortName');
110                        if pvd2=nil then
111                        begin
112                             entityunit.setvardesc(vd,'DESC_MountingPartsShortName','Имя закладной конструкции','GDBString');
113                             pvd2:=entityunit.InterfaceVariables.createvariable(vd.name,vd);
114                             pvd2^.data.PTD^.SetValueFromString(pvd2^.data.Instance,pvd^.data.PTD^.GetValueAsString(pvd^.data.Instance));
115                        end;
116                   end;
117 
118                   if entityunit.FindVariable('GC_HeadDevice')<>nil then
119                   if entityunit.FindVariable('GC_Metric')=nil then
120                   begin
121                        entityunit.setvardesc(vd,'GC_Metric','','GDBString');
122                        entityunit.InterfaceVariables.createvariable(vd.name,vd);
123                   end;
124 
125                   if entityunit.FindVariable('GC_HDGroup')<>nil then
126                   if entityunit.FindVariable('GC_HDGroupTemplate')=nil then
127                   begin
128                        entityunit.setvardesc(vd,'GC_HDGroupTemplate','Шаблон группы','GDBString');
129                        entityunit.InterfaceVariables.createvariable(vd.name,vd);
130                   end;
131                   if entityunit.FindVariable('GC_HeadDevice')<>nil then
132                   if entityunit.FindVariable('GC_HeadDeviceTemplate')=nil then
133                   begin
134                        entityunit.setvardesc(vd,'GC_HeadDeviceTemplate','Шаблон головного устройства','GDBString');
135                        entityunit.InterfaceVariables.createvariable(vd.name,vd);
136                   end;
137 
138                   if entityunit.FindVariable('GC_HDShortName')<>nil then
139                   if entityunit.FindVariable('GC_HDShortNameTemplate')=nil then
140                   begin
141                        entityunit.setvardesc(vd,'GC_HDShortNameTemplate','Шаблон короткого имени головного устройства','GDBString');
142                        entityunit.InterfaceVariables.createvariable(vd.name,vd);
143                   end;
144                   if entityunit.FindVariable('GC_Metric')<>nil then
145                   if entityunit.FindVariable('GC_InGroup_Metric')=nil then
146                   begin
147                        entityunit.setvardesc(vd,'GC_InGroup_Metric','Метрика нумерации в группе','GDBString');
148                        entityunit.InterfaceVariables.createvariable(vd.name,vd);
149                   end;
150 end;
AddVariablesToEntitynull151 function AddVariablesToEntity(PEnt:PGDBObjEntity):PTVariablesExtender;
152 var
153     ObjSize:Integer;
154 begin
155      result:=TVariablesExtender.CreateEntVariablesExtender(PEnt,ObjSize);
156      if ObjSize>0 then
157        PEnt^.AddExtension(result,ObjSize);
158 
159 end;
160 constructor TVariablesExtender.init;
161 begin
162      inherited;
163      pThisEntity:=pEntity;
164      entityunit.init('entity');
165      entityunit.InterfaceUses.PushBackData(SysUnit);
166      if PFCTTD=nil then
167                        PFCTTD:=sysunit.TypeName2PTD('PTObjectUnit');
168      pMainFuncEntity:=nil;
169      DelegatesArray.init(10) ;
170      //PGDBObjEntity(pEntity).OU.Instance:=@entityunit;
171      //PGDBObjEntity(pEntity).OU.PTD:=PFCTTD;
172 end;
173 destructor TVariablesExtender.Done;
174 begin
175      entityunit.done;
176      DelegatesArray.Clear;
177      DelegatesArray.done;
178 end;
179 procedure TVariablesExtender.onEntityClone(pSourceEntity,pDestEntity:pointer);
180 var
181     pDestVariablesExtender,pbdunit:PTVariablesExtender;
182 begin
183      pDestVariablesExtender:=PGDBObjEntity(pDestEntity)^.EntExtensions.GetExtension(typeof(TVariablesExtender));
184      if pDestVariablesExtender=nil then
185                        pDestVariablesExtender:=AddVariablesToEntity(pDestEntity);
186      entityunit.CopyTo(@pDestVariablesExtender^.entityunit);
187      if pMainFuncEntity<>nil then begin
188        pbdunit:=pMainFuncEntity^.EntExtensions.GetExtension(typeof(TVariablesExtender));
189        if pbdunit<>nil then
190          pbdunit^.addDelegate(pDestEntity,pDestVariablesExtender);
191      end;
192 end;
193 procedure TVariablesExtender.onEntityBuildVarGeometry(pEntity:pointer;const drawing:TDrawingDef);
194 var
195    pblockdef:PGDBObjBlockdef;
196    pbdunit:PTVariablesExtender;
197 begin
198      pblockdef:=PGDBObjBlockdefArray(drawing.GetBlockDefArraySimple).getDataMutable(PGDBObjDevice(pEntity)^.index);
199      pbdunit:=nil;
200      if assigned(pblockdef^.EntExtensions)then
201      pbdunit:=pblockdef^.EntExtensions.GetExtension(typeof(TVariablesExtender));
202      if pbdunit<>nil then
203        pbdunit^.entityunit.CopyTo(@self.entityunit);
204      //PTObjectUnit(pblockdef^.ou.Instance)^.copyto(PTObjectUnit(ou.Instance));
205 end;
206 procedure TVariablesExtender.CopyExt2Ent(pSourceEntity,pDestEntity:pointer);
207 begin
208      onEntityClone(pSourceEntity,pDestEntity);
209 end;
210 procedure TVariablesExtender.ReorganizeEnts(OldEnts2NewEntsMap:TMapPointerToPointer);
PGDBObjEntitynull211 var CopiedMainfunction:PGDBObjEntity;
212     pbdunit:PTVariablesExtender;
213 begin
214   if pMainFuncEntity<>nil then begin
hennull215     if OldEnts2NewEntsMap.TryGetValue(pMainFuncEntity,CopiedMainfunction)then
216       if CopiedMainfunction<>nil then begin
217         pbdunit:=pMainFuncEntity^.EntExtensions.GetExtension(typeof(TVariablesExtender));
218         if pbdunit<>nil then
219           pbdunit^.removeDelegate(pThisEntity,@self);
220         pbdunit:=CopiedMainfunction^.EntExtensions.GetExtension(typeof(TVariablesExtender));
221         if pbdunit<>nil then
222           pbdunit^.addDelegate(pThisEntity,@self);
223       end;
224   end;
225 end;
226 
227 procedure TVariablesExtender.PostLoad(var context:TIODXFLoadContext);
228 var
229  PMF:PGDBObjEntity;
230  pbdunit:PTVariablesExtender;
231 begin
232   if pThisEntity<>nil then
233     if pThisEntity.PExtAttrib<>nil then
234       if pThisEntity.PExtAttrib^.MainFunctionHandle<>0 then begin
235         if context.h2p.TryGetValue(pThisEntity.PExtAttrib^.MainFunctionHandle,pmf)then begin
236           pbdunit:=pmf^.EntExtensions.GetExtension(typeof(TVariablesExtender));
237           if pbdunit<>nil then
238             pbdunit^.addDelegate(pThisEntity,@self);
239         end;
240       end;
241 end;
242 
TVariablesExtender.CreateEntVariablesExtendernull243 class function TVariablesExtender.CreateEntVariablesExtender(pEntity:Pointer; out ObjSize:Integer):PTVariablesExtender;
244 begin
245      ObjSize:=sizeof(TVariablesExtender);
246      GDBGetMem({$IFDEF DEBUGBUILD}'{30663E63-CA7B-43F7-90C6-5ACAD2061DB6}',{$ENDIF}result,ObjSize);
247      result.init(pentity);
248 end;
249 begin
250 end.
251 
252