20/08/2014
Метод AcDbRegion::transformBy
Вопрос: У меня есть ситуации, в которых использование метода AcDbRegion::transformBy дает различные результаты в AutoCAD 2015 и в AutoCAD 2014 Можете ли Вы объяснить, что изменилось в этом методе, что приводит к различным результатам?Ответ: Этот сценарий работал в AutoCAD 2014, потому что мы использовали больший допуск (equalPoint равный 1.0E-8 и equalVector равный 1.0E-6). В AutoCAD 2015 установка допуска не делается, так что это повлияло на некоторые сценарии выполнения ряда методов. Ниже указано как можно обойти эту ситуацию. Спасибо партнеру ADN, который показал нам такой вариант поведения.
Для восстановления стандартного поведения метода AcDbRegion::transformBy достаточно установить значения допуска в значения по умолчанию:
Код - C++: [Выделить]
- /* Сброс значения допуска для ACAD 2015*/
- AcGeContext::gTol.setEqualPoint(1.0e-8);
- AcGeContext::gTol.setEqualVector(1.0e-6);
Таким образом пример кода:
Код - C++: [Выделить]
- static void transformTest()
- {
- /* Сброс значения допуска для ACAD 2015*/
- AcGeContext::gTol.setEqualPoint(1.0e-8);
- AcGeContext::gTol.setEqualVector(1.0e-6);
- double epTol = AcGeContext::gTol.equalPoint();
- double evTol = AcGeContext::gTol.equalVector();
- CString msg;
- msg.Format(_T("допуск для точки: %e, допуск для вектора: %e\n"), epTol, evTol);
- acedPrompt(msg);
- // Создаём матрицу преобразования из одной системы координат в другую
- AcGePoint3d startPoint;
- AcGeVector3d mStockProfileXDir, mExtrudeDir, mNormalDir;
- startPoint.set(12342.705102605765, -14874.057509290647, 25.766600469474248);
- mStockProfileXDir.set(0.00000000000000000, 1.0000000000000000, 0.00000000000000000);
- mNormalDir.set(-0.048960818631765893, -6.4357153980460105e-012, 0.99880069995915965);
- mExtrudeDir.set(-0.99880069995915977, 0.00000000000000000, -0.048960818631764047);
- AcGeMatrix3d xform;
- xform.setToAlignCoordSys(AcGePoint3d(0, 0, 0),
- AcGeVector3d::kXAxis,
- AcGeVector3d::kYAxis,
- AcGeVector3d::kZAxis,
- startPoint,
- mStockProfileXDir,
- mNormalDir,
- mExtrudeDir);
- // Проверяем ортогональна ли новая система координат
- if (!xform.isUniScaledOrtho())
- acedPrompt(_T("Матрица преобразования не ортогональна\n"));
- else
- acedPrompt(_T("Матрица преобразования ортогональна\n"));
- // В конечном итоге выполним трансформацию области в новую систему координат.
- AcDbVoidPtrArray curves, regions;
- AcDbCircle *pTestCircle = new AcDbCircle(AcGePoint3d::kOrigin, AcGeVector3d::kZAxis, 10.0);
- if (pTestCircle != NULL)
- {
- curves.append(pTestCircle);
- AcDbRegion::createFromCurves(curves, regions);
- if (regions.length() != 0)
- {
- for (int i = 0; i < regions.length(); i++)
- {
- AcDbRegion* testRegion = static_cast<AcDbRegion*>(regions[i]);
- Acad::ErrorStatus es = testRegion->transformBy(xform);
- delete testRegion;
- msg.Format(_T("Операция трансформации завершилась с кодом %d\n"), es);
- acedPrompt(msg);
- }
- }
- delete pTestCircle;
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2014/08/acdbregiontransformby-.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=925
Опубликовано 20.08.2014Отредактировано 20.08.2014 в 20:28:36