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

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

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

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

  • 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 видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение