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