ADN Club > AutoCAD .NET API

Хранение идентификаторов объектов в строчном виде

(1/4) > >>

Georg:
Добрый день!
Вопрос заключается в необходимости хранить идентификаторы объектов, которые являются вложенными в данный; к примеру -- грани солида (Faces).
Зачем это надо? Объясняю - есть необходимость обрабатывать данные чертежа в другом ПО и вернуть их же + доп. параметры, которые потом назначить этим элементам. В настоящем примере - материалы для граней тела.

У них [дочерних элементов] отсутствует ObjectId, у которого можно было бы получить Handle, а наличествующий SubentityId не имеет нужного представления.
Вариант с генерацией FullSubentityPath https://adn-cis.org/podsvetka-segmenta-polilinii.html тоже не совсем подходит, так как для этого придется создавать дополнительную структуру типа словаря/дерева во время нового перебора граней солидов (во время которого заново находить этот FullSubentityPath, преобразовать в строку и искать по ключу в созданной коллекции). С позиции работы с памятью не очень хорошо .... хоть наверное так пока и поступлю.
Аналогично вместо FullSubentityPath могу использовать "строковый кортеж" типа $"{Solid.Handle}_{Face.Index}".
Также я намеревался использовать в качестве идентификатора грани её центроид (усредненную сумму координат по X,Y,Z) - то есть в целом 3 варианта решения всё равно сводятся к необходимости создания коллекции с сопоставлением ключ:доп. параметры солида, а хотелось бы имея некое строчное представления идентификатора как Handle получать его представление в БД чертежа и производить с ним манипуляции без необходимости сопоставления с чем-либо вспомогательным.

Надеюсь, мысль донёс корректно ....
P.S. Хотя вот что интересно - а этот набор будет упорядочен всегда в рамках текущего состояния солида (не изменяя его) и после перезапуска чертежа (solid_id - это ObjectId солида)

--- Код - C# [Выбрать] ---List < Autodesk.AutoCAD.BoundaryRepresentation.Face > faces = new Brep(new FullSubentityPath(new ObjectId[1] { solid_id }, new SubentityId(SubentityType.Null, IntPtr.Zero))).Faces.ToList();

Александр Ривилис:

--- Цитата: Georg от 30-12-2021, 17:24:28 ---Вариант с генерацией FullSubentityPath https://adn-cis.org/podsvetka-segmenta-polilinii.html тоже не совсем подходит, так как для этого придется создавать дополнительную структуру типа словаря/дерева во время нового перебора граней солидов (во время которого заново находить этот FullSubentityPath, преобразовать в строку и искать по ключу в созданной коллекции).
--- Конец цитаты ---
Не понял зачем перебирать грани солида вторично, если ты знаешь Handle этого солида (и соответственно его ObjectId) и номер грани. По этим критериям и создается FullSubentityPath.

Georg:
А номер грани это и есть его "номер" в списке Brep.Faces()? Я среди методов не нашел вроде явного номера.
P.S. и да, я чего-то не подумал что перебирать повторно не надо, раз есть явный идентификатор

Александр Ривилис:

--- Цитата: Georg от 31-12-2021, 15:05:21 ---А номер грани это и есть его "номер" в списке Brep.Faces()? Я среди методов не нашел вроде явного номера.
P.S. и да, я чего-то не подумал что перебирать повторно не надо, раз есть явный идентификатор

--- Конец цитаты ---
Глянь этот код: https://adn-cis.org/forum/index.php?topic=7169.msg21059#msg21059

Georg:
Да, спасибо, это примерно то и есть!.
Только вот очень расстраивает скорость ... у меня порядка 67000 граней и процесс замены материала/цвета занял аж полчаса выполнения (это делалось в рамках одной транзакции).... ускорить никак невозможно для интереса? (хотя сам понимаю что средств никаких нет ... это так безумно плохо видимо внутренняя сортировка организована в AutoCAD)

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии