Изменение объектов внутри блока.

Автор Тема: Изменение объектов внутри блока.  (Прочитано 8835 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Здравствуйте.
Подскажите, пожалуйста, можно ли изменять объекты внутри блока?
Приведу пример.
Есть блок, который представляет собой полилинию и два атрибута.
В идеале мне надо дать пользователю возможность изменить полилинию.
Надо ли для этого взрывать блок?
С уважением, Денис

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Изменение объектов внутри блока.
« Ответ #1 : 13-07-2017, 09:57:38 »
Конечно можно!
Пример
Пример
ну и все в том-же духе)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Изменение объектов внутри блока.
« Ответ #2 : 13-07-2017, 11:07:04 »
Смотря какая задача:
Если требуется ПРОГРАММНО, что-то менять в блоке, то пишите такой же точно код как и для изменения любых других объектов, получая их из нужного определения блока (BlockTableRecord).
А если вы хотите, чтоб пользователь "изменил полилинию", т.е. дать пользователю полную свободу редактирования блока, то вызывайте редактор блоков. Как-то так (я не проверял):
Код - C# [Выбрать]
  1. doc.SendStringToExecute("_-bedit МойБлок ",  false, true, true);
Надеюсь закрыть редактор пользователь сам сможет?
И третий случай: когда надо изменить только ОДНО вхождение блока (BlockReference), чтоб остальные вхождения остались без изменений. Вот тут уже, да, можно и взорвать блок перед модификацией.


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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Изменение объектов внутри блока.
« Ответ #3 : 13-07-2017, 12:01:57 »
Спасибо за ответы.
Мне надо дать возможность пользователю "изменять полилинию". Открывать редактор блоков я не хочу.
Видимо придется взрывать и выделять сразу полилинию, после изменения размера которой опять создавать блок.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Изменение объектов внутри блока.
« Ответ #4 : 13-07-2017, 12:28:33 »
Можете, например, запросить у пользователя набор точек, построить по ним полилинию программно и заменить полилинию в блоке.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Изменение объектов внутри блока.
« Ответ #5 : 13-07-2017, 12:52:20 »
Зачем изменять полилинию, которая в блоке? Если ее нужно изменять - значит ей не место в блоке. Вынесите ее за блок. Либо, как вариант, используйте динамический блок.

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Изменение объектов внутри блока.
« Ответ #6 : 13-07-2017, 14:17:35 »
Идея такая:
Пользователь рисует полилинию рядом с кабелепроводом и потом превращает ее в блок при помощи написанных команд. У блока есть определенные атрибуты ( Название трассы и номера кабелей).
Полилиния используется как способ определения приблизительной длины линий.
Пользователю понадобилось поменять длину. Вот и нужно ее поменять.Удобнее менять линию, которая уже нарисована, чаще всего изменения касаются переноса кабелепровода в соседнее помещение

Может есть более прямой способ?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Изменение объектов внутри блока.
« Ответ #7 : 13-07-2017, 14:41:51 »
Ну тут еще больше вопросов появляется.
Зачем рисовать линию рядом? Кабелепровод разве уже не является линией?
Почему используется полилиния, а не отрезок? Кабелепровод изгибается? Количество изгибов заранее известно?
Как потом из полилинии внутри блока получаете ее длину?
Получается, что сейчас, для каждого участка кабеля создается отдельное описание блока с единственной вставкой? Если да, то что-то подобное Александр Пекшев aka Modis уже делал: http://adn-cis.org/forum/index.php?topic=7823.0

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Изменение объектов внутри блока.
« Ответ #8 : 13-07-2017, 14:47:57 »
Получается вам нужен не блок, а полилиния с дополнительными данными. Можно пойти другим путем: Храните ваши описания в xData полилинии. Для ввода/отображения напишите свой интерфейс. Или, например, используйте мой готовый плагин Имена https://sites.google.com/site/avcplugins/names
Мысли в слух: сколько проблем бы решилось одним махом, если б пользователь имел возможность добавлять произвольные свойства к объектам... эххх...

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Изменение объектов внутри блока.
« Ответ #9 : 13-07-2017, 14:57:44 »
Кабелепровод не является линией, к сожалению. Это (например) отрисованный лоток. Вариаций может быть множество.
Количество поворотов тоже неизвестно. Это попытка написать некий общий алгоритм для разных людей и объектов.
Длину линии высчитываю прям из свойств полилинии внутри блока, ну и потом даю пользователю ввести масштаб.
Да, для каждого участка кабеля существует описание блока с единственной вставкой сейчас.

Про xData полилинии почитаю. Спасибо большое!

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Изменение объектов внутри блока.
« Ответ #10 : 14-07-2017, 11:00:37 »
Здравствуйте.
Вопрос в продолжение.
Я взорвал блок, нашел необходимую полилинию, при помощи Editor.SetImpliedSelection() я выделяю ее на чертеже.
Можете пнуть меня в правильном направлении, мне надо, чтобы пользователь менял ее, добавлял вертексы и тд, а по нажатию Enter он заканчивал и продолжался код, а при Esc код прерывался и у пользователя оставалась просто полилиния.

Заранее спасибо

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Изменение объектов внутри блока.
« Ответ #11 : 14-07-2017, 11:08:07 »
Можете пнуть меня в правильном направлении, мне надо, чтобы пользователь менял ее, добавлял вертексы и тд, а по нажатию Enter он заканчивал и продолжался код, а при Esc код прерывался и у пользователя оставалась просто полилиния.
Мое мнение - ищите другой подход! Вы слишком усложняете задачу. В таком варианте изменение должно быть зрительно видно, а значит нужно прикручивать Jig - что в случае с полилинией не так уж и просто

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Изменение объектов внутри блока.
« Ответ #12 : 14-07-2017, 11:21:57 »
Вам следует читать про обработку событий начала и конца команды, модификации объектов. Но очень хочется "пнуть" вас в обратном направлении (извините). Вы уже уперлись в то, что было понятно с самого начала - вам теперь надо отловить все события редактирования полилинии. Пользователь явно захочет сделать несколько команд редактирования. Промежуточные команды тоже закончатся по Enter и тоже вызовут события модификации объекта. Каким образом вы планируете разбираться, когда редактирование окончательно завершено? Отдельную кнопку в интерфейс? Вы уверены что это будет проще, чем зайти в редактор блоков? Да и блок-то вам не нужен, как я писал выше...

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Изменение объектов внутри блока.
« Ответ #13 : 19-07-2017, 11:12:20 »
Не надо извиняться. Я просто не совсем умею объяснять четко задачу, даже если сам понимаю.
На самом деле выкрутился из ситуации, пока работаю с блоками.

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

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