Тема: AcadSelectionSet для ручной модификации
Dim vSS As AcadSelectionSet
Есть заполненный vSS, как его элементы выделить для ручной модификации, подобно тому как мы выделяем объекты мышью.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → AcadSelectionSet для ручной модификации
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Dim vSS As AcadSelectionSet
Есть заполненный vSS, как его элементы выделить для ручной модификации, подобно тому как мы выделяем объекты мышью.
Неужели это никто не реализовывал?
В Lisp: (sssetfirst)
В VBA: AutoCAD.Application.ActiveDocument.PickfirstSelectionSet - но это свойство read-only, так что врядли тебе удастся им воспользоваться в данном случае.
> kpblc
нет
_________
нужно сделать вот что то наподобие вот этого
vSS.Highlight True ThisDrawing.SendCommand "(sssetfirst (ssget ""_P"") ) "
но чтоб это не была красивая потделка, как у меня, т.е. после этого, чтоб я мог делать все что мне нужно, например удалить, перместить, но в ручную, программно я знаю как :).
Сейчас борюсь с этим же...не могу свой программный набор сделать активным для SendCommand. На "(sssetfirst (ssget ""_P"") ) " пишет "нет предыдущего набора", хотя они все подсвечены. Я понимаю, что подсвечены и выбраны это разные вещи.
> Ольга
Если объекты уже выбраны, то:
(ssget)
вернет набор без лишних запросов. Или по другому:
(sssetfirst nil (ssget))
Если нет выбора - будет запрос, но только первый раз, а после будет возвращать каждый раз новые наборы с одними и теми же объектами, хотя подсветка сохранится...
> Ольга
Кстати, есть свойство документа
ActiveSelectionSet
может оно?
> Евгений Елпанов
Это обратное действие от того что необходимо. Оно заполняет vSS теми объектами которые селектированны, на чертеже.
Нет, объекты я создала на чертеже, и в процессе создания, необходимые положила в свой SelectionSet. Для команд sendcommand берет из ActiveSelectionSet.
Так и не могу ничего сделать, извращаюсь как могу: запускаю то VBA, то VLISP, неужели никому не надо было?? перенести (повернуть и тд) только что отрисованные объекты на VBA весь набор, что бы пользователь с помощью мышки мог ввести данные на экране(в VLISP пользуюсь pause)
Мне надо, Великие Гуру поможите нам, если Вы существуете ;)
Посмотрите на vbamaker.narod.ru - там есть несколько кодов, по-моему, которые работают с ActiveSelectionSet. Только странно - а зачем использовать SendCommand, если можно попробовать работать через штатные свойства и методы объектов?
ну как можно через штатные свойста и методы перенести весь набор?? туда куда укажет пользователь?
Я тоже голову сломал, пытаясь подсветить созданный SelectionSet по аналогии QSelect-а.:/
Аналогично! Интересует эта проблемма! Тоже необходимо выделить объекты программно.
Для чего?
Да потому что некоторые объекты не имеют методов, которые можно произвести врудную.
Например у 3DSolid нет метода Explode. А выделив объекты, над ними можно делать все, что возможно сделать вручную.
Так что пока ломаем голову над этим вопросом.
Нашел!!!
Измываясь над _select, обнаружил ее родственницу _PSELECT (есть иконка на окне properties рядом с qselect). Команда в отличие от _SELECT после выбора еще и подсвечивает его грипсами для модификации! Самое странное, что в хелпе эта команда НИКАК и НИГДЕ не фигурирует(!?)
Хотя, скорее всего, многие местные корифеи знали о ее существовани, но, видимо не догадывались о ее полезности в VBA:). Например, теперь я могу, ни много - ни мало, построить свою аналогию QSELECT!
> Сидор Лютый
Терзают меня смутные подозрения что эта родственица
имеет фамилию PickFirstSelectionSet
~'J'~
Сомнения абсолютно безосновательны!:)
Это совсем другая тема.. PickFirstSelectionSet просто позволяет занести в SelectionSet объекты, выделенные ДО запуска макроса. И ведет себя этот selectionset так же, как и другие его собратья (по-свински:)), - ни с какими баранками не передаст себя назад в автокад для дальнейшей модификации..
Нашел наконец свою старую программку, которая использует совместную работу VBA & LISP, передавая значения (handle) через штатную системную переменную USERS1.
Набор A_SSet создается средствами VBA, а затем подсвечивается средствами LISP:
'VBA - part '------------------------------------------------------- Private Sub Grips(A_SSet As AcadSelectionSet) 'создание пустого набора средствами LISP: ThisDrawing.SendCommand "CreateSet" & vbCr 'заполнение "лисповского" набора примитивами из A_SSet: Dim EntHandle As String Dim OldName As String Dim sysVarName As String sysVarName = "USERS1" 'сохранение настройки USERS1: OldName = ThisDrawing.GetVariable("USERS1") Dim i As Integer For i = 0 To (A_SSet.Count - 1) EntHandle = A_SSet.Item(i).Handle ThisDrawing.SetVariable sysVarName, EntHandle ThisDrawing.SendCommand "FullSet" & vbCr Next i 'подсветка примитивов из набора: ThisDrawing.SendCommand "GripsSet" & vbCr 'обработка набора командой PROPERTIES: ThisDrawing.SendCommand "PROPERTIES" & vbCr 'восстановление предыдущей настройки USERS1: ThisDrawing.SetVariable sysVarName, OldName End Sub
;;LISP - part ;;------------------------------------------------------- ;;создание набора примитивов (defun C:CreateSet (/) (setq SelSet_LN (ssadd)) ) ;;CreateSet ;;заполнение набора примитивами по их меткам (defun C:FullSet (/ EntHandle) (setq EntHandle (getvar "USERS1")) (ssadd (handent EntHandle) SelSet_LN) ) ;;CreateSet ;;подсветка примитивов набора (defun C:GripsSet (/) (sssetfirst nil SelSet_LN) ) ;;GripsSet ;;снятие подсветки (defun C:UnGripsSet (/) (sssetfirst nil) (setq SelSet_LN nil) ) ;;UnGripsSet
А вот пример через VBA. Написал для выделения объектов указанного типа в указанном слое. (Указываете какой-нибудь объект и по его имени и слою выделяются остальные)
Option Explicit 'Выделение объектов по типу и слою 'by Алексей Громов Sub SelByName() Dim Etalon As AcadEntity Dim PPoint As Variant Dim ss As AcadSelectionSet Dim SSet As AcadSelectionSet Dim EtName As String Dim EtLay As String Dim FType(3) As Integer Dim FData(3) As Variant Dim SETS As AcadSelectionSets Dim ASpace As AcActiveSpace On Error Resume Next Set SETS = ThisDrawing.SelectionSets Call SSCheck("SS01") ThisDrawing.Utility.GetEntity Etalon, PPoint, "Выбрать по:" If Etalon Is Nothing Then Exit Sub End If Select Case Etalon.EntityName Case "AcDb3dPolyline" EtName = "polyline" Case "AcDb2dPolyline" EtName = "polyline" Case "AcDbPolyline" EtName = "lwpolyline" Case "AcDbBlockReference" EtName = "insert" Case "AcDbAlignedDimension" EtName = "dimension" Case "AcDbRotatedDimension" EtName = "dimension" Case Else EtName = Replace(Etalon.EntityName, "AcDb", "") End Select EtLay = Etalon.Layer ASpace = (Not ThisDrawing.ActiveSpace) + 2 FType(0) = 0 FData(0) = EtName FType(1) = 8 FData(1) = EtLay FType(2) = 67 FData(2) = ASpace FType(3) = 100 FData(3) = Etalon.ObjectName Set SSet = SETS("SS01") SSet.Select acSelectionSetAll, , , FType, FData ThisDrawing.SendCommand "_pselect" & vbCr & "p" & vbCr & vbCr End Sub
Function SSCheck(SSNM As String) Dim SelSet As AcadSelectionSet Dim CheckFlag As Boolean CheckFlag = False For Each SelSet In ThisDrawing.SelectionSets If SelSet.Name = SSNM Then CheckFlag = True End If Next SelSet If CheckFlag = False Then ThisDrawing.SelectionSets.Add (SSNM) Else ThisDrawing.SelectionSets(SSNM).Clear End If End Function
На всех кадовских объектах не тестировал, писал для себя.. Так что при необходимости эту часть можно будет дополнить:
Select Case Etalon.EntityName . . . End Select
Функция в конце нужна для проверки SelectionSet-а на существование, т.к. обычная связка
For Each SelSet In ThisDrawing.SelectionSets If SelSet.Name = "SS01" Then SelSet.Delete Exit For End If Next SelSet
у меня почему-то периодически сворачивает напрочь VBE и Автокад. А почему - не могу понять.
> Сидор Лютый
Особая благодарность за строку
ThisDrawing.SendCommand "_pselect" & vbCr & "p" & vbCr & vbCr
> SmeL
На 2006 ACAD данная строка у меня почему-то не работает, пишет, что нет такой команды.
Без Lisp видимо не обойтись, ниже привожу немного подправленный код, из вышеприведённых примеров, выбирает все объекты в пространстве модели:
Sub SelectToGRIP() Dim AcadObj As AcadObject Dim ArrayObj(0) As AcadObject Dim SelGroupObjs As AcadGroup With ActiveDocument For Each SelGroupObjs In .Groups If UCase(SelGroupObjs.Name) = "$EXPSELGROUPOBJS_0A1H2F3B" Then SelGroupObjs.Delete: Exit For Next SelGroupObjs Set SelGroupObjs = .Groups.Add("$EXPSELGROUPOBJS_0A1H2F3B") For Each AcadObj In .ModelSpace Set ArrayObj(0) = AcadObj SelGroupObjs.AppendItems ArrayObj Next AcadObj Set AcadObj = Nothing .SendCommand _ "(sssetfirst nil)" & _ "(setq expsel(ssget))" & vbCr & _ "_Group" & vbCr & "$EXPSELGROUPOBJS_0A1H2F3B" & vbCr & vbCr & _ "(sssetfirst nil expsel)" & _ "(princ)" & vbCr End With SelGroupObjs.Delete Set SelGroupObjs = Nothing End Sub
Если AutoCAD русский или ещё какой тогда нужно так:
ThisDrawing.SendCommand "_pselect" & vbCr & "_p" & vbCr & vbCr
Доброго времени суток
Мой вопрос почти в тему:
У меня имеется некий код на VBA и приделанная к acad команда "_comm1" (типа черного ящика), которая не умеет нормально выбирать объекты (обрабатывает по двадцать-тридцать максимум объектов), но выполняет чрезвычайно важное действие.
Из VBA надо вызвать эту команду и в цикле подсовывать ей уже сформированный набор.
Примерно так:
ThisDrawing.SendCommand "_comm1" & vbCr & "_p" & vbCr & vbCr
Но для этого нужно свои объекты программно поместить в previous selection set. На VBA это вообще можно?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → AcadSelectionSet для ручной модификации
Форум работает на PunBB, при поддержке Informer Technologies, Inc