странное поведение собственной грипсы

Автор Тема: странное поведение собственной грипсы  (Прочитано 11158 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Заметил различие в поведении собственноручно созданной грипсы в 2015 автокаде. 2010-2014 работает как надо.
собственно, анимашки
автокад 2014:


автокад 2015:


ну и исходный код в придачу:

описание самой грипсы
Код - C++ [Выбрать]
  1. namespace GripCback
  2. {
  3.   double roatation_angle; // угол под которым нужно повернуть грипсу, чтоб шла по линии. получаем через subWorldDraw
  4.   AcGeVector3d zAxis; // ось Z. получаем через subWorldDraw
  5.  
  6.   void ViewportDrawGrips(AcDbGripData* pThis, AcGiViewportDraw* vportDrawContext, const AcDbObjectId& entId, AcDbGripOperations::DrawType type, AcGePoint3d* cursor, int iGripSize)
  7.   {
  8.     AcGeMatrix3d e2w; vportDrawContext->viewport().getEyeToWorldTransform(e2w);
  9.     AcGePoint3d point = pThis->gripPoint();
  10.  
  11.     AcGeMatrix3d matRotation; matRotation.setToIdentity();
  12.     matRotation.setToRotation(roatation_angle,zAxis,point);
  13.  
  14.     AcGePoint2d glyphSize;
  15.     vportDrawContext->viewport().getNumPixelsInUnitSquare( point, glyphSize );
  16.  
  17.     double height = iGripSize/glyphSize.y * 2.6;
  18.     double width = iGripSize/glyphSize.x * 4.55;
  19.  
  20.     int color = 1;
  21.     switch (type)
  22.     {
  23.       case AcDbGripOperations::kHotGrip:
  24.         color = CAcDbCurveText::gripHOT;
  25.         break;
  26.  
  27.       case AcDbGripOperations::kHoverGrip:
  28.         color = CAcDbCurveText::gripHOVER;
  29.         break;
  30.  
  31.       default:
  32.         color = CAcDbCurveText::gripCOLOR;
  33.         break;
  34.     }
  35.  
  36.     vportDrawContext->subEntityTraits().setFillType(kAcGiFillAlways);
  37.     vportDrawContext->subEntityTraits().setThickness(3);
  38.                
  39.     AcGePoint2dArray verticles; verticles.removeAll();  AcGeDoubleArray bulges; bulges.removeAll();
  40.     verticles.append(AcGePoint2d(point.x - width / 2.0,point.y));  bulges.append(0.0);
  41.     verticles.append(AcGePoint2d(point.x - width / 4.0,point.y + height / 2.0));  bulges.append(0.0);
  42.     verticles.append(AcGePoint2d(point.x - width / 4.0,point.y + height / 5.0));  bulges.append(0.0);
  43.     verticles.append(AcGePoint2d(point.x + width / 4.0,point.y + height / 5.0));  bulges.append(0.0);
  44.     verticles.append(AcGePoint2d(point.x + width / 4.0,point.y + height / 2.0));  bulges.append(0.0);
  45.     verticles.append(AcGePoint2d(point.x + width / 2.0,point.y));  bulges.append(0.0);
  46.     verticles.append(AcGePoint2d(point.x + width / 4.0,point.y - height / 2.0));  bulges.append(0.0);
  47.     verticles.append(AcGePoint2d(point.x + width / 4.0,point.y - height / 5.0));  bulges.append(0.0);
  48.     verticles.append(AcGePoint2d(point.x - width / 4.0,point.y - height / 5.0));  bulges.append(0.0);
  49.     verticles.append(AcGePoint2d(point.x - width / 4.0,point.y - height / 2.0));  bulges.append(0.0);
  50.     verticles.append(AcGePoint2d(point.x - width / 2.0,point.y));  bulges.append(0.0);
  51.  
  52.     // внутренняя заливка
  53.     AcDbHatch * pHatch = new AcDbHatch();
  54.     pHatch->setPattern(AcDbHatch::kPreDefined, _T("SOLID"));
  55.     pHatch->setPatternScale(1.0);
  56.     pHatch->setDatabaseDefaults();
  57.     pHatch->setAssociative(false);
  58.     pHatch->appendLoop(AcDbHatch::kDefault, verticles, bulges);
  59.     pHatch->setColorIndex(color);
  60.     pHatch->transformBy(matRotation);
  61.     vportDrawContext->geometry().draw(pHatch);
  62.     delete pHatch;
  63.     pHatch = 0;
  64.  
  65.     // черный контур
  66.     AcDbPolyline* pCoolGrips = new AcDbPolyline;
  67.     for (int i = 0; i < 11; i++)
  68.       pCoolGrips->addVertexAt(i,verticles.at(i));
  69.  
  70.     pCoolGrips->transformBy(matRotation);
  71.     vportDrawContext->subEntityTraits().setColor(7);
  72.     vportDrawContext->geometry().pline(*pCoolGrips);
  73.     delete pCoolGrips;
  74.     pCoolGrips = 0;
  75.   }
  76. };
  77.  

subGetGripPoints
Код - C++ [Выбрать]
  1. Acad::ErrorStatus CAcDbCurveText::subGetGripPoints (AcDbGripDataPtrArray &grips, const double curViewUnitSize, const int gripSize,const AcGeVector3d &curViewDir, const int bitflags) const
  2. {
  3.   assertReadEnabled();
  4.   Acad::ErrorStatus es = Acad::eAmbiguousInput;
  5.   if (m_pCurve != NULL)
  6.   {
  7.     if (m_pOffsetCurve != NULL)
  8.     {
  9.       AcDbGripData* gpd=new AcDbGripData();
  10.       gpd->setAppData((void*)9999);// уникальный идентификатор нашей грипсы
  11.       double endParam;                 
  12.       if ( m_pOffsetCurve->getEndParam(endParam) != Acad::eOk ) return es;
  13.       if ( m_pOffsetCurve->getDistAtParam(endParam, endParam) != Acad::eOk ) return es;
  14.       double m_currentDistance = isReversed() ? endParam - getStartDist() : getStartDist();
  15.       AcGePoint3d startTextPosition;
  16.       m_pOffsetCurve->getPointAtDist(m_currentDistance, startTextPosition);
  17.       gpd->setGripPoint(startTextPosition);
  18.       gpd->setViewportDraw(GripCback::ViewportDrawGrips);
  19.       grips.append(gpd);
  20.     }
  21.     es = m_pCurve->getGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitflags);
  22.   }
  23.   return es;
  24. }
  25.  

