- UID
- 674793
- 积分
- 1875
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2013-4-1
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - //根据指定半径绘制和指定的两个圆弧相切的圆弧
- static void XLRXAPI_ArcTan(void)
- {
- ads_name e1,e2;
- AcGePoint3d p1,p2;
- AcDbObjectId Id1,Id2;
- AcDbEntity *pEnt1,*pEnt2;
- AcDbArc *pArc1,*pArc2;
- Loop1:
- if (RTNORM != acedEntSel(_T("\n选择第一条圆弧:"),e1,asDblArray(p1))) return;
- if (Acad::eOk != acdbGetObjectId(Id1,e1)) return;
- if (Acad::eOk != acdbOpenObject(pEnt1,Id1,AcDb::kForRead)) return;
- if (!pEnt1->isKindOf(AcDbArc::desc()))
- {
- acutPrintf(_T("\n选择的不是圆弧,请重新选择圆弧:"));
- pEnt1->close();
- goto Loop1;
- }
- pArc1 = AcDbArc::cast(pEnt1);
- Loop2:
- if (RTNORM != acedEntSel(_T("\n选择第一条圆弧:"),e2,asDblArray(p2)))
- {
- pEnt1->close();
- return;
- }
- if (Acad::eOk != acdbGetObjectId(Id2,e2)) {
- pEnt1->close();
- return;
- }
- if (Acad::eOk != acdbOpenObject(pEnt2,Id2,AcDb::kForRead)){
- pEnt1->close();
- return;
- }
- if (!pEnt2->isKindOf(AcDbArc::desc()))
- {
- acutPrintf(_T("\n选择的不是圆弧,请重新选择圆弧:"));
- pEnt2->close();
- goto Loop2;
- }
- pArc2 = AcDbArc::cast(pEnt2);
- double Rad;
- if (RTNORM != acedGetDist(asDblArray(p1),_T("\n半径:"),&Rad))
- {
- pEnt1->close();
- pEnt2->close();
- return;
- }
- //圆弧转几何对象
- AcGeCircArc3d *pGeCircArc3d1 = new AcGeCircArc3d(pArc1->center(),
- pArc1->normal(),
- pArc1->normal().perpVector(),
- pArc1->radius(),
- pArc1->startAngle(),
- pArc1->endAngle());
- AcGeCircArc3d *pGeCircArc3d2 = new AcGeCircArc3d(pArc2->center(),
- pArc2->normal(),
- pArc2->normal().perpVector(),
- pArc2->radius(),
- pArc2->startAngle(),
- pArc2->endAngle());
- Adesk::Boolean bSuccess;
- double param1,param2;
- pArc1->getClosestPointTo(p1,p1);
- param1 = pGeCircArc3d1->paramOf(p1);
- pArc2->getClosestPointTo(p2,p2);
- param2 = pGeCircArc3d2->paramOf(p2);
- AcGeCircArc3d *pGeNewCircArc3d = new AcGeCircArc3d;
- pGeNewCircArc3d->set(*pGeCircArc3d1,*pGeCircArc3d2,Rad,param1,param2,bSuccess);
- if (bSuccess)
- {
- AcGeCircArc2d *pGe2d = (AcGeCircArc2d *)pGeNewCircArc3d;
- double refA = pGeNewCircArc3d->refVec().angleTo(AcGeVector3d::kXAxis);
- //以下计算圆弧AcDbArc的代码算法有问题???
- if (pGe2d->isClockWise())
- {
- //顺时针
- acutPrintf(_T("\n顺时针..."));
- refA = pGeNewCircArc3d->refVec().negate().angleTo(AcGeVector3d::kXAxis);
- AcDbArc *pArc = new AcDbArc(pGeNewCircArc3d->center(),
- pGeNewCircArc3d->normal().negate(),
- pGeNewCircArc3d->radius(),
- pGeNewCircArc3d->startAng()+refA,
- pGeNewCircArc3d->endAng()+refA);
- //添加到数据库
- CCreateEnt::PostToSpace(pArc);
- }
- else
- {
- //逆时针
- acutPrintf(_T("\n逆时针..."));
- AcDbArc *pArc = new AcDbArc(pGeNewCircArc3d->center(),
- pGeNewCircArc3d->normal(),
- pGeNewCircArc3d->radius(),
- pGeNewCircArc3d->startAng()+refA,
- pGeNewCircArc3d->endAng()+refA);
- //添加到数据库
- CCreateEnt::PostToSpace(pArc);
- }
- }
- pEnt1->close();
- pEnt2->close();
- delete pGeNewCircArc3d;
- delete pGeCircArc3d1;
- delete pGeCircArc3d2;
- }
以上代码计算的圆弧起始角度和终点角度的算法不正确,望各位高手给解决下!
|
|