subGetOsnapPoints ???

Автор Тема: subGetOsnapPoints ???  (Прочитано 7738 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
subGetOsnapPoints ???
« : 29-03-2019, 22:08:31 »
Все привязки работают штатно, за исключением kOsModePerp
Создаю командой Acad'a "line". При запросе первой точки линия находит на CustomEntity перпендикулярную точку...
Как с этим бороться?

Код - C++ [Выбрать]
  1. Acad::ErrorStatus CustomEntity::subGetOsnapPoints (AcDb::OsnapMode osnapMode,   Adesk::GsMarker gsSelectionMark, const AcGePoint3d &pickPoint,
  2.         const   AcGePoint3d &lastPoint, const AcGeMatrix3d &viewXform,  AcGePoint3dArray &snapPoints, AcDbIntArray &geomIds,
  3.         const AcGeMatrix3d &insertionMat)
  4.  
  5.         assertReadEnabled();
  6.         AcGeLineSeg3d lnsg(m_startPt, m_endPt);
  7.  
  8.         switch (osnapMode) {
  9.         // ...
  10.         case AcDb::kOsModePerp:
  11.                 snapPoints.append(lnsg.closestPointTo(lastPoint));
  12.                 break;
  13.         // ...
  14.         }
  15.         return Acad::eOk;

Все координаты в одной плоскости

ObjectArx 2018, Autocad 2018eng, VS 2015.3, Win 8.1
« Последнее редактирование: 29-03-2019, 23:10:53 от Sergey_K »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #1 : 29-03-2019, 22:48:44 »
И что не так?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: subGetOsnapPoints ???
« Ответ #2 : 29-03-2019, 22:55:42 »
И что не так?

В то время, когда запрашивается первая точка, создаваемый объект не существует. Как следствие, перпендикуляра к пустоте существовать тоже не может...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #3 : 30-03-2019, 00:07:43 »
Анализируй в каком случае добавлять точку в массив.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: subGetOsnapPoints ???
« Ответ #4 : 30-03-2019, 00:36:34 »
Не вижу инструмента для анализа...
Чёрный ящик, под названием "autocad" в этом случае не даёт мне точек опоры
А такой точкой может быть состояние команды запрашивающей пересечение.
Аргументы subGetOsnapPoints такой возможности не дают

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #5 : 30-03-2019, 00:56:23 »
Не вижу инструмента для анализа...
Чёрный ящик, под названием "autocad" в этом случае не даёт мне точек опоры
А такой точкой может быть состояние команды запрашивающей пересечение
1. Запиши видео, как у меня записано в подписи, того что у тебя происходит при включенной привязке _Perp
2. Сравни со стандартным поведением:



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

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: subGetOsnapPoints ???
« Ответ #6 : 30-03-2019, 13:27:10 »
Сравни со стандартным поведением:
Каким стандартом описывается "стандартное" поведение ?
Пример прилагается.
Открываем Drawing1.dwg, загружаем DBX
Далее command: line
и не вводя точки наблюдаем за метанием привязки перпендикуляра

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #7 : 30-03-2019, 14:42:38 »
Посмотри такой вариант:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus Entity::subGetOsnapPoints(AcDb::OsnapMode osnapMode, Adesk::GsMarker gsSelectionMark,
  2.   const AcGePoint3d &pickPoint, const AcGePoint3d &lastPoint, const AcGeMatrix3d &viewXform,
  3.   AcGePoint3dArray &snapPoints, AcDbIntArray &geomIds, const AcGeMatrix3d &insertionMat) const {
  4.  
  5.   assertReadEnabled();
  6.   if (osnapMode != AcDb::kOsModePerp)
  7.     return Acad::eOk;
  8.   AcGeLine3d lnsg(m_startPt, m_endPt);
  9.   if (lastPoint != AcGePoint3d::kOrigin)
  10.   {
  11.     snapPoints.append(lnsg.closestPointTo(lastPoint));
  12.   }
  13.   return Acad::eOk;
  14. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: subGetOsnapPoints ???
« Ответ #8 : 30-03-2019, 15:14:57 »
Посмотрел. Ничего не изменилось, кроме того, что стали появляться перпендикуляры вообще вне геометрии


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #9 : 30-03-2019, 20:16:15 »
Посмотрел. Ничего не изменилось, кроме того, что стали появляться перпендикуляры вообще вне геометрии


Как-то оно работает неустойчиво. Отправил я этот вопрос в ADN DevHelp - может что-то они подскажут.
« Последнее редактирование: 31-03-2019, 02:05:21 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #10 : 17-04-2019, 16:12:49 »
Как-то оно работает неустойчиво. Отправил я этот вопрос в ADN DevHelp - может что-то они подскажут.
Их самих заинтересовало такое поведение и они пришли к выводу, что для примитива унаследованоо от AcDbEntity так оно и будет, а вот если примитив унаследован от AcDbLine, AcDbPolyline, AcDb2dPolyline, AcDbCircle, AcDbArc, т.е. у тех наследников AcDbCurve, у которых есть свойства normal и thickness всё работает штатно.
« Последнее редактирование: 17-04-2019, 20:53:39 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: subGetOsnapPoints ???
« Ответ #11 : 18-04-2019, 10:16:04 »
а вот если примитив унаследован от AcDbLine ...

Ключница ADN DevHelp делала.
Изменил наследование на AcDbLine. Результат тот же.
Причина не в этом.

Может у них гранаты не той системы?

Каким боком связана привязка перпендикуляра с normal и thickness?
С логикой у них совсем швах. Когда создаётся примитив и ещё не введена первая точка, привязка перпендикуляра, касательной и подобных ВООБЩЕ не должна работать.
Не может существовать перпендикуляра (как и касательной) к пустоте ))

