Вопрос по привязка на пересечение

Автор Тема: Вопрос по привязка на пересечение  (Прочитано 24594 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #15 : 16-09-2015, 17:05:23 »
да, но теперь не работают почему то привязки на пересечении к самой полилинии и не работает привязка полилинии к вложенному отрезку?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по привязка на пересечение
« Ответ #16 : 16-09-2015, 17:17:43 »
Подправил и обновил архив.
Код - C++ [Выбрать]
  1. Acad::ErrorStatus AuPolyline::subIntersectWith(const AcDbEntity* pEnt,
  2.                                             AcDb::Intersect intType,
  3.                                             AcGePoint3dArray& points,
  4.                                             Adesk::GsMarker thisGsMarker,
  5.                                             Adesk::GsMarker otherGsMarker) const
  6. {
  7.   if (thisGsMarker < 1000) {
  8.     return AcDbPolyline::subIntersectWith(pEnt, intType, points, thisGsMarker, otherGsMarker);
  9.   } else {
  10.     Acad::ErrorStatus es = Acad::eOk;
  11.     objArray::const_iterator it;
  12.     int gs = 1000;
  13.     for(it = m_Array.begin();it!=m_Array.end() && gs < thisGsMarker; it++, gs +=100);
  14.     if (it != m_Array.end() && gs == thisGsMarker)
  15.     {
  16.       AcRxObject* intPtr=0;
  17.       intPtr=(*it).second;
  18.       if (intPtr) {
  19.         AcDbEntity *pSubEnt = AcDbEntity::cast(intPtr);
  20.         if (pSubEnt) {
  21.           es = pSubEnt->intersectWith(pEnt, intType, points,  0 /* thisGsMarker */, otherGsMarker);
  22.           return es;
  23.         }
  24.       }
  25.     }
  26.   }
  27.   return Acad::eOk;
  28. }
  29.  
  30. Acad::ErrorStatus AuPolyline::subIntersectWith(const AcDbEntity* pEnt,
  31.                                             AcDb::Intersect intType,
  32.                                             const AcGePlane& projPlane,
  33.                                             AcGePoint3dArray& points,
  34.                                             Adesk::GsMarker thisGsMarker,
  35.                                             Adesk::GsMarker otherGsMarker) const
  36. {
  37.   if (thisGsMarker < 1000) {
  38.     return AcDbPolyline::subIntersectWith(pEnt, intType, projPlane, points, thisGsMarker, otherGsMarker);
  39.   } else {
  40.     Acad::ErrorStatus es = Acad::eOk;
  41.     objArray::const_iterator it;
  42.     int gs = 1000;
  43.     for(it=m_Array.begin();it!=m_Array.end() && gs < thisGsMarker;it++, gs +=100);
  44.     if (it != m_Array.end() && gs == thisGsMarker)
  45.     {
  46.       AcRxObject* intPtr=0;
  47.       intPtr=(*it).second;
  48.       if (intPtr) {
  49.         AcDbEntity *pSubEnt = AcDbEntity::cast(intPtr);
  50.         if (pSubEnt) {
  51.           es = pSubEnt->intersectWith(pEnt, intType, projPlane, points,  0 /* thisGsMarker */, otherGsMarker);
  52.           return es;
  53.         }
  54.       }
  55.     }
  56.   }
  57.   return Acad::eOk;
  58. }

Вроде работает. Но там еще столько разных нюансов...
« Последнее редактирование: 17-09-2015, 00:05:21 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #17 : 16-09-2015, 17:52:17 »
спасибо! обязательно посмотрю.

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #18 : 18-09-2015, 10:34:30 »
хотел спросить: что за числа 1000 и 100 в строках 12 и 13 например исправленного кода?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по привязка на пересечение
« Ответ #19 : 18-09-2015, 10:51:54 »
хотел спросить: что за числа 1000 и 100 в строках 12 и 13 например исправленного кода?
Числа взяты "с потолка". В действительности вместо 1000 должно быть число большее чем количество вершин у основной полилинии, а вместо 100 должно быть число не меньшее, чем количество Selection Marker у вложенного примитива. У штриховки это значение кажется (но нужно проверить) равно 1. У отрезка тоже 1. У полилинии - это количество вершин. В противном случае маркеры наложатся и нельзя будет понять пересечение с каким вложенным (или основным) примитивом мы ищем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #20 : 25-09-2015, 08:17:47 »
Сейчас добавил новую полилинию к вложенным объектам и привязка на пересечение перестала работать.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по привязка на пересечение
« Ответ #21 : 25-09-2015, 11:41:21 »
Сейчас добавил новую полилинию к вложенным объектам и привязка на пересечение перестала работать.
Я и не обещал, что в этом случае будет работать. Особенно в версиях AutiCAD до 2015. Почитай тему: http://adn-cis.org/forum/index.php?topic=2660.0
« Последнее редактирование: 25-09-2015, 17:50:17 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #22 : 03-10-2015, 10:33:16 »
я правильно понял, что AcDbPolyline к моему примеру нельзя добавить с правильной привязкой на пересечение даже в автокаде 2015?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по привязка на пересечение
« Ответ #23 : 03-10-2015, 13:52:53 »
Нет. Ты неправильно понял. Можно. Хотя будут свои нюансы. Теоретически можно и в версиях до 2015. Но тогда всё резко усложняется. Вместо того, что в AuPolyline::subWorldDraw рисовать полилинию в одном вызове worldDraw её придётся разбивать на сегменты и каждый рисовать отдельно со своим SelectionMarker. Это всё придётся учитывать и в других методах, которые используют SelectionMarker.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #24 : 03-10-2015, 15:20:03 »
я не знаю как разбить полилинию на участки, чтобы применять для них worldraw. А в AC 2015 не надо разбивать на участки?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по привязка на пересечение
« Ответ #25 : 03-10-2015, 17:03:28 »
я не знаю как разбить полилинию на участки, чтобы применять для них worldraw.
Ну например как-то так:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- AcDbEntity protocols
  3. Adesk::Boolean AuPolyline::subWorldDraw(AcGiWorldDraw *mode) {
  4.   assertReadEnabled();
  5.   //***************
  6.   // Call base class first
  7.   AcDbPolyline::subWorldDraw(mode);
  8.   acutPrintf(_T("Работает worldDrow\n"));
  9.   double szRef = 5.0;
  10.   // ================================================================
  11.   // DIRECTION AND VERTEX NUMBERING
  12.   int signal = 1;
  13.   double ht2 = szRef / 4.0;
  14.   for (int i = 0; i < numVerts(); i++)
  15.   {
  16.     AcGePoint3d pti;
  17.     this->getPointAt(i, pti);
  18.     // Draw vertex text
  19.     CString strNum;
  20.     strNum.Format(_T("%d"), i);
  21.     AcGePoint3d ptTxt = pti + (AcGeVector3d::kXAxis*ht2) +
  22.       (AcGeVector3d::kYAxis*ht2);
  23.     mode->subEntityTraits().setColor(256); // ByLayer  
  24.     mode->geometry().text(ptTxt, AcGeVector3d::kZAxis,
  25.       AcGeVector3d::kXAxis, ht2, 1.0, 0.0, strNum);
  26.  
  27.     // Arrow direction
  28.     AcGePoint3d ptj;
  29.     this->getPointAt(i < (numVerts() - 1) ? (i + 1) : 0, ptj);
  30.     AcGeVector3d dir = (ptj - pti).normalize();
  31.     // Side perpendicular vectors
  32.     AcGeVector3d perp = dir;
  33.     perp.rotateBy(3.141592 / 2.0, AcGeVector3d::kZAxis);
  34.     AcGePoint3d pt1 = ptj - (dir*ht2) + (perp*(ht2 / 4.0));
  35.     AcGePoint3d pt2 = ptj - (dir*ht2) - (perp*(ht2 / 4.0));
  36.     AcGePoint3d pts[3];
  37.     pts[0] = ptj;
  38.     pts[1] = pt1;
  39.     pts[2] = pt2;
  40.     // Draw arrow polygon
  41.     mode->subEntityTraits().setFillType(kAcGiFillAlways);
  42.     mode->subEntityTraits().setColor(1); // red
  43.     mode->geometry().polygon(3, pts);
  44.     mode->subEntityTraits().setFillType(kAcGiFillNever);
  45.   }
  46.  
  47.   //============================================
  48.   // PROXY
  49.   if (mode->regenType() == kAcGiSaveWorldDrawForProxy)
  50.   {
  51.     // Draw dummy text
  52.     CString strTxt = _T("AU Polyline");
  53.     AcGePoint3d ptTxt = GetPolylineCenter();
  54.     mode->geometry().text(ptTxt, AcGeVector3d::kZAxis,
  55.       AcGeVector3d::kXAxis, szRef, 1.0, 0.0, strTxt);
  56.   }
  57.  
  58.   objArray::iterator it;
  59.   int gs = numVerts();
  60.   for (it = m_Array.begin(); it != m_Array.end(); it++)
  61.   {
  62.     AcDbPolyline *pPline = AcDbPolyline::cast(it->second);
  63.     if (pPline) {
  64.       AcDbVoidPtrArray aSubEnt;
  65.       pPline->explode(aSubEnt);
  66.       for (int i = 0; i < aSubEnt.length(); i++)
  67.       {
  68.         mode->subEntityTraits().setSelectionMarker(++gs);
  69.         static_cast<AcDbEntity*>(aSubEnt[i])->worldDraw(mode);
  70.         delete aSubEnt[i];
  71.       }
  72.     }
  73.     else {
  74.       mode->subEntityTraits().setSelectionMarker(++gs);
  75.       it->second->worldDraw(mode);
  76.     }
  77.   }
  78.  
  79.   //------ Returning Adesk::kFalse here will force viewportDraw() call
  80.   return (Adesk::kTrue);
  81. }

Но это лишь полуфабрикат. Аналогичная обработка понадобится и в:
AuPolyline::subIntersectWith
AuPolyline::subGetOsnapPoints
и т.д.

А в AC 2015 не надо разбивать на участки?
Нет. Хотя возможно будут другие подводные камни - это тебе придётся всё самостоятельно проверять.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #26 : 06-10-2015, 08:39:53 »
удалось вроде добиться пересечений в AC2012. Теперь осталось с getOsnapPoint разобраться.

Код - C++ [Выбрать]
  1. Acad::ErrorStatus AuPolyline::subIntersectWith(const AcDbEntity* pEnt,
  2.                                                                                            AcDb::Intersect intType,
  3.                                                                                            AcGePoint3dArray& points,
  4.                                                                                            Adesk::GsMarker thisGsMarker,
  5.                                                                                            Adesk::GsMarker otherGsMarker) const
  6. {
  7.         if (thisGsMarker <= numVerts())
  8.         {
  9.                 return AcDbPolyline::subIntersectWith(pEnt, intType, points, thisGsMarker, otherGsMarker);
  10.         }
  11.         else
  12.         {
  13.                 Acad::ErrorStatus es = Acad::eOk;
  14.                 objArray::const_iterator it;
  15.                 int gs = numVerts()+1;
  16.                 for(it = m_Array.begin();it!=m_Array.end() && gs <= thisGsMarker; it++)
  17.                 {
  18.                         AcRxObject* intPtr=0;
  19.                         intPtr=(*it).second;
  20.                         if (intPtr)
  21.                         {
  22.                                 AcDbEntity *pSubEnt = AcDbEntity::cast(intPtr);
  23.                                 if (pSubEnt)
  24.                                 {
  25.                                         if(AcDbPolyline *pPline = AcDbPolyline::cast(intPtr))
  26.                                         {
  27.                                                 AcDbVoidPtrArray aSubEnt;
  28.                                                 pPline->explode(aSubEnt);
  29.                                                 int length=aSubEnt.length();
  30.                                                 if((gs+length-1)<thisGsMarker) //если маркер не попадает в интервал полилинии
  31.                                                 {
  32.                                                         gs+=length;
  33.                                                         for(int j=0;j<length;j++) delete aSubEnt[j];
  34.                                                         continue;
  35.                                                 }
  36.                                                 else ////если маркер попадает в интервал полилинии
  37.                                                 {
  38.                                                         for (int i = 0; i < length; i++,gs++)
  39.                                                         {
  40.                                                                 if(gs==thisGsMarker)
  41.                                                                 {
  42.                                                                         es = static_cast<AcDbEntity*>(aSubEnt[i])->intersectWith(pEnt, intType, points,
  43.                                                                                 0 /* thisGsMarker */, otherGsMarker);
  44.                                                                         for(int j=i;j<length;j++) delete aSubEnt[j];
  45.                                                                         return es;
  46.                                                                 }
  47.                                                                 else
  48.                                                                 {
  49.                                                                         delete aSubEnt[i];
  50.                                                                 }
  51.                                                         }
  52.                                                 }
  53.                                         } else
  54.                                         {
  55.                                                 if(gs==thisGsMarker)
  56.                                                 {
  57.                                                         es = pSubEnt->intersectWith(pEnt, intType, points,
  58.                                                                 0 /* thisGsMarker */, otherGsMarker);
  59.                                                 }
  60.                                                 gs++;
  61.                                         }
  62.                                 }
  63.  
  64.                 }
  65.         }
  66.         }
  67.  
  68.         return Acad::eOk;
  69. }

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #27 : 08-10-2015, 08:07:32 »
Код - C++ [Выбрать]
  1. Acad::ErrorStatus AuPolyline::subGetOsnapPoints (
  2.         AcDb::OsnapMode osnapMode,
  3.         Adesk::GsMarker gsSelectionMark,
  4.         const AcGePoint3d &pickPoint,
  5.         const AcGePoint3d &lastPoint,
  6.         const AcGeMatrix3d &viewXform,
  7.         AcGePoint3dArray &snapPoints,
  8.         AcDbIntArray &geomIds) const
  9. {
  10.         assertReadEnabled () ;
  11.         switch (osnapMode)
  12.         {
  13.                 case AcDb::kOsModeCen:
  14.                         snapPoints.append(GetPolylineCenter());
  15.                         break;
  16.         }
  17.  
  18.         Acad::ErrorStatus er;
  19.         objArray::const_iterator it;
  20.        
  21.         //int gs=numVerts();
  22.         for(it=m_Array.begin();it!=m_Array.end();it++)
  23.         {
  24.                         er=(*it).second->getOsnapPoints(osnapMode,gsSelectionMark,pickPoint,
  25.                                 lastPoint,viewXform,snapPoints,geomIds);
  26.                         //if (er!=Acad::eOk) //на штриховке появляется инвалид-индекс?
  27.                         //      return er;
  28.         }
  29.         return (AcDbPolyline::subGetOsnapPoints (osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds)) ;
  30. }

Интересно, закомментировал строки 26 и 27 в subGetOsnapPoint и стали работать кроме пересечения другие привязки. Правда на штриховке в строке 24 функия возвращает инвалид-индекс.

Правильно ли я сделал?

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Вопрос по привязка на пересечение
« Ответ #28 : 08-10-2015, 08:18:56 »
Вот код полный.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по привязка на пересечение
« Ответ #29 : 08-10-2015, 08:38:26 »
Думаю, что в AuPolyline::subGetOsnapPoints ты должен поступать аналогично AuPolyline::subIntersectWith, т.е. если в m_Array есть полилиния, то её расчленять и обрабатывать. Скорее всего на штриховке у тебя получается неправильный индекс именно потому, что ты не обрабатываешь полилинию и индексы сдвигаются.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение