subGetOsnapPoints ???

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

  • Administrator
  • *****
  • Сообщений: 9842
  • Карма: 1257
  • Рыцарь 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
  • Сообщений: 44
  • Карма: 1
Re: subGetOsnapPoints ???
« Ответ #8 : 30-03-2019, 15:14:57 »
Посмотрел. Ничего не изменилось, кроме того, что стали появляться перпендикуляры вообще вне геометрии


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

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


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

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

  • Administrator
  • *****
  • Сообщений: 9842
  • Карма: 1257
  • Рыцарь 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
  • Сообщений: 44
  • Карма: 1
Re: subGetOsnapPoints ???
« Ответ #11 : 18-04-2019, 10:16:04 »
а вот если примитив унаследован от AcDbLine ...

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

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

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

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

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

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

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

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

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

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