|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как присвоить идентификатор к конкретному объекту из множественного выбора на VBA
Регистрация: 16.10.2013
Сообщений: 395
|
||
Просмотров: 1150
|
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Идентификатор нужен чтобы потом работать с конкретной полилинией, а не набором.
Например, выбрать сначала одну эталонную, все остальные с ней сравнить, потом больше эту эталонную не трогать, а работать с другими, среди других выбрать еще одну эталонную, а та первая уже не должна участвовать в наборе и чтобы исключить ее из набора, думаю делать это по идентификатору. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Если уж с указателями на полилинии работать не хочется, чем не нравится тот же хендл?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Что за указатели полилиний? Это которые руками (мышкой) надо тыкать в модели? Если есть программные, то где про него почитать?
И где почитать про хэндл? ПС. В сообщении написал про полилинии, потому что просто пока это насущная задача, но потом аналогичным образом планирую работать с другими наборами, например, мультивыноски, блоки и т.д. Подход одинаковый: в наборе присвоить каждому свой идентификатор, чтобы получить некий именованный массив элементов и потом по номеру элемента работать с объектом соответствующего номера. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 415
|
Если выбрать все полилинии програмно, то они помещаются в набор в известном только автокаду порядке (т.е. порядок их следования в наборе не будет определяться ни длиной, ни расположением слева направо или сверху вниз в пространстве модели).
Тебе самому надо будет решить какая из них будет "главной". Посмотри - в автокаде отдельно выделил "главную", отдельно остальные. Прошелся по остальным на всякий чтобы убрать случайно попавшую "главную" И затем сравниваешь полилинии из второго набора с вершинами "главной" |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Цитата:
Т.е. хочу сравнить с первой линией все остальные, далее первую линию исключить из набора и сравнивать оставшиеся со второй и т.д. Не важно какая будет первая, важно, что в следующих итерациях она уже не участвует, а исключаю ее из дальнейшего набора по идентификатору (индексу элемента в массиве, например) |
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,069
|
Насколько я понимаю, этот алгоритм сравнит каждую точку с каждой, и сложность имеет O(n!). Скорее всего, он будет вешаться, начиная с нескольких десятков полилиний. Подозреваю, что для обработки больших чертежей нужно что-то, что быстро ищет в 3D-пространстве (или в 2D, если чертеж плоский). Например, завести KD-дерево или R-дерево, и при обходе полилиний, для каждой точки, если близкая есть в дереве - округлять, если нет - добавлять в дерево. Реализации можно погуглить. У таких деревьев скорость поиска вроде логарифмическая, а не факториальная.
|
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Цитата:
Ну и теоретически таким образом нельзя ли самому массив сформировать вроде Set PL0 = SelSet.Item(0) Set PL1 = SelSet.Item(1) Set PL2 = SelSet.Item(2) и т.д.? Нубий-IV, попробую нагуглить эти деревья... |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 415
|
Ты попробуй сам удали и посмотри - быстрее и легче запомнишь.
Зачем тебе массивы формировать? Сейчас у тебя 10 линий, потом 800 - будешь думать как задать массив нужного размера. Работай с набором SelectionSet, по нему проходи: Dim oPolyLine as AcadPolyline For Each oPolyLine In SelSet << Делаешь что тебе нужно >> Next oPolyLine |
|||
![]() |
|
||||
Регистрация: 20.04.2011
Сообщений: 478
|
Ну так-то у каждого объекта и так имеется свой индекс.
пример кода (правда на другом языке, но смысл думаю будет ясен): Код:
Ну на насчет оптимизации (чтоб программа не вешалась от десятка полилиний), возможно можно будет отсеять лишние полилинии, проверив их габариты с помощью GetBoundingBox (тут сложно сказать не зная специфики задачи) |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Парни, всем отписавшимся прожимаю "спасибо", все сообщения читаю, они важны для моего понимания ВБА.
gumel, конечно, не обязательно использовать все объекты модели, проще предварительно выполнить выбор путем SelSet. Получается, смысла в отдельной операции присвоения идентификатора нет, можно организовать цикл внутри цикла по индексам из выбора. В первом цикле перебирать полилинии из выбора, а во втором цикле вершины. Что-то вроде такого (даже четыре цикла будет): Код:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
каждый объект в БД чертежа *.dwg и так имеет свой уникальный хэндл (Handle). Хэндл - это в настоящее время 8-байтовое целое число и для каждого нового объекта чертежа просто берется следующее значение этого числа (это самый дешевый по затратам ресурсов способ обеспечить уникальность значения хэндла в пределах чертежа). В VBA хэндл доступен в виде строки и по этой строке через метод HandleToObject можно получить сам объект чертежа.
|
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 415
|
Цитата:
|
|||
![]() |
|
||||
Инженер-философ Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,069
|
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как создать макрос в Autocad2017 для выбора нескольких команд к одному и тому же объекту | exlu2732 | LISP | 6 | 23.08.2024 11:51 |
Как в блоке сделать зависимость таблицы выбора от атрибута с полем? (ACAD22) | Whaleofthesimon | Динамические блоки | 0 | 24.01.2022 12:20 |
Не отображается ручка выбора | Bogich | AutoCAD | 7 | 09.07.2014 11:00 |
Не работают привязки к конкретному объекту чертежа. | KronSerg | AutoCAD | 6 | 21.03.2011 22:34 |