EgtMachKernel 1.9j4 :
- modifiche calcolo parte di contorno di faccia da usare in fresatura.
This commit is contained in:
+21
-4
@@ -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() ;
|
||||
|
||||
Reference in New Issue
Block a user