Ошибка перебора всех объектов чертежа в порядке очереди в построении.

Автор Doom, 29.01.22, 13:04:21

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Doom

Доброго форумчане!

Мне нужно на чертеже перебрать все объекты в порядке очереди в построении.
использую метод ksCreateIterator

в хелпе написано что бы перебрать нужно использовать аргумент - ALL_OBJ_SHOW_ORDER
"ALL_OBJ_SHOW_ORDER - Все объекты, которые могут входить в вид в порядке отрисовки"

однако это не работает, например на чертеже в порядке очереди строится линия затем текст затем линия - в итоге он переберет линии затем только текст

# =============================================================================
iIterator = kompas_object.GetIterator()
iIterator.ksCreateIterator(-1000, 0)
# iIterator.ksCreateIterator(-1, 0)

line_object_reference = iIterator.ksMoveIterator("F")

while iDocument2D.ksExistObj(line_object_reference) == 1:
    line_object = kompas_object.TransferReference(line_object_reference, iDocument2D.reference)

    iSelectionManager.Select(line_object)
    time.sleep(1)
    iSelectionManager.Unselect(line_object)

    line_object_reference = iIterator.ksMoveIterator("N")
   
iIterator.ksDeleteIterator()

# =============================================================================

print("done")

Компас 3D V20


Doom

пробывал ALL_OBJ

в этом случае перебор разделяется еще на одну группу судя по следующему примеру -
строю линию затем вспомогательную прямую затем линию - перебор идет по линиям затем только прямая + то что написал с ALL_OBJ_SHOW_ORDER



p3452

Можно попробовать так:
- взять reference всех графических элементов в Список,
- отсортировать Список по возрастанию,
- проходя, последовательно, по Списку получать, по reference, графические элементы...
+ Благодарностей: 1

Doom

Цитата: p3452 от 29.01.22, 19:03:54- взять reference всех графических элементов в Список,

Пробовал точно такая же последовательность как и при ALL_OBJ_SHOW_ORDER

Создать свой массив и писать в него указатели новых объектов по мере их создания, тогда будет четко, зачем это нужно?
КОМПАС-3D всегда меняет указатели в процессе создания и это проверено.
+ Благодарностей: 1

Doom

Цитата: Sabahs от 29.01.22, 23:25:37Создать свой массив и писать в него указатели новых объектов по мере их создания, тогда будет четко, зачем это нужно?

Да после закрытия чертежа все обнулится, - можно еще добавить координаты объектов.
но я смирился с вариантом ALL_OBJ_SHOW_ORDER  :sun:

я хочу полностью идентифицировать объекты на чертеже - в рамках мой задачи вроде все решаемо.
а что за задача - автоматизация тех процесса - залью на Yotube потом  :sun:

Создался объект один, записали в группу имя один и т.д. После закрытия и открытия перебор объектов по имени группы.
+ Благодарностей: 1

p3452

Цитата: p3452 от 29.01.22, 19:03:54Можно попробовать так:
- взять reference всех графических элементов в Список,
- отсортировать Список по возрастанию,
- проходя, последовательно, по Списку получать, по reference, графические элементы...
Проверил - действительно только для одного сеанса работы Компаса!
Последовательность построения - красные цифры:
Сортировка 01.png
Первый список - Компас-овский, второй - после сортировки по refrence, четко видно что последовательность построений соответствует возрастанию reference:
Сортировка 02.png
Но, после закрытия и открытия - закономерность пропадает, т.к. Компас меняет reference в соответствии со своей сортировкой.

Doom

У меня сохраняется последовательность (только в 2х группах) получается как таковой сортировки нет и функция перебора исходит из конструкции файла при сохранении, и при копировании нескольких объектов - сохраняется последовательность.

Надежный вариант - через группы.

Для полноты решения - создать строковый атрибут для объекта и далее перебором их - получить нужный объект.