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

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

Как на VBA определить, есть ли в активном чертеже выделенные примитивы?

Ответ
Поиск в этой теме
Непрочитано 24.11.2010, 10:47 #1
Как на VBA определить, есть ли в активном чертеже выделенные примитивы?
AlexV
 
Инженер
 
С-Пб
Регистрация: 02.10.2008
Сообщений: 3,685

Возможно ли сие? И возможно ли средствами VBA выделить набор объектов аналогично выбору пользователя рамкой? (есть конечно возможность подсветки Highlight, но как выделить грипсы?)

.. ну, предположим, с первой частью вопроса понятно..
Код:
[Выделить все]
ThisDrawing.PickfirstSelectionSet.Count
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 24.11.2010 в 11:27.
Просмотров: 9451
 
Непрочитано 25.11.2010, 10:37
2 | #2
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Тогда сразу по второй части.

Давным давно (in a galaxy far, far away...) мне крыс помог решить этот вопрос. Как ты понимаешь на лиспе.

Код:
[Выделить все]
;подсветка набора "Подсветка"
(defun selset-gripset ( / selSets selres selSpdsNode item)
  	(vl-load-com)
	(setq selSets (vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object))))
   (setq selSpdsNode (vla-item selSets "Подсветка"))
   (setq selres (ssadd))
   (vlax-for item selSpdsNode
	  (ssadd (vlax-vla-object->ename item) selres)
   )
   (sssetfirst nil selres)
   (princ)
)
Суть такая, я в vba формирую набор selectionSet с именем "Подсветка". И запускаю этот лисп.
Если тебе такой способ подходит, приведу свой пример загрузки и вызова из vba.

Возможно можно подкоректировать лисп под твои требования.

Последний раз редактировалось Vildar, 25.11.2010 в 10:45.
Vildar вне форума  
 
Непрочитано 26.11.2010, 08:49
#3
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


спасибо, давно искал нечто подобное

Последний раз редактировалось gizmo_zx, 26.11.2010 в 09:08.
gizmo_zx вне форума  
 
Непрочитано 26.11.2010, 09:17
#4
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Ребята, я же не написал как это вызывать из vba. Все вкурсе?!
Расказываю, через SendCommand
Vildar вне форума  
 
Автор темы   Непрочитано 26.11.2010, 10:42
1 | #5
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от Vildar Посмотреть сообщение
Ребята, я же не написал как это вызывать из vba. Все вкурсе?!
Расказываю, через SendCommand
Ага.. в курсе..
Код:
[Выделить все]
ThisDrawing.SendCommand "(selset-gripset) "
Да, полезный лисп, спасибо Vildarу & Kpblcу.. Интересно всеж, неужто в VBA таки нет метода, программно создающего аналог выбора пользователем набора примитивов? В лиспе делает это функция sssetfirst, судя по всему?

А еще интересно, можно ли такую функцию определить и выполнить через комстроку.. Ну, что б можно было не подгружать лисп файл, а зарядить весь код в строковую переменную, и передать этим самым сендкоммандом автокаду.. Нельзя наверное..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 26.11.2010 в 11:29.
AlexV вне форума  
 
Непрочитано 26.11.2010, 17:49
1 | #6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Нельзя наверное.
Почему? Сделай одну длинную строчку вида
Код:
[Выделить все]
"(progn(defun selset-gripset ( / selSets selres selSpdsNode item) ... (princ))(selset-gripset))\n"
Лишь бы длинны строки хватило. Но можно переименовать название ф-ции и переменных по короче.
***Добавлено
Вот ф-ция с измененными названиями переменных
Код:
[Выделить все]
;_подсветка набора "Подсветка"
(defun ss-gripset (/ SS SR SSN  I)
  (vl-load-com)
  (setq SS (vla-get-selectionsets
             (vla-get-activedocument (vlax-get-acad-object))
           ) ;_ end of vla-get-SelectionSets
  ) ;_ end of setq
  (setq SSN (vla-item SS "Подсветка") SR (ssadd))
  (vlax-for I SSN
    (ssadd (vlax-vla-object->ename I) SR)
  ) ;_ end of vlax-for
  (sssetfirst nil SR)
  (princ)
) ;_ end of defun
И строчка
Цитата:
"(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"
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 26.11.2010 в 17:56.
VVA вне форума  
 
Непрочитано 26.11.2010, 22:50
#7
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от AlexV Посмотреть сообщение
Возможно ли сие? И возможно ли средствами VBA выделить набор объектов аналогично выбору пользователя рамкой? (есть конечно возможность подсветки Highlight, но как выделить грипсы?)

.. ну, предположим, с первой частью вопроса понятно..
Код:
[Выделить все]
ThisDrawing.PickfirstSelectionSet.Count
Можно так
Код:
[Выделить все]
ThisDrawing.SendCommand ("(sssetfirst nil (ssget " & Chr(34) & "_P" & Chr(34) & ")) ") '<--set blank space at the end!
только метод SendCommand вызывается асинхронно, лучше смотреть в сторону функции Windows API "SendMessage"
cм. например здесь
http://through-the-interface.typepad...ques_for_.html
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 29.11.2010, 10:45
#8
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от VVA Посмотреть сообщение
Почему? Сделай одну длинную строчку вида
"(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"
О, VVA, спасибо! то что нужно! Интересно, а вывод в комстроку текста можно отключить на время работы функции? Это, конечно, не обязательно, просто в порядке любопытства..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.07.2014, 17:46
#9
sam_n


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


Может я что-то не догоняю, но не хочет работать.
Говорит при загрузке лиспа
ошибка: Ошибка Automation. Ключ не найден
sam_n вне форума  
 
Непрочитано 03.07.2014, 23:05
#10
Linkor

что хочу, то и делаю
 
Регистрация: 30.06.2014
Сообщений: 119


Цитата:
Сообщение от AlexV Посмотреть сообщение
Ага.. в курсе..
Код:
[Выделить все]
ThisDrawing.SendCommand "(selset-gripset) "
Да, полезный лисп, спасибо Vildarу & Kpblcу.. Интересно всеж, неужто в VBA таки нет метода, программно создающего аналог выбора пользователем набора примитивов? В лиспе делает это функция sssetfirst, судя по всему?
Я делаю пользовательский выбор объектов так:
Dim sel as AcadSelectionSet
Set sel=ThisDrawing.SelectionSets.Add("temp")
sel.SelectOnScreen
когда становится не нужным удаляем sel.Delete

ЗЫ: нет под рукой vba, возможны не точности кода
Linkor вне форума  
 
Непрочитано 07.08.2018, 00:44
#11
mel2


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


Может кто-то подсказать. Пишу VBA команду :
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))))(setq SSN(vla-item SS "TestSelectionSetFilter3"))(setq SR(ssadd))(vlax-for I SSN (ssadd(vlax-vla-object->ename I)SR))(sssetfirst nil SR)(princ))(ss-gripset))\n"
Выдает ошибку - complete error: end of statemen.
Выделяем название в кавычках.
(Autocad 2018 64bit)
mel2 вне форума  
 
Непрочитано 07.08.2018, 01:38
#12
Сергей812


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


1. А где тут код VBA?)
2. Сам то код на лиспе рабочий?
Сергей812 вне форума  
 
Непрочитано 07.08.2018, 06:46
#13
Boxa

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


mel2, нда... я бы порекомендовал Вам прочитать про конкатенацию строк в VBA вообще и про использование кавычек при этом в частности, а так же обратить внимание на команду Chr().
Думаю после этого, у Вас все получиться.
Boxa вне форума  
 
Непрочитано 07.08.2018, 09:21
#14
mel2


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


Спасибо. Только разбираюсь с VBA. С кавычками вроде бы разобрался. VBA ошибок не выдает, код запускается, но в командой строке выдает ошибку скобок:
------------------------------------------------------------------
: (progn(defun c:selset-gripset ( / selSets selres selSpdsNode item)(vl-load-com)(setq selSets (vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object))))(setq selSpdsNode (vla-item selSets "test5"))(setq selres (ssadd)) (vlax-for item selSpdsNode (ssadd (vlax-vla-object->ename item) selres) ) (sssetfirst nil selres) (princ))(selset-gripset))\n

; ----- Error around expression -----
(PRINC)
;
; error : extra right parenthesis on input
------------------------------------------------------------------
Но если подгрузить .lsp файл с этой же строкой :
------------------------------------------------------------------
(defun c:selset-gripset ( / selSets selres selSpdsNode item)(vl-load-com)(setq selSets (vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object))))(setq selSpdsNode (vla-item selSets "test4"))(setq selres (ssadd)) (vlax-for item selSpdsNode (ssadd (vlax-vla-object->ename item) selres) ) (sssetfirst nil selres) (princ))
------------------------------------------------------------------
То все работает. В чем может быть причина?
mel2 вне форума  
 
