Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > VBA. Отвод (доработка напильником динамического блока)

VBA. Отвод (доработка напильником динамического блока)

Ответ
Поиск в этой теме
Непрочитано 28.12.2017, 11:50 #1
VBA. Отвод (доработка напильником динамического блока)
environ
 
Регистрация: 16.07.2014
Сообщений: 9

Код:
[Выделить все]
Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
  Call DGL_otvod(Object)
End Sub
Private Sub DGL_otvod(ByVal Object As Object)
  If Object.ObjectName = "AcDbBlockReference" Then
    If Object.EffectiveName = "DGL_otvod" Then
      Dim obj As AcadBlock
      For Each obj In ThisDrawing.Blocks
        If Object.Name = obj.Name Then
          Dim ent As AcadObject
          Dim ang As Double
          For Each ent In obj
            If ent.ObjectName = "AcDbLine" Then
              If ent.Angle > 0.01 And ent.Angle < 6.283 Then ang = ent.Angle
            End If
          Next
          For Each ent In obj
            If ent.ObjectName = "AcDbArc" Then
              ent.EndAngle = ang
            End If
          Next
        End If
      Next
    End If
  End If
End Sub

Вложения
Тип файла: dwg
DWG 2007
DGL_otvod.dwg (85.1 Кб, 41 просмотров)

Просмотров: 4608
 
Непрочитано 28.12.2017, 17:09
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


я VBA уже достаточно подзабыл, но зачем Вы в цикле всю таблицу блоков перебираете, если Вам в реакторе уже передается изменяемый объект, почему сразу не запросить нужный блок?
Код:
[Выделить все]
Dim obj As AcadBlock
Set obj = ThisDrawing.Blocks(Object.Name)
И вот это условие:
Код:
[Выделить все]
If ent.Angle > 0.01 And ent.Angle < 6.283 Then ang = ent.Angle
Я понимаю зачем оно тут, но у Вас всего две прямые, можно же было их прямо в блоке сделать разными (Линия и полилиния) и не париться в коде? Да и вообще, почему так то, почему просто не взять угол поворота из параметра?

Последний раз редактировалось Boxa, 28.12.2017 в 17:28.
Boxa вне форума  
 
Непрочитано 28.12.2017, 17:35
#3
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


это полбеды, где выход из цикла при в конце блока условия If Object.Name = obj.Name Then ? Или надеетесь, что два определения блока с одним именем будут в БД чертежа?)
Сергей812 вне форума  
 
Непрочитано 28.12.2017, 17:42
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Еще раз, я на VBA давно ничего не пишу, но как то так...
Код:
[Выделить все]
Private Sub DGL_otvod_1(ByVal Object As Object)
    If Object.ObjectName = "AcDbBlockReference" Then
        If Object.EffectiveName = "DGL_otvod" Then
            Dim ent As AcadObject
            Dim o() As Object
            ReDim o(UBound(Object.GetDynamicBlockProperties)) As Object
            o = Object.GetDynamicBlockProperties
            For Each ent In ThisDrawing.Blocks(Object.Name)
                If ent.ObjectName = "AcDbArc" Then
                    ent.EndAngle = o(0).Value
                End If
            Next
        End If
    End If
End Sub
Boxa вне форума  
 
Непрочитано 28.12.2017, 17:46
#5
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


p.s. Не совсем понятна логика сего действия - если правится базовое определение динблока, то это же влияет на все остальные вставки блока.
Сергей812 вне форума  
 
Непрочитано 28.12.2017, 17:54
#6
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
p.s. Не совсем понятна логика сего действия - если правится базовое определение динблока, то это же влияет на все остальные вставки блока.
не базовое определение, автор в коде в таблице блоков ищет определение блока с импенем типа "*U00", это в строчке If Object.Name = obj.Name Then и правит именно его. Такой подход для дин. блоков нормален, но во всю таблицу шерстить...
Boxa вне форума  
 
Непрочитано 28.12.2017, 18:04
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Цитата:
Сообщение от Boxa Посмотреть сообщение
не базовое определение, автор в коде в таблице блоков ищет определение блока с импенем типа "*U00", это в строчке If Object.Name = obj.Name Then и правит именно его. Такой подход для дин. блоков нормален, но во всю таблицу шерстить...
сорри - невнимательно посмотрел) Но ведь может оказаться, что на одно определение анонимного блока может быть несколько вставок блоков с одинаковыми динпараметрами. В случае большого чертежа.
Сергей812 вне форума  
 
Непрочитано 28.12.2017, 18:20
#8
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Но ведь может оказаться, что на одно определение анонимного блока может быть несколько вставок блоков с одинаковыми динпараметрами. В случае большого чертежа.
Не может, а неприменно будет. И что, каким образом это скажется на работоспособности кода?
Boxa вне форума  
 
Непрочитано 28.12.2017, 18:32
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


на работоспособности кода не скажется, а на практической применимости в связке "динблок" - обработчик события могут и заметить "неряшливость") Здесь, получается, надо проверять - сколько вставок блока приходиться на данный анонимный блок (на VBA пока только перебор приходит на ум), и если больше одной - то делать копию определения и вставку блока с новым определением. И все это внутри события, вызванного изменением старой вставки блоки - что мягко говоря, очень не рекомендуется)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2017, 08:51
#10
environ


 
Регистрация: 16.07.2014
Сообщений: 9


Цитата:
Сообщение от Boxa Посмотреть сообщение
почему просто не...?
потому, что ещё не знал этого огромное спасибо за то, что научили!!!
даа, как-то с этими дин.блоками всё очень по-красоте, ушёл писать отвод в ObjectARX
environ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > VBA. Отвод (доработка напильником динамического блока)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция чтения свойств и их значений динамического блока Supermax Библиотека функций 11 16.03.2020 09:11
Как сделать чтоб параметры динамического блока не менялись при изменении аннотативного масштаба блока? kurstep Динамические блоки 15 13.01.2017 22:52
Доработка кодя для скрытия объектов блока (LISP) AndruxaZ LISP 2 22.09.2014 14:27
Установка параметров динамического блока в VBA тормозит bars4 Программирование 4 01.10.2012 10:27
Странное поведение динамического блока высотной отметки hwd Динамические блоки 12 08.09.2011 11:15