// 至少需要2个元素才能正确的闭合 static void EdgeJunctionClosureImpl( const AcGePoint3d& junctionPt, EdgeInfo& ges ) { //acutPrintf(_T("\n队列中的元素个数:%d"), ges.size()); if( ges.size() == 1 ) { ges.push_back( ges.front() ); } // 把第1个添加到末尾,构成循环 ges.push_back( ges.front() ); // 记录每次处理闭合的当前向量 AcGeVector3d v3 = ges.front().angle; v3.rotateBy( PI / 2, AcGeVector3d::kZAxis ); AcTransaction* pTrans = actrTransactionManager->startTransaction(); if( pTrans == 0 ) return; for( EdgeInfoIter itr = ges.begin(); itr != ges.end(); itr++ ) { EdgeInfoIter itr2 = itr + 1; if( itr2 == ges.end() ) break; //acutPrintf(_T("\n巷道1角度:%.3f, 巷道2角度:%.3f"), // itr->angle.angleTo(AcGeVector3d::kXAxis, -AcGeVector3d::kZAxis), // itr2->angle.angleTo(AcGeVector3d::kXAxis, -AcGeVector3d::kZAxis)); AcGeVector3d cv = itr->angle.crossProduct( itr2->angle ); // 叉乘(如果夹角等=0或PI,则向量=0) //if(cv.length() > 0.001) if( !cv.isZeroLength() ) { //acutPrintf(_T("\n叉乘长度=%.3f"), cv.length()); //v3 = CaclAverageVector3(itr->angle, itr2->angle); v3 = CaclAverageVector2( itr->angle, 1, itr2->angle, 1 ); } else { // 平行(夹角=0或PI) //acutPrintf(_T("\n叉乘=0")); v3.negate(); } DealWithBoundary2( pTrans, *itr, junctionPt, v3 ); DealWithBoundary2( pTrans, *itr2, junctionPt, v3 ); } actrTransactionManager->endTransaction(); }
static void BuildJunctionEdgeInfo( const AcDbObjectIdArray& objIds, const AcGePoint3d& junctionPt, EdgeInfo& ges ) { AcTransaction* pTrans = actrTransactionManager->startTransaction(); if( pTrans == 0 ) return; int n = objIds.length(); for( int i = 0; i < n; i++ ) { AcDbObjectId objId = objIds.at( i ); JunctionEdgeInfo info = {objId, true, AcGeVector3d::kIdentity}; LinkedGE* pEdge = OpenEdge2( pTrans, objId, AcDb::kForRead ); if( pEdge == 0 ) continue; AcGePoint3d startPt, endPt; pEdge->getSEPoint( startPt, endPt ); if( startPt == junctionPt ) { info.startOrEnd = true; info.angle = pEdge->getStartPointInExtendAngle(); } else if( endPt == junctionPt ) { info.startOrEnd = false; info.angle = pEdge->getEndPointInExtendAngle(); } if( info.angle.isZeroLength() ) continue; // 零向量表示不处理闭合 //acutPrintf(_T("\nid:%d\tangle:%.3f\tdraw:%s"), // info.objId, // info.angle.angleTo(AcGeVector3d::kXAxis, -AcGeVector3d::kZAxis), // pEdge->getCurrentDraw()); ges.push_back( info ); } actrTransactionManager->endTransaction(); }