Acad::ErrorStatus PDSphere::subExplode(AcDbVoidPtrArray& entitySet) const #else Acad::ErrorStatus PDSphere::explode(AcDbVoidPtrArray& entitySet) const #endif { assertReadEnabled(); AcDb3dSolid *pBody; pBody = new AcDb3dSolid; if(pBody->createSphere(m_dRadius) != Acad::eOk) { delete pBody; return Acad::eNotApplicable; } AcGeMatrix3d mat; mat.setTranslation(m_ptCenter.asVector()); pBody->transformBy(mat); pBody->setPropertiesFrom(this); entitySet.append(pBody); return Acad::eOk; }
// [9/5/2007 suzhiyong] Acad::ErrorStatus PDSphere::explodeTo3DSolid(AcDb3dSolid* &p3dSolid) const { assertReadEnabled(); AcDb3dSolid *pBody; pBody = new AcDb3dSolid; if(pBody->createSphere(m_dRadius) != Acad::eOk) { delete pBody; return Acad::eNotApplicable; } AcGeMatrix3d mat; mat.setTranslation(m_ptCenter.asVector()); pBody->transformBy(mat); pBody->setPropertiesFrom(this); p3dSolid = pBody; return Acad::eOk; }
// [9/5/2007 suzhiyong] Acad::ErrorStatus PDEcone::explodeTo3DSolid(AcDb3dSolid* &p3dSolid) const { assertReadEnabled(); #ifdef _OBJECTARX2004_ Acad::ErrorStatus es = Acad::eOk; int i = 0; AcGeVector3d faceVect = getFaceVect(); AcDbCurve *pCurve = NULL; AcDbVoidPtrArray curveSegments; double pathLen = m_ptStart.distanceTo(m_ptEnd); AcGePoint3d sp, ep; double d1, d2; if(m_dDiameter1 >= m_dDiameter2) { sp = m_ptStart; ep = m_ptEnd; d1 = m_dDiameter1; d2 = m_dDiameter2; } else { sp = m_ptEnd; ep = m_ptStart; d1 = m_dDiameter2; d2 = m_dDiameter1; } //extrudeAlongPath函数在由较大region拉成较小region时容易产生自交问题,所以 //炸开时选择由小的region拉成大的region AcDbLine *pLine = new AcDbLine(ep, sp); pLine->setPropertiesFrom(this); pCurve = pLine; if(pCurve != NULL) { if((es = addToDb(pCurve)) == Acad::eOk) { AcDbObjectId id; id = pCurve->objectId(); pCurve->close(); if((es = acdbOpenObject((AcDbCurve*&)pCurve, id, AcDb::kForRead)) != Acad::eOk) return Acad::eNotApplicable; } else { if(pCurve != NULL) delete pCurve; return Acad::eNotApplicable; } } AcDbCircle sCir(ep, faceVect, d2 / 2.0); curveSegments.append(&sCir); AcDbVoidPtrArray regions; es = AcDbRegion::createFromCurves(curveSegments, regions); if(es == Acad::eOk && !regions.isEmpty()) { AcDb3dSolid *pBody; pBody = new AcDb3dSolid; ////求taper Angle //AcGeVector3d vec1 = (m_ptStart-m_ptEnd);//.normal(); ////m_dDiameter1和m_dDiameter2的大小问题 //AcGeVector3d perpVec = faceVect.perpVector()*((m_dDiameter1/2-m_dDiameter2/2)); //AcGePoint3d point2(m_ptStart.x+perpVec.x, m_ptStart.y+perpVec.y, m_ptStart.z+perpVec.z); //AcGeVector3d vec2 = (point2 - m_ptEnd);//.normal(); ////taperAngle为负时表示放大region,反之为缩小 //double angle = -1*vec1.angleTo(vec2); ////angle没有到达最大值时仍然有问题,建议不使用extrudeAlongPath函数 //taperAngle是指两个圆心连线垂直于圆面时的角度,大于0时表示缩小,小于0时表示放大 es = pBody->extrudeAlongPath((AcDbRegion*)(regions[0]), pCurve,//angle); -1*atan((d1 / 2.0 - d2 / 2.0) / pathLen)); if(es != Acad::eOk) { if(pCurve != NULL) { pCurve->upgradeOpen(); pCurve->erase(); pCurve->close(); } delete pBody; for(i = 0; i < regions.length(); i++) delete (AcRxObject*)regions[i]; return Acad::eNotApplicable; } pBody->setPropertiesFrom(this); p3dSolid = pBody; } else { if(pCurve != NULL) { pCurve->upgradeOpen(); pCurve->erase(); pCurve->close(); } for(i = 0; i < regions.length(); i++) delete (AcRxObject*)regions[i]; return Acad::eNotApplicable; } if(pCurve != NULL) { pCurve->upgradeOpen(); pCurve->erase(); pCurve->close(); } for(i = 0; i < regions.length(); i++) delete (AcRxObject*)regions[i]; return Acad::eOk; #else return Acad::eNotApplicable; #endif }
static Acad::ErrorStatus thickenPoly(AsdkPoly* poly,AcDbEntity*& ent, AcGePoint2d& savedCenter,AcGePoint2d& savedStartPoint, int& savedNumSides,AcGeVector3d& savedNormal,char* savedName, double& savedElevation) { Acad::ErrorStatus es = Acad::eOk; int i; AcDbVoidPtrArray lines; AcDbVoidPtrArray regions; // Explode to a set of lines // if ((es = poly->explode(lines)) != Acad::eOk) { for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } // Create a region from the set of lines. // if ((es = AcDbRegion::createFromCurves(lines, regions)) != Acad::eOk) { for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } assert(regions.length() == 1); AcDbRegion* region = AcDbRegion::cast((AcRxObject*)regions[0]); assert(region != NULL); // Extrude the region to create a solid. // double height; if ((es = poly->getDistAtParam(6.28318530717958647692, height)) != Acad::eOk) { for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } height *= 0.25; AcDb3dSolid* solid = new AcDb3dSolid; assert(solid != NULL); if ((es = solid->extrude(region, height, 0.0)) != Acad::eOk) { delete solid; for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } // Save up the data to flatten the solid. // savedCenter = poly->center(); savedStartPoint = poly->startPoint(); savedNumSides = poly->numSides(); savedNormal = poly->normal(); savedElevation = poly->elevation(); // Copy the poly name // strcpy(savedName, poly->name()); // Now we have a solid. Change the entity to be this solid if ((es = solid->setPropertiesFrom(poly)) != Acad::eOk) { delete solid; for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } ent = poly; if ((es = ent->upgradeOpen()) != Acad::eOk) { delete solid; for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } es = replaceEntity(ent, solid); if ((es != Acad::eOk) && (es != Acad::eObjectToBeDeleted)) { ent->downgradeOpen(); delete solid; for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; } es = ent->downgradeOpen(); for (i = 0; i < lines.length(); i++) { delete (AcRxObject*)lines[i]; } for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } return es; }