天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 221|回复: 2

ObjectArx圆角功能代码

  [复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-2-27 16:57:36 | 显示全部楼层 |阅读模式
  1. //直线变圆角
  2. bool PhdUtility::LineFillet(const AcDbObjectId& idLine1, const AcDbObjectId& idLine2, double dRadius, AcDbObjectId& idArc)
  3. {
  4. #pragma region 得到圆心
  5.         //得到角平分线向量
  6.         AcGeVector2d midVec;
  7.         PhdGeometry::GetMidVectorOfLines(idLine1, idLine2, midVec);
  8.         double dVecAngle = midVec.angle();
  9.         double dAngle = 0;
  10.         PhdGeometry::GetAngleOfLines(idLine1, idLine2, dAngle);
  11.         double dDist = dRadius / std::sin(dAngle/2);
  12.         AcGePoint3d ptInter;
  13.         PhdGeometry::GetIntersectPoint(idLine1, idLine2, ptInter);
  14.         AcGePoint3d ptCenter = PhdGeometry::PolarPoint(ptInter, dVecAngle, dDist);
  15. #pragma endregion
  16. #pragma region 得到垂足
  17.         AcGePoint3d ptNew1 = PhdGeometry::GetClossedPoint(idLine1, ptCenter);
  18.         AcGePoint3d ptNew2 = PhdGeometry::GetClossedPoint(idLine2, ptCenter);
  19. #pragma endregion
  20. #pragma region 设置直线点
  21.         AcDbObjectPointer<AcDbLine> pLine1(idLine1,AcDb::kForWrite);
  22.         if (Acad::eOk != pLine1.openStatus())
  23.                 return false;
  24.         AcDbObjectPointer<AcDbLine> pLine2(idLine2, AcDb::kForWrite);
  25.         if (Acad::eOk != pLine2.openStatus())
  26.                 return false;
  27.         if (ptInter.distanceTo(pLine1->startPoint()) < ptInter.distanceTo(pLine1->endPoint()))
  28.         {
  29.                 pLine1->setStartPoint(ptNew1);
  30.         }
  31.         else
  32.         {
  33.                 pLine1->setEndPoint(ptNew1);
  34.         }
  35.         if (ptInter.distanceTo(pLine2->startPoint()) < ptInter.distanceTo(pLine2->endPoint()))
  36.         {
  37.                 pLine2->setStartPoint(ptNew2);
  38.         }
  39.         else
  40.         {
  41.                 pLine2->setEndPoint(ptNew2);
  42.         }
  43. #pragma endregion
  44. #pragma region 绘制圆弧
  45.         AcDbArc* pArc = NULL;
  46.         PhdEntity::CreateArc3(ptCenter, ptNew1, ptNew2,pArc);
  47.         ArxDbgUtils::addToCurrentSpaceAndClose(pArc);
  48.         idArc = pArc->objectId();
  49. #pragma endregion
  50.         return true;
  51. }
复制代码

 

 

 

 

ObjectArx圆角功能代码

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-2-27 16:58:13 | 显示全部楼层
  1. // Summary:         得到两条直线的角平分线向量
  2. bool PhdGeometry::GetMidVectorOfLines(const AcDbObjectId& idLine1, const AcDbObjectId& idLine2, AcGeVector2d& midVector)
  3. {
  4.         AcDbObjectPointer<AcDbLine> pLine1(idLine1,AcDb::kForRead);
  5.         if (Acad::eOk != pLine1.openStatus())
  6.                 return false;
  7.         AcDbObjectPointer<AcDbLine> pLine2(idLine2, AcDb::kForRead);
  8.         if (Acad::eOk != pLine2.openStatus())
  9.                 return false;
  10.         AcGePoint3d ptInter;
  11.         PhdGeometry::GetIntersectPoint(pLine1, pLine2, ptInter);
  12.         AcGePoint3d ptEnd1, ptEnd2;
  13.         if (!ptInter.isEqualTo(pLine1->startPoint()))
  14.         {
  15.                 ptEnd1 = pLine1->startPoint();
  16.         }
  17.         else
  18.         {
  19.                 ptEnd1 = pLine1->endPoint();
  20.         }
  21.         if (!ptInter.isEqualTo(pLine2->startPoint()))
  22.         {
  23.                 ptEnd2 = pLine2->startPoint();
  24.         }
  25.         else
  26.         {
  27.                 ptEnd2 = pLine2->endPoint();
  28.         }
  29.         AcGeVector2d vec1 = ptEnd1.convert2d(AcGePlane::kXYPlane) - ptInter.convert2d(AcGePlane::kXYPlane);
  30.         AcGeVector2d vec2 = ptEnd2.convert2d(AcGePlane::kXYPlane) - ptInter.convert2d(AcGePlane::kXYPlane);
  31.         midVector = vec1.normal() + vec2.normal();
  32.         return true;
  33. }
  34. // Summary:         得到两条直线的夹角
  35. bool PhdGeometry::GetAngleOfLines(const AcDbObjectId& idLine1, const AcDbObjectId& idLine2, double& dAngle)
  36. {
  37.         AcDbObjectPointer<AcDbLine> pLine1(idLine1,AcDb::kForRead);
  38.         if (Acad::eOk != pLine1.openStatus())
  39.                 return false;
  40.         AcDbObjectPointer<AcDbLine> pLine2(idLine2, AcDb::kForRead);
  41.         if (Acad::eOk != pLine2.openStatus())
  42.                 return false;
  43.         AcGePoint3d ptInter;
  44.         PhdGeometry::GetIntersectPoint(pLine1, pLine2, ptInter);
  45.         AcGePoint3d ptEnd1, ptEnd2;
  46.         if (!ptInter.isEqualTo(pLine1->startPoint()))
  47.         {
  48.                 ptEnd1 = pLine1->startPoint();
  49.         }
  50.         else
  51.         {
  52.                 ptEnd1 = pLine1->endPoint();
  53.         }
  54.         if (!ptInter.isEqualTo(pLine2->startPoint()))
  55.         {
  56.                 ptEnd2 = pLine2->startPoint();
  57.         }
  58.         else
  59.         {
  60.                 ptEnd2 = pLine2->endPoint();
  61.         }
  62.         AcGeVector2d vec1 = ptEnd1.convert2d(AcGePlane::kXYPlane) - ptInter.convert2d(AcGePlane::kXYPlane);
  63.         AcGeVector2d vec2 = ptEnd2.convert2d(AcGePlane::kXYPlane) - ptInter.convert2d(AcGePlane::kXYPlane);
  64.         dAngle = vec1.angleTo(vec2);
  65.         return true;
  66. }
  67. // Summary:         得到交点坐标
  68. bool PhdGeometry::GetIntersectPoint(const AcDbObjectId& idLine1, const AcDbObjectId& idLine2, AcGePoint3d& ptIntersect)
  69. {
  70.         AcDbObjectPointer<AcDbLine> pLine1(idLine1,AcDb::kForRead);
  71.         if (Acad::eOk != pLine1.openStatus())
  72.                 return false;
  73.         AcDbObjectPointer<AcDbLine> pLine2(idLine2, AcDb::kForRead);
  74.         if (Acad::eOk != pLine2.openStatus())
  75.                 return false;
  76.         AcGeLine2d geLine1(pLine1->startPoint().convert2d(AcGePlane::kXYPlane), pLine1->endPoint().convert2d(AcGePlane::kXYPlane));
  77.         AcGeLine2d geLine2(pLine2->startPoint().convert2d(AcGePlane::kXYPlane), pLine2->endPoint().convert2d(AcGePlane::kXYPlane));
  78.         AcGePoint2d pt2d;
  79.         bool bRet = geLine1.intersectWith(geLine2, pt2d);
  80.         if (!bRet)
  81.                 return false;
  82.         ptIntersect = AcGePoint3d(pt2d.x, pt2d.y, 0);
  83.         return true;
  84. }
  85. // Summary:         极坐标求点
  86. AcGePoint3d PhdGeometry::PolarPoint(const AcGePoint3d& pt, double angle, double distance)
  87. {
  88.         ads采用point ptForm, ptTo;
  89.         ptForm[X] = pt.x;
  90.         ptForm[Y] = pt.y;
  91.         ptForm[Z] = pt.z;
  92.         acutPolar(ptForm, angle, distance, ptTo);
  93.         return asPnt3d(ptTo);
  94. }
  95. // Summary:         得到直线上距离该点最近的点
  96. AcGePoint3d PhdGeometry::GetClossedPoint(const AcDbObjectId& idCurve, const AcGePoint3d& pt)
  97. {
  98.         AcDbObjectPointer<AcDbCurve> pCurve(idCurve,AcDb::kForRead);
  99.         if (Acad::eOk != pCurve.openStatus())
  100.                 return AcGePoint3d::kOrigin;
  101.         AcGePoint3d ptOnCurve;
  102.         pCurve->getClosestPointTo(pt, ptOnCurve);
  103.         return ptOnCurve;
  104. }
  105. // Summary:         圆心和起始点和终止点绘制圆弧(不知道谁是起始点和终止点)
  106. bool PhdEntity::CreateArc3(const AcGePoint3d& ptCenter, const AcGePoint3d& pt1, const AcGePoint3d& pt2, AcDbArc*& pArc)
  107. {
  108.         // 计算半径;
  109.         double radius = ptCenter.distanceTo(pt1);
  110.         // 计算起始和终止角度;
  111.         AcGeVector2d vecStart(pt1.x - ptCenter.x, pt1.y - ptCenter.y);
  112.         AcGeVector2d vecEnd(pt2.x - ptCenter.x, pt2.y - ptCenter.y);
  113.         double startAngle = vecStart.angle();
  114.         double endAngle = vecEnd.angle();
  115.         double dBulge = PhdGeometry::GetArcBulge(startAngle, endAngle);
  116.         if (0 > dBulge)
  117.         {
  118.                 vecStart = AcGeVector2d(pt2.x - ptCenter.x, pt2.y - ptCenter.y);
  119.                 vecEnd = AcGeVector2d(pt1.x - ptCenter.x, pt1.y - ptCenter.y);
  120.                 startAngle = vecStart.angle();
  121.                 endAngle = vecEnd.angle();
  122.                 dBulge = PhdGeometry::GetArcBulge(startAngle, endAngle);
  123.                 if (0 > dBulge)
  124.                         return false;
  125.         }
  126.         pArc = new AcDbArc(ptCenter, radius, startAngle, endAngle);
  127.         return true;
  128. }
复制代码

 

 

 

 

ObjectArx圆角功能代码
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-2-28 17:51:45 | 显示全部楼层
    123

     

     

     

     

    ObjectArx圆角功能代码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 07:56 , Processed in 0.163454 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表