EgtGeomKernel :

- in CalcPocketing aggiunto prototipo per riconoscimento di svuotatura di un foro.
This commit is contained in:
Riccardo Elitropi
2026-04-28 11:04:42 +02:00
parent 344f0da7ff
commit a445ddd89b
+85 -1
View File
@@ -2417,7 +2417,7 @@ CalcCircleSpiral( const Point3d& ptCen, const Vector3d& vtN, double dOutRad, dou
PtrOwner<ICurveArc> pArc( CreateCurveArc()) ;
if ( IsNull( pArc) || ! pArc->Set( ptCen, vtN, dOutRad))
return false ;
// cambio il punto inizile se necessario
// cambio il punto iniziale se necessario
if ( PockParams.ptStart.IsValid()) {
double dUStart = 0. ;
int nFlag = 0 ;
@@ -9828,6 +9828,90 @@ CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double
return true ;
}
//----------------------------------------------------------------------------
bool
IsPocketingHole( const ISurfFlatRegion* pSfr, double dToolRad, double dRadialOffs, double dSideStep, int nType, int nLiType,
double dLiTang, double dRatioSfrTool)
{
// verifico validità della superficie
if ( pSfr == nullptr || ! pSfr->IsValid())
return false ;
// la superficie deve avere un solo Chunk e non presentare isole
if ( pSfr->GetChunkCount() != 1 && pSfr->GetLoopCount( 0) != 1)
return false ;
// porto la superficie nel suo riferimento intrinseco, quindi lavoro nel piano XY
Point3d ptC ; pSfr->GetCentroid( ptC) ;
Frame3d frXY ;
if ( ! frXY.Set( ptC, pSfr->GetNormVersor()))
return false ;
PtrOwner<ISurfFlatRegion> pSfrCL( CloneSurfFlatRegion( pSfr)) ;
if ( IsNull( pSfrCL) || ! pSfrCL->IsValid() || ! pSfrCL->ToLoc( frXY))
return false ;
// recupero l'unica curva di bordo che descrive la regione piana
PtrOwner<ICurveComposite> pCrvBorder( ConvertCurveToComposite( pSfrCL->GetLoop( 0, 0))) ;
if ( IsNull( pCrvBorder) || ! pCrvBorder->IsValid())
return false ;
pCrvBorder->MergeCurves( 10. * EPS_SMALL, 10. * EPS_ANG_SMALL, true, true) ;
pCrvBorder->SetExtrusion( pSfrCL->GetNormVersor()) ; // Z_AX()
// verifico che le proprietà di lato Aperto/Chiuso siano uniformi
bool bOkSpiral = true ;
const ICurve* pFirstCrv = pCrvBorder->GetCurve( 0) ;
if ( pFirstCrv == nullptr || ! pFirstCrv->IsValid())
return false ;
int nTmpPropRef = pFirstCrv->GetTempProp( 0) ;
for ( int nU = 1 ; bOkSpiral && nU < pCrvBorder->GetCurveCount() ; ++ nU) {
const ICurve* pCrv = pCrvBorder->GetCurve( nU) ;
if ( pCrv == nullptr || ! pCrv->IsValid())
return false ;
bOkSpiral = ( pCrv->GetTempProp( 0) == nTmpPropRef) ;
}
if ( ! bOkSpiral)
return false ;
// definisco i parametri di una lavorazione Standard ( solo quelli utili per una svuotatura di un foro)
PocketParams PockParam ;
PockParam.dRad = dToolRad ;
PockParam.dRadialOffset = dRadialOffs ;
PockParam.dSideStep = dSideStep ;
PockParam.ptStart = P_INVALID ;
PockParam.bCalcFeed = false ;
PockParam.nType = nType ;
PockParam.nLiType = nLiType ;
PockParam.dLiTang = dLiTang ;
// controllo che il Loop sia una circonferenza
Point3d ptCen ; double dRad ;
if ( ! OptimizedSpiralCircle( pCrvBorder, 50. * EPS_SMALL, dRad, ptCen, bOkSpiral) || ! bOkSpiral)
return false ;
double dOffs = PockParam.dRad + PockParam.dRadialOffset ;
// se curva tutta Open, ingrandisco il raggio della circonferenza trovata
if ( nTmpPropRef == TEMP_PROP_OPEN_EDGE)
dRad += 1.05 * PockParam.dRad + PockParam.dRadialOffset ;
// se curva chiusa, controllo che il raggio sia compatibile con il primo Offset
else
bOkSpiral = ( dRad - dOffs > 10. * EPS_SMALL) ;
if ( ! bOkSpiral)
return false ;
// verifico di rispettare il Ratio
if ( dRad > dRatioSfrTool * dToolRad + EPS_SMALL)
return false ;
// verifico se l'entrata è compatibile con la geometria e calcolo un eventuale percorso
double dIntRad = 0 ;
if ( PockParam.nType == POCKET_SPIRALOUT && PockParam.nLiType == LEAD_IN_HELIX)
dIntRad = min( 0.5 * min( PockParam.dLiTang, 2. * PockParam.dRad), dRad - dOffs) ;
PtrOwner<ICurveComposite> pCrvRes( CreateCurveComposite()) ;
if ( IsNull( pCrvRes))
return false ;
bOkSpiral = CalcCircleSpiral( ptCen, pSfrCL->GetNormVersor(), dRad - dOffs, dIntRad, PockParam, pCrvRes) ;
return ( bOkSpiral && pCrvRes->IsValid() && pCrvRes->GetCurveCount() > 0) ;
}
//----------------------------------------------------------------------------
static bool
AdjustZigZagPathTangentLinks( ICurveComposite* pCrvCompo)