Тема: Текущий Visual Style
Как определить текущий Visual Style(View->Visual Styles)
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Текущий Visual Style
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как определить текущий Visual Style(View->Visual Styles)
Как определить текущий Visual Style(View->Visual Styles)
Сомневаюсь, что это возможно средствами VBA.
Как определить текущий Visual Style(View->Visual Styles)
Это довольно легко вытянуть из словаря Acad_VISUALSTYLE
Только есть небольшой нюанс надо переключиться в пространство
PaperSpace у меня был где-то пример если найду, то выложу
[FONT=Arial]~'J'~[/FONT]
Как определить текущий Visual Style(View->Visual Styles)
Это довольно легко вытянуть из словаря Acad_VISUALSTYLE
Ничего не путаешь? Не список Visual Style, а именно текущий Visual Style...
Можно получить (через связку VBA<->LISP) DXF код 348 для текущего Viewport (ThisDrawing.ActiveViewport) - это будет ObjectID для VisualStyle.
Еле нашел на старом компе
Да естественно без лиспа тут не обойтись
Option Explicit Public Sub GetVisualStyleName() Dim pv As AcadPViewport Dim vp As AcadViewport Dim curVp As AcadObject If ThisDrawing.GetVariable("tilemode") = 1 Then Set vp = ThisDrawing.ActiveViewport Set curVp = vp Else Set pv = ThisDrawing.ActivePViewport Set curVp = pv End If '/*--- DEBUG ONLY ---'' 'Dim dictObj As AcadDictionary 'Set dictObj = ThisDrawing.Dictionaries.Item("ACAD_VISUALSTYLE") 'Dim itemObj As AcadObject 'Dim vstyleColl As New Collection 'Dim itemName As String 'Dim tmp(0 To 1) As Variant ' 'Dim idx As Integer 'idx = 0 'For Each itemObj In dictObj 'itemName = dictObj.GetName(itemObj) 'tmp(0) = idx: tmp(1) = itemName 'vstyleColl.Add Item:=tmp, key:=CStr(idx) 'idx = idx + 1 'Next ''--- DEBUG ONLY ---*/' Dim cmd As String cmd = "(setvar " & Chr(34) & "USERS1" & Chr(34) & "(cdr (assoc 2 (entget (cdr (assoc 348(entget (cdr (assoc 330(entget (cdr (assoc 360(entget (handent " & Chr(34) & curVp.Handle & Chr(34) & "))))))))))))))" & vbCr ThisDrawing.SendCommand cmd Dim vstyleName As String vstyleName = ThisDrawing.GetVariable("USERS1") MsgBox "SendCommand method: " & vbCr & vstyleName End Sub
[FONT=Arial]~'J'~[/FONT]
Во- первых, большое спасибо за участие в обсуждении.
Во- вторых, я запустил код на AutoCAD 2008 и получил сообщение об ошибке
; error: bad argument type: lentityp nil
Во- первых, большое спасибо за участие в обсуждении.
Во- вторых, я запустил код на AutoCAD 2008 и получил сообщение об ошибке
; error: bad argument type: lentityp nil
И на какой строке такое сообщение?
После отработки скрипта в Command Line добавляются следующие строки:
Command: (setvar "USERS1"(cdr (assoc 2 (entget (cdr (assoc 348(entget (cdr
(assoc 330(entget (cdr (assoc 360(entget (handent "E492"))))))))))))))
; error: bad argument type: lentityp nil
Попробуй в опциях установить:
Main menu -->Tools -->Options -->General -->Error trapping -->Break on Unhanled Errors
У меня в 2009-м работает
У меня, к сожалению, такой опции в 2008 версии нет. Можно ли заменить приведенный код с однократным вызовом ThisDrawing.SendCommand на код в котором необходимо использовать функцию ThisDrawing.SendCommand несколько раз.
Например,
ThisDrawing.SendCommand cmd
на
ThisDrawing.SendCommand cmd1 ThisDrawing.SendCommand cmd2 ........................................ ThisDrawing.SendCommand cmdN
Среди DXF объектов есть объект VISUALSTYLE .Может можно использовать его?
У меня, к сожалению, такой опции в 2008 версии нет.
Это в редакторе VBA ищи там
у меня было все установлено как вы описали. Тот же результат.
Проверил команду
cmd = "princ (entget (handent " & Chr(34) & curVp.Handle & Chr(34) & "))" & vbCr
и получил следующий результат
Command: (entget (handent "E492"))
((-1 . <Entity name: 7efa2510>) (0 . "VPORT") (330 . <Entity name: 7ef9fc40>)
(5 . "E492") (100 . "AcDbSymbolTableRecord") (100 . "AcDbViewportTableRecord")
(2 . "*Active") (70 . 0) (10 0.0 0.0 0.0) (11 1.0 1.0 0.0) (12 -1307.85
-178.299 0.0) (13 0.0 0.0 0.0) (14 10.0 10.0 0.0) (15 10.0 10.0 0.0) (16 0.0
0.0 1.0) (17 0.0 0.0 0.0) (40 . 254.25) (41 . 2.25451) (42 . 50.0) (43 . 0.0)
(44 . 0.0) (50 . 0.0) (51 . 0.0) (71 . 0) (72 . 1000) (73 . 1) (74 . 2) (75 .
0) (76 . 0) (77 . 0) (78 . 0) (281 . 0) (65 . 1) (110 0.0 0.0 0.0) (111 1.0 0.0
0.0) (112 0.0 1.0 0.0) (79 . 0) (146 . 0.0) (348 . <Entity name: 7efa2610>) (60
. 3) (61 . 5) (292 . 1) (282 . 1) (141 . 0.0) (142 . 0.0) (63 . 250) (421 .
3355443))
Команда
cmd = "princ (assoc 360 (entget (handent " & Chr(34) & curVp.Handle & Chr(34) & ")))" & vbCr
Выдает результат
nil
у меня было все установлено как вы описали. Тот же результат.
Объсни по порядку, что ты делал,
трудно вообразить все твои шаги,
тогда будем копать дальше
Я попытался вычленить код, возвращающий nil.
Им оказался следующий код
cmd = "princ (assoc 360 (entget (handent " & Chr(34) & curVp.Handle & Chr(34) & ")))" & vbCr
Это означает, что внутренняя функция cdr в качестве аргумента получает nil.
cmd = "princ (assoc 360 (entget (handent " & Chr(34) & curVp.Handle & Chr(34) & ")))" & vbCr
А где открывающаяся скобка перед princ ?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Текущий Visual Style
Форум работает на PunBB, при поддержке Informer Technologies, Inc