Изменение параметров при вставке динамического блока

Автор Тема: Изменение параметров при вставке динамического блока  (Прочитано 11908 раз)

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

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Прошу помочь советом и сильно за код не ругать.

По заданию от инженеров и архитекторов нужно расставить отверстия, отверстия расставляются в виде динамических блоков с последующим составлением ведомости. В виду большого количества отверстий, захотелось как то упростить себе работу и сделать расстановку этих блоков более удобной.
Почти все получилось, но вылезла одна проблема, при вставке блока не обновляется положение указателя выноски и приходится обновлять блок руками, что сводит на нет всю идею.

Я попробовал несколько способов изменения параметра угла, как напрямую, так и через дёрганье grip ручек, как перед добавлением блока в чертеж, так и после. Все равно побороть эту загвоздку у меня не получилось.

Прошу подсказать как решить эту загвоздку.
Видео запись проблемы тут:
 


Файл с блоком и код во вложениях.


Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
У нас в конторе ютуб заблокирован, но предполагаю (:-)), что не применяются изменения дин. параметров?
Если так - то надо вначале добавить вхождение блока к BTR, и транзакции, а потом уже дергать параметры.
Upd: Прошу прощения, чукча не читатель, чукча - писатель. Начал отвечать не посмотрев код..
Алексей

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Как вариант пробовал выносить изменение угла в отдельную транзакцию, выполняемую в самом конце программы. Не помогло.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
В блоке сложная динамическая связь между действием поворота и полярным параметром через линейный параметр "Ширина" и его действие растяжения. Банально, API может не просчитывать такой уровень сложности (баг?). Попробовать как-то переделать блок, может быть поможет, если у полярного параметра включить "цепь операций".
О, так это еще и мультивыноска внутри блока! Она сама по себе по сути динамический блок, так еще и на нее еще дополнительные динамические параметры навесили... Думаю, это тоже может быть причиной.
Еще вариант: а если попробовать добавлять блок в модель и транзакцию после назначения динпараметров?
Код - C# [Выбрать]
  1. ms.AppendEntity(blockRef)
  2. acTrans.AddNewlyCreatedDBObject(blockRef, True)
Побаловался малость с блоком. Если вместо выноски вставить любой другой объект, то он себя по другому вести начинает. Значит, все же выноска с динпараметрами не всегда предсказуема. Переделал немного блок, в таком варианте у меня работает нормально.
« Последнее редактирование: 15-04-2014, 12:04:29 от Загорулькин Дмитрий »

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Вариант 1 - добавить в конце вставки регенерацию всего.
Вариант 2 - менять параметр угла первым (то есть, например, до ширины).

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Вариант 1 - добавить в конце вставки регенерацию всего.
не помогает
Вариант 2 - менять параметр угла первым (то есть, например, до ширины).
Попробовал, результат стал лучше, но все равно нужно обновлять.


...Еще вариант: а если попробовать добавлять блок в модель и транзакцию после назначения динпараметров?
Код - C# [Выбрать]
  1. ms.AppendEntity(blockRef)
  2. acTrans.AddNewlyCreatedDBObject(blockRef, True)
Не получится. Переместил кусок кода, в котором добавляю блок в базу и добавляю в блок атрибуты, после назначения динамических параметров, вот итог:


