Как получить вершины AcDbPolyline если в классе нет метода vertexIterator

Автор Тема: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator  (Прочитано 4506 раз)

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
Добрый день,

Программно перебираю все Entity в модели или выбранной области. Для полилиний нужно получить данные об их вершинах. Но в классе AcDbPolyline нет метода vertexIterator.

Подскажите, как это можно сделать?

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
Код - C++ [Выбрать]
  1. ads_name ent;
  2. AcDbObjectId id = AcDbObjectId::kNull;
  3. AcDbPolyline *pLine;
  4.  
  5. ...
  6.  
  7. if ((pEnt->isA()) == AcDbPolyline::desc())
  8. {
  9.    pLine=AcDbPolyline::cast(pEnt);
  10.    acutPrintf(L"\nEntity %s",pEnt->isA()->name());
  11.    acutPrintf(L"\nVertext Num %d",pLine->numVerts());
  12.  
  13.    for(unsigned int c=0;c<pLine->numVerts()-1;c++)
  14.    {
  15.          AcGePoint3d pt1;
  16.          pLine->getPointAt(c,pt1);
  17.            
  18.          acutPrintf( _T(" : %0.3f, %0.3f, %0.3f"), pt1[X], pt1[Y], pt1[Z]);
  19.     }
  20. }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
DimVer,
Почему c<pLine->numVerts()-1 ? Последняя вершина тебя не интересует?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
DimVer,
Почему c<pLine->numVerts()-1 ? Последняя вершина тебя не интересует?
Да, вы правы.

Ещё тогда вопрос - как то можно определить начало и конец полилинии?

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

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
Проектировщик чертит схему. От блока А делает полилинией до блока Б кабельную трассу. Можно программно получить эти данные, что вершина у блока А - это было начало, а вершина у блока Б - это конец?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Код - C++ [Выбрать]
  1. AcGePoint3d ptStart, ptEnd;
  2. pLine->getPointAt(0,ptStart);
  3. pLine->getPointAt(pLine->numVerts()-1,ptEnd);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Проектировщик чертит схему. От блока А делает полилинией до блока Б кабельную трассу. Можно программно получить эти данные, что он вершина у блока А - это было начало, а вершина у блока Б - это конец?
Это не ответ на мой вопрос.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
Проектировщик чертит схему. От блока А делает полилинией до блока Б кабельную трассу. Можно программно получить эти данные, что он вершина у блока А - это было начало, а вершина у блока Б - это конец?
Это не ответ на мой вопрос.
Да, координаты, чтобы по этим координатам получить пересечение с блоком, из блока получить атрибуты.

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
Код - C++ [Выбрать]
  1. AcGePoint3d ptStart, ptEnd;
  2. pLine->getPointAt(0,ptStart);
  3. pLine->getPointAt(pLine->numVerts()-1,ptEnd);
Последний тогда вопрос из этой темы - как по вершине получить блок, к которому эта линия доведена?

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

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 2
Последний тогда вопрос из этой темы - как по вершине получить блок, к которому эта линия доведена?
Короткий ответ: никак.
Длинный ответ: перебрать все блоки, и найти тот, который находится возле вершины. Правда что такое "блок к которому доведена линия" в терминах AutoCAD тебе придется определить самому. Это точка вставки блока? Или это точка на одном из объектов внутри блока? Или это еще что-то???
Это точка, где вершина полилинии стоит на одной из линий, входящих в блок. Точнее ссылки на блок, если пытаться писать в терминологии Автокад)

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

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

Оффлайн alex-63

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Skype: alx_14521963
Мне кажется проще применить  ssget по фильтру и оттуда вытащить нужный блок.