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

ADN Club => ObjectARX => Тема начата: Sergey_K от 29-03-2019, 22:08:31

Название: subGetOsnapPoints ???
Отправлено: Sergey_K от 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
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 29-03-2019, 22:48:44
И что не так?
Название: Re: subGetOsnapPoints ???
Отправлено: Sergey_K от 29-03-2019, 22:55:42
И что не так?

В то время, когда запрашивается первая точка, создаваемый объект не существует. Как следствие, перпендикуляра к пустоте существовать тоже не может...
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 30-03-2019, 00:07:43
Анализируй в каком случае добавлять точку в массив.
Название: Re: subGetOsnapPoints ???
Отправлено: Sergey_K от 30-03-2019, 00:36:34
Не вижу инструмента для анализа...
Чёрный ящик, под названием "autocad" в этом случае не даёт мне точек опоры
А такой точкой может быть состояние команды запрашивающей пересечение.
Аргументы subGetOsnapPoints такой возможности не дают
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 30-03-2019, 00:56:23
Не вижу инструмента для анализа...
Чёрный ящик, под названием "autocad" в этом случае не даёт мне точек опоры
А такой точкой может быть состояние команды запрашивающей пересечение
1. Запиши видео, как у меня записано в подписи, того что у тебя происходит при включенной привязке _Perp
2. Сравни со стандартным поведением:



3. Если у тебя поведение не совпадает, то подготовь тестовый проект и вставь его на форум - я посмотрю.
Название: Re: subGetOsnapPoints ???
Отправлено: Sergey_K от 30-03-2019, 13:27:10
Сравни со стандартным поведением:
Каким стандартом описывается "стандартное" поведение ?
Пример прилагается.
Открываем Drawing1.dwg, загружаем DBX
Далее command: line
и не вводя точки наблюдаем за метанием привязки перпендикуляра
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 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. }
Название: Re: subGetOsnapPoints ???
Отправлено: Sergey_K от 30-03-2019, 15:14:57
Посмотрел. Ничего не изменилось, кроме того, что стали появляться перпендикуляры вообще вне геометрии
(https://i.postimg.cc/gnvCNvSm/Screen01.jpg) (https://postimg.cc/gnvCNvSm)
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 30-03-2019, 20:16:15
Посмотрел. Ничего не изменилось, кроме того, что стали появляться перпендикуляры вообще вне геометрии
(https://i.postimg.cc/gnvCNvSm/Screen01.jpg) (https://postimg.cc/gnvCNvSm)

Как-то оно работает неустойчиво. Отправил я этот вопрос в ADN DevHelp - может что-то они подскажут.
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 17-04-2019, 16:12:49
Как-то оно работает неустойчиво. Отправил я этот вопрос в ADN DevHelp - может что-то они подскажут.
Их самих заинтересовало такое поведение и они пришли к выводу, что для примитива унаследованоо от AcDbEntity так оно и будет, а вот если примитив унаследован от AcDbLine, AcDbPolyline, AcDb2dPolyline, AcDbCircle, AcDbArc, т.е. у тех наследников AcDbCurve, у которых есть свойства normal и thickness всё работает штатно.
Название: Re: subGetOsnapPoints ???
Отправлено: Sergey_K от 18-04-2019, 10:16:04
а вот если примитив унаследован от AcDbLine ...

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

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

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

Подобный баг замечен только при привязке нативных примитивов к custom. Привязка нативных между собой работает корректно
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 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.        }
Скажу сразу, что я его не тестировал.
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 18-04-2019, 11:09:37
Не может существовать перпендикуляра (как и касательной) к пустоте ))
В этом случае для нативных примитивов похоже работает ближайшая.
Название: Re: subGetOsnapPoints ???
Отправлено: Sergey_K от 19-04-2019, 18:38:00
Был предложен такой вариант кода: ...

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

Нативные команды по созданию примитивов должны фильтровать привязки.
Менять нужно в консерватории )
Название: Re: subGetOsnapPoints ???
Отправлено: Александр Ривилис от 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 не поможет.