Как получить событие в ARX выделение ( фокус ) объекта на чертеже?

Автор Тема: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?  (Прочитано 22923 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Добрый день всем.
Подскажите, пожалста, как мне получить событие в ARX?
Суть дела:
нужно создать плагин, который создает окно.
в окне нужно выводить информацию об объекте.
окно типа стандартного проперти только объекты не примитивы а блоки созданные другими плагинами.

Не могу понять как в здесь вообще система построена с событиями.
Как  с ними работать?
Если есть у кого пример такого события напишите пожалста.
Заранее спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Олег
Приветствую на форуме. Речь идёт именно об ObjectARX (т.е. native C++). Я на всякий случай уточняю, так как понятие события присуще .NET
В ObjectARX это называется реакторами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Верно, вопрос по ObjectARX (т.е. native C++).
А существует такой метод у реактора как выделение объекта на чертеже?
И как им воспользоваться?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А существует такой метод у реактора как выделение объекта на чертеже?
Да. Кстати, в ObjectARX разных типов реакторов воз и малая тележка.
Нужно еще одно уточнение. Имеется в виду выбор объекта (графические объекты принято называть примитивами) вне запущенной команды (т.е. предварительный выбор или pickfirst) или в любой момент, т.е. и когда работают какие-то команды?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
По принципу как работает стандартное окно проперти.
Висит оно себе, никому не мешает.
Кликнули мышкой на примитиве - выводит назвение и свойства.
Затем нужно будет добавить возможность менять свойства примитивов.
Например нарисована коробка в 2Д или 3Д.
Кликаем мышкой или выделяем, т.е. примитив получает фокус
и в моем окне выводится название коробки, например "Коробка для ананасов",
и ниже ее размеры.
Дале размеры можно будет редактировать и коробка соответственно меняется на чертеже.

Соответственно если коробок выделить более одной то тогда отображаются общие свойства и их редактирование приводит к изменению всех выделенных объектов.


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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ладно. Начни с изучения примера ObjectARX SDK \samples\reactors\inputpoint - тебе там понадобится не всё. Но ты сможешь отследить события, которые возникают при выборе объектов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Спасибо за подсказку.
Я его как раз открыл, воспользовался поисками в мануале и в примерах по содержимому файла.
Искал AcEdInputContextReactor.

Не буду высказывать свое мнение по структуре и принципу ObjectARX   )))
Мне еще рано

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, в примере \samples\database\ARXDBG есть коллекция разных реакторов, которые тоже могут тебе помочь. И не только в этом случае.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не буду высказывать свое мнение по структуре и принципу ObjectARX   )))
Мне еще рано
Перед тем как высказываться на всякий случай почитай Правила форума (п. 3.9)!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Учту.   :)
Спасибо за помощь 

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Добрый день всем снова.
Экспериментировал с AsdkInputContextReactor.

Вызываются, печатают сообщения  в командной строке, только beginQuiescentState(), endQuiescentState().
Когда выделяю чтото на чертеже, даже если пустое место, вызываются  beginDragSequence(), endDragSequence()
Другие методы не вызываются. ??? :o :-\

Я думал что при выборе примитива будут вызываться   beginEntsel() и endEntsel().
Так нет же, никакой реакции.

Может я чтото упустил? :-\
Может реактор работать только наполовину или меньше? )))  ???

Ктонить сталкивался с таким?
Подскажите пожалста.
 

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В этом случае работает AcEditorReactor::pickfirstModified
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я думал что при выборе примитива будут вызываться   beginEntsel() и endEntsel().
Эти методы вызываются при запросе выбора одиночного примитива в командах AutoCAD и при вызове (entsel) из Lisp или acedEntSel из ObjectARX
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Попытался использовать AcEditorReactor.
Содал класс
 
Код - C++ [Выбрать]
  1.  class ArxDbgEditorReactor : public AcEditorReactor2 {}
В
   
Код - C++ [Выбрать]
  1. virtual AcRx::AppRetCode On_kInitAppMsg(void* pAppData)
вставил
          
Код - C++ [Выбрать]
  1. ArxDbgEditorReactor::rxInit();
  2. acrxBuildClassHierarchy();
Но когда загружаю ARX программа падает.

Как правильно подключить AcEditorReactor?

С  AcEdInputContextReactor  было проще.

Отмечено как Решение Олег 26-10-2015, 15:40:32

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я подумал, что лучше приложить готовый проект. Реактор включается при загрузке приложения и выключается при выгрузке. Хотя можно тоже самое (т.е. включение и выключение реактора) реализовать командами.

