Как добавить объекты в текущий набор выделенных объектов на чертеже на VBA?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как добавить объекты в текущий набор выделенных объектов на чертеже на VBA?

Как добавить объекты в текущий набор выделенных объектов на чертеже на VBA?

Ответ
Поиск в этой теме
Непрочитано 09.02.2021, 12:45 #1
Как добавить объекты в текущий набор выделенных объектов на чертеже на VBA?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,134

Подскажите пожалуйста код на VBA для добавления объектов в текущий набор выделенных объектов на чертеже.
Просмотров: 17390
 
Непрочитано 10.02.2021, 09:36
1 | #2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Код:
[Выделить все]
AcadSelectionSet.AddItems
Сергей812 вне форума  
 
Непрочитано 19.02.2021, 11:45
#3
Vadim_EC


 
Регистрация: 08.02.2018
Сообщений: 13


Не уверен, но скорее всего надо связываться с LISP.
Vadim_EC вне форума  
 
Автор темы   Непрочитано 01.03.2021, 11:02
#4
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Сергей,
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
AcadSelectionSet.AddItems
Чтобы воспользоваться возможностями этого метода надо создать набор выделенных на текущий момент объектов чертежа.
А как это сделать на VBA? Как создать набор выделенных объектов на чертеже (подсвеченных синими квадратиками) на VBA?
МишаИнженер вне форума  
 
Непрочитано 01.03.2021, 11:29
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


http://entercad.ru/acadauto.en/
trir вне форума  
 
Непрочитано 01.03.2021, 11:32
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Если имеются в виду выделенные пользователем примитивы - то ActiveSelectionSet, насколько помню.
Сергей812 вне форума  
 
Автор темы   Непрочитано 01.03.2021, 12:38
#7
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Начертил 5 линий и 3 из них выделил.
Затем запустил функцию:
Код:
[Выделить все]
Public Sub ДобавитьОбъектыКВыделеннымОбъектам()
'Функция добавляет объекты к выделенным объектам
Dim objПриложениеAutoCAD As AcadApplication, objAcadDoc As AcadDocument
Dim objТекВыдОбъекты As AcadSelectionSet, objSelection As AcadSelectionSet
Dim mОбъекты() As AcadEntity
Dim I As Long, J As Long, K As Long, L As Long
On Error GoTo ОбработкаОшибок
'Получить объекты Excell и AutoCAD
   Call ПолучитьОбъектыExcellИAutoCAD(objПриложениеAutoCAD, objAcadDoc)

'Получим список выделенных объектов на чертеже
   Set objТекВыдОбъекты = objAcadDoc.ActiveSelectionSet
   objТекВыдОбъекты.Highlight True
   I = objТекВыдОбъекты.count
'Получим список объектов чертежа
   Call ПоказатьAutoCAD(objAcadDoc)
   If ПризнакНаличияЭлементаВКоллекции("ВыделенныеОбъекты", objAcadDoc.SelectionSets, 2) Then
      objAcadDoc.SelectionSets("ВыделенныеОбъекты").Delete
   End If
   Set objSelection = objAcadDoc.SelectionSets.Add("ВыделенныеОбъекты")
      
On Error Resume Next
ВыделитьОбъекты:
   Call ПоказатьAutoCAD(objAcadDoc)
   objSelection.SelectOnScreen
   J = objSelection.count
   ReDim mОбъекты(0 To I + J - 1) As AcadEntity
   For L = 0 To I - 1
      Set mОбъекты(L) = objТекВыдОбъекты(L)
   Next L
   For L = 0 To J - 1
      Set mОбъекты(I + L) = objSelection(L)
   Next L
On Error GoTo ОбработкаОшибок

'Добавим выделенные объекты в текущий набор объектов
   objAcadDoc.ActiveSelectionSet.AddItems mОбъекты
   K = objAcadDoc.ActiveSelectionSet.count
   objAcadDoc.ActiveSelectionSet.Highlight True
   
'Выведем сообщение о выполненной работе
   objAcadDoc.Utility.Prompt "К текущему набору из " & I & " объектов было добавлено " & J & " выделенных объектов" & vbCrLf & _
   "Всего в текущем наборе объектов " & K & " объектов" & vbCrLf
   
   Exit Sub
