EgtMachKernel :

- in pocketingNT aggiunta memorizzazione SelId al gruppo PathId corrente.
This commit is contained in:
Riccardo Elitropi
2026-04-08 09:45:36 +02:00
parent 83c83fb5f0
commit 083f896d50
+49 -15
View File
@@ -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<ISurfTriMesh> 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<InfoCrvSel> 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<ISurfFlatRegion> 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<ICurveComposite> 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<ICurve> 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") ;