Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Владимир Шу от 15-04-2014, 10:11:02

Название: Изменение параметров при вставке динамического блока
Отправлено: Владимир Шу от 15-04-2014, 10:11:02
Прошу помочь советом и сильно за код не ругать.

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

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

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


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

Название: Re: Изменение параметров при вставке динамического блока
Отправлено: bargool от 15-04-2014, 10:19:55
У нас в конторе ютуб заблокирован, но предполагаю (:-)), что не применяются изменения дин. параметров?
Если так - то надо вначале добавить вхождение блока к BTR, и транзакции, а потом уже дергать параметры.
Upd: Прошу прощения, чукча не читатель, чукча - писатель. Начал отвечать не посмотрев код..
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Владимир Шу от 15-04-2014, 10:24:30
Как вариант пробовал выносить изменение угла в отдельную транзакцию, выполняемую в самом конце программы. Не помогло.
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Дмитрий Загорулькин от 15-04-2014, 10:35:16
В блоке сложная динамическая связь между действием поворота и полярным параметром через линейный параметр "Ширина" и его действие растяжения. Банально, API может не просчитывать такой уровень сложности (баг?). Попробовать как-то переделать блок, может быть поможет, если у полярного параметра включить "цепь операций".
О, так это еще и мультивыноска внутри блока! Она сама по себе по сути динамический блок, так еще и на нее еще дополнительные динамические параметры навесили... Думаю, это тоже может быть причиной.
Еще вариант: а если попробовать добавлять блок в модель и транзакцию после назначения динпараметров?
Код - C# [Выбрать]
  1. ms.AppendEntity(blockRef)
  2. acTrans.AddNewlyCreatedDBObject(blockRef, True)
Побаловался малость с блоком. Если вместо выноски вставить любой другой объект, то он себя по другому вести начинает. Значит, все же выноска с динпараметрами не всегда предсказуема. Переделал немного блок, в таком варианте у меня работает нормально.
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Дима_ от 15-04-2014, 12:34:06
Вариант 1 - добавить в конце вставки регенерацию всего.
Вариант 2 - менять параметр угла первым (то есть, например, до ширины).
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Владимир Шу от 15-04-2014, 12:54:21
Вариант 1 - добавить в конце вставки регенерацию всего.
не помогает
Вариант 2 - менять параметр угла первым (то есть, например, до ширины).
Попробовал, результат стал лучше, но все равно нужно обновлять.
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs30.postimg.org%2Fh6kxf9ir1%2F244d9717f5b77eefbfba289d538546bd.jpg&hash=a38e41e684038fdec3daf34d44bf69eb) (http://postimg.org/image/h6kxf9ir1/)

...Еще вариант: а если попробовать добавлять блок в модель и транзакцию после назначения динпараметров?
Код - C# [Выбрать]
  1. ms.AppendEntity(blockRef)
  2. acTrans.AddNewlyCreatedDBObject(blockRef, True)
Не получится. Переместил кусок кода, в котором добавляю блок в базу и добавляю в блок атрибуты, после назначения динамических параметров, вот итог:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs3.postimg.org%2F55xcp5df3%2Fb8701e670eb8313d22b88855c99a2d6d.jpg&hash=5113953afcf47c79645f15d370165933) (http://postimg.org/image/55xcp5df3/)

Переделал немного блок, в таком варианте у меня работает нормально.
Спасибо, но это на крайний случай. Наследство от имеющегося блока уж очень большое.  :-\
(Мысли схожие =о), утром рассматривал этот вариант, но не теряю надежды обойтись без переделки блока.)
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Дима_ от 15-04-2014, 13:00:12
Попробовал, результат стал лучше, но все равно нужно обновлять.
Это по ходу глубина влияет - тогда давай попробуем устанавливать глубина->угол->ширина??
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Владимир Шу от 15-04-2014, 13:08:32
Это по ходу глубина влияет - тогда давай попробуем устанавливать глубина->угол->ширина??
ШИРИНА -> глубина - >угол = Совсем плохо
угол  -> ШИРИНА -> глубина = Лучше
глубина  -> угол  -> ШИРИНА = Лучше
угол  -> глубина -> ШИРИНА = лучше
Что то я схемы пока не улавливаю...
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Дима_ от 15-04-2014, 13:11:48
Что то я схемы пока не улавливаю...
Тут чутье надо - попробуй где лучше в конце еще раз угол на то-же значение установить...
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Владимир Шу от 18-04-2014, 09:14:39
С чютьем у меня туго, попробовал все варианты:
                   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


Вот результат:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fi.gyazo.com%2F4a2b2dcd7f9da75ff35484fba631b1b4.png&hash=dcb83a3bf525e4a72f9d788fc9151c85)

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


И еще один вопрос:
Изменить параметры динамического блока, можно дергая ручки, однако рассматривая свойства объекта типа 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
Название: Re: Изменение параметров при вставке динамического блока
Отправлено: Александр Ривилис от 19-04-2014, 00:20:31
Изменить параметры динамического блока, можно дергая ручки, однако рассматривая свойства объекта типа GripData, не увидел там  никаких ссылок на имя параметра отвечающего за эту ручку, есть ли способ узнать имя этого параметра?
Нет. Через грипы ты ничего сделаешь. По большому счету всё что связано с динамическими блоками ориентировано на работу с ними пользователя, а не программиста и поэтому большая часть API для работы с динамическими блоками недоступна для программистов. Доступная часть это скорее исключение из правил.