ОбработкаОшибок:
   glngОтвет = MsgBox("При добавлении выделенных объектов произошла ошибка:" & vbLf & _
         "номер = " & Err.Number & vbLf & _
         "с описанием: " & Err.Description & vbLf & vbLf & _
         "Продолжать выполнение программы?", vbYesNo, gsНазваниеПрограммы)
   If glngОтвет = vbNo Then Exit Sub
   Resume Next
End Sub
и выделил ещё 2 линии.
Почему моя функция выдает отчет что текущий набор объектов состоит из 2 линий? А должен состоять из 5 линий.
Заметил такую особенность: выделяю 3 линии и запускаю мою функцию, и функция выделяет в качестве текущих выделенных линий только 2 линии, которые я добавлял в набор текущих выделенных линий при предыдущем запуске функции. Получается АвтоКАД запомнил прошлые 2 линии в качестве текущих, а новые выделенные линии на экране не стал считать текущим набором выделенных линий. Появляется вопрос: после какого действия выделенные объекты попадают в текущий набор выделенных объектов?
Попробуйте сами запустить мою программу.
АвтоКАД не хочет записывать выделенные объекты в текущий набор выделенных объектов без дополнительного действия.
Если функция не запускается, настройте библиотеки для вышей версии АутоКАД (Tools->References)
Вложения
Тип файла: zip Добавление объектов.zip (79.4 Кб, 12 просмотров)

Последний раз редактировалось МишаИнженер, 01.03.2021 в 13:00. Причина: Добавление файла
МишаИнженер вне форума  
 
Непрочитано 01.03.2021, 12:56
| 1 #8
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


МишаИнженер, от Вашего кода кровь из глаз пошла, все совсем плохо и с кодом и с пониманием базовых механизмов языка.
И хотя, я не совсем понимаю что Вы хотите сделать, но мне кажется, что Вам следует гуглить фразу "autocad vba pickfirstselectionset"
ну или посмотреть сайт который Вам ранее уже указывали: http://entercad.ru/acadauto.en/ex_pi...lectionset.htm
Boxa на форуме  
 
Автор темы   Непрочитано 01.03.2021, 13:03
#9
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Boxa Посмотреть сообщение
все совсем плохо и с кодом и с пониманием базовых механизмов языка
У меня все работает. Не понимаю что вас не устраивает. Скачайте файл Excel из сообщения #7 и запустите функцию сами.
Добавил метод "PickfirstSelectionSet"
Жалко что этот метод "только для чтения"
PickfirstSelectionSet
SelectionSet object; read only
В итоге функция не выполняет требуемых действий: не добавляет выделенные объекты к текущему набору выделенных объектов
К настроить работу функции, чтобы она выполняла свою задачу? (Запустите функцию из файла Excel из прикрепленного файла)
Вложения
Тип файла: zip Добавление объектов (v2).zip (79.5 Кб, 10 просмотров)

Последний раз редактировалось МишаИнженер, 01.03.2021 в 13:17.
МишаИнженер вне форума  
 
Непрочитано 01.03.2021, 13:13
#10
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
У меня все работает. Не понимаю что вас не устраивает.
Господь с Вами, меня все устраивает, мне с этим не работать, хвала Дионису, я так мимо пробегая посмотрел, этого хватило.
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
В итоге функция не выполняет требуемых действий: не добавляет выделенные объекты к текущему набору выделенных объектов
Может стоит создать свой набор, куда добавлять выбранные заранее объекты?
Boxa на форуме  
 
