diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 5dce87a..a2303da 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Sawing.cpp b/Sawing.cpp index a8712ff..212ede5 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -1178,26 +1178,27 @@ Sawing::GenerateLinePv( const ICurveLine* pLine, const Vector3d& vtTool, const V m_pGeomDB->SetName( nPxId, sName) ; m_pGeomDB->SetMaterial( nPxId, BLUE) ; - // disabilito eventuale registrazione comandi EXE (riabilitazione automatica) - CmdLogOff cmdLogOff ; - - // rettangolo per parte di taglio completo + // punti notevoli Point3d ptIni = pLine->GetStart() + dElev * vtCorr ; Point3d ptEnd = pLine->GetEnd() + dElev * vtCorr ; Vector3d vtToolH( vtTool.x, vtTool.y, 0) ; vtToolH *= m_TParams.m_dThick / vtToolH.SqLen() ; Point3d ptCross = ptEnd + vtToolH ; Vector3d vtDZ( 0, 0, 0.1) ; - int nId = ExeCreateRectangle3P( nPxId, ptIni + vtDZ, ptCross + vtDZ, ptEnd + vtDZ, RTY_LOC) ; - m_pGeomDB->SetName( nId, MCH_PV_CUT) ; - m_pGeomDB->SetMaterial( nId, LIME) ; - // distanza XY tra centro e bordo taglio double dDeltaT = (( dElev < 0.5 * m_TParams.m_dDiam) ? sqrt( dElev * m_TParams.m_dDiam - dElev * dElev) : 0) ; // direzione del taglio Vector3d vtDir ; pLine->GetStartDir( vtDir) ; + // disabilito eventuale registrazione comandi EXE (riabilitazione automatica) + CmdLogOff cmdLogOff ; + + // rettangolo per parte di taglio completo + int nId = ExeCreateRectangle3P( nPxId, ptIni + vtDZ, ptCross + vtDZ, ptEnd + vtDZ, RTY_LOC) ; + m_pGeomDB->SetName( nId, MCH_PV_CUT) ; + m_pGeomDB->SetMaterial( nId, LIME) ; + // rettangolo per parte parziale iniziale int nId2 = ExeCreateRectangle3P( nPxId, ptIni - vtDir * dDeltaT, ptIni + vtToolH, ptIni, RTY_LOC) ; // assegno nome e colore @@ -1213,37 +1214,81 @@ Sawing::GenerateLinePv( const ICurveLine* pLine, const Vector3d& vtTool, const V // valore di allungamento double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ; + // punti notevoli per regioni + Point3d ptRIni = ptIni ; + Point3d ptRCross = ptCross ; + Point3d ptREnd = ptEnd ; + Vector3d vtRToolH = vtToolH ; // allargamento per taglio sottosquadra (WorkSide e HeadSide sempre opposti) - Vector3d vtOrtho = vtToolH ; - vtOrtho.Normalize() ; if ( m_Params.m_dSideAngle < - EPS_ANG_SMALL) { - ptIni -= vtOrtho * dExtraL ; - ptEnd -= vtOrtho * dExtraL ; - vtToolH += vtOrtho * dExtraL ; + Vector3d vtOrtho = vtToolH ; + vtOrtho.Normalize() ; + ptRIni -= vtOrtho * dExtraL ; + ptREnd -= vtOrtho * dExtraL ; + vtRToolH += vtOrtho * dExtraL ; } // regione di taglio completo per nesting - int nRId = ExeCreateSurfFrRectangle3P( nPxId, ptIni - vtDir * ( dDeltaT + dExtraL), - ptCross + vtDir * ( dDeltaT + dExtraL), ptEnd, RTY_LOC) ; + int nRId = ExeCreateSurfFrRectangle3P( nPxId, ptRIni - vtDir * ( dDeltaT + dExtraL), + ptRCross + vtDir * ( dDeltaT + dExtraL), ptREnd, RTY_LOC) ; m_pGeomDB->SetName( nRId, MCH_PV_RCUT) ; m_pGeomDB->SetMaterial( nRId, INVISIBLE) ; // regione di taglio ridotto per nesting (sono escluse le parti iniziale e finale) const double EXTRALEN_R = 10 * EPS_SMALL ; - int nRrId = ExeCreateSurfFrRectangle3P( nPxId, ptIni - vtDir * EXTRALEN_R, - ptCross + vtDir * EXTRALEN_R, ptEnd, RTY_LOC) ; + int nRrId = ExeCreateSurfFrRectangle3P( nPxId, ptRIni - vtDir * EXTRALEN_R, + ptRCross + vtDir * EXTRALEN_R, ptREnd, RTY_LOC) ; m_pGeomDB->SetName( nRrId, MCH_PV_RRCUT) ; m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ; // regione di ingresso al taglio (parte iniziale) - int nRsId = ExeCreateSurfFrRectangle3P( nPxId, ptIni - vtDir * ( dDeltaT + dExtraL), - ptIni + vtToolH, ptIni, RTY_LOC) ; + int nRsId = ExeCreateSurfFrRectangle3P( nPxId, ptRIni - vtDir * ( dDeltaT + dExtraL), + ptRIni + vtRToolH, ptRIni, RTY_LOC) ; m_pGeomDB->SetName( nRsId, MCH_PV_RLICUT) ; m_pGeomDB->SetMaterial( nRsId, INVISIBLE) ; // regione di uscita dal taglio (parte finale) - int nReId = ExeCreateSurfFrRectangle3P( nPxId, ptEnd, ptCross + vtDir * ( dDeltaT + dExtraL), - ptEnd + vtDir * ( dDeltaT + dExtraL) , RTY_LOC) ; + int nReId = ExeCreateSurfFrRectangle3P( nPxId, ptREnd, ptRCross + vtDir * ( dDeltaT + dExtraL), + ptREnd + vtDir * ( dDeltaT + dExtraL) , RTY_LOC) ; m_pGeomDB->SetName( nReId, MCH_PV_RLOCUT) ; m_pGeomDB->SetMaterial( nReId, INVISIBLE) ; + // eventuali ripetizioni in basso per tagli inclinati + if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) { + // lunghezza movimento + double dMove = ( dElev - dExtraCut) ; + // se sottosquadra (controllo il lato opposto della lama, quindi ...) + if ( m_Params.m_dSideAngle < 0) + dMove -= m_TParams.m_dThick * tan( abs( m_Params.m_dSideAngle) * DEGTORAD) ; + // vettore movimento + Vector3d vtMove = - dMove * vtCorr ; vtMove.z = 0 ; + // rettangolo per parte di taglio completo + int nDwnId = ExeCreateRectangle3P( nPxId, ptIni + vtDZ, ptCross + vtMove + vtDZ, ptEnd + vtDZ, RTY_LOC) ; + m_pGeomDB->SetName( nDwnId, MCH_PV_DOWN_CUT) ; + m_pGeomDB->SetMaterial( nDwnId, LIME) ; + // rettangolo per parte parziale iniziale + int nDwnId2 = ExeCreateRectangle3P( nPxId, ptIni - vtDir * dDeltaT, ptIni + vtToolH + vtMove, ptIni, RTY_LOC) ; + m_pGeomDB->SetName( nDwnId2, MCH_PV_DOWN_PRE_CUT) ; + m_pGeomDB->SetMaterial( nDwnId2, BLUE) ; + // rettangolo per parte parziale finale + int nDwnId3 = ExeCreateRectangle3P( nPxId, ptEnd, ptCross + vtDir * dDeltaT + vtMove, ptEnd + vtDir * dDeltaT, RTY_LOC) ; + m_pGeomDB->SetName( nDwnId3, MCH_PV_DOWN_POST_CUT) ; + m_pGeomDB->SetMaterial( nDwnId3, BLUE) ; + // regione di taglio completo per nesting + int nDwnRId = m_pGeomDB->Copy( nRId, GDB_ID_NULL, nPxId) ; + m_pGeomDB->Translate( nDwnRId, vtMove) ; + m_pGeomDB->SetName( nDwnRId, MCH_PV_DOWN_RCUT) ; + // regione di taglio ridotto per nesting (sono escluse le parti iniziale e finale) + int nDwnRrId = m_pGeomDB->Copy( nRrId, GDB_ID_NULL, nPxId) ; + m_pGeomDB->Translate( nDwnRrId, vtMove) ; + m_pGeomDB->SetName( nDwnRrId, MCH_PV_DOWN_RRCUT) ; + // regione di ingresso al taglio (parte iniziale) + int nDwnRsId = m_pGeomDB->Copy( nRsId, GDB_ID_NULL, nPxId) ; + m_pGeomDB->Translate( nDwnRsId, vtMove) ; + m_pGeomDB->SetName( nDwnRsId, MCH_PV_DOWN_RLICUT) ; + // regione di uscita dal taglio (parte finale) + int nDwnReId = m_pGeomDB->Copy( nReId, GDB_ID_NULL, nPxId) ; + m_pGeomDB->Translate( nDwnReId, vtMove) ; + m_pGeomDB->SetName( nDwnReId, MCH_PV_DOWN_RLOCUT) ; + } + // 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, vtToolH.LenXY()) ; m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_DT, dDeltaT) ; @@ -1274,7 +1319,7 @@ Sawing::GenerateLineCl( const ICurveLine* pLine, const Vector3d& vtTool, const V dAppr /= cos( m_Params.m_dSideAngle * DEGTORAD) ; // Se una sola passata - if ( m_Params.m_dStep < EPS_SMALL) { + if ( m_Params.m_dStep < EPS_SMALL || ( dElev - dExtraCut) <= m_Params.m_dStep) { // 1 -> approccio if ( ! AddApproach( pLine->GetStart(), vtCorr, dSafeZ, dElev, dAppr)) return false ; @@ -1788,7 +1833,7 @@ Sawing::GenerateExtArcCl( const ICurveArc* pArc, const Vector3d& vtStaTool, cons const double MAX_ANG_CEN = 150.0 ; // Se una sola passata - if ( m_Params.m_dStepExtArc < EPS_SMALL) { + if ( m_Params.m_dStepExtArc < EPS_SMALL || ( dElev - dExtraCut) <= m_Params.m_dStepExtArc) { // 1 -> approccio SetToolDir( vtStaTool) ; Point3d ptP1 ; @@ -2415,7 +2460,7 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc, const double MAX_ANG_CEN = 150.0 ; // Se una sola passata - if ( m_Params.m_dStepIntArc < EPS_SMALL) { + if ( m_Params.m_dStepIntArc < EPS_SMALL || ( dElev - dExtraCut) <= m_Params.m_dStepIntArc) { // 1 -> approccio SetToolDir( vtStaTool) ; SetCorrDir( vtStaCorr) ;