subMoveGripPointsAt в принципе не нужно, но пусть будет
Код - C++ [Выбрать]
  1. Acad::ErrorStatus CAcDbCurveText::subMoveGripPointsAt (const AcDbVoidPtrArray &gripAppData, const AcGeVector3d &offset,const int bitflags)
  2. {
  3.   assertWriteEnabled () ;
  4.   Acad::ErrorStatus es = Acad::eAmbiguousInput;
  5.   if (m_pCurve != NULL)
  6.   {
  7.     bool moveTextGRIP = false;
  8.     if (m_pOffsetCurve == NULL)
  9.       createOffsetedCurve();
  10.  
  11.     for(int g=0;g<gripAppData.length();g++)
  12.     {
  13.       if ((int)gripAppData.at(g)==9999)
  14.       {
  15.         double endParam;
  16.         if ( m_pOffsetCurve->getEndParam(endParam) != Acad::eOk ) break ;
  17.         if ( m_pOffsetCurve->getDistAtParam(endParam, endParam) != Acad::eOk ) break ;
  18.         double m_currentDistance = isReversed() ? endParam - getStartDist() : getStartDist();
  19.  
  20.         AcGePoint3d ptCurve;
  21.         m_pOffsetCurve->getPointAtDist(m_currentDistance, ptCurve);
  22.         ptCurve.transformBy(offset);
  23.         m_pOffsetCurve->getClosestPointTo(ptCurve,ptCurve);
  24.         m_pOffsetCurve->getDistAtPoint(ptCurve, m_startDist);
  25.         if (isReversed())
  26.           m_startDist = endParam - getStartDist();
  27.         moveTextGRIP = true;
  28.         break;
  29.       }
  30.     }
  31.  
  32.     // скольжения текста не будет, тягали узловые точки
  33.     if (!moveTextGRIP)
  34.     {
  35.       es = m_pCurve->moveGripPointsAt(gripAppData, offset, bitflags);
  36.       createOffsetedCurve(); // и перестроить наш офсет. базовая траектория дёрнулась
  37.     }
  38.   }
  39.   return es;
  40. }
  41.  

ну и вопрос. это я что-то нахимичил, или с моей стороны всё ок и можно постучаться в автодеск?

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

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

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
после отключения аппаратного ускорения просто ухуджилось качество объекта при наведении/выборе. грипса ведет себя также.
ладно штриховка не нарисовалась солидом, а остался только контур (и это конечно интересно, но да ладно). но вот почему-то после зеркалки штриховка и черный контур трансформируются по разным матрицам, хотя происходит это в одной и той же функции через пару строк друг от друга, и матрица не меняется (или это огрызки от старой штриховки, которая была до зеркала).

в общем, сейчас поковыряюсь чуток (попробую оставить только штриховку и понаюл.дать за её поведением) и для начала выкину в офф. форум. оттуда оно и так попадет на devhelp от моего аккауна, если ничего хорошего не посоветуют.

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

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

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
чуток потестировал
Код - C++ [Выбрать]
  1. bool aa = false;
  2. Acad::ErrorStatus es;
  3. // внутренняя заливка
  4. AcDbHatch * pHatch = new AcDbHatch();
  5. es = pHatch->setPattern(AcDbHatch::kPreDefined, _T("SOLID"));
  6. es = pHatch->setPatternScale(1.0);
  7. pHatch->setDatabaseDefaults();
  8. es = pHatch->setAssociative(false);
  9. es = pHatch->appendLoop(AcDbHatch::kDefault, verticles, bulges);
  10. es = pHatch->setColorIndex(color);
  11. es = pHatch->transformBy(matRotation);
  12. aa = vportDrawContext->geometry().draw(pHatch);
  13. aa = false;
  14. delete pHatch;
  15. pHatch = 0;
  16.  
все возвраты es Acad::eOk, a geometry().draw - true.
но штриховка вообще не отображается. видать прийдется делать её переменной класса и убивать в деструкторе. так то уж точно нарисует :):):), хотя.... прийдется пободаться, передать в неймспейс штриховку класса. так что это совсем альтернативный черезж...ный вариант :)

PS: про devhelp нехочу ничего сказать плохого, но на моей практике чаще получал правильные ответы от людей со стороны :):):) (из последних перлов, на офф форуме почитайте темку "UCS_V")
так что рассматриваю их как "условно бесплатный" бонус, а не как основной источник правильных ответов.

кстати, в 2015 sp2 блоки починили. теперь всё вставляется как надо даже для тех блоков, которые так и остались корявыми. не переделывал я их просто. но вот упоминания о том, что они это починили тупо нет, да и ни в одной из трех или четырех мной созданных тем по этому поводу никто не отписался. проблемы просто не существовало, я всё выдумал

если найдете упоминание о решении моей проблемы, ткните меня носиком :):):)
http://knowledge.autodesk.com/sites/default/files/file_downloads/AutoCAD_2015_and_AutoCAD_LT_2015_SP2_Rus.htm

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
все возвраты es Acad::eOk, a geometry().draw - true.
Странно, что она вообще отображалась в предыдущих версиях, если ты сразу её убиваешь.
Можешь на всякий случай попробовать вместо:
Код - C++ [Выбрать]
  1. aa = vportDrawContext->geometry().draw(pHatch);
использовать:
Код - C++ [Выбрать]
  1. aa = pHatch->viewportDraw(vportDrawContext);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Код - C++ [Выбрать]
  1. /*aa = */pHatch->viewportDraw(vportDrawContext);
таже беда, ток возврат не проконтролировать, ибо void.
Цитировать
Странно, что она вообще отображалась в предыдущих версиях, если ты сразу её убиваешь.
дык, по такому ж принципу и должно работать, если я что-то понимаю. на отрисовку передали, команда отрисовала. всё. дальше оно не нужно. если шевельнули колесом мышки или еще как-то повзаимодействовали, опять есть вход в функцию. полилиния то черненькая рисуется так же и с ней нет никаких проблем.

о, перефразирую вопрос :):):) как правильно залить контур, ограниченный точками в vportDrawContext->...? может просто есть другой способ (чтоб не рисовать штриховку), который мне даст залитую фигуру нужного цвета :)

Отмечено как Решение Николай Горлов 20-11-2014, 13:28:35

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
дык, по такому ж принципу и должно работать, если я что-то понимаю. на отрисовку передали, команда отрисовала. всё. дальше оно не нужно. если шевельнули колесом мышки или еще как-то повзаимодействовали, опять есть вход в функцию. полилиния то черненькая рисуется так же и с ней нет никаких проблем.
Почитай: http://adn.autodesk.com/adn/servlet/devnote?siteID=4814862&id=6410837&linkID=4900509
Правильнее конечно сделать его членом класса. А еще правильнее вообще не пользоваться AcDbHatch:
Код - C++ [Выбрать]
  1. AcGiFillType curFt = mode->subEntityTraits().fillType();
  2. Adesk::UInt16 curColor =  mode->subEntityTraits().color();
  3. mode->subEntityTraits().setFillType(kAcGiFillAlways);
  4. mode->subEntityTraits().setColor(color);
  5. mode->geometry().polygon(nPoints,pts) ; // Рисуем заполненную область
  6. mode->subEntityTraits().setFillType(curFt);    
  7. mode->subEntityTraits().setColor(curColor);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
:) опередили вы меня. только хотел зайти и написать, что переделал через полигон
да, теперь всё работает правильно. так что странное поведение штриховки можно оставить для будущих версий акада :):):) вдруг где всплывет.