неприятный глючок в monitorInputPoint

Автор Тема: неприятный глючок в monitorInputPoint  (Прочитано 6399 раз)

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

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

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

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

раньше этот глючок тоже проскальзывал, но был не таким критичным, т.к. дополнительные строки формировались через "\n". и глючок заключался только в том, что строки выводились только мои и в сереньком прямоугольнике. всё было читаемо. а теперь вот появилось свободное время :) и решил выпендр... сделать красивенько. и глючок начал напрягать (7 и 18 секунды видео).

если вкратце, то заполняется строка pAdditionalTooltipString из monitorInputPoint() и выставляется флаг bAppendToTooltipStr = true;
открываемые для чтения объекты из apertureEntities закрываются там же. вот в принципе и всё.
проявляется это чудо с переменным успехом в любом автокаде.
на баг тянет? :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #1 : 20-06-2019, 17:27:57 »
на баг тянет? :)
Это если будет нормальный тестовый проект для проверки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #2 : 20-06-2019, 17:36:57 »
Посмотри эту тему (точнее комментарии к ней): https://adndevblog.typepad.com/autocad/2013/03/formatting-in-rollover-tip.html
Судя по всему следует проверять keyPointEntities и только если массив не пуст устанавливать appendToTooltipStr в true.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: неприятный глючок в monitorInputPoint
« Ответ #3 : 21-06-2019, 12:04:19 »
Посмотри эту тему (точнее комментарии к ней): https://adndevblog.typepad.com/autocad/2013/03/formatting-in-rollover-tip.html
Судя по всему следует проверять keyPointEntities и только если массив не пуст устанавливать appendToTooltipStr в true.
тему посмотрел, особенно порадовал последний ответ :)

keyPointEntities тут вообще ни при чем. если я правильно разобрался в отсутствующем куске документации (смотрел в ObjectARX help-e 2010-2019), туда попадают объекты, для которых сработала привязка. меня же интересует чисто подсвеченный объект (даже если их куча под курсором, подсвечивается только один, который находится в apertureEntities[0]).
еще полезным стало из той статейки то, что за отображение в новом ситле отвечает переменная ROLLOVERTIPS. если поменять её ручками на 0, то подсказки старого образца выпадают всегда. попытался принудительно (внутри monitorInputPoint) выставлять эту переменную в 1 - не помогло, глюк остался.
решил проверить, может проблема в получении данных из объектов, поставил в подсказки просто статический текст из статейки

исходный код к этому добру выглядит так:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus
  2. CMyClass::monitorInputPoint(
  3.          bool& bAppendToTooltipStr,
  4.      TCHAR*& pAdditionalTooltipString,
  5.      AcGiViewportDraw* pDrawContext,
  6.      AcApDocument* pDocument,
  7.      bool pointComputed,
  8.      int history,
  9.      const AcGePoint3d& lastPoint,
  10.      const AcGePoint3d& rawPoint,
  11.      const AcGePoint3d& grippedPoint,
  12.      const AcGePoint3d& cartesianSnappedPoint,
  13.      const AcGePoint3d& osnappedPoint,
  14.      AcDb::OsnapMask osnapMask,
  15.      const AcArray<AcDbCustomOsnapMode*>& customOsnapModes,
  16.      AcDb::OsnapMask osnapOverrides,
  17.      const AcArray<AcDbCustomOsnapMode*>& customOsnapOverrides,
  18.      const AcArray<AcDbObjectId>& apertureEntities,
  19.      const AcArray< AcDbObjectIdArray,
  20.      AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedApertureEntities,
  21.      const AcArray<INT_PTR>& gsSelectionMark,
  22.      const AcArray<AcDbObjectId>& keyPointEntities,
  23.      const AcArray< AcDbObjectIdArray,
  24.      AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedKeyPointEntities,
  25.      const AcArray<INT_PTR>& keyPointGsSelectionMark,
  26.      const AcArray<AcGeCurve3d*>& alignmentPaths,
  27.      const AcGePoint3d& computedPoint,
  28.      const TCHAR* pTooltipString)
  29. {
  30.         if (pointComputed)
  31.         {
  32.                 if (apertureEntities.length() > 0)
  33.                 {
  34.                         AcDbEntity* pEnt;
  35.                         if (acdbOpenAcDbEntity(pEnt, apertureEntities.first(), AcDb::kForRead) == Acad::eOk)
  36.                         {
  37.                                 pEnt->close();
  38.  
  39.                                 //->  это бесполезно, но чисто из принципа пусть будет
  40.                                 // если ROLLOVERTIPS = 0, всегда выводятся подсказки старого образца
  41.                                 struct resbuf bufVar;
  42.                                 bufVar.restype = RTSHORT;
  43.                                 bufVar.resval.rint = 1;
  44.                                 acedSetVar(_T("ROLLOVERTIPS"), &bufVar);
  45.                                 //<-
  46.  
  47.                                 TCHAR mtooltipStr[1024]; _tcsncpy(mtooltipStr, _T("\0"), 1024);
  48.                                 _tcscpy(mtooltipStr, _T("Iam ]]><Bold>BOLD</Bold><LineBreak/><![CDATA[Iam ]]><Italic>Italic</Italic><LineBreak/><![CDATA[Iam Normal"));
  49.                                 bAppendToTooltipStr = true;
  50.                                 pAdditionalTooltipString = _tcsdup(mtooltipStr);
  51.                         }
  52.                 }
  53.         }
  54.  
  55.         return Acad::eOk;
  56. }

