EgtMachKernel 1.9j4 :

- modifiche calcolo parte di contorno di faccia da usare in fresatura.
This commit is contained in:
Dario Sassi
2018-10-16 06:40:45 +00:00
parent 7426092d86
commit a23c8e30f5
2 changed files with 21 additions and 4 deletions
BIN
View File
Binary file not shown.
+21 -4
View File
@@ -485,8 +485,9 @@ Operation::GetRawGlobBox( int nPhase, const BBox3d& b3Test, double dToler, BBox3
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
inline Vector3d
GetDirInFacePerpSide( int nFaceUse, const Vector3d& vtN)
GetDirInFacePerpSide( int nFaceUse, const Vector3d& vtN, ICurveComposite* pCrvCompo)
{
// determino la direzione di riferimento proiettata nella faccia
Vector3d vtRef ;
switch ( nFaceUse) {
case FACE_DOWN : vtRef = Z_AX ; break ;
@@ -499,6 +500,22 @@ GetDirInFacePerpSide( int nFaceUse, const Vector3d& vtN)
vtRef -= vtRef * vtN * vtN ;
if ( ! vtRef.Normalize())
vtRef = V_NULL ;
// sostituisco questa direzione con quella perpendicolare alla curva più adatta
double dCosMax = -1 ;
Vector3d vtPerpMax ;
const ICurve* pCrv = pCrvCompo->GetFirstCurve() ;
while ( pCrv != nullptr) {
Vector3d vtDir ; pCrv->GetMidDir( vtDir) ;
Vector3d vtPerp = vtN ^ vtDir ;
double dCos = vtPerp * vtRef ;
if ( dCos > dCosMax) {
dCosMax = dCos ;
vtPerpMax = vtPerp ;
}
pCrv = pCrvCompo->GetNextCurve() ;
}
if ( dCosMax > 0)
vtRef = vtPerpMax ;
return vtRef ;
}
@@ -533,10 +550,10 @@ Operation::AdjustCurveFromSurf( ICurveComposite* pCrvCompo, int nToolDir, int nF
// altrimenti
else {
// determino la direzione di riferimento
Vector3d vtRef = GetDirInFacePerpSide( nFaceUse, vtN) ;
Vector3d vtRef = GetDirInFacePerpSide( nFaceUse, vtN, pCrvCompo) ;
// la curva gira in senso antiorario attorno al contorno faccia vista dalla normale uscente
// elimino i segmenti che hanno la direzione di riferimento a destra o quasi (30deg)
const double COS_ANG_MAX = 0.5 ;
// elimino i segmenti che hanno la direzione di riferimento a destra o quasi (45deg)
const double COS_ANG_MAX = 0.707 ;
// cerco primo elemento del contorno non valido e vi pongo inizio/fine della curva
int i = 0 ;
const ICurve* pCrv = pCrvCompo->GetFirstCurve() ;