|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Расчленение блока и перемещение объектов на передний план (VBA)
Петрозаводск
Регистрация: 16.04.2009
Сообщений: 343
|
||
Просмотров: 8847
|
|
||||
ну и перемещай обьекты на передний план в цикле, начиная с маскировки
обьекты блока будут поверх нее, а маскировка поверх обьектов чертежа
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Прошу прощения с давность темы
Дело том, что в цикле перемещать каждый объект - процесс долгий. Учитывая то, что функционал VBA позволяет перемещать сразу набор. Вот и хочется получив набор разбитого блока переместить сразу, но при этом убрать из набора маскировку |
|||
![]() |
|
||||
Создать новый массив с размером -1 от набора.
засунуть в этот массив всё из набора за исключением маскировки это перебором, но будут быстрее чем каждый на верх. массив переместить на верх целиком. это теоретически, но думаю должно работать |
||||
![]() |
|
||||
никак
в смысле программно или по условию задачи ? ----- добавлено через ~4 мин. ----- Как вариант получаете габарит блока, взрываете, создаёте набор 1 с фильтром который берёт только маскировку, вырезаете маскировку, создаёте набор 2 со всеми элементами без маскировки, вставляете маскировку, перемещаете набор 2 на верх. С вас пиво. ![]() |
||||
![]() |
|
||||
как вам это удается.. без строчки кода и прииера чертежа.. профи !!!
послежу, почитаю
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Делаем эксплоде, получаем массив всего содержимого блока, так ?
Этот массив делаем муве в космос, получилось? По координатам массива делаем селект сет с фильтром на маскировку, получаем ее и делаем муве в исходное координаты, получилось? Потом опять селект сет на оставшееся в космосе, и муве в исходные. По логике маскировка должна получиться снизу. Пишу смобилы проверить не могу. |
||||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
|
|||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Коллеги, я понял в чем основной затык, который не дает обойтись без перебора. Нет возможности в .MoveToTop подсунуть набор, там требуется массив объектов.
На данный момент у меня уже есть реализация схожая с решением от Boxa, но она замедлена циклом, и я думал, что должно быть более оптимальное решение. Хотя, кое что попробую еще упростить. Кстати, Boxa, отсечение маскировок делал сравнивая с "IAcadRasterImage" вместо "IAcadWipeout". Вроде то же работает. Ну и пока обхожусь одним циклом. Два перебора, мне совсем печально будет. maratovich, к сожалению применение "космоса" меня пока не избавляет от создания массива циклом. |
|||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Тут не поспоришь. Но как говориться, на безрыбье и рак рыба. Альтернативные языки для данной задачи изучать нет желания. Вот и ищу оптимизацию на том уровне, которым владею.
Цитата:
В целом я уже благодаря этой дискуссии понял, что минимум один цикл нужен (из-за разницы в типах данных). Видимо придется смириться. Кстати, о словарях сортировки. Может кто имеет в них более глубокое познание: - если я создаю один словарь и начну его использовать для разных сортировок, то это не приведет к откату первых? То есть: создал в словаре сортировку, при помощи нее сгруппировал объекты (одни расположил над другими). Потом взял под другие объекты и при помощи того же словаря сгруппировал (вторые разместит над третьими).. И не получится так, что из-за этого сортировка первых со вторыми вернется на свои места? Этот вопрос исключительно, если владеете информацией. Целенаправленно проверять не надо. Спасибо. |
|||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Вот вариант процедуры. В файл не размещаю, думаю, что каждому удобнее вставить в свои пакеты, что бы не заморачиваться с библиотеками.
И прилагаю файл, где есть две пачки блоков (по 100 штук). В них отличается число примитивов и при обработке этих пачек наблюдается снижение скорости почти в два раза. Код:
|
|||
![]() |
|
||||
Собственно кто это сказал ?
Вот код переноса назад: Код:
А не лучше селект сет с фильтром выбрать и взорвать все блоки , а потом так же выбрать только маскировку и переместить назад ? Или есть каки то особенности что надо каждый блок по очереди ? ----- добавлено через 26 сек. ----- Я ж говорю - на сухую плохо идёт ![]() |
||||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
|
|||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Не знаю, как она точно называется. Сейчас е-тулса нет под рукой, посмотреть не смогу в ближайшие три недели.
Да и использование сторонних решений мне не всегда актуально, так как в своем коде я добавлю дополнительный функционал - например отфильтровываю блоки по некоторым критериям. |
|||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Цитата:
Иногда приходят мысли, с учетом того, что задача с расчленением блока постоянно расширяется (с момента постановки вопроса), то в комплексе придется рассматривать метод с лишним циклом и создания временного массива или может в итоге и xplode подойдет (останется разобраться как к ней прикрутить набор, заданный программно). |
|||
![]() |
|
||||
А вот теперь... ахалай махалай, сяски.... зачем ???!!!
Блок то один, просто его вхождений много (одинаковых, без учета значения атрибутов), из этого следует что расчленить и обработать можно только один блок. Потом этим расчленением просто заменять существующий блок. Это будет в разы быстрее. Вставляете по точке вставки блока, а порядок расположения по порядку как есть в каде. По поводу атрибутов - надо смотреть цель, чего с ними делаете. Поэтому и просили реальный пример. |
||||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Цитата:
Я уже понял в диалоге, что есть альтернативные методы, плюс учет, что у самого стали появляться дополнительные потребности. Постараюсь задачу обрисовать целиком, и возможно собрать то, что пока использую (код). |
|||
![]() |
|
||||
Регистрация: 16.04.2009
Петрозаводск
Сообщений: 343
|
Это точно!!! Полезная рифма, учту в работе по проектированию.
Просто вопрос то был: можно ли преобразовать массив примитивов, полученного расчленением, в массив, пригодный для .MoveToTop без перебора в цикле. И уж если никак этого не избежать, то и придется смотреть на задачу комплексе и искать возможности по ускорению обработки. Ну пока вкратце (сейчас нет под рукой решений) некое ТЗ: есть куча блоков на плане (в том числе и динамические, и с атрибутами, и с маскировкой) - вариации разные. надо провести пакетное расчленение (как правило запрашивается пространство, но отфильтровываются блоки по именам) с преобразованием атрибутов в текстовые поля, и размещением вытащенных примитивов и полученных текстов поверх маскировок. Все необходимое мне понято как реализовать, но скорость из-за промежуточных циклов падает - пример я выкладывал. Хотя кое какие мысли имеются, но до реализации пока руки не дошли. |
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Функция чтения свойств и их значений динамического блока | Supermax | Библиотека функций | 11 | 16.03.2020 09:11 |
Как сделать макрос на расчленение объектов MagiCAD 2011.11/Ru | Alex_GSP | Программирование | 12 | 04.11.2015 12:38 |
Visual LISP: Почему перебор объектов в SelectionSet неактивного документа происходит очень медленно? | Shourick | LISP | 15 | 13.03.2015 15:23 |
Присвоение атрибуту блока значения атрибута другого блока. | shartal | Программирование | 4 | 14.11.2013 14:02 |
Проблема с базовой точкой блока и вхождением блока в DXF | nogaems | Программирование | 5 | 29.08.2013 15:46 |