Создание (изменение) размерного стиля в AutoCad из vba Access

Автор Тема: Создание (изменение) размерного стиля в AutoCad из vba Access  (Прочитано 18249 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Добрый день!
Хочу внести изменения в размерный стиль AutoCad программным путем.
Для опытов использую код взятый на просторах Инета

   
Код - Visual Basic [Выбрать]
  1.     Dim oDict As Variant
  2.     Set oDict = acadDoc.Dictionaries.Item("ACAD_MLEADERSTYLE")
  3.     Dim i As Long
  4.     For i = 0 To oDict.Count - 1
  5.     Dim oObj As Variant
  6.     Set oObj = oDict.Item(i)
  7.     If oObj.ObjectName = "AcDbMLeaderStyle" Then
  8.         Dim oMLS As Object
  9.         Set oMLS = oObj
  10.         MsgBox "Name = " & oMLS.Name & vbCrLf & _
  11.         "Annotative = " & oMLS.Annotative & vbCrLf & _
  12.         "ContentType = " & oMLS.ContentType & vbCrLf & _
  13.         "LeaderLineType = " & oMLS.LeaderLineType, vbInformation, "MLeader Styles"
  14.     End If
  15.     Next i
  16.  
Проблема в следующем ....
через окно сообщений вижу только один размерный стиль "Standard"
В watches наблюдаю следующее:
В Dictionaries не вижу существующих размерных стилей кроме "Standard", а в DimStyles  - есть существующие стили но без свойств, то есть я не могу обращаться к стилю и изменить его свойства.
Подскажите, в чем ошибка и куда копать?
« Последнее редактирование: 22-09-2014, 23:12:16 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме. Приложи еще и файл чертежа, над которым ты работал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S.: Вообще-то DimStyle и MLeaderStyle - это разные вещи. И хранятся они в разных местах. И методы внесения изменений в DimStyle и в MLeaderStyle разные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Доброго времени суток!
Александр Ривилис,
файл AutoCad во вложении.
(создавал при запущеном каде)

Код - Visual Basic [Выбрать]
  1. Set acadApp = GetObject(, "AutoCAD.Application")
  2.     If Err Then
  3.       Err.Clear
  4.       Set acadApp = CreateObject("AutoCAD.Application")
  5.     If Err Then
  6.       MsgBox Err.Description
  7.       Exit Sub
  8.     End If
  9.      End If
  10.   acadApp.Visible = True
  11.   Set acadDoc = acadApp.ActiveDocument ' Подключение к активному файлу AutoCad
  12.  'Set acadDoc = acadApp.Documents.Add 'Создание нового файла AutoCad


P.S.: Вообще-то DimStyle и MLeaderStyle - это разные вещи. И хранятся они в разных местах. И методы внесения изменений в DimStyle и в MLeaderStyle разные.
Вот с этого места поподробнее...
Ссылку или пример.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот с этого места поподробнее...
Ссылку или пример.
DimStyle: http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-3227408C-75A9-434C-BD3F-B189A2BE098A



MLeaderStyle: http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-14AC2D0B-EBFC-44B9-982D-9112539F8DE8



А теперь уточни что именно ты собираешься из этого менять?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Александр Ривилис, спасибо за ссылки.
По второй ссылке нужно изменить свойство размерного стиля на аннотативный.
Код
Код - Visual Basic [Выбрать]
  1. oMLS.Annotative=True
  oMLS.Annotative изменяет значение  на True но нужного результата нет.
Размерный стиль не становится аннотативным.
И еще....
После перезагрузки ПК ранее приведенный код стал сообщать о наличии еще одного стиля "Аннотативный" см. скриншот
но стиля "ISO-25" нет.
В watches наблюдаю следующее:
В Dictionaries  вижу Item 1 и Item 2 в обоих случаях имя размерного стиля "Standard" см. скриншот.
Александр Ривилис, просьба прокомментировать и направить на  истинный путь.

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Выявил некую особенность AutoCad.
При запуске акада из меню Пуск  имеем размерные стили "ISO-25"  и "Аннотативный" в MsgBox вижу два размерных стиля "Standard" и "Аннотативный".
При создании нового файла чертежа, из меню асада "Создать новый чертеж",  имеем размерные стили "ISO-25"  и "Annotative" в MsgBox вижу один размерный стиль "Standard".
Этим объясняется "странная" работа кода.
« Последнее редактирование: 23-09-2014, 10:43:13 от Vladimir »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
oMLS.Annotative изменяет значение  на True но нужного результата нет.
Размерный стиль не становится аннотативным.
А как он может стать аннотативным если ты меняешь не размерный стиль (DimStyle), а стиль мультивыноски (MLeaderStyle). А как я уже говорил это разные вещи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Выявил некую особенность AutoCad.
При запуске акада из меню Пуск  имеем размерные стили "ISO-25"  и "Аннотативный" в MsgBox вижу два размерных стиля "Standard" и "Аннотативный".
При создании нового файла чертежа, из меню асада "Создать новый чертеж",  имеем размерные стили "ISO-25"  и "Annotative" в MsgBox вижу один размерный стиль "Standard".
Этим объясняется "странная" работа кода.
А это объясняется тем, что при запуске из меню открывается чертеж с пустым шаблоном, а при создании чертежа (скорее всего) с шаблоном acadiso.dwt
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Vladimir, пожалуйста, не вводите в заблуждение: если надо менять стильмультивыноски, то так и говорите. Он никакого отношения к размерному стилю не имеет (см.#2,#4). Стиль мультивыноски STANDARD есть всегда (точно так же, как и текстовый стиль Standard, и табличный стиль Standard, и стиль мультилинии Standard). Как правило, безболезненно эти стили не удалить.
Имя размерного стиля подобным ограничением не страдает.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Доброго времени суток!
Алексей Кулик, я ни кого не хотел вводить в заблуждение...
В теме поста и в первом сообщении,на мой взгляд, я ясно поставил задачу
-"Создание (изменение) размерного стиля в AutoCad из vba Access"
и сообщил о проблеме
Проблема в следующем ....
через окно сообщений вижу только один размерный стиль "Standard"
В watches наблюдаю следующее:
В Dictionaries не вижу существующих размерных стилей кроме "Standard", а в DimStyles  - есть существующие стили но без свойств, то есть я не могу обращаться к стилю и изменить его свойства.
Подскажите, в чем ошибка и куда копать?
Благодарен за расстановку точек над i
Vladimir, пожалуйста, не вводите в заблуждение: если надо менять стильмультивыноски, то так и говорите. Он никакого отношения к размерному стилю не имеет (см.#2,#4). Стиль мультивыноски STANDARD есть всегда (точно так же, как и текстовый стиль Standard, и табличный стиль Standard, и стиль мультилинии Standard). Как правило, безболезненно эти стили не удалить.
Имя размерного стиля подобным ограничением не страдает.

Еще раз уточню...
Нужно, текущему размерному стилю (например ISO-25) поставить галочку "Аннотативный" программно из vba Access. см скриншот.
Буду рад услышать (увидеть ) ответ на свой вопрос в следующем формате....
Для изменения свойств размерного стиля необходимо:
  • посмотреть (почитать) здесь (ссылка);
  • попробовать сделать так (пример кода).



Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
посмотреть (почитать) здесь (ссылка)
Может поможет статья Бушмана http://bushman-andrey.blogspot.ru/2014/06/autocad.html

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Нужно, текущему размерному стилю (например ISO-25) поставить галочку "Аннотативный" программно из vba Access. см скриншот.
Наконец-то я увидел конкретную постановку задачи. Так вот свойства Annotative у объекта DimStyle нет и поэтому напрямую ты не можешь изменить это свойство у размерного стиля.
« Последнее редактирование: 24-09-2014, 12:49:37 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В принципе меняя расширенные данные (Xdata) размерного стиля ты можешь сделать его аннотативным. Но это не документировано. Выглядят расширенные данные размерного стиля Annotative приблизительно так:



Для этого используется метод SetXdata. Повторюсь. Это всё не документировано и можно использовать на свой страх и риск.
« Последнее редактирование: 24-09-2014, 13:11:59 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Доброго времени суток!
German, я читал эту статью и общался с А. Бушман, он рекомендовал этот форум.
В контексте с сообщением
Так вот свойства Annotative у объекта DimStyle нет и поэтому напрямую ты не можешь изменить это свойство у размерного стиля.
понимаю, что данную задачу решить корректно средствами vba нельзя. По наличию времени постараюсь поработать с расширенными данными (Xdata) и в случае удовлетворительного результата отчитаться о проделанной работе.
Резюме:
  • надо мигрировать на vba.net;
  • текущую задачу решить путем запуска файла шаблона .dwt с заранее настроенными стилями.
Спасибо всем кто помог словом и делом в решении моего вопроса.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
надо мигрировать на vba.net;
Уточнение не vba.net, а VB.NET. Хотя я бы рекомендовал C#. Хотябы по той причине, что примеров на нём значительно больше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Да, vb.net описался. Я не профи, пишу для себя,  учить С# уже наверно староват. Хотя никогда не говори никогда....

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй такой код. Точнее это библиотечные функции для включения/выключения аннотативности у размерного стиля, заданного именем:
Код - Visual Basic [Выбрать]
  1. ' Устанавливаем признак аннотативности у размерного стиля
  2. ' заданного именем dimStyleName (если он есть)
  3. Sub DimAnnotateOn(dimStyleName As String)
  4.     On Error GoTo Skip
  5.     Dim dimSt As AcadDimStyle
  6.     Set dimSt = ThisDrawing.DimStyles(dimStyleName)
  7.     Dim data(0 To 5) As Integer
  8.     Dim value(0 To 5) As Variant
  9.     data(0) = 1001: value(0) = "AcadAnnotative"
  10.     data(1) = 1000: value(1) = "AnnotativeData"
  11.     data(2) = 1002: value(2) = "{"
  12.     data(3) = 1070: value(3) = 1
  13.     data(4) = 1070: value(4) = 1
  14.     data(5) = 1002: value(5) = "}"
  15.     dimSt.SetXData data, value
  16. Skip:
  17. End Sub
  18. ' Удаляем признак аннотативности у размерного стиля
  19. ' заданного именем dimStyleName  (если он есть)
  20. Sub DimAnnotateOff(dimStyleName As String)
  21.     On Error GoTo Skip
  22.     Dim dimSt As AcadDimStyle
  23.     Set dimSt = ThisDrawing.DimStyles(styleName)
  24.     Dim data(0 To 0) As Integer
  25.     Dim value(0 To 0) As Variant
  26.     data(0) = 1001: value(0) = "AcadAnnotative"
  27.     dimSt.SetXData data, value
  28. Skip:
  29. End Sub
P.S.: На VBA я не пишу, поэтому не обращай внимания на "некрасивости"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
 Александр Ривилис, спасибо за код. С лету не получилось. Буду разбираться в выходные.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Для проверки я использовал простейший код:
Код - Visual Basic [Выбрать]
  1.     Sub SetAnnoOn()
  2.       Call DimAnnotateOn("ISO-25")  ' Включаем аннототивность
  3.    End Sub
  4.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S.: Ну и вместо ThisDrawing у тебя должно быть acadDoc
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 25-11-2014, 14:04:02

Оффлайн VladimirАвтор темы

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Всем доброго дня!
Александр Ривилис, разобрался, работает.
Переменную dimSt нужно объявлять как Object (первый раз (#20)  пробовал с Variant на Object не хватило времени)
С "ThisDrawing" и  "acadDoc" само собой и чтобы не было путаницы, в рабочем коде оставлю "ThisDrawing"

Код - Visual Basic [Выбрать]
  1. ' Устанавливаем признак аннотативности у размерного стиля
  2. ' заданного именем dimStyleName (если он есть)
  3. Sub DimAnnotateOn(dimStyleName As String)
  4.     On Error GoTo Skip
  5.     Dim dimSt As Object
  6.     Set dimSt = ThisDrawing.DimStyles(dimStyleName)
  7.     Dim data(5) As Integer
  8.     Dim value(5) As Variant
  9.     data(0) = 1001: value(0) = "AcadAnnotative"
  10.     data(1) = 1000: value(1) = "AnnotativeData"
  11.     data(2) = 1002: value(2) = "{"
  12.     data(3) = 1070: value(3) = 1
  13.     data(4) = 1070: value(4) = 1
  14.     data(5) = 1002: value(5) = "}"
  15.     dimSt.SetXData data, value
  16. Skip:
  17. End Sub
  18.  

Код - Visual Basic [Выбрать]
  1. ' Удаляем признак аннотативности у размерного стиля
  2. ' заданного именем dimStyleName  (если он есть)
  3. Sub DimAnnotateOff(dimStyleName As String)
  4.     On Error GoTo Skip
  5.     Dim dimSt As Object
  6.     Set dimSt = ThisDrawing.DimStyles(styleName)
  7.     Dim data(0) As Integer
  8.     Dim value(0) As Variant
  9.     data(0) = 1001: value(0) = "AcadAnnotative"
  10.     dimSt.SetXData data, value
  11. Skip:
  12. End Sub
  13.  

Не смотря на решение моего вопроса, программным путем, в своем рабочем коде оставлю следующее решение:
Код - Visual Basic [Выбрать]
  1.      Set acadApp = CreateObject("AutoCAD.Application")
  2.     If Err Then
  3.       MsgBox Err.Description
  4.       Exit Sub
  5.     End If
  6.      End If
  7.   acadApp.Visible = True
  8.    Set acadDoc = acadApp.Documents.Add("Путь к файлу шаблона\iso-25.dwt")
  9.  

P.S. при создании ответа не видно порядковых номеров предыдущих сообщений.