Тема: Как управлять режимами привязки OSNAP?
Подскажите, можно ли в VBA управлять режимами привязки OSNAP
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как управлять режимами привязки OSNAP?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите, можно ли в VBA управлять режимами привязки OSNAP
А чем плох вариант ThisDrawing.SetVariable ?
Когда мало вариантов спасает ?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
А можно поподробнее про "ThisDrawing.SetVariable"
Ну дак ета... хелп, однако ;)
Указывается имя переменной, потом ее значение. Аналог в лиспе - (setvar ...)
Я сейчас за другой машиной, поэтому на память:
Сначала получить значение (по-моему, Osmode = ThisDrawing.GetVariable "Osmode"
ThisDrawing.SetVariable "Osmode" 0 'отключение
ThisDrawing.SetVariable "Osmode" Osmode - восстановление.
Надо проверить на предмет получения значения системной переменной.
Блин,извяняюсь,все таки, может как-то попроще. Может быть пример, код.
VBAmakerу.Привязки включаются, а как обратно?
Короче, смотри:
Из 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
> VBAmaker
При всем уважении: имхо все-таки хорошим тоном будет после необходимых операций восстановить исходное значение системной переменной.
При всем уважении, больше дела, чем слов. Покажи как?
ок, не вопрос. Если функции / процедуры, меняющие значение 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
По поводу методики организации функций / процедур / переменных / постоянных - каждый сам за себя. Просто я так, например, привык.
А говорил я к тому, что если прога постоянно будет сносить любые установки пользователя, она заработает такую отрицательную репутацию, что мама не горюй. Окружение крайне желательно восстанавливать.
P.S. Все написанное - без проверки, не до того, сорри. Если будет что замечено - пишите, попробую разобраться.
P.P.S. > VBAmaker : все сугубо ИМХО.
Сказал красиво, но слишком мудрено.Если такой умный пришли несколько примеров для размещения на сайте:
http://vbamaker.narod.ru/index.html
Буду благодарен.
Да ладно не ругайтесь!Всем большое спасибо!
Да мы и не ругаемся, по-моему :)
> VBAmaker
Я не умный, я тупой ;) СПДС 2.5.32, например, именно сносом привязок грешила, прога отличная, но столько народу от нее отказалось именно по этой причине - ууу... Я знаю минимум 3 конторы, где это дело не применяют именно по этой причине. Начинают ваять свое...
А какие примеры-то? Пример уже здесь :)
Все ниже - можно расценивать как оффтоп, поскольку рассуждения. Сугубо личное мнение.
Если процедура / функция в процессе выполнения меняет значения любых системных переменных (от osmode до dimscale), надо после выполнения процедуры возвращать старое значение. К сожалению, я не знаю, как в VBA можно делать массивы с переменными границами (что такое ReDim - я в курсе, по-моему, применение ReDim обнуляло значения элементов массива, т.е. сделать полностью динамический массив с кондачка не получилось у меня).
Хранить в памяти все (?) системные переменные (а их около 500 штук, по-моему, если не больше) - имхо ненужная трата системных ресурсов, которых и так много не бывает.
Очень сильно хочется сделать универсальную функцию, которая будет хранить в одном месте все измененные системные переменные, но как это сделать на VBA - пока не представляю.
Просто на лиспе это делается проще все-таки.
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.
> 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
Написано очень коряво, но тем не менее работает.
По моему опыту Preserve не работает с многомерными массивами.
Работает. При этом нельзя изменять размерность массива, но можно динамически переопределять UBound его "верхней" размерности.
Dim pV()
ReDim pV(0 To 400, 0 To 100)
ReDim Preserve pV(0 To 400, 0 To 500)
> BP
Спасибо за допинформацию. Принял к сведению.
> kpblc
Конечно это дубовый способ, и он работает. Но стоит попробовать и встроенные средства - Preserve - код упростится.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как управлять режимами привязки OSNAP?
Форум работает на PunBB, при поддержке Informer Technologies, Inc