Автор темы   Непрочитано 01.03.2021, 13:19
#11
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Вроде так и делаю. Однако в этот набор добавляются объекты выделенные при работе функции. А объекты выделенные до работы функции почему-то не выделяются после завершения работы функции.
Почему так происходит?
Модернизировал функцию. Теперь выделенные "до" и "вовремя" объекты просто выделяются (подсвечиваются) на экране как буд-то выбранные.
Однако многие программисты на VBA знают что "подсвеченный" и "выбранный" объекты это совсем разные вещи.
"Подсвеченные" объекты это просто мистика и мишура, их нельзя дальше использовать ни в каких действиях.
В этом можно убедиться если попробовать запустить функцию "Создать блок" и попытаться выбрать объекты из чертежа с ключом "т" ("текущий" набор объектов)
При этом выделятся последние выбранные объекты полученные при работе функции. А выбранные объекты до работы функции забываются и не выделяются.
Как сделать чтобы выбранные объекты до работы функции попали в текущий набор выделенных объектов?
Где хранится текущий набор выделенных объектов? В каком словаре?
Вложения
Тип файла: zip Добавление объектов (v3).zip (79.7 Кб, 6 просмотров)

Последний раз редактировалось МишаИнженер, 01.03.2021 в 13:40.
МишаИнженер вне форума  
 
Непрочитано 01.03.2021, 16:15
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


в VBA вроде нет встроенного выделения примитивов на чертеже, через костыли на том же лиспе
Сергей812 вне форума  
 
Непрочитано 01.03.2021, 18:13
1 | #13
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


МишаИнженер, Вас в гугле забанили? Первые же ссылки по фразе Autocad VBA add to PickfirstSelectionSet
Приводят на форум, где это решено: https://forums.augi.com/showthread.p...-active-in-GUI
Boxa на форуме  
 
Непрочитано 01.03.2021, 18:27
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Насколько понимаю, ему надо сделать набор выделенных примитивов - чтобы потом в диалоге создания блока снова не выбирать.
Сергей812 вне форума  
 
Непрочитано 01.03.2021, 18:42
#15
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Ну фиг знает... название темы: Как добавить объекты в текущий набор выделенных объектов на чертеже на VBA?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
чтобы потом в диалоге создания блока снова не выбирать.
А почему сразу блок не сделать? Зачем его делать в диалоговом окне?
Boxa на форуме  
 
Автор темы   Непрочитано 02.03.2021, 04:41
#16
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Часто приходится выделять множество объектов очень труднодоступных и в большом количестве. Поэтому нужен инструмент позволяющий выделять объекты с помощью фильтров по слою, по цвету и весу линий. Спасибо Вохе за интересную ссылку. Там есть очень интересные решения!
МишаИнженер вне форума  
 
Непрочитано 02.03.2021, 08:09
#17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Поэтому нужен инструмент позволяющий выделять объекты с помощью фильтров по слою, по цвету и весу линий.
В автокаде же есть не только быстрый выбор, но и команда выбора с фильтром (FILTER)... хотя Вам лучше знать.
Boxa на форуме  
 
Автор темы   Непрочитано 02.03.2021, 10:53
#18
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Добавил в программу метод использования групп, но команда
Код:
[Выделить все]
"Select" & vbCr & "g" & vbCr & "TEMPGROUP"
не работает.
Какая команда является аналогом в русском АвтоКАДе, чтобы можно было попросить выделить группы и указать имя группы в ответ на запрос выделить объекты?
Вложения
Тип файла: zip Добавление объектов (v4).zip (80.3 Кб, 7 просмотров)
МишаИнженер вне форума  
 
Непрочитано 02.03.2021, 12:48
#19
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


"_.Select" & vbCr & "g" & vbCr & "TEMPGROUP"
Boxa на форуме  
 
Непрочитано 02.03.2021, 17:10
#20
engngr

сети
 
Регистрация: 03.11.2008
Московия*
Сообщений: 5,914


_g
engngr вне форума  
 
Автор темы   Непрочитано 03.03.2021, 06:51
#21
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от engngr Посмотреть сообщение
_g
Ни одну команду АвтоКАД не понимает:
Команда: "_.Select" Неизвестная команда "SELECT"". Для вызова справки нажмите F1.
Команда: & Неизвестная команда "&". Для вызова справки нажмите F1.
Команда: vbCr Неизвестная команда "VBCR". Для вызова справки нажмите F1.
Команда: & Неизвестная команда "&". Для вызова справки нажмите F1.
Команда: "_g" Неизвестная команда ""_G"". Для вызова справки нажмите F1.
Команда: & Неизвестная команда "&". Для вызова справки нажмите F1.
Команда: vbCr Неизвестная команда "VBCR". Для вызова справки нажмите F1.
Команда: & Неизвестная команда "&". Для вызова справки нажмите F1.
Команда: "TEMPGROUP"
Неизвестная команда ""TEMPGROUP"". Для вызова справки нажмите F1.
Что-то поменялось в новом АвтоКАДе. Наверное есть другая команда, заменяющая SELECT, но как называется эта команда?
МишаИнженер вне форума  
 
