//----- EXPLODE command Acad::ErrorStatus OarxEmployee::explode (AcDbVoidPtrArray &entitySet) const { //----- Make sure the object is open is read mode assertReadEnabled () ; AcDbCircle *pCircle =NULL ; AcDbText *pText =NULL ; try { //----- Create the circle pCircle =new AcDbCircle (center (), AcGeVector3d (0.0, 0.0, 1.0), 1.0) ; if ( pCircle == NULL ) throw Acad::eOutOfMemory ; //----- Create the text char buffer [255] ; sprintf (buffer, "%d\n%s %s", mID, mFirstName, mLastName) ; pText =new AcDbText (center (), buffer, AcDbObjectId::kNull, 0.5, 0.0) ; if ( pText == NULL ) throw Acad::eOutOfMemory ; //----- Add the 2 new entities in the array entitySet.append (pCircle) ; entitySet.append (pText) ; return (Acad::eOk) ; } catch (const Acad::ErrorStatus es) { if ( pCircle != NULL ) delete pCircle ; if ( pText != NULL ) delete pText ; return (es) ; } }
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; }
void ArxDbgUiTdcSysReactors::attachTransactionReactorToAll() { if (m_transReactor) { AcDbDatabase* tmpDb; AcDbVoidPtrArray dbPtrs; ArxDbgUtils::getAllDatabases(dbPtrs); AcDbTransactionManager* tmpTrMgr; AcDbVoidPtrArray trMgrs; // keep track of ones we've attached to since some db's share transMgr acutPrintf(_T("\nAttaching Transaction Reactor to all active databases...")); int len = dbPtrs.length(); for (int i=0; i<len; i++) { tmpDb = static_cast<AcDbDatabase*>(dbPtrs[i]); tmpTrMgr = tmpDb->transactionManager(); if (tmpTrMgr && (trMgrs.contains(tmpTrMgr) == false)) { tmpTrMgr->addReactor(m_transReactor); trMgrs.append(tmpTrMgr); } else { CString str; acutPrintf("\nSkipping duplicate transaction manager for: (%s)", ArxDbgUtils::dbToStr(tmpDb, str)); } } } }
void ArxDbgUiTdcCmds::buildCmdGroupMap() { AcEdCommandIterator* iter = acedRegCmds->iterator(); if (iter == NULL) { ASSERT(0); return; } // walk through the command stack and make a map of // command group to command. AcDbVoidPtrArray* tmpVoidPtrArray; for (; !iter->done(); iter->next()) { if (m_cmdMap.Lookup(iter->commandGroup(), (void*&)tmpVoidPtrArray)) { tmpVoidPtrArray->append(const_cast<AcEdCommand*>(iter->command())); } else { tmpVoidPtrArray = new AcDbVoidPtrArray; tmpVoidPtrArray->append(const_cast<AcEdCommand*>(iter->command())); m_cmdMap.SetAt(iter->commandGroup(), tmpVoidPtrArray); } } delete iter; }
Acad::ErrorStatus AsdkSmiley::explode(AcDbVoidPtrArray& entities) const { assertReadEnabled(); AcDbCircle *pCircle = new AcDbCircle( center(), mnormal, radius() ); entities.append( pCircle ); // Create eyes // AcGePoint3dArray eyearray; eyes( eyearray ); for( int i = 0; i < eyearray.length(); i++ ){ AcDbCircle *pCircle = new AcDbCircle( eyearray.at(i), mnormal, meyesize ); entities.append( pCircle ); } // Create smile arc // AcGePoint3d smilecen( mouthCenter() ), startpt( mouthLeft() ), endpt( mouthRight() ); AcGeVector3d normvec( 1, 0, 0 ), startvec = startpt - smilecen, endvec = endpt - smilecen; double startang = 2 * kPi - startvec.angleTo( normvec ), endang = 2 * kPi - endvec.angleTo( normvec ); AcDbArc *pArc = new AcDbArc( smilecen, mnormal, mouthRadius(), startang, endang ); entities.append( pArc ); // Create smile arc chord // AcDbLine *pLine = new AcDbLine( startpt, endpt ); entities.append( pLine ); return Acad::eOk; }
void ArxDbgUtils::getAllDocuments(AcDbVoidPtrArray& docPtrs) { AcApDocumentIterator* iter = acDocManager->newAcApDocumentIterator(); if (iter) { AcApDocument* tmpDoc; for (; !iter->done(); iter->step()) { tmpDoc = iter->document(); if (tmpDoc) { docPtrs.append(tmpDoc); } else { ASSERT(0); } } delete iter; } }
void BuildLineArray( const AcDbObjectIdArray& objIds, AcDbVoidPtrArray& lines ) { AcGePoint3dArray spts, epts; GetEdgeSEPts( objIds, spts, epts ); AcGeDoubleArray widths; GetEdgeWidths( objIds, widths ); // 获取一些属性数据,例如风速等 // 后续添加 // ... // 创建DoubleLine数组 int n = spts.length(); for( int i = 0; i < n; i++ ) { bool isWorkSurface = ArxUtilHelper::IsEqualType( _T( "WorkSurface" ), objIds[i] ); DoubleLine* pLine = new DoubleLine( spts[i], epts[i], widths[i], isWorkSurface ); lines.append( ( void* )pLine ); } }
Acad::ErrorStatus PDEcone::explodeToSurface(AcDbVoidPtrArray& entitySet) const { assertReadEnabled(); Acad::ErrorStatus es = Acad::eOk; int i; AcGePoint3dArray pArray; AcGeIntArray stdIdx; int actPrecision; getVertices(m_dDividPrecision, pArray, stdIdx, actPrecision); int actPrecision__1 = actPrecision + 1; int actPrecision___2__1 = actPrecision * 2 + 1; AcGeVector3d faceVect = getFaceVect(); AcDbVoidPtrArray curSeg, resRegion; AcDbCircle *pCir = NULL; AcGePoint3d ucs_org = acdbCurDwg()->ucsorg(); AcGeVector3d ucs_x = acdbCurDwg()->ucsxdir(); AcGeVector3d ucs_y = acdbCurDwg()->ucsydir(); AcGeVector3d ucs_z = ucs_x.crossProduct(ucs_y); AcGeMatrix3d ucs_mat; ucs_mat.setToWorldToPlane(-faceVect); //#ifdef _OBJECTARX14_ // acdbSetCurrentUCS(ucs_mat); //#else // acedSetCurrentUCS(ucs_mat); //#endif pCir = new AcDbCircle(m_ptStart, -faceVect, m_dDiameter1 / 2.0); curSeg.append(pCir); es = AcDbRegion::createFromCurves(curSeg, resRegion); if(es != Acad::eOk) { for(i = 0; i < resRegion.length(); ++i) delete (AcRxObject*)resRegion[i]; } else { for(i = 0; i < resRegion.length(); ++i) ((AcDbEntity *)resRegion[i])->setPropertiesFrom(this); entitySet.append(resRegion); } for(i = 0; i < curSeg.length(); ++i) delete (AcRxObject*)curSeg[i]; curSeg.setLogicalLength(0); resRegion.setLogicalLength(0); ucs_mat.setToWorldToPlane(faceVect); //#ifdef _OBJECTARX14_ // acdbSetCurrentUCS(ucs_mat); //#else // acedSetCurrentUCS(ucs_mat); //#endif pCir = new AcDbCircle(m_ptEnd, faceVect, m_dDiameter2 / 2.0); curSeg.append(pCir); es = AcDbRegion::createFromCurves(curSeg, resRegion); if(es != Acad::eOk) { for(i = 0; i < resRegion.length(); ++i) delete (AcRxObject*)resRegion[i]; } else { for(i = 0; i < resRegion.length(); ++i) ((AcDbEntity *)resRegion[i])->setPropertiesFrom(this); entitySet.append(resRegion); } for(i = 0; i < curSeg.length(); ++i) delete (AcRxObject*)curSeg[i]; ucs_mat.setCoordSystem(ucs_org, ucs_x, ucs_y, ucs_z); //#ifdef _OBJECTARX14_ // acdbSetCurrentUCS(ucs_mat); //#else // acedSetCurrentUCS(ucs_mat); //#endif AcDbPolygonMesh *pMesh; pMesh = new AcDbPolygonMesh(AcDb::kSimpleMesh, 2, actPrecision + 1, pArray, Adesk::kFalse, Adesk::kFalse); pMesh->setPropertiesFrom(this); entitySet.append(pMesh); 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 }