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