Непрочитано 03.03.2021, 07:53
#22
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


МишаИнженер, Вообще не смешно. Складывается впечатление, что Вы троль. Желание Вам помогать или подталкивать в правильном направлении стремительно таит.
Boxa на форуме  
 
Непрочитано 03.03.2021, 09:21
1 | #23
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Boxa Посмотреть сообщение
Складывается впечатление, что Вы троль.
такие нынче "инженеры") Даже готовое решение в пределах того же форума не способны найти неделями...
Сергей812 вне форума  
 
Автор темы   Непрочитано 03.03.2021, 11:35
#24
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Спасибо Сергей812!
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
в пределах того же форума не способны найти неделями...
Функция заработала! Однако есть маленький недочет:
При вызове функции SelectOnScreen снимается выделение с ранее выделенных объектов и на экране не видно какие объекты были выделены ранее и какие сейчас выделять не надо
Как одновременно подсветить объекты и попросить пользователя выбрать новые?
Может для этого есть специальные функции Лисп?
Скачайте пожалуйста файл Excel и проверьте как работает функция и помогите исправить недочет!
Вложения
Тип файла: zip Добавление объектов (v5).zip (81.2 Кб, 10 просмотров)
МишаИнженер вне форума  
 
Непрочитано 03.03.2021, 19:50
#25
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Как одновременно подсветить объекты и попросить пользователя выбрать новые?
тебе выше Сергей812 дал ссылку как подсветить объекты набора..
Что мешает заказать юзеру новый выбор в тотжэж селсет и еще раз подсветить этот набор с новыми объектами?

----- добавлено через ~5 мин. -----
Зачем мучить юзера множественными выборами..
Не проще сделать селсет с кодом 4 и выбрать все что нужно за один раз?
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 03.03.2021, 20:39
#26
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Что мешает заказать юзеру новый выбор в тотжэж селсет и еще раз подсветить этот набор с новыми объектами?
возможно, что ТС не знает - как дубликаты повторного выбора одних и тех же элементов исключать
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
и на экране не видно какие объекты были выделены ранее и какие сейчас выделять не надо
хотя это делается элементарно с использованием Collection и хэндла как ключ.
Сергей812 вне форума  
 
Непрочитано 03.03.2021, 21:47
#27
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
возможно, что ТС не знает - как дубликаты повторного выбора одних и тех же элементов исключать
они и так повторно в селсет не попадут))

Ломаю голову зачем выбирать несколько раз, если можно за один))
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 03.03.2021, 21:54
#28
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Ломаю голову зачем выбирать несколько раз, если можно за один))
фиг его знает - как он писал
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Часто приходится выделять множество объектов очень труднодоступных и в большом количестве. Поэтому нужен инструмент позволяющий выделять объекты с помощью фильтров по слою, по цвету и весу линий.
вполне возможно, что некий инструмент для коллекционирования вместе нескольких разных выборок пытается сваять
Сергей812 вне форума  
 
Непрочитано 03.03.2021, 21:57
#29
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
вполне возможно, что некий инструмент для коллекционирования вместе нескольких разных выборок пытается сваять
Похоже на то, только можно взять одним разом, по любым условиям, хоть со всего документа, хоть через лист...
Секретчики млин.. все боятся идею супер проги запалить, шоб идею не украли)))
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 03.03.2021, 22:16
#30
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Offtop: А ТС не реагирует...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.03.2021, 22:23
#31
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Похоже на то, только можно взять одним разом, по любым условиям, хоть со всего документа, хоть через лист...
это если известны все условия выборки изначально. А может последовательно выбирается - что-то выбрал, потом посмотрел - какие то элементы не попали, дополнительный выбор с добавлением к предыдущему или наоборот, исключением из результирующего набора.. И т.д. в интерактивном режиме. Но шифруется ТС)
Сергей812 вне форума  
 
