Тема: Работа с выделенными объектами
Подскажите, пожайлуста, как к примеру сделать масштабирование на VBA выбранных объектов (различных)?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Работа с выделенными объектами
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите, пожайлуста, как к примеру сделать масштабирование на VBA выбранных объектов (различных)?
> Sliver
То есть, я так понимаю, выделение уже имеется до вызова VBA-макроса. Тогда так:
Sub a() ActiveDocument.SendCommand "_.scale" & vbCr & "_p" & vbCr & vbCr End Sub
Важно, что этот макрос нельзя вызывать командой VBARUN, а только через лисп-функцию vl-vbarun, вот так, например:
(defun c:a ( / ) (vl-vbarun "a")
Потому что, когда вызываешь через команду VBARUN, сбрасывается выделение!!!
Опечатка, надо было так:
(defun c:a ( / ) (vl-vbarun "a"))
> Sliver
А вам именно масштабирование надо?
Cпасибо! А не могли бы вы продемонстрировать код на VBA где сначала веделяют нужные объекты, а потом их масштабируют чтобы можно было указать точку и коэффициент? (Несовсем понимаю как работать с выделенными объектами.)
А вообще реально обработать макросом уже выделенные объекты?
> Sliver
>А вообще реально обработать макросом уже выделенные объекты?
Реально почти все. Лично я в качестве самого легкого решения предпочел делать функцию-"обертку" на LISP, которая в зависимости от (ssgetfirst) вызывает две разные функции на VBA -- в случае, когда выделения нет, и когда оно есть.
Все это хорошо, но Lisp я не знаю совсем, поэтому мне лучше бы пример макросика "как работать с выделенными объектами на VBA (можно задать выделение не заранее, а в процессе макроса - это я смог по help'у а как дальше с выделенным работать не могу разобраться)"
их масштабируют чтобы можно было указать точку и коэффициент
мой пример так и делает, то есть пользователь должен указать и точку, и коэффициент.
А вообще реально обработать макросом уже выделенные объекты?
см. мой пример:), он как раз обрабатывает уже выделенные объекты. Только не вызывайте его через команду VBARUN либо Alt-F8, чтобы не сбросить выделение. А вызывайте через лисп-функцию (vl-vbarun)!
А не могли бы вы продемонстрировать код на VBA где сначала веделяют нужные объекты, а потом их масштабируют чтобы можно было указать точку и коэффициент?
Sub a() Dim ss As AcadSelectionSet On Error Resume Next 'if sel set "MY_SS" doesn't exist now, an error occures ActiveDocument.SelectionSets.Item("MY_SS").Delete 'delete selection set named MY_SS, if that exist On Error GoTo 0 Set ss = ActiveDocument.SelectionSets.Add("MY_SS") 'create sel set named MY_SS, originally it is empty ss.SelectOnScreen 'prompt user to select primitives ActiveDocument.SendCommand "_.scale" & vbCr & "_p" & vbCr & vbCr 'this line is familiar to you:) ActiveDocument.SelectionSets.Item("MY_SS").Delete 'delete selection set named MY_SS. We know, that exist now! MsgBox "Selection set deleted ok. After you press OK button, sub will exit immediately, but SCALE will continue." 'you may remove this line End Sub
Несовсем понимаю как работать с выделенными объектами
Читай хелп по методам и объектам, название которых начинается с Select. Вообще смысл в том, что в каждом открытом документе есть коллекция SelectionSets, состоящая из объектов SelectionSet, которые создаются программно. Насколько я знаю (могу ошибаться!), к нулевому члену коллекции можно обратиться через Doc.ActiveSelection, где Doc - объект типа документ (например, ActiveDocument). То есть нулевой набор - это текущий набор примитивов (пусть меня поправят, если не так!). Если создал именованный набор, то его надо потом уничтожить, иначе коллекция SelectionSets переполнится (там максимум 128 наборов). Но если уничтожать набор по несуществующему имени, возникнет ошибка (набор-то не будет найден). По-хорошему, надо писать код уничтожения так:
Dim ss As AcadSelectionSet For Each ss In ActiveDocument.SelectionSets If ss.Name = "MY_SS" Then ActiveDocument.SelectionSets.Item("MY_SS").Delete Exit For End If Next ss
но можно и так, как у меня:).
Ещё почитай https://www.caduser.ru/forum/topic15378.html вместе со всеми ссылками, которые там есть.
Вот че я хотел отразить в своем макросе (это нужно при всавке таблицы (без линий одни символы в виде autocad entities) из Exel в таблицу в автокаде (надоело вручную задават коэфф. - 6 знаков после запятой для точности:))):
1)Измерить расстояние "а" между 2-мя точками (же получилось)
2) Найти коэффииент 185/а (185 - ширина таблицы)
3) Выделить объекты (разобрался с вашей помощью)
4)Отмасштабировать выделенные элементы с заданным коэффициентом (вот здесь мне нужно чтобы пересчитаный коэффициент подставлялся автоматически, а я тока указал начальную точку)
Вот пункт ? 4 немогли бы вы уточнить с приведенной выше концепцией:)
> Sliver
Там того Лиспа...
(defun C:E2SCALE() (setq a (ssgetfirst)) (if (not (a)) (progn (vl-vbarun "command.setCurrentScale")) (progn (vl-vbarun "command.setScaleforEnt"))) )
Вместо E2SCALE -- определяемая команда.
Вместо command.setCurrentScale -- функция, работающая без выделения.
Вместо command.setScaleforEnt -- функция, берущая выделение.
Дык мне на VBA нужно!
Вот пример из help'a:
Sub Example_ScaleEntity()
' This example creates a light weight polyline
' and then scales that polyline.
' Create the polyline
Dim plineObj As AcadLWPolyline
Dim points(0 To 11) As Double
points(0) = 1: points(1) = 2
points(2) = 1: points(3) = 3
points(4) = 2: points(5) = 3
points(6) = 3: points(7) = 3
points(8) = 4: points(9) = 4
points(10) = 4: points(11) = 2
Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
plineObj.Closed = True
ZoomAll
MsgBox "Scale the polyline by 0.5", , "ScaleEntity Example"
' Define the scale
Dim basePoint(0 To 2) As Double
Dim scalefactor As Double
basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0
scalefactor = 0.5
' Scale the polyline
plineObj.ScaleEntity basePoint, scalefactor
ZoomAll
MsgBox "Scale completed.", , "ScaleEntity Example"
End Sub
Здесь рисуется полилиния и потом она масшабируется. А как к выделенным обектам при менить:
было: plineObj.ScaleEntity basePoint, scalefactor
должно быть: выделенные обекты.ScaleEntity basePoint, scalefactor
А, вроде, как разобрался :) Как раз заранее выделенные обекты используюся. Вот код :)
p = "0,0,0"
s = 2
ActiveDocument.SendCommand "_.scale" & vbCr & p & vbCr & s & vbCr
Тока как в этой команде указать что пользователь сам должен ввести базовую точку?
Sub a() Dim ss As AcadSelectionSet Dim AnyObj As AcadEntity On Error Resume Next 'if sel set "MY_SS" doesn't exist now, an error occures ActiveDocument.SelectionSets.Item("MY_SS").Delete 'delete selection set named MY_SS, if that exist On Error GoTo 0 Set ss = ActiveDocument.SelectionSets.Add("MY_SS") 'create sel set named MY_SS, originally it is empty ss.SelectOnScreen 'prompt user to select primitives For Each AnyObj In acSelSet AnyObj.ScaleEntity basePoint, scalefactor next ActiveDocument.SelectionSets.Item("MY_SS").Delete 'delete selection set named MY_SS. We know, that exist now! MsgBox "Selection set deleted ok. After you press OK button, sub will exit immediately, but SCALE will continue." 'you may remove this line End Sub
ну разумеется basePoint, scalefactor задайй сам
[rus] Izvinjajus'.
Oshibochka.
nado[/rus]
For Each AnyObj In ss AnyObj.ScaleEntity basePoint, scalefactor next
> Sliver
Насчёт ввода вещественных чисел и точек посмотри в хелпе GetReal и GetPoint соответственно.
Во! То что нужно! Немог додуматься вот до такого кода:
For Each AnyObj In ss
AnyObj.ScaleEntity basePoint, scalefactor
next
Спасибо большое!
А вот еще вопросики: в ss.item_i где i=1 to 256. Я так понял в каждом item свой объект, а если их >256, то кол-во item все равно 256?
А как мне в выше приведенном куске кода у выбранных объектов которые являются TEXT'ом поменять стиль на стандартный и WIDTH FACTOR изменить?
Вставка в цикл:
AnyObj.StyleName = "standart" генерит ошибку
то же самое и AnyObj.Width = 0.8
Прадон, должно быть:
AnyObj.StyleName = "standard" работает, а вот с шириной width factor для TEXT не могу ничего поделать. Кто-нибудь знает как изменить эту величину?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Работа с выделенными объектами
Форум работает на PunBB, при поддержке Informer Technologies, Inc