EgtMachKernel :

- modifiche per gestione aggregato da sotto in foratura e fresatura
- modifiche per nuovi tipi di uscite lame allungate.
This commit is contained in:
Dario Sassi
2017-01-26 09:36:38 +00:00
parent 5849ad4f41
commit 5ffbaab0e4
10 changed files with 279 additions and 61 deletions
+88 -6
View File
@@ -170,6 +170,8 @@ Drilling::Drilling( void)
m_TParams.m_sName = "*" ;
m_TParams.m_sHead = "*" ;
m_nDrillings = 0 ;
m_bAggrBottom = false ;
m_dDistBottom = 0 ;
}
//----------------------------------------------------------------------------
@@ -848,6 +850,7 @@ Drilling::GenerateHoleCl( int nInd, const SelData& nCircId, const string& sPName
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
}
// verifiche per foro verso il basso
m_bAggrBottom = false ;
if ( ! VerifyHoleFromBottom( hole, nCircId)) {
return false ;
}
@@ -1214,8 +1217,10 @@ Drilling::VerifyHoleFromBottom( const Hole& hole, SelData Id)
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
return false ;
}
// assegno direzione di accesso
// assegno direzione di accesso e segnalazione di utilizzo aggregato da sotto
SetAuxDir( vtDir) ;
m_bAggrBottom = true ;
m_dDistBottom = dDist ;
return true ;
}
@@ -1240,15 +1245,40 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId)
bool bEndSlow = ( dEndSlowLen > EPS_SMALL) ;
// determino alcune caratteristiche dell'utensile
double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ;
// se con aggregato da sotto, ne recupero alcuni dati
double dAgbEncH = 0 ;
double dAgbEncV = 0 ;
if ( m_bAggrBottom) {
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ;
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ;
}
// imposto dati comuni
SetPathId( nPathId) ;
SetToolDir( hole.vtDir) ;
// 1 -> punto approccio
// 1 -> punto approccio (se con aggregato da sotto è una sequenza di approccio)
SetFlag( 1) ;
double dAppr = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() ;
Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dTExtrLen) ;
if ( AddRapidStart( ptP1) == GDB_ID_NULL)
return false ;
if ( m_bAggrBottom) {
Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ;
Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ;
Vector3d vtAux = m_vtAux ;
vtAux.Rotate( Z_AX, 90) ;
SetAuxDir( vtAux) ;
if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL)
return false ;
vtAux.Rotate( Z_AX, - 90) ;
SetAuxDir( vtAux) ;
SetFlag( 0) ;
if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL)
return false ;
if ( AddRapidMove( ptP1) == GDB_ID_NULL)
return false ;
}
else {
if ( AddRapidStart( ptP1) == GDB_ID_NULL)
return false ;
}
SetFlag( 0) ;
// 2 -> punto fuori (se diverso dal precedente)
if ( m_Params.m_dStartPos < dAppr) {
@@ -1291,6 +1321,19 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId)
SetFlag( 104) ; // risalita sopra il foro
if ( AddLinearMove( ptP1) == GDB_ID_NULL)
return false ;
// 7 -> punto fuori (se uso aggregato da sotto)
if ( m_bAggrBottom) {
SetFlag( 0) ;
Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ;
Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ;
if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL)
return false ;
Vector3d vtAux = m_vtAux ;
vtAux.Rotate( Z_AX, 90) ;
SetAuxDir( vtAux) ;
if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL)
return false ;
}
// reset dati di movimento
ResetMoveData() ;
@@ -1321,6 +1364,13 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
bool bEndSlow = ( dEndSlowLen > EPS_SMALL) ;
// determino alcune caratteristiche dell'utensile
double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ;
// se con aggregato da sotto, ne recupero alcuni dati
double dAgbEncH = 0 ;
double dAgbEncV = 0 ;
if ( m_bAggrBottom) {
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ;
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ;
}
// imposto dati comuni
SetPathId( nPathId) ;
SetToolDir( hole.vtDir) ;
@@ -1328,8 +1378,26 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
SetFlag( 1) ;
double dAppr = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() ;
Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dTExtrLen) ;
if ( AddRapidStart( ptP1) == GDB_ID_NULL)
return false ;
if ( m_bAggrBottom) {
Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ;
Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ;
Vector3d vtAux = m_vtAux ;
vtAux.Rotate( Z_AX, 90) ;
SetAuxDir( vtAux) ;
vtAux.Rotate( Z_AX, - 90) ;
if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL)
return false ;
SetFlag( 0) ;
SetAuxDir( vtAux) ;
if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL)
return false ;
if ( AddRapidMove( ptP1) == GDB_ID_NULL)
return false ;
}
else {
if ( AddRapidStart( ptP1) == GDB_ID_NULL)
return false ;
}
SetFlag( 0) ;
// 2 -> punto fuori (se diverso dal precedente)
if ( m_Params.m_dStartPos < dAppr) {
@@ -1445,6 +1513,20 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
if ( AddLinearMove( ptP1) == GDB_ID_NULL)
return false ;
// 7 -> punto fuori (se uso aggregato da sotto)
if ( m_bAggrBottom) {
SetFlag( 0) ;
Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ;
Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ;
if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL)
return false ;
Vector3d vtAux = m_vtAux ;
vtAux.Rotate( Z_AX, 90) ;
SetAuxDir( vtAux) ;
if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL)
return false ;
}
// reset dati di movimento
ResetMoveData() ;
+2
View File
@@ -94,4 +94,6 @@ class Drilling : public Machining
DrillingData m_Params ; // parametri lavorazione
ToolData m_TParams ; // parametri utensile
int m_nDrillings ; // numero di fori generati
bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto
double m_dDistBottom ; // distanza del foro dal bordo del grezzo
} ;
+2
View File
@@ -793,6 +793,8 @@ Machine::CreateExitGroups( int nLay, const MUEXITVECTOR& vMuExit)
m_pGeomDB->SetStatus( nT, GDB_ST_OFF) ;
// assegno nome al gruppo
m_pGeomDB->SetName( nGT, sName) ;
// assegno info per eventuale movimento
m_pGeomDB->SetInfo( nGT, "Val", 0) ;
// installo e inizializzo il gestore dell'uscita
Exit* pExit = new(nothrow) Exit ;
if ( pExit == nullptr)
+130 -6
View File
@@ -1263,6 +1263,12 @@ Milling::ProcessPath( int nPathId, int nPvId, int nClId)
}
}
// verifiche per fresatura dal basso
m_bAggrBottom = false ;
if ( ! VerifyPathFromBottom( pCompo, vtTool)) {
return false ;
}
// se richiesta anteprima
if ( nPvId != GDB_ID_NULL) {
// creo gruppo per geometria di lavorazione del percorso
@@ -1398,6 +1404,72 @@ Milling::CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtToo
return true ;
}
//----------------------------------------------------------------------------
bool
Milling::VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool)
{
// se non è fresatura dal basso in alto, esco
if ( vtTool.z > - 0.5)
return true ;
// se c'è tavola basculante, esco
bool bTabTilting = false ;
if ( m_pMchMgr->GetCurrMachine()->GetCurrTableIsTilting( bTabTilting) && bTabTilting)
return true ;
// verifico se c'è rinvio da sotto
int nHeadId = m_pMchMgr->GetHeadId( m_TParams.m_sHead) ;
int nAgbType ;
if ( ! m_pGeomDB->GetInfo( nHeadId, "AGB_TYPE", nAgbType) || nAgbType == 0) {
string sOut = "Milling error : missing aggregate from bottom" ;
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
return false ;
}
// recupero la massima distanza consentita dal rinvio
double dAgbDmax = 0 ;
m_pGeomDB->GetInfo( nHeadId, "AGB_DMAX", dAgbDmax) ;
// calcolo la massima distanza minima del percorso dal contorno del grezzo
double dDist = 0 ;
Vector3d vtDir ;
int nMaxInd = pCompo->GetCurveCount() - 1 ;
for ( int i = 0 ; i <= nMaxInd ; ++ i) {
// curva corrente
const ICurve* pCrvC = pCompo->GetCurve( i) ;
// considero inizio della prima curva, punto medio e fine di tutte
Point3d ptP ;
double dCurrDist = 0 ;
Vector3d vtCurrDir ;
if ( i == 0) {
pCrvC->GetStartPoint( ptP) ;
GetMinDistanceFromRawSide( m_nPhase, ptP, dCurrDist, vtCurrDir) ;
if ( dCurrDist > dDist) {
dDist = dCurrDist ;
vtDir = vtCurrDir ;
}
}
pCrvC->GetMidPoint( ptP) ;
GetMinDistanceFromRawSide( m_nPhase, ptP, dCurrDist, vtCurrDir) ;
if ( dCurrDist > dDist) {
dDist = dCurrDist ;
vtDir = vtCurrDir ;
}
pCrvC->GetEndPoint( ptP) ;
GetMinDistanceFromRawSide( m_nPhase, ptP, dCurrDist, vtCurrDir) ;
if ( dCurrDist > dDist) {
dDist = dCurrDist ;
vtDir = vtCurrDir ;
}
}
// se supera il limite, errore
if ( dDist > dAgbDmax) {
string sOut = "Milling error : path too far from part sides" ;
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
return false ;
}
// assegno direzione di accesso e segnalo utilizzo aggregato da sotto
SetAuxDir( vtDir) ;
m_bAggrBottom = true ;
return true ;
}
//----------------------------------------------------------------------------
bool
Milling::GenerateMillingPv( int nPathId, const ICurveComposite* pCompo)
@@ -2048,23 +2120,50 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool
bool
Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr)
{
SetFlag( 1) ;
// se con aggregato da sotto
if ( m_bAggrBottom) {
// ne recupero alcuni dati
double dAgbEncH = 0 ;
double dAgbEncV = 0 ;
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ;
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ;
// aggiuntivo in Z
double dAggZ = max( dElev + max( dSafeZ, dAppr), 0.) ;
// distanza dal bordo del pezzo
double dDistBottom ;
if ( ! GetDistanceFromRawSide( m_nPhase, ptP, m_vtAux, dDistBottom))
dDistBottom = 0 ;
// pre-approccio
Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAux * ( dDistBottom + dAgbEncH + dAppr) ;
Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAggZ) ;
Vector3d vtAux = m_vtAux ;
vtAux.Rotate( Z_AX, 90) ;
SetAuxDir( vtAux) ;
if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL)
return false ;
vtAux.Rotate( Z_AX, - 90) ;
SetAuxDir( vtAux) ;
SetFlag( 0) ;
if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL)
return false ;
}
// se sopra attacco c'è spazio per sicurezza o approccio
if ( dElev + max( dSafeZ, dAppr) > 10 * EPS_SMALL) {
// se distanza di sicurezza minore di distanza di inizio
if ( dSafeZ < dAppr + 10 * EPS_SMALL) {
// 1 -> punto sopra inizio
SetFlag( 1) ;
Point3d ptP1 = ptP + vtTool * ( dElev + dAppr) ;
if ( AddRapidStart( ptP1) == GDB_ID_NULL)
if ( ( ! m_bAggrBottom && AddRapidStart( ptP1) == GDB_ID_NULL) ||
( m_bAggrBottom && AddRapidMove( ptP1) == GDB_ID_NULL))
return false ;
}
else {
// 1a -> punto sopra inizio
SetFlag( 1) ;
Point3d ptP1b = ptP + vtTool * ( dElev + dAppr) ;
Point3d ptP1a = ptP1b + vtTool * ( dSafeZ - dAppr) ;
if ( AddRapidStart( ptP1a) == GDB_ID_NULL)
return false ;
if ( ( ! m_bAggrBottom && AddRapidStart( ptP1a) == GDB_ID_NULL) ||
( m_bAggrBottom && AddRapidMove( ptP1a) == GDB_ID_NULL))
// 1b -> punto appena sopra inizio
if ( ( dElev + dAppr) > EPS_SMALL) {
SetFlag( 0) ;
@@ -2081,7 +2180,8 @@ Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ,
else {
// affondo diretto al punto iniziale
SetFlag( 0) ;
if ( AddRapidStart( ptP) == GDB_ID_NULL)
if ( ( ! m_bAggrBottom && AddRapidStart( ptP) == GDB_ID_NULL) ||
( m_bAggrBottom && AddRapidMove( ptP) == GDB_ID_NULL))
return false ;
}
return true ;
@@ -2114,6 +2214,30 @@ Milling::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ,
return false ;
}
}
// se con aggregato da sotto
if ( m_bAggrBottom) {
// ne recupero alcuni dati
double dAgbEncH = 0 ;
double dAgbEncV = 0 ;
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ;
m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ;
// aggiuntivo in Z
double dAggZ = max( dElev + max( dSafeZ, dAppr), 0.) ;
// distanza dal bordo del pezzo
double dDistBottom ;
if ( ! GetDistanceFromRawSide( m_nPhase, ptP, m_vtAux, dDistBottom))
dDistBottom = 0 ;
// post-retract
Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAux * ( dDistBottom + dAgbEncH + dAppr) ;
Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAggZ) ;
if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL)
return false ;
Vector3d vtAux = m_vtAux ;
vtAux.Rotate( Z_AX, 90) ;
SetAuxDir( vtAux) ;
if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL)
return false ;
}
return true ;
}
+2
View File
@@ -68,6 +68,7 @@ class Milling : public Machining
bool Chain( int nGrpDestId) ;
bool ProcessPath( int nPathId, int nPvId, int nClId) ;
bool CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double& dElev) ;
bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ;
bool GenerateMillingPv( int nPathId, const ICurveComposite* pCompo) ;
bool AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
double dDepth, double dElev, bool bSplitArcs) ;
@@ -108,4 +109,5 @@ class Milling : public Machining
MillingData m_Params ; // parametri lavorazione
ToolData m_TParams ; // parametri utensile
int m_nMills ; // numero di percorsi di lavoro generati
bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto
} ;
+8 -25
View File
@@ -919,7 +919,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
//----------------------------------------------------------------------------
bool
Operation::AdjustStartEndMovements( bool bOnlyStart)
Operation::AdjustStartEndMovements( void)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
@@ -1018,9 +1018,6 @@ Operation::AdjustStartEndMovements( bool bOnlyStart)
if ( ! AdjustOneStartMovement( nClPathId, vAxVal, bHomeZ))
bOk = false ;
bHomeZ = false ;
//// se solo inizio, ho finito
// if ( bOnlyStart)
// return bOk ;
// recupero nuovi finali
if ( ! GetClPathFinalAxesValues( nClPathId, vAxVal))
bOk = false ;
@@ -1031,27 +1028,8 @@ Operation::AdjustStartEndMovements( bool bOnlyStart)
// aggiungo risalita finale
bOk = bOk && AddRise( vAxVal) ;
//// recupero la lavorazione successiva non vuota
// int nNextOpId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ;
// Operation* pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ;
// while ( pNextOp != nullptr) {
// if ( ! pNextOp->IsEmpty())
// break ;
// else {
// nNextOpId = m_pMchMgr->GetNextActiveOperation( nNextOpId) ;
// pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ;
// }
// }
// verifico se disposizione
//// se non esiste lavorazione successiva, vado in home
// if ( pNextOp == nullptr)
bOk = bOk && AddHome() ;
//// altrimenti aggiusto l'inizio della lavorazione successiva con il finale di questa
// else
// bOk = bOk && pNextOp->AdjustStartEndMovements( true) ;
// vado in home
bOk = bOk && AddHome() ;
return bOk ;
}
@@ -1077,6 +1055,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
return false ;
// modifico quella originale (è la prima del percorso)
m_pGeomDB->RemoveName( nEntId) ;
DBLVECTOR vAxNew = vAxCurr ;
vAxNew[2] = vAxPrev[2] ;
// eventuale aggiustamenti speciali dipendenti dalla macchina
@@ -1115,6 +1094,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
if ( pNew1CamData == nullptr)
return false ;
// modifico questa entità
m_pGeomDB->RemoveName( nNew1Id) ;
DBLVECTOR vAxNew1 = vAxPrev ;
vAxNew1[2] = dHomeZ ;
int nMask = CamData::MSK_L3 ;
@@ -1151,6 +1131,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
if ( pNew2CamData == nullptr)
return false ;
// modifico quella originale (è la prima del percorso)
m_pGeomDB->RemoveName( nNew2Id) ;
DBLVECTOR vAxNew2 = vAxCurr ;
vAxNew2[2] = dHomeZ ;
pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ;
@@ -1168,6 +1149,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
return false ;
// modifico quella originale (è la prima del percorso)
m_pGeomDB->RemoveName( nEntId) ;
DBLVECTOR vAxNew = vAxPrev ;
vAxNew[2] = vAxCurr[2] ;
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
@@ -1180,6 +1162,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
return false ;
// modifico quella originale (è la prima del percorso)
m_pGeomDB->RemoveName( nEntId) ;
DBLVECTOR vAxNew = vAxCurr ;
vAxNew[2] = vAxPrev[2] ;
// eventuali aggiustamenti speciali dipendenti dalla macchina
+3 -1
View File
@@ -75,7 +75,7 @@ class Operation : public IUserObj
bool CalculateAxesValues( const std::string& sHint) ;
bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
DBLVECTOR& vAxRotPrec, int& nOutStrC) ;
bool AdjustStartEndMovements( bool bOnlyStart = false) ;
bool AdjustStartEndMovements( void) ;
bool AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bHomeZ) ;
bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) ;
bool AddRise( DBLVECTOR& vAxVal, double dDelta = - 1) ;
@@ -102,7 +102,9 @@ class Operation : public IUserObj
bool GetCurrPos( Point3d& ptCurr) const
{ if ( ! m_bCurr) return false ; ptCurr = m_ptCurr ; return true ; }
int AddRapidStart( const Point3d& ptP) ;
int AddRapidStart( const Point3d& ptP, const std::string& sName) ;
int AddRapidMove( const Point3d& ptP) ;
int AddRapidMove( const Point3d& ptP, const std::string& sName) ;
int AddLinearMove( const Point3d& ptP) ;
int AddLinearMove( const Point3d& ptP, const std::string& sName) ;
int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) ;
+20
View File
@@ -120,6 +120,16 @@ Operation::AddRapidStart( const Point3d& ptP)
return nId ;
}
//----------------------------------------------------------------------------
int
Operation::AddRapidStart( const Point3d& ptP, const string& sName)
{
int nId = AddRapidStart( ptP) ;
if ( nId != GDB_ID_NULL)
m_pGeomDB->SetName( nId, sName) ;
return nId ;
}
//----------------------------------------------------------------------------
int
Operation::AddRapidMove( const Point3d& ptP)
@@ -159,6 +169,16 @@ Operation::AddRapidMove( const Point3d& ptP)
return nId ;
}
//----------------------------------------------------------------------------
int
Operation::AddRapidMove( const Point3d& ptP, const string& sName)
{
int nId = AddRapidMove( ptP) ;
if ( nId != GDB_ID_NULL)
m_pGeomDB->SetName( nId, sName) ;
return nId ;
}
//----------------------------------------------------------------------------
int
Operation::AddLinearMove( const Point3d& ptP)
+22 -22
View File
@@ -2968,26 +2968,9 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
else if ( m_Params.m_nLeadInType == SAW_LI_OUT)
// all'esterno
dDeltaI = dDeltaT ;
else if ( m_Params.m_nLeadInType == SAW_LI_EXT_CENT) {
// porto il centro lama sul bordo del grezzo
// calcolo punto di inizio e direzione (sono in globale)
Point3d ptP ;
pLine->GetStartPoint( ptP) ;
Vector3d vtDir ;
pLine->GetStartDir( vtDir) ;
// determino la distanza dal bordo del grezzo
double dDist[4] = {0, 0, 0, 0} ;
if ( ! GetDistanceFromRawSide( m_nPhase, ptP, - vtDir, dDist[0]) ||
! GetDistanceFromRawSide( m_nPhase, ptP + vtThick, - vtDir, dDist[1]) ||
! GetDistanceFromRawSide( m_nPhase, ptP + vtCorr * dElev, - vtDir, dDist[2]) ||
! GetDistanceFromRawSide( m_nPhase, ptP + vtCorr * dElev + vtThick, - vtDir, dDist[3]))
return false ;
dDeltaI = 0 ;
for ( int i = 0 ; i < 4 ; ++i)
dDeltaI = max( dDeltaI, dDist[i]) ;
}
else if ( m_Params.m_nLeadInType == SAW_LI_EXT_OUT) {
// estendo all'esterno del bordo del grezzo
else if ( m_Params.m_nLeadInType == SAW_LI_EXT_CENT ||
m_Params.m_nLeadInType == SAW_LI_EXT_OUT) {
// porto il centro lama sul bordo del grezzo o all'esterno
// calcolo punto di inizio e direzione (sono in globale)
Point3d ptP ;
pLine->GetStartPoint( ptP) ;
@@ -3003,6 +2986,8 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
dDeltaI = 0 ;
for ( int i = 0 ; i < 4 ; ++i)
dDeltaI = max( dDeltaI, dDist[i]) ;
if ( m_Params.m_nLeadInType == SAW_LI_EXT_OUT)
dDeltaI += dDeltaT ;
}
}
else {
@@ -3035,9 +3020,14 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
dDeltaF = - dDeltaT ;
else if ( bIsLast) {
if ( m_Params.m_nLeadOutType == SAW_LO_STRICT)
// all'interno
dDeltaF = - dDeltaT ;
else if ( m_Params.m_nLeadOutType == SAW_LO_EXT) {
// estendo al bordo del grezzo
else if ( m_Params.m_nLeadOutType == SAW_LO_OUT)
// all'esterno
dDeltaF = dDeltaT ;
else if ( m_Params.m_nLeadOutType == SAW_LO_EXT_CENT ||
m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) {
// estendo al bordo del grezzo o al suo esterno
// calcolo punto di fine e direzione (sono in globale)
Point3d ptP ;
pLine->GetEndPoint( ptP) ;
@@ -3053,6 +3043,8 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
dDeltaF = 0 ;
for ( int i = 0 ; i < 4 ; ++i)
dDeltaF = max( dDeltaF, dDist[i]) ;
if ( m_Params.m_nLeadOutType == SAW_LO_EXT_OUT)
dDeltaF += dDeltaT ;
}
}
else {
@@ -3074,6 +3066,9 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
dDeltaF = 0 ;
for ( int i = 0 ; i < 4 ; ++i)
dDeltaF = max( dDeltaF, dDist[i]) ;
// se LeadOut EXT_OUT vado all'esterno
if ( m_Params.m_nLeadOutType == SAW_LO_EXT_OUT)
dDeltaF += dDeltaT ;
}
}
// controllo se lunghezza entità accettabile
@@ -3125,7 +3120,12 @@ Sawing::AdjustArcForEdges( ICurveArc* pArc, double dElev, double dLenCoeff,
dDeltaF = - dDeltaT ;
else if ( bIsLast) {
if ( m_Params.m_nLeadOutType == SAW_LO_STRICT)
// all'interno
dDeltaF = - dDeltaT ;
else if ( m_Params.m_nLeadOutType == SAW_LO_OUT ||
m_Params.m_nLeadOutType == SAW_LO_EXT_OUT)
// all'esterno
dDeltaF = dDeltaT ;
}
dDeltaF *= dLenCoeff ;
// controllo se lunghezza entità accettabile
+2 -1
View File
@@ -447,7 +447,8 @@ SawingData::VerifyExtLinkType( int nVal) const
bool
SawingData::VerifyLeadOutType( int nVal) const
{
return ( nVal == SAW_LO_STRICT || nVal == SAW_LO_CENT || nVal == SAW_LO_EXT) ;
return ( nVal == SAW_LO_STRICT || nVal == SAW_LO_CENT || nVal == SAW_LO_OUT ||
nVal == SAW_LO_EXT_CENT || nVal == SAW_LO_EXT_OUT) ;
}
//----------------------------------------------------------------------------