admin 发表于 2024-3-14 20:41:58

[每日一码] AcDbRegion::transformBy在2014和2015结果不同的解决方案


/*Resetting sytsem wide tolerance for ACAD 2015*/

AcGeContext::gTol.setEqualPoint(1.0e-8);

AcGeContext::gTol.setEqualVector(1.0e-6);




static void transformTest()
{
      /*Resetting sytsem wide tolerance for 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("point tolerance is %e, and vector tolerance is %e\n"), epTol, evTol);
      acedPrompt(msg);

      // Second, create a transform matrix that maps from one coordinate syste to another

      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);

      // Is the new coordinate system orthogonal?

      if (!xform.isUniScaledOrtho())
                acedPrompt(采用T("Transform matrix axes are not orthogonal\n"));
      else
                acedPrompt(采用T("Transform matrix axes are orthogonal\n"));


      // Finally, transform a region to the new coordinate system.
      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("The transform operation returned %d\n"), es);
                              acedPrompt(msg);
                        }
                }

                delete pTestCircle;
      }
}
页: [1]
查看完整版本: [每日一码] AcDbRegion::transformBy在2014和2015结果不同的解决方案