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

ADN Club => ObjectARX => Тема начата: knightrocker от 10-07-2018, 15:35:56

Название: Некорректное отображение дуги при использовании метода subExplode
Отправлено: knightrocker от 10-07-2018, 15:35:56
Добрый день.
Среда: MSVS 2015, Autocad 2017, Platform х64
Проект находится в архиве MyProject-ARC-Explode.rar

Проблема в отрисовке полукруга методом subExplode, в зависимости от угла поворота болта на момент использования subExplode дуга или отрисовывается на своем месте или смещается на различную величину , попробовал сделать if который бы менял поправочные коэффициенты в зависимости от угла  поворота детали, но ,видимо ,что то сделал неправильно, не покидает ощущение что решение через данные коэффициенты

(https://s15.postimg.cc/mizni8ovr/image.jpg) (https://postimg.cc/image/mizni8ovr/)


является в корне неверным, пожалуйста помогите.



Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: Александр Ривилис от 10-07-2018, 15:53:58
пожалуйста помогите.
Начни с того, что прочитай моё последнее сообщение в твоей предыдущей теме и выполни мою просьбу.
Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: knightrocker от 10-07-2018, 15:57:05
Прочитал, выполнил. ::)
Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: Александр Ривилис от 10-07-2018, 16:00:28
Прочитал, выполнил. ::)
А вот про то, что из проекта нужно удалить файлы ArxProject3.aps, squarent.h, squarent.cpp ???
Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: knightrocker от 10-07-2018, 16:02:57
 ::) извиняюсь
Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: Александр Ривилис от 10-07-2018, 16:36:00
Код - C# [Выбрать]
  1. Acad::ErrorStatus Bolt::subExplode(AcDbVoidPtrArray& entitySet) const
  2. {
  3.   assertReadEnabled();
  4.  
  5.   // РЕЗЬБА
  6.   AcDbLine* line;
  7.   for (int i = 0; i < m_arRezbaline.length() - 1; i++)
  8.   {
  9.     line = new AcDbLine();
  10.     line->setStartPoint(m_arRezbaline.at(i));
  11.     line->setEndPoint(m_arRezbaline.at(i + 1));
  12.     line->setNormal(m_vecU.crossProduct(m_vecV).normal());
  13.     entitySet.append(line);
  14.   }
  15.  
  16.   AcDbLine* _line;
  17.   for (int i = 0; i < m_arHatMainline.length() - 1; i++)
  18.   {
  19.     _line = new AcDbLine();
  20.     _line->setStartPoint(m_arHatMainline.at(i));
  21.     _line->setEndPoint(m_arHatMainline.at(i + 1));
  22.     _line->setNormal(m_vecU.crossProduct(m_vecV).normal());
  23.     entitySet.append(_line);
  24.   }
  25.  
  26.   //  ПОЛУКРУГ
  27. //////////////////////////////////////////////////////////////////////////
  28. //                    Начало полного бреда
  29. //////////////////////////////////////////////////////////////////////////
  30. //  AcGePoint3d center, dir, pt1, pt2;
  31. //
  32. //  center.set(m_ptStart[X], m_ptStart[Y], m_ptStart[Z]);
  33. //  pt1.set(m_arHatline[0][X], m_arHatline[0][Y], m_arHatline[0][Z]);
  34. //  //dir.set(m_arHatline[1][X], m_arHatline[1][Y], m_arHatline[1][Z]);
  35. //  pt2.set(m_arHatline[1][X], m_arHatline[1][Y], m_arHatline[1][Z]);
  36. //
  37. //  AcGeVector3d v1 = m_ptEdge - center;
  38. //  AcGeVector3d v2 = AcGeVector3d::kXAxis;
  39. //
  40. //  //dir = center -
  41. //  //AcGeVector3d zDir = m_vecU.crossProduct(m_vecV);
  42. //  //double rad = m_vecU.angleTo(AcGeVector3d::kXAxis);
  43. //  double rad = (m_ptStart.asVector()).angleTo((m_ptStart.asVector() - AcGeVector3d(m_ptStart[X], m_ptStart[Y]+1, m_ptStart[Z])));
  44. //  double grad = (rad * 360.0) / M_PI;
  45. //
  46. //  rad = v1.angleTo(v2);
  47. //  grad = (rad * 360.0) / M_PI;
  48. //
  49. //
  50. //  if (grad > 0 && grad <= 90)
  51. //  {
  52. //        pt2.set(m_arHatline[2][X] - 0.0001, m_arHatline[2][Y] + 0.0001, m_arHatline[2][Z]);
  53. //  }
  54. //  if (grad > 90 && grad <= 180)
  55. //  {
  56. //        pt2.set(m_arHatline[2][X] - 0.0001, m_arHatline[2][Y] + 0.0001, m_arHatline[2][Z]);
  57. //  }
  58. //  if (grad > 180 && grad <= 270)
  59. //  {
  60. //        pt2.set(m_arHatline[2][X] - 0.0001, m_arHatline[2][Y] + 0.0001, m_arHatline[2][Z]);
  61. //  }
  62. //  if (grad > 270 && grad <= 360)
  63. //  {
  64. //        pt2.set(m_arHatline[2][X] - 0.0001, m_arHatline[2][Y] + 0.0001, m_arHatline[2][Z]);
  65. //  }
  66. //
  67. //  AcGePoint3d centerWcs(center), pt1Wcs(pt1), pt2Wcs(pt2);
  68. ////  acdbUcs2Wcs(asDblArray(center), asDblArray(centerWcs), false);
  69. ////  acdbUcs2Wcs(asDblArray(pt1), asDblArray(pt1Wcs), false);
  70. ////  acdbUcs2Wcs(asDblArray(pt2), asDblArray(pt2Wcs), false);
  71. //
  72. //  AcGeVector3d v1Wcs(pt1Wcs - centerWcs);
  73. //  AcGeVector3d v2Wcs(pt2Wcs - centerWcs);
  74. //
  75. //  double radius = centerWcs.distanceTo(pt1Wcs);
  76. //  AcGeVector3d arcNorm = (-1) * v1Wcs.crossProduct(v2Wcs);
  77. //
  78. //  AcGeVector3d arcRef = arcNorm.perpVector();
  79. //  arcNorm.negate();
  80. //
  81. //  double startAngle = v1Wcs.angleTo(arcRef, arcNorm);
  82. //  double endAngle = v2Wcs.angleTo(arcRef, arcNorm);
  83. //
  84. //  AcDbArc * pArc = new AcDbArc(centerWcs, arcNorm, radius, startAngle, endAngle);
  85. //
  86. //  //pArc->setStartAngle(startAngle);
  87. //  //pArc->setEndAngle(endAngle);
  88. //
  89. //  pArc->setNormal(AcGeVector3d(0.0, 0.0, 1.0));
  90. //
  91. //////////////////////////////////////////////////////////////////////////
  92. //                    Конец полного бреда
  93. //////////////////////////////////////////////////////////////////////////
  94.  
  95.   AcGeCircArc3d geArc(m_arHatline[0], m_arHatline[1], m_arHatline[2]);
  96.   AcDbCurve *pArc = NULL;
  97.   AcDbCurve::createFromAcGeCurve(geArc, pArc);
  98.   // добавление в набор новых примитивов
  99.   if (pArc) entitySet.append(pArc);
  100.  
  101.   return Acad::eOk;
  102. }

Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: Александр Ривилис от 10-07-2018, 16:51:07
В качестве альтернативы можешь посмотреть эту статью: http://adn-cis.org/kak-preobrazovat-acgecircarc3d-v-acdbarc-i-naoborot.html
Там показывается как из AcGeCircArc3d можно получить AcDbArc без использования метода AcDbCurve::createFromAcGeCurve. В свою очередь получить AcGeCircArc3d ты можешь по трём точкам - начало, промежуточная и конечная точки дуги.
Название: Re: Некорректное отображение дуги при использовании метода subExplode
Отправлено: knightrocker от 10-07-2018, 17:10:14
Большое спасибо, я так и думал что какого-то бреда там налепил  ::)