Тема: Текущий Visual Style

Как определить текущий Visual Style(View->Visual Styles)

Re: Текущий Visual Style

Vadim пишет:

Как определить текущий Visual Style(View->Visual Styles)

Сомневаюсь, что это возможно средствами VBA.

Re: Текущий Visual Style

Vadim пишет:

Как определить текущий Visual Style(View->Visual Styles)

Это довольно легко вытянуть из словаря Acad_VISUALSTYLE
Только есть небольшой нюанс надо переключиться в пространство
PaperSpace у меня был где-то пример если найду, то выложу

[FONT=Arial]~'J'~[/FONT]

(изменено: Александр Ривилис, 19 марта 2012г. 17:33:09)

Re: Текущий Visual Style

Vadim пишет:

Как определить текущий Visual Style(View->Visual Styles)

fixo пишет:

Это довольно легко вытянуть из словаря Acad_VISUALSTYLE

Ничего не путаешь? Не список Visual Style, а именно текущий Visual Style...
Можно получить (через связку VBA<->LISP) DXF код 348 для текущего Viewport (ThisDrawing.ActiveViewport) - это будет ObjectID для VisualStyle.

Re: Текущий Visual Style

Еле нашел на старом компе
Да естественно без лиспа тут не обойтись

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]

Re: Текущий Visual Style

Во- первых, большое спасибо за участие в обсуждении.
Во- вторых, я запустил код на AutoCAD 2008 и получил  сообщение об ошибке
; error: bad argument type: lentityp nil

Re: Текущий Visual Style

Vadim пишет:

Во- первых, большое спасибо за участие в обсуждении.
Во- вторых, я запустил код на AutoCAD 2008 и получил сообщение об ошибке
; error: bad argument type: lentityp nil

И на какой строке такое сообщение?

Re: Текущий Visual Style

После отработки скрипта в 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

Re: Текущий Visual Style

Попробуй в опциях установить:
Main menu -->Tools -->Options -->General -->Error trapping -->Break on Unhanled Errors
У меня в 2009-м работает

(изменено: Vadim, 25 марта 2012г. 12:20:18)

Re: Текущий Visual Style

У меня, к сожалению, такой опции в 2008 версии нет. Можно ли заменить приведенный код  с  однократным  вызовом   ThisDrawing.SendCommand  на код в котором необходимо использовать функцию ThisDrawing.SendCommand несколько раз.

Например,

ThisDrawing.SendCommand  cmd

на

ThisDrawing.SendCommand  cmd1
ThisDrawing.SendCommand  cmd2
........................................  
ThisDrawing.SendCommand  cmdN

Среди DXF объектов есть объект VISUALSTYLE .Может можно использовать его?

Re: Текущий Visual Style

Vadim пишет:

У меня, к сожалению, такой опции в 2008 версии нет.

Это в редакторе VBA ищи там

(изменено: Vadim, 8 апреля 2012г. 14:54:23)

Re: Текущий Visual Style

у меня было все установлено как вы описали. Тот же результат.

Проверил команду

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

Re: Текущий Visual Style

Vadim пишет:

у меня было все установлено как вы описали. Тот же результат.

Объсни по порядку, что ты делал,
трудно вообразить все твои шаги,
тогда будем копать дальше

Re: Текущий Visual Style

Я попытался вычленить код, возвращающий nil.
Им оказался следующий код

cmd = "princ (assoc 360 (entget (handent " & Chr(34) & curVp.Handle & Chr(34) & ")))" & vbCr

Это означает, что внутренняя функция cdr в качестве аргумента получает nil.

Re: Текущий Visual Style

Vadim пишет:

cmd = "princ (assoc 360 (entget (handent " & Chr(34) & curVp.Handle & Chr(34) & ")))" & vbCr

А где открывающаяся скобка перед princ ?