кстати, по поводу того, баг это или нет. ссылочка то ваша родом из 2013 года :), и уже там Balaji Ramamoorthy натыкали носом, но в 2020 воз и ныне там

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #4 : 21-06-2019, 12:09:28 »
keyPointEntities тут вообще ни при чем.
Ты проверил как было сказано?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #5 : 21-06-2019, 13:04:37 »
Хм. Я потестировал вот такой код:

Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- RivilisPointMonitor.h : Declaration of the RivilisPointMonitor
  3. //-----------------------------------------------------------------------------
  4. #pragma once
  5.  
  6. #ifdef CHECKPOINTMONITOR_MODULE
  7. #define DLLIMPEXP __declspec(dllexport)
  8. #else
  9. #define DLLIMPEXP
  10. #endif
  11.  
  12. //-----------------------------------------------------------------------------
  13. #include "acedinpt.h"
  14.  
  15. //-----------------------------------------------------------------------------
  16. //----- Note: Uncomment the DLLIMPEXP symbol below if you wish exporting
  17. //----- your class to other ARX/DBX modules
  18. class /*DLLIMPEXP*/ RivilisPointMonitor : public AcEdInputPointMonitor {
  19.  
  20. public:
  21.   ACRX_DECLARE_MEMBERS(RivilisPointMonitor);
  22.  
  23. protected:
  24.   //----- Pointer to the document this reactor instance belongs to.
  25.   AcApDocument *mpDocument;
  26.  
  27. public:
  28.   RivilisPointMonitor(AcApDocument *pDoc = NULL);
  29.   virtual ~RivilisPointMonitor();
  30.  
  31.   virtual void Attach(AcApDocument *pDoc);
  32.   virtual void Detach();
  33.   virtual AcApDocument *Subject() const;
  34.   virtual bool IsAttached() const;
  35.  
  36.   virtual bool excludeFromOsnapCalculation(
  37.     const AcArray<AcDbObjectId> &nestedEntity,
  38.     Adesk::GsMarker gsSelectionMark
  39.   );
  40.  
  41.   virtual Acad::ErrorStatus monitorInputPoint(
  42.     bool &appendToTooltipStr,
  43.     ACHAR *&additionalTooltipString,
  44.     AcGiViewportDraw *drawContext,
  45.     AcApDocument *document,
  46.     bool pointComputed,
  47.     int history,
  48.     const AcGePoint3d &lastPoint,
  49.     const AcGePoint3d &rawPoint,
  50.     const AcGePoint3d &grippedPoint,
  51.     const AcGePoint3d &cartesianSnappedPoint,
  52.     const AcGePoint3d &osnappedPoint,
  53.     AcDb::OsnapMask osnapMask,
  54.     const AcArray<AcDbCustomOsnapMode *> &customOsnapModes,
  55.     AcDb::OsnapMask osnapOverrides,
  56.     const AcArray<AcDbCustomOsnapMode *> &customOsnapOverrides,
  57.     const AcArray<AcDbObjectId> &apertureEntities,
  58.     const AcArray<AcDbObjectIdArray, AcArrayObjectCopyReallocator<AcDbObjectIdArray> > &nestedApertureEntities,
  59.     const AcArray<Adesk::GsMarker> &gsSelectionMark,
  60.     const AcArray<AcDbObjectId> &keyPointEntities,
  61.     const AcArray<AcDbObjectIdArray, AcArrayObjectCopyReallocator<AcDbObjectIdArray> > &nestedKeyPointEntities,
  62.     const AcArray<Adesk::GsMarker> &keyPointGsSelectionMark,
  63.     const AcArray<AcGeCurve3d *> &alignmentPaths,
  64.     const AcGePoint3d &computedPoint,
  65.     const ACHAR *tooltipString
  66.   );
  67.  
  68. };
  69.  
  70. #ifdef CHECKPOINTMONITOR_MODULE
  71. ACDB_REGISTER_OBJECT_ENTRY_AUTO(RivilisPointMonitor)
  72. #endif
  73.  

Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- RivilisPointMonitor.cpp : Implementation of RivilisPointMonitor
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include <dbobjptr2.h>
  6. #include "RivilisPointMonitor.h"
  7.  
  8. //-----------------------------------------------------------------------------
  9. ACRX_CONS_DEFINE_MEMBERS(RivilisPointMonitor, AcEdInputPointMonitor, 1)
  10.  
  11. //-----------------------------------------------------------------------------
  12. RivilisPointMonitor::RivilisPointMonitor(AcApDocument *pDoc) : AcEdInputPointMonitor(), mpDocument(pDoc) {
  13.   if (pDoc)
  14.   {
  15.     pDoc->inputPointManager()->addPointMonitor(this);
  16.     pDoc->inputPointManager()->turnOnForcedPick();
  17.   }
  18. }
  19.  
  20. //-----------------------------------------------------------------------------
  21. RivilisPointMonitor::~RivilisPointMonitor() {
  22.   Detach();
  23. }
  24.  
  25. //-----------------------------------------------------------------------------
  26. void RivilisPointMonitor::Attach(AcApDocument *pDoc) {
  27.   Detach();
  28.   if (mpDocument == NULL)
  29.   {
  30.     if ((mpDocument = pDoc) != NULL)
  31.     {
  32.       pDoc->inputPointManager()->addPointMonitor(this);
  33.       pDoc->inputPointManager()->turnOnForcedPick();
  34.     }
  35.   }
  36. }
  37.  
  38. void RivilisPointMonitor::Detach() {
  39.   if (mpDocument)
  40.   {
  41.     mpDocument->inputPointManager()->turnOffForcedPick();
  42.     mpDocument->inputPointManager()->removePointMonitor(this);
  43.     mpDocument = NULL;
  44.   }
  45. }
  46.  
  47. AcApDocument *RivilisPointMonitor::Subject() const {
  48.   return (mpDocument);
  49. }
  50.  
  51. bool RivilisPointMonitor::IsAttached() const {
  52.   return (mpDocument != NULL);
  53. }
  54.  
  55. //-----------------------------------------------------------------------------
  56. bool RivilisPointMonitor::excludeFromOsnapCalculation(
  57.   const AcArray<AcDbObjectId> &nestedEntity,
  58.   Adesk::GsMarker gsSelectionMark
  59. ) {
  60.   return (AcEdInputPointMonitor::excludeFromOsnapCalculation(nestedEntity, gsSelectionMark));
  61. }
  62.  
  63. //-----------------------------------------------------------------------------
  64. Acad::ErrorStatus RivilisPointMonitor::monitorInputPoint(
  65.   bool &appendToTooltipStr,
  66.   ACHAR *&additionalTooltipString,
  67.   AcGiViewportDraw *drawContext,
  68.   AcApDocument *document,
  69.   bool pointComputed,
  70.   int history,
  71.   const AcGePoint3d &lastPoint,
  72.   const AcGePoint3d &rawPoint,
  73.   const AcGePoint3d &grippedPoint,
  74.   const AcGePoint3d &cartesianSnappedPoint,
  75.   const AcGePoint3d &osnappedPoint,
  76.   AcDb::OsnapMask osnapMask,
  77.   const AcArray<AcDbCustomOsnapMode *> &customOsnapModes,
  78.   AcDb::OsnapMask osnapOverrides,
  79.   const AcArray<AcDbCustomOsnapMode *> &customOsnapOverrides,
  80.   const AcArray<AcDbObjectId> &apertureEntities,
  81.   const AcArray<AcDbObjectIdArray, AcArrayObjectCopyReallocator<AcDbObjectIdArray> > &nestedApertureEntities,
  82.   const AcArray<Adesk::GsMarker> &gsSelectionMark,
  83.   const AcArray<AcDbObjectId> &keyPointEntities,
  84.   const AcArray<AcDbObjectIdArray, AcArrayObjectCopyReallocator<AcDbObjectIdArray> > &nestedKeyPointEntities,
  85.   const AcArray<Adesk::GsMarker> &keyPointGsSelectionMark,
  86.   const AcArray<AcGeCurve3d *> &alignmentPaths,
  87.   const AcGePoint3d &computedPoint,
  88.   const ACHAR *tooltipString
  89. ) {
  90.   appendToTooltipStr = false;
  91.  
  92.   if (pointComputed)
  93.   {
  94.     if (apertureEntities.length() > 0)
  95.     {
  96.       AcDbSmartObjectPointer<AcDbEntity> pEnt(apertureEntities.first(), AcDb::kForRead);
  97.       if (pEnt.openStatus() == Acad::eOk)
  98.       {
  99.         TCHAR mtooltipStr[1024]; _tcsncpy(mtooltipStr, _T("\0"), 1024);
  100.         _tcscpy(mtooltipStr, _T("Iam ]]><Bold>BOLD</Bold><LineBreak/><![CDATA[Iam ]]><Italic>Italic</Italic><LineBreak/><![CDATA[Iam Normal"));
  101.         appendToTooltipStr = true;
  102.         additionalTooltipString = _tcsdup(mtooltipStr);
  103.       }
  104.     }
  105.   }
  106.  
  107.   return (Acad::eOk);
  108. }
  109.  

