EgtGeomKernel :
- In CalcPocketing piccola correzione per i punti iniziali nei casi Spiral e per i Trapezi.
This commit is contained in:
+49
-40
@@ -3159,8 +3159,8 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe
|
||||
int nProp = - 1 ;
|
||||
if ( ! pCrvPocket->GetCurveTempProp( nCrvId, nProp))
|
||||
return false ;
|
||||
// se open
|
||||
if ( nProp == 1) {
|
||||
// se Open
|
||||
if ( nProp == TEMP_PROP_OPEN_EDGE) {
|
||||
Point3d pt1, pt2 ;
|
||||
pCrvPocket->GetCurve( nCrvId)->GetStartPoint( pt1) ;
|
||||
pCrvPocket->GetCurve( nCrvId)->GetEndPoint( pt2) ;
|
||||
@@ -3169,10 +3169,10 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe
|
||||
else
|
||||
dXCoord = max( pt1.x, pt2.x) ;
|
||||
}
|
||||
// se closed
|
||||
// se Closed
|
||||
else {
|
||||
// creo la curva destra/sinistra
|
||||
int nLast = bStart ? pCrvPocket->GetCurveCount() : nSecondBase ;
|
||||
int nLast = ( bStart ? pCrvPocket->GetCurveCount() : nSecondBase) ;
|
||||
PtrOwner<ICurveComposite> pCrvSide( ConvertCurveToComposite( pCrvPocket->CopyParamRange( nCrvId, nLast))) ;
|
||||
if ( IsNull( pCrvSide))
|
||||
return false ;
|
||||
@@ -3200,7 +3200,7 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe
|
||||
PtrOwner<ICurveLine> pLineMid( CreateCurveLine()) ;
|
||||
if ( IsNull( pLineMid))
|
||||
return false ;
|
||||
pLineMid->Set( Point3d( - 3000, dYCoord, 0), Point3d( 3000, dYCoord, 0)) ;
|
||||
pLineMid->Set( Point3d( - 3000., dYCoord, 0.), Point3d( 3000., dYCoord, 0.)) ;
|
||||
IntersCurveCurve intCC( *pLineMid, *pCrvOffs) ;
|
||||
IntCrvCrvInfo ccClass ;
|
||||
if ( intCC.GetIntersCount() != 0) {
|
||||
@@ -3211,8 +3211,7 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
// se non ho intersezioni...
|
||||
// prendo il box della curva
|
||||
// se non ho intersezioni, prendo il box della curva
|
||||
BBox3d Box3d ;
|
||||
pCrvSide->GetLocalBBox( Box3d) ;
|
||||
// creo la linea limitie verticale
|
||||
@@ -3220,10 +3219,10 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe
|
||||
if ( IsNull( pCrvVertLine))
|
||||
return false ;
|
||||
if ( bStart)
|
||||
pCrvVertLine->SetPDL( Box3d.GetMax() + 5 * TOL_TRAPEZOID * Y_AX, - 90 , 2 * dPocketSize) ;
|
||||
pCrvVertLine->SetPDL( Box3d.GetMax() + 5 * TOL_TRAPEZOID * Y_AX, - ANG_RIGHT , 2 * dPocketSize) ;
|
||||
else
|
||||
pCrvVertLine->SetPDL( Box3d.GetMin() - 5 * TOL_TRAPEZOID * Y_AX, 90, 2 * dPocketSize) ;
|
||||
// intersechiamo
|
||||
pCrvVertLine->SetPDL( Box3d.GetMin() - 5 * TOL_TRAPEZOID * Y_AX, ANG_RIGHT, 2 * dPocketSize) ;
|
||||
// intersezione
|
||||
IntersCurveCurve intCC2( *pCrvVertLine, *pCrvSide) ;
|
||||
if ( intCC2.GetOverlaps()) {
|
||||
if ( bStart)
|
||||
@@ -3232,7 +3231,7 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe
|
||||
dXCoord = Box3d.GetMin().x - dRad ;
|
||||
}
|
||||
else {
|
||||
dXCoord = bStart ? -INFINITO : INFINITO ;
|
||||
dXCoord = ( bStart ? -INFINITO : INFINITO) ;
|
||||
for ( int i = 0 ; i < intCC2.GetIntersCount() ; ++ i) {
|
||||
IntCrvCrvInfo ccClass2 ;
|
||||
if ( intCC2.GetIntCrvCrvInfo( i, ccClass2)) {
|
||||
@@ -3259,24 +3258,25 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
const PocketParams& PockParams, bool bStart)
|
||||
{
|
||||
// parametri
|
||||
double dDiam = PockParams.dRad_prec > 0 ? 2 * PockParams.dRad_prec : 2 * PockParams.dRad ;
|
||||
double dOffsR = PockParams.dRad_prec > 0 ? PockParams.dRadialOffset_prec : PockParams.dRadialOffset ;
|
||||
double dDiam = ( PockParams.dRad_prec > 0 ? 2. * PockParams.dRad_prec : 2. * PockParams.dRad) ;
|
||||
double dOffsR = ( PockParams.dRad_prec > 0 ? PockParams.dRadialOffset_prec : PockParams.dRadialOffset) ;
|
||||
double dRad = 0.5 * dDiam + dOffsR ;
|
||||
|
||||
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
|
||||
if ( ! bStart)
|
||||
pMCrv->Invert() ;
|
||||
|
||||
// recupero la coordinata Y del tratto lineare e la dimensione della tasca a trapezio
|
||||
Point3d ptTmp ;
|
||||
pMCrv->GetStartPoint( ptTmp) ;
|
||||
double dYCoord = ptTmp.y ; // quota verticale del percorso di svuotatura
|
||||
double dYCoord = ptTmp.y ;
|
||||
pCrvPocket->GetCurve( 2)->GetStartPoint( ptTmp) ;
|
||||
double dPocketSize = ptTmp.y ;
|
||||
|
||||
// offset del lato chiuso del raggio utensile, verso l'interno della tasca a trapezio
|
||||
int nCrvId = ( bStart ? 3 : 1) ;
|
||||
PtrOwner<ICurveLine> pLine( GetCurveLine( pCrvPocket->GetCurve( nCrvId)->Clone())) ;
|
||||
pLine->SimpleOffset( - dRad) ;
|
||||
|
||||
// inverto gli estremi se necessario
|
||||
Point3d ptP1, ptP2 ;
|
||||
pLine->GetStartPoint( ptP1) ;
|
||||
pLine->GetEndPoint( ptP2) ;
|
||||
@@ -3284,8 +3284,11 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
swap( ptP1, ptP2) ;
|
||||
|
||||
int nProp2 ;
|
||||
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
|
||||
if ( IsNull( pCompo))
|
||||
return false ;
|
||||
// lato opposto a quello di riferimento aperto
|
||||
if ( pCrvPocket->GetCurveTempProp( 2, nProp2) && nProp2 != 0) {
|
||||
if ( pCrvPocket->GetCurveTempProp( 2, nProp2) && nProp2 != TEMP_PROP_CLOSE_EDGE) {
|
||||
|
||||
// caso 1 : pLine ha un estremo sopra e uno sotto il percorso di svuotatura pMCrv
|
||||
if ( ptP2.y < dYCoord && dYCoord < ptP1.y) {
|
||||
@@ -3316,22 +3319,19 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
if ( ! pMCrv->TrimStartAtParam( dPar))
|
||||
pMCrv->Clear() ;
|
||||
|
||||
if ( ptP1.y > dPocketSize) {
|
||||
if ( ptP1.y > dPocketSize + 100. * EPS_SMALL) {
|
||||
// se ptP1 è esterno alla svuotatura scambio i punti in modo da usare ptP2 per il biarco ( così da non farlo fuoriuscire troppo)
|
||||
swap( ptP1, ptP2) ;
|
||||
pCompo->Invert() ;
|
||||
}
|
||||
|
||||
// creo biarco fra ptP1 e ptCrv
|
||||
Vector3d vtDir ;
|
||||
pCompo->GetStartDir( vtDir) ;
|
||||
double dAng ;
|
||||
vtDir.GetAngleXY( X_AX, dAng) ;
|
||||
PtrOwner<ICurve> pBiArc( GetBiArc( ptP1, - dAng, ptCrv, bStart ? 0 : 180, 0.8)) ;
|
||||
|
||||
Vector3d vtDir ; pCompo->GetStartDir( vtDir) ;
|
||||
double dAng ; vtDir.GetAngleXY( X_AX, dAng) ;
|
||||
bool bUseBiArc = false ;
|
||||
PtrOwner<ICurve> pBiArc( GetBiArc( ptP1, - dAng, ptCrv, bStart ? 0 : ANG_STRAIGHT, 0.8)) ;
|
||||
if ( ! IsNull( pBiArc)) {
|
||||
// verifico che con il biarco non si oltrepassi il lato obliquo chiuso della svuotatura
|
||||
// verifico che con il biarco non si oltrepassi il lato obliquo chiuso della svuotatura
|
||||
IntersCurveCurve intCC2( *pBiArc, *pCompo) ;
|
||||
if ( intCC2.GetIntersCount() == 1)
|
||||
bUseBiArc = true ;
|
||||
@@ -3356,9 +3356,9 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
|
||||
// trovo l'intersezione fra il prolungamento della linea e pMCrv
|
||||
if ( bStart)
|
||||
pLine->ExtendStartByLen( 1000) ;
|
||||
pLine->ExtendStartByLen( 1000.) ;
|
||||
else
|
||||
pLine->ExtendEndByLen( 1000) ;
|
||||
pLine->ExtendEndByLen( 1000.) ;
|
||||
IntersCurveCurve intCC ( *pLine, *pMCrv) ;
|
||||
if ( intCC.GetIntersCount() == 0)
|
||||
return false ;
|
||||
@@ -3376,7 +3376,7 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
}
|
||||
}
|
||||
|
||||
// se il lato opposto a quello di riferimento � chiuso bisogna distinguere i casi
|
||||
// se il lato opposto a quello di riferimento è chiuso bisogna distinguere i casi
|
||||
else {
|
||||
bool bStartPnt = false ;
|
||||
if ( ptP2.y < dYCoord) {
|
||||
@@ -3387,7 +3387,7 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
pLine->GetStartDir( vtDir) ;
|
||||
if ( bStart)
|
||||
vtDir.Invert() ;
|
||||
Point3d ptP2N = ptP2 - dDiam / 2 * abs( vtDir.x / vtDir.y) * vtDir ;
|
||||
Point3d ptP2N = ptP2 - dDiam / 2. * abs( vtDir.x / vtDir.y) * vtDir ;
|
||||
if ( ptP2N.y < dYCoord)
|
||||
bStartPnt = pCompo->AddPoint( ptP2N) ;
|
||||
}
|
||||
@@ -3399,12 +3399,13 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p
|
||||
}
|
||||
|
||||
// setto temp prop per ricordare che è curva aggiuntiva per pulire angoli
|
||||
for ( int i = 0 ; i < pCompo->GetCurveCount() ; i++)
|
||||
pCompo->SetCurveTempProp( i, 1) ;
|
||||
for ( int i = 0 ; i < pCompo->GetCurveCount() ; ++ i)
|
||||
pCompo->SetCurveTempProp( i, TEMP_PROP_OPEN_EDGE) ;
|
||||
|
||||
pMCrv->AddCurve( Release( pCompo), false) ;
|
||||
if ( ! bStart)
|
||||
pMCrv->Invert() ; // ripristino la direzione originaria
|
||||
// se richiesto ripristino la direzione originaria
|
||||
if ( ! bStart)
|
||||
pMCrv->Invert() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -3418,7 +3419,6 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double
|
||||
// parametri
|
||||
double dDiam = 2 * PockParams.dRad ;
|
||||
double dOffsR = PockParams.dRadialOffset ;
|
||||
|
||||
bOptimizedTrap = false ;
|
||||
Vector3d vtExtr ; pCrvPocket->GetExtrusion( vtExtr) ;
|
||||
|
||||
@@ -3443,7 +3443,7 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double
|
||||
pCrvPocket->GetCurve( nSecondBase)->GetLength( dLen2) ;
|
||||
bool bRealTrap = ( pCrvPocket->GetCurveCount() == 4) ;
|
||||
for ( int i = 0 ; i < 4 && bRealTrap ; ++ i)
|
||||
bRealTrap = pCrvPocket->GetCurve( i)->GetType() == CRV_LINE ;
|
||||
bRealTrap = ( pCrvPocket->GetCurve( i)->GetType() == CRV_LINE) ;
|
||||
if ( bRealTrap) {
|
||||
pCrvPocket->GetCurve( nBase + 1)->GetLength( dLen1) ;
|
||||
pCrvPocket->GetCurve( nSecondBase + 1)->GetLength( dLen3) ;
|
||||
@@ -3469,13 +3469,17 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double
|
||||
else {
|
||||
// trovo la quota Y per centro del Tool
|
||||
double dYCoord ;
|
||||
if ( pCrvPocket->GetCurve( nBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE) // se base principale chiusa
|
||||
// se base principale chiusa
|
||||
if ( pCrvPocket->GetCurve( nBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE)
|
||||
dYCoord = 0.5 * dDiam + dOffsR ;
|
||||
else if ( pCrvPocket->GetCurve( nSecondBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE) // se base principale aperta e secondaria chiusa
|
||||
// se base principale aperta e secondaria chiusa
|
||||
else if ( pCrvPocket->GetCurve( nSecondBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE)
|
||||
dYCoord = dPocketSize - 0.5 * dDiam - dOffsR ;
|
||||
else // se entrambi i lati paralleli sono aperti mi posiziono a metà della svuotatura
|
||||
// se entrambi i lati paralleli sono aperti mi posiziono a metà della svuotatura
|
||||
else
|
||||
dYCoord = 0.5 * dPocketSize ;
|
||||
|
||||
// determino le quote coordinate in X inziale e finale
|
||||
double dXCoordStart = -INFINITO ;
|
||||
double dXCoordEnd = INFINITO ;
|
||||
if ( ! CalcTrapezoidSpiralXCoord( pCrvPocket, nBase, nSecondBase, true, dYCoord, dXCoordStart,
|
||||
@@ -3486,10 +3490,14 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double
|
||||
return false ;
|
||||
if ( dXCoordStart > dXCoordEnd + 500 * EPS_SMALL)
|
||||
return false ;
|
||||
|
||||
// determino gli estremi del segmento di svuotatura
|
||||
Point3d ptStart( dXCoordStart, dYCoord) ;
|
||||
Point3d ptEnd( dXCoordEnd, dYCoord) ;
|
||||
|
||||
if ( bRealTrap && AreSamePointEpsilon( ptStart, ptEnd, 500 * EPS_SMALL) && ( vnProp[0] != 0 || vnProp[2] != 0)) {
|
||||
// verifico se il punto iniziale e finale coincidono
|
||||
if ( bRealTrap && AreSamePointEpsilon( ptStart, ptEnd, 500 * EPS_SMALL) &&
|
||||
( vnProp[0] != TEMP_PROP_CLOSE_EDGE || vnProp[2] != TEMP_PROP_CLOSE_EDGE)) {
|
||||
Vector3d vtDir1, vtDir3 ;
|
||||
pCrvPocket->GetCurve( 1)->GetStartDir( vtDir1) ;
|
||||
pCrvPocket->GetCurve( 3)->GetStartDir( vtDir3) ;
|
||||
@@ -3532,6 +3540,7 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double
|
||||
pMCrv->SetCurveTempProp( 0, TEMP_PROP_OPEN_EDGE) ;
|
||||
}
|
||||
}
|
||||
// se estremi del segmento differenti, allora il percorso è definito
|
||||
else {
|
||||
if ( ! pMCrv->AddPoint( ptStart))
|
||||
return true ;
|
||||
@@ -3883,7 +3892,7 @@ GetPtStartOnOpenEdgeByOrigCurve( const ICurveComposite* pCrvOrig, const PocketPa
|
||||
double dLen = 0. ;
|
||||
pCrvOpen->GetLength( dLen) ;
|
||||
// se lunghezza accettabile o maggiore della massima trovata
|
||||
if ( dLen > dLenRef) {
|
||||
if ( dLen > dLenRef - 10. * EPS_SMALL) {
|
||||
Point3d ptSTmp ;
|
||||
Vector3d vtMidOutTmp ;
|
||||
// ricavo il punto medio e il vettore tangente ad esso associato
|
||||
|
||||
Reference in New Issue
Block a user