Страница 1 из 1
Удаление дубликатов линий на автомате
Добавлено: 29 ноя 2008, 02:26
Игорь
Специалисты, помогите пожалуйста.
Все таки хочется на автомате удалять дубликаты линий.
Кому не лень поломать голову - шейп в прицепе.
Re: Удаление дубликатов линий на автомате
Добавлено: 29 ноя 2008, 04:59
Максим Дубинин
Лови, выделяет объекты - охваты которых одинаковы, можно еще добавить дополнительную проверку на длину, но вероятность, что охваты равны, но это не одинаковые объекты ничтожно мала.
Код: Выделить всё
aview = av.getactivedoc
atheme = aview.getactivethemes.get(0)
aftab = atheme.getftab
f_shape = aftab.findfield("shape")
'f_dup = a
abitmap = aftab.getselection
for each rec in aftab
ashape = aftab.returnvalue(f_shape,rec)
for each rec2 in aftab
if (rec <> rec2) then
ashape2 = aftab.returnvalue(f_shape,rec2)
if (ashape.returnextent = ashape2.returnextent) then
abitmap.set(rec)
abitmap.set(rec2)
end
end
end
end
aftab.setselection(abitmap)
aftab.UpdateSelection
Re: Удаление дубликатов линий на автомате
Добавлено: 29 ноя 2008, 14:57
Игорь
Sim, спасибо большое, как минимум на 50% задача решена. Еще бы понять как на автомате выделенные объекты разделить на оригинал и дубликаты, чтобы удалить все что не нужно, оставив только не дублирующиеся объекты.
Re: Удаление дубликатов линий на автомате
Добавлено: 30 ноя 2008, 05:25
Максим Дубинин
Сделал так, из дубля - первый из них отмечается в новом поле dup, второй нет, поэтому в результате дубли отмечаются числами (которые показывают номер пары). Наконец, после работы скрипта надо сделать выборку: [dup] <> 0 и прибить все выделенное. Можно в принципе добавить в скрипт и эту часть, но это сделает его несколько менее универсальным.
Код: Выделить всё
aview = av.getactivedoc
atheme = aview.getactivethemes.get(0)
aftab = atheme.getftab
f_shape = aftab.findfield("shape")
f_dup = Field.Make("dup",#FIELD_BYTE,1,0)
aftab.seteditable(true)
aftab.addfields({f_dup})
abitmap = aftab.getselection
for each rec in aftab
ashape = aftab.returnvalue(f_shape,rec)
for each rec2 in aftab
if (rec <> rec2) then
ashape2 = aftab.returnvalue(f_shape,rec2)
if (ashape.returnextent = ashape2.returnextent) then
abitmap.set(rec)
if (aftab.returnvalue(f_dup,rec2)=0) then
aftab.setvalue(f_dup,rec,rec2)
end
abitmap.set(rec2)
end
end
end
end
aftab.seteditable(false)
aftab.setselection(abitmap)
aftab.UpdateSelection
Re: Удаление дубликатов линий на автомате
Добавлено: 01 дек 2008, 03:40
Игорь
Sim, спасибо огромное.
Действительно удаление дубликатов в скрипт не надо добавлять. Вдруг встанет задача выделить все дубликаты. Так скрипт действительно универсален.
Re: Удаление дубликатов линий на автомате
Добавлено: 01 дек 2008, 11:51
geologic
Дубликаты линий удаляет любая программа работы с топологией, поскольку это типовая операция, обязательная перед сборкой полигонов. Рекомендую EdiTools (Geowizards) - много пользовались. Это там в разделе "
Clean Polylines". Работает в два варианта -быстрый (сравнение по началу и концу) и полный (все вертексы).
Re: Удаление дубликатов линий на автомате
Добавлено: 02 дек 2008, 10:31
Игорь
Geologic, спасибо большое.
Вот что называется век живи, век учись. Сколько пользуюсь ET, а про эту функцию не просек.