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

ADN Club => ObjectARX => Тема начата: Dziubyna от 15-12-2014, 11:57:03

Название: CustomEntity. Режимы редактирования
Отправлено: Dziubyna от 15-12-2014, 11:57:03
С AutoCAD 2011 появилась возможность выбора режима редактирования сплайнов (небольшой треугольник около первой вершины ▼) в меню которого: "Определяющие/Управляющие вершины".

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

Как вариант можно в созданной меню через AcDbMultiModesGripPE проверять если это специфический GripPoint, то добавлять другие пункты меню (для выбора редактирования) и для него вызывать Custom'ый WorldDraw прорисовки треугольника. Или так же и AutoCAD делает?
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Александр Ривилис от 15-12-2014, 13:50:51
Если я правильно понял о чем ты, то это то, что тебе нужно: Контекстное меню ручек с использованием AcDbMultiModesGripPE (http://adn-cis.org/kontekstnoe-menyu-ruchek-s-ispolzovaniem-acdbmultimodesgrippe.html)
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Александр Ривилис от 15-12-2014, 13:56:58
Кстати, это публичное API появилось только в AutoCAD 2012, хотя сам AutoCAD использовал его с версии 2011.
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Dziubyna от 15-12-2014, 14:59:16
Контекстное меню через AcDbMultiModesGripPE я уже реализовал для добавления і удалиния вершин линии (пришлось самому реализовывать потому что я унаследовался от AcDbEntity).

Но мне еще нужно переключаться в разные режимы редактирования объекта, то есть в одном случае отображаются одни GripPoints, а при переключении в другой режим другие GripPoints, как и в сплайне.
Для этого использовать тот же механизм через AcDbMultiModesGripPE и для "выбранного" GripPoint'а писать отдельний WorldDraw для прорисовки ▼? Или для этого случая есть другой способ?
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Александр Ривилис от 15-12-2014, 15:21:44
Для этого использовать тот же механизм через AcDbMultiModesGripPE и для "выбранного" GripPoint'а писать отдельний WorldDraw для прорисовки ▼? Или для этого случая есть другой способ?
Думаю что это вообще должен быть отдельный GripPoint со своим WorldDraw. Другого способа насколько я знаю нет.
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Dziubyna от 15-12-2014, 15:38:45
Спасибо, я так и думал.
Я просто добавлю еще один тип GripPoint'а в свой class GripData, так как у меня их и так несколько.
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Dziubyna от 19-12-2014, 17:06:34
По ходу разработки возник еще один вопрос.
Я создал GripPoint, для него написал WorldDraw и функцию для setHotGripFunc(GripOperationPtr pFunc). В функции HotGripFunc вывожу CMenu. По скольку после выбора пункта меню мне нужно вывести совсем другие GripPont'ы, мне нужно чтобы еще раз вызвался метод subGetGripPoints. С функции HotGripFunc я возвращаю AcDbGripOperations::eGetNewGripPoints.
Метод subGetGripPoints вызывается и я заполняю новые GripPont'ы, НО на чертеже у меня пропадают с объекта все GripPont'ы кроме того на котором я написал меню (объект остается подсвеченным).
После панорамирования (перемещения по чертежу) или зумирования кольцом мыши они сразу появляются.
В чем может быть проблема что GripPont'ы сразу не появляются?
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Александр Ривилис от 19-12-2014, 19:27:03
В чем может быть проблема что GripPont'ы сразу не появляются?
Ну тут два варианта:
1) Баг AutoCAD
2) Что-то ты делаешь не так - что именно без полного проекта я сказать не могу.
Так что если нужна помощь - выкладывай проект и уточняй версию AutoCAD. Если сам не смогу помочь - отправлю в ADN DevHelp. Хотя у них сейчас каникулы скоро начинаются, так что ответ будет скорее всего не раньше второй недели января.
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Dziubyna от 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, на всех такая же проблема.
Спасибо!
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Александр Ривилис от 24-12-2014, 14:57:36
Я посмотрю его и если не найду решение - отправлю в ADN DevHelp.
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Александр Ривилис от 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();
Название: Re: CustomEntity. Режимы редактирования
Отправлено: Dziubyna от 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(); помогло. Еще раз спасибо.