Доброго времени суток, уважаемая техподдержка.
Мне необходимо скопировать контур обратного трубопровода из слоя Теплоснабжения в слой Расчеты для последующего проведения теплогидравлических расчетов в ZuluThermo. Я поиском пути выделяю обратный трубопровод, затем поэлементно копирую его в слой Расчеты, предварительно контролируя наличие каждого элемента в слое Расчеты(для исключения дублей, если программу запустить 2 и более раз). Вот код на дельфи, который это делает
// поставить флаги на котельных
keys := LayerTeplo.ElementKeys.SelectByType(1, 0);
for i := 1 to keys.Count do
LayerTeplo.NetworkTools.AddFlag(keys.Item[i]);
// найти вспомогательные участки
keys := LayerTeplo.ElementKeys.SelectByType(13, 0);
// отметить на них узлы и поставить на них флаги
for i := 1 to keys.Count do
begin
eles := LayerTeplo.GetIncidentElements(keys[i],eIncidentAll);
for j := 1 to eles.Count do
if eles[j].Get_type_().Name = 'Узел' then
LayerTeplo.NetworkTools.AddFlag(eles[j].Key);
end;
// найти закрытые задвижки
keys := LayerTeplo.ElementKeys.SelectByType(5, 2);
// если задвижка относится к обратному трубопроводу, то поставить на ней флаг
for i := 1 to keys.Count do
begin
eles := LayerTeplo.GetIncidentElements(keys[i],eIncidentAll);
for j := 1 to eles.Count do
if eles[j].Get_type_().Name <> 'Участок ТС. Обратный трубопровод' then
break
else
begin
LayerTeplo.NetworkTools.AddFlag(keys.Item[i]);
break;
end;
end;
// найти связаные против направления
LayerTeplo.NetworkTools.FindUpStream();
// копировать обратный трубопровод в слой Расчеты
keys := LayerTeplo.NetworkTools.Results;
for i := 1 to keys.Count do
begin
elTeplo := LayerTeplo.Elements.Item[keys[i]];
if elTeplo.TypeID = -1 then continue;
elTeplo.GetXY(X,Y);
ID := LayerCalc.ElemIDByXY(X,Y);
if ID > 0 then // на этом месте в слое расчеты уже что-то есть
begin
elCalc := LayerCalc.Elements.Item[ID];
if elCalc.TypeID = -1 then continue;
if elTeplo.Get_type_.Name <> elCalc.Get_type_.Name then // элемент другого типа
LayerCalc.AddElement(elTeplo); // добавить элемент в слой расчеты
end
else
LayerCalc.AddElement(elTeplo); // ничего нет.. добавить элемент
end;
MapCtrl1.Redraw();
Тут возникает одна проблема. Некоторые элементы в слоях Теплоснабжение и Расчеты имеют разные идентификаторы типов(TypeID). А при добавлении элемента(LayerCalc.AddElement(elTeplo)) сохраняется "родной" TypeID, ну соответственно, в коде elCalc.Get_type_.Name возникает исключение... Как побороть эту ситуацию??? Может быть вы посоветуете более быстрый способ копирования, чем копировать каждый элемент в отдельности? Можно ли скопировать сразу группу, но при этом исключались бы дубли при повторном запуске программы?? Заранее благодарен.