Непрочитано 03.03.2021, 22:58
#32
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,297
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
потом посмотрел - какие то элементы не попали, дополнительный выбор с добавлением к предыдущему
Селсетом... интерактивно добавить.. после как посмотрел)))
Сильно шифруется. Даже представить такую задачу не могу, где требуется такой интерактив.
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 03.03.2021, 23:26
#33
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Даже представить такую задачу не могу, где требуется такой интерактив.
ну обычно наоборот - к элементам привязываются какие то признаки (как привязываются - это уже другой вопрос), и далее по этим признакам производится какая то манипуляция с элементами, в том числе и выделение при необходимости.

Придет ТС - может, приоткроет завесу тайны, зачем это все нужно)
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.03.2021, 04:58
#34
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


При армировании ЖБ конструкций сетками на проекциях сечений надо часто рисовать проекции сеток. Эти проекции я делаю в виде блоков. Круглешочки я рисую блоками в названии которых видно какой это диаметр (это удобная фишечка). И вот чтобы эти точки не выделять по одной (чтобы их все добавить в блок) мне нужен инструмент "добавить объекты к выделенным объектам" и ещё у меня есть код (и инструмент такой есть) "Выделить блоки из выделенных объектов". Я просто выделяю область чертежа, потом выделяю блок (например точку арматуры или блок обозначения хомута) и мне тут-же подсвечиваются эти боки на экране и выдается сообщение: "было выделено N объектов среди них найдено M блоков с названием ..." И я сразу записываю в спецификацию число хомутов стягивающих две сетки по смежным плоскостям блока. А теперь я могу выделять с помощью таких фильтров сразу множество одинаковых блоков, например точки стержней на проекциях сеток, и добавлять потом все выделенные объекты в блок: "СеткаС5_Спереди", "СеткаС5_Сбоку", "СеткаС5_План" и т.д. А далее можно крутить эти блоки проекции и прилаживать их к другим проекциям и проверять правильность вычерчивания сетки и настраивать шаг между стержнями чтобы стержни разных сеток не пересекались. Вот для чего мне нужна эта функция!
Если вы мне подскажите как обозначить ранее выделенные объекты в процессе выделения новых объектов я вам покажу все эти инструменты на одном листе и вы сможете оценить их работу. А сейчас времени пока нет надо чертежи армировать. Подумайте как это сделать. Мне кажется что придется красным цветом выделять ранее выделенные объекты, а после добавления новых объектов к ранее выделенным цвет надо будет заменить на старые цвета которые были до выделения. Это можно сделать и с весом линий. А какие у вас будут предложения? Может для этого есть специальная функция ЛИСП?

Вопрос модератору: как включить интерактивную проверку грамматики и орфографии в сообщениях?

Последний раз редактировалось МишаИнженер, 04.03.2021 в 05:04.
МишаИнженер вне форума  
 
Непрочитано 05.03.2021, 01:17
1 | #35
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


типа тут на форуме каждый второй КЖ/КМ - чтобы воспринять этот поток сознания без каких либо иллюстраций) Только если будете править цвет примитивов - имхо, добавляйте им в расширенные данные исходный цвет, чтобы в случае сбоя приложения можно было восстановить исходное состояние одной командой.
Сергей812 вне форума  
 
Непрочитано 24.01.2025, 10:08
#36
Савелий Пак


 
Регистрация: 24.01.2025
Сообщений: 3


Даже через 17 лет задача не решена. Я даже в форум записался
Савелий Пак вне форума  
 
Непрочитано 24.01.2025, 10:15
| 1 #37
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Савелий Пак Посмотреть сообщение
Даже через 17 лет задача не решена. Я даже в форум записался
Какая задача? и через каких 17 лет - теме 4 года всего...
Сергей812 вне форума  
 
Непрочитано 24.01.2025, 11:22
#38
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Просто VB умер
trir вне форума  
 
