CustomEntity. Режимы редактирования

Автор Тема: CustomEntity. Режимы редактирования  (Прочитано 12960 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
С AutoCAD 2011 появилась возможность выбора режима редактирования сплайнов (небольшой треугольник около первой вершины ▼) в меню которого: "Определяющие/Управляющие вершины".

Вопрос: есть ли готовые средства ObjectARX для реализации такой меню на своем CustomEntity, как для GripPoint на вершине (на полилинии например "Растянуть за вершину/Добавить вершину/Удалить вершину") есть клас AcDbMultiModesGripPE.

Как вариант можно в созданной меню через AcDbMultiModesGripPE проверять если это специфический GripPoint, то добавлять другие пункты меню (для выбора редактирования) и для него вызывать Custom'ый WorldDraw прорисовки треугольника. Или так же и AutoCAD делает?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. Режимы редактирования
« Ответ #1 : 15-12-2014, 13:50:51 »
Если я правильно понял о чем ты, то это то, что тебе нужно: Контекстное меню ручек с использованием AcDbMultiModesGripPE
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. Режимы редактирования
« Ответ #2 : 15-12-2014, 13:56:58 »
Кстати, это публичное API появилось только в AutoCAD 2012, хотя сам AutoCAD использовал его с версии 2011.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. Режимы редактирования
« Ответ #3 : 15-12-2014, 14:59:16 »
Контекстное меню через AcDbMultiModesGripPE я уже реализовал для добавления і удалиния вершин линии (пришлось самому реализовывать потому что я унаследовался от AcDbEntity).

Но мне еще нужно переключаться в разные режимы редактирования объекта, то есть в одном случае отображаются одни GripPoints, а при переключении в другой режим другие GripPoints, как и в сплайне.
Для этого использовать тот же механизм через AcDbMultiModesGripPE и для "выбранного" GripPoint'а писать отдельний WorldDraw для прорисовки ▼? Или для этого случая есть другой способ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. Режимы редактирования
« Ответ #4 : 15-12-2014, 15:21:44 »
Для этого использовать тот же механизм через AcDbMultiModesGripPE и для "выбранного" GripPoint'а писать отдельний WorldDraw для прорисовки ▼? Или для этого случая есть другой способ?
Думаю что это вообще должен быть отдельный GripPoint со своим WorldDraw. Другого способа насколько я знаю нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. Режимы редактирования
« Ответ #5 : 15-12-2014, 15:38:45 »
Спасибо, я так и думал.
Я просто добавлю еще один тип GripPoint'а в свой class GripData, так как у меня их и так несколько.

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. Режимы редактирования
« Ответ #6 : 19-12-2014, 17:06:34 »
По ходу разработки возник еще один вопрос.
Я создал GripPoint, для него написал WorldDraw и функцию для setHotGripFunc(GripOperationPtr pFunc). В функции HotGripFunc вывожу CMenu. По скольку после выбора пункта меню мне нужно вывести совсем другие GripPont'ы, мне нужно чтобы еще раз вызвался метод subGetGripPoints. С функции HotGripFunc я возвращаю AcDbGripOperations::eGetNewGripPoints.
Метод subGetGripPoints вызывается и я заполняю новые GripPont'ы, НО на чертеже у меня пропадают с объекта все GripPont'ы кроме того на котором я написал меню (объект остается подсвеченным).
После панорамирования (перемещения по чертежу) или зумирования кольцом мыши они сразу появляются.
В чем может быть проблема что GripPont'ы сразу не появляются?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. Режимы редактирования
« Ответ #7 : 19-12-2014, 19:27:03 »
В чем может быть проблема что GripPont'ы сразу не появляются?
Ну тут два варианта:
1) Баг AutoCAD
2) Что-то ты делаешь не так - что именно без полного проекта я сказать не могу.
Так что если нужна помощь - выкладывай проект и уточняй версию AutoCAD. Если сам не смогу помочь - отправлю в ADN DevHelp. Хотя у них сейчас каникулы скоро начинаются, так что ответ будет скорее всего не раньше второй недели января.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. Режимы редактирования
« Ответ #8 : 24-12-2014, 09:55:32 »
Я подготовил пример работы с GripPonts, как сделано в моем проекте.
За базу взял проект из adndevblog (http://adndevblog.typepad.com/autocad/2014/02/making-custom-entity-gripmode-aware.html), где реализовано меню для вершин через AcDbMultiModesGripPE (у меня так же) и добавил свой GripPoint для меню переключения режимов редактирования.
В этом проекте конфигурации для AutoCAD 2014, у меня в проекте настроены конфигурации от AutoCAD 2013 до AutoCAD 2015, на всех такая же проблема.
Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. Режимы редактирования
« Ответ #9 : 24-12-2014, 14:57:36 »
Я посмотрю его и если не найду решение - отправлю в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 25-12-2014, 10:09:32

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. Режимы редактирования
« Ответ #10 : 25-12-2014, 01:38:26 »
Уже думал отправлять в ADN DevHelp. Даже комментарии и тексты перевёл на английский, когда нашел решение! :) Оказалось оно очень простым. Вставь перед:
Код - C++ [Выбрать]
  1. return AcDbGripOperations::eGetNewGripPoints;
в функции HotEditModGripfunc строку:
Код - C++ [Выбрать]
  1. pEnt->recordGraphicsModified();
И всё будет работать нормально:
https://screencast.autodesk.com/main/details/877ca0b8-5189-438d-9b66-de84daf154be
P.S.: В качестве совета. Если бы ты реализовал чтение и запись m_EditMode через методы, в которых были бы соотвественно assertReadEnabled(); и assertWriteEnabled(); то скорее всего не потребовалось бы вызывать pEnt->recordGraphicsModified();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. Режимы редактирования
« Ответ #11 : 25-12-2014, 10:06:48 »
Большое спасибо.
Это только в тестовом проекте я до m_EditMode обращаюсь напрямую. В своем проекте у меня сделано через метод, а в нем assertWriteEnabled(); у меня был закомментирован.
Закомментировал когда писал эту менюшку через AcDbMultiModesGripPE. Когда задавал режим редактирования (m_EditMode) через метод на Entity с метода "virtual bool setMode(AcDbEntity* pThis, AcDbGripData* pGripData, unsigned int newMode);" унаследованного класса от AcDbMultiModesGripPE программа падала (assertWriteEnabled(); в SetEditMode был разкомментирован).
Теперь разкомментировал assertWriteEnabled(); помогло. Еще раз спасибо.