EgtMachKernel 2.2f5 :
- prime modifiche a Tabs di fresature per renderli adattativi.
This commit is contained in:
Binary file not shown.
+124
-68
@@ -29,6 +29,7 @@
|
||||
#include "/EgtDev/Include/EGkSfrCreate.h"
|
||||
#include "/EgtDev/Include/EGkSurfTriMesh.h"
|
||||
#include "/EgtDev/Include/EGkExtText.h"
|
||||
#include "/EgtDev/Include/EGkIntervals.h"
|
||||
#include "/EgtDev/Include/EGkUserObjFactory.h"
|
||||
#include "/EgtDev/Include/EGnStringKeyVal.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
@@ -2120,8 +2121,10 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
double dAppr = m_Params.m_dStartPos ;
|
||||
|
||||
// in caso di tabs ne aggiusto i parametri secondo il percorso
|
||||
double dTabsRampLen, dTabsBottomLen, dTabsTopLen ;
|
||||
AdjustTabsParams( pCompo, bPathTabsEnable, dTabsRampLen, dTabsBottomLen, dTabsTopLen) ;
|
||||
TabData tdTabs ;
|
||||
AdjustTabsParams( pCompo, bPathTabsEnable, tdTabs) ;
|
||||
DBLVECTOR vdTabs ;
|
||||
CalcTabsPositions( pCompo, bPathTabsEnable, tdTabs, vdTabs) ;
|
||||
|
||||
// in caso di oscillazione ne aggiusto i parametri secondo il percorso
|
||||
double dOscRampLen, dOscFlatLen ;
|
||||
@@ -2129,7 +2132,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
|
||||
// ciclo sulle curve elementari
|
||||
bool bClosed = pCompo->IsClosed() ;
|
||||
m_dCurrTabsLen = dTabsRampLen + 0.5 * dTabsBottomLen ;
|
||||
m_dCurrTabsLen = 0 ;
|
||||
m_dCurrOscillLen = 2 * dOscRampLen + 1.5 * dOscFlatLen ;
|
||||
int nMaxInd = pCompo->GetCurveCount() - 1 ;
|
||||
for ( int i = 0 ; i <= nMaxInd ; ++ i) {
|
||||
@@ -2208,7 +2211,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
ICurveLine* pLine = GetCurveLine( pCurve) ;
|
||||
SetFeed( GetFeed()) ;
|
||||
if ( bPathTabsEnable) {
|
||||
if ( ! AddTabsLine( pLine, vtTool, dTabsRampLen, dTabsBottomLen, dTabsTopLen))
|
||||
if ( ! AddTabsLine( pLine, vtTool, vdTabs, tdTabs))
|
||||
return false ;
|
||||
}
|
||||
else if ( bPathOscEnable) {
|
||||
@@ -2225,7 +2228,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
ICurveArc* pArc = GetCurveArc( pCurve) ;
|
||||
SetFeed( GetFeed()) ;
|
||||
if ( bPathTabsEnable) {
|
||||
if ( ! AddTabsArc( pArc, vtTool, dTabsRampLen, dTabsBottomLen, dTabsTopLen))
|
||||
if ( ! AddTabsArc( pArc, vtTool, vdTabs, tdTabs))
|
||||
return false ;
|
||||
}
|
||||
else if ( bPathOscEnable) {
|
||||
@@ -4178,66 +4181,111 @@ Milling::AddOscillArc( const ICurveArc* pArc, const Vector3d& vtTool, double dRa
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Milling::AdjustTabsParams( const ICurve* pCrv, bool& bPathTabsEnable, double& dTabsRampLen, double& dTabsBottomLen, double& dTabsTopLen)
|
||||
Milling::AdjustTabsParams( const ICurve* pCrv, bool& bPathTabsEnable, TabData& tdTabs)
|
||||
{
|
||||
// se ci sono i tab cerco di aggiustare le lunghezze dei Bottom per finire con la stessa quota di partenza
|
||||
double dTabLen = m_Params.m_dTabLen + m_TParams.m_dDiam ;
|
||||
double dTabAngle = Clamp( abs( m_Params.m_dTabAngle), 15., 75.) ;
|
||||
dTabsRampLen = min( abs( m_Params.m_dTabHeight) / tan( dTabAngle * DEGTORAD), abs( dTabLen) / 2 - OSC_MIN_LEN) ;
|
||||
dTabsTopLen = abs( dTabLen) - 2 * dTabsRampLen ;
|
||||
dTabsBottomLen = abs( m_Params.m_dTabDist) - abs( dTabLen) ;
|
||||
tdTabs.m_dRampLen = min( abs( m_Params.m_dTabHeight) / tan( dTabAngle * DEGTORAD), abs( dTabLen) / 2 - OSC_MIN_LEN) ;
|
||||
tdTabs.m_dTopLen = abs( dTabLen) - 2 * tdTabs.m_dRampLen ;
|
||||
tdTabs.m_dBottomLen = abs( m_Params.m_dTabDist) - abs( dTabLen) ;
|
||||
if ( bPathTabsEnable) {
|
||||
// lunghezza del percorso
|
||||
double dLen ; pCrv->GetLength( dLen) ; dLen -= m_dAddedOverlap ;
|
||||
// se percorso non permette nemmeno un tab disabilito
|
||||
if ( dLen < ( 2 * dTabsRampLen + 2 * dTabsTopLen)) {
|
||||
if ( dLen < ( 2 * tdTabs.m_dRampLen + 2 * tdTabs.m_dTopLen)) {
|
||||
bPathTabsEnable = false ;
|
||||
m_pMchMgr->SetWarning( 2363, "Warning in Milling : tabs impossible") ;
|
||||
}
|
||||
else {
|
||||
// calcolo numero di tabs e distanza
|
||||
int nTabs = max( static_cast<int>( dLen / ( 2 * dTabsRampLen + dTabsBottomLen + dTabsTopLen)), 1) ;
|
||||
int nTabs = max( static_cast<int>( dLen / ( 2 * tdTabs.m_dRampLen + tdTabs.m_dBottomLen + tdTabs.m_dTopLen)), 1) ;
|
||||
nTabs = min( nTabs, m_Params.m_nTabMax) ;
|
||||
if ( nTabs < m_Params.m_nTabMin) {
|
||||
if ( dLen > ( 2 * dTabsRampLen + 2 * dTabsTopLen) * m_Params.m_nTabMin)
|
||||
if ( dLen > ( 2 * tdTabs.m_dRampLen + 2 * tdTabs.m_dTopLen) * m_Params.m_nTabMin)
|
||||
nTabs = m_Params.m_nTabMin ;
|
||||
else
|
||||
m_pMchMgr->SetWarning( 2364, "Warning in Milling : tabs number less than minimum") ;
|
||||
}
|
||||
dTabsBottomLen = ( dLen - nTabs * ( 2 * dTabsRampLen + dTabsTopLen)) / nTabs ;
|
||||
tdTabs.m_dBottomLen = ( dLen - nTabs * ( 2 * tdTabs.m_dRampLen + tdTabs.m_dTopLen)) / nTabs ;
|
||||
}
|
||||
}
|
||||
// verifico che le lughezze non siano inferiori al minimo
|
||||
tdTabs.m_dRampLen = max( tdTabs.m_dRampLen, OSC_MIN_LEN) ;
|
||||
tdTabs.m_dBottomLen = max( tdTabs.m_dBottomLen, OSC_MIN_LEN) ;
|
||||
tdTabs.m_dTopLen = max( tdTabs.m_dTopLen, OSC_MIN_LEN) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Milling::AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, double dTabsRampLen, double dTabsBottomLen, double dTabsTopLen)
|
||||
Milling::CalcTabsPositions( const ICurveComposite* pCompo, bool bPathTabsEnable, const TabData& tdTabs, DBLVECTOR& vdTabs)
|
||||
{
|
||||
// reset posizioni Tabs
|
||||
vdTabs.clear() ;
|
||||
|
||||
// se Tabs non abilitati, esco
|
||||
if ( ! bPathTabsEnable)
|
||||
return true ;
|
||||
|
||||
// lunghezza del percorso
|
||||
double dLen ; pCompo->GetLength( dLen) ; dLen -= m_dAddedOverlap ;
|
||||
|
||||
// determinazione intervalli validi
|
||||
Intervals ivTabs ;
|
||||
// inizializzo intervallo valido
|
||||
ivTabs.Set( 0, dLen) ;
|
||||
// elimino parti (test)
|
||||
if ( dLen > 300) {
|
||||
ivTabs.Subtract( 0, 100) ;
|
||||
ivTabs.Subtract( dLen - 100, dLen) ;
|
||||
}
|
||||
else {
|
||||
ivTabs.Subtract( 0.4 * dLen, 0.6 * dLen) ;
|
||||
}
|
||||
|
||||
// determino posizioni di inizio dei Tabs
|
||||
double dNextTab = 0.5 * tdTabs.m_dBottomLen ;
|
||||
double dCurrLen = 0 ;
|
||||
while ( dCurrLen + dNextTab < dLen) {
|
||||
vdTabs.emplace_back( dCurrLen + dNextTab) ;
|
||||
dCurrLen += dNextTab + tdTabs.m_dRampLen + tdTabs.m_dTopLen + tdTabs.m_dRampLen ;
|
||||
dNextTab = tdTabs.m_dBottomLen ;
|
||||
}
|
||||
if ( ! vdTabs.empty())
|
||||
vdTabs.emplace_back( dLen + m_dAddedOverlap + 100.) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Milling::AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs)
|
||||
{
|
||||
// lunghezze dei tratti di oscillazione
|
||||
dTabsRampLen = max( dTabsRampLen, OSC_MIN_LEN) ;
|
||||
dTabsBottomLen = max( dTabsBottomLen, OSC_MIN_LEN) ;
|
||||
dTabsTopLen = max( dTabsTopLen, OSC_MIN_LEN) ;
|
||||
double vLenRef[4] = { dTabsRampLen,
|
||||
dTabsRampLen + dTabsBottomLen,
|
||||
dTabsRampLen + dTabsBottomLen + dTabsRampLen,
|
||||
dTabsRampLen + dTabsBottomLen + dTabsRampLen + dTabsTopLen} ;
|
||||
double vLen[4] = { 0,
|
||||
tdTabs.m_dRampLen,
|
||||
tdTabs.m_dRampLen + tdTabs.m_dTopLen,
|
||||
tdTabs.m_dRampLen + tdTabs.m_dTopLen + tdTabs.m_dRampLen} ;
|
||||
// lunghezza della linea
|
||||
double dLen ; pLine->GetLength( dLen) ;
|
||||
// lunghezza corrente sulla linea
|
||||
double dCurrLen = 0 ;
|
||||
// indice corrente di posizione
|
||||
int nI = 0 ;
|
||||
// emissione oscillazioni
|
||||
while ( dCurrLen < dLen - EPS_ZERO) {
|
||||
while ( dCurrLen < dLen - EPS_ZERO && nI < int( vdTabs.size())) {
|
||||
// lunghezze di riferimento dei tratti di oscillazione
|
||||
double vLenRef[4] = { vdTabs[nI] + vLen[0], vdTabs[nI] + vLen[1], vdTabs[nI] + vLen[2], vdTabs[nI] + vLen[3]} ;
|
||||
// lunghezza rimanente
|
||||
double dNextLen = dLen - dCurrLen ;
|
||||
// se inizio è sul primo tratto (rampa discendente)
|
||||
// se inizio è sul primo tratto (parte piatta in basso)
|
||||
if ( m_dCurrTabsLen < vLenRef[0] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[0] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 = pLine->GetEnd() ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( vLenRef[0] - m_dCurrTabsLen) / ( vLenRef[0] - 0)) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
@@ -4259,13 +4307,14 @@ Milling::AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, double dT
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// se inizio è sul secondo tratto (parte piatta in basso)
|
||||
// se inizio è sul secondo tratto (rampa ascendente)
|
||||
else if ( m_dCurrTabsLen < vLenRef[1] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[1] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 = pLine->GetEnd() ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( m_dCurrTabsLen - vLenRef[0]) / ( vLenRef[1] - vLenRef[0])) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
@@ -4274,6 +4323,7 @@ Milling::AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, double dT
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen = vLenRef[1] ;
|
||||
Point3d ptP3 = pLine->GetEnd() ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
@@ -4283,18 +4333,19 @@ Milling::AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, double dT
|
||||
m_dCurrTabsLen = vLenRef[1] ;
|
||||
double dU ; pLine->GetParamAtLength( dCurrLen, dU) ;
|
||||
Point3d ptP3 ; pLine->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// se inizio è sul terzo tratto (rampa ascendente)
|
||||
// se inizio è sul terzo tratto (parte piatta in alto)
|
||||
else if ( m_dCurrTabsLen < vLenRef[2] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[2] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 = pLine->GetEnd() ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( m_dCurrTabsLen - vLenRef[1]) / ( vLenRef[2] - vLenRef[1])) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
@@ -4318,77 +4369,78 @@ Milling::AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, double dT
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// altrimenti è sul quarto tratto (parte piatta in alto)
|
||||
else {
|
||||
// altrimenti è sul quarto tratto (rampa discendente)
|
||||
else if ( m_dCurrTabsLen < vLenRef[3] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[3] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 = pLine->GetEnd() ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( vLenRef[3] - m_dCurrTabsLen) / ( vLenRef[3] - vLenRef[2])) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se fine linea è alla fine del tratto
|
||||
else if ( m_dCurrTabsLen + dNextLen < vLenRef[3] + 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen = 0 ;
|
||||
m_dCurrTabsLen = vLenRef[3] ;
|
||||
Point3d ptP3 = pLine->GetEnd() ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti fine linea è oltre
|
||||
else {
|
||||
dCurrLen += vLenRef[3] - m_dCurrTabsLen ;
|
||||
m_dCurrTabsLen = 0 ;
|
||||
m_dCurrTabsLen = vLenRef[3] ;
|
||||
double dU ; pLine->GetParamAtLength( dCurrLen, dU) ;
|
||||
Point3d ptP3 ; pLine->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// altrimenti passo all'intervallo successivo
|
||||
else
|
||||
++ nI ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Milling::AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, double dTabsRampLen, double dTabsBottomLen, double dTabsTopLen)
|
||||
Milling::AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs)
|
||||
{
|
||||
// lunghezze dei tratti di oscillazione
|
||||
dTabsRampLen = max( dTabsRampLen, OSC_MIN_LEN) ;
|
||||
dTabsBottomLen = max( dTabsBottomLen, OSC_MIN_LEN) ;
|
||||
dTabsTopLen = max( dTabsTopLen, OSC_MIN_LEN) ;
|
||||
double vLenRef[4] = { dTabsRampLen,
|
||||
dTabsRampLen + dTabsBottomLen,
|
||||
dTabsRampLen + dTabsBottomLen + dTabsRampLen,
|
||||
dTabsRampLen + dTabsBottomLen + dTabsRampLen + dTabsTopLen} ;
|
||||
// parametria dell'arco
|
||||
double vLen[4] = { 0,
|
||||
tdTabs.m_dRampLen,
|
||||
tdTabs.m_dRampLen + tdTabs.m_dTopLen,
|
||||
tdTabs.m_dRampLen + tdTabs.m_dTopLen + tdTabs.m_dRampLen} ;
|
||||
// parametri dell'arco
|
||||
Point3d ptCen = pArc->GetCenter() ;
|
||||
double dAngCen = pArc->GetAngCenter() ;
|
||||
Vector3d vtN = pArc->GetNormVersor() ;
|
||||
double dLen ; pArc->GetLength( dLen) ;
|
||||
// lunghezza corrente sull'arco
|
||||
double dCurrLen = 0 ;
|
||||
// indice corrente di posizione
|
||||
int nI = 0 ;
|
||||
// emissione oscillazioni
|
||||
while ( dCurrLen < dLen - EPS_ZERO) {
|
||||
while ( dCurrLen < dLen - EPS_ZERO && nI < int( vdTabs.size())) {
|
||||
// lunghezze di riferimento dei tratti di oscillazione
|
||||
double vLenRef[4] = { vdTabs[nI] + vLen[0], vdTabs[nI] + vLen[1], vdTabs[nI] + vLen[2], vdTabs[nI] + vLen[3]} ;
|
||||
// lunghezza rimanente
|
||||
double dNextLen = dLen - dCurrLen ;
|
||||
// se inizio è sul primo tratto (rampa discendente)
|
||||
// se inizio è sul primo tratto (parte piatta in basso)
|
||||
if ( m_dCurrTabsLen < vLenRef[0] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
// se fine arco è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[0] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( vLenRef[0] - m_dCurrTabsLen) / ( vLenRef[0] - 0)) ;
|
||||
double dCurrAngCen = dAngCen * dNextLen / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se fine linea è alla fine del tratto
|
||||
// se fine arco è alla fine del tratto
|
||||
else if ( m_dCurrTabsLen + dNextLen < vLenRef[0] + 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen = vLenRef[0] ;
|
||||
@@ -4397,7 +4449,7 @@ Milling::AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, double dTabs
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti fine linea è oltre
|
||||
// altrimenti fine arco è oltre
|
||||
else {
|
||||
dCurrLen += vLenRef[0] - m_dCurrTabsLen ;
|
||||
m_dCurrTabsLen = vLenRef[0] ;
|
||||
@@ -4408,50 +4460,53 @@ Milling::AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, double dTabs
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// se inizio è sul secondo tratto (parte piatta in basso)
|
||||
// se inizio è sul secondo tratto (rampa ascendente)
|
||||
else if ( m_dCurrTabsLen < vLenRef[1] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
// se fine arco è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[1] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( m_dCurrTabsLen - vLenRef[0]) / ( vLenRef[1] - vLenRef[0])) ;
|
||||
double dCurrAngCen = dAngCen * dNextLen / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se fine linea è alla fine del tratto
|
||||
// se fine arco è alla fine del tratto
|
||||
else if ( m_dCurrTabsLen + dNextLen < vLenRef[1] + 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen = vLenRef[1] ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
double dCurrAngCen = dAngCen * dNextLen / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti fine linea è oltre
|
||||
// altrimenti fine arco è oltre
|
||||
else {
|
||||
dCurrLen += vLenRef[1] - m_dCurrTabsLen ;
|
||||
m_dCurrTabsLen = vLenRef[1] ;
|
||||
double dU ; pArc->GetParamAtLength( dCurrLen, dU) ;
|
||||
Point3d ptP3 ; pArc->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
double dCurrAngCen = dAngCen * ( dNextLen + dCurrLen - dLen) / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// se inizio è sul terzo tratto (rampa ascendente)
|
||||
// se inizio è sul terzo tratto (parte piatta in alto)
|
||||
else if ( m_dCurrTabsLen < vLenRef[2] - 10 * EPS_SMALL) {
|
||||
// se fine linea è entro il tratto
|
||||
// se fine arco è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[2] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( m_dCurrTabsLen - vLenRef[1]) / ( vLenRef[2] - vLenRef[1])) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
double dCurrAngCen = dAngCen * dNextLen / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se fine linea è alla fine del tratto
|
||||
// se fine arco è alla fine del tratto
|
||||
else if ( m_dCurrTabsLen + dNextLen < vLenRef[2] + 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen = vLenRef[2] ;
|
||||
@@ -4461,7 +4516,7 @@ Milling::AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, double dTabs
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti fine linea è oltre
|
||||
// altrimenti fine arco è oltre
|
||||
else {
|
||||
dCurrLen += vLenRef[2] - m_dCurrTabsLen ;
|
||||
m_dCurrTabsLen = vLenRef[2] ;
|
||||
@@ -4473,40 +4528,41 @@ Milling::AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, double dTabs
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// altrimenti è sul quarto tratto (parte piatta in alto)
|
||||
else {
|
||||
// se fine linea è entro il tratto
|
||||
// altrimenti è sul quarto tratto (rampa discendente)
|
||||
else if ( m_dCurrTabsLen < vLenRef[3] - 10 * EPS_SMALL) {
|
||||
// se fine arco è entro il tratto
|
||||
if ( m_dCurrTabsLen + dNextLen < vLenRef[3] - 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen += dNextLen ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
ptP3 += vtTool * ( abs( m_Params.m_dTabHeight) * ( vLenRef[3] - m_dCurrTabsLen) / ( vLenRef[3] - vLenRef[2])) ;
|
||||
double dCurrAngCen = dAngCen * dNextLen / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se fine linea è alla fine del tratto
|
||||
// se fine arco è alla fine del tratto
|
||||
else if ( m_dCurrTabsLen + dNextLen < vLenRef[3] + 10 * EPS_SMALL) {
|
||||
dCurrLen = dLen ;
|
||||
m_dCurrTabsLen = 0 ;
|
||||
m_dCurrTabsLen = vLenRef[3] ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
double dCurrAngCen = dAngCen * dNextLen / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti fine linea è oltre
|
||||
// altrimenti fine arco è oltre
|
||||
else {
|
||||
dCurrLen += vLenRef[3] - m_dCurrTabsLen ;
|
||||
m_dCurrTabsLen = 0 ;
|
||||
m_dCurrTabsLen = vLenRef[3] ;
|
||||
double dU ; pArc->GetParamAtLength( dCurrLen, dU) ;
|
||||
Point3d ptP3 ; pArc->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP3) ;
|
||||
ptP3 += vtTool * abs( m_Params.m_dTabHeight) ;
|
||||
double dCurrAngCen = dAngCen * ( dNextLen + dCurrLen - dLen) / dLen ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// altrimenti passo all'intervallo successivo
|
||||
else
|
||||
++ nI ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -69,6 +69,13 @@ class Milling : public Machining
|
||||
public :
|
||||
Milling( void) ;
|
||||
|
||||
private :
|
||||
struct TabData {
|
||||
double m_dBottomLen ;
|
||||
double m_dRampLen ;
|
||||
double m_dTopLen ;
|
||||
} ;
|
||||
|
||||
private :
|
||||
bool VerifyGeometry( SelData Id, int& nSubs, int& nType) ;
|
||||
bool GetCurves( SelData Id, ICURVEPLIST& lstPC) ;
|
||||
@@ -102,9 +109,10 @@ class Milling : public Machining
|
||||
bool AdjustOscillParams( const ICurve* pCrv, bool& bPathOscEnable, double& dRampLen, double& dFlatLen) ;
|
||||
bool AddOscillLine( const ICurveLine* pLine, const Vector3d& vtTool, double dRampLen, double dFlatLen) ;
|
||||
bool AddOscillArc( const ICurveArc* pArc, const Vector3d& vtTool, double dRampLen, double dFlatLen) ;
|
||||
bool AdjustTabsParams( const ICurve* pCrv, bool& bPathTabsEnable, double& dTabsRampLen, double& dTabsBottomLen, double& dTabsTopLen) ;
|
||||
bool AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, double dTabsRampLen, double dTabsBottomLen, double dTabsTopLen) ;
|
||||
bool AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, double dTabsRampLen, double dTabsBottomLen, double dTabsTopLen) ;
|
||||
bool AdjustTabsParams( const ICurve* pCrv, bool& bPathTabsEnable, TabData& tdTabs) ;
|
||||
bool CalcTabsPositions( const ICurveComposite* pCompo, bool bPathTabsEnable, const TabData& tdTabs, DBLVECTOR& vdTabs) ;
|
||||
bool AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs) ;
|
||||
bool AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs) ;
|
||||
double GetRadiusForStartEndElevation( void) const ;
|
||||
bool GetPointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, double dElev) const ;
|
||||
bool GetPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool) const ;
|
||||
|
||||
Reference in New Issue
Block a user