Автор темы   Непрочитано 24.01.2025, 13:32
1 | #39
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Вот код рабочей программы:
Код:
[Выделить все]
Public Sub ДобавитьСтержниКВыделенномуНаборуСтержней()
'Функция добавляет стержни заданного типа к выделенному набору стержней
Dim objПриложениеAutoCAD As AcadApplication, objAcadDoc As AcadDocument
Dim objТекВыдОбъекты As AcadSelectionSet, objSelection As AcadSelectionSet, objSelПодсветка As AcadSelectionSet
Dim bПрОткл As Boolean
Dim mОбъекты() As AcadEntity
Dim I As Long, J As Long, K As Long, L As Long
Dim grpTemp As AcadGroup
'Переменные для параметров линии
Dim sСлой As String, vЦвет As Variant, vТипЛиний As Variant, vВесЛиний As Variant, dМКТЛиний As Double, sНазвОбъекта As String
Dim СпДопВыдОбъектов As Collection, objОбразец As AcadEntity, objТекЛиния As AcadEntity
On Error GoTo ОбработкаОшибок
'Получить объекты Excell и AutoCAD
   Call ПолучитьОбъектыExcellИAutoCAD(objПриложениеAutoCAD, objAcadDoc)

'Получим список выделенных объектов на чертеже
   Set objТекВыдОбъекты = objAcadDoc.ActiveSelectionSet
   Set objТекВыдОбъекты = objAcadDoc.PickfirstSelectionSet
   objТекВыдОбъекты.Highlight True
   I = objТекВыдОбъекты.count
   
'Получим список объектов из которых надо отфильтровать новые выделенные объекты
   Call ПоказатьAutoCAD(objAcadDoc)
   If ПризнакНаличияЭлементаВКоллекции("ВыделенныеОбъекты", objAcadDoc.SelectionSets, 2) Then
      objAcadDoc.SelectionSets("ВыделенныеОбъекты").Delete
   End If
   Set objSelection = objAcadDoc.SelectionSets.Add("ВыделенныеОбъекты")
      
On Error Resume Next
   Call ПоказатьAutoCAD(objAcadDoc)
   objSelection.SelectOnScreen

'Получим объект образец по свойствам которого будем отфильтровывать новые выделеннные объекты
   Call ПолучитьОбъектЧертежа(objAcadDoc, objОбразец, "Выдели объект которые надо добавить в набор выделения", "объект", bПрОткл)
   If bПрОткл = True Then Exit Sub

'Отфильтруем выделенные объекты по свойствам объекта образца
'Запомним параметры объекта образца
   sСлой = objОбразец.Layer
   sНазвОбъекта = objОбразец.ObjectName
   vЦвет = objОбразец.Color
   vТипЛиний = objОбразец.LineType
   vВесЛиний = objОбразец.LineWeight
   dМКТЛиний = objОбразец.LinetypeScale
   Set СпДопВыдОбъектов = New Collection
   K = objSelection.count
   For L = 0 To K - 1
      Set objТекЛиния = objSelection(L)
      Do
         If objТекЛиния.ObjectName <> sНазвОбъекта Then Exit Do
         If objТекЛиния.Layer <> sСлой Then Exit Do
         If objТекЛиния.Color <> vЦвет Then Exit Do
         If objТекЛиния.LineType <> vТипЛиний Then Exit Do
         If objТекЛиния.LineWeight <> vВесЛиний Then Exit Do
         If objТекЛиния.LinetypeScale <> dМКТЛиний Then Exit Do
         'Объект прошел все проверки. Добавим его в дополнительный набор выделения
         СпДопВыдОбъектов.Add objТекЛиния
      Loop Until True
   Next L

On Error GoTo ОбработкаОшибок
   J = СпДопВыдОбъектов.count
   ReDim mОбъекты(0 To I + J - 1) As AcadEntity
   For L = 0 To I - 1
      Set mОбъекты(L) = objТекВыдОбъекты(L)
'      objТекВыдОбъекты(L).Highlight True
   Next L
   For L = 1 To J
      Set mОбъекты(I + L - 1) = СпДопВыдОбъектов(L)
