RUS  ENG 

Копирование элементов из слоя в слой

Страницы: 1
RSS
Копирование элементов из слоя в слой
 
Доброго времени суток, уважаемая техподдержка.
Мне необходимо скопировать контур обратного трубопровода из слоя Теплоснабжения в слой Расчеты для последующего проведения теплогидравлических расчетов в 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 возникает исключение... Как побороть эту ситуацию??? Может быть вы посоветуете более быстрый способ копирования, чем копировать каждый элемент в отдельности? Можно ли скопировать сразу группу, но при этом исключались бы дубли при повторном запуске программы?? Заранее благодарен.
 
Да и забыл написать.. Используем версию 6
 
И еще дополнение.. Почему-то вариант, описанный в моих предыдущих постах пересал работать. Т.е. когда делаю найти связанные против направления раньше выдавал только обратный трубопровод, теперь почему-то начал через потребителей, ЦТП и другие объекты, где прямой трубопровод соединяется с обратным, выдавать и прямой.. Пробовал на потребителях и ЦТП ставить режим ОТКЛЮЧЕНО - не помогло. Не могу разобраться из-за чего так получилось.. Помогите пожалуйста..
 
Если типы в исходном слое и слое для записи не совпадают, то AddElement нехорошо использовать. Метод подразумевает, что содержимое добавляемого элемента не содержит конфликтов. Можно проверку сделать, но тогда метод просто не запишет, в случае конфликта типов.
 
Вообще мы версию 6 давно не трогаем, в последнее время радикально в ней ничего измениться было не должно. Без конкретного примера, не видя сети, сложно сказать, что перестало работать. На потребителях и ЦТП ставить режим "отключено" бесполезно, т.к. они не являются отсекающими устройствами. Попробуйте не программно, а из Zulu выполнить ту же операцию. Если она по-вашему неверно работает, пришлите данные, посмотрим.
 
Спасибо за ответ.
С задачей немного разобрался.. Я перед копированием стал менять тип и режим(если это необходимо). Это работает. У меня еще вопрос..Как выполнить копирование группы элементов из одного слоя в другой из программы используя объектную модель? Т.е. то, что из среды Зулу, выполняется командой Карта->Группа->Записать.
 
Dim L As Layer
'Копируем выделенные объекты текущего слоя в новый слой
'Флаг 80000000 означает копировать только выделенные объекты
L.CopyLayer NewName, NewUserName, &H80000000
 
Спасибо за ответ.. Работает, но такое ощущение, что данный метод заново создает слой, т.к. предыдущее содержимое слоя, в который необходимо скопировать, исчезает... Кроме этого, копируется и структура исходного слоя..
 
Тогда используйте свойство Selection у слоя
 
А как его использовать?? Насколько я понимаю, оно и используется в методе CopyLayer с флагом &H80000000, и в этом случае создается новый слой со структурой исходного и в него копируется выделенная группа.. Или Вы что-то другое имеете в виду??? А если из оболочки Зулу выполнить команду Карта->Группа->Записать, то выполняется просто копирование группы элементов. Т.е. сохраняется структура слоя - получателя и сохраняется имеющаяся в нем информация..
 
Или Вы предлагаете используя свойство Selection поэлементно добавлять в новый слой , используя метод AddElement? Я так и делаю, работает, но очень медленно.. Копирование всей группы работает на два - три порядка быстрее.
 
В оболочке такая процедура есть. В объектной модели нет. Можем добавить, но в текущую версию.
Вообще для быстрой последовательной записи графики можно использовать StartSequentialWriteMode - FinishSequentialWriteMode Ускоряет запись очень сильно. Конверторы только с ней и нужно писать.
 
Спасибо.. Если работает быстро, то необходимость в этой процедуре, думаю, отпадает..
Страницы: 1