Непрочитано 07.08.2018, 09:23
#15
Кулик Алексей aka kpblc
Moderator

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


Во-первых, строка не такая же. Во-вторых, а наборы с такими именами точно есть?

----- добавлено через 38 сек. -----
В-третьих, ты определяешь функцию или команду?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.08.2018, 09:33
#16
mel2


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


Прошу не кидать сильно камнями. Многого не понимаю еще... Просто пытаюсь организовать выделение подсвеченных объектов выборки на чертеже, как предложено в этой теме. Других вариантов, как это можно сделать, к сожалению, не нашел. Буду благодарен, если подскажите, как правильно (лучше) это сделать...
mel2 вне форума  
 
Непрочитано 07.08.2018, 09:40
#17
Boxa

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


Цитата:
Сообщение от mel2 Посмотреть сообщение
Буду благодарен, если подскажите, как правильно (лучше) это сделать...
я подскажу. Забыть про VBA и переходить на .NET, там это в одну строчку делается.
Код:
[Выделить все]
Ed.Editor acEd = App.Application.DocumentManager.MdiActiveDocument.Editor;
Db.ObjectId[] idarrayEmpty; //Массив ObjectId объектов, которые нужно выбрать

acEd.SetImpliedSelection(idarrayEmpty); собственно выбор
Boxa вне форума  
 
Непрочитано 07.08.2018, 09:57
#18
mel2


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


Я думал про .NET. Но решил начать с VBA, т.к. он встроен в Acad ,и MS Office (не надо сторонних программ). И показался попроще чем .NET в освоении... по крайней мере для простых задач.
mel2 вне форума  
 
Непрочитано 07.08.2018, 10:19
#19
Сергей812


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


Цитата:
Сообщение от mel2 Посмотреть сообщение
Я думал про .NET. Но решил начать с VBA, т.к. он встроен в Acad ,и MS Office (не надо сторонних программ). И показался попроще чем .NET в освоении... по крайней мере для простых задач.
тоже начинал с VBA - и он, кстати, далеко не встроен по умолчанию в акад уже много лет. Как только доходит до простых задач - отсортировать, поиск и т.д. - уже становиться очень грустно. Формы без поддержки контейнерного заполнения (упрощенно - когда задаются взаиморасположение элементов и отступы, а все размеры и положения контролов сами подсчитываются) и кастрированным набором контролов тоже не внушают оптимизма. Можно, конечно, подключать библиотеки для тех же дополнительных контролов - но это проблемы с переносом приложения.

А из сторонних программы нужна лишь бесплатная студия. Но тут возникает вопрос - пишете код официально или пытаетесь упростить себе жизнь неофициально? Если официально - напрямую или через начальника отдела служебку на имя сисадмина. Если неофициально - зависит от того, насколько вась-вась с сисадмином)
Сергей812 вне форума  
 
Непрочитано 07.08.2018, 10:38
#20
mel2


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
пишете код официально или пытаетесь упростить себе жизнь неофициально?
Я больше для себя, упростить рутинные операции. VBA привлек тем, что можно будет быстро набросать код прямо из автокада для спонтанно возникшей задачи. А Visual Studio я себе уже скачал для .NET Но поскольку время потрачено на изучение VBA, а кое-какие задачи надо решить быстрее, хочу все-таки добить поставленную задачу с помощью VBA.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
далеко не встроен по умолчанию в акад уже много лет.
да, но легко внедряется.
mel2 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как на VBA определить, есть ли в активном чертеже выделенные примитивы?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Есть ли возможность графики в VBA на форме (PictureBox)? Alexey_02 Программирование 8 13.02.2013 14:08
Есть ли программа для присвоения примитивам в чертеже свойства аннотативности? Chapter Программирование 12 08.07.2010 00:30
Получения списка кривых на чертеже (VBA) Тензор Программирование 3 12.12.2009 19:39
Запись макросов VBA в ACAD`e; возможность есть? ssv22 Программирование 9 19.02.2009 20:22
примитивы в VBA... Хотабыч Программирование 1 22.08.2005 13:10