- UID
- 1
- 积分
- 16111
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
发表于 2002-6-11 06:41:55
|
显示全部楼层
给你一个求“老”的多义线AcDb2dPolyline对象长度的代码
- [FONT=courier new]
- Acad::ErrorStatus acdcGetAcDb2dPolylineLength(double& length,AcDb2dPolyline*
- p2dPoly){
- if (p2dPoly==NULL)
- return Acad::eNullObjectPointer;
- length =0;
- Acad::ErrorStatus es;
- AcDbObjectIterator* pI;
- if ((pI=p2dPoly->vertexIterator())==NULL)
- return Acad::eOutOfMemory;
- AcDb2dVertex* pV1,*pV2;
- AcGePoint3d v1,v2;
- Adesk::Boolean bDone = Adesk::kFalse;
- AcDb::Vertex2dType type;
- if ((es=p2dPoly->openVertex(pV1,pI->objectId(),AcDb::kForRead))==Acad::eOk){
- while (Adesk::kTrue){
- if (!bDone)
- pI->step();
- if
- ((es=p2dPoly->openVertex(pV2,pI->objectId(),AcDb::kForRead))==Acad::eOk){
- switch (type = pV1->vertexType()){
- case AcDb::k2dVertex:
- case AcDb::k2dSplineFitVertex:
- case AcDb::k2dCurveFitVertex:
- {
- while (pV2->vertexType()==AcDb::k2dSplineCtlVertex){
- pV2->close();
- pI->step();
- if
- ((es=p2dPoly->openVertex(pV2,pI->objectId(),AcDb::kForRead))!=Acad::eOk)
- break;
- }
- if (es!=Acad::eOk)
- break;
- v1 = pV1->position();
- v2 = pV2->position();
- double A = 4*atan(pV1->bulge()); //angle
- double D = (v2-v1).length();
- if (fabs(A)<AcGeContext::gTol.equalPoint()){
- length+=D;
- } else {
- double R= fabs(D/(2*sin(A/2)));//radius
- length+= R*fabs(A);//length
- }
- pV1->close();
- pV1=pV2;
- break;
- }
- case AcDb::k2dSplineCtlVertex:
- pV1->close();
- pV1=pV2;
- break;
- default:
- assert(0);//should never happen
- }
- if (bDone)
- break;
- } else {
- if (p2dPoly->isClosed())
- pI->start();
- else
- break;
- bDone = Adesk::kTrue;
- }
- }
- pV1->close();
- }
- delete pI;
- return Acad::eOk;
- }
- [/FONT]
复制代码 |
|