EgtMachKernel :

- in Finitura semplificazione e correzione del codice per sottotipo Optimal.
This commit is contained in:
Riccardo Elitropi
2026-06-10 17:30:13 +02:00
parent 5196ffe33e
commit 443f04116f
+14 -127
View File
@@ -1189,7 +1189,7 @@ SurfFinishing::Chain( int nGrpDestId)
// se finitura a proiezione di curve
if ( m_Params.m_nSubType == SURFFIN_SUB_PROJECT) {
int nGroupName = -1 ;
for ( int i = 0 ; i < int( vpCrvs.size()) ; ++ i) {
for ( int i = 0 ; i < ssize( vpCrvs) ; ++ i) {
// creo nuovo gruppo
int nPathId = m_pGeomDB->AddGroup( GDB_ID_NULL, nGrpDestId, Frame3d()) ;
if ( nPathId == GDB_ID_NULL)
@@ -5745,138 +5745,25 @@ SurfFinishing::CalcOptimalZigZagSfrByZConstCrv( const ISurfFlatRegion* pSfrLoc,
pCompoSil == nullptr || ! pCompoSil->IsValid() ||
pSfrCollCompoSil == nullptr)
return false ;
pSfrCollCompoSil->Clear() ;
// definisco il frame della regione piana
Frame3d frSfr ;
// abballisco e semplifico la curva calcolata
Point3d ptC ; pSfrLoc->GetCentroid( ptC) ;
if ( ! frSfr.Set( ptC, pSfrLoc->GetNormVersor()))
Frame3d frLoc ;
if ( ! frLoc.Set( ptC, pSfrLoc->GetNormVersor()))
return false ;
SimplifyCurve( pCompoSil, frLoc) ;
// definisco il bordo della curva rappresentante la collisione
PtrOwner<ICurveComposite> pCompoColl( CreateCurveComposite()) ;
if ( IsNull( pCompoColl))
// definisco una regione di FatCurve pari al valore dell'Offset richiesto
PtrOwner<ISurfFlatRegion> pSfrFat( GetSurfFlatRegionFromFatCurve( CloneCurveComposite( pCompoSil), dExtraCollOffs, false, false)) ;
if ( IsNull( pSfrFat) || ! pSfrFat->IsValid())
return false ;
bool bfirst = true ;
const double TOL_SAFE = Clamp( m_Params.m_dSideStep, 100. * EPS_SMALL, 1.0) ; // tolleranza per pareti verticali e per triangoli misti tra SplitAngle
double dRad = m_TParams.m_dDiam / 2. + TOL_SAFE ;
for ( int nCrv = 0 ; nCrv < pCompoSil->GetCurveCount() ; ++ nCrv) {
const ICurve* pCrv = pCompoSil->GetCurve( nCrv) ;
if ( pCrv == nullptr)
continue ;
// recupero il centro dell'utensile sferico sopra a tale curva
Point3d ptEnd ; pCrv->GetEndPoint( ptEnd) ;
Point3d ptSphereCenter = ptEnd + vtToolLoc * dRad ;
// recupero il punto a minima distanza ( quello che ha generato la collisione)
double dMinDist = INFINITO - 1 ;
Point3d ptMinDist = P_INVALID ;
Vector3d vtCollToCenter = V_INVALID ;
for ( int nSurf = 0 ; nSurf < ssize( vpStm) ; ++ nSurf) {
if ( vpStm[nSurf] != nullptr && vpStm[nSurf]->IsValid()) {
DistPointSurfTm distPtSurfTm( ptSphereCenter, *vpStm[nSurf]) ;
double dMyDist = INFINITO - 2 ;
if ( distPtSurfTm.GetDist( dMyDist) && dMyDist < dMinDist) {
dMinDist = dMyDist ;
distPtSurfTm.GetMinDistPoint( ptMinDist) ;
vtCollToCenter = ptSphereCenter - ptMinDist ;
vtCollToCenter.Normalize() ;
}
}
}
if ( ptMinDist.IsValid() && vtCollToCenter.IsValid()) {
Point3d ptColl = ptEnd - OrthoCompo( dRad * vtCollToCenter, vtToolLoc) ;
if ( bfirst) {
pCompoColl->AddPoint( ptColl) ;
bfirst = false ;
}
else
pCompoColl->AddLine( ptColl) ;
}
}
if ( pCompoSil->IsClosed())
pCompoColl->Close() ;
// abballisco le due curve smussandole
SimplifyCurve( pCompoSil, frSfr) ;
SimplifyCurve( pCompoColl, frSfr) ;
#if 0
int a = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCompoSil->Clone()) ;
m_pGeomDB->SetMaterial( a, FUCHSIA) ;
a = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCompoColl->Clone()) ;
m_pGeomDB->SetMaterial( a, BLUE) ;
#endif
// Se richiesto Offset Extra lo aggiungo alla curva di collisione
if ( abs( dExtraCollOffs) > 10. * EPS_SMALL) {
pCompoColl->SetExtrusion( vtToolLoc) ;
OffsetCurve OffsCrv ;
if ( OffsCrv.Make( pCompoColl, ( ! m_Params.m_bInvert ? dExtraCollOffs : - dExtraCollOffs), ICurve::OFF_FILLET)) {
PtrOwner<ICurve> pCrvOffs( OffsCrv.GetLongerCurve()) ;
if ( ! IsNull( pCrvOffs) && pCrvOffs->IsValid()) {
pCompoColl->Clear() ;
pCompoColl->AddCurve( Release( pCrvOffs)) ;
}
}
}
if ( pCompoSil->IsValid() && pCompoColl->IsValid()) {
if ( pCompoSil->IsClosed()) {
pSfrCollCompoSil->AddExtLoop( Release( pCompoColl)) ;
PtrOwner<ICurveComposite> pCompoIsl( CloneCurveComposite( pCompoSil)) ;
if ( IsNull( pCompoIsl) || ! pCompoIsl->IsValid())
return false ;
pCompoIsl->SetExtrusion( vtToolLoc) ;
double dOffset = ( ! m_Params.m_bInvert ? 1. : -1.) * dRad ;
OffsetCurve OffsCrv ;
OffsCrv.Make( pCompoIsl, dOffset, ICurve::OFF_FILLET) ;
PtrOwner<ICurve> pCrvOffs( OffsCrv.GetLongerCurve()) ;
if ( ! IsNull( pCrvOffs) && pCrvOffs->IsValid())
pSfrCollCompoSil->AddIntLoop( Release( pCrvOffs)) ;
else
pSfrCollCompoSil->AddIntLoop( Release( pCompoIsl)) ;
}
else {
PtrOwner<ICurveComposite> pBorder( CloneCurveComposite( pCompoColl)) ;
if ( IsNull( pBorder) || ! pBorder->IsValid())
return false ;
PtrOwner<ICurve> pNewCrvCompoInv( CloneCurveComposite( pCompoSil)) ;
if ( IsNull( pNewCrvCompoInv) || ! pNewCrvCompoInv->IsValid())
return false ;
pNewCrvCompoInv->SetExtrusion( vtToolLoc) ;
double dOffset = ( ! m_Params.m_bInvert ? 1. : -1.) * dRad ;
OffsetCurve OffsCrv ;
OffsCrv.Make( pNewCrvCompoInv, dOffset, ICurve::OFF_FILLET) ;
PtrOwner<ICurve> pCrvOffs( OffsCrv.GetLongerCurve()) ;
if ( ! IsNull( pCrvOffs) && pCrvOffs->IsValid())
pNewCrvCompoInv.Set( Release( pCrvOffs)) ;
pNewCrvCompoInv->Invert() ;
Point3d ptCurr ; pBorder->GetEndPoint( ptCurr) ;
Vector3d vtCurr ; pBorder->GetEndDir( vtCurr) ;
Point3d ptEnd ; pNewCrvCompoInv->GetStartPoint( ptEnd) ;
PtrOwner<ICurveArc> pArc( CreateCurveArc()) ; pArc->Set2PVN( ptCurr, ptEnd, vtCurr, vtToolLoc) ;
pBorder->AddCurve( Release( pArc)) ;
pBorder->AddCurve( Release( pNewCrvCompoInv)) ;
pBorder->GetEndPoint( ptCurr) ;
pBorder->GetEndDir( vtCurr) ;
pBorder->GetStartPoint( ptEnd) ;
pArc.Set( CreateCurveArc()) ; pArc->Set2PVN( ptCurr, ptEnd, vtCurr, vtToolLoc) ;
pBorder->AddCurve( Release( pArc)) ;
pSfrCollCompoSil->AddExtLoop( Release( pBorder)) ;
}
}
// per sicurezza oriento a prescindere la normale della superficie come vtToolLoc
if ( pSfrCollCompoSil->IsValid()) {
if ( AreOppositeVectorApprox( pSfrCollCompoSil->GetNormVersor(), vtToolLoc))
pSfrCollCompoSil->Invert() ;
#if 0
int a = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrCollCompoSil->Clone()) ;
m_pGeomDB->SetMaterial( a, Color( 255, 0, 0, 50)) ;
#endif
}
pSfrCollCompoSil->CopyFrom( pSfrFat) ;
// verifico che sia orientata correttamente
if ( AreOppositeVectorApprox( pSfrLoc->GetNormVersor(), pSfrCollCompoSil->GetNormVersor()))
pSfrCollCompoSil->Invert() ;
return true ;
}
@@ -6349,7 +6236,7 @@ SurfFinishing::CalcOptimalZigZagRegion( const ISurfFlatRegion* pSfrCntLoc, const
// verifico che il Chunk non sia troppo "snello"
double dMaxOffs = 0. ;
pSfrZigZagChunk->GetMaxOffset( dMaxOffs) ;
if ( dMaxOffs > m_TParams.m_dDiam / 2. - 2. * EPS_SMALL)
if ( dMaxOffs > 10. * EPS_SMALL)
vpSfrZigZagProj.emplace_back( Release( pSfrZigZagChunk)) ;
}
}