Тестировал в течении двух минут и один раз за это время получил неформатированную строку. С чем это связано - ума не приложу.




Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #6 : 21-06-2019, 13:27:29 »
Создал case и отправил в Autodesk.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: неприятный глючок в monitorInputPoint
« Ответ #7 : 21-06-2019, 14:17:43 »
Ты проверил как было сказано?
проверял - не работает :). если просто водить по экрану (без активации какой-либо команды), этот массив вот прям всегда-всегда пустой (и когда выводится нормальная подсказка и когда проскальзывает глюк).
еще пытался завязать это всё на наличие данных в tooltipString. тоже не помогло, т.к. tooltipString == NULL в любом случае.

Тестировал в течении двух минут и один раз за это время получил неформатированную строку. С чем это связано - ума не приложу.
вот и я о том же. по крайней мере виноват не мой комп :) - это уже хорошо.

Создал case и отправил в Autodesk.
:) а вдруг...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #8 : 21-06-2019, 14:40:48 »
Николай Горлов,
На всякий случай попробовал и второй вариант monitorInputPoint (так как то, что мы используем уже  ADESK_DEPRECATED):
Код - C++ [Выбрать]
  1. Acad::ErrorStatus RivilisPointMonitor::monitorInputPoint(const AcEdInputPoint& input, AcEdInputPointMonitorResult& output)
  2. {
  3.   if (input.pointComputed() && input.pickedEntities().length() > 0)
  4.   {
  5.     output.setAdditionalTooltipString(_T("Iam ]]><Bold>BOLD</Bold><LineBreak/><![CDATA[Iam ]]><Italic>Italic</Italic><LineBreak/><![CDATA[Iam Normal"));
  6.   }
  7.   return (Acad::eOk);
  8. }
