EgtMachKernel :
- in Finitura semplificazione e correzione del codice per sottotipo Optimal.
This commit is contained in:
+14
-127
@@ -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)) ;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user