Подобный баг замечен только при привязке нативных примитивов к custom. Привязка нативных между собой работает корректно

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #12 : 18-04-2019, 11:06:05 »
Изменил наследование на AcDbLine. Результат тот же.
Был предложен такой вариант кода:
Код - C++ [Выбрать]
  1. case AcDb::kOsModePerp:
  2.  
  3.        {
  4.  
  5.              AcGePoint3d  pt;
  6.  
  7.              AcGeLine3d   l_extend;
  8.  
  9.              AcGeVector3d viewDir;
  10.  
  11.  
  12.  
  13.              AcGePoint3d p0 = startPoint();
  14.  
  15.              AcGePoint3d p1 = endPoint();
  16.  
  17.              AcGeVector3d thick_norm = normal() * thickness();
  18.  
  19.              const bool thickness = !thick_norm.isZeroLength();
  20.  
  21.              if (p0.isEqualTo(p1)) {
  22.  
  23.                     snapPoints.append(p0);
  24.  
  25.                     if (thickness)
  26.  
  27.                            snapPoints.append(p0 + thick_norm);
  28.  
  29.              }
  30.  
  31.              else {
  32.  
  33.                     l_extend.set(p0, p1);
  34.  
  35.                     snapPoints.append(pt = l_extend.closestPointTo(lastPoint));
  36.  
  37.                     if (thickness)
  38.  
  39.                            snapPoints.append(pt + thick_norm);
  40.  
  41.              }
  42.  
  43.              break;
  44.  
  45.  
  46.  
  47.        }
Скажу сразу, что я его не тестировал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #13 : 18-04-2019, 11:09:37 »
Не может существовать перпендикуляра (как и касательной) к пустоте ))
В этом случае для нативных примитивов похоже работает ближайшая.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: subGetOsnapPoints ???
« Ответ #14 : 19-04-2019, 18:38:00 »
Был предложен такой вариант кода: ...

Проверил. Ничего эти заморочки не меняют. Те же перпендикуляры при запросе первой точки.

Нативные команды по созданию примитивов должны фильтровать привязки.
Менять нужно в консерватории )

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: subGetOsnapPoints ???
« Ответ #15 : 22-04-2019, 14:45:38 »
Даю без перевода. Думаю, что всё будет понятно. Это ответ после моей просьбы уточнить у команды разработчиков:

Цитировать
Dear Alexander Rivilis,

Thanks for your patience, the deferred perpendicular snaps are legacy snaps that created before ARX objectification, you can also this kind of special snap R12 entities.

For example, deferred perpendicular snap is not visible on Ellipsis but visible on Arc\Circle

The snap computation internally based on R12 types, hence you may not achieve on custom entity deriving from AcDbEntity.

Best Regards,
Madhukar Moogala

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