'      objSelection(L).Highlight True
   Next L
   K = I + J
   
'Создадим группу выделения "Подсветка"
   If ПризнакНаличияЭлементаВКоллекции("Подсветка", objAcadDoc.SelectionSets, 2) Then
      objAcadDoc.SelectionSets("Подсветка").Delete
   End If
   Set objSelПодсветка = objAcadDoc.SelectionSets.Add("Подсветка")
   objSelПодсветка.AddItems mОбъекты
'Вызовем команду выделения группы "Подсветка"
   objAcadDoc.SendCommand "(progn(defun ss-gripset (/ SS SR SSN I)(vl-load-com)(setq SS(vla-get-selectionsets(vla-get-activedocument (vlax-get-acad-object))) SSN(vla-item SS ""Подсветка"") SR(ssadd))(vlax-for I SSN (ssadd(vlax-vla-object->ename I)SR))(sssetfirst nil SR)(princ))(ss-gripset))\n "
      
'Выведем сообщение о выполненной работе
   objAcadDoc.Utility.Prompt "К текущему набору из " & I & " объектов было добавлено " & J & " выделенных объектов" & vbCrLf & _
   "Всего в текущем наборе объектов " & K & " объектов" & vbCrLf
   
   Exit Sub
ОбработкаОшибок:
   glОтвет = MsgBox("При добавлении выделенных объектов произошла ошибка:" & vbLf & _
         "номер = " & Err.Number & vbLf & _
         "с описанием: " & Err.Description & vbLf & vbLf & _
         "Продолжать выполнение программы?", vbYesNo, gsНазваниеПрограммы)
   If glОтвет = vbNo Then Exit Sub
   Resume Next
End Sub


Public Function ПолучитьОбъектЧертежа(objAcadDoc As AcadDocument, objОбЧ As AcadEntity, sСообщение As String, _
sНазвОбъекта As String, Optional bПрОткл As Boolean = False) As Boolean
'Функция получает объекто чертежа
Dim vIP As Variant
On Error Resume Next
ПолучитьОбъект:
   Call objAcadDoc.Utility.GetEntity(objОбЧ, vIP, sСообщение)
   If Err.Number <> 0 Then
      glОтвет = MsgBox("Продолжать получать " & sНазвОбъекта & " с чертежа?", vbYesNoCancel, gsНазваниеПрограммы)
      Err.Clear
      If glОтвет = vbYes Then
         GoTo ПолучитьОбъект
      ElseIf glОтвет = vbCancel Then
         End
      Else
         ПолучитьОбъектЧертежа = False
         bПрОткл = True
         Exit Function
      End If
   End If
   ПолучитьОбъектЧертежа = True
End Function
МишаИнженер вне форума  
 
Непрочитано 25.01.2025, 09:37
#40
Савелий Пак


 
Регистрация: 24.01.2025
Сообщений: 3


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
'Call the command to select the "Highlight" group
objAcadDoc.SendCommand "(progn(defun ss-gripset (/ SS SR SSN I)(vl-load-com)(setq SS(vla-get-selectionsets(vla-get-activedocument (vlax-get-acad-object))) SSN(vla-item SS ""Highlight"") SR(ssadd))(vlax-for I SSN (ssadd(vlax-vla-object->ename I)SR))(sssetfirst nil SR)(princ))(ss-gripset))\n "
Замечательно! Заработало все

'Вызовем команду выделения группы "Подсветка"
objAcadDoc.SendCommand "(progn(defun ss-gripset (/ SS SR SSN I)(vl-load-com)(setq SS(vla-get-selectionsets(vla-get-activedocument (vlax-get-acad-object))) SSN(vla-item SS ""Подсветка"") SR(ssadd))(vlax-for I SSN (ssadd(vlax-vla-object->ename I)SR))(sssetfirst nil SR)(princ))(ss-gripset))\n "

Почему-то короткое сообщение не ушло и цитаты не выделяются (Модератору).

Это - гениально. Программа пошла. Не знаю Lisp (конечно нельзя гордиться этим, но ...).
В знак благодарности могу поделиться набором функций по вычислению триангуляции

