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

ADN Club => AutoCAD .NET API => Тема начата: Denis от 13-07-2017, 09:53:50

Название: Изменение объектов внутри блока.
Отправлено: Denis от 13-07-2017, 09:53:50
Здравствуйте.
Подскажите, пожалуйста, можно ли изменять объекты внутри блока?
Приведу пример.
Есть блок, который представляет собой полилинию и два атрибута.
В идеале мне надо дать пользователю возможность изменить полилинию.
Надо ли для этого взрывать блок?
С уважением, Денис
Название: Re: Изменение объектов внутри блока.
Отправлено: Александр Пекшев aka Modis от 13-07-2017, 09:57:38
Конечно можно!
Пример (http://through-the-interface.typepad.com/through_the_interface/2010/06/changing-the-layer-of-an-entity-in-an-autocad-block-using-net.html)
Пример (http://www.acadnetwork.com/index.php?topic=313.0)
ну и все в том-же духе)
Название: Re: Изменение объектов внутри блока.
Отправлено: avc от 13-07-2017, 11:07:04
Смотря какая задача:
Если требуется ПРОГРАММНО, что-то менять в блоке, то пишите такой же точно код как и для изменения любых других объектов, получая их из нужного определения блока (BlockTableRecord).
А если вы хотите, чтоб пользователь "изменил полилинию", т.е. дать пользователю полную свободу редактирования блока, то вызывайте редактор блоков. Как-то так (я не проверял):
Код - C# [Выбрать]
  1. doc.SendStringToExecute("_-bedit МойБлок ",  false, true, true);
Надеюсь закрыть редактор пользователь сам сможет?
И третий случай: когда надо изменить только ОДНО вхождение блока (BlockReference), чтоб остальные вхождения остались без изменений. Вот тут уже, да, можно и взорвать блок перед модификацией.

Название: Re: Изменение объектов внутри блока.
Отправлено: Denis от 13-07-2017, 12:01:57
Спасибо за ответы.
Мне надо дать возможность пользователю "изменять полилинию". Открывать редактор блоков я не хочу.
Видимо придется взрывать и выделять сразу полилинию, после изменения размера которой опять создавать блок.
Название: Re: Изменение объектов внутри блока.
Отправлено: avc от 13-07-2017, 12:28:33
Можете, например, запросить у пользователя набор точек, построить по ним полилинию программно и заменить полилинию в блоке.
Название: Re: Изменение объектов внутри блока.
Отправлено: Дмитрий Загорулькин от 13-07-2017, 12:52:20
Зачем изменять полилинию, которая в блоке? Если ее нужно изменять - значит ей не место в блоке. Вынесите ее за блок. Либо, как вариант, используйте динамический блок.
Название: Re: Изменение объектов внутри блока.
Отправлено: Denis от 13-07-2017, 14:17:35
Идея такая:
Пользователь рисует полилинию рядом с кабелепроводом и потом превращает ее в блок при помощи написанных команд. У блока есть определенные атрибуты ( Название трассы и номера кабелей).
Полилиния используется как способ определения приблизительной длины линий.
Пользователю понадобилось поменять длину. Вот и нужно ее поменять.Удобнее менять линию, которая уже нарисована, чаще всего изменения касаются переноса кабелепровода в соседнее помещение

Может есть более прямой способ?
Название: Re: Изменение объектов внутри блока.
Отправлено: Дмитрий Загорулькин от 13-07-2017, 14:41:51
Ну тут еще больше вопросов появляется.
Зачем рисовать линию рядом? Кабелепровод разве уже не является линией?
Почему используется полилиния, а не отрезок? Кабелепровод изгибается? Количество изгибов заранее известно?
Как потом из полилинии внутри блока получаете ее длину?
Получается, что сейчас, для каждого участка кабеля создается отдельное описание блока с единственной вставкой? Если да, то что-то подобное Александр Пекшев aka Modis уже делал: http://adn-cis.org/forum/index.php?topic=7823.0
Название: Re: Изменение объектов внутри блока.
Отправлено: avc от 13-07-2017, 14:47:57
Получается вам нужен не блок, а полилиния с дополнительными данными. Можно пойти другим путем: Храните ваши описания в xData полилинии. Для ввода/отображения напишите свой интерфейс. Или, например, используйте мой готовый плагин Имена https://sites.google.com/site/avcplugins/names (https://sites.google.com/site/avcplugins/names)
Мысли в слух: сколько проблем бы решилось одним махом, если б пользователь имел возможность добавлять произвольные свойства к объектам... эххх...
Название: Re: Изменение объектов внутри блока.
Отправлено: Denis от 13-07-2017, 14:57:44
Кабелепровод не является линией, к сожалению. Это (например) отрисованный лоток. Вариаций может быть множество.
Количество поворотов тоже неизвестно. Это попытка написать некий общий алгоритм для разных людей и объектов.
Длину линии высчитываю прям из свойств полилинии внутри блока, ну и потом даю пользователю ввести масштаб.
Да, для каждого участка кабеля существует описание блока с единственной вставкой сейчас.

Про xData полилинии почитаю. Спасибо большое!
Название: Re: Изменение объектов внутри блока.
Отправлено: Denis от 14-07-2017, 11:00:37
Здравствуйте.
Вопрос в продолжение.
Я взорвал блок, нашел необходимую полилинию, при помощи Editor.SetImpliedSelection() я выделяю ее на чертеже.
Можете пнуть меня в правильном направлении, мне надо, чтобы пользователь менял ее, добавлял вертексы и тд, а по нажатию Enter он заканчивал и продолжался код, а при Esc код прерывался и у пользователя оставалась просто полилиния.

Заранее спасибо
Название: Re: Изменение объектов внутри блока.
Отправлено: Александр Пекшев aka Modis от 14-07-2017, 11:08:07
Можете пнуть меня в правильном направлении, мне надо, чтобы пользователь менял ее, добавлял вертексы и тд, а по нажатию Enter он заканчивал и продолжался код, а при Esc код прерывался и у пользователя оставалась просто полилиния.
Мое мнение - ищите другой подход! Вы слишком усложняете задачу. В таком варианте изменение должно быть зрительно видно, а значит нужно прикручивать Jig (http://through-the-interface.typepad.com/through_the_interface/2010/12/jigging-an-autocad-polyline-with-arc-segments-using-net.html) - что в случае с полилинией не так уж и просто
Название: Re: Изменение объектов внутри блока.
Отправлено: avc от 14-07-2017, 11:21:57
Вам следует читать про обработку событий начала и конца команды, модификации объектов. Но очень хочется "пнуть" вас в обратном направлении (извините). Вы уже уперлись в то, что было понятно с самого начала - вам теперь надо отловить все события редактирования полилинии. Пользователь явно захочет сделать несколько команд редактирования. Промежуточные команды тоже закончатся по Enter и тоже вызовут события модификации объекта. Каким образом вы планируете разбираться, когда редактирование окончательно завершено? Отдельную кнопку в интерфейс? Вы уверены что это будет проще, чем зайти в редактор блоков? Да и блок-то вам не нужен, как я писал выше...
Название: Re: Изменение объектов внутри блока.
Отправлено: Denis от 19-07-2017, 11:12:20
Не надо извиняться. Я просто не совсем умею объяснять четко задачу, даже если сам понимаю.
На самом деле выкрутился из ситуации, пока работаю с блоками.

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

Спасибо за ответы и помощь!