Но результат не изменился. Строка периодически проскакивает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Николай Горлов 25-06-2019, 13:13:17

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #9 : 25-06-2019, 12:54:56 »
В ADN DevHelp баг подтвердили. Workaround'а нет. Создали Change Request на исправление. Так что если и сделают, то в новых версиях. В 2016 точно ничего не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: неприятный глючок в monitorInputPoint
« Ответ #10 : 25-06-2019, 13:13:11 »

ясненько, спасибо за помощь. только багу этому уже... ну как минимум его обсуждение шло, когда последней версией был 2012 автокад. будем надеяться в 2021 исправят :)
Workaround'а нет
увы, значит возвращаю всё в начальное положение. при использовании "\n" не так глючок в глаза бросается. свой компонент крутить как-то лениво :)

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

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

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: неприятный глючок в monitorInputPoint
« Ответ #12 : 25-06-2019, 13:45:51 »
Еще и на WPF
та не, зачем мне это приключение :)
можно проще. унаследоваться от CToolTipCtrl. вот только смысла не вижу. да и скорей всего начнется веселье с одновременным выводом моего и автокадовского окошка с текстами :). проще всего вернуться на стандарт 2005 года :):):) (пока не исправят в новых автокадах и пока мы не перестанем поддерживать старые версии)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: неприятный глючок в monitorInputPoint
« Ответ #13 : 25-06-2019, 13:47:41 »
да и скорей всего начнется веселье с одновременным выводом моего и автокадовского окошка с текстами :).
Конечно начнется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение