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

ADN Club => ObjectARX => Тема начата: DimVer от 22-04-2022, 12:32:21

Название: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 12:32:21
Добрый день,

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

Подскажите, как это можно сделать?
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 13:41:03
Код - 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. }
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: Александр Ривилис от 22-04-2022, 14:19:14
DimVer,
Почему c<pLine->numVerts()-1 ? Последняя вершина тебя не интересует?
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 14:28:09
DimVer,
Почему c<pLine->numVerts()-1 ? Последняя вершина тебя не интересует?
Да, вы правы.

Ещё тогда вопрос - как то можно определить начало и конец полилинии?
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: Александр Ривилис от 22-04-2022, 14:30:58
Ещё тогда вопрос - как то можно определить начало и конец полилинии?
Координаты?
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 14:33:41
Проектировщик чертит схему. От блока А делает полилинией до блока Б кабельную трассу. Можно программно получить эти данные, что вершина у блока А - это было начало, а вершина у блока Б - это конец?
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: Александр Ривилис от 22-04-2022, 14:35:45
Код - C++ [Выбрать]
  1. AcGePoint3d ptStart, ptEnd;
  2. pLine->getPointAt(0,ptStart);
  3. pLine->getPointAt(pLine->numVerts()-1,ptEnd);
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: Александр Ривилис от 22-04-2022, 14:37:59
Проектировщик чертит схему. От блока А делает полилинией до блока Б кабельную трассу. Можно программно получить эти данные, что он вершина у блока А - это было начало, а вершина у блока Б - это конец?
Это не ответ на мой вопрос.
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 14:39:54
Проектировщик чертит схему. От блока А делает полилинией до блока Б кабельную трассу. Можно программно получить эти данные, что он вершина у блока А - это было начало, а вершина у блока Б - это конец?
Это не ответ на мой вопрос.
Да, координаты, чтобы по этим координатам получить пересечение с блоком, из блока получить атрибуты.
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 14:40:54
Код - C++ [Выбрать]
  1. AcGePoint3d ptStart, ptEnd;
  2. pLine->getPointAt(0,ptStart);
  3. pLine->getPointAt(pLine->numVerts()-1,ptEnd);
Последний тогда вопрос из этой темы - как по вершине получить блок, к которому эта линия доведена?
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: Александр Ривилис от 22-04-2022, 14:46:18
Последний тогда вопрос из этой темы - как по вершине получить блок, к которому эта линия доведена?
Короткий ответ: никак.
Длинный ответ: перебрать все блоки, и найти тот, который находится возле вершины. Правда что такое "блок к которому доведена линия" в терминах AutoCAD тебе придется определить самому. Это точка вставки блока? Или это точка на одном из объектов внутри блока? Или это еще что-то???
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: DimVer от 22-04-2022, 14:55:54
Последний тогда вопрос из этой темы - как по вершине получить блок, к которому эта линия доведена?
Короткий ответ: никак.
Длинный ответ: перебрать все блоки, и найти тот, который находится возле вершины. Правда что такое "блок к которому доведена линия" в терминах AutoCAD тебе придется определить самому. Это точка вставки блока? Или это точка на одном из объектов внутри блока? Или это еще что-то???
Это точка, где вершина полилинии стоит на одной из линий, входящих в блок. Точнее ссылки на блок, если пытаться писать в терминологии Автокад)
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: Александр Ривилис от 22-04-2022, 17:47:48
Это точка, где вершина полилинии стоит на одной из линий, входящих в блок.
В общем случае задача очень нетривиальная.
Название: Re: Как получить вершины AcDbPolyline если в классе нет метода vertexIterator
Отправлено: alex-63 от 25-11-2022, 14:11:18
Мне кажется проще применить  ssget по фильтру и оттуда вытащить нужный блок.