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

ADN Club => ObjectARX => Тема начата: Олег от 23-10-2015, 14:26:53

Название: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 23-10-2015, 14:26:53
Добрый день всем.
Подскажите, пожалста, как мне получить событие в ARX?
Суть дела:
нужно создать плагин, который создает окно.
в окне нужно выводить информацию об объекте.
окно типа стандартного проперти только объекты не примитивы а блоки созданные другими плагинами.

Не могу понять как в здесь вообще система построена с событиями.
Как  с ними работать?
Если есть у кого пример такого события напишите пожалста.
Заранее спасибо.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 23-10-2015, 14:29:09
Олег
Приветствую на форуме. Речь идёт именно об ObjectARX (т.е. native C++). Я на всякий случай уточняю, так как понятие события присуще .NET
В ObjectARX это называется реакторами.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 23-10-2015, 14:35:42
Верно, вопрос по ObjectARX (т.е. native C++).
А существует такой метод у реактора как выделение объекта на чертеже?
И как им воспользоваться?
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 23-10-2015, 14:39:39
А существует такой метод у реактора как выделение объекта на чертеже?
Да. Кстати, в ObjectARX разных типов реакторов воз и малая тележка.
Нужно еще одно уточнение. Имеется в виду выбор объекта (графические объекты принято называть примитивами) вне запущенной команды (т.е. предварительный выбор или pickfirst) или в любой момент, т.е. и когда работают какие-то команды?
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 23-10-2015, 14:47:46
По принципу как работает стандартное окно проперти.
Висит оно себе, никому не мешает.
Кликнули мышкой на примитиве - выводит назвение и свойства.
Затем нужно будет добавить возможность менять свойства примитивов.
Например нарисована коробка в 2Д или 3Д.
Кликаем мышкой или выделяем, т.е. примитив получает фокус
и в моем окне выводится название коробки, например "Коробка для ананасов",
и ниже ее размеры.
Дале размеры можно будет редактировать и коробка соответственно меняется на чертеже.

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

Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 23-10-2015, 15:09:45
Ладно. Начни с изучения примера ObjectARX SDK \samples\reactors\inputpoint - тебе там понадобится не всё. Но ты сможешь отследить события, которые возникают при выборе объектов.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 23-10-2015, 15:13:02
Спасибо за подсказку.
Я его как раз открыл, воспользовался поисками в мануале и в примерах по содержимому файла.
Искал AcEdInputContextReactor.

Не буду высказывать свое мнение по структуре и принципу ObjectARX   )))
Мне еще рано
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 23-10-2015, 15:16:33
Кстати, в примере \samples\database\ARXDBG есть коллекция разных реакторов, которые тоже могут тебе помочь. И не только в этом случае.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 23-10-2015, 15:18:52
Не буду высказывать свое мнение по структуре и принципу ObjectARX   )))
Мне еще рано
Перед тем как высказываться на всякий случай почитай Правила форума (п. 3.9)!
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 23-10-2015, 15:21:07
Учту.   :)
Спасибо за помощь 
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 24-10-2015, 10:38:48
Добрый день всем снова.
Экспериментировал с AsdkInputContextReactor.

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

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

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

Ктонить сталкивался с таким?
Подскажите пожалста.
 
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 24-10-2015, 12:03:38
В этом случае работает AcEditorReactor::pickfirstModified
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 24-10-2015, 12:10:18
Я думал что при выборе примитива будут вызываться   beginEntsel() и endEntsel().
Эти методы вызываются при запросе выбора одиночного примитива в командах AutoCAD и при вызове (entsel) из Lisp или acedEntSel из ObjectARX
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 25-10-2015, 16:16:45
Попытался использовать 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  было проще.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 25-10-2015, 18:59:54
Я подумал, что лучше приложить готовый проект. Реактор включается при загрузке приложения и выключается при выгрузке. Хотя можно тоже самое (т.е. включение и выключение реактора) реализовать командами.

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


Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 26-10-2015, 15:40:10
Спасибо.
Это то что нужно.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 26-10-2015, 17:54:45
Отлично. Обращайся если будут еще вопросы.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 05-01-2023, 22:50:15
Подскажите пожалуйста, насколько я понимаю pset содержит выделенный объект, как из него получить массив точек (если выбрана полилиния например)?
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 05-01-2023, 23:07:27
Каих точек?
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 06-01-2023, 09:13:23
Каих точек?
массив вершин
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 06-01-2023, 22:35:26
Каих точек?
массив вершин
Тогда не понял в чем проблема. Из pset получаешь все выделенные объекты (их может быть несколько), находишь среди них полилинии и для каждой из них получаешь координаты вершин.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 06-01-2023, 22:56:09
я понимаю что надо сделать, проблема в том как это сделать :) я только начал знакомство с AutoCad и его SDK ...
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 06-01-2023, 23:24:33
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);
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 07-01-2023, 09:57:34
Спасибо за помощь все до 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.  
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 07-01-2023, 18:55:07
bbb,
Не AcDb2dVertex, а AcDb3dPolylineVertex
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 07-01-2023, 21:52:39
bbb,
Не AcDb2dVertex, а AcDb3dPolylineVertex
Спасибо, да AcDb3dPolyline поменял а это пропустил
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 08-01-2023, 15:16:19
Спасибо.
Это то что нужно.

Олег, а можешь показать что получилось? Такая же задача стоит при выборе примитива выводить координаты в окно типа свойств и при редактировании перестраивать примитив. Координаты получаю в AcEditorReactor::pickfirstModified а вот как их оттуда передать в окно?
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Олег от 08-01-2023, 19:56:52
с наскока не смогу показать. нужно порыться осталось ли в архиве чтолибо. да и врядли тебе пригодится потому что создавал я окно с помощью wxWidgets. я не уверен счас, но вроде были примеры вызова окна сделанного на MFC. 
ну а в каком виде вывод данных в окне и как туда передать эти данные это уже относится сугубо к программированию.
рекомендую тебе пока не заморачиваться окном а выводить данные в командную строку Автокада.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 08-01-2023, 21:06:40
с окном разобрался.
теперь интересует как правильно редактировать полилинию. Пробую удалить все вершины сначала, а потом новыми наполнить через appendVertex пока не очень выходит, может есть способ проще?
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: Александр Ривилис от 08-01-2023, 22:42:34
может есть способ проще?
Да. Более простой способ - удалить лишние вершины (если их стало меньше) или добавить дополнительные (если стало больше). Затем изменить положение всех вершин согласно массива новых положений вершин.
Название: Re: Как получить событие в ARX выделение ( фокус ) объекта на чертеже?
Отправлено: bbb от 09-01-2023, 09:18:28
может есть способ проще?
Да. Более простой способ - удалить лишние вершины (если их стало меньше) или добавить дополнительные (если стало больше). Затем изменить положение всех вершин согласно массива новых положений вершин.
Да это не проще, а как раз сложнее, определить меньше стало или больше, какие лишние удалять, какие дополнительные добавлять, потом так же все их перебирать и значения менять.
Проще это все вершины грохнуть без перебора каждой (типа как clear у массива) и новый массив вершин записать, но так похоже нельзя...
Спасибо за ответ