EgtGeomKernel :
- in CalcPocketing aggiunto prototipo per riconoscimento di svuotatura di un foro.
This commit is contained in:
+85
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user