Тема: Как управлять режимами привязки OSNAP?

Подскажите, можно ли в VBA управлять режимами привязки OSNAP

Re: Как управлять режимами привязки OSNAP?

А чем плох вариант ThisDrawing.SetVariable ?

Re: Как управлять режимами привязки OSNAP?

Когда мало вариантов спасает ?SendCommand?. Например:
Public Sub SendComOsnap()
ThisDrawing.SendCommand "-OS" & vbCr & "_Mid" & vbCr
' End,Mid,Cen,Node,Quad,Int,Ins,Perp,Tan,Near,App Int,Ext,Par
End Sub
Public Sub SendComOsnapSet()
ThisDrawing.SendCommand "_OS" & vbCr
End Sub

Re: Как управлять режимами привязки OSNAP?

А можно поподробнее про "ThisDrawing.SetVariable"

Re: Как управлять режимами привязки OSNAP?

Ну дак ета... хелп, однако ;)
Указывается имя переменной, потом ее значение. Аналог в лиспе - (setvar ...)
Я сейчас за другой машиной, поэтому на память:
Сначала получить значение (по-моему, Osmode = ThisDrawing.GetVariable "Osmode"
ThisDrawing.SetVariable "Osmode" 0 'отключение
ThisDrawing.SetVariable "Osmode" Osmode - восстановление.
Надо проверить на предмет получения значения системной переменной.

Re: Как управлять режимами привязки OSNAP?

Блин,извяняюсь,все таки, может как-то попроще. Может быть пример, код.

Re: Как управлять режимами привязки OSNAP?

VBAmakerу.Привязки включаются, а как обратно?

Re: Как управлять режимами привязки OSNAP?

Короче, смотри:
Из Helpа AutoCAD:
Битовый код текущих режимов объектной привязки. Представляет собой сумму следующих значений:
Начальное значение: 4133
0 Ничего - NONe
1 Конечная точка - ENDpoint
2 Середина - MIDpoint
4 Центр - CENter
8 Узел - NODe
16 Квадрант - QUAdrant
32 Пересечение - INTersection
64 Точка вставки - INSertion
128 Перпендикуляр - PERpendicular
256 Касательная - TANgent
512 Ближайшая - NEArest
1024 Быстрая - QUIck
2048 Кажущееся пересечение - APParent Intersection
4096 Продолжение - EXTension
8192 Параллельно - PARallel
Если одновременно должно быть активно несколько режимов, следует ввести сумму соответствующих чисел. Так, например, значение 3 означает комбинацию режимов ?Конточка? (1) и ?Середина? (2). Значение 16383 активизирует все режимы.
Например:
Public Sub OSnap()
ThisDrawing.SendCommand "osmode" & vbCr & "3 " & vbCr & vbCr
'Конечная точка и середина
End Sub

Re: Как управлять режимами привязки OSNAP?

> VBAmaker
При всем уважении: имхо все-таки хорошим тоном будет после необходимых операций восстановить исходное значение системной переменной.

Re: Как управлять режимами привязки OSNAP?

При всем уважении, больше дела, чем слов. Покажи как?

Re: Как управлять режимами привязки OSNAP?

ок, не вопрос. Если функции / процедуры, меняющие значение osmode, находятся в одном модуле, в нем объявляем:

Dim iOsmode As Integer

Для глобальных переменных (когда функции могут находиться в разных местах) делаем один дополнительный модуль, называем его, например, mdlVars:

Global giOsmode As Integer

И пишем функции:

Option Explicit
Dim iOsmode As Integer
Sub ClearOsmode()
  If ThisDrawing.GetVariable("osmode") = 0 Then
    MsgBox "Вы уже работаете без привязки, будьте внимательны!", _
      vbOKOnly + vbCritical + vbApplicationModal, _
      "Ошибка установки привязки"
  Else
    iOsmode = ThisDrawing.GetVariable("osmode")
  End If
End Sub
Sub RestoreOsmode()
  If iOsmode = 0 Then
    MsgBox "Привязку невозможно восстановить!", _
      vbOKOnly + vbCritical + vbApplicationModal, _
      "Ошибка установки привязки"
  Else
    ThisDrawing.SetVariable "osmode", iOsmode
  End If
End Sub
Sub test_drawing_arc(pCenterPoint, lRadius, lStartAngle, lEndAngle)
  ClearOsmode
  ThisDrawing.ModelSpace.AddArc pCenterPoint, lRadius, lStartAngle, lEndAngle
  RestoreOsmode
End Sub

По поводу методики организации функций / процедур / переменных / постоянных - каждый сам за себя. Просто я так, например, привык.
А говорил я к тому, что если прога постоянно будет сносить любые установки пользователя, она заработает такую отрицательную репутацию, что мама не горюй. Окружение крайне желательно восстанавливать.

Re: Как управлять режимами привязки OSNAP?

P.S. Все написанное - без проверки, не до того, сорри. Если будет что замечено - пишите, попробую разобраться.
P.P.S. > VBAmaker : все сугубо ИМХО.

Re: Как управлять режимами привязки OSNAP?

Сказал красиво, но слишком мудрено.Если такой умный пришли несколько примеров для размещения на сайте:
http://vbamaker.narod.ru/index.html
Буду благодарен.

Re: Как управлять режимами привязки OSNAP?

Да ладно не ругайтесь!Всем большое спасибо!

Re: Как управлять режимами привязки OSNAP?

Да мы и не ругаемся, по-моему :)

