1 (*----------------------------------------------------------------------------*)
2 (* Copyright (c) 2004-2010 Antrey Zubarev *)
3 (*----------------------------------------------------------------------------*)
4 {
5 @author(Andrey Zubarev <zamtmn@yandex.ru>)
6 }
7 unit uzccablemanager;
8 {$INCLUDE def.inc}
9 interface
10 uses uzcenitiesvariablesextender,uzcvariablesutils,Varman,uzbstrproc,uzcentcable,
11 uzeentdevice,uzeconsts,gzctnrvectorpobjects,languade,gzctnrvectorobjects,
12 gzctnrvectortypes,SysUtils,uzbtypesbase,uzbtypes,varmandef,uzbmemman,uzcdrawings,
13 uzcstrconsts;
14 resourcestring
15 DefCableName='Created. Not named';
16 type
17 {EXPORT+}
18 PTCableDesctiptor=^TCableDesctiptor;
19 TCableDesctiptor={$IFNDEF DELPHI}packed{$ENDIF} object(GDBaseObject)
20 Name:GDBString;
21 Segments:TZctnrVectorPGDBaseObjects; // сборщик всех кабелей с одинаковым именем (ШС..)
22 StartDevice,EndDevice:PGDBObjDevice;
23 StartSegment:PGDBObjCable;
24 Devices:TZctnrVectorPGDBaseObjects;
25 length:GDBDouble;
26 constructor init;
27 destructor done;virtual;
GetObjTypeNamenull28 function GetObjTypeName:GDBString;virtual;
GetObjNamenull29 function GetObjName:GDBString;virtual;
30 end;
31
32 PTCableManager=^TCableManager;
33 TCableManager={$IFNDEF DELPHI}packed{$ENDIF} object(GZVectorObjects<TCableDesctiptor>)(*OpenArrayOfPObj*)
34 constructor init;
35 destructor done;virtual;
36 procedure build;virtual;
FindOrCreatenull37 function FindOrCreate(sname:gdbstring):PTCableDesctiptor;virtual;
Findnull38 function Find(sname:gdbstring):PTCableDesctiptor;virtual;
39 end;
40 {EXPORT-}
41 implementation
TCableDesctiptor.GetObjTypeNamenull42 function TCableDesctiptor.GetObjTypeName;
43 begin
44 result:='TCableDesctiptor';
45 end;
TCableDesctiptor.GetObjNamenull46 function TCableDesctiptor.GetObjName;
47 begin
48 if self.Segments.count=1 then
49 result:=Name
50 else
51 result:=Name+' ('+inttostr(self.Segments.count)+')';
52 end;
53 constructor TCableDesctiptor.init;
54 begin
55 inherited;
56 name:=defcablename;
57 length:=0;
58 Segments.init({$IFDEF DEBUGBUILD}'{FE431793-97FF-48AE-9B55-22D186BD5471}',{$ENDIF}10);
59 Devices.init({$IFDEF DEBUGBUILD}'{7C4DC8CC-F0C0-402A-84F6-6FEA2C06F0C8}',{$ENDIF}10);
60 end;
61 constructor TCableManager.init;
62 begin
63 inherited init({$IFDEF DEBUGBUILD}'{D8494E55-1296-45ED-A5ED-175D6C0671F5}',{$ENDIF}100{,sizeof(TCableDesctiptor)});
64 end;
65 destructor TCableDesctiptor.done;
66 begin
67 name:='';
68 Segments.done;
69 //inherited;
70 end;
71
72 procedure TCableManager.build;
73 var pobj,pobj2:PGDBObjCable;
74 ir,ir2,ir3:itrec;
75 p1,p2:ppointer;
76 tp:pointer;
77 pvn,pvn2:pvardesk;
78 sname:gdbstring;
79 pcd,prevpcd:PTCableDesctiptor;
80 tcd:TCableDesctiptor;
81 itsok:boolean;
82 pnp:PTNodeProp;
83 sorted:boolean;
84 lastadddevice:PGDBObjDevice;
85 pentvarext,pentvarext2:PTVariablesExtender;
86 begin
87 //** Создание списка всех кабелей по их имени + дополнительно собирается длина кабеля
88 pobj:=drawings.GetCurrentROOT.ObjArray.beginiterate(ir); //выбрать первый элемент чертежа
89 if pobj<>nil then
90 repeat //перебор всех элементов чертежа
91 if pobj^.GetObjType=GDBCableID then //работа только с кабелями
92 begin
93 pentvarext:=pobj^.GetExtension(typeof(TVariablesExtender)); //получаем доступ к РТТИ что бы можно было просматривать что на заполнял пользователь
94 //pvn:=PTObjectUnit(pobj^.ou.Instance)^.FindVariable('NMO_Name');
95 pvn:=pentvarext^.entityunit.FindVariable('NMO_Name'); //находим обозначение кабеля (ШС2)
96 if pvn<>nil then
97 sname:=pgdbstring(pvn^.data.Instance)^
98 else
99 sname:=rsNameAbsent;
100 if sname='RS' then
101 sname:=sname;
102 pcd:=FindOrCreate(sname); //поиск или создание нового элемента в списки. Если такое имя в списке есть, то возвращает указатель на него, если нет то создает новый.
103 pcd^.Segments.PushBackData(pobj); //добавляем к сегменту новый кабель
104 //pvn:=PTObjectUnit(pobj^.ou.Instance)^.FindVariable('AmountD');
105 pvn:=pentvarext^.entityunit.FindVariable('AmountD'); //получаем длину кабеля
106 if pvn<>nil then
107 pcd^.length:=pcd^.length+pgdbdouble(pvn^.data.Instance)^; //доюавляем к шлейфу общую длину
108 end;
109 pobj:=drawings.GetCurrentROOT.ObjArray.iterate(ir); //следующий элемент в списке чертежа
110 until pobj=nil;
111
112 pcd:=beginiterate(ir2); //перебираем полученый список разноименных кабелей
113 if pcd<>nil then
114 repeat
115 ///****сортировка внутри кабельного контейнера, по возрастанию сегмента кабеля забитого пользователем ***///
116 if pcd^.Segments.Count>1 then //более одного кабеля с таким именим
117 begin
118 repeat
119 itsok:=true;
120 pobj2:=pcd^.Segments.beginiterate(ir);
121 pentvarext2:=pobj2^.GetExtension(typeof(TVariablesExtender));
122 p2:=pointer(ir.itp);
123 pobj:=pcd^.Segments.iterate(ir);
124 p1:=pointer(ir.itp);
125 if pobj<>nil then
126 repeat
127 pentvarext:=pobj^.GetExtension(typeof(TVariablesExtender));
128 //pvn :=PTObjectUnit(pobj^.ou.Instance)^.FindVariable('CABLE_Segment');
129 //pvn2:=PTObjectUnit(pobj2^.ou.Instance)^.FindVariable('CABLE_Segment');
130 pvn :=pentvarext^.entityunit.FindVariable('CABLE_Segment');
131 pvn2:=pentvarext2^.entityunit.FindVariable('CABLE_Segment');
132 if pgdbinteger(pvn^.data.Instance)^<
133 pgdbinteger(pvn2^.data.Instance)^ then
134 begin
135 tp:=p2^;
136 p2^:=p1^;
137 p1^:=tp;
138 itsok:=false;
139 end
140 else
141 begin
142 pobj2:=pobj;
143 pentvarext2:=pentvarext;
144 end;
145 p2:=p1;
146 pobj:=pcd^.Segments.iterate(ir);
147 if pobj<>nil then
148 p1:=pointer(ir.itp);
149 until pobj=nil;
150 until itsok;
151 end;
152 ///***сортировка закончина***///
153
154 {***Заполнение кабелей, а именно какой кабель какие девайсы подключает с учетом стойков.
155 формирует стартовый девайc и конечный.
156 А так же список всех девайсов на данном шлейфе
157 от себя плохо понял как работает это место***}
158 lastadddevice:=nil; // промежуточная переменная
159 pobj:=pcd^.Segments.beginiterate(ir); // перебераем кабели, одного шлейфа
160 pcd^.StartSegment:=pobj; // присваеваем что это первый кабель
161 pnp:=pobj^.NodePropArray.beginiterate(ir3); // список, устройств подключеных к кабелю.
162 pcd^.StartDevice:=pnp^.DevLink;
163 if pobj<>nil then
164 repeat
165 pnp:=pobj^.NodePropArray.beginiterate(ir3);
166 //pcd^.StartDevice:=pnp^.DevLink;
167 if pnp<>nil then
168 repeat
169 if pnp^.DevLink<>nil then
170 begin
171 if pnp^.DevLink<>lastadddevice then
172 begin
173 pcd^.Devices.PushBackData(pnp^.DevLink);
174 lastadddevice:=pnp^.DevLink;
175 end;
176 if pcd^.EndDevice<>nil then
177 begin
178 pvn :=FindVariableInEnt(pnp^.DevLink,'RiserName');
179 pvn2:=FindVariableInEnt(pcd^.EndDevice,'RiserName');
180 if (pvn<>nil)and(pvn2<>nil)then
181 begin
182 if pstring(pvn^.data.Instance)^=pstring(pvn2^.data.Instance)^ then
183 begin
184 pvn :=FindVariableInEnt(pnp^.DevLink,'Elevation');
185 pvn2:=FindVariableInEnt(pcd^.EndDevice,'Elevation');
186 if (pvn<>nil)and(pvn2<>nil)then
187 begin
188 pcd^.length:=pcd^.length+abs(pgdbdouble(pvn^.data.Instance)^-pgdbdouble(pvn2^.data.Instance)^);
189 end;
190 end;
191 end;
192 end;
193 end;
194 pcd^.EndDevice:=pnp^.DevLink;
195 pnp:=pobj^.NodePropArray.iterate(ir3);
196 until pnp=nil;
197 pobj:=pcd^.Segments.iterate(ir);
198 until pobj=nil;
199 pcd:=iterate(ir2);
200 until pcd=nil;
201 //****************сбор данных заполнения кабелей закончен**********//
202
203 //**********сортировка шлейфов по возврастанию, от ШС1..ШС9,ШС10..ШСх
204 repeat
205 sorted:=false;
206 prevpcd:=beginiterate(ir2);
207 pcd:=iterate(ir2);
208 if (prevpcd<>nil)and(pcd<>nil) then
209 repeat
210 if {CompareNUMSTR}AnsiNaturalCompare(prevpcd^.Name,pcd^.Name)>0 then
211 begin
212 tcd:=prevpcd^;
213 prevpcd^:=pcd^;
214 pcd^:=tcd;
215 sorted:=true;
216 end;
217 prevpcd:=pcd;
218 pcd:=iterate(ir2);
219 until pcd=nil;
220 until not sorted;
221 //*****************сортировка шлейфов окончена*************//
222
223 {pcd:=beginiterate(ir2);
224 if (pcd<>nil) then
225 repeat
226 HistoryOutStr('Cable "'+pcd^.Name+'", segments '+inttostr(pcd^.Segments.Count));
227 pcd:=iterate(ir2);
228 until pcd=nil;}
229 end;
FindOrCreatenull230 function TCableManager.FindOrCreate;
231 var
232 pcd:PTCableDesctiptor;
233 ir:itrec;
234 sn:gdbstring;
235 begin
236 sn:=uppercase(sname);
237 pcd:=beginiterate(ir);
238 if pcd<>nil then
239 repeat
240 if uppercase(pcd^.Name)=sn then
241 system.break;
242 pcd:=iterate(ir);
243 until pcd=nil;
244 if pcd=nil then
245 begin
246 pcd:=pointer(self.CreateObject);
247 pcd^.init;
248 pcd^.name:=sname;
249 end;
250 result:=pcd;
251 end;
252 destructor TCableManager.done;
253 var
254 pcd:PTCableDesctiptor;
255 ir:itrec;
256 begin
257 pcd:=beginiterate(ir);
258 if pcd<>nil then
259 repeat
260 pcd^.Segments.Clear;
261 pcd^.Devices.Clear;
262
263 pcd:=iterate(ir);
264 until pcd=nil;
265 inherited;
266 end;
Findnull267 function TCableManager.Find;
268 var
269 pcd:PTCableDesctiptor;
270 ir:itrec;
271 sn:gdbstring;
272 begin
273 sn:=uppercase(sname);
274 pcd:=beginiterate(ir);
275 if pcd<>nil then
276 repeat
277 if uppercase(pcd^.Name)=sn then
278 system.break;
279 pcd:=iterate(ir);
280 until pcd=nil;
281 result:=pcd;
282 end;
283 begin
284 end.
285