Тема: Работа с выделенными объектами

Подскажите, пожайлуста, как к примеру сделать масштабирование на VBA выбранных объектов (различных)?

Re: Работа с выделенными объектами

> Sliver
То есть, я так понимаю, выделение уже имеется до вызова VBA-макроса. Тогда так:

Sub a()
  ActiveDocument.SendCommand "_.scale" & vbCr & "_p" & vbCr & vbCr
End Sub

Важно, что этот макрос нельзя вызывать командой VBARUN, а только через лисп-функцию vl-vbarun, вот так, например:
(defun c:a ( / ) (vl-vbarun "a")
Потому что, когда вызываешь через команду VBARUN, сбрасывается выделение!!!

Re: Работа с выделенными объектами

Опечатка, надо было так:
(defun c:a ( / ) (vl-vbarun "a"))

Re: Работа с выделенными объектами

> Sliver
А вам именно масштабирование надо?

Re: Работа с выделенными объектами

Cпасибо! А не могли бы вы продемонстрировать код на VBA где сначала веделяют нужные объекты, а потом их масштабируют чтобы можно было указать точку и коэффициент? (Несовсем понимаю как работать  с выделенными объектами.)
А вообще реально обработать макросом уже выделенные объекты?

Re: Работа с выделенными объектами

> Sliver
>А вообще реально обработать макросом уже выделенные объекты?
Реально почти все. Лично я в качестве самого легкого решения предпочел делать функцию-"обертку" на LISP, которая в зависимости от (ssgetfirst) вызывает две разные функции на VBA -- в случае, когда выделения нет, и когда оно есть.

Re: Работа с выделенными объектами

Все это хорошо, но Lisp я не знаю совсем, поэтому мне лучше бы пример макросика "как работать с выделенными объектами на VBA (можно задать выделение не заранее, а в процессе макроса - это я смог по help'у а как дальше с выделенным работать не могу разобраться)"

Re: Работа с выделенными объектами

Sliver пишет:

их масштабируют чтобы можно было указать точку и коэффициент

мой пример так и делает, то есть пользователь должен указать и точку, и коэффициент.

А вообще реально обработать макросом уже выделенные объекты?

см. мой пример:), он как раз обрабатывает уже выделенные объекты. Только не вызывайте его через команду 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 вместе со всеми ссылками, которые там есть.

Re: Работа с выделенными объектами

Спасибо! Буду разбираться!

Re: Работа с выделенными объектами

Вот че я хотел отразить в своем макросе (это нужно при всавке таблицы (без линий одни символы в виде autocad entities) из Exel в таблицу в автокаде (надоело вручную задават коэфф. - 6 знаков после запятой для точности:))):
1)Измерить расстояние "а" между 2-мя точками (же получилось)
2) Найти коэффииент 185/а (185 - ширина таблицы)
3) Выделить объекты (разобрался с вашей помощью)
4)Отмасштабировать выделенные элементы с заданным коэффициентом (вот здесь мне нужно чтобы пересчитаный коэффициент подставлялся автоматически, а я тока указал начальную точку)
Вот пункт ? 4 немогли бы вы уточнить с приведенной выше концепцией:)

Re: Работа с выделенными объектами

> 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 -- функция, берущая выделение.

Re: Работа с выделенными объектами

Дык мне на 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

Re: Работа с выделенными объектами

А, вроде, как разобрался :) Как раз заранее выделенные обекты используюся. Вот код :)
  p = "0,0,0"
  s = 2
  ActiveDocument.SendCommand "_.scale" & vbCr & p & vbCr & s & vbCr
Тока как в этой команде указать что пользователь сам должен ввести базовую точку?

Re: Работа с выделенными объектами

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  задайй сам

Re: Работа с выделенными объектами

[rus] Izvinjajus'.
Oshibochka.
nado[/rus]

For Each AnyObj In ss
 AnyObj.ScaleEntity basePoint, scalefactor
next

Re: Работа с выделенными объектами

> Sliver
Насчёт ввода вещественных чисел и точек посмотри в хелпе GetReal и GetPoint соответственно.

Re: Работа с выделенными объектами

Во! То что нужно! Немог додуматься вот до такого кода:
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

Re: Работа с выделенными объектами

Прадон, должно быть:
AnyObj.StyleName = "standard" работает, а вот с шириной width factor для TEXT не могу ничего поделать. Кто-нибудь знает как изменить эту величину?