Переделал немного блок, в таком варианте у меня работает нормально.
Спасибо, но это на крайний случай. Наследство от имеющегося блока уж очень большое.  :-\
(Мысли схожие =о), утром рассматривал этот вариант, но не теряю надежды обойтись без переделки блока.)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Попробовал, результат стал лучше, но все равно нужно обновлять.
Это по ходу глубина влияет - тогда давай попробуем устанавливать глубина->угол->ширина??

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Это по ходу глубина влияет - тогда давай попробуем устанавливать глубина->угол->ширина??
ШИРИНА -> глубина - >угол = Совсем плохо
угол  -> ШИРИНА -> глубина = Лучше
глубина  -> угол  -> ШИРИНА = Лучше
угол  -> глубина -> ШИРИНА = лучше
Что то я схемы пока не улавливаю...

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Что то я схемы пока не улавливаю...
Тут чутье надо - попробуй где лучше в конце еще раз угол на то-же значение установить...

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
С чютьем у меня туго, попробовал все варианты:
                   Dim acBlockDynProp_vid As List(Of Object)

                    Select Case varRez.Value
                        Case 1 'Вариант 1
                            '1
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "угол1".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(angle, Double)
                                Exit For
                            Next
                            '2
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "глубина".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(Setting.b_wall, Double)
                                Exit For
                            Next
                            '3
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "ШИРИНА".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = L1Rez.Value
                                Exit For
                            Next

                        Case 2 'Вариант 2
                            '2
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "глубина".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(Setting.b_wall, Double)
                                Exit For
                            Next
                            '3
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "ШИРИНА".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = L1Rez.Value
                                Exit For
                            Next
                            '1
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "угол1".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(angle, Double)
                                Exit For
                            Next
                        Case 3 'Вариант 3
                            '3
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "ШИРИНА".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = L1Rez.Value
                                Exit For
                            Next
                            '1
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "угол1".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(angle, Double)
                                Exit For
                            Next
                            '2
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "глубина".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(Setting.b_wall, Double)
                                Exit For
                            Next
                        Case 4 'Вариант 4
                            '3
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "ШИРИНА".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = L1Rez.Value
                                Exit For
                            Next
                            '2
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "глубина".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(Setting.b_wall, Double)
                                Exit For
                            Next
                            '1
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "угол1".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(angle, Double)
                                Exit For
                            Next
                        Case 5 'Вариант 5
                            '2
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "глубина".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(Setting.b_wall, Double)
                                Exit For
                            Next
                            '1
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "угол1".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(angle, Double)
                                Exit For
                            Next
                            '3
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "ШИРИНА".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = L1Rez.Value
                                Exit For
                            Next
                        Case 6 'Вариант 6
                            '1
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "угол1".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(angle, Double)
                                Exit For
                            Next
                            '3
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "ШИРИНА".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = L1Rez.Value
                                Exit For
                            Next
                            '2
                            acBlockDynProp_vid = (From q In acBlockDynProp Where q.PropertyName.ToString.ToUpper = "глубина".ToUpper Select q).ToList
                            For Each i As Object In acBlockDynProp_vid
                                i.value = CType(Setting.b_wall, Double)
                                Exit For
                            Next
                    End Select


Вот результат:


Вывод: обновляю блоки =(


И еще один вопрос:
Изменить параметры динамического блока, можно дергая ручки, однако рассматривая свойства объекта типа GripData, не увидел там  никаких ссылок на имя параметра отвечающего за эту ручку, есть ли способ узнать имя этого параметра?


код для примера:
                    Dim grips As GripDataCollection = New GripDataCollection()
                    Dim updateGrip As GripDataCollection = New GripDataCollection()
                    Dim curViewUnitSize As Double = 0
                    Dim gripSize As Integer = 0
                    Dim curViewDir As Vector3d = acDoc.Editor.GetCurrentView().ViewDirection
                    Dim bitFlags As GetGripPointsFlags = GetGripPointsFlags.GripPointsOnly
                    blockRef.GetGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitFlags)
                    'Ищу грип отвечающий за поворот (в блоке задан радиус до ручка в 450 ед.)
                    For Each grip As GripData In grips
                        If blockRef.Position.DistanceTo(grip.GripPoint) = 450 Then
                            updateGrip.Add(grip)
                            Exit For
                        End If
                    Next
« Последнее редактирование: 18-04-2014, 10:08:12 от Boxa.Shu »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Изменить параметры динамического блока, можно дергая ручки, однако рассматривая свойства объекта типа GripData, не увидел там  никаких ссылок на имя параметра отвечающего за эту ручку, есть ли способ узнать имя этого параметра?
Нет. Через грипы ты ничего сделаешь. По большому счету всё что связано с динамическими блоками ориентировано на работу с ними пользователя, а не программиста и поэтому большая часть API для работы с динамическими блоками недоступна для программистов. Доступная часть это скорее исключение из правил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение