static void filter_self_intersection( const GeometrySet<Dim>& input, GeometrySet<Dim>& output ) { { typedef std::list< CollectionElement<typename Point_d<Dim>::Type> > PointList; PointList points; std::copy( input.points().begin(), input.points().end(), std::back_inserter( points ) ); typename PointList::iterator it = points.begin(); while ( it != points.end() ) { bool intersectsA = false; for ( typename PointList::iterator it2 = points.begin(); it2 != points.end(); ++it2 ) { if ( it == it2 ) { continue; } PrimitiveHandle<Dim> pa1( &it->primitive() ); PrimitiveHandle<Dim> pa2( &it2->primitive() ); if ( CGAL::do_overlap( it->primitive().bbox(), it2->primitive().bbox() ) && algorithm::intersects( pa1, pa2 ) ) { intersectsA = true; GeometrySet<Dim> temp; algorithm::intersection( pa1, pa2, temp ); std::copy( temp.points().begin(), temp.points().end(), std::back_inserter( points ) ); // erase it2 points.erase( it2 ); break; } } if ( ! intersectsA ) { output.addPrimitive( it->primitive() ); } // suppress A it = points.erase( it ); } } { typedef std::list< CollectionElement<typename Segment_d<Dim>::Type> > SegmentList; SegmentList segments; std::copy( input.segments().begin(), input.segments().end(), std::back_inserter( segments ) ); typename SegmentList::iterator it = segments.begin(); while ( it != segments.end() ) { bool intersectsA = false; for ( typename SegmentList::iterator it2 = segments.begin(); it2 != segments.end(); ++it2 ) { if ( it == it2 ) { continue; } PrimitiveHandle<Dim> pa1( &it->primitive() ); PrimitiveHandle<Dim> pa2( &it2->primitive() ); if ( CGAL::do_overlap( it->primitive().bbox(), it2->primitive().bbox() ) && algorithm::intersects( pa1, pa2 ) ) { intersectsA = true; GeometrySet<Dim> temp; algorithm::intersection( pa1, pa2, temp ); std::copy( temp.segments().begin(), temp.segments().end(), std::back_inserter( segments ) ); // erase it2 segments.erase( it2 ); break; } } if ( ! intersectsA ) { output.addPrimitive( it->primitive() ); } // suppress A it = segments.erase( it ); } } }
//ネット抽出 SSingleNetList* SNetList::NetList1() { //printf("newnet\n"); SNlPin* pPin; SPoint point; NlPinList listPin; //ネットに含まれるピン stringList listSignalNameAll; //ネットに関わる未処理信号名 stringList listSignalName; //ネットに関わる未処理信号名 PointList listPoint; //ネットに関わる座標 XBSchObjListIterator ite1; SSingleNetList* pSingleNet; NlPinListIterator itePin = m_listNlPin.begin(); //ピンのリストからピンをひとつ取り出す if(itePin == m_listNlPin.end()) return NULL; //ピンがなければ何もせずに戻る pPin=(*itePin); m_listNlPin.erase(itePin); //取り出したピンは元のリストから消去して pSingleNet = new SSingleNetList; listPin.push_back(pPin); //ネットに登録 listPoint.push_back(pPin->m_point); //ピン位置を座標のリストに登録する。 //ピンの信号名を取得して、すべて信号名のリストに登録する。 stringListIterator iteStr=pPin->m_listSigName.begin(); while(iteStr!=pPin->m_listSigName.end()){ listSignalNameAll.push_back(*iteStr); listSignalName.push_back(*iteStr); iteStr++; } //処理が発生しなくなるまで1. 2.を繰り返す //1.未処理信号名がなくなるまで(1)(2)を繰り返し実行する。 // (1)信号名によるピンの抽出 // 同じ信号名を持つピンの取り出し // 取り出したピンが持つ別の信号名の追加登録 // 取り出したピンの座標の登録 // (2)信号名によるワイヤーの抽出 // 同じ信号名を持つワイヤーの取り出し // 取り出したワイヤーが持つ別の信号名の追加登録 // 取り出したワイヤーの座標の登録 // //2.未処理座標がなくなるまで(3)(4)を繰り返し実行する。 // (3)座標によるピンの抽出 // その座標を持つピンの取り出し // 取り出したピンが持つ別の信号名の追加登録 // (4)座標によるワイヤーの取り出し // その座標を持つワイヤーの取り出し // 取り出したワイヤーが持つ別の信号名の追加登録 // 取り出したワイヤーの座標の登録 // stringListIterator iteSignalName; PointListIterator itePoint; bool fDone = true; int loopCount = 0; while(fDone){ //printf("%d\n",loopCount); fDone = false; //***** 1.信号名処理 ***** iteSignalName = listSignalName.begin(); while(iteSignalName != listSignalName.end()){ //printf("SigName"); fDone = true; string strSignalName = (*iteSignalName); //***** (1)信号名によるピンの抽出 ***** NlPinListIterator itePin = m_listNlPin.begin(); NlPinListIterator itePinBackUp; while(itePin != m_listNlPin.end()){ //信号名について全てのピンをスキャンする SNlPin* pPin =(*itePin); itePinBackUp = itePin; itePin++; if(quaryExist(pPin->m_listSigName,strSignalName)){ //ピンが持つ信号名のひとつが検索中の信号名に合致 m_listNlPin.erase(itePinBackUp); //ピンのリストからはずす listPin.push_back(pPin); //ネットのピンのリストに追加する stringListIterator itePinSignalName = pPin->m_listSigName.begin(); //ピンが持つ信号名をすべて、ネットの信号名に登録 while(itePinSignalName != pPin->m_listSigName.end()){ // if(!quaryExist(listSignalNameAll,(*itePinSignalName))){ //ただし、新規に登録するのは、未登録のものだけ listSignalNameAll.push_back(*itePinSignalName); listSignalName.push_back(*itePinSignalName); } itePinSignalName++; } if(!quaryExist(listPoint,pPin->m_point)){ listPoint.push_back(pPin->m_point); } } }// ***** (1)信号名によるピンの抽出 ***** // ***** (2)信号名によるワイヤーの抽出 ***** XBSchObjListIterator iteWire = m_listWire.begin(); XBSchObjListIterator iteWireBackUp; while(iteWire != m_listWire.end()){ //信号名について全てのワイヤーをスキャンする SXBSchWireNl* pWire =(SXBSchWireNl*)(*iteWire); iteWireBackUp = iteWire; iteWire++; if(quaryExist(pWire->m_listSignalName,strSignalName)){ //ワイヤーが持つ信号名のひとつが検索中の信号名に合致 m_listWire.erase(iteWireBackUp); //ワイヤーのリストからはずす stringListIterator iteWireSignalName = pWire->m_listSignalName.begin(); //ワイヤーが持つ信号名をすべて、ネットの信号名に登録 while(iteWireSignalName != pWire->m_listSignalName.end()){ // if(!quaryExist(listSignalNameAll,(*iteWireSignalName))){ //ただし、新規に登録するのは、未登録のものだけ listSignalNameAll.push_back(*iteWireSignalName); listSignalName.push_back(*iteWireSignalName); } iteWireSignalName++; } if(!quaryExist(listPoint,pWire->p1())){ listPoint.push_back(pWire->p1()); } if(!quaryExist(listPoint,pWire->p2())){ listPoint.push_back(pWire->p2()); } delete pWire; } } // ***** (2)信号名によるワイヤーの抽出 ***** iteSignalName = listSignalName.erase(iteSignalName); }// ここまで ***** 1.信号名処理 ***** itePoint = listPoint.begin(); // ***** 2.座標処理 ***** while(itePoint != listPoint.end()){//座標処理繰り返し //printf("Point"); fDone = true; SPoint point = (*itePoint); // ***** (3)座標によるピンの抽出 ***** NlPinListIterator itePin = m_listNlPin.begin(); NlPinListIterator itePinBackUp; while(itePin != m_listNlPin.end()){ //座標について全てのピンをスキャンする SNlPin* pPin =(*itePin); itePinBackUp = itePin; itePin++; if(pPin->m_point == point){ //ピンの座標が検索中の座標と合致 m_listNlPin.erase(itePinBackUp); //ピンのリストからはずす listPin.push_back(pPin); //ネットのピンのリストに追加する stringListIterator itePinSignalName = pPin->m_listSigName.begin(); //ピンが持つ信号名をすべて、ネットの信号名に登録 while(itePinSignalName != pPin->m_listSigName.end()){ // if(!quaryExist(listSignalNameAll,(*itePinSignalName))){ //ただし、新規に登録するのは、未登録のものだけ listSignalNameAll.push_back(*itePinSignalName); listSignalName.push_back(*itePinSignalName); } itePinSignalName++; } } } //ここまで***** (3)座標によるピンの抽出 ***** // ***** (4)座標によるワイヤーの抽出 ***** XBSchObjListIterator iteWire = m_listWire.begin(); XBSchObjListIterator iteWireBackUp; while(iteWire != m_listWire.end()){ //座標について全てのワイヤーをスキャンする SXBSchWireNl* pWire =(SXBSchWireNl*)(*iteWire); iteWireBackUp = iteWire; iteWire++; bool fHit=false; if(pWire->p1() == point){ fHit=true; if(!quaryExist(listPoint,pWire->p2())){ listPoint.push_back(pWire->p2()); } }else if(pWire->p2() == point){ fHit=true; if(!quaryExist(listPoint,pWire->p1())){ listPoint.push_back(pWire->p1()); } } if(fHit){ stringListIterator iteWireSignalName = pWire->m_listSignalName.begin(); //ワイヤーが持つ信号名をすべて、ネットの信号名に登録 while(iteWireSignalName != pWire->m_listSignalName.end()){ // if(!quaryExist(listSignalName,(*iteWireSignalName))){ //ただし、新規に登録するのは、未登録のものだけ listSignalNameAll.push_back(*iteWireSignalName); listSignalName.push_back(*iteWireSignalName); } iteWireSignalName++; } delete pWire; m_listWire.erase(iteWireBackUp); //ワイヤーのリストからはずす } }// ***** (4)座標によるワイヤーの抽出 ***** itePoint=listPoint.erase(itePoint); }// while(itePoint != listPoint.end()){ loopCount++ ; } if(listSignalNameAll.size()>0) pSingleNet->m_SignalName=listSignalNameAll.front(); pSingleNet->m_nPinCount=listPin.size(); if(pSingleNet->m_nPinCount>0){ pSingleNet->m_pPinArray = new PSNlPin[pSingleNet->m_nPinCount]; NlPinListIterator itePin=listPin.begin(); int n=0; while(itePin!=listPin.end()){ pSingleNet->m_pPinArray[n++]=(*itePin++); } qsort(pSingleNet->m_pPinArray,pSingleNet->m_nPinCount, sizeof(PSNlPin), CompareSNlPin ); } return pSingleNet; }