EgtMachKernel 1.6w3 :

- miglioria a separazione grezzo con pezzi piani per tagli e fresate
- in fresatura migliorata applicazione allungamento e accorciamento di percorso
- in fresatura a spirale aperta corretta direzione inizio
- in taglio con lama su archi corretta direzione fresa con attacco/uscita interni
- in taglio con lama su arco interno corretto calcolo preview.
This commit is contained in:
Dario Sassi
2016-11-14 06:23:30 +00:00
parent 1771b5a6ff
commit fbda2e5945
6 changed files with 76 additions and 40 deletions
+41 -12
View File
@@ -1606,7 +1606,7 @@ Sawing::ProcessExtArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
}
// aggiusto per tipo estremi
bool bToSkip = false ;
if ( ! AdjustArcForEdges( pArc, dElev, vtStaThick, vtEndThick, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
if ( ! AdjustArcForEdges( pArc, dElev, 1.0, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForEdges") ;
return false ;
}
@@ -1614,6 +1614,16 @@ Sawing::ProcessExtArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
LOG_INFO( GetEMkLogger(), "Warning in Sawing : skipped Entity too small") ;
return true ;
}
// ricalcolo i versori fresa alle estremità (potrebbero essere cambiate)
pArc->GetStartDir( vtStaDirC) ;
pArc->GetMidDir( vtMidDirC) ;
pArc->GetEndDir( vtEndDirC) ;
if ( ! CalculateToolAndCorrVersors( vtStaDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtStaTool, vtStaCorr) ||
! CalculateToolAndCorrVersors( vtMidDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtMidTool, vtMidCorr) ||
! CalculateToolAndCorrVersors( vtEndDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtEndTool, vtEndCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd") ;
return false ;
}
// Se richiesto Preview
if ( nPvId != GDB_ID_NULL) {
@@ -2233,8 +2243,12 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
bExtAngCN = false ;
}
// aggiusto per tipo estremi
double dCosA = vtStaCorr.z ;
double dSlantElev = dElev / dCosA ;
double dDelta = dElev * dSinA / dCosA + m_TParams.m_dThick * dCosA ; // larghezza impronta
double dLenCoeff = ( dRad + 0.8 * dDelta) / dRad ; // coefficiente per riportare lunghezza
bool bToSkip = false ;
if ( ! AdjustArcForEdges( pArc, dElev, vtStaThick, vtEndThick, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
if ( ! AdjustArcForEdges( pArc, dSlantElev, dLenCoeff, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForEdges") ;
return false ;
}
@@ -2242,11 +2256,21 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
LOG_INFO( GetEMkLogger(), "Warning in Sawing : skipped Entity too small") ;
return true ;
}
// ricalcolo i versori fresa alle estremità (potrebbero essere cambiate)
pArc->GetStartDir( vtStaDirC) ;
pArc->GetMidDir( vtMidDirC) ;
pArc->GetEndDir( vtEndDirC) ;
if ( ! CalculateToolAndCorrVersors( vtStaDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtStaTool, vtStaCorr) ||
! CalculateToolAndCorrVersors( vtMidDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtMidTool, vtMidCorr) ||
! CalculateToolAndCorrVersors( vtEndDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtEndTool, vtEndCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd") ;
return false ;
}
// Se richiesto Preview
if ( nPvId != GDB_ID_NULL) {
if ( ! GenerateIntArcPv( pArc, vtStaTool, vtMidTool, vtEndTool,
vtStaCorr, vtMidCorr, vtEndCorr, dElev, dExtraCut, sName, nPvId))
vtStaCorr, vtMidCorr, vtEndCorr, dElev, dExtraCut, dLenCoeff, sName, nPvId))
return false ;
}
@@ -2268,7 +2292,7 @@ bool
Sawing::GenerateIntArcPv( const ICurveArc* pArc,
const Vector3d& vtStaTool, const Vector3d& vtMidTool, const Vector3d& vtEndTool,
const Vector3d& vtStaCorr, const Vector3d& vtMidCorr, const Vector3d& vtEndCorr,
double dElev, double dExtraCut, const string& sName, int nPvId)
double dElev, double dExtraCut, double dLenCoeff, const string& sName, int nPvId)
{
// creo gruppo per anteprima di lavorazione dell'arco
int nPxId = m_pGeomDB->AddGroup( GDB_ID_NULL, nPvId, Frame3d()) ;
@@ -2280,19 +2304,22 @@ Sawing::GenerateIntArcPv( const ICurveArc* pArc,
// disabilito eventuale registrazione comandi EXE (riabilitazione automatica)
CmdLogOff cmdLogOff ;
// lunghezza taglio parziale
double dDeltaT = (( dElev < 0.5 * m_TParams.m_dDiam) ? sqrt( dElev * m_TParams.m_dDiam - dElev * dElev) : 0) ;
// seno e coseno dell'angolo di sbndamento
// seno e coseno dell'angolo di sbandamento
double dSinA = sqrt( vtStaCorr.x * vtStaCorr.x + vtStaCorr.y * vtStaCorr.y) ;
double dCosA = vtStaCorr.z ;
// elevazione inclinata
double dSlantElev = dElev / dCosA ;
// lunghezza taglio parziale
double dDeltaT = (( dSlantElev < 0.5 * m_TParams.m_dDiam) ? sqrt( dSlantElev * m_TParams.m_dDiam - dSlantElev * dSlantElev) : 0) ;
// scostamenti da linea di lavoro (testa e lavoro sono da parti opposte)
double dDeltaInt = dElev * dSinA / dCosA ;
double dDeltaExt = m_TParams.m_dThick * dCosA ;
// larghezza inclinata della lama
double dSlantThick = m_TParams.m_dThick / dCosA ;
// larghezza inclinata della lama (formula euristica che funziona abbastanza)
double dSlantThick = m_TParams.m_dThick * dCosA ;
// contorno per parte di taglio completo
PtrOwner<ICurveComposite> pCompo( GenerateIntArcPvTrueCut( pArc, dDeltaInt, dDeltaExt, 0)) ;
@@ -2377,7 +2404,7 @@ Sawing::GenerateIntArcPv( const ICurveArc* pArc,
// salvo in info del gruppo la larghezza XY del taglio e la distanza XY tra centro e bordo taglio
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, dDeltaInt + dDeltaExt) ;
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_DT, dDeltaT) ;
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_DT, dDeltaT * dLenCoeff) ;
return true ;
}
@@ -3062,7 +3089,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
//----------------------------------------------------------------------------
bool
Sawing::AdjustArcForEdges( ICurveArc* pArc, double dElev, const Vector3d& vtStaThick, const Vector3d& vtEndThick,
Sawing::AdjustArcForEdges( ICurveArc* pArc, double dElev, double dLenCoeff,
bool bIsFirst, bool bIsLast, bool bExtAngPC, bool bExtAngCN, bool& bToSkip)
{
// --- gli archi non vanno estesi al bordo del grezzo ---
@@ -3081,6 +3108,7 @@ Sawing::AdjustArcForEdges( ICurveArc* pArc, double dElev, const Vector3d& vtStaT
// all'esterno
dDeltaI = dDeltaT ;
}
dDeltaI *= dLenCoeff ;
// verifiche e aggiustamenti sulla fine
double dDeltaF = 0 ;
if ( ! bExtAngCN)
@@ -3089,6 +3117,7 @@ Sawing::AdjustArcForEdges( ICurveArc* pArc, double dElev, const Vector3d& vtStaT
if ( m_Params.m_nLeadOutType == SAW_LO_STRICT)
dDeltaF = - dDeltaT ;
}
dDeltaF *= dLenCoeff ;
// controllo se lunghezza entità accettabile
const double MIN_LEN = 10 ;
double dLenXY ;