Ну и на всякий случай видео:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Спасибо.
Это то что нужно.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Отлично. Обращайся если будут еще вопросы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Подскажите пожалуйста, насколько я понимаю pset содержит выделенный объект, как из него получить массив точек (если выбрана полилиния например)?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Каих точек?
массив вершин
Тогда не понял в чем проблема. Из pset получаешь все выделенные объекты (их может быть несколько), находишь среди них полилинии и для каждой из них получаешь координаты вершин.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
я понимаю что надо сделать, проблема в том как это сделать :) я только начал знакомство с AutoCad и его SDK ...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
pset - это resbuf, содержащий имя набора (ads_name).
1) При помощи acedSSLength получаешь количество элементов в наборе.
2) При помощи acedSSName получаешь ads_name для имени примитива в наборе для каждого из элементов набоа.
3) При помощи acdbGetObjectId получаешь AcDbObjectId для примитива.
4) Проверяешь что AcDbObjectId соответствует полилинии (AcDbPolyline), т.е id.objectClass() == AcDbPolyline::desc()
5) Открываешь полилинию для чтения: AcDbObjectPointer<AcDbPolyline> pPoly(id, AcDb::kForRead);
6) Получаешь количество вершин: int n = pPoly->numVerts()
7) Получаешь координаты AcGePoint3d p вершины для каждой i от 0 до n-1: pPoly->getPointAt(i, p);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Спасибо за помощь все до 6 пункта получилось.
А в пункте 6 int n = pPoly->numVerts()

я не уточнил что у меня AcDb3dPolyline, а у нее нет numVerts(), как из нее извлечь вершины?

Попробовал так:

Код - C# [Выбрать]
  1. AcDb3dPolyline* pPline;
  2.     acdbOpenObject(pPline, plineId, AcDb::kForRead);
  3.     AcDbObjectIterator* pVertIter = pPline->vertexIterator();
  4.     pPline->close();  // Finished with the pline header.
  5.     AcDb2dVertex* pVertex;
  6.     AcGePoint3d location;
  7.     AcDbObjectId vertexObjId;
  8.     for (int vertexNumber = 0; !pVertIter->done();
  9.         vertexNumber++, pVertIter->step())
  10.     {
  11.         vertexObjId = pVertIter->objectId();
  12.         acdbOpenObject(pVertex, vertexObjId,
  13.             AcDb::kForRead);
  14.         location = pVertex->position();
  15.         pVertex->close();
  16.         acutPrintf(_T("\nVertex #%d's location is"
  17.             " : %0.3f, %0.3f, %0.3f"), vertexNumber,
  18.             location[X], location[Y], location[Z]);
  19.     }
  20.     delete pVertIter;
  21.  
« Последнее редактирование: 07-01-2023, 21:52:29 от bbb »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
bbb,
Не AcDb2dVertex, а AcDb3dPolylineVertex
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
bbb,
Не AcDb2dVertex, а AcDb3dPolylineVertex
Спасибо, да AcDb3dPolyline поменял а это пропустил

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Спасибо.
Это то что нужно.

Олег, а можешь показать что получилось? Такая же задача стоит при выборе примитива выводить координаты в окно типа свойств и при редактировании перестраивать примитив. Координаты получаю в AcEditorReactor::pickfirstModified а вот как их оттуда передать в окно?

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

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
с наскока не смогу показать. нужно порыться осталось ли в архиве чтолибо. да и врядли тебе пригодится потому что создавал я окно с помощью wxWidgets. я не уверен счас, но вроде были примеры вызова окна сделанного на MFC. 
ну а в каком виде вывод данных в окне и как туда передать эти данные это уже относится сугубо к программированию.
рекомендую тебе пока не заморачиваться окном а выводить данные в командную строку Автокада.

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
с окном разобрался.
теперь интересует как правильно редактировать полилинию. Пробую удалить все вершины сначала, а потом новыми наполнить через appendVertex пока не очень выходит, может есть способ проще?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
может есть способ проще?
Да. Более простой способ - удалить лишние вершины (если их стало меньше) или добавить дополнительные (если стало больше). Затем изменить положение всех вершин согласно массива новых положений вершин.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bbb

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
может есть способ проще?
Да. Более простой способ - удалить лишние вершины (если их стало меньше) или добавить дополнительные (если стало больше). Затем изменить положение всех вершин согласно массива новых положений вершин.
Да это не проще, а как раз сложнее, определить меньше стало или больше, какие лишние удалять, какие дополнительные добавлять, потом так же все их перебирать и значения менять.
Проще это все вершины грохнуть без перебора каждой (типа как clear у массива) и новый массив вершин записать, но так похоже нельзя...
Спасибо за ответ