diff --git a/PocketingNT.cpp b/PocketingNT.cpp index 1fbcdd1..c34052c 100644 --- a/PocketingNT.cpp +++ b/PocketingNT.cpp @@ -1796,11 +1796,6 @@ PocketingNT::ResetCurveAllTempProp( ICurve* pCurve) bool PocketingNT::Chain( int nGrpDestId) { - // vettore puntatori alle curve - ICURVEPOVECTOR vpCrvs ; - vpCrvs.reserve( m_vId.size()) ; - // vettore selettori delle curve originali - SELVECTOR vInds ; // flag per imposizione lati chiusi m_bAllClose = GetForcedClosed() ; @@ -1814,8 +1809,21 @@ PocketingNT::Chain( int nGrpDestId) // recupero la superficie di Trim in globale [nullptr se non presente] PtrOwner pStmTrim( GetStmTrim()) ; + // struct per informazioni da salvare sul gruppo Aux come su chiave KEY_IDS + struct InfoCrvSel { + Point3d ptOnCrv ; // per determinare a quale curva si riferisce nella regione piana + bool bFound ; // per ottimizzare la ricerca + SELVECTOR vIds ; // SELVECTOR originario + InfoCrvSel( const Point3d& ptOC, const SELVECTOR& vI) + : ptOnCrv( ptOC), bFound( false), vIds( vI) {} ; + } ; + vector vInfoCrvSel ; + + // vettore puntatori e selettori alle curve + ICURVEPOVECTOR vpCrvs ; vpCrvs.reserve( m_vId.size()) ; + SELVECTOR vInds ; vInds.reserve( m_vId.size()) ; // recupero tutte le curve e le porto in globale - for ( const auto& Id : m_vId) { + for ( const SelData& Id : m_vId) { // prendo le curve ICURVEPLIST lstPC ; if ( ! GetCurves( Id, pStmRaw, pStmTrim, lstPC)) { @@ -1830,10 +1838,10 @@ PocketingNT::Chain( int nGrpDestId) // preparo i dati per il concatenamento bool bFirst = true ; Point3d ptNear = ORIG ; - double dToler = 10 * EPS_SMALL ; + double dToler = 10. * EPS_SMALL ; ChainCurves chainC ; - chainC.Init( true, dToler, int( vpCrvs.size())) ; - for ( size_t i = 0 ; i < vpCrvs.size() ; ++ i) { + chainC.Init( true, dToler, ssize( vpCrvs)) ; + for ( int i = 0 ; i < ssize( vpCrvs) ; ++ i) { // recupero la curva e il suo riferimento ICurve* pCrv = vpCrvs[i] ; if ( pCrv == nullptr) @@ -1844,11 +1852,11 @@ PocketingNT::Chain( int nGrpDestId) if ( ! pCrv->GetStartPoint( ptStart) || ! pCrv->GetStartDir( vtStart) || ! pCrv->GetEndPoint( ptEnd) || ! pCrv->GetEndDir( vtEnd)) return false ; - if ( ! chainC.AddCurve( int( i + 1), ptStart, vtStart, ptEnd, vtEnd)) + if ( ! chainC.AddCurve( i + 1, ptStart, vtStart, ptEnd, vtEnd)) return false ; // se prima curva, assegno inizio della ricerca if ( bFirst) { - ptNear = ptStart + 10 * EPS_SMALL * vtStart ; + ptNear = ptStart + 10. * EPS_SMALL * vtStart ; bFirst = false ; } } @@ -1867,7 +1875,7 @@ PocketingNT::Chain( int nGrpDestId) SELVECTOR vId2 ; vId2.reserve( vnId2.size()) ; // recupero le curve semplici e le inserisco nella curva composita - for ( size_t i = 0 ; i < vnId2.size() ; ++ i) { + for ( int i = 0 ; i < ssize( vnId2) ; ++ i) { int nId = abs( vnId2[i]) - 1 ; bool bInvert = ( vnId2[i] < 0) ; vId2.emplace_back( vInds[nId]) ; @@ -1927,11 +1935,14 @@ PocketingNT::Chain( int nGrpDestId) vCrvCompo.back()->SetExtrusion( vtExtr) ; // salvo la thickness come seconda temp prop ( la Sfr rimuove la thick delle curve) vCrvCompo.back()->SetTempParam( dThick, 1) ; + // salvo le Info della curva corrente + Point3d ptStart ; vCrvCompo.back()->GetStartPoint( ptStart) ; + vInfoCrvSel.emplace_back( ptStart, vId2) ; } // ordino le curve creando una regione piana SurfFlatRegionByContours SfrByC ; - for ( int i = 0 ; i < int( vCrvCompo.size()) ; ++ i) { + for ( int i = 0 ; i < ssize( vCrvCompo) ; ++ i) { // memorizzo la Thickness nei TempParams vCrvCompo[i]->SetTempParam( vCrvCompo[i]->GetTempParam( 1), 1) ; SfrByC.AddCurve( Release( vCrvCompo[i])) ; @@ -1948,17 +1959,40 @@ PocketingNT::Chain( int nGrpDestId) if ( nPathId == GDB_ID_NULL) return false ; m_pGeomDB->SetName( nPathId, MCH_PATH + ToString( ++ nGroupName)) ; - m_pGeomDB->SetInfo( nPathId, KEY_IDS, ToString( nGroupName)) ; // recupero il Chunk corrente PtrOwner pSfrChunk( pSfrCurr->CloneChunk( nC)) ; if ( IsNull( pSfrChunk) || ! pSfrChunk->IsValid()) return false ; - // recupero la ThickNess e l'Estrusione dal Loop esterno + // recupero la Thickness e l'Estrusione dal Loop esterno PtrOwner pCrvInfo( ConvertCurveToComposite( pSfrChunk->GetLoop( 0, 0))) ; if ( IsNull( pCrvInfo) || ! pCrvInfo->IsValid()) return false ; double dThick = pCrvInfo->GetTempParam( 1) ; Vector3d vtExtr ; pCrvInfo->GetExtrusion( vtExtr) ; + // assegno come proprietà del gruppo le Info di selezione delle entità selezionate originarie + string sInfo ; + for ( int nInfo = 0 ; nInfo < ssize( vInfoCrvSel) ; ++ nInfo) { + if ( ! vInfoCrvSel[nInfo].bFound) { + if ( pCrvInfo->IsPointOn( vInfoCrvSel[nInfo].ptOnCrv, 5. * EPS_SMALL)) { + sInfo += ToString( vInfoCrvSel[nInfo].vIds) ; + vInfoCrvSel[nInfo].bFound = true ; + } + } + } + for ( int nL = 1 ; nL < pSfrChunk->GetLoopCount( 0) ; ++ nL) { + PtrOwner pCrvLoop( pSfrChunk->GetLoop( 0, nL)) ; + if ( IsNull( pCrvLoop) || ! pCrvLoop->IsValid()) + continue ; + for ( int nInfo = 0 ; nInfo < ssize( vInfoCrvSel) ; ++ nInfo) { + if ( ! vInfoCrvSel[nInfo].bFound) { + if ( pCrvLoop->IsPointOn( vInfoCrvSel[nInfo].ptOnCrv, 5. * EPS_SMALL)) { + sInfo += ToString( vInfoCrvSel[nInfo].vIds) ; + vInfoCrvSel[nInfo].bFound = true ; + } + } + } + } + m_pGeomDB->SetInfo( nPathId, KEY_IDS, sInfo) ; // -------------- Verifico quale part del Grezzo bisogna considerare ---------------- if ( ! ChooseRawPart( pSfrChunk, ( pStmTrim == nullptr ? pStmRaw : pStmTrim))) { m_pMchMgr->SetLastError( 2436, "Error in PocketingNT : not valid Raw") ;