> VBAmaker
Я не умный, я тупой ;) СПДС 2.5.32, например, именно сносом привязок грешила, прога отличная, но столько народу от нее отказалось именно по этой причине - ууу... Я знаю минимум 3 конторы, где это дело не применяют именно по этой причине. Начинают ваять свое...
А какие примеры-то? Пример уже здесь :)
Все ниже - можно расценивать как оффтоп, поскольку рассуждения. Сугубо личное мнение.
Если процедура / функция в процессе выполнения меняет значения любых системных переменных (от osmode до dimscale), надо после выполнения процедуры возвращать старое значение. К сожалению, я не знаю, как в VBA можно делать массивы с переменными границами (что такое ReDim - я в курсе, по-моему, применение ReDim обнуляло значения элементов массива, т.е. сделать полностью динамический массив с кондачка не получилось у меня).
Хранить в памяти все (?) системные переменные (а их около 500 штук, по-моему, если не больше) - имхо ненужная трата системных ресурсов, которых и так много не бывает.
Очень сильно хочется сделать универсальную функцию, которая будет хранить в одном месте все измененные системные переменные, но как это сделать на VBA - пока не представляю.
Просто на лиспе это делается проще все-таки.

Re: Как управлять режимами привязки OSNAP?

kpblc пишет:

ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]] . . .

    Dim pV()
    ReDim pV(0 To 100)
    ReDim Preserve pV(0 To 500)

Это делает работу с динамическими массивами изумительно лёгкой. Сюда же отнести возможность многомерных массивов и возможность задавать границы не только от нуля, но и от любого числа, в том числе от отрицательного. Это работает не так быстро как на C, но программируется очень быстро и удобно. По моему опыту Preserve не работает с многомерными массивами.
Есть ещё одна великолепная штука в VB и VBA - Collection.

Re: Как управлять режимами привязки OSNAP?

> JS
Насчет Collection не копал, а вот насчет ReDim проверял специально. Если заполнить массив данными (неважно, можно и через Type идти), а потом для него сделать ReDim - чего будет? Правильно, значения массива обнулятся. Т.е. имхо для полной работы с динамическими массивами надо ваять нечто типа такого:

Function DynArray(arBase, lNewValue As Long)
Dim arLocal()
Dim lCounter As Long
  ReDim arLocal(lNewValue)
  For lCounter = 1 To UBound(arBase)
    arLocal(lCounter) = arBase(lCounter)
  Next lCounter
  DynArray = arLocal
End Function
Sub test()
Dim ar(), lCounter
Dim la()
  ReDim ar(10)
  For lCounter = 1 To 10
    ar(lCounter) = lCounter
  Next lCounter
  la = DynArray(ar, 20)
  ar() = la()
  For lCounter = 1 To 20
    Debug.Print ar(lCounter)
  Next lCounter
End Sub

Написано очень коряво, но тем не менее работает.

Re: Как управлять режимами привязки OSNAP?

JS пишет:

По моему опыту Preserve не работает с многомерными массивами.

Работает. При этом нельзя изменять размерность массива, но можно динамически переопределять UBound его "верхней" размерности.
Dim pV()
    ReDim pV(0 To 400, 0 To 100)
    ReDim Preserve pV(0 To 400, 0 To 500)

Re: Как управлять режимами привязки OSNAP?

> BP
Спасибо за допинформацию. Принял к сведению.

> kpblc
Конечно это дубовый способ, и он работает. Но стоит попробовать и встроенные средства - Preserve - код упростится.