----- добавлено через ~3 мин. -----
Вот код построеня тела с помощью команды _LOFT
Код:
[Выделить все]
    Sub sBuildLoft()
        Dim Acad As Object = GetObject(, "AutoCAD.Application")
        Dim ThisDrawing As Object = Acad.ActiveDocument

        Dim ssetObj As AcadSelectionSet
        Dim rnd = New Random
        Dim dd = Math.Round(rnd.NextDouble * 1000, 0)
        Dim namSS = "Test0" & dd
        ssetObj = ThisDrawing.SelectionSets.Add(namSS)

        Dim obPL1, obPL2 'As AutoCAD.Acad3DPolyline
        Dim p1(8), p2() As Double
        p1 = {6, 3, 10, 10, 1, 6, 8, 5, 7}
        p2 = {6, 3, 0, 10, 1, 0, 8, 5, 0}
        obPL1 = ThisDrawing.ModelSpace.Add3Dpoly(p1)
        obPL1.Closed = True
        obPL2 = ThisDrawing.ModelSpace.Add3Dpoly(p2)
        obPL2.Closed = True

        Dim mObjects(0 To 1) As AcadEntity
        mObjects(0) = ThisDrawing.ModelSpace.Item(0)
        mObjects(1) = ThisDrawing.ModelSpace.Item(1)


        ssetObj.AddItems(mObjects)

        'Create the "Highlight" selection group 
        'If ElementPresenceInCollectionIndicator("Highlight", ThisDrawing.SelectionSets, 2) Then
        '    ThisDrawing.SelectionSets("Highlight").Delete
        'End If

        Dim objSelHighlight As AcadSelectionSet = ThisDrawing.SelectionSets.Add("Highlight3")
        objSelHighlight.AddItems(mObjects)

        'Call the command to select the "Highlight" group 
        ThisDrawing.SendCommand("(progn(defun ss-gripset (/ SS SR SSN I)(vl-load-com)(setq SS(vla-get-selectionsets(vla-get-activedocument (vlax-get-acad-object))) SSN(vla-item SS ""Highlight3"") SR(ssadd))(vlax-for I SSN (ssadd(vlax-vla-object->ename I)SR))(sssetfirst nil SR)(princ))(ss-gripset))\n ")

        ThisDrawing.SendCommand("_Loft  ")

        objSelHighlight.Delete()

    End Sub

Последний раз редактировалось Кулик Алексей aka kpblc, 25.01.2025 в 16:25.
Савелий Пак вне форума  
 
Непрочитано 25.01.2025, 16:25
#41
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Цитата:
Сообщение от Савелий Пак Посмотреть сообщение
Почему-то короткое сообщение не ушло и цитаты не выделяются (Модератору).
Потому что ушло на премодерацию.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.01.2025, 16:47
#42
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Савелий Пак, у вас внутри кода одновременно и позднее связывание
Цитата:
Сообщение от Савелий Пак Посмотреть сообщение
Dim Acad As Object = GetObject(, "AutoCAD.Application")
Dim ThisDrawing As Object = Acad.ActiveDocument
и явное подключение библиотеки акада.

Также интересное объявление инициализации массивов
Цитата:
Сообщение от Савелий Пак Посмотреть сообщение
p1 = {6, 3, 10, 10, 1, 6, 8, 5, 7}
p2 = {6, 3, 0, 10, 1, 0, 8, 5, 0}
это вы вообще на каком языке программирования пишете то?
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как добавить объекты в текущий набор выделенных объектов на чертеже на VBA?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятно как добавить в макрос выбор всех объектов NemoSUN Программирование 10 29.09.2020 10:28
Скрипт для получения Oject ID объекта и поиска объектов по Object ID на чертеже modest-bp AutoCAD 2 19.04.2020 14:39
Количество объектов на чертеже Protreck AutoCAD 15 03.07.2019 13:02
Какой командой можно взорвать все прокси объекты на чертеже akot404 AutoCAD 1 25.06.2016 10:20
Autolisp. Как добавить в набор динамические блоки с определенными именем? vladimirr_b LISP 10 23.02.2016 13:53