EgtMachKernel :
- in svuotature a spirale corretti i casi in cui il valore dell'offset è pari al valore limite per la curva.
This commit is contained in:
+111
-101
@@ -501,15 +501,15 @@ Pocketing::SetParam( int nType, const string& sVal)
|
||||
bool
|
||||
Pocketing::SetGeometry( const SELVECTOR& vIds)
|
||||
{
|
||||
// verifico validità gestore DB geometrico
|
||||
// verifico validità gestore DB geometrico
|
||||
if ( m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
// reset della geometria corrente
|
||||
m_vId.clear() ;
|
||||
// verifico che gli identificativi rappresentino delle entità ammissibili (tutte curve o tutte facce)
|
||||
// verifico che gli identificativi rappresentino delle entità ammissibili (tutte curve o tutte facce)
|
||||
int nType = GEO_NONE ;
|
||||
for ( const auto& Id : vIds) {
|
||||
// test sull'entità
|
||||
// test sull'entità
|
||||
int nSubs ;
|
||||
if ( ! VerifyGeometry( Id, nSubs, nType)) {
|
||||
string sInfo = "Warning in Pocketing : Skipped entity " + ToString( Id) ;
|
||||
@@ -532,14 +532,14 @@ Pocketing::Preview( bool bRecalc)
|
||||
// reset numero percorsi di svuotatura generati
|
||||
m_nPockets = 0 ;
|
||||
|
||||
// verifico validità gestore DB geometrico e Id del gruppo
|
||||
// verifico validità gestore DB geometrico e Id del gruppo
|
||||
if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId))
|
||||
return false ;
|
||||
|
||||
// recupero gruppo per geometria ausiliaria
|
||||
int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ;
|
||||
bool bChain = false ;
|
||||
// se non c'è, lo aggiungo
|
||||
// se non c'è, lo aggiungo
|
||||
if ( nAuxId == GDB_ID_NULL) {
|
||||
nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
|
||||
if ( nAuxId == GDB_ID_NULL)
|
||||
@@ -582,7 +582,7 @@ Pocketing::Preview( bool bRecalc)
|
||||
|
||||
// recupero gruppo per geometria di Preview
|
||||
int nPvId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_PV) ;
|
||||
// se non c'è, lo aggiungo
|
||||
// se non c'è, lo aggiungo
|
||||
if ( nPvId == GDB_ID_NULL) {
|
||||
nPvId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
|
||||
if ( nPvId == GDB_ID_NULL)
|
||||
@@ -615,7 +615,7 @@ Pocketing::Apply( bool bRecalc, bool bPostApply)
|
||||
// reset raggio massimo attacco ad elica nel caso di cerchi
|
||||
m_dMaxHelixRad = INFINITO ;
|
||||
|
||||
// verifico validità gestore DB geometrico e Id del gruppo
|
||||
// verifico validità gestore DB geometrico e Id del gruppo
|
||||
if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId))
|
||||
return false ;
|
||||
|
||||
@@ -644,7 +644,7 @@ Pocketing::Apply( bool bRecalc, bool bPostApply)
|
||||
// recupero gruppo per geometria ausiliaria
|
||||
int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ;
|
||||
bool bChain = false ;
|
||||
// se non c'è, lo aggiungo
|
||||
// se non c'è, lo aggiungo
|
||||
if ( nAuxId == GDB_ID_NULL) {
|
||||
nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
|
||||
if ( nAuxId == GDB_ID_NULL)
|
||||
@@ -675,7 +675,7 @@ Pocketing::Apply( bool bRecalc, bool bPostApply)
|
||||
|
||||
// recupero gruppo per geometria di lavorazione (Cutter Location)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ;
|
||||
// se non c'è, lo aggiungo
|
||||
// se non c'è, lo aggiungo
|
||||
if ( nClId == GDB_ID_NULL) {
|
||||
nClId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
|
||||
if ( nClId == GDB_ID_NULL)
|
||||
@@ -737,7 +737,7 @@ Pocketing::Apply( bool bRecalc, bool bPostApply)
|
||||
bool
|
||||
Pocketing::Update( bool bPostApply)
|
||||
{
|
||||
// verifico validità gestore DB geometrico e Id del gruppo
|
||||
// verifico validità gestore DB geometrico e Id del gruppo
|
||||
if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId))
|
||||
return false ;
|
||||
|
||||
@@ -747,7 +747,7 @@ Pocketing::Update( bool bPostApply)
|
||||
return true ;
|
||||
}
|
||||
|
||||
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
|
||||
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
|
||||
RemoveClimbRiseHome() ;
|
||||
|
||||
// imposto eventuale asse bloccato da lavorazione
|
||||
@@ -994,7 +994,7 @@ Pocketing::UpdateToolData( bool* pbChanged)
|
||||
bool
|
||||
Pocketing::GetGeometry( SELVECTOR& vIds) const
|
||||
{
|
||||
// restituisco l'elenco delle entità
|
||||
// restituisco l'elenco delle entità
|
||||
vIds = m_vId ;
|
||||
return true ;
|
||||
}
|
||||
@@ -1007,7 +1007,7 @@ Pocketing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( Id.nId) ;
|
||||
if ( pGObj == nullptr)
|
||||
return false ;
|
||||
// se ammesse curve ed è tale
|
||||
// se ammesse curve ed è tale
|
||||
if ( ( nType == GEO_NONE || nType == GEO_CURVE) && ( pGObj->GetType() & GEO_CURVE) != 0) {
|
||||
nType = GEO_CURVE ;
|
||||
const ICurve* pCurve = nullptr ;
|
||||
@@ -1031,7 +1031,7 @@ Pocketing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
// se altrimenti ammessi testi ed è tale
|
||||
// se altrimenti ammessi testi ed è tale
|
||||
else if ( ( nType == GEO_NONE || nType == EXT_TEXT) && pGObj->GetType() == EXT_TEXT) {
|
||||
nType = EXT_TEXT ;
|
||||
const IExtText* pText = ::GetExtText( pGObj) ;
|
||||
@@ -1040,7 +1040,7 @@ Pocketing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
nSubs = 0 ;
|
||||
return true ;
|
||||
}
|
||||
// se altrimenti ammesse superfici trimesh ed è tale
|
||||
// se altrimenti ammesse superfici trimesh ed è tale
|
||||
else if ( ( nType == GEO_NONE || nType == SRF_TRIMESH) && pGObj->GetType() == SRF_TRIMESH) {
|
||||
nType = SRF_TRIMESH ;
|
||||
const ISurfTriMesh* pSurf = ::GetSurfTriMesh( pGObj) ;
|
||||
@@ -1062,7 +1062,7 @@ Pocketing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
// se altrimenti ammesse regioni ed è tale
|
||||
// se altrimenti ammesse regioni ed è tale
|
||||
else if ( ( nType == GEO_NONE || nType == SRF_FLATRGN) && pGObj->GetType() == SRF_FLATRGN) {
|
||||
nType = SRF_FLATRGN ;
|
||||
const ISurfFlatRegion* pReg = ::GetSurfFlatRegion( pGObj) ;
|
||||
@@ -1129,7 +1129,7 @@ Pocketing::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
return false ;
|
||||
// la duplico
|
||||
pCurve.Set( pOriCurve->Clone()) ;
|
||||
// reset proprietà temporanee
|
||||
// reset proprietà temporanee
|
||||
ResetCurveAllTempProp( pCurve) ;
|
||||
// recupero estrusione e spessore
|
||||
Vector3d vtExtr ;
|
||||
@@ -1157,7 +1157,7 @@ Pocketing::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
// recupero l'outline del testo
|
||||
if ( ! pText->GetOutline( lstPC))
|
||||
return false ;
|
||||
// reset proprietà temporanee
|
||||
// reset proprietà temporanee
|
||||
for ( auto pCrv : lstPC)
|
||||
ResetCurveAllTempProp( pCrv) ;
|
||||
// porto le curve in globale
|
||||
@@ -1184,16 +1184,16 @@ Pocketing::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
pCrvCompo->FromPolyLine( vPL[0]) ;
|
||||
if ( ! pCrvCompo->IsValid())
|
||||
return false ;
|
||||
// reset proprietà temporanee
|
||||
// reset proprietà temporanee
|
||||
ResetCurveAllTempProp( pCrvCompo) ;
|
||||
// determino eventuali lati aperti e aggiorno proprietà del contorno
|
||||
// determino eventuali lati aperti e aggiorno proprietà del contorno
|
||||
int nInd = 0 ;
|
||||
double dPar ;
|
||||
bool bFound = vPL[0].GetFirstU( dPar, true) ;
|
||||
while ( bFound) {
|
||||
// recupero il flag
|
||||
int nFlag = int( dPar) ;
|
||||
// se non c'è nulla di adiacente, lato aperto
|
||||
// se non c'è nulla di adiacente, lato aperto
|
||||
if ( nFlag == SVT_NULL)
|
||||
pCrvCompo->SetCurveTempProp( nInd, 1) ;
|
||||
// altrimenti verifico se la faccia adiacente forma diedro convesso o concavo
|
||||
@@ -1250,7 +1250,7 @@ Pocketing::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
PtrOwner<ICurveComposite> pCrvCompo ;
|
||||
if ( ! pCrvCompo.Set( ConvertCurveToComposite( pReg->GetLoop( nC, nL))))
|
||||
return false ;
|
||||
// reset proprietà temporanee
|
||||
// reset proprietà temporanee
|
||||
ResetCurveAllTempProp( pCrvCompo) ;
|
||||
// assegno l'estrusione dalla normale alla regione
|
||||
pCrvCompo->SetExtrusion( vtN) ;
|
||||
@@ -1279,7 +1279,7 @@ Pocketing::SetCurveAllTempProp( int nCrvId, bool bForcedClose, ICurve* pCurve, b
|
||||
return false ;
|
||||
if ( pbSomeOpen != nullptr)
|
||||
*pbSomeOpen = false ;
|
||||
// reset proprietà temporanee
|
||||
// reset proprietà temporanee
|
||||
ResetCurveAllTempProp( pCurve) ;
|
||||
// se forzato chiuso o non presenti info per lati aperti, esco
|
||||
if ( bForcedClose || ! m_pGeomDB->ExistsInfo( nCrvId, KEY_OPEN))
|
||||
@@ -1448,7 +1448,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
// recupero gruppo per geometria temporanea
|
||||
const string GRP_TEMP = "Temp" ;
|
||||
int nTempId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, GRP_TEMP) ;
|
||||
// se non c'è, lo aggiungo
|
||||
// se non c'è, lo aggiungo
|
||||
if ( nTempId == GDB_ID_NULL) {
|
||||
nTempId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
|
||||
if ( nTempId == GDB_ID_NULL)
|
||||
@@ -1530,7 +1530,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
Point3d ptMidOpen ;
|
||||
Vector3d vtMidOut ;
|
||||
if ( bSomeOpen) {
|
||||
// ricerca del punto medio del lato aperto più lungo
|
||||
// ricerca del punto medio del lato aperto più lungo
|
||||
bMidOpen = GetMidOfLongestOpenSide( pCompo, ptMidOpen, vtMidOut) ;
|
||||
// sistemazioni per eventuali lati aperti
|
||||
if ( ! AdjustContourWithOpenEdges( pCompo)) {
|
||||
@@ -1539,7 +1539,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
}
|
||||
}
|
||||
|
||||
// sposto l'inizio a metà del tratto più lungo ( o aperto più lungo)
|
||||
// sposto l'inizio a metà del tratto più lungo ( o aperto più lungo)
|
||||
if ( bMidOpen) {
|
||||
const double LEN_OUT = 5 ;
|
||||
double dPar ; int nFlag ;
|
||||
@@ -1623,7 +1623,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
}
|
||||
|
||||
// verifico di non superare il massimo materiale
|
||||
// se lo step supera la capacità dell'utensile
|
||||
// se lo step supera la capacità dell'utensile
|
||||
if ( m_Params.m_dStep > m_TParams.m_dMaxMat + EPS_SMALL) {
|
||||
dOkStep = m_TParams.m_dMaxMat + EPS_SMALL ;
|
||||
string sInfo = "Warning in Pocketing : machining step (" + ToString( m_Params.m_dStep, 1) +
|
||||
@@ -1632,7 +1632,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
}
|
||||
// se lavorazione singola
|
||||
if ( dOkStep < EPS_SMALL || dOkStep > dElev) {
|
||||
// se l'elevazione supera la capacità dell'utensile
|
||||
// se l'elevazione supera la capacità dell'utensile
|
||||
if ( dElev > m_TParams.m_dMaxMat + EPS_SMALL) {
|
||||
string sInfo = "Warning in Pocketing : machining depth (" + ToString( dElev, 1) +
|
||||
") bigger than MaxMaterial (" + ToString( m_TParams.m_dMaxMat, 1) + ")" ;
|
||||
@@ -1830,10 +1830,10 @@ Pocketing::CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& v
|
||||
bool
|
||||
Pocketing::VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool)
|
||||
{
|
||||
// se non è svuotatura dal basso in alto, esco
|
||||
// se non è svuotatura dal basso in alto, esco
|
||||
if ( vtTool.z > MIN_ZDIR_TOP_TOOL)
|
||||
return true ;
|
||||
// se c'è testa non dall'alto o tavola basculante, esco
|
||||
// se c'è testa non dall'alto o tavola basculante, esco
|
||||
if ( ! m_bAboveHead || m_bTiltingTab)
|
||||
return true ;
|
||||
// recupero dati di eventuale rinvio da sotto
|
||||
@@ -1855,7 +1855,7 @@ Pocketing::VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d&
|
||||
! vtCurrDir.IsSmallXY()) {
|
||||
if ( dCurrDist < dMinDist - 10 * EPS_SMALL &&
|
||||
find_if( vDir.begin(), vDir.end(), [&](const Vector3d& vtV){ return vtCurrDir * vtV > cos( 15 * DEGTORAD) ; }) == vDir.end()) {
|
||||
// inserisco la direzione tra quelle già esplorate
|
||||
// inserisco la direzione tra quelle già esplorate
|
||||
vDir.emplace_back( vtCurrDir) ;
|
||||
// determino la distanza di tutti gli altri punti dal contorno del grezzo lungo questa direzione
|
||||
for ( double dPar2 = dParS ; dPar2 < dParE + EPS_PARAM ; dPar2 += 0.5) {
|
||||
@@ -1867,7 +1867,7 @@ Pocketing::VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d&
|
||||
dCurrDist = dQDist ;
|
||||
}
|
||||
}
|
||||
// se la massima distanza trovata è inferiore al minimo, lo aggiorno
|
||||
// se la massima distanza trovata è inferiore al minimo, lo aggiorno
|
||||
if ( dCurrDist < dMinDist) {
|
||||
dMinDist = dCurrDist ;
|
||||
vtMinDir = vtCurrDir ;
|
||||
@@ -2008,7 +2008,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
vpCrvs[0]->ExtendStartByLen( m_TParams.m_dDiam / 2 - dOptZigZagOffs + dSafeZ) ;
|
||||
}
|
||||
|
||||
// se non ottimizzato e utensile che non lavora di testa poichè ingresso non fuori dal pezzo, errore
|
||||
// se non ottimizzato e utensile che non lavora di testa poichè ingresso non fuori dal pezzo, errore
|
||||
if ( ( ! bOptimizedZigZag || ! ( bOutRawLeadIn || m_bOpenOutRaw)) && m_TParams.m_nType == TT_MILL_NOTIP) {
|
||||
if ( ! LeadInRawIsOk()) {
|
||||
m_pMchMgr->SetLastError( 2431, "Error in Pocketing : LeadIn with Mill NoTip in material") ;
|
||||
@@ -2106,9 +2106,9 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
pCurve->ToGlob( frPocket) ;
|
||||
// aggiungo affondamento
|
||||
pCurve->Translate( - vtTool * ( dDepth - dElev + j * dStep)) ;
|
||||
// se prima entità
|
||||
// se prima entità
|
||||
if ( i == 0 ) {
|
||||
// dati inizio entità
|
||||
// dati inizio entità
|
||||
Point3d ptStart ;
|
||||
pCurve->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStart ;
|
||||
@@ -2180,9 +2180,9 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se ultima entità
|
||||
// se ultima entità
|
||||
if ( i == nMaxInd) {
|
||||
// dati fine entità
|
||||
// dati fine entità
|
||||
Point3d ptEnd ;
|
||||
pCurve->GetEndPoint( ptEnd) ;
|
||||
Vector3d vtEnd ;
|
||||
@@ -2251,7 +2251,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
if ( m_Params.m_bInvert)
|
||||
pOffs2->Invert() ;
|
||||
|
||||
// sposto l'inizio a metà del tratto più lungo
|
||||
// sposto l'inizio a metà del tratto più lungo
|
||||
AdjustContourStart( pOffs2) ;
|
||||
|
||||
// aggiungo la lavorazione di questa curva
|
||||
@@ -2268,9 +2268,9 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
return false ;
|
||||
// aggiungo affondamento
|
||||
pCurve->Translate( - vtTool * ( dDepth - dElev + j * dStep)) ;
|
||||
// se prima entità
|
||||
// se prima entità
|
||||
if ( i == 0 ) {
|
||||
// dati inizio entità
|
||||
// dati inizio entità
|
||||
Point3d ptStart ;
|
||||
pCurve->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStart ;
|
||||
@@ -2342,11 +2342,11 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se ultima entità
|
||||
// se ultima entità
|
||||
if ( i == nMaxInd) {
|
||||
// se ultimo step, uscita e retrazione di collegamento
|
||||
if ( j == nStep) {
|
||||
// dati fine entità
|
||||
// dati fine entità
|
||||
Point3d ptEnd ;
|
||||
pCurve->GetEndPoint( ptEnd) ;
|
||||
Vector3d vtEnd ;
|
||||
@@ -2659,7 +2659,7 @@ Pocketing::OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth,
|
||||
ptTest.ToGlob( frPocket) ;
|
||||
ptTest += - vtTool * dDepth ;
|
||||
double dTestElev ;
|
||||
// se è nel grezzo provo a ruotare di 90 gradi
|
||||
// se è nel grezzo provo a ruotare di 90 gradi
|
||||
if ( GetElevation( m_nPhase, ptTest, vtTool, m_TParams.m_dDiam / 2 - dOffs, vtTool, dTestElev) && dTestElev > EPS_SMALL) {
|
||||
Vector3d vtDirO = vtDir ;
|
||||
vtDirO.Rotate( Z_AX, ( m_Params.m_bInvert ? -90 : 90)) ;
|
||||
@@ -2667,7 +2667,7 @@ Pocketing::OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth,
|
||||
ptTestO.ToGlob( frPocket) ;
|
||||
ptTestO += - vtTool * dDepth ;
|
||||
double dTestElevO ;
|
||||
// se è fuori dal grezzo uso inizio ruotato
|
||||
// se è fuori dal grezzo uso inizio ruotato
|
||||
if ( ! GetElevation( m_nPhase, ptTestO, vtTool, m_TParams.m_dDiam / 2 - dOffs, vtTool, dTestElevO) || dTestElevO < EPS_SMALL) {
|
||||
Point3d ptNewStart = ptStart + vtDirO ;
|
||||
vpCrvs[0]->AddLine( ptNewStart, false) ;
|
||||
@@ -2703,7 +2703,7 @@ Pocketing::OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth,
|
||||
bool
|
||||
Pocketing::ZigZagOptimizedNoClosedEdges( ICurveComposite* pCrvPocket, bool& bOptimizedZigZag, Vector3d& vtDir, double& dOffs)
|
||||
{
|
||||
// individuo il segmento di retta più lungo
|
||||
// individuo il segmento di retta più lungo
|
||||
int nMax = -1 ;
|
||||
double dMaxLen = 0 ;
|
||||
for ( int i = 0 ; i < int( pCrvPocket->GetCurveCount()) ; ++ i) {
|
||||
@@ -2751,7 +2751,7 @@ Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClose
|
||||
pCrv->ExtendStartByLen( 300) ;
|
||||
pCrv->ExtendEndByLen( 300) ;
|
||||
|
||||
// sarà la prima curva del percorso
|
||||
// sarà la prima curva del percorso
|
||||
if ( ! CutCurveWithLine( pCrvPocket, pCrv))
|
||||
return false ;
|
||||
|
||||
@@ -2797,7 +2797,7 @@ Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INT
|
||||
pCrv1->SetExtrusion( vtExtr) ;
|
||||
pCrv2->SetExtrusion( vtExtr) ;
|
||||
|
||||
// determino la curva chiusa più lunga
|
||||
// determino la curva chiusa più lunga
|
||||
double dLen1 ; pCrv1->GetLength( dLen1) ;
|
||||
double dLen2 ; pCrv2->GetLength( dLen2) ;
|
||||
|
||||
@@ -2822,7 +2822,7 @@ Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INT
|
||||
if ( ! CutCurveWithLine( pCrvPocket, pCrv1))
|
||||
return false ;
|
||||
|
||||
// sarà la prima curva del percorso
|
||||
// sarà la prima curva del percorso
|
||||
pCrv2->SimpleOffset( -dMyOffs) ;
|
||||
pCrv2->ExtendStartByLen( 300) ;
|
||||
pCrv2->ExtendEndByLen( 300) ;
|
||||
@@ -2910,7 +2910,7 @@ Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const I
|
||||
if ( ! CutCurveWithLine( pCrvPocket, pCrv3))
|
||||
return false ;
|
||||
|
||||
// sarà la prima curva del percorso
|
||||
// sarà la prima curva del percorso
|
||||
pCrv2->SimpleOffset( -dMyOffs) ;
|
||||
pCrv2->ExtendStartByLen( 300) ;
|
||||
pCrv2->ExtendEndByLen( 300) ;
|
||||
@@ -2926,7 +2926,7 @@ Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const I
|
||||
Pocketing::ZigZagOptimizedComputeOffset( ICurveComposite* pCrvPocket, const Vector3d& vtMainDir, int nOffsettedEdgesOnY,
|
||||
const INTVECTOR& vnClosedIds, double& dOffs)
|
||||
{
|
||||
// calcolo il side step che verrà utilizzato in CalcZigZag
|
||||
// calcolo il side step che verrà utilizzato in CalcZigZag
|
||||
Frame3d frLoc ;
|
||||
if ( ! frLoc.Set( ORIG, Z_AX, vtMainDir))
|
||||
return true ;
|
||||
@@ -3048,7 +3048,7 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
// lunghezza di approccio/retrazione
|
||||
double dAppr = m_Params.m_dStartPos ;
|
||||
|
||||
// se utensile che non lavora di testa poichè ingresso non fuori dal pezzo, errore
|
||||
// se utensile che non lavora di testa poichè ingresso non fuori dal pezzo, errore
|
||||
if ( m_TParams.m_nType == TT_MILL_NOTIP) {
|
||||
if ( ! LeadInRawIsOk()) {
|
||||
m_pMchMgr->SetLastError( 2431, "Error in Pocketing : LeadIn with Mill NoTip in material") ;
|
||||
@@ -3084,7 +3084,7 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
if ( m_Params.m_bInvert)
|
||||
pOffs->Invert() ;
|
||||
|
||||
// sposto l'inizio a metà del tratto più lungo
|
||||
// sposto l'inizio a metà del tratto più lungo
|
||||
AdjustContourStart( pOffs) ;
|
||||
|
||||
// se necessario, approssimo con rette
|
||||
@@ -3115,9 +3115,9 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
return false ;
|
||||
// aggiungo affondamento
|
||||
pCurve->Translate( - vtTool * ( dDepth - dElev + j * dStep)) ;
|
||||
// se prima entità
|
||||
// se prima entità
|
||||
if ( i == 0 ) {
|
||||
// dati inizio entità
|
||||
// dati inizio entità
|
||||
Point3d ptStart ;
|
||||
pCurve->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStart ;
|
||||
@@ -3188,11 +3188,11 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se ultima entità
|
||||
// se ultima entità
|
||||
if ( i == nMaxInd) {
|
||||
// se ultimo step, uscita e retrazione di collegamento
|
||||
if ( j == nStep) {
|
||||
// dati fine entità
|
||||
// dati fine entità
|
||||
Point3d ptEnd ;
|
||||
pCurve->GetEndPoint( ptEnd) ;
|
||||
Vector3d vtEnd ;
|
||||
@@ -3465,9 +3465,9 @@ Pocketing::AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, c
|
||||
return false ;
|
||||
// aggiungo affondamento
|
||||
pCurve->Translate( - vtTool * ( dDepth - dElev + j * dStep)) ;
|
||||
// se prima entità
|
||||
// se prima entità
|
||||
if ( i == 0 ) {
|
||||
// dati inizio entità
|
||||
// dati inizio entità
|
||||
Point3d ptStart ;
|
||||
pCurve->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStart ;
|
||||
@@ -3477,7 +3477,7 @@ Pocketing::AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, c
|
||||
// determino inizio attacco
|
||||
if ( ! CalcLeadInStart( ptStart, vtStart, vtExtr, pRCrv, ptP1))
|
||||
return false ;
|
||||
// determino elevazione su inizio attacco (se non trovata, elevazione è step)
|
||||
// determino elevazione su inizio attacco (se non trovata, elevazione è step)
|
||||
double dStElev ;
|
||||
if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev))
|
||||
dStElev = dStep ;
|
||||
@@ -3538,7 +3538,7 @@ Pocketing::AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, c
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se ultima entità
|
||||
// se ultima entità
|
||||
if ( i == nMaxInd) {
|
||||
// se step intermedio, ritorno all'inizio direttamente
|
||||
if ( j < nStep) {
|
||||
@@ -3566,7 +3566,7 @@ Pocketing::AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, c
|
||||
}
|
||||
// atrimenti ultimo step, uscita e retrazione
|
||||
else {
|
||||
// dati fine entità
|
||||
// dati fine entità
|
||||
Point3d ptEnd ;
|
||||
pCurve->GetEndPoint( ptEnd) ;
|
||||
Vector3d vtEnd ;
|
||||
@@ -3661,7 +3661,7 @@ Pocketing::AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
}
|
||||
}
|
||||
|
||||
// inverto i percorsi, perchè sono calcolati dall'esterno all'interno (solo nel caso non ottimizzato)
|
||||
// inverto i percorsi, perchè sono calcolati dall'esterno all'interno (solo nel caso non ottimizzato)
|
||||
if ( ! bOptimizedTrap) {
|
||||
pMCrv->Invert() ;
|
||||
pRCrv->Invert() ;
|
||||
@@ -3691,9 +3691,9 @@ Pocketing::AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
return false ;
|
||||
// aggiungo affondamento
|
||||
pCurve->Translate( -vtTool * ( dDepth - dElev + j * dStep)) ;
|
||||
// se prima entità
|
||||
// se prima entità
|
||||
if ( i == 0 ) {
|
||||
// dati inizio entità
|
||||
// dati inizio entità
|
||||
Point3d ptStart ;
|
||||
pCurve->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStart ;
|
||||
@@ -3766,7 +3766,7 @@ Pocketing::AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se ultima entità
|
||||
// se ultima entità
|
||||
if ( i == nMaxInd) {
|
||||
// se step intermedio
|
||||
if ( j < nStep) {
|
||||
@@ -3794,7 +3794,7 @@ Pocketing::AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
}
|
||||
// atrimenti ultimo step, uscita e retrazione
|
||||
else {
|
||||
// dati fine entità
|
||||
// dati fine entità
|
||||
Point3d ptEnd ;
|
||||
pCurve->GetEndPoint( ptEnd) ;
|
||||
Vector3d vtEnd ;
|
||||
@@ -3892,6 +3892,16 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs,
|
||||
PtrOwner<ICurve> pOffs ;
|
||||
double dCurrRad = GetCurveRadius( pCompo) ;
|
||||
while ( nIter < MAX_ITER) {
|
||||
// se l'offset richiesto è pari al valore limite per la curva ne modifico leggermente il valore per evitare problemi con
|
||||
// le tolleranze di vroni
|
||||
double dMaxOffs ;
|
||||
if ( nIter == 0)
|
||||
CalcCurveLimitOffset( *pCompo, dMaxOffs) ;
|
||||
else
|
||||
CalcCurveLimitOffset( *pOffs, dMaxOffs) ;
|
||||
if ( abs( dMaxOffs - dOffs) < EPS_SMALL)
|
||||
dOffs -= EPS_SMALL ;
|
||||
|
||||
// calcolo
|
||||
OffsetCurve OffsCrv ;
|
||||
if ( ! OffsCrv.Make( ( nIter == 0 ? (ICurve*) pCompo : pOffs), - dOffs, ICurve::OFF_FILLET) ||
|
||||
@@ -4003,7 +4013,7 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs,
|
||||
int nCrvsCount0 = pMCrv->GetCurveCount() ;
|
||||
// accodo nel percorso di lavorazione
|
||||
pMCrv->AddCurve( Release( vLinks[i])) ;
|
||||
// nel caso di lucidatura setto proprietà alle curve di collegamento per poterle identificare
|
||||
// nel caso di lucidatura setto proprietà alle curve di collegamento per poterle identificare
|
||||
if ( m_TParams.m_nType == TT_MILL_POLISHING) {
|
||||
for ( int j = nCrvsCount0 ; j < pMCrv->GetCurveCount() ; j ++)
|
||||
pMCrv->SetCurveTempProp( j, LINK_CURVE_PROP) ;
|
||||
@@ -4063,7 +4073,7 @@ Pocketing::CalcBoundedLink( const Point3d& ptStart, const Point3d& ptEnd, const
|
||||
CRVCVECTOR ccClass ;
|
||||
IntersCurveCurve intCC( *LineLoc, *CrvOutLoc) ;
|
||||
intCC.GetCurveClassification( 0, EPS_SMALL, ccClass) ;
|
||||
// se nessuno o un solo tratto e interno, la retta è il collegamento
|
||||
// se nessuno o un solo tratto e interno, la retta è il collegamento
|
||||
if ( ccClass.empty() || ( ccClass.size() == 1 && ccClass[0].nClass == CRVC_IN)) {
|
||||
pCrvLink->AddCurve( Release( pLine)) ;
|
||||
return true ;
|
||||
@@ -4085,7 +4095,7 @@ Pocketing::CalcBoundedLink( const Point3d& ptStart, const Point3d& ptEnd, const
|
||||
pLine->GetPointD1D2( ccClass[j].dParE, ICurve::FROM_MINUS, ptE) ;
|
||||
double dOffE ;
|
||||
pCrvBound->GetParamAtPoint( ptE, dOffE) ;
|
||||
// recupero i due possibili percorsi e uso il più corto
|
||||
// recupero i due possibili percorsi e uso il più corto
|
||||
PtrOwner<ICurve> pCrvA( pCrvBound->CopyParamRange( dOffS, dOffE)) ;
|
||||
PtrOwner<ICurve> pCrvB( pCrvBound->CopyParamRange( dOffE, dOffS)) ;
|
||||
if ( IsNull( pCrvA) || IsNull( pCrvB))
|
||||
@@ -4122,7 +4132,7 @@ Pocketing::CalcBoundedLinkWithBiArcs( const Point3d& ptStart, const Vector3d& vt
|
||||
CRVCVECTOR ccClass ;
|
||||
IntersCurveCurve intCC( *pBiArcLink, *pCrvBound) ;
|
||||
intCC.GetCurveClassification( 0, EPS_SMALL, ccClass) ;
|
||||
// se nessuno o un solo tratto e interno, il biarco è il collegamento
|
||||
// se nessuno o un solo tratto e interno, il biarco è il collegamento
|
||||
if ( ccClass.empty() || ( ccClass.size() == 1 && ccClass[0].nClass == CRVC_IN)) {
|
||||
pCrvLink->AddCurve( Release( pBiArcLink)) ;
|
||||
}
|
||||
@@ -4301,7 +4311,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtD
|
||||
double dMaxLarg = b3Dim.GetDimY() ;
|
||||
|
||||
// calcolo percorso di svuotatura
|
||||
// se lati obliqui sono entrambi chiusi e dimensione svuotatura è maggiore di diametro fresa e minore del doppio gestione speciale
|
||||
// se lati obliqui sono entrambi chiusi e dimensione svuotatura è maggiore di diametro fresa e minore del doppio gestione speciale
|
||||
if ( vnProp[0] != 0 && vnProp[2] != 0 && vnProp[3] == 0 && vnProp[1] == 0 &&
|
||||
dMaxLarg > m_TParams.m_dDiam + 10 * EPS_SMALL && max( dLen0, dLen2) < 2 * m_TParams.m_dDiam + EPS_SMALL) {
|
||||
if ( ! SpecialAdjustTrapezoidSpiralForAngles( pMCrv, pCrvPocket)) {
|
||||
@@ -4314,7 +4324,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtD
|
||||
if ( vnProp[0] != 0)
|
||||
dYCoord -= GetOffsR() ;
|
||||
if ( vnProp[0] != 0 && vnProp[2] != 0)
|
||||
dYCoord = 0.5 * dPocketSize ; // se entrambi i lati paralleli sono aperti mi posiziono a metà della svuotatura
|
||||
dYCoord = 0.5 * dPocketSize ; // se entrambi i lati paralleli sono aperti mi posiziono a metà della svuotatura
|
||||
|
||||
double dXCoordStart, dXCoordEnd ;
|
||||
if ( ! CalcTrapezoidSpiralXCoord( pCrvPocket, true, dYCoord, dXCoordStart, dPocketSize))
|
||||
@@ -4330,7 +4340,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtD
|
||||
Vector3d vtDir1, vtDir3 ;
|
||||
pCrvPocket->GetCurve( 1)->GetStartDir( vtDir1) ;
|
||||
pCrvPocket->GetCurve( 3)->GetStartDir( vtDir3) ;
|
||||
// gestisco il caso speciale di un parallelogramma in cui anche l'altra dimensione della svuotatura è pari al diametro utensile
|
||||
// gestisco il caso speciale di un parallelogramma in cui anche l'altra dimensione della svuotatura è pari al diametro utensile
|
||||
if ( AreOppositeVectorApprox( vtDir1, vtDir3)) {
|
||||
PtrOwner<ICurveLine> pLine1( GetCurveLine( pCrvPocket->GetCurve( 1)->Clone())) ;
|
||||
PtrOwner<ICurveLine> pLine3( GetCurveLine( pCrvPocket->GetCurve( 3)->Clone())) ;
|
||||
@@ -4385,7 +4395,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtD
|
||||
pMCrv->ToGlob( frLoc) ;
|
||||
if ( ! m_Params.m_bInvert) {
|
||||
pMCrv->Invert() ;
|
||||
// inverto le proprietà in modo che nProp3 sia sempre legata al punto iniziale e nProp1 a quello finale
|
||||
// inverto le proprietà in modo che nProp3 sia sempre legata al punto iniziale e nProp1 a quello finale
|
||||
swap( vnProp[1], vnProp[3]) ;
|
||||
}
|
||||
// segno i lati aperti come temp prop della curva
|
||||
@@ -4540,7 +4550,7 @@ Pocketing::AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveC
|
||||
pMCrv->TrimStartAtParam( dPar) ;
|
||||
|
||||
if ( ptP1.y > dPocketSize) {
|
||||
// se ptP1 è esterno alla svuotatura scambio i punti in modo da usare ptP2 per il biarco ( così da non farlo fuoriuscire troppo)
|
||||
// se ptP1 è esterno alla svuotatura scambio i punti in modo da usare ptP2 per il biarco ( così da non farlo fuoriuscire troppo)
|
||||
swap( ptP1, ptP2) ;
|
||||
pCompo->Invert() ;
|
||||
}
|
||||
@@ -4569,9 +4579,9 @@ Pocketing::AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveC
|
||||
}
|
||||
}
|
||||
|
||||
// caso 2 : pLine è completamente sopra/sotto la linea di svuotatura
|
||||
// caso 2 : pLine è completamente sopra/sotto la linea di svuotatura
|
||||
else {
|
||||
// se è sopra modifiche per ricondurmi al caso in cui è sotto
|
||||
// se è sopra modifiche per ricondurmi al caso in cui è sotto
|
||||
if ( ptP2.y > dYCoord) {
|
||||
pLine->Invert() ;
|
||||
swap( ptP1, ptP2) ;
|
||||
@@ -4598,7 +4608,7 @@ Pocketing::AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveC
|
||||
}
|
||||
}
|
||||
|
||||
// se il lato opposto a quello di riferimento è chiuso bisogna distinguere i casi
|
||||
// se il lato opposto a quello di riferimento è chiuso bisogna distinguere i casi
|
||||
else {
|
||||
bool bStartPnt = false ;
|
||||
if ( ptP2.y < dYCoord) {
|
||||
@@ -4620,7 +4630,7 @@ Pocketing::AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveC
|
||||
}
|
||||
}
|
||||
|
||||
// setto temp prop per ricordare che è curva aggiuntiva per pulire angoli
|
||||
// setto temp prop per ricordare che è curva aggiuntiva per pulire angoli
|
||||
for ( int i = 0 ; i < pCompo->GetCurveCount() ; i++)
|
||||
pCompo->SetCurveTempProp( i, 1) ;
|
||||
|
||||
@@ -4687,7 +4697,7 @@ Pocketing::SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const
|
||||
}
|
||||
}
|
||||
|
||||
// se non è stato possibile creare raccordo, unisco linearmente
|
||||
// se non è stato possibile creare raccordo, unisco linearmente
|
||||
if ( ! bUseBiArcs)
|
||||
pMCrv->AddCurve( Release( pLineLink)) ;
|
||||
|
||||
@@ -4711,7 +4721,7 @@ Pocketing::AdjustTrapezoidSpiralForLeadInLeadOut( ICurveComposite* pCompo, ICurv
|
||||
for ( int i = 0 ; i < pCompo->GetCurveCount() ; i++) {
|
||||
int nProp ;
|
||||
if ( pCompo->GetCurveTempProp( i, nProp) && nProp == 0) {
|
||||
// se non è lato aggiuntivo per la pulitura angoli recupero la sua direzione
|
||||
// se non è lato aggiuntivo per la pulitura angoli recupero la sua direzione
|
||||
pCompo->GetCurve( i)->GetStartDir( vtMainDir) ;
|
||||
break ;
|
||||
}
|
||||
@@ -4773,7 +4783,7 @@ Pocketing::ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite* pCompo, const V
|
||||
|
||||
double dSafeZ = GetSafeZ() ;
|
||||
|
||||
// tento con allungamento se lato inclinato è aperto oppure se sto considerando un lato aggiuntivo per pulire angoli
|
||||
// tento con allungamento se lato inclinato è aperto oppure se sto considerando un lato aggiuntivo per pulire angoli
|
||||
if ( bEdgeOpen || nExtraEdge == 1) {
|
||||
|
||||
Vector3d vtDirP = ( bLeadIn ? -vtDir : vtDir) ;
|
||||
@@ -4814,7 +4824,7 @@ Pocketing::ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite* pCompo, const V
|
||||
Point3d ptTest = ptP + vtDirP * ( dDist + ( m_TParams.m_dDiam / 2 + max( dSafeZ, m_dOpenMinSafe)) * dCorr) ;
|
||||
ptTest += - vtTool * dDepth ;
|
||||
double dTestElev ;
|
||||
// se è fuori dal grezzo
|
||||
// se è fuori dal grezzo
|
||||
if ( ! GetElevation( m_nPhase, ptTest, vtTool, m_TParams.m_dDiam / 2, vtTool, dTestElev) || dTestElev < EPS_SMALL) {
|
||||
Point3d ptNewStart = ptP + vtDirP * ( dDist + ( m_TParams.m_dDiam / 2 + max( dSafeZ, m_dOpenMinSafe)) * dCorr) ;
|
||||
pCompo->AddLine( ptNewStart, ! bLeadIn) ;
|
||||
@@ -4823,7 +4833,7 @@ Pocketing::ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite* pCompo, const V
|
||||
}
|
||||
}
|
||||
|
||||
// tento con attacco ruotato di 90° se non sto considerando un tratto aggiuntivo per pulire angoli
|
||||
// tento con attacco ruotato di 90° se non sto considerando un tratto aggiuntivo per pulire angoli
|
||||
if ( bBaseOpen && ! bIsOutsideRaw && nExtraEdge == 0) {
|
||||
|
||||
Vector3d vtDirO = vtDir ;
|
||||
@@ -4839,7 +4849,7 @@ Pocketing::ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite* pCompo, const V
|
||||
Point3d ptTestO = ptP + vtDirO * ( dDist + m_TParams.m_dDiam / 2 + max( dSafeZ, m_dOpenMinSafe)) ;
|
||||
ptTestO += - vtTool * dDepth ;
|
||||
double dTestElevO ;
|
||||
// se è fuori dal grezzo uso inizio ruotato
|
||||
// se è fuori dal grezzo uso inizio ruotato
|
||||
if ( ! GetElevation( m_nPhase, ptTestO, vtTool, m_TParams.m_dDiam / 2, vtTool, dTestElevO) || dTestElevO < EPS_SMALL) {
|
||||
Point3d ptNewStart = ptP + vtDirO * ( dDist + m_TParams.m_dDiam / 2 + max( dSafeZ, m_dOpenMinSafe)) ;
|
||||
pCompo->AddLine( ptNewStart, ! bLeadIn) ;
|
||||
@@ -4868,11 +4878,11 @@ Pocketing::ComputePolishingPath( ICurveComposite* pMCrv, ICurveComposite* pRCrv,
|
||||
if ( ! pMCrv->GetCurveTempProp( i, nProp))
|
||||
return false ;
|
||||
|
||||
// se è un tratto di collegamento ho concluso percorso su cui aggiungere epicicli
|
||||
// se è un tratto di collegamento ho concluso percorso su cui aggiungere epicicli
|
||||
if ( nProp == LINK_CURVE_PROP) {
|
||||
if ( pCompo->IsValid()) {
|
||||
PtrOwner<ICurveComposite> pCrvEp( CreateCurveComposite()) ;
|
||||
// la curva di bound è l'offset che calcolo in AddEpicycles per la prima curva compo trovata in pMCrv
|
||||
// la curva di bound è l'offset che calcolo in AddEpicycles per la prima curva compo trovata in pMCrv
|
||||
bool bAddEp = ( ! pCrvBound->IsValid()) ? AddEpicycles( pCompo, pCrvEp, pCrvBound) : AddEpicycles( pCompo, pCrvEp) ;
|
||||
if ( ! bAddEp)
|
||||
return false ;
|
||||
@@ -4880,7 +4890,7 @@ Pocketing::ComputePolishingPath( ICurveComposite* pMCrv, ICurveComposite* pRCrv,
|
||||
pCompo.Set( CreateCurveComposite()) ;
|
||||
}
|
||||
}
|
||||
// se non è tratto di collegamento lo aggiungo alla curva
|
||||
// se non è tratto di collegamento lo aggiungo alla curva
|
||||
else {
|
||||
if ( ! pCompo->AddCurve( pMCrv->GetCurve(i)->Clone()))
|
||||
return false ;
|
||||
@@ -5052,7 +5062,7 @@ Pocketing::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafe
|
||||
// se con aggregato da sotto o equivalente (rinvio a 90 gradi su testa 5 assi)
|
||||
bool bBottomOutStart = false ;
|
||||
if ( m_bAggrBottom) {
|
||||
// distanza dal bordo del pezzo (se negativa il punto è fuori dal grezzo)
|
||||
// distanza dal bordo del pezzo (se negativa il punto è fuori dal grezzo)
|
||||
double dDistBottom ;
|
||||
if ( ! GetAggrBottDistanceFromRawSide( m_nPhase, ptP, m_vtAggrBottom, ( m_AggrBottom.dEncH + dSafeZ), dDistBottom))
|
||||
dDistBottom = 0 ;
|
||||
@@ -5096,7 +5106,7 @@ Pocketing::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafe
|
||||
SetFlag( 0) ;
|
||||
}
|
||||
}
|
||||
// se sopra attacco c'è spazio per sicurezza o approccio
|
||||
// se sopra attacco c'è spazio per sicurezza o approccio
|
||||
double dSafeDist = ( m_bAggrBottom ? dSafeAggrBottZ : dSafeZ) ;
|
||||
if ( ! bBottomOutStart && dElev + max( dSafeDist, dAppr) > 10 * EPS_SMALL) {
|
||||
Point3d ptP1 = ptP + vtTool * ( dElev + dAppr) ;
|
||||
@@ -5141,7 +5151,7 @@ bool
|
||||
Pocketing::AddLinkApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bSplitArcs, bool bOutStart)
|
||||
{
|
||||
// se sopra attacco c'è spazio per approccio
|
||||
// se sopra attacco c'è spazio per approccio
|
||||
if ( ( dElev + dAppr) > 10 * EPS_SMALL) {
|
||||
// 1b -> punto appena sopra inizio
|
||||
Point3d ptP1b = ptP + vtTool * ( dElev + dAppr) ;
|
||||
@@ -5170,7 +5180,7 @@ bool
|
||||
Pocketing::AddLinkRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bSplitArcs)
|
||||
{
|
||||
// se sopra uscita c'è spazio per approccio
|
||||
// se sopra uscita c'è spazio per approccio
|
||||
if ( ( dElev + dAppr) > 10 * EPS_SMALL) {
|
||||
// 4 -> movimento di risalita sopra il punto finale
|
||||
SetFeed( GetEndFeed()) ;
|
||||
@@ -5195,7 +5205,7 @@ Pocketing::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ
|
||||
dDistBottom = 0 ;
|
||||
bBottomOutStart = ( dDistBottom < - 10 * EPS_SMALL) ;
|
||||
}
|
||||
// se sopra uscita c'è spazio per sicurezza o approccio
|
||||
// se sopra uscita c'è spazio per sicurezza o approccio
|
||||
double dSafeDist = ( m_bAggrBottom ? dSafeAggrBottZ : dSafeZ) ;
|
||||
if ( ! bBottomOutStart && dElev + max( dSafeDist, dAppr) > 10 * EPS_SMALL) {
|
||||
if ( dSafeDist < dAppr + 10 * EPS_SMALL) {
|
||||
@@ -5509,7 +5519,7 @@ Pocketing::GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMi
|
||||
}
|
||||
pMyCrv = pCompo->GetNextCurve() ;
|
||||
}
|
||||
// richiedo lunghezza superiore a diametro utensile più doppio offset radiale
|
||||
// richiedo lunghezza superiore a diametro utensile più doppio offset radiale
|
||||
double dRefLen = ( bAllOpen ? 0 : m_TParams.m_dDiam + 2 * GetOffsR() - EPS_SMALL) ;
|
||||
double dMaxLen = dRefLen ;
|
||||
// ciclo sulle singole curve
|
||||
@@ -5530,7 +5540,7 @@ Pocketing::GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMi
|
||||
pNextCrv->GetLength( dLenNext) ;
|
||||
// verifico la curva corrente
|
||||
if ( pCrv->GetTempProp() == 1) {
|
||||
// contributo dalle entità adiacenti (se non tutte aperte)
|
||||
// contributo dalle entità adiacenti (se non tutte aperte)
|
||||
double dLenAgg = 0 ;
|
||||
if ( ! bAllOpen) {
|
||||
if ( pPrevCrv != nullptr && pPrevCrv->GetTempProp() == 1) {
|
||||
@@ -5544,7 +5554,7 @@ Pocketing::GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMi
|
||||
dLenAgg += max( 0.4, vtEnd * vtNextStart) * dLenNext ;
|
||||
}
|
||||
}
|
||||
// entità corrente
|
||||
// entità corrente
|
||||
double dLen = 0 ;
|
||||
if ( pCrv->GetLength( dLen)) {
|
||||
const double LEN_TOL = 1 ;
|
||||
@@ -5562,7 +5572,7 @@ Pocketing::GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMi
|
||||
vtMidOrt.Rotate( vtExtr, 0, -1) ;
|
||||
}
|
||||
}
|
||||
// se più lunga
|
||||
// se più lunga
|
||||
else if ( dLen + dLenAgg > dMaxLen) {
|
||||
dMaxLen = dLen + dLenAgg ;
|
||||
pCrv->GetMidPoint( ptMid) ;
|
||||
@@ -5594,14 +5604,14 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo)
|
||||
Frame3d frPocket ;
|
||||
Point3d ptStart ; pCompo->GetStartPoint( ptStart) ;
|
||||
frPocket.Set( ptStart, vtExtr) ;
|
||||
// sposto l'inizio a metà del tratto più lungo
|
||||
// sposto l'inizio a metà del tratto più lungo
|
||||
AdjustContourStart( pCompo) ;
|
||||
// raggio di riferimento per offset
|
||||
double dOutEdge = 0.5 * m_TParams.m_dDiam ;
|
||||
if ( m_Params.m_nSubType == POCKET_SUB_SPIRALIN || m_Params.m_nSubType == POCKET_SUB_ZIGZAG)
|
||||
dOutEdge = max( dOutEdge, m_TParams.m_dDiam - m_Params.m_dSideStep) ;
|
||||
double dRad = dOutEdge + GetOffsR() ;
|
||||
// estraggo parti con proprietà uniforme in un vettore
|
||||
// estraggo parti con proprietà uniforme in un vettore
|
||||
ICURVEPOVECTOR vpCrvs ;
|
||||
int nCurrTempProp ;
|
||||
int nParStart = 0 ;
|
||||
@@ -5750,7 +5760,7 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo)
|
||||
bool
|
||||
Pocketing::AdjustContourStart( ICurveComposite* pCompo)
|
||||
{
|
||||
// cerco il tratto lineare più lungo che non sia aperto
|
||||
// cerco il tratto lineare più lungo che non sia aperto
|
||||
int i = 0 ;
|
||||
int nMax = - 1 ;
|
||||
double dLenMax = 0 ;
|
||||
@@ -5764,7 +5774,7 @@ Pocketing::AdjustContourStart( ICurveComposite* pCompo)
|
||||
++ i ;
|
||||
pCrv = pCompo->GetNextCurve() ;
|
||||
}
|
||||
// se non trovato o troppo corto, cerco il tratto generico più lungo
|
||||
// se non trovato o troppo corto, cerco il tratto generico più lungo
|
||||
if ( nMax < 0 || dLenMax < 1.25 * m_TParams.m_dDiam) {
|
||||
i = 0 ;
|
||||
pCrv = pCompo->GetFirstCurve() ;
|
||||
|
||||
Reference in New Issue
Block a user