Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b7eee50e55 | |||
| 3cda97534e | |||
| 5975b00def | |||
| d845442ebd | |||
| 4c25e19753 | |||
| f8de95a6b6 | |||
| 2c1cd101b2 | |||
| f5a94ee0dd | |||
| 790660e549 | |||
| d60cec01ef | |||
| 9267f902ae | |||
| 4558f5d842 | |||
| a404881759 | |||
| 77cd16a5b6 | |||
| c89683cc0e | |||
| cc50f573bc | |||
| c13dba8c9f | |||
| c8cd417dac | |||
| ce704bdcbc | |||
| 7ca922c9b6 | |||
| 4d02f573d2 | |||
| 0dfc9a38da | |||
| 4ed4445d09 | |||
| 072b47590e | |||
| 31980fb85f | |||
| f51b05da5b | |||
| 46868459ae | |||
| ac85a09ff2 | |||
| 4ed01598a5 | |||
| ec91d76869 | |||
| cee893f4ca | |||
| 4e23dbe156 | |||
| 944473df2e | |||
| efde63ba64 | |||
| 09cddcf9ac | |||
| 7dcf367d48 | |||
| 5562a0f20c | |||
| 05fb2ad32b | |||
| e146e1b6da | |||
| 701fcbdd34 | |||
| 44aef02ca1 | |||
| 01d3e7baa9 | |||
| 98aac3154c | |||
| a839a29dce | |||
| c58926bb5c | |||
| ea36a0b8a1 | |||
| c7070e5f2f | |||
| a5007038b8 | |||
| ff8e875290 | |||
| d7a5f4aa72 | |||
| 7cd3925e4c | |||
| 25f141fbf0 | |||
| ed677dfec6 | |||
| 61d5029db9 | |||
| 4cd354c85a | |||
| 0fd0b12445 | |||
| 2a3a9fefe3 | |||
| 1fef9786ac | |||
| 6d8848ec46 | |||
| 2616d97d0a | |||
| 3fa4e64cc2 | |||
| 648ca06815 | |||
| 638d252b38 | |||
| cd2a7cc921 | |||
| 919ca81c43 | |||
| 6935bec958 | |||
| 8e52fd584a | |||
| f69de493d6 | |||
| e04805a99a | |||
| ccac200e41 | |||
| 2c501206b2 | |||
| 297bc0c86d | |||
| fac69a1d65 | |||
| 4711734998 | |||
| e04a05831e | |||
| e96f467b56 | |||
| ec1ee961be | |||
| ca74fa6794 | |||
| 8242146446 | |||
| 4e2df90961 | |||
| 3393ea8325 | |||
| 1060a10491 | |||
| d46f94f8da | |||
| 3dcba13efc | |||
| e4983d5276 | |||
| fee74d47f8 | |||
| 37f4e0982f | |||
| fb5e01881d | |||
| a5096facc7 | |||
| dbe11e6343 | |||
| ed4a9ec745 | |||
| 25b940927e | |||
| 0911f167b1 | |||
| 766e6a208d | |||
| 9b0b1fe9d4 | |||
| 4d676c1f3b | |||
| 3d5398f877 | |||
| 38d63633c2 | |||
| 14b433d206 |
+66
-114
@@ -51,7 +51,6 @@ using namespace std ;
|
||||
// 2115 = "Error in Drilling : Mirror for Double calculation failed"
|
||||
// 2116 = "Error in Drilling : multi drilling head without valid tools"
|
||||
// 2117 = "Error in Drilling : incorrect multi drilling head"
|
||||
// 2118 = "Error in Drilling : Tool loading failed"
|
||||
// 2151 = "Warning in Drilling : Skipped entity (xx)"
|
||||
// 2152 = "Warning in Drilling : No machinable path"
|
||||
// 2153 = "Warning in Drilling : Tool name changed (xx)"
|
||||
@@ -97,6 +96,7 @@ struct HoleInfo {
|
||||
int nIndInSelVector = 0 ; // indice nel vettore m_vId (id fori selezionati)
|
||||
} ;
|
||||
|
||||
|
||||
struct ToolInfo
|
||||
{
|
||||
const ToolData* pTool ; // puntatore per utensile (nullo se utensile non presente)
|
||||
@@ -616,12 +616,6 @@ Drilling::Apply( bool bRecalc, bool bPostApply)
|
||||
nDblId = GDB_ID_NULL ;
|
||||
}
|
||||
|
||||
// rendo corrente l'utensile usato nella lavorazione
|
||||
if ( ! m_pMchMgr->SetCalcTool( m_TParams.m_sName, m_TParams.m_sHead, m_TParams.m_nExit)) {
|
||||
m_pMchMgr->SetLastError( 2118, "Error in Drilling : Tool loading failed") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se lavorazione standard
|
||||
if ( m_Params.m_nSubType == DRI_SUB_STD) {
|
||||
if ( ! StandardProcess( bRecalc, GDB_ID_NULL, nClId))
|
||||
@@ -718,57 +712,28 @@ Drilling::Update( bool bPostApply)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Drilling::VerifyMultiParallelFixedDrills( void)
|
||||
{
|
||||
// se aggregato da sotto, sicuramente con una sola punta
|
||||
bool bAggrBottom = IsAggrBottom( m_TParams.m_sHead) ;
|
||||
if ( bAggrBottom)
|
||||
return false ;
|
||||
// se una sola uscita, inutile continuare
|
||||
int nExitCnt = m_pMchMgr->GetCurrMachine()->GetHeadExitCount( m_TParams.m_sHead) ;
|
||||
if ( nExitCnt == 1)
|
||||
return false ;
|
||||
// verifico che le uscite siano fisse
|
||||
int nSelectType = m_pMchMgr->GetCurrMachine()->GetHeadSelectType( m_TParams.m_sHead) ;
|
||||
if ( nSelectType != MCH_SLT_FIXEDEXITS)
|
||||
return false ;
|
||||
// recupero la direzione dell'utensile principale
|
||||
Point3d ptMainExit ; Vector3d vtMainTool, vtMainAux ;
|
||||
m_pMchMgr->GetCurrMachine()->GetHeadExitPosDirAux( m_TParams.m_sHead, m_TParams.m_nExit, ptMainExit, vtMainTool, vtMainAux) ;
|
||||
// verifico ci sia almeno un'altra uscita attrezzata parallela a quella principale
|
||||
for ( int nT = 0 ; nT < nExitCnt ; ++ nT) {
|
||||
if ( nT + 1 == m_TParams.m_nExit)
|
||||
continue ;
|
||||
string sToolName ;
|
||||
if ( m_pMchMgr->GetLoadedTool( m_TParams.m_sHead, nT + 1, sToolName) && ! sToolName.empty()) {
|
||||
Point3d ptExit ; Vector3d vtTool, vtAux ;
|
||||
if ( m_pMchMgr->GetCurrMachine()->GetHeadExitPosDirAux(m_TParams.m_sHead, nT + 1, ptExit, vtTool, vtAux) &&
|
||||
AreSameVectorApprox( vtTool, vtMainTool))
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
// non è stato trovato niente
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Drilling::StandardProcess( bool bRecalc, int nPvId, int nClId)
|
||||
{
|
||||
// se ho almeno un'altra punta fissa parallela alla principale ...
|
||||
if ( VerifyMultiParallelFixedDrills()) {
|
||||
TABMHDRILL tabDrills ;
|
||||
double dMHOff = 0 ;
|
||||
if ( ! MultiHeadDrilling( m_vId, nClId, tabDrills, dMHOff))
|
||||
// controllo se ho più uscite
|
||||
string sCurrHead ;
|
||||
if ( ! m_pMchMgr->GetCurrMachine()->GetCurrHead( sCurrHead))
|
||||
return false ;
|
||||
int nExitCnt = m_pMchMgr->GetCurrMachine()->GetHeadExitCount( sCurrHead) ;
|
||||
TABMHDRILL tabDrills ;
|
||||
double dMHOff = 0 ;
|
||||
// se ho più uscite...
|
||||
if ( nExitCnt > 1) {
|
||||
if ( ! MultiHeadDrilling( nExitCnt, m_vId, nClId, tabDrills, dMHOff))
|
||||
return false ;
|
||||
if ( tabDrills.empty())
|
||||
if( tabDrills.size() == 0)
|
||||
return true ;
|
||||
int j = 0 ;
|
||||
for ( int i = 0 ; i < ( int)tabDrills.size() ; ++i) {
|
||||
// se richiesto preview
|
||||
if ( nPvId != GDB_ID_NULL) {
|
||||
if ( ! GenerateHolePv( i, m_vId[tabDrills[i][0].nInd_id_hole], MCH_PATH, nClId))
|
||||
if ( ! GenerateHolePv( j, m_vId[tabDrills[i][0].nInd_id_hole], MCH_PATH, nClId))
|
||||
return false ;
|
||||
// creo la regione di ingombro del foro
|
||||
int nDriId = m_pGeomDB->GetFirstInGroup( m_pGeomDB->GetLastGroupInGroup( nPvId)) ;
|
||||
@@ -776,15 +741,17 @@ Drilling::StandardProcess( bool bRecalc, int nPvId, int nClId)
|
||||
}
|
||||
// se richiesta lavorazione
|
||||
if ( nClId != GDB_ID_NULL) {
|
||||
if ( ! GenerateHoleCl( i, m_vId[tabDrills[i][0].nInd_id_hole], MCH_PATH, nClId, dMHOff, tabDrills[i][0].vtAux))
|
||||
if ( ! GenerateHoleCl( j, m_vId[tabDrills[i][0].nInd_id_hole], MCH_PATH, nClId, dMHOff, tabDrills[i][0].vtAux))
|
||||
return false ;
|
||||
}
|
||||
// incremento indice
|
||||
++j ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
// ... altrimenti elaboro i singoli fori
|
||||
for ( int i = 0 ; i < int( m_vId.size()) ; ++ i) {
|
||||
const auto& vId = m_vId[i] ;
|
||||
int i = 0 ;
|
||||
for ( const auto& vId : m_vId) {
|
||||
// se richiesto preview
|
||||
if ( nPvId != GDB_ID_NULL) {
|
||||
if ( ! GenerateHolePv( i, vId, MCH_PATH, nPvId))
|
||||
@@ -798,6 +765,8 @@ Drilling::StandardProcess( bool bRecalc, int nPvId, int nClId)
|
||||
if ( ! GenerateHoleCl( i, vId, MCH_PATH, nClId))
|
||||
return false ;
|
||||
}
|
||||
// incremento indice
|
||||
++i ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
@@ -805,29 +774,29 @@ Drilling::StandardProcess( bool bRecalc, int nPvId, int nClId)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDrills, double& dMHOff, bool bOrd)
|
||||
Drilling::MultiHeadDrilling( int nExitCnt, const SELVECTOR& vId, int nClId, TABMHDRILL& tabDrills, double& dMHOff, bool bOrd)
|
||||
{
|
||||
// controllo parametri
|
||||
tabDrills.clear() ;
|
||||
if ( vId.empty())
|
||||
return true ;
|
||||
|
||||
// recupero il nome della testa
|
||||
string sHead ;
|
||||
m_pMchMgr->GetCurrMachine()->GetCurrHead( sHead) ;
|
||||
|
||||
// gestore degli utensili
|
||||
ToolsMgr* pTMgr = m_pMchMgr->GetCurrToolsMgr() ;
|
||||
if ( pTMgr == nullptr)
|
||||
return false ;
|
||||
|
||||
// recupero il nome della testa e il numero di uscite
|
||||
string sHead ;
|
||||
m_pMchMgr->GetCurrMachine()->GetCurrHead( sHead) ;
|
||||
int nExitCnt = m_pMchMgr->GetCurrMachine()->GetHeadExitCount( sHead) ;
|
||||
|
||||
// Recupero i dati degli utensili montati sulla testa
|
||||
int nMainToolInd = -1 ;
|
||||
VECTORTOOL vTools ; vTools.reserve( nExitCnt) ;
|
||||
// ricavo gli utensili presenti sulle uscite
|
||||
for ( int nT = 0 ; nT < nExitCnt ; ++ nT) {
|
||||
string sToolName ;
|
||||
ToolInfo TInf ;
|
||||
if ( ! m_pMchMgr->GetLoadedTool( sHead, nT + 1, sToolName) || sToolName.empty()) {
|
||||
// non c'è utensile
|
||||
vTools.emplace_back( nullptr) ;
|
||||
@@ -847,23 +816,9 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri
|
||||
return false ;
|
||||
}
|
||||
|
||||
// recupero i dati dell'uscita dell'utensile principale
|
||||
// carico i dati della testa con le sue uscite
|
||||
Vector3d vtTool, vtAux ;
|
||||
Point3d ptExit ;
|
||||
m_pMchMgr->GetCurrMachine()->GetHeadExitPosDirAux( sHead, nMainToolInd + 1, ptExit, vtTool, vtAux) ;
|
||||
vTools[nMainToolInd].ptToolTip = ptExit - vtTool * vTools[nMainToolInd].pTool->m_dLen ;
|
||||
if ( vtAux.IsSmall() && m_pMchMgr->GetCurrMachine()->GetCurrRotAxes() == 0)
|
||||
vtAux = FromUprightOrtho( vtTool) ;
|
||||
if ( vtTool.IsSmall() || vtAux.IsSmall()) {
|
||||
m_pMchMgr->SetLastError( 2117, "Error in Drilling : incorrect multi drilling head") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// carico gli altri dati della testa con le sue uscite
|
||||
for ( int nT = 0 ; nT < nExitCnt ; ++ nT) {
|
||||
// se utensile principale, salto al successivo
|
||||
if ( nT == nMainToolInd)
|
||||
continue ;
|
||||
// se non attrezzato, salto al successivo
|
||||
if ( vTools[nT].pTool == nullptr)
|
||||
continue ;
|
||||
@@ -871,14 +826,26 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri
|
||||
Point3d ptExit ;
|
||||
Vector3d vtCurrDir, vtCurrAux ;
|
||||
m_pMchMgr->GetCurrMachine()->GetHeadExitPosDirAux( sHead, nT + 1, ptExit, vtCurrDir, vtCurrAux) ;
|
||||
// controllo abbia la stessa direzione del principale, altrimenti disattrezzo
|
||||
if ( ! AreSameVectorApprox( vtCurrDir, vtTool)) {
|
||||
vTools[nT].pTool = nullptr ;
|
||||
continue ;
|
||||
// se utensile successivo
|
||||
if ( ! vtTool.IsSmall()) {
|
||||
// controllo abbia la stessa direzione dei precedenti, altrimenti errore
|
||||
if ( ! AreSameVectorApprox( vtCurrDir, vtTool)) {
|
||||
vtTool = V_NULL ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// altrimenti primo utensile
|
||||
else {
|
||||
vtTool = vtCurrDir ;
|
||||
vtAux = vtCurrAux ;
|
||||
}
|
||||
// assegno tip utensile
|
||||
vTools[nT].ptToolTip = ptExit - vtCurrDir * vTools[nT].pTool->m_dLen ;
|
||||
}
|
||||
if ( vtTool.IsSmall() || vtAux.IsSmall()) {
|
||||
m_pMchMgr->SetLastError( 2117, "Error in Drilling : incorrect multi drilling head") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// Recupero le geometrie dei fori
|
||||
bool bSomeHoleOk = false ;
|
||||
@@ -919,7 +886,7 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri
|
||||
// i fori con dimensione 0 del vettore vToolHole non possono essere lavorati
|
||||
int nNoDrillHoles = 0 ;
|
||||
for ( int i = 0 ; i < ( int)vHoles.size() ; ++ i) {
|
||||
if ( vHoles[i].vToolHole.empty())
|
||||
if ( vHoles[i].vToolHole.size() == 0)
|
||||
++ nNoDrillHoles ;
|
||||
}
|
||||
|
||||
@@ -930,19 +897,10 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri
|
||||
// numero di fori lavorati
|
||||
int nOkHole = 0 ;
|
||||
|
||||
// se c'è un solo foro va sicuramente bene
|
||||
if ( vHoles.size() == 1 && ! vHoles[0].vVtAux.empty()) {
|
||||
vHoles[0].bForToolM = true ;
|
||||
vHoles[0].nIndTool = nMainToolInd ;
|
||||
vHoles[0].nIndHoleToolM = 0 ;
|
||||
vHoles[0].vtAux = vHoles[0].vVtAux[0] ;
|
||||
}
|
||||
|
||||
// decido in quali fori inserire il tool principale
|
||||
for ( int nCheck = 1 ; nCheck < ( int)vHoles.size() && nOkHole < ( int)vHoles.size() - nNoDrillHoles ; ++ nCheck) {
|
||||
for ( int i = 0 ; i < ( int)vHoles.size() ; ++i) {
|
||||
// prendo tutti i fori con vToolHope di lunghezza nCheck non già lavorati
|
||||
if ( vHoles[i].vToolHole.size() == nCheck && ! vHoles[i].bDrill) {
|
||||
if ( vHoles[i].vToolHole.size() == nCheck && ! vHoles[i].bDrill) { // prendo tutti i fori con vToolHope di lunghezza nCheck non già svuotati
|
||||
vHoles[vHoles[i].vToolHole[0]].bForToolM = true ;
|
||||
vHoles[vHoles[i].vToolHole[0]].nIndTool = nMainToolInd ;
|
||||
vHoles[vHoles[i].vToolHole[0]].nIndHoleToolM = vHoles[i].vToolHole[0] ;
|
||||
@@ -1097,8 +1055,6 @@ Drilling::CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, co
|
||||
// nuova configurazione del versore A ottenuta
|
||||
if ( ! m_pMchMgr->GetCalcAuxDirFromAngles( vAng1, vtAnew))
|
||||
continue ;
|
||||
if ( vtAnew.IsSmall() && m_pMchMgr->GetCurrMachine()->GetCurrRotAxes() == 0)
|
||||
vtAnew = vtAux ;
|
||||
|
||||
// creo un nuovo sistema di riferimento centrato nel Tool principale
|
||||
Frame3d frMT ;
|
||||
@@ -2110,8 +2066,6 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
GetElevation( m_nPhase, hole.ptIni, hole.vtDir, m_TParams.m_dDiam / 2, hole.vtDir, dElev) ;
|
||||
// determino alcune caratteristiche dell'utensile
|
||||
double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ;
|
||||
// necessità di spezzatura per robot
|
||||
bool bSplitArcs = GetSplitArcs( V_NULL) ;
|
||||
// imposto dati comuni
|
||||
SetPathId( nPathId) ;
|
||||
SetToolDir( hole.vtDir) ;
|
||||
@@ -2133,7 +2087,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
return false ;
|
||||
SetAuxDir( m_vtAggrBottom) ;
|
||||
SetFlag( 0) ;
|
||||
if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti rinvio normale
|
||||
@@ -2143,7 +2097,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
return false ;
|
||||
SetFlag( 0) ;
|
||||
}
|
||||
if ( AddRapidMove( ptP1, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP1) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
@@ -2156,7 +2110,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
// 2 -> punto fuori (se diverso dal precedente)
|
||||
if ( m_Params.m_dStartPos < dAppr) {
|
||||
Point3d ptP2 = hole.ptIni + hole.vtDir * ( m_Params.m_dStartPos + dTExtrLen) ;
|
||||
if ( AddRapidMove( ptP2, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP2) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// 3 -> punto termine velocità ridotta iniziale (se previsto)
|
||||
@@ -2167,7 +2121,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
Point3d ptP3 = hole.ptIni - hole.vtDir * dStartSlowLen ;
|
||||
if ( ! bStd && ! bEndSlow)
|
||||
ptP3 -= hole.vtDir * dAddLen ;
|
||||
if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// 4 -> punto termine velocità standard (se risulta)
|
||||
@@ -2178,7 +2132,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
Point3d ptP4 = hole.ptIni - hole.vtDir * ( hole.dLen - dEndSlowLen) ;
|
||||
if ( ! bEndSlow)
|
||||
ptP4 -= hole.vtDir * dAddLen ;
|
||||
if ( AddLinearMove( ptP4, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP4) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// 5 -> punto termine velocità finale ridotta (se previsto)
|
||||
@@ -2186,27 +2140,27 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double
|
||||
SetFeed( GetTipFeed()) ;
|
||||
SetFlag( 101) ; // fondo del foro
|
||||
Point3d ptP5 = hole.ptIni - hole.vtDir * ( hole.dLen + dAddLen) ;
|
||||
if ( AddLinearMove( ptP5, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP5) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// 6 -> ritorno all'approccio del foro
|
||||
SetFeed( GetEndFeed()) ;
|
||||
SetFlag( 104) ; // risalita sopra il foro
|
||||
if ( AddLinearMove( ptP1, bSplitArcs) == GDB_ID_NULL)
|
||||
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_vtAggrBottom * ( m_dDistBottom + m_AggrBottom.dEncH + dSafeZ) ;
|
||||
Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ;
|
||||
if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_OUT) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// se rinvio da sotto che richiede speciale rotazione
|
||||
if ( m_AggrBottom.nType == 1) {
|
||||
Vector3d vtAux = m_vtAggrBottom ;
|
||||
vtAux.Rotate( Z_AX, 0, 1) ;
|
||||
SetAuxDir( vtAux) ;
|
||||
if ( AddRapidMove( ptP00, bSplitArcs, MCH_CL_AGB_UP) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
@@ -2243,8 +2197,6 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
GetElevation( m_nPhase, hole.ptIni, hole.vtDir, m_TParams.m_dDiam / 2, hole.vtDir, dElev) ;
|
||||
// determino alcune caratteristiche dell'utensile
|
||||
double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ;
|
||||
// necessità di spezzatura per robot
|
||||
bool bSplitArcs = GetSplitArcs( V_NULL) ;
|
||||
// imposto dati comuni
|
||||
SetPathId( nPathId) ;
|
||||
SetToolDir( hole.vtDir) ;
|
||||
@@ -2266,7 +2218,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
return false ;
|
||||
SetFlag( 0) ;
|
||||
SetAuxDir( m_vtAggrBottom) ;
|
||||
if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti rinvio normale
|
||||
@@ -2276,7 +2228,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
return false ;
|
||||
SetFlag( 0) ;
|
||||
}
|
||||
if ( AddRapidMove( ptP1, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP1) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
@@ -2287,7 +2239,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
// 2 -> punto fuori (se diverso dal precedente)
|
||||
if ( m_Params.m_dStartPos < dAppr) {
|
||||
Point3d ptP2 = hole.ptIni + hole.vtDir * ( m_Params.m_dStartPos + dTExtrLen) ;
|
||||
if ( AddRapidMove( ptP2, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP2) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// ciclo di affondamento a step
|
||||
@@ -2307,13 +2259,13 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
SetFeed( GetEndFeed()) ;
|
||||
SetFlag( 103) ; // punto di scarico truciolo
|
||||
Point3d ptPr = hole.ptIni + hole.vtDir * dReturnPos ;
|
||||
if ( AddLinearMove( ptPr, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptPr) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// riaffondo
|
||||
SetFeed( GetEndFeed()) ;
|
||||
SetFlag( 0) ;
|
||||
Point3d ptPa = hole.ptIni - hole.vtDir * ( dCurrLen - APPR_STEP) ;
|
||||
if ( AddLinearMove( ptPa, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptPa) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// lunghezza di fine step
|
||||
@@ -2336,7 +2288,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
Point3d ptP3 = hole.ptIni - hole.vtDir * dLen ;
|
||||
if ( bHoleEnd)
|
||||
ptP3 -= hole.vtDir * dAddLen ;
|
||||
if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// aggiorno posizione e verifico se step completato
|
||||
dCurrLen = dLen ;
|
||||
@@ -2361,7 +2313,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
Point3d ptP4 = hole.ptIni - hole.vtDir * dLen ;
|
||||
if ( bHoleEnd)
|
||||
ptP4 -= hole.vtDir * dAddLen ;
|
||||
if ( AddLinearMove( ptP4, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP4) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// aggiorno posizione e verifico se step completato
|
||||
dCurrLen = dLen ;
|
||||
@@ -2385,7 +2337,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
Point3d ptP5 = hole.ptIni - hole.vtDir * dLen ;
|
||||
if ( bHoleEnd)
|
||||
ptP5 -= hole.vtDir * dAddLen ;
|
||||
if ( AddLinearMove( ptP5, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP5) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// aggiorno posizione
|
||||
dCurrLen = dLen ;
|
||||
@@ -2395,7 +2347,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
// 6 -> ritorno all'approccio del foro
|
||||
SetFeed( GetEndFeed()) ;
|
||||
SetFlag( 104) ; // risalita sopra il foro
|
||||
if ( AddLinearMove( ptP1, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP1) == GDB_ID_NULL)
|
||||
return false ;
|
||||
|
||||
// 7 -> punto fuori (se uso aggregato da sotto)
|
||||
@@ -2403,14 +2355,14 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId)
|
||||
SetFlag( 0) ;
|
||||
Point3d ptP0 = ptP1 + m_vtAggrBottom * ( m_dDistBottom + m_AggrBottom.dEncH + dSafeZ) ;
|
||||
Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ;
|
||||
if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_OUT) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// se rinvio da sotto che richiede speciale rotazione
|
||||
if ( m_AggrBottom.nType == 1) {
|
||||
Vector3d vtAux = m_vtAggrBottom ;
|
||||
vtAux.Rotate( Z_AX, 0, 1) ;
|
||||
SetAuxDir( vtAux) ;
|
||||
if ( AddRapidMove( ptP00, bSplitArcs, MCH_CL_AGB_UP) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -86,12 +86,11 @@ class Drilling : public Machining
|
||||
bool VerifyHoleFromBottom( const Hole& hole, SelData Id) ;
|
||||
bool DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double nMHOff, Vector3d vtA) ;
|
||||
bool DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) ;
|
||||
bool MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& vDrills, double& dMHOff, bool bOrd = true) ;
|
||||
bool MultiHeadDrilling( int nExitCnt, const SELVECTOR& vId, int nClId, TABMHDRILL& vDrills, double& dMHOff, bool bOrd = true) ;
|
||||
bool CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, const Vector3d& vtTool, const Vector3d& vtAux) ;
|
||||
bool CheckOtherHolesWithTools( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndTM, int nIndHTM, Hole holeICP,
|
||||
const Frame3d& frHTM, const Frame3d& frHMTOP, double dDiamToler, int& nDrills) ;
|
||||
bool MultiHeadVerifyHole( Hole& hole, const ToolData* Tool, double dDiamToler, SelData Id) ;
|
||||
bool VerifyMultiParallelFixedDrills( void) ;
|
||||
|
||||
private :
|
||||
double GetSpeed() const
|
||||
|
||||
Binary file not shown.
@@ -100,7 +100,7 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;I_AM_EMK;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;I_AM_EMK;_VRONI;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<OpenMPSupport>false</OpenMPSupport>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
|
||||
+1
-2
@@ -20,9 +20,8 @@
|
||||
const double LIN_TOL_STD = 0.1 ;
|
||||
const double LIN_TOL_MID = 0.05 ;
|
||||
const double LIN_TOL_RAW = 0.5 ;
|
||||
const double ANG_TOL_STD_DEG = 15 ;
|
||||
const double ANG_TOL_MID_DEG = 45 ;
|
||||
const double ANG_TOL_MAX_DEG = 90 ;
|
||||
const double ANG_TOL_STD_DEG = 15 ;
|
||||
const double LIN_FEA_STD = 20 ;
|
||||
|
||||
//----------- Costante per offset salva spigoli di lama su cornici curve ----
|
||||
|
||||
@@ -52,7 +52,6 @@ Head::Clone( void) const
|
||||
pHead->m_bMaxDeltaR2On1 = m_bMaxDeltaR2On1 ;
|
||||
pHead->m_Rot2Stroke = m_Rot2Stroke ;
|
||||
pHead->m_nSolCh = m_nSolCh ;
|
||||
pHead->m_vsOtherColl = m_vsOtherColl ;
|
||||
}
|
||||
catch( ...) {
|
||||
delete pHead ;
|
||||
@@ -74,7 +73,6 @@ Head::Dump( string& sOut, bool bMM, const char* szNewLine) const
|
||||
sOut += "ExitCount=" + ToString( m_nExitCount) + szNewLine ;
|
||||
sOut += "HSet=" + ToString( m_vsHSet) + szNewLine ;
|
||||
sOut += "ADir=" + ToString( m_vtADir) + szNewLine ;
|
||||
sOut += "OtherColl=" + ToString( m_vsOtherColl) + szNewLine ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -105,7 +103,7 @@ Head::GetGeomDB( void) const
|
||||
//----------------------------------------------------------------------------
|
||||
Head::Head( void)
|
||||
: m_nOwnerId( GDB_ID_NULL), m_pGeomDB( nullptr), m_nType( MCH_HT_NONE), m_nExitCount( 0),
|
||||
m_nSelectType( MCH_SLT_FIXEDEXITS), m_dRot1W( 1), m_bMaxDeltaR2On1( true), m_nSolCh( MCH_SCC_NONE)
|
||||
m_dRot1W( 1), m_bMaxDeltaR2On1( true), m_nSolCh( MCH_SCC_NONE)
|
||||
{
|
||||
m_Rot2Stroke.Min = - INFINITO ;
|
||||
m_Rot2Stroke.Max = INFINITO ;
|
||||
@@ -113,7 +111,7 @@ Head::Head( void)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Head::Set( const string& sName, int nType, int nExitCount, const string& sHSet, int nSelectType, const Vector3d& vtADir,
|
||||
Head::Set( const string& sName, int nType, int nExitCount, const string& sHSet, const Vector3d& vtADir,
|
||||
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl)
|
||||
{
|
||||
m_sName = sName ;
|
||||
@@ -124,10 +122,6 @@ Head::Set( const string& sName, int nType, int nExitCount, const string& sHSet,
|
||||
m_nExitCount = 1 ;
|
||||
m_vsHSet.clear() ;
|
||||
m_vsHSet.push_back( sHSet) ;
|
||||
if ( nSelectType == MCH_SLT_FIXEDEXITS || nSelectType == MCH_SLT_ONEEXIT || nSelectType == MCH_SLT_MULTIEXITS)
|
||||
m_nSelectType = nSelectType ;
|
||||
else
|
||||
m_nSelectType = MCH_SLT_FIXEDEXITS ;
|
||||
m_vtADir = vtADir ;
|
||||
m_vtADir.Normalize() ;
|
||||
m_dRot1W = dRot1W ;
|
||||
|
||||
@@ -30,7 +30,7 @@ class Head : public IUserObj
|
||||
|
||||
public :
|
||||
Head( void) ;
|
||||
bool Set( const std::string& sName, int nType, int nExitCount, const std::string& sHSet, int nSelectType,
|
||||
bool Set( const std::string& sName, int nType, int nExitCount, const std::string& sHSet,
|
||||
const Vector3d& vtADir, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh,
|
||||
const STRVECTOR& vsOthColl) ;
|
||||
bool AddHeadToHSet( const std::string& sHead) ;
|
||||
@@ -43,8 +43,6 @@ class Head : public IUserObj
|
||||
{ return m_nExitCount ; }
|
||||
const STRVECTOR& GetHSet(void) const
|
||||
{ return m_vsHSet ; }
|
||||
int GetSelectType( void) const
|
||||
{ return m_nSelectType ; }
|
||||
const Vector3d& GetADir( void) const
|
||||
{ return m_vtADir ; }
|
||||
double GetRot1W( void) const
|
||||
@@ -65,7 +63,6 @@ class Head : public IUserObj
|
||||
int m_nType ;
|
||||
int m_nExitCount ;
|
||||
STRVECTOR m_vsHSet ;
|
||||
int m_nSelectType ;
|
||||
Vector3d m_vtADir ;
|
||||
double m_dRot1W ;
|
||||
bool m_bMaxDeltaR2On1 ;
|
||||
|
||||
@@ -47,10 +47,6 @@ const std::string MACH_RAW_SOLID = "RawSolid" ;
|
||||
const std::string MACH_RAW_CENTER = "RawCenter" ;
|
||||
// Nome del contorno esterno del grezzo
|
||||
const std::string MACH_RAW_OUTLINE = "RawOutline" ;
|
||||
// Nome della regione superiore del grezzo
|
||||
const std::string MACH_RAW_UP_REG = "RawUpReg" ;
|
||||
// Nome della regione inferiore del grezzo
|
||||
const std::string MACH_RAW_DOWN_REG = "RawDwnReg" ;
|
||||
// Nome del kerf del grezzo
|
||||
const std::string MACH_RAW_KERF = "Kerf" ;
|
||||
|
||||
@@ -135,7 +131,6 @@ const double LIO_ELEV_TOL = 2.0 ;
|
||||
//----------------------------------------------------------------------------
|
||||
// Per FlatParts (vedi Nesting di EgtExecutor)
|
||||
const std::string NST_EXT_LAYER = "OutLoop" ;
|
||||
const std::string NST_PARTREG_LAYER = "Region" ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Minima componente zeta di versore utensile per lavorazione da sopra (-45deg)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2024
|
||||
// EgalTech 2015-2023
|
||||
//----------------------------------------------------------------------------
|
||||
// File : MachMgr.h Data : 02.04.24 Versione : 2.6d1
|
||||
// File : MachMgr.h Data : 28.10.23 Versione : 2.5j4
|
||||
// Contenuto : Dichiarazione della classe MachMgr.
|
||||
//
|
||||
//
|
||||
@@ -13,8 +13,6 @@
|
||||
// 21.09.22 DS Aggiunta GetAxisOffset.
|
||||
// 25.08.23 DS Aggiunta CopyMachGroup.
|
||||
// 28.10.23 DS Aggiunte GetClEntAxesVal e GetToolSetupPosInCurrSetup.
|
||||
// 30.03.24 DS Aggiunte GetAllAxesNames e GetCalcTable.
|
||||
// 02.04.24 DS Aggiunta GetClEntAxesMask.
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
@@ -101,7 +99,6 @@ class MachMgr : public IMachMgr
|
||||
int AddMachGroup( const std::string& sName, const std::string& sMachineName) override ;
|
||||
int CopyMachGroup( const std::string& sSouName, const std::string& sName) override ;
|
||||
bool RemoveMachGroup( int nId) override ;
|
||||
bool ChangeMachGroupName( int nId, const std::string& sNewName) override ;
|
||||
std::string GetMachGroupName( int nId) const override ;
|
||||
std::string GetMachGroupMachineName( int nId) const override ;
|
||||
int GetMachGroupId( const std::string& sName) const override ;
|
||||
@@ -310,7 +307,6 @@ class MachMgr : public IMachMgr
|
||||
bool GetClEntMove( int nEntId, int& nMove) const override ;
|
||||
bool GetClEntFlag( int nEntId, int& nFlag, int& nFlag2) const override ;
|
||||
bool GetClEntIndex( int nEntId, int& nIndex) const override ;
|
||||
bool GetClEntAxesMask( int nEntId, int& nMask) const override ;
|
||||
bool GetClEntAxesVal( int nEntId, DBLVECTOR& vAxes) const override ;
|
||||
// Simulation
|
||||
bool SimInit( void) override ;
|
||||
@@ -330,10 +326,9 @@ class MachMgr : public IMachMgr
|
||||
// Machine Calc
|
||||
bool SetCalcTable( const std::string& sTable) override ;
|
||||
bool SetCalcTool( const std::string& sTool, const std::string& sHead, int nExit) override ;
|
||||
bool GetAllCurrAxesNames( STRVECTOR& vAxName) const override ;
|
||||
bool GetAllCurrAxesName( STRVECTOR& vAxName) const override ;
|
||||
bool SetRotAxisBlock( const std::string& sAxis, double dVal) override ;
|
||||
bool GetRotAxisBlocked( int nInd, std::string& sAxis, double& dVal) const override ;
|
||||
bool GetCalcTable( std::string& sTable) const override ;
|
||||
bool GetCalcTool( std::string& sTool) const override ;
|
||||
bool GetCalcHead( std::string& sHead) const override ;
|
||||
bool GetCalcExit( int& nExit) const override ;
|
||||
@@ -374,7 +369,6 @@ class MachMgr : public IMachMgr
|
||||
bool ResetAxisPos( const std::string& sAxis) override ;
|
||||
bool ResetAllAxesPos( void) override ;
|
||||
bool GetAllTablesNames( STRVECTOR& vNames) const override ;
|
||||
bool GetAllAxesNames( STRVECTOR& vNames) const override ;
|
||||
bool GetAllHeadsNames( STRVECTOR& vNames) const override ;
|
||||
bool GetAllTcPosNames( STRVECTOR& vNames) const override ;
|
||||
bool LoadTool( const std::string& sHead, int nExit, const std::string& sTool) override ;
|
||||
@@ -445,8 +439,6 @@ class MachMgr : public IMachMgr
|
||||
bool GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const ;
|
||||
bool GetCurrAxisHomePos( int nInd, double& dHome) const ;
|
||||
const Frame3d& GetCurrLinAxesFrame( void) const ;
|
||||
bool GetCurrIsCenter( void) const ;
|
||||
bool GetCurrIsRobot( void) const ;
|
||||
bool ApplyRotAxisBlock( void) ;
|
||||
void ClearRotAxisBlock( void)
|
||||
{ m_vAxisBlock.clear() ; }
|
||||
@@ -499,7 +491,6 @@ class MachMgr : public IMachMgr
|
||||
// RawParts
|
||||
int AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) ;
|
||||
int AddRawPart( int nSurfId, Color cCol) ;
|
||||
int AddRawPart( int nSurfUpId, int nSurfDownId, double dHeight, Color cCol) ;
|
||||
bool SetRawPartCenter( int nRawId) ;
|
||||
bool ResetRawPartCenter( int nRawId) ;
|
||||
// Parts
|
||||
|
||||
@@ -75,24 +75,6 @@ MachMgr::GetClEntIndex( int nEntId, int& nIndex) const
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetClEntAxesMask( int nEntId, int& nMask) const
|
||||
{
|
||||
// default
|
||||
nMask = 0 ;
|
||||
// verifico validita GeomDB
|
||||
if ( m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
// recupero l'oggetto CamData
|
||||
const CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ;
|
||||
if ( pCamData == nullptr)
|
||||
return false ;
|
||||
// recupero il tipo di movimento
|
||||
nMask = pCamData->GetAxesMask() ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetClEntAxesVal( int nEntId, DBLVECTOR& vAxes) const
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2024
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : MachMgrDBMachinings.cpp Data : 29.03.24 Versione : 2.6d1
|
||||
// File : MachMgrDBMachinings.cpp Data : 11.11.15 Versione : 1.6k5
|
||||
// Contenuto : Implementazione gestione DB lavorazioni della classe MachMgr.
|
||||
//
|
||||
//
|
||||
@@ -304,8 +304,6 @@ MachMgr::MdbSetGeneralParam( int nType, double dVal)
|
||||
return pMsMgr->SetSafeAggrBottZ( dVal) ;
|
||||
case MGP_MAXDEPTHSAFE :
|
||||
return pMsMgr->SetMaxDepthSafe( dVal) ;
|
||||
case MGP_APPROXLINTOL :
|
||||
return pMsMgr->SetApproxLinTol( dVal) ;
|
||||
}
|
||||
return false ;
|
||||
}
|
||||
@@ -381,9 +379,6 @@ MachMgr::MdbGetGeneralParam( int nType, double& dVal) const
|
||||
case MGP_MAXDEPTHSAFE :
|
||||
dVal = pMsMgr->GetMaxDepthSafe() ;
|
||||
return true ;
|
||||
case MGP_APPROXLINTOL :
|
||||
dVal = pMsMgr->GetApproxLinTol() ;
|
||||
return true ;
|
||||
}
|
||||
return false ;
|
||||
}
|
||||
|
||||
@@ -760,8 +760,6 @@ MachMgr::UpdateCustomToolDraw( const ToolData* pTdata, int nGenCtx, int nToolCtx
|
||||
pTdata->GetParam( TPA_DIAM, dDiam) ;
|
||||
double dDist = 0 ;
|
||||
pTdata->GetParam( TPA_DIST, dDist) ;
|
||||
double dSpeed = 0 ;
|
||||
pTdata->GetParam( TPA_SPEED, dSpeed) ;
|
||||
// Imposto contesto per il disegno utensile
|
||||
if ( ! ExeSetCurrentContext( nToolCtx))
|
||||
return TD_INT_ERR ;
|
||||
@@ -771,7 +769,6 @@ MachMgr::UpdateCustomToolDraw( const ToolData* pTdata, int nGenCtx, int nToolCtx
|
||||
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.LEN", dLen) ;
|
||||
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIAM", dDiam) ;
|
||||
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIST", dDist) ;
|
||||
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.SPEED", dSpeed) ;
|
||||
// Eseguo aggiornamento utensile
|
||||
bOk = bOk && ExeLuaCallFunction( "AdjustCustomTool") ;
|
||||
// Recupero errore
|
||||
|
||||
+19
-32
@@ -268,60 +268,44 @@ MachMgr::VerifyMachGroup( int nId, MachGrp& mgData) const
|
||||
// verifica della macchina
|
||||
bool bMName = m_pGeomDB->GetInfo( nId, MACH_MACHINE_KEY, mgData.MGeoName) ;
|
||||
// scansiono i sottogruppi
|
||||
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( m_pGeomDB)) ;
|
||||
if ( IsNull( pIter))
|
||||
return false ;
|
||||
bool bSetup = false ;
|
||||
bool bFixt = false ;
|
||||
bool bRaw = false ;
|
||||
bool bOper = false ;
|
||||
int nGrpId = m_pGeomDB->GetFirstGroupInGroup( nId) ;
|
||||
while ( nGrpId != GDB_ID_NULL) {
|
||||
bool bIter = pIter->GoToFirstGroupInGroup( nId) ;
|
||||
while ( bIter) {
|
||||
string sName ;
|
||||
if ( m_pGeomDB->GetName( nGrpId, sName)) {
|
||||
if ( pIter->GetName( sName)) {
|
||||
if ( sName == MACH_SETUP_GROUP) {
|
||||
if ( ! bSetup)
|
||||
mgData.SetupGroupId = nGrpId ;
|
||||
mgData.SetupGroupId = pIter->GetId() ;
|
||||
bSetup = true ;
|
||||
}
|
||||
else if ( sName == MACH_FIXT_GROUP) {
|
||||
if ( ! bFixt)
|
||||
mgData.FixtGroupId = nGrpId ;
|
||||
mgData.FixtGroupId = pIter->GetId() ;
|
||||
bFixt = true ;
|
||||
}
|
||||
else if ( sName == MACH_RAW_GROUP) {
|
||||
if ( ! bRaw)
|
||||
mgData.RawGroupId = nGrpId ;
|
||||
mgData.RawGroupId = pIter->GetId() ;
|
||||
bRaw = true ;
|
||||
}
|
||||
else if ( sName == MACH_OPER_GROUP) {
|
||||
if ( ! bOper)
|
||||
mgData.OperGroupId = nGrpId ;
|
||||
mgData.OperGroupId = pIter->GetId() ;
|
||||
bOper = true ;
|
||||
}
|
||||
}
|
||||
// passo al successivo
|
||||
nGrpId = m_pGeomDB->GetNextGroup( nGrpId) ;
|
||||
bIter = pIter->GoToNextGroup() ;
|
||||
}
|
||||
return ( bMName && bSetup && bRaw && bOper) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::ChangeMachGroupName( int nId, const string& sNewName)
|
||||
{
|
||||
// verifica del gruppo base per le lavorazioni
|
||||
if ( ! VerifyMachBase())
|
||||
return false ;
|
||||
// verifico che il gruppo ricevuto sia corretto
|
||||
if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId)
|
||||
return false ;
|
||||
// verifico nome non vuoto e non esista già un gruppo con lo stesso nome
|
||||
if ( &sNewName == nullptr || sNewName.empty() || GetMachGroupId( sNewName) != GDB_ID_NULL)
|
||||
return false ;
|
||||
// cambio il nome del gruppo di lavoro
|
||||
if ( ! m_pGeomDB->SetName( nId, sNewName))
|
||||
return false ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
string
|
||||
MachMgr::GetMachGroupName( int nId) const
|
||||
@@ -365,14 +349,17 @@ MachMgr::GetMachGroupId( const string& sName) const
|
||||
if ( ! VerifyMachBase())
|
||||
return GDB_ID_NULL ;
|
||||
// recupero l'identificativo del gruppo con il nome indicato
|
||||
int nGrpId = m_pGeomDB->GetFirstGroupInGroup( m_nMachBaseId) ;
|
||||
while ( nGrpId != GDB_ID_NULL) {
|
||||
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( m_pGeomDB)) ;
|
||||
if ( IsNull( pIter))
|
||||
return GDB_ID_NULL ;
|
||||
bool bIter = pIter->GoToFirstGroupInGroup( m_nMachBaseId) ;
|
||||
while( bIter) {
|
||||
// verifico il nome
|
||||
string sMGroupName ;
|
||||
if ( m_pGeomDB->GetName( nGrpId, sMGroupName) && EqualNoCase( sMGroupName, sName))
|
||||
return nGrpId ;
|
||||
if ( pIter->GetName( sMGroupName) && EqualNoCase( sMGroupName, sName))
|
||||
return pIter->GetId() ;
|
||||
// passo al successivo
|
||||
nGrpId = m_pGeomDB->GetNextGroup( nGrpId) ;
|
||||
bIter = pIter->GoToNextGroup() ;
|
||||
}
|
||||
return GDB_ID_NULL ;
|
||||
}
|
||||
|
||||
+2
-41
@@ -534,14 +534,6 @@ MachMgr::SetCalcSolCh( int nScc, bool bExact)
|
||||
return pMch->SetSolCh( nScc, bExact) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetCalcTable( string& sTable) const
|
||||
{
|
||||
Machine* pMch = GetCurrMachine() ;
|
||||
return ( ( pMch != nullptr) ? pMch->GetCurrTable( sTable) : false) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetCalcTool( string& sTool) const
|
||||
@@ -617,17 +609,6 @@ MachMgr::GetAllTablesNames( STRVECTOR& vNames) const
|
||||
return ( ( pMch != nullptr) ? pMch->GetAllTablesNames( vNames) : false) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetAllAxesNames( STRVECTOR& vNames) const
|
||||
{
|
||||
// pulisco il vettore
|
||||
vNames.clear() ;
|
||||
// richiedo elenco assi alla macchina corrente
|
||||
Machine* pMch = GetCurrMachine() ;
|
||||
return ( ( pMch != nullptr) ? pMch->GetAllAxesNames( vNames) : false) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetAllHeadsNames( STRVECTOR& vNames) const
|
||||
@@ -668,10 +649,10 @@ MachMgr::GetCurrRotAxes( void) const
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetAllCurrAxesNames( STRVECTOR& vAxName) const
|
||||
MachMgr::GetAllCurrAxesName( STRVECTOR& vAxName) const
|
||||
{
|
||||
Machine* pMch = GetCurrMachine() ;
|
||||
return ( ( pMch != nullptr) ? pMch->GetAllCurrAxesNames( vAxName) : false) ;
|
||||
return ( ( pMch != nullptr) ? pMch->GetAllCurrAxesName( vAxName) : false) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -702,26 +683,6 @@ MachMgr::GetCurrLinAxesFrame( void) const
|
||||
return pMch->GetCurrLinAxesFrame() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetCurrIsCenter( void) const
|
||||
{
|
||||
Machine* pMch = GetCurrMachine() ;
|
||||
if ( pMch == nullptr)
|
||||
return false ;
|
||||
return ( pMch->GetCurrKinematicChainType() == KIN_CHAIN_CENTER) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetCurrIsRobot( void) const
|
||||
{
|
||||
Machine* pMch = GetCurrMachine() ;
|
||||
if ( pMch == nullptr)
|
||||
return false ;
|
||||
return ( pMch->GetCurrKinematicChainType() == KIN_CHAIN_ROBOT) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::GetCalcAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
|
||||
+134
-409
@@ -29,7 +29,6 @@
|
||||
#include "/EgtDev/Include/EGkStmStandard.h"
|
||||
#include "/EgtDev/Include/EGkStmFromCurves.h"
|
||||
#include "/EgtDev/Include/EgtPointerOwner.h"
|
||||
#include "/EgtDev/Include/EXeConst.h"
|
||||
|
||||
using namespace std ;
|
||||
|
||||
@@ -97,7 +96,7 @@ MachMgr::AddRawPart( const Point3d& ptOrig, double dLen, double dWidth, double d
|
||||
m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ;
|
||||
// creo solido e outline
|
||||
bOk = bOk && ModifyRawPart( nRawId, ptOrig, dLen, dWidth, dHeight, cCol) ;
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
if ( ! bOk) {
|
||||
m_pGeomDB->Erase( nRawId) ;
|
||||
return GDB_ID_NULL ;
|
||||
@@ -113,7 +112,7 @@ MachMgr::ModifyRawPart( int nRawId, const Point3d& ptOrig, double dLen, double d
|
||||
// le dimensioni non possono essere nulle
|
||||
if ( dLen < EPS_SMALL || dWidth < EPS_SMALL || dHeight < EPS_SMALL)
|
||||
return false ;
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// creo il solido
|
||||
@@ -172,7 +171,7 @@ MachMgr::AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color
|
||||
// verifico il gruppo dei grezzi nella macchinata corrente
|
||||
if ( GetCurrRawGroupId() == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
// verifico che il pezzo non sia già usato nella macchinata corrente
|
||||
// verifico che il pezzo non sia già usato nella macchinata corrente
|
||||
if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT)
|
||||
return GDB_ID_NULL ;
|
||||
// recupero il tipo di oggetto per definire il grezzo
|
||||
@@ -181,7 +180,7 @@ MachMgr::AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color
|
||||
Point3d ptRef ;
|
||||
// costruzione del grezzo
|
||||
int nRawId = GDB_ID_NULL ;
|
||||
// se grezzo da superficie (per ora senza possibilità di offset)
|
||||
// se grezzo da superficie (per ora senza possibilità di offset)
|
||||
if ( ( nGtype & GEO_SURF) != 0) {
|
||||
// inserisco il grezzo
|
||||
nRawId = AddRawPart( nCrvSrfId, cCol) ;
|
||||
@@ -285,7 +284,7 @@ MachMgr::AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight,
|
||||
m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ;
|
||||
// creo solido e outline
|
||||
bOk = bOk && ModifyRawPart( nRawId, nCrvId, dOverMat, dZmin, dHeight, cCol) ;
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
if ( ! bOk) {
|
||||
m_pGeomDB->Erase( nRawId) ;
|
||||
return GDB_ID_NULL ;
|
||||
@@ -298,7 +297,7 @@ MachMgr::AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight,
|
||||
bool
|
||||
MachMgr::ModifyRawPart( int nRawId, int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol)
|
||||
{
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// recupero il riferimento della curva
|
||||
@@ -322,7 +321,7 @@ MachMgr::ModifyRawPart( int nRawId, int nCrvId, double dOverMat, double dZmin, d
|
||||
// la schiaccio a Z = 0
|
||||
if ( ! pMyCrv->Scale( Frame3d(), 1, 1, 0))
|
||||
return false ;
|
||||
// se non è chiusa, la chiudo
|
||||
// se non è chiusa, la chiudo
|
||||
pMyCrv->Close() ;
|
||||
// la oriento in senso CCW
|
||||
double dAreaXY ;
|
||||
@@ -376,11 +375,11 @@ MachMgr::AddRawPart( int nSurfId, Color cCol)
|
||||
if ( nRawGroupId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
// recupero l'ingombro della superficie in globale
|
||||
BBox3d b3Surf ;
|
||||
if ( ! m_pGeomDB->GetGlobalBBox( nSurfId, b3Surf))
|
||||
BBox3d b3Crv ;
|
||||
if ( ! m_pGeomDB->GetGlobalBBox( nSurfId, b3Crv))
|
||||
return GDB_ID_NULL ;
|
||||
// inserisco il gruppo del grezzo nella macchinata
|
||||
Frame3d frRaw( b3Surf.GetMin()) ;
|
||||
Frame3d frRaw( b3Crv.GetMin()) ;
|
||||
int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ;
|
||||
if ( nRawId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
@@ -457,11 +456,11 @@ MachMgr::AddRawPart( int nSurfId, Color cCol)
|
||||
int nCrvId = ( bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pCrvCompo)) : GDB_ID_NULL) ;
|
||||
bOk = bOk && ( nCrvId != GDB_ID_NULL) ;
|
||||
// assegno il nome alla curva
|
||||
bOk = bOk && m_pGeomDB->SetName( nCrvId, MACH_RAW_OUTLINE) ;
|
||||
bOk = bOk && m_pGeomDB->SetName( nCrvId, MACH_RAW_SOLID) ;
|
||||
// assegno il colore alla curva
|
||||
bOk = bOk && m_pGeomDB->SetMaterial( nCrvId, cCol) ;
|
||||
bOk = bOk && m_pGeomDB->SetMaterial( nCrvId, cCol) ;
|
||||
}
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
if ( ! bOk) {
|
||||
m_pGeomDB->Erase( nRawId) ;
|
||||
return GDB_ID_NULL ;
|
||||
@@ -472,156 +471,6 @@ MachMgr::AddRawPart( int nSurfId, Color cCol)
|
||||
return nRawId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
MachMgr::AddRawPart( int nSfrUpId, int nSfrDownId, double dHeight, Color cCol)
|
||||
{
|
||||
// recupero il gruppo dei grezzi nella macchinata corrente
|
||||
int nRawGroupId = GetCurrRawGroupId() ;
|
||||
if ( nRawGroupId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
|
||||
// recupero l'ingombro della superficie up in globale
|
||||
BBox3d b3Surf ;
|
||||
if ( ! m_pGeomDB->GetGlobalBBox( nSfrUpId, b3Surf))
|
||||
return GDB_ID_NULL ;
|
||||
// inserisco il gruppo del grezzo nella macchinata
|
||||
Frame3d frRaw( b3Surf.GetMin()) ;
|
||||
int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ;
|
||||
if ( nRawId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
// assegno il nome al gruppo
|
||||
bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ;
|
||||
// assegno la fase al gruppo
|
||||
bOk = bOk && m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ;
|
||||
|
||||
// recupero il frame originale della superficie up ( deve essere lo stesso della down)
|
||||
Frame3d frSurf ;
|
||||
bOk = bOk && m_pGeomDB->GetGlobFrame( nSfrUpId, frSurf) ;
|
||||
|
||||
// creo il volume in modo approssimativo a partire dalle due superfici considerando soltanto un'approssimazione dei bordi esterni
|
||||
// regione up
|
||||
PtrOwner<ISurfFlatRegion> pSurfUp( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrUpId))) ;
|
||||
bOk = bOk && ( ! IsNull( pSurfUp)) ;
|
||||
// calcolo offset e contro-offset per unificare i chunk ed eliminare eventuali rientranze nella superficie
|
||||
double dOffs = 8 ;
|
||||
bOk = bOk && pSurfUp->Offset( dOffs, ICurve::OFF_FILLET) ;
|
||||
bOk = bOk && pSurfUp->Offset( -dOffs, ICurve::OFF_FILLET) ;
|
||||
// recupero il chunk di area maggiore
|
||||
int nKMax = 0 ;
|
||||
if ( bOk && pSurfUp->GetChunkCount() > 1) {
|
||||
double dAreaMax = -1 ;
|
||||
for ( int k = 0 ; k < pSurfUp->GetChunkCount() ; k ++) {
|
||||
PtrOwner<ISurfFlatRegion> pSfrChunk( pSurfUp->CloneChunk( k)) ;
|
||||
double dArea = -1 ; pSfrChunk->GetGrossArea( dArea) ;
|
||||
if ( dArea > dAreaMax) {
|
||||
nKMax = k ;
|
||||
dAreaMax = dArea ;
|
||||
}
|
||||
}
|
||||
}
|
||||
PtrOwner<ICurve> pCrvUp ;
|
||||
bOk = bOk && pCrvUp.Set( pSurfUp->GetLoop( nKMax, 0)) ;
|
||||
bOk = bOk && ( ! IsNull( pCrvUp)) ;
|
||||
|
||||
// regione down
|
||||
PtrOwner<ISurfFlatRegion> pSurfDown( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrDownId))) ;
|
||||
bOk = bOk && ( ! IsNull( pSurfDown)) ;
|
||||
bOk = bOk && pSurfDown->Offset( dOffs, ICurve::OFF_FILLET) ;
|
||||
bOk = bOk && pSurfDown->Offset( -dOffs, ICurve::OFF_FILLET) ;
|
||||
nKMax = 0 ;
|
||||
if ( bOk && pSurfDown->GetChunkCount() > 1) {
|
||||
double dAreaMax = -1 ;
|
||||
for ( int k = 0 ; k < pSurfDown->GetChunkCount() ; k ++) {
|
||||
PtrOwner<ISurfFlatRegion> pSfrChunk( pSurfDown->CloneChunk( k)) ;
|
||||
double dArea = -1 ; pSfrChunk->GetGrossArea( dArea) ;
|
||||
if ( dArea > dAreaMax) {
|
||||
nKMax = k ;
|
||||
dAreaMax = dArea ;
|
||||
}
|
||||
}
|
||||
}
|
||||
PtrOwner<ICurveComposite> pCrvDown ;
|
||||
bOk = bOk && pCrvDown.Set( ConvertCurveToComposite( pSurfDown->GetLoop( nKMax, 0))) ;
|
||||
bOk = bOk && ( ! IsNull( pCrvDown)) ;
|
||||
// sposto il punto di inizio il più vicino possibile a quello della curva up per migliorare il calcolo della rigata
|
||||
if ( bOk) {
|
||||
Point3d ptS ; pCrvUp->GetStartPoint( ptS) ;
|
||||
DistPointCurve distPC( ptS, *pCrvDown) ;
|
||||
double dPar ; int nFlag ;
|
||||
bOk = bOk && distPC.GetParamAtMinDistPoint( 0, dPar, nFlag) ;
|
||||
bOk = bOk && pCrvDown->ChangeStartPoint( dPar) ;
|
||||
}
|
||||
|
||||
// volume
|
||||
PtrOwner<ISurfTriMesh> pStmRaw ;
|
||||
bOk = bOk && pStmRaw.Set( GetSurfTriMeshByFlatContour( pCrvUp)) ;
|
||||
bOk = bOk && ( ! IsNull( pStmRaw)) ;
|
||||
PtrOwner<ISurfTriMesh> pStmLat ;
|
||||
bOk = bOk && pStmLat.Set( GetSurfTriMeshRuled( pCrvDown, pCrvUp, ISurfTriMesh::RLT_MINDIST)) ;
|
||||
bOk = bOk && ( ! IsNull( pStmLat)) ;
|
||||
bOk = bOk && pStmRaw->DoSewing( *pStmLat) ;
|
||||
PtrOwner<ISurfTriMesh> pStmDown ;
|
||||
bOk = bOk && pStmDown.Set( GetSurfTriMeshByFlatContour( pCrvDown)) ;
|
||||
|
||||
bOk = bOk && pStmDown->Invert() ;
|
||||
bOk = bOk && pStmRaw->DoSewing( *pStmDown) ;
|
||||
bOk = bOk && pStmRaw->DoCompacting() ;
|
||||
bOk = bOk && pStmRaw->Repair() ;
|
||||
bOk = bOk && pStmRaw->LocToLoc( frSurf, frRaw) ;
|
||||
int nId = bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pStmRaw)) : GDB_ID_NULL ;
|
||||
bOk = bOk && ( nId != GDB_ID_NULL) ;
|
||||
// assegno il nome al solido
|
||||
bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ;
|
||||
// assegno il colore al solido
|
||||
bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ;
|
||||
// rendo visibile il solido
|
||||
bOk = bOk && m_pGeomDB->SetStatus( nId, GDB_ST_ON) ;
|
||||
// calcolo il punto centro del solido
|
||||
bOk = bOk && SetRawPartCenter( nRawId) ;
|
||||
|
||||
if ( bOk) {
|
||||
// costruisco la curva di contorno
|
||||
PtrOwner<ISurfFlatRegion> pSfrUp( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrUpId))) ;
|
||||
PtrOwner<ISurfFlatRegion> pSfrDown( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrDownId))) ;
|
||||
bOk = bOk && ( ! IsNull( pSfrUp)) && ( ! IsNull( pSfrDown)) ;
|
||||
if ( bOk)
|
||||
pSfrUp->Add( *pSfrDown) ;
|
||||
PtrOwner<ICurve> pCrv ;
|
||||
bOk = bOk && pCrv.Set( pSfrUp->GetLoop( 0, 0)) ;
|
||||
bOk = bOk && ( ! IsNull( pCrv)) ;
|
||||
bOk = bOk && pCrv->LocToLoc( frSurf, frRaw) ;
|
||||
int nLoop = bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pCrv)) : GDB_ID_NULL ;
|
||||
bOk = bOk && ( nLoop != GDB_ID_NULL) ;
|
||||
bOk = bOk && ExeMove( {nLoop}, -dHeight * Z_AX, RTY_LOC) ;
|
||||
// assegno il nome alla curva
|
||||
bOk = bOk && m_pGeomDB->SetName( nLoop, MACH_RAW_OUTLINE) ;
|
||||
// assegno il colore alla curva
|
||||
bOk = bOk && m_pGeomDB->SetMaterial( nLoop, cCol) ;
|
||||
|
||||
// recupero le superfici up e down
|
||||
int nSurfUpId = ( bOk ? m_pGeomDB->CopyGlob( nSfrUpId, GDB_ID_NULL, nRawId) : GDB_ID_NULL) ;
|
||||
bOk = bOk && ( nSurfUpId != GDB_ID_NULL) ;
|
||||
bOk = bOk && m_pGeomDB->SetName( nSurfUpId, MACH_RAW_UP_REG) ;
|
||||
bOk = bOk && m_pGeomDB->SetMaterial( nSurfUpId, cCol) ;
|
||||
bOk = bOk && m_pGeomDB->SetStatus( nSurfUpId, GDB_ST_OFF) ;
|
||||
int nSurfDownId = ( bOk ? m_pGeomDB->CopyGlob( nSfrDownId, GDB_ID_NULL, nRawId) : GDB_ID_NULL) ;
|
||||
bOk = bOk && ( nSurfDownId != GDB_ID_NULL) ;
|
||||
bOk = bOk && m_pGeomDB->SetName( nSurfDownId, MACH_RAW_DOWN_REG) ;
|
||||
bOk = bOk && m_pGeomDB->SetMaterial( nSurfDownId, cCol) ;
|
||||
bOk = bOk && m_pGeomDB->SetStatus( nSurfDownId, GDB_ST_OFF) ;
|
||||
}
|
||||
|
||||
// se qualcosa è andato storto, cancello tutto
|
||||
if ( ! bOk) {
|
||||
m_pGeomDB->Erase( nRawId) ;
|
||||
return GDB_ID_NULL ;
|
||||
}
|
||||
|
||||
// tutto ok
|
||||
return nRawId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dHeight)
|
||||
@@ -629,7 +478,7 @@ MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dH
|
||||
// le nuove dimensioni non possono essere nulle
|
||||
if ( dLength < EPS_SMALL || dWidth < EPS_SMALL || dHeight < EPS_SMALL)
|
||||
return false ;
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// recupero il solido del grezzo
|
||||
@@ -671,10 +520,10 @@ MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dH
|
||||
bool
|
||||
MachMgr::ModifyRawPartHeight( int nRawId, double dHeight)
|
||||
{
|
||||
// la nuova altezza non può essere nulla
|
||||
// la nuova altezza non può essere nulla
|
||||
if ( dHeight < EPS_SMALL)
|
||||
return false ;
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// recupero il solido del grezzo
|
||||
@@ -703,10 +552,10 @@ MachMgr::GetRawPartPhases( int nRawId, INTVECTOR& vPhase) const
|
||||
{
|
||||
// pulisco parametro di ritorno
|
||||
vPhase.clear() ;
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// recupero le fasi in cui è presente il grezzo (se manca è fase 1)
|
||||
// recupero le fasi in cui è presente il grezzo (se manca è fase 1)
|
||||
if ( ! m_pGeomDB->GetInfo( nRawId, MACH_RAW_PHASE, vPhase) || vPhase.empty())
|
||||
vPhase.emplace_back( 1) ;
|
||||
return true ;
|
||||
@@ -716,11 +565,11 @@ MachMgr::GetRawPartPhases( int nRawId, INTVECTOR& vPhase) const
|
||||
bool
|
||||
MachMgr::KeepRawPart( int nRawId, int nSouPhase)
|
||||
{
|
||||
// verifico validità e recupero fasi in cui è presente
|
||||
// verifico validità e recupero fasi in cui è presente
|
||||
INTVECTOR vPhase ;
|
||||
if ( ! GetRawPartPhases( nRawId, vPhase))
|
||||
return false ;
|
||||
// se fase corrente già presente, non devo fare alcunché
|
||||
// se fase corrente già presente, non devo fare alcunché
|
||||
if ( find( vPhase.begin(), vPhase.end(), m_nCurrPhase) != vPhase.end())
|
||||
return true ;
|
||||
// aggiungo la fase corrente
|
||||
@@ -772,7 +621,7 @@ MachMgr::KeepRawPart( int nRawId, int nSouPhase)
|
||||
bool
|
||||
MachMgr::VerifyRawPartPhase( int nRawId, int nPhase) const
|
||||
{
|
||||
// verifico validità e recupero fasi in cui è presente
|
||||
// verifico validità e recupero fasi in cui è presente
|
||||
INTVECTOR vPhase ;
|
||||
if ( ! GetRawPartPhases( nRawId, vPhase))
|
||||
return false ;
|
||||
@@ -784,11 +633,11 @@ MachMgr::VerifyRawPartPhase( int nRawId, int nPhase) const
|
||||
bool
|
||||
MachMgr::RemoveRawPartFromCurrPhase( int nRawId)
|
||||
{
|
||||
// verifico validità e recupero fasi in cui è presente
|
||||
// verifico validità e recupero fasi in cui è presente
|
||||
INTVECTOR vPhase ;
|
||||
if ( ! GetRawPartPhases( nRawId, vPhase))
|
||||
return false ;
|
||||
// se non appartiene alla fase corrente, non devo fare alcunché
|
||||
// se non appartiene alla fase corrente, non devo fare alcunché
|
||||
auto iIter = find( vPhase.begin(), vPhase.end(), m_nCurrPhase) ;
|
||||
if ( iIter == vPhase.end())
|
||||
return true ;
|
||||
@@ -815,7 +664,7 @@ MachMgr::RemoveRawPartFromCurrPhase( int nRawId)
|
||||
bool
|
||||
MachMgr::RemoveRawPart( int nRawId)
|
||||
{
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// tolgo dalle disposizioni in cui compare gli eventuali movimenti registrati di questo grezzo
|
||||
@@ -839,7 +688,7 @@ MachMgr::VerifyRawPart( int nRawId, bool bLinkedAllowed) const
|
||||
int nRawGroupId = GetCurrRawGroupId() ;
|
||||
if ( nRawGroupId != GDB_ID_NULL && m_pGeomDB->GetParentId( nRawId) == nRawGroupId)
|
||||
return true ;
|
||||
// se consentito linkaggio ed il grezzo è linkato ad un gruppo della macchina corrente, va bene
|
||||
// se consentito linkaggio ed il grezzo è linkato ad un gruppo della macchina corrente, va bene
|
||||
if ( bLinkedAllowed) {
|
||||
Machine* pMch = GetCurrMachine() ;
|
||||
if ( pMch != nullptr && pMch->IsLinkedRawPart( nRawId))
|
||||
@@ -959,12 +808,12 @@ MachMgr::ResetRawPartCenter( int nRawId)
|
||||
bool
|
||||
MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen)
|
||||
{
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// cerco di recuperare l'oggetto
|
||||
int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ;
|
||||
// ne verifico la validità
|
||||
// ne verifico la validità
|
||||
int nMode ;
|
||||
if ( nGPntId == GDB_ID_NULL ||
|
||||
! m_pGeomDB->GetMode( nGPntId, nMode) || nMode != GDB_MD_STD) {
|
||||
@@ -992,7 +841,7 @@ MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen)
|
||||
bool
|
||||
MachMgr::GetRawPartBBox( int nRawId, BBox3d& b3Raw)
|
||||
{
|
||||
// verifica validità grezzo
|
||||
// verifica validità grezzo
|
||||
if ( ! VerifyRawPart( nRawId))
|
||||
return false ;
|
||||
// recupero solido del grezzo
|
||||
@@ -1000,103 +849,6 @@ MachMgr::GetRawPartBBox( int nRawId, BBox3d& b3Raw)
|
||||
return m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) ;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
static bool
|
||||
AssociateSurfs( IGeomDB* pGeomDB, int nSurfUpId, int nSurfDownId, vector<pair<int,int>>& vRawSurfs)
|
||||
{
|
||||
// vRawSurfs contiene tutte le coppie ( id regioneUp, id regioneDown) che definiscono i nuovi grezzi
|
||||
vRawSurfs.clear() ;
|
||||
|
||||
int nUpCnt = ExeSurfFrChunkCount( nSurfUpId) ;
|
||||
int nDownCnt = ExeSurfFrChunkCount( nSurfDownId) ;
|
||||
// se non sono stati creati più grezzi
|
||||
if ( nUpCnt == 1 || nDownCnt == 1) {
|
||||
vRawSurfs.emplace_back( nSurfUpId, nSurfDownId) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
int nUpFirstId = ExeExplodeSurface( nSurfUpId, &nUpCnt) ;
|
||||
int nDownFirstId = ExeExplodeSurface( nSurfDownId, &nDownCnt) ;
|
||||
|
||||
// ad ogni chunk della regione up associo i chunk corrispondenti della regione down
|
||||
INTVECTOR vChunks( nUpCnt, GDB_ID_NULL) ;
|
||||
for ( int nIdD = nDownFirstId ; nIdD < nDownFirstId + nDownCnt ; nIdD ++) {
|
||||
ISurfFlatRegion* pSfrD = GetSurfFlatRegion( pGeomDB->GetGeoObj( nIdD)) ;
|
||||
if ( pSfrD == nullptr)
|
||||
return false ;
|
||||
BBox3d bBoxD ; ExeGetBBox( nIdD, BBF_STANDARD, bBoxD) ;
|
||||
// inidividuo il chunk della superficie up che interagisce maggiormente con il chunk corrente della superficie down
|
||||
int k = -1 ;
|
||||
double dMaxArea = -1 ;
|
||||
for ( int j = 0 ; j < nUpCnt ; j ++) {
|
||||
BBox3d bBoxU ; ExeGetBBox( nUpFirstId + j, BBF_STANDARD, bBoxU) ;
|
||||
if ( bBoxU.OverlapsXY( bBoxD)) {
|
||||
PtrOwner<ISurfFlatRegion> pSfrU( CloneSurfFlatRegion( pGeomDB->GetGeoObj( nUpFirstId + j))) ;
|
||||
if ( IsNull( pSfrU))
|
||||
return false ;
|
||||
// le due superfici sono nello stesso frame
|
||||
pSfrU->Intersect( *pSfrD) ;
|
||||
double dArea = -1 ; pSfrU->GetArea( dArea) ;
|
||||
if ( dArea > dMaxArea) {
|
||||
k = j ;
|
||||
dMaxArea = dArea ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// aggiorno le superfici con l'associazione trovata
|
||||
if ( k == -1)
|
||||
return false ;
|
||||
if ( vChunks[k] == GDB_ID_NULL)
|
||||
vChunks[k] = nIdD ;
|
||||
else {
|
||||
ExeSurfFrAdd( vChunks[k], nIdD) ;
|
||||
ExeErase( {nIdD}) ;
|
||||
}
|
||||
}
|
||||
|
||||
// controllo per ogni chunk della superficie up il corrispondente della nuova superficie down
|
||||
for ( int i = 0 ; i < nUpCnt ; i ++) {
|
||||
ISurfFlatRegion* pSfrU = GetSurfFlatRegion( pGeomDB->GetGeoObj( nUpFirstId + i)) ;
|
||||
if ( pSfrU == nullptr)
|
||||
return false ;
|
||||
BBox3d bBoxU ; ExeGetBBox( nUpFirstId + i, BBF_STANDARD, bBoxU) ;
|
||||
// individuo il chunk della superficie down che interagisce maggiormente con il chunk corrente della superficie up
|
||||
int k = -1 ;
|
||||
double dMaxArea = -1 ;
|
||||
for ( int j = 0 ; j < int( vChunks.size()) ; j ++) {
|
||||
BBox3d bBoxD ; ExeGetBBox( vChunks[j], BBF_STANDARD, bBoxD) ;
|
||||
// se i box interferiscono allora verifico di quanto si sovrappongono le due regioni
|
||||
if ( bBoxD.OverlapsXY( bBoxU)) {
|
||||
PtrOwner<ISurfFlatRegion> pSfrD( CloneSurfFlatRegion( pGeomDB->GetGeoObj( vChunks[j]))) ;
|
||||
if ( IsNull( pSfrD))
|
||||
return false ;
|
||||
pSfrD->Intersect( *pSfrU) ;
|
||||
double dArea = -1 ; pSfrD->GetArea( dArea) ;
|
||||
if ( dArea > dMaxArea) {
|
||||
k = j ;
|
||||
dMaxArea = dArea ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( k == -1)
|
||||
return false ;
|
||||
// se è la stessa associazione individuata da vChunks allora aggiorno il vettore finale dei grezzi
|
||||
if ( k == i)
|
||||
vRawSurfs.emplace_back( nUpFirstId + i, vChunks[i]) ;
|
||||
else {
|
||||
// altrimenti unisco le regioni associate appena individuate sia per la superficie up sia per la down
|
||||
ExeSurfFrAdd( nUpFirstId + k, nUpFirstId + i) ;
|
||||
ExeErase( {nUpFirstId + i}) ;
|
||||
ExeSurfFrAdd( vChunks[k], vChunks[i]) ;
|
||||
ExeErase( {vChunks[i]}) ;
|
||||
}
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
@@ -1120,6 +872,7 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
BBox3d b3Raw ;
|
||||
if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw))
|
||||
return GDB_ID_NULL ;
|
||||
double dZmin = b3Raw.GetMin().z ;
|
||||
double dHeight = b3Raw.GetMax().z - b3Raw.GetMin().z ;
|
||||
// il colore del grezzo
|
||||
Color cCol = AQUA ;
|
||||
@@ -1128,31 +881,19 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
Frame3d frRaw ;
|
||||
if ( ! m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw))
|
||||
return GDB_ID_NULL ;
|
||||
|
||||
// creo la regione del grezzo a partire dal suo contorno
|
||||
// recupero il contorno
|
||||
int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_OUTLINE) ;
|
||||
if ( nOutCrvId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
|
||||
// creo le regioni inferiore e superiore del grezzo da aggiornare con le lavorazioni
|
||||
int nSfrDownId = GDB_ID_NULL, nSfrUpId = GDB_ID_NULL ;
|
||||
int nSfrDownOrigId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_DOWN_REG) ;
|
||||
int nSfrUpOrigId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_UP_REG) ;
|
||||
if ( nSfrDownOrigId == GDB_ID_NULL || nSfrUpOrigId == GDB_ID_NULL) {
|
||||
// se le regioni del grezzo di partenza non sono definite, le creo a partire dall'outline
|
||||
nSfrDownId = ExeCreateSurfFlatRegion( nRawId, {nOutCrvId}, nullptr) ;
|
||||
if ( nSfrDownId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
nSfrUpId = ExeCopyGlob( nSfrDownId, nRawId, GDB_LAST_SON) ;
|
||||
if ( nSfrUpId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
ExeMove( { nSfrUpId}, dHeight * Z_AX, RTY_LOC) ;
|
||||
}
|
||||
else {
|
||||
nSfrDownId = ExeCopyGlob( nSfrDownOrigId, nRawId, GDB_LAST_SON) ;
|
||||
nSfrUpId = ExeCopyGlob( nSfrUpOrigId, nRawId, GDB_LAST_SON) ;
|
||||
if ( nSfrDownId == GDB_ID_NULL || nSfrUpId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
}
|
||||
// creo la regione
|
||||
INTVECTOR vCrvIds ;
|
||||
vCrvIds.emplace_back( nOutCrvId) ;
|
||||
int nSfrId = ExeCreateSurfFlatRegion( nRawId, vCrvIds, nullptr) ;
|
||||
if ( nSfrId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
m_pGeomDB->SetLevel( nSfrId, GDB_LV_TEMP) ;
|
||||
|
||||
// se esiste il kerf, ne creo la regione
|
||||
PtrOwner<ISurfFlatRegion> pSfrKerf ;
|
||||
@@ -1167,8 +908,7 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
}
|
||||
|
||||
// recupero le regioni delle lavorazioni
|
||||
INTVECTOR vMchRRegUp ;
|
||||
INTVECTOR vMchRRegDown ;
|
||||
INTVECTOR vMchRReg ;
|
||||
for ( auto nMchId : vMchId) {
|
||||
// recupero gruppo preview lavorazioni nella lavorazione
|
||||
int nPVGrp = m_pGeomDB->GetFirstNameInGroup( nMchId, MCH_PV) ;
|
||||
@@ -1176,110 +916,94 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
return GDB_ID_NULL ;
|
||||
// se vuoto, cerco il rimando al preview nel pezzo
|
||||
if ( m_pGeomDB->GetGroupObjs( nPVGrp) == 0 &&
|
||||
! m_pGeomDB->GetInfo( nPVGrp, MCH_PV_KEY_RELOCATE, nPVGrp))
|
||||
! m_pGeomDB->GetInfo( nPVGrp, MCH_PV_KEY_RELOCATE, nPVGrp))
|
||||
return GDB_ID_NULL ;
|
||||
// ciclo sui percorsi utensile (CL)
|
||||
int nClId = m_pGeomDB->GetFirstGroupInGroup( nPVGrp) ;
|
||||
while ( nClId != GDB_ID_NULL) {
|
||||
// lavorazioni per regione inferiore
|
||||
int nCrDownId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PV_DOWN_RAWCUT) ;
|
||||
// se non esiste la regione inferiore la lavorazione non è passante quindi può essere ignorata
|
||||
if ( nCrDownId != GDB_ID_NULL) {
|
||||
while ( nCrDownId != GDB_ID_NULL) {
|
||||
vMchRRegDown.emplace_back( nCrDownId) ;
|
||||
nCrDownId = m_pGeomDB->GetNextName( nCrDownId, MCH_PV_DOWN_RAWCUT) ;
|
||||
}
|
||||
// lavorazioni per regione superiore
|
||||
int nCrUpId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PV_UP_RAWCUT) ;
|
||||
while ( nCrUpId != GDB_ID_NULL) {
|
||||
vMchRRegUp.emplace_back( nCrUpId) ;
|
||||
nCrUpId = m_pGeomDB->GetNextName( nCrUpId, MCH_PV_UP_RAWCUT) ;
|
||||
}
|
||||
}
|
||||
// tagli ridotti
|
||||
int nCrId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PV_RRCUT) ;
|
||||
while ( nCrId != GDB_ID_NULL) {
|
||||
vMchRReg.emplace_back( nCrId) ;
|
||||
nCrId = m_pGeomDB->GetNextName( nCrId, MCH_PV_RRCUT) ;
|
||||
}
|
||||
// passo al successivo percorso utensile
|
||||
nClId = m_pGeomDB->GetNextGroup( nClId) ;
|
||||
}
|
||||
}
|
||||
|
||||
// sottraggo le lavorazioni alle superfici del grezzo
|
||||
for ( auto nMchRReg : vMchRRegUp)
|
||||
ExeSurfFrSubtract( nSfrUpId, nMchRReg) ;
|
||||
for ( auto nMchRReg : vMchRRegDown)
|
||||
ExeSurfFrSubtract( nSfrDownId, nMchRReg) ;
|
||||
|
||||
// classifico i chunks della regione up e down per individuare le regioni che definiscono i nuovi grezzi
|
||||
vector<pair<int,int>> vSurfRaws ;
|
||||
AssociateSurfs( m_pGeomDB, nSfrUpId, nSfrDownId, vSurfRaws) ;
|
||||
// sottraggo queste regioni a quella del grezzo
|
||||
for ( auto nMchRReg : vMchRReg) {
|
||||
ExeSurfFrSubtract( nSfrId, nMchRReg) ;
|
||||
}
|
||||
|
||||
// creo i grezzi risultanti
|
||||
INTVECTOR vNewIds ;
|
||||
for ( int i = 0 ; i < int( vSurfRaws.size()) ; i++) {
|
||||
|
||||
// aggiungo il grezzo
|
||||
int nId = AddRawPart( vSurfRaws[i].first, vSurfRaws[i].second, dHeight, cCol) ;
|
||||
m_pGeomDB->Erase( vSurfRaws[i].first) ;
|
||||
m_pGeomDB->Erase( vSurfRaws[i].second) ;
|
||||
if ( nId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
vNewIds.emplace_back( nId) ;
|
||||
|
||||
// imposto lo stato del contorno di questo grezzo come quello del grezzo di partenza
|
||||
int nStat = GDB_ST_ON ;
|
||||
if ( m_pGeomDB->GetStatus( nOutCrvId, nStat) && nStat == GDB_ST_OFF)
|
||||
m_pGeomDB->SetStatus( m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_OUTLINE), nStat) ;
|
||||
// assegno la fase al gruppo
|
||||
m_pGeomDB->SetInfo( nId, MACH_RAW_PHASE, m_nCurrPhase) ;
|
||||
// se esiste il kerf uso questa curva per creare il kerf del nuovo grezzo
|
||||
if ( ! IsNull( pSfrKerf)) {
|
||||
// riferimento del nuovo grezzo
|
||||
Frame3d frNewRaw ;
|
||||
if ( ! m_pGeomDB->GetGroupGlobFrame( nId, frNewRaw))
|
||||
return GDB_ID_NULL ;
|
||||
// considero il nuovo kerf come la regione superiore del nuovo grezzo
|
||||
int nSfrUpId = m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_UP_REG) ;
|
||||
if ( nSfrUpId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
PtrOwner<ISurfFlatRegion> pSfrNewKerf( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrUpId))) ;
|
||||
if ( IsNull( pSfrNewKerf))
|
||||
return GDB_ID_NULL ;
|
||||
// porto nello stesso riferimento del grezzo originale
|
||||
pSfrNewKerf->LocToLoc( frNewRaw, frRaw) ;
|
||||
// la limito con la regione di kerf precedente ( va bene anche se fallisce)
|
||||
pSfrNewKerf->Intersect( *pSfrKerf) ;
|
||||
// se risultato non vuoto
|
||||
if ( pSfrNewKerf->IsValid()) {
|
||||
// la porto dal riferimento del grezzo originale al riferimento di questo grezzo
|
||||
pSfrNewKerf->LocToLoc( frRaw, frNewRaw) ;
|
||||
// recupero il contorno esterno del chunk più grande e lo inserisco come kerf del nuovo grezzo
|
||||
double dAreaMax = -1 ;
|
||||
int nKMax = 0 ;
|
||||
for ( int k = 0 ; k < pSfrNewKerf->GetChunkCount() ; k ++) {
|
||||
PtrOwner<ISurfFlatRegion> pSfrChunk( pSfrNewKerf->CloneChunk( k)) ;
|
||||
double dArea = -1 ; pSfrChunk->GetGrossArea( dArea) ;
|
||||
if ( dArea > dAreaMax) {
|
||||
nKMax = k ;
|
||||
dAreaMax = dArea ;
|
||||
}
|
||||
}
|
||||
PtrOwner<ICurve> pCrv( pSfrNewKerf->GetLoop( nKMax, 0)) ;
|
||||
if ( IsNull( pCrv))
|
||||
return GDB_ID_NULL ;
|
||||
int nNewKerfId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nId, Release( pCrv)) ;
|
||||
if ( nNewKerfId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
m_pGeomDB->CopyMaterial( nKerfId, nNewKerfId) ;
|
||||
m_pGeomDB->SetName( nNewKerfId, MACH_RAW_KERF) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cancello le regioni usate per i conti
|
||||
m_pGeomDB->Erase( nSfrUpId) ;
|
||||
m_pGeomDB->Erase( nSfrDownId) ;
|
||||
// creo i nuovi grezzi
|
||||
INTVECTOR vNewIds ;
|
||||
int nCount ;
|
||||
int nChunk = 0 ;
|
||||
int nFirstLoopId = ExeExtractSurfFrChunkLoops( nSfrId, nChunk, nRawId, &nCount) ;
|
||||
while ( nFirstLoopId != GDB_ID_NULL) {
|
||||
// !!! in attesa di gestire i grezzi con i buchi !!!
|
||||
// cancello le eventuali curve successive (sono i loop interni ovvero i buchi)
|
||||
for ( int i = 1 ; i < nCount ; ++ i) {
|
||||
m_pGeomDB->Erase( nFirstLoopId + i) ;
|
||||
}
|
||||
// dichiaro temporanea la curva
|
||||
m_pGeomDB->SetLevel( nFirstLoopId, GDB_LV_TEMP) ;
|
||||
// creo il grezzo
|
||||
int nId = AddRawPart( nFirstLoopId, 0, dZmin, dHeight, cCol) ;
|
||||
if ( nId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
vNewIds.emplace_back( nId) ;
|
||||
// imposto lo stato del contorno di questo grezzo come quello del grezzo di partenza
|
||||
int nStat = GDB_ST_ON ;
|
||||
if ( m_pGeomDB->GetStatus( nOutCrvId, nStat) && nStat == GDB_ST_OFF)
|
||||
m_pGeomDB->SetStatus( m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_OUTLINE), nStat) ;
|
||||
// assegno la fase al gruppo
|
||||
m_pGeomDB->SetInfo( nId, MACH_RAW_PHASE, m_nCurrPhase) ;
|
||||
// se esiste il kerf uso questa curva per creare il kerf del nuovo grezzo
|
||||
if ( ! IsNull( pSfrKerf)) {
|
||||
// creo la regione con la curva
|
||||
SurfFlatRegionByContours SfrCntr ;
|
||||
SfrCntr.AddCurve( GetCurve( m_pGeomDB->RemoveGeoObjAndErase( nFirstLoopId))) ;
|
||||
PtrOwner<ISurfFlatRegion> pSfrNewKerf( SfrCntr.GetSurf()) ;
|
||||
if ( IsNull( pSfrNewKerf))
|
||||
return GDB_ID_NULL ;
|
||||
// la limito con la regione di kerf precedente (va bene anche se fallisce)
|
||||
pSfrNewKerf->Intersect( *pSfrKerf) ;
|
||||
// se risultato non vuoto
|
||||
if ( pSfrNewKerf->IsValid()) {
|
||||
// riferimento del nuovo grezzo
|
||||
Frame3d frNewRaw ;
|
||||
if ( ! m_pGeomDB->GetGroupGlobFrame( nId, frNewRaw))
|
||||
return GDB_ID_NULL ;
|
||||
// la porto dal riferimento del grezzo originale al riferimento di questo grezzo
|
||||
pSfrNewKerf->LocToLoc( frRaw, frNewRaw) ;
|
||||
// la porto sulla faccia sopra del grezzo
|
||||
pSfrNewKerf->Translate( Vector3d( 0, 0, dHeight)) ;
|
||||
// recupero il contorno e lo inserisco come kerf del nuovo grezzo
|
||||
PtrOwner<ICurve> pCrv( pSfrNewKerf->GetLoop( 0, 0)) ;
|
||||
int nNewKerfId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nId, Release( pCrv)) ;
|
||||
if ( nNewKerfId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
m_pGeomDB->CopyMaterial( nKerfId, nNewKerfId) ;
|
||||
m_pGeomDB->SetName( nNewKerfId, MACH_RAW_KERF) ;
|
||||
}
|
||||
}
|
||||
// altrimenti la cancello
|
||||
else
|
||||
m_pGeomDB->Erase( nFirstLoopId) ;
|
||||
// passo alla prossima curva
|
||||
++ nChunk ;
|
||||
nFirstLoopId = ExeExtractSurfFrChunkLoops( nSfrId, nChunk, nRawId, &nCount) ;
|
||||
}
|
||||
// cancello la regione
|
||||
m_pGeomDB->Erase( nSfrId) ;
|
||||
// verifico esista almeno un nuovo grezzo
|
||||
if ( vNewIds.empty())
|
||||
return GDB_ID_NULL ;
|
||||
|
||||
if ( vNewIds.empty())
|
||||
return GDB_ID_NULL ;
|
||||
|
||||
// inserisco i pezzi del grezzo originale nei nuovi grezzi
|
||||
int nGroupId = m_pGeomDB->GetFirstGroupInGroup( nRawId) ;
|
||||
while ( nGroupId != GDB_ID_NULL) {
|
||||
@@ -1289,31 +1013,32 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
// scambio con pezzo
|
||||
int nPartId = SwapRawPartPart( nNewGroupId, true) ;
|
||||
// verifico se il pezzo sta nel grezzo
|
||||
int nLayerId = m_pGeomDB->GetFirstNameInGroup( nPartId, NST_PARTREG_LAYER) ;
|
||||
int nLayerId = m_pGeomDB->GetFirstNameInGroup( nPartId, NST_EXT_LAYER) ;
|
||||
if ( nLayerId == GDB_ID_NULL || m_pGeomDB->GetGdbType( nLayerId) != GDB_TY_GROUP)
|
||||
nLayerId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ;
|
||||
// cerco la regione del pezzo
|
||||
int nEntId = m_pGeomDB->GetFirstInGroup( nLayerId) ;
|
||||
while ( nEntId != GDB_ID_NULL) {
|
||||
int nEntGeoType = m_pGeomDB->GetGeoType( nEntId) ;
|
||||
if ( nEntGeoType == SRF_FLATRGN)
|
||||
break ;
|
||||
nEntId = m_pGeomDB->GetNext( nEntId) ;
|
||||
}
|
||||
if ( nEntId != GDB_ID_NULL) {
|
||||
// verifico se è interna al grezzo
|
||||
int nEntId = m_pGeomDB->GetFirstInGroup( nLayerId) ;
|
||||
int nEntGeoType = m_pGeomDB->GetGeoType( nEntId) ;
|
||||
Point3d ptTest ;
|
||||
if ( ( ( nEntGeoType & GEO_CURVE) != 0 && ExeMidPoint( nEntId, nNewId, ptTest)) ||
|
||||
( ( nEntGeoType & GEO_CURVE) == 0 && ExeCenterPoint( nEntId, nNewId, ptTest))) {
|
||||
int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nNewId, MACH_RAW_OUTLINE) ;
|
||||
BBox3d b3Raw ; m_pGeomDB->GetGlobalBBox( nOutCrvId, b3Raw) ;
|
||||
double dRawDiam = 0 ; b3Raw.GetDiameter( dRawDiam) ;
|
||||
BBox3d b3Part ; m_pGeomDB->GetGlobalBBox( nEntId, b3Part) ;
|
||||
double dPartDiam = 0 ; b3Part.GetDiameter( dPartDiam) ;
|
||||
if ( dRawDiam > 0.9 * dPartDiam) {
|
||||
int nSfrUp = m_pGeomDB->GetFirstNameInGroup( nNewId, MACH_RAW_UP_REG) ;
|
||||
if ( ! ExeSurfFrTestExternal( nSfrUp, nEntId, EPS_SMALL))
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
ICurve* pCurve = GetCurve( m_pGeomDB->GetGeoObj( nOutCrvId)) ;
|
||||
if ( pCurve != nullptr) {
|
||||
int nSide ;
|
||||
double dDist ;
|
||||
DistPointCurve distPC( ptTest, *pCurve) ;
|
||||
if ( distPC.GetDist( dDist) &&
|
||||
( dDist < 100 * EPS_SMALL ||
|
||||
( distPC.GetSideAtMinDistPoint( 0, Z_AX, nSide) && nSide != MDS_RIGHT)))
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti scambio pezzo ed elimino gruppo
|
||||
nNewGroupId = SwapRawPartPart( nPartId, false) ;
|
||||
m_pGeomDB->Erase( nNewGroupId) ;
|
||||
@@ -1321,5 +1046,5 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
|
||||
nGroupId = m_pGeomDB->GetNextGroup( nGroupId) ;
|
||||
}
|
||||
|
||||
return vNewIds[0] ;
|
||||
return vNewIds[0] ;
|
||||
}
|
||||
|
||||
@@ -198,7 +198,7 @@ MachMgr::SimMoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt)
|
||||
{
|
||||
// verifico simulatore
|
||||
if ( m_pSimul == nullptr)
|
||||
return SIM_AXMV_RES_ERR ;
|
||||
return false ;
|
||||
// lancio movimento assi
|
||||
return m_pSimul->MoveAxes( nMoveType, vAxNaEpSt) ;
|
||||
}
|
||||
|
||||
+6
-13
@@ -58,8 +58,6 @@ Machine::Machine( void)
|
||||
m_nHeadRotAxes = 0 ;
|
||||
m_nHeadSpecRotAxis = -1 ;
|
||||
m_frLinAx.Reset( false) ;
|
||||
m_frRobot.Reset( false) ;
|
||||
m_nCalcChainType = KIN_CHAIN_NONE ;
|
||||
m_nMachineLook = MCH_LOOK_NONE ;
|
||||
}
|
||||
|
||||
@@ -143,8 +141,6 @@ Machine::Init( const string& sMachineName, const string& sMachineDir, MachMgr* p
|
||||
m_nMachineLook = ( bOk ? MCH_LOOK_ALL : MCH_LOOK_NONE) ;
|
||||
// metto tutti gli assi in posizione home
|
||||
bOk = bOk && ResetAllAxesPos() ;
|
||||
// reset catena cinematica corrente
|
||||
m_nCalcChainType = KIN_CHAIN_NONE ;
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
@@ -213,7 +209,7 @@ Machine::AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay)
|
||||
bool
|
||||
Machine::LoadMachineTable( const string& sName, const string& sParent, int nType,
|
||||
const Point3d& ptRef1, double dCoeffX, double dCoeffY, double dCoeffZ,
|
||||
const STRVECTOR& vsColl, const string& sGeo, const STRVECTOR& vsAux)
|
||||
const string& sGeo, const STRVECTOR& vsAux)
|
||||
{
|
||||
// recupero pezzo e layer della geometria originale della tavola
|
||||
string sPart, sLay ;
|
||||
@@ -252,7 +248,7 @@ Machine::LoadMachineTable( const string& sName, const string& sParent, int nType
|
||||
Table* pTab = new(nothrow) Table ;
|
||||
if ( pTab == nullptr)
|
||||
return false ;
|
||||
pTab->Set( sName, nType, ptRef1, b3Area1, vsColl) ;
|
||||
pTab->Set( sName, nType, ptRef1, b3Area1) ;
|
||||
m_pGeomDB->SetUserObj( nLay, pTab) ;
|
||||
// lo inserisco nel dizionario dei gruppi della macchina
|
||||
return m_mapGroups.emplace( sName, nLay).second ;
|
||||
@@ -548,7 +544,7 @@ Machine::LoadMachineStdHead( const string& sName, const string& sParent, const s
|
||||
Head* pHead = new(nothrow) Head ;
|
||||
if ( pHead == nullptr)
|
||||
return false ;
|
||||
pHead->Set( sName, MCH_HT_STD, 1, sHSet, 0, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
|
||||
pHead->Set( sName, MCH_HT_STD, 1, sHSet, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
|
||||
m_pGeomDB->SetUserObj( nLay, pHead) ;
|
||||
// aggiorno la testa capostipite
|
||||
if ( ! AddHeadToSet( sHSet, sName))
|
||||
@@ -568,7 +564,7 @@ Machine::LoadMachineStdHead( const string& sName, const string& sParent, const s
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const string& sHSet,
|
||||
int nSelectType, const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
|
||||
const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
|
||||
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
|
||||
const string& sGeo, const STRVECTOR& vsAux)
|
||||
{
|
||||
@@ -597,8 +593,7 @@ Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const
|
||||
Head* pHead = new(nothrow) Head ;
|
||||
if ( pHead == nullptr)
|
||||
return false ;
|
||||
pHead->Set( sName, MCH_HT_MULTI, int( vMuExit.size()), sHSet, nSelectType,
|
||||
vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
|
||||
pHead->Set( sName, MCH_HT_MULTI, int( vMuExit.size()), sHSet, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
|
||||
m_pGeomDB->SetUserObj( nLay, pHead) ;
|
||||
// aggiorno la testa capostipite
|
||||
if ( ! AddHeadToSet( sHSet, sName))
|
||||
@@ -645,7 +640,7 @@ Machine::LoadMachineSpecialHead( const string& sName, const string& sParent, con
|
||||
Head* pHead = new(nothrow) Head ;
|
||||
if ( pHead == nullptr)
|
||||
return false ;
|
||||
pHead->Set( sName, MCH_HT_SPECIAL, 1, sHSet, 0, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
|
||||
pHead->Set( sName, MCH_HT_SPECIAL, 1, sHSet, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
|
||||
m_pGeomDB->SetUserObj( nLay, pHead) ;
|
||||
// aggiorno la testa capostipite
|
||||
if ( ! AddHeadToSet( sHSet, sName))
|
||||
@@ -1067,8 +1062,6 @@ Machine::SetLook( int nFlag)
|
||||
nTabId = GetFirstTable() ;
|
||||
if ( nTabId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// il gruppo tavola corrente deve essere sempre visibile
|
||||
m_pGeomDB->SetStatus( nTabId, GDB_ST_ON) ;
|
||||
// nascondo o visualizzo i fratelli e tutti i fratelli degli ascendenti della tavola
|
||||
bool bTabOnly = ( nFlag != MCH_LOOK_ALL) ;
|
||||
int nTabCurrId = nTabId ;
|
||||
|
||||
@@ -53,7 +53,7 @@ class Machine
|
||||
int GetHeadId( const std::string& sHead) const
|
||||
{ int nId = GetGroup( sHead) ;
|
||||
return ( IsHeadGroup( nId) ? nId : GDB_ID_NULL) ; }
|
||||
int GetExitId( const std::string& sHead, int nExit) const
|
||||
int GetExitId( const std::string& sHead, int nExit) const
|
||||
{ int nHeadId = GetHeadId( sHead) ;
|
||||
int nId = ( m_pGeomDB != nullptr ? m_pGeomDB->GetFirstNameInGroup( nHeadId, MCH_EXIT + ToString( nExit)) : GDB_ID_NULL) ;
|
||||
return ( IsExitGroup( nId) ? nId : GDB_ID_NULL) ; }
|
||||
@@ -61,14 +61,12 @@ class Machine
|
||||
{ int nId = GetGroup( sTcPos) ;
|
||||
return ( IsTcPosGroup( nId) ? nId : GDB_ID_NULL) ; }
|
||||
bool GetAllTablesNames( STRVECTOR& vNames) const ;
|
||||
bool GetAllAxesNames( STRVECTOR& vNames) const ;
|
||||
bool GetAllHeadsNames( STRVECTOR& vNames) const ;
|
||||
bool GetAllTcPosNames( STRVECTOR& vNames) const ;
|
||||
int GetFirstTable( void) const ;
|
||||
int GetHeadExitCount( const std::string& sHead) const ;
|
||||
int GetHeadExitPosDirAux( const std::string& sHead, int nExit, Point3d& ptPos, Vector3d& vtDir, Vector3d& vtAux) const ;
|
||||
int GetHeadSolCh( const std::string& sHead) const ;
|
||||
int GetHeadSelectType(const std::string& sHead) const ;
|
||||
double GetAngDeltaMinForHome( void) const
|
||||
{ return m_dAngDeltaMinForHome ; }
|
||||
bool LoadTool( const std::string& sHead, int nExit, const std::string& sTool) ;
|
||||
@@ -98,7 +96,6 @@ class Machine
|
||||
bool GetCurrTableArea1( BBox3d& b3Area1) const ;
|
||||
bool GetCurrTableDeltaRef1( Vector3d& vtDelta1) const ;
|
||||
bool GetCurrTableIsTilting( bool& bTilting, Vector3d& vtTiltingAx) const ;
|
||||
bool GetCurrTableCollGroups( INTVECTOR& vIds) const ;
|
||||
bool SetCurrTool( const std::string& sTool, const std::string& sHead, int nExit) ;
|
||||
bool ResetCurrTool( void) ;
|
||||
int GetCurrTool( void) const ;
|
||||
@@ -123,9 +120,9 @@ class Machine
|
||||
int GetCurrLinAxes( void) const ;
|
||||
int GetCurrRotAxes( void) const ;
|
||||
bool GetCurrAxisName( int nInd, std::string& sAxName) const ;
|
||||
bool GetAllCurrAxesNames( STRVECTOR& vAxName) const ;
|
||||
bool GetAllCurrAxesName( STRVECTOR& vAxName) const ;
|
||||
bool GetCurrAxisToken( int nInd, std::string& sAxToken) const ;
|
||||
bool GetAllCurrAxesTokens( STRVECTOR& vAxToken) const ;
|
||||
bool GetAllCurrAxesToken( STRVECTOR& vAxToken) const ;
|
||||
bool GetCurrAxisMin( int nInd, double& dMin) const ;
|
||||
bool GetCurrAxisMax( int nInd, double& dMax) const ;
|
||||
bool GetCurrAxisOffset( int nInd, double& dOffset) const ;
|
||||
@@ -134,16 +131,12 @@ class Machine
|
||||
bool GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const ;
|
||||
const Frame3d& GetCurrLinAxesFrame( void) const
|
||||
{ return m_frLinAx ; }
|
||||
int GetCurrKinematicChainType( void) const
|
||||
{ return m_nCalcChainType ; }
|
||||
bool GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
int& nStat, double& dAngA1, double& dAngB1, double& dAngA2, double& dAngB2) const ;
|
||||
bool GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
int& nStat, DBLVECTOR& vAng1, DBLVECTOR& vAng2) const ;
|
||||
bool GetPositions( const Point3d& ptP, const DBLVECTOR& vAng,
|
||||
int& nStat, double& dX, double& dY, double& dZ) const ;
|
||||
bool GetRobotAngles( const Point3d& ptP, const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
DBLVECTOR& vAng1, DBLVECTOR& vAng2) const ;
|
||||
bool GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng,
|
||||
Point3d& ptNose) const ;
|
||||
bool GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng,
|
||||
@@ -199,7 +192,7 @@ class Machine
|
||||
bool AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay) ;
|
||||
bool LoadMachineTable( const std::string& sName, const std::string& sParent, int nType,
|
||||
const Point3d& ptRef1, double dCoeffX, double dCoeffY, double dCoeffZ,
|
||||
const STRVECTOR& vsColl, const std::string& sGeo, const STRVECTOR& vsAux) ;
|
||||
const std::string& sGeo, const STRVECTOR& vsAux) ;
|
||||
bool AdjustTable( int nLay, const Point3d& ptRef1) ;
|
||||
bool LoadMachineAxis( const std::string& sName, const std::string& sParent, const std::string& sToken, bool bInvert,
|
||||
double dOffset, int nType, const Point3d& ptPos, const Vector3d& vtDir, const STROKE& Stroke,
|
||||
@@ -215,7 +208,7 @@ class Machine
|
||||
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
|
||||
const std::string& sGeo, const STRVECTOR& vsAux) ;
|
||||
bool LoadMachineMultiHead( const std::string& sName, const std::string& sParent, const std::string& sHSet,
|
||||
int nSelectType, const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
|
||||
const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
|
||||
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
|
||||
const std::string& sGeo, const STRVECTOR& vsAux) ;
|
||||
bool LoadMachineSpecialHead( const std::string& sName, const std::string& sParent, const std::string& sHSet,
|
||||
@@ -317,10 +310,6 @@ class Machine
|
||||
KINAXISVECTOR m_vCalcLinAx ; // vettore assi lineari attivi per calcoli
|
||||
KINAXISVECTOR m_vCalcRotAx ; // vettore assi rotanti attivi per calcoli
|
||||
Frame3d m_frLinAx ; // sistema di riferimento definito dagli assi lineari
|
||||
Frame3d m_frRobot ; // sistema di riferimento canonico del robot
|
||||
int m_nCalcChainType ; // tipologia testa attiva (nulla, centro di lavoro o robot)
|
||||
Point3d m_ptWristCen ; // centro del polso sferico nel riferimento testa/uscita di calcolo
|
||||
Vector3d m_vtWristRef ; // direzione del polso sferico nel riferimento testa/uscita di calcolo
|
||||
mutable OutStroke m_OutstrokeInfo ; // informazioni su ultima extra corsa
|
||||
// stato di visualizzazione
|
||||
int m_nMachineLook ; // stato di visualizzazione della macchina
|
||||
|
||||
@@ -23,22 +23,6 @@
|
||||
|
||||
using namespace std ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::GetAllAxesNames( STRVECTOR& vNames) const
|
||||
{
|
||||
// reset lista nomi
|
||||
vNames.clear() ;
|
||||
// ricerca degli assi
|
||||
for ( const auto& snGro : m_mapGroups) {
|
||||
if ( IsAxisGroup( snGro.second))
|
||||
vNames.push_back( snGro.first) ;
|
||||
}
|
||||
// ordino alfabeticamente
|
||||
sort( vNames.begin(), vNames.end()) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::GetAxisToken( const string& sAxis, string& sToken) const
|
||||
|
||||
+51
-295
@@ -71,8 +71,6 @@ Machine::SetCurrTable( const string& sTable)
|
||||
m_nCalcTabId = GDB_ID_NULL ;
|
||||
return false ;
|
||||
}
|
||||
// il gruppo tavola corrente deve essere sempre visibile
|
||||
m_pGeomDB->SetStatus( m_nCalcTabId, GDB_ST_ON) ;
|
||||
// lancio eventuale funzione lua di personalizzazione
|
||||
if ( LuaExistsFunction( ON_SET_TABLE)) {
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
@@ -214,31 +212,6 @@ Machine::GetCurrTableIsTilting( bool& bTilting, Vector3d& vtTiltingAx) const
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::GetCurrTableCollGroups( INTVECTOR& vIds) const
|
||||
{
|
||||
// controllo GeomDB
|
||||
if ( m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
// recupero la tavola corrente
|
||||
Table* pTab = GetTable( m_nCalcTabId) ;
|
||||
if ( pTab == nullptr)
|
||||
return false ;
|
||||
// recupero stringhe con gruppi ausiliari di collisione
|
||||
const STRVECTOR& vsColl = pTab->GetCollGroups() ;
|
||||
for ( const auto& sColl : vsColl) {
|
||||
string sGrp, sSub ;
|
||||
Split( sColl, "/", true, sGrp, sSub) ;
|
||||
int nId = GetGroup( sGrp) ;
|
||||
if ( ! sSub.empty() && nId != GDB_ID_NULL)
|
||||
nId = m_pGeomDB->GetFirstNameInGroup( nId, sSub) ;
|
||||
if ( nId != GDB_ID_NULL)
|
||||
vIds.push_back( nId) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
|
||||
@@ -493,15 +466,14 @@ Machine::CalculateKinematicChain( void)
|
||||
m_nHeadSpecRotAxis = -1 ;
|
||||
m_vCalcLinAx.clear() ;
|
||||
m_vCalcRotAx.clear() ;
|
||||
m_frLinAx.Reset( false) ;
|
||||
m_frRobot.Reset( false) ;
|
||||
m_nCalcChainType = KIN_CHAIN_NONE ;
|
||||
// recupero gli assi di tavola
|
||||
if ( m_nCalcTabId == GDB_ID_NULL)
|
||||
return false ;
|
||||
int nTParId = m_pGeomDB->GetParentId( m_nCalcTabId) ;
|
||||
if ( nTParId == GDB_ID_NULL)
|
||||
return false ;
|
||||
m_nTabLinAxes = 0 ;
|
||||
m_nTabRotAxes = 0 ;
|
||||
while ( IsAxisGroup( nTParId)) {
|
||||
if ( ! AddKinematicAxis( false, nTParId))
|
||||
return false ;
|
||||
@@ -513,75 +485,14 @@ Machine::CalculateKinematicChain( void)
|
||||
int nHParId = m_pGeomDB->GetParentId( m_nCalcHeadId) ;
|
||||
if ( nHParId == GDB_ID_NULL)
|
||||
return false ;
|
||||
m_nHeadLinAxes = 0 ;
|
||||
m_nHeadRotAxes = 0 ;
|
||||
while ( IsAxisGroup( nHParId)) {
|
||||
if ( ! AddKinematicAxis( true, nHParId))
|
||||
return false ;
|
||||
nHParId = m_pGeomDB->GetParentId( nHParId) ;
|
||||
}
|
||||
|
||||
// se non ci sono assi, né lineari né rotanti, sicuramente errore
|
||||
if ( m_nTabLinAxes == 0 && m_nHeadLinAxes == 0 &&
|
||||
m_nTabRotAxes == 0 && m_nHeadRotAxes == 0) {
|
||||
LOG_ERROR( GetEMkLogger(), "Errors in Axes : none have been found")
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se nessun asse lineare deve essere un robot (in futuro va permesso un lineare di tavola)
|
||||
if ( m_nTabLinAxes == 0 && m_nHeadLinAxes == 0) {
|
||||
// verifico ci siano 6 assi rotanti tutti di testa (in futuro va permesso un rotante di tavola)
|
||||
if ( m_nTabRotAxes != 0 || m_nHeadRotAxes != 6) {
|
||||
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : number or type")
|
||||
return false ;
|
||||
}
|
||||
// riordino gli assi rotanti
|
||||
swap( m_vCalcRotAx[0], m_vCalcRotAx[5]) ;
|
||||
swap( m_vCalcRotAx[1], m_vCalcRotAx[4]) ;
|
||||
swap( m_vCalcRotAx[2], m_vCalcRotAx[3]) ;
|
||||
// determino il riferimento canonico del robot
|
||||
if ( ! m_frRobot.Set( m_vCalcRotAx[0].ptPos, m_vCalcRotAx[0].vtDir, m_vCalcRotAx[3].vtDir)) {
|
||||
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : impossible canonic frame")
|
||||
return false ;
|
||||
}
|
||||
// porto tutti gli assi cinematici e i dati testa nel riferimento canonico
|
||||
for ( int i = 0 ; i < m_nHeadRotAxes ; ++ i) {
|
||||
m_vCalcRotAx[i].ptPos.ToLoc( m_frRobot) ;
|
||||
m_vCalcRotAx[i].vtDir.ToLoc( m_frRobot) ;
|
||||
}
|
||||
m_ptCalcPos.ToLoc( m_frRobot) ;
|
||||
m_vtCalcDir.ToLoc( m_frRobot) ;
|
||||
m_vtCalcADir.ToLoc( m_frRobot) ;
|
||||
// direzione assi rotanti deve essere Z Y Y X Y X
|
||||
if ( ! m_vCalcRotAx[0].vtDir.IsZ() ||
|
||||
! m_vCalcRotAx[1].vtDir.IsY() ||
|
||||
! m_vCalcRotAx[2].vtDir.IsY() ||
|
||||
! m_vCalcRotAx[3].vtDir.IsX() ||
|
||||
! m_vCalcRotAx[4].vtDir.IsY() ||
|
||||
! m_vCalcRotAx[5].vtDir.IsX()) {
|
||||
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : not ZYY-XYX")
|
||||
return false ;
|
||||
}
|
||||
// verifico che gli ultimi 3 assi formino un polso sferico (ovvero passino per uno stesso punto)
|
||||
if ( abs( m_vCalcRotAx[3].ptPos.y - m_vCalcRotAx[5].ptPos.y) > EPS_SMALL ||
|
||||
abs( m_vCalcRotAx[3].ptPos.z - m_vCalcRotAx[5].ptPos.z) > EPS_SMALL ||
|
||||
abs( m_vCalcRotAx[4].ptPos.z - m_vCalcRotAx[3].ptPos.z) > EPS_SMALL) {
|
||||
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : not spherical Wrist")
|
||||
return false ;
|
||||
}
|
||||
// calcolo il centro del polso in coordinate globali (R5.x, R6.y, R5.z)
|
||||
Point3d ptCenG( m_vCalcRotAx[4].ptPos.x, m_vCalcRotAx[5].ptPos.y, m_vCalcRotAx[4].ptPos.z) ;
|
||||
// recupero il riferimento dell'uscita (da posizione, direzione utensile e direzione ausiliaria)
|
||||
Frame3d frExit ;
|
||||
if ( ! frExit.Set( m_ptCalcPos, m_vtCalcDir, m_vtCalcADir))
|
||||
return false ;
|
||||
// calcolo il centro del polso in locale a questo riferimento
|
||||
m_ptWristCen = GetToLoc( ptCenG, frExit) ;
|
||||
// calcolo la direzione di riferimento del polso in locale a questo riferimento
|
||||
m_vtWristRef = GetToLoc( m_vCalcRotAx[5].vtDir, frExit) ;
|
||||
// dichiaro tipo robot
|
||||
m_nCalcChainType = KIN_CHAIN_ROBOT ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
// verifiche sugli assi lineari :
|
||||
// aggiusto gli indici di ordine sulla sua catena cinematica (1-based)
|
||||
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
|
||||
@@ -620,6 +531,7 @@ Machine::CalculateKinematicChain( void)
|
||||
}
|
||||
|
||||
// verifiche sugli assi rotanti :
|
||||
bool bOk = false ;
|
||||
// aggiusto gli indici di ordine sulla sua catena cinematica (1-based)
|
||||
for ( int i = 0 ; i < int( m_vCalcRotAx.size()) ; ++ i) {
|
||||
if ( m_vCalcRotAx[i].bHead)
|
||||
@@ -629,7 +541,7 @@ Machine::CalculateKinematicChain( void)
|
||||
}
|
||||
// se 0 o 1 va bene
|
||||
if ( m_vCalcRotAx.size() <= 1)
|
||||
;
|
||||
bOk = true ;
|
||||
// se 2 va bene
|
||||
else if ( m_vCalcRotAx.size() == 2) {
|
||||
// se entrambi di testa devo invertirne l'ordine
|
||||
@@ -643,6 +555,7 @@ Machine::CalculateKinematicChain( void)
|
||||
m_vCalcRotAx[1].stroke.Max = min( m_vCalcRotAx[1].stroke.Max, pHead->GetRot2Stroke().Max) ;
|
||||
}
|
||||
}
|
||||
bOk = true ;
|
||||
}
|
||||
// se 3 va bene ( uno dovrà poi avere valore assegnato)
|
||||
else if ( m_vCalcRotAx.size() == 3) {
|
||||
@@ -665,13 +578,10 @@ Machine::CalculateKinematicChain( void)
|
||||
m_vCalcRotAx[n2ndHeadRotAx].stroke.Max = min( m_vCalcRotAx[n2ndHeadRotAx].stroke.Max, pHead->GetRot2Stroke().Max) ;
|
||||
}
|
||||
}
|
||||
bOk = true ;
|
||||
}
|
||||
// se più di 3
|
||||
else {
|
||||
// altrimenti non ancora gestito, quindi errore
|
||||
LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable")
|
||||
if ( ! bOk)
|
||||
return false ;
|
||||
}
|
||||
// verifico esistenza eventuale asse rotante speciale di testa
|
||||
if ( m_nHeadRotAxes > 0 && m_nHeadLinAxes > 0) {
|
||||
// indice di posizione primo asse di testa
|
||||
@@ -707,9 +617,11 @@ Machine::CalculateKinematicChain( void)
|
||||
}
|
||||
}
|
||||
}
|
||||
// dichiaro tipo centro di lavoro
|
||||
m_nCalcChainType = KIN_CHAIN_CENTER ;
|
||||
return true ;
|
||||
|
||||
// altrimenti non ancora gestito, quindi errore
|
||||
LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable")
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -1281,10 +1193,6 @@ Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& v
|
||||
vtNew.Rotate( m_vCalcRotAx[i-1].vtDir, vAng[i-1]) ;
|
||||
}
|
||||
|
||||
// nel caso di robot devo passare dal riferimento canonico robot a quello di macchina
|
||||
if ( m_nCalcChainType == KIN_CHAIN_ROBOT)
|
||||
vtNew.ToGlob( m_frRobot) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -1322,46 +1230,26 @@ Machine::GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole traslazioni e rotazioni di testa)
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
return false ;
|
||||
|
||||
// se centro di lavoro
|
||||
if ( m_nCalcChainType == KIN_CHAIN_CENTER) {
|
||||
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa
|
||||
ptNose = m_ptCalcPos ;
|
||||
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
|
||||
// se asse di testa non speciale
|
||||
if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
|
||||
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// aggiorno posizione testa con assi lineari di testa
|
||||
DBLVECTOR vMov( {dX, dY, dZ}) ;
|
||||
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
|
||||
if ( m_vCalcLinAx[i].bHead)
|
||||
ptNose += m_vCalcLinAx[i].vtDir * vMov[i] ;
|
||||
}
|
||||
// eseguo rotazione eventuale asse rotante speciale di testa
|
||||
if ( m_nHeadSpecRotAxis != -1) {
|
||||
if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
|
||||
return false ;
|
||||
int i = m_nHeadSpecRotAxis ;
|
||||
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa
|
||||
ptNose = m_ptCalcPos ;
|
||||
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
|
||||
// se asse di testa non speciale
|
||||
if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
|
||||
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// se robot
|
||||
else if ( m_nCalcChainType == KIN_CHAIN_ROBOT) {
|
||||
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa
|
||||
ptNose = m_ptCalcPos ;
|
||||
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
|
||||
// se asse di testa
|
||||
if ( m_vCalcRotAx[i].bHead)
|
||||
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// aggiorno posizione testa con assi lineari di testa
|
||||
DBLVECTOR vMov( {dX, dY, dZ}) ;
|
||||
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
|
||||
if ( m_vCalcLinAx[i].bHead)
|
||||
ptNose += m_vCalcLinAx[i].vtDir * vMov[i] ;
|
||||
}
|
||||
// eseguo rotazione eventuale asse rotante speciale di testa
|
||||
if ( m_nHeadSpecRotAxis != -1) {
|
||||
if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
|
||||
return false ;
|
||||
int i = m_nHeadSpecRotAxis ;
|
||||
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
return false ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -1374,50 +1262,26 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
return false ;
|
||||
|
||||
// se centro di lavoro
|
||||
if ( m_nCalcChainType == KIN_CHAIN_CENTER) {
|
||||
// aggiorno posizione tip utensile a riposo mediante ciclo inverso sugli assi rotanti di testa
|
||||
ptTip = m_ptCalcPos - m_vtCalcDir * m_dCalcTLen ;
|
||||
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
|
||||
// se asse di testa non speciale
|
||||
if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
|
||||
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// aggiorno posizione tip utensile con assi lineari di testa
|
||||
DBLVECTOR vMov( {dX, dY, dZ}) ;
|
||||
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
|
||||
if ( m_vCalcLinAx[i].bHead)
|
||||
ptTip += m_vCalcLinAx[i].vtDir * vMov[i] ;
|
||||
}
|
||||
// eseguo rotazione eventuale asse rotante speciale di testa
|
||||
if ( m_nHeadSpecRotAxis != -1) {
|
||||
if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
|
||||
return false ;
|
||||
int i = m_nHeadSpecRotAxis ;
|
||||
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// aggiorno posizione tip utensile a riposo mediante ciclo inverso sugli assi rotanti di testa
|
||||
ptTip = m_ptCalcPos - m_vtCalcDir * m_dCalcTLen ;
|
||||
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
|
||||
// se asse di testa non speciale
|
||||
if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
|
||||
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// se robot
|
||||
else if ( m_nCalcChainType == KIN_CHAIN_ROBOT) {
|
||||
// aggiorno posizione tip utensile a riposo mediante ciclo inverso sugli assi rotanti di testa
|
||||
ptTip = m_ptCalcPos - m_vtCalcDir * m_dCalcTLen ;
|
||||
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
|
||||
// se asse di testa
|
||||
if ( m_vCalcRotAx[i].bHead)
|
||||
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// aggiorno posizione tip utensile con assi lineari di testa
|
||||
DBLVECTOR vMov( {dX, dY, dZ}) ;
|
||||
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
|
||||
if ( m_vCalcLinAx[i].bHead)
|
||||
ptTip += m_vCalcLinAx[i].vtDir * vMov[i] ;
|
||||
}
|
||||
// eseguo rotazione eventuale asse rotante speciale di testa
|
||||
if ( m_nHeadSpecRotAxis != -1) {
|
||||
if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
|
||||
return false ;
|
||||
int i = m_nHeadSpecRotAxis ;
|
||||
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
return false ;
|
||||
|
||||
// nel caso di robot devo passare dal riferimento canonico robot a quello di macchina
|
||||
if ( m_nCalcChainType == KIN_CHAIN_ROBOT)
|
||||
ptTip.ToGlob( m_frRobot) ;
|
||||
|
||||
// Se richiesto ingombro totale o punto sotto del tip utensile
|
||||
if ( bOverall || bBottom) {
|
||||
@@ -1853,7 +1717,7 @@ Machine::GetCurrAxisName( int nInd, string& sAxName) const
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::GetAllCurrAxesNames( STRVECTOR& vAxName) const
|
||||
Machine::GetAllCurrAxesName( STRVECTOR& vAxName) const
|
||||
{
|
||||
vAxName.clear() ;
|
||||
bool bOk = true ;
|
||||
@@ -1902,7 +1766,7 @@ Machine::GetCurrAxisToken( int nInd, string& sAxToken) const
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::GetAllCurrAxesTokens( STRVECTOR& vAxToken) const
|
||||
Machine::GetAllCurrAxesToken( STRVECTOR& vAxToken) const
|
||||
{
|
||||
vAxToken.clear() ;
|
||||
bool bOk = true ;
|
||||
@@ -2064,111 +1928,3 @@ Machine::GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const
|
||||
}
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::GetRobotAngles( const Point3d& ptP, const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
DBLVECTOR& vAng1, DBLVECTOR& vAng2) const
|
||||
{
|
||||
// pulisco il risultato
|
||||
vAng1.clear() ;
|
||||
vAng2.clear() ;
|
||||
// porto i dati nel riferimento robot
|
||||
Point3d ptPL = GetToLoc( ptP, m_frRobot) ;
|
||||
Vector3d vtDirTL = GetToLoc( vtDirT, m_frRobot) ;
|
||||
Vector3d vtDirAL = GetToLoc( vtDirA, m_frRobot) ;
|
||||
// riferimento utensile
|
||||
Frame3d frTool ;
|
||||
frTool.Set( ORIG, vtDirTL, vtDirAL) ;
|
||||
// deduco la posizione richiesta del centro del polso
|
||||
Point3d ptCen = ptPL + m_ptWristCen.x * frTool.VersX() +
|
||||
m_ptWristCen.y * frTool.VersY() +
|
||||
( m_dCalcTLen + m_ptWristCen.z) * frTool.VersZ() ;
|
||||
// deduco la direzione richiesta del centro del polso
|
||||
Vector3d vtCen = m_vtWristRef.x * frTool.VersX() +
|
||||
m_vtWristRef.y * frTool.VersY() +
|
||||
m_vtWristRef.z * frTool.VersZ() ;
|
||||
// calcolo il primo asse rotante
|
||||
Vector3d vtArm = ptCen - m_vCalcRotAx[0].ptPos ;
|
||||
double dAng1 ; bool bDet1 ;
|
||||
if ( ! X_AX.GetRotation( vtArm, m_vCalcRotAx[0].vtDir, EPS_SMALL, dAng1, bDet1) || ! bDet1) {
|
||||
LOG_ERROR( GetEMkLogger(), "Error : direction unreachable (robot)")
|
||||
return false ;
|
||||
}
|
||||
vAng1.push_back( dAng1) ;
|
||||
vAng2.push_back( dAng1) ;
|
||||
// calcolo secondo e terzo asse rotante
|
||||
Point3d ptR2 = m_vCalcRotAx[1].ptPos ;
|
||||
ptR2.Rotate( m_vCalcRotAx[0].ptPos, m_vCalcRotAx[0].vtDir, dAng1) ;
|
||||
Vector3d vtR2 = m_vCalcRotAx[1].vtDir ;
|
||||
vtR2.Rotate( m_vCalcRotAx[0].vtDir, dAng1) ;
|
||||
Vector3d vtR2Cen = ptCen - ( ptR2 + ( ptCen - ptR2) * vtR2 * vtR2) ;
|
||||
double dDistR2Cen = vtR2Cen.Len() ;
|
||||
double dDistR2R3 = m_vCalcRotAx[2].ptPos.z - m_vCalcRotAx[1].ptPos.z ;
|
||||
Vector3d vtR3R5 = m_vCalcRotAx[4].ptPos - m_vCalcRotAx[2].ptPos ; vtR3R5.y = 0 ;
|
||||
double dDistR3R5 = vtR3R5.Len() ;
|
||||
double dAngR3R5 = atan2( vtR3R5.z, vtR3R5.x) * RADTODEG ;
|
||||
double dCosB = ( dDistR2R3 * dDistR2R3 + dDistR2Cen * dDistR2Cen - dDistR3R5 * dDistR3R5) / ( 2 * dDistR2R3 * dDistR2Cen) ;
|
||||
double dCosC = ( dDistR3R5 * dDistR3R5 + dDistR2Cen * dDistR2Cen - dDistR2R3 * dDistR2R3) / ( 2 * dDistR3R5 * dDistR2Cen) ;
|
||||
if ( abs( dCosB) > 1 || abs( dCosC) > 1) {
|
||||
LOG_ERROR( GetEMkLogger(), "Error : position unreachable (robot)")
|
||||
return false ;
|
||||
}
|
||||
double dAngB = acos( dCosB) * RADTODEG ;
|
||||
double dAng2 ; bool bDet2 ;
|
||||
if ( ! Z_AX.GetRotation( vtR2Cen, vtR2, EPS_SMALL, dAng2, bDet2) || ! bDet2) {
|
||||
LOG_ERROR( GetEMkLogger(), "Error : R2 not calculable (robot)")
|
||||
return false ;
|
||||
}
|
||||
dAng2 -= dAngB ;
|
||||
vAng1.push_back( dAng2) ;
|
||||
vAng2.push_back( dAng2) ;
|
||||
double dAngC = acos( dCosC) * RADTODEG ;
|
||||
double dAng3 = dAngB + dAngC + dAngR3R5 - ANG_RIGHT ;
|
||||
vAng1.push_back( dAng3) ;
|
||||
vAng2.push_back( dAng3) ;
|
||||
// calcolo i primi due assi rotanti del polso
|
||||
Frame3d frWrist ;
|
||||
frWrist.Set( m_vCalcRotAx[3].ptPos, m_vCalcRotAx[3].vtDir, m_vCalcRotAx[4].vtDir ^ m_vCalcRotAx[3].vtDir) ;
|
||||
frWrist.Rotate( m_vCalcRotAx[2].ptPos, m_vCalcRotAx[2].vtDir, dAng3) ;
|
||||
frWrist.Rotate( m_vCalcRotAx[1].ptPos, m_vCalcRotAx[1].vtDir, dAng2) ;
|
||||
frWrist.Rotate( m_vCalcRotAx[0].ptPos, m_vCalcRotAx[0].vtDir, dAng1) ;
|
||||
Vector3d vtCenL = GetToLoc( vtCen, frWrist) ;
|
||||
double dAng4, dAng5 ;
|
||||
vtCenL.ToSpherical( nullptr, &dAng5, &dAng4) ;
|
||||
if ( dAng4 > ANG_STRAIGHT)
|
||||
dAng4 -= ANG_FULL ;
|
||||
if ( dAng4 > ANG_RIGHT) {
|
||||
dAng4 -= ANG_STRAIGHT ;
|
||||
dAng5 = -dAng5 ;
|
||||
}
|
||||
else if ( dAng4 < -ANG_RIGHT) {
|
||||
dAng4 += ANG_STRAIGHT ;
|
||||
dAng5 = -dAng5 ;
|
||||
}
|
||||
vAng1.push_back( dAng4) ;
|
||||
vAng1.push_back( dAng5) ;
|
||||
vAng2.push_back( dAng4 + ( dAng4 > EPS_ANG_ZERO ? -ANG_STRAIGHT : ANG_STRAIGHT)) ;
|
||||
vAng2.push_back( -dAng5) ;
|
||||
// calcolo il terzo asse rotante del polso
|
||||
Vector3d vtR6 = m_vCalcRotAx[5].vtDir ;
|
||||
for ( int i = 4; i >= 0 ; --i)
|
||||
vtR6.Rotate( m_vCalcRotAx[i].vtDir, vAng1[i]) ;
|
||||
Vector3d vtTool = m_vtCalcDir ;
|
||||
for ( int i = 4; i >= 0 ; --i)
|
||||
vtTool.Rotate( m_vCalcRotAx[i].vtDir, vAng1[i]) ;
|
||||
double dAng6 ; bool bDet6 ;
|
||||
if ( ! vtTool.GetRotation( vtDirTL, vtR6, EPS_SMALL, dAng6, bDet6) || ! bDet6) {
|
||||
Vector3d vtAux = m_vtCalcADir ;
|
||||
for ( int i = 4; i >= 0 ; --i)
|
||||
vtAux.Rotate( m_vCalcRotAx[i].vtDir, vAng1[i]) ;
|
||||
if ( ! vtAux.GetRotation( vtDirAL, vtR6, EPS_SMALL, dAng6, bDet6) || ! bDet6) {
|
||||
LOG_ERROR( GetEMkLogger(), "Error : R6 not calculable (robot)")
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
vAng1.push_back( dAng6) ;
|
||||
vAng2.push_back( dAng6 + ( dAng6 > EPS_ANG_ZERO ? -ANG_STRAIGHT : ANG_STRAIGHT)) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -98,18 +98,6 @@ Machine::GetHeadSolCh( const string& sHead) const
|
||||
return pHead->GetSolCh() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Machine::GetHeadSelectType( const string& sHead) const
|
||||
{
|
||||
// recupero testa
|
||||
Head* pHead = GetHead( GetGroup( sHead)) ;
|
||||
if ( pHead == nullptr)
|
||||
return MCH_SCC_NONE ;
|
||||
// recupero tipo di selezione delle uscite della testa
|
||||
return pHead->GetSelectType() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::LoadTool( const string& sHead, int nExit, const string& sTool)
|
||||
|
||||
+13
-14
@@ -51,7 +51,6 @@ static const string FLD_STROKE = "Stroke" ;
|
||||
static const string FLD_HOME = "Home" ;
|
||||
static const string FLD_ADJUSTAUX = "AdjustAux" ;
|
||||
static const string FLD_HSET = "HSet" ;
|
||||
static const string FLD_SEL_TYPE = "SelType" ;
|
||||
static const string FLD_TDIR = "TDir" ;
|
||||
static const string FLD_ADIR = "ADir" ;
|
||||
static const string FLD_ROT1W = "Rot1W" ;
|
||||
@@ -59,7 +58,6 @@ static const string FLD_MAXDELTAR2ON1 = "MaxDeltaR2OnFirst" ;
|
||||
static const string FLD_ROT2STROKE = "Rot2Stroke" ;
|
||||
static const string FLD_SOLCH = "SolCh" ;
|
||||
static const string FLD_OTHCOLL = "OthColl" ;
|
||||
static const string FLD_COLL = "Coll" ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
Machine* Machine::m_pMchLua = nullptr ;
|
||||
@@ -453,9 +451,6 @@ Machine::LuaEmtTable( lua_State* L)
|
||||
// lettura eventuale campo 'Scale' dalla tabella
|
||||
double vScale[3] = {1.0, 1.0, 1.0} ;
|
||||
LuaGetTabFieldParam( L, 1, FLD_SCALE, vScale) ;
|
||||
// lettura eventuale campo 'Coll' dalla tabella
|
||||
STRVECTOR vsColl ;
|
||||
LuaGetTabFieldParam( L, 1, FLD_COLL, vsColl) ;
|
||||
// lettura campo 'Geo' dalla tabella
|
||||
string sGeo ;
|
||||
LuaCheckTabFieldParam( L, 1, FLD_GEO, sGeo)
|
||||
@@ -473,7 +468,7 @@ Machine::LuaEmtTable( lua_State* L)
|
||||
return luaL_error( L, " Unknown Machine") ;
|
||||
|
||||
// carico i dati della tavola
|
||||
if ( ! m_pMchLua->LoadMachineTable( sName, sParent, nType, Ref1, vScale[0], vScale[1], vScale[2], vsColl, sGeo, vsAux))
|
||||
if ( ! m_pMchLua->LoadMachineTable( sName, sParent, nType, Ref1, vScale[0], vScale[1], vScale[2], sGeo, vsAux))
|
||||
return luaL_error( L, " Load Machine Table failed") ;
|
||||
|
||||
// restituisco l'indice della tavola
|
||||
@@ -665,9 +660,6 @@ Machine::LuaEmtMultiHead( lua_State* L)
|
||||
// lettura campo 'HSet' dalla tabella
|
||||
string sHSet ;
|
||||
LuaCheckTabFieldParam( L, 1, FLD_HSET, sHSet)
|
||||
// lettura eventuale campo tipo di selezione ammessa per le uscite
|
||||
int nSelectType = MCH_SLT_FIXEDEXITS ;
|
||||
LuaGetTabFieldParam( L, 1, FLD_SEL_TYPE, nSelectType) ;
|
||||
// lettura campo 'ExitNbr' dalla tabella
|
||||
int nExitNbr ;
|
||||
LuaCheckTabFieldParam( L, 1, FLD_EXIT_NBR, nExitNbr)
|
||||
@@ -720,7 +712,7 @@ Machine::LuaEmtMultiHead( lua_State* L)
|
||||
return luaL_error( L, " Unknown Machine") ;
|
||||
|
||||
// carico i dati della testa multipla
|
||||
if ( ! m_pMchLua->LoadMachineMultiHead( sName, sParent, sHSet, nSelectType, vMuExit, vtADir,
|
||||
if ( ! m_pMchLua->LoadMachineMultiHead( sName, sParent, sHSet, vMuExit, vtADir,
|
||||
dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl, sGeo, vsAux))
|
||||
return luaL_error( L, " Load Machine Multi Head failed") ;
|
||||
|
||||
@@ -1487,11 +1479,18 @@ int
|
||||
Machine::LuaEmtMoveAxes( lua_State* L)
|
||||
{
|
||||
// 4, ..., 31 parametri : nMoveType, sAx1, dPos1, dStep1 [, sAx2, dPos2, dStep2] ... [, sAx10, dPos10, dStep10]
|
||||
int nMoveType = 0 ;
|
||||
LuaGetParam( L, 1, nMoveType) ;
|
||||
int nMoveType ;
|
||||
LuaCheckParam( L, 1, nMoveType)
|
||||
string sAx1 ;
|
||||
LuaCheckParam( L, 2, sAx1) ;
|
||||
double dEnd1 ;
|
||||
LuaCheckParam( L, 3, dEnd1) ;
|
||||
double dStep1 ;
|
||||
LuaCheckParam( L, 4, dStep1) ;
|
||||
SAMVECTOR vAxNaEpSt ;
|
||||
for ( int i = 0 ; i < 10 ; ++ i) {
|
||||
int nInd = 2 + 3 * i ;
|
||||
vAxNaEpSt.emplace_back( sAx1, dEnd1, dStep1) ;
|
||||
for ( int i = 0 ; i < 9 ; ++ i) {
|
||||
int nInd = 5 + 3 * i ;
|
||||
string sAxN ;
|
||||
double dEndN ;
|
||||
double dStepN ;
|
||||
|
||||
+2
-14
@@ -1,7 +1,7 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2024
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : MachineStruConst.h Data : 15.01.24 Versione : 2.5l6
|
||||
// File : MachineStruConst.h Data : 25.05.15 Versione : 1.6e7
|
||||
// Contenuto : Strutture e costanti di macchina.
|
||||
//
|
||||
//
|
||||
@@ -88,18 +88,6 @@ enum MchHeadType { MCH_HT_NONE = 0,
|
||||
MCH_HT_MULTI = 2,
|
||||
MCH_HT_SPECIAL = 3} ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Tipo di selezione ammessa per le uscite
|
||||
enum MchSelType { MCH_SLT_FIXEDEXITS = 0,
|
||||
MCH_SLT_ONEEXIT = 1,
|
||||
MCH_SLT_MULTIEXITS = 2} ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Tipo della catena cinematica
|
||||
enum KinChainType { KIN_CHAIN_NONE = 0,
|
||||
KIN_CHAIN_CENTER = 1,
|
||||
KIN_CHAIN_ROBOT = 2} ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Identificativo iniziale riferimenti di tavola
|
||||
const std::string MCH_TREF = "R" ;
|
||||
|
||||
@@ -148,15 +148,6 @@ Machining::PrepareToolPreview( void) const
|
||||
int nId = m_pGeomDB->CopyGlob( nHeadId, GDB_ID_NULL, nStId) ;
|
||||
m_pGeomDB->SetMode( nId, GDB_MD_STD) ;
|
||||
m_pGeomDB->SetStatus( nId, GDB_ST_OFF) ;
|
||||
// elimino eventuali gruppi opportunamente indicati
|
||||
int nSubId = m_pGeomDB->GetFirstGroupInGroup( nId) ;
|
||||
while ( nSubId != GDB_ID_NULL) {
|
||||
int nNextSubId = m_pGeomDB->GetNextGroup( nSubId) ;
|
||||
bool bShow = true ;
|
||||
if ( m_pGeomDB->GetInfo( nSubId, KEY_PREVIEWSHOW, bShow) && ! bShow)
|
||||
m_pGeomDB->Erase( nSubId) ;
|
||||
nSubId = nNextSubId ;
|
||||
}
|
||||
return ( nId != GDB_ID_NULL) ;
|
||||
}
|
||||
|
||||
|
||||
+3
-27
@@ -1,7 +1,7 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2024
|
||||
// EgalTech 2015-2022
|
||||
//----------------------------------------------------------------------------
|
||||
// File : MachiningsMgr.cpp Data : 29.03.24 Versione : 2.6d1
|
||||
// File : MachiningsMgr.cpp Data : 04.02.22 Versione : 2.4b1
|
||||
// Contenuto : Implementazione gestore database lavorazioni.
|
||||
//
|
||||
//
|
||||
@@ -16,7 +16,6 @@
|
||||
// 22.06.20 DS Agg. per nuovi parametri attacco tagli di lama (MF_CURR_VER = 1010).
|
||||
// 09.11.20 DS Agg. per nuovi parametri tagli di lama (MF_CURR_VER = 1011).
|
||||
// 04.02.22 DS Agg. per nuovi parametri svuotature con epicicli (MF_CURR_VER = 1012).
|
||||
// 29.03.24 DS Agg. parametro APPROX_LINTOL (MF_CURR_VER = 1013).
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
@@ -43,7 +42,7 @@ const string MF_HEADER = "[HEADER]" ;
|
||||
const string MF_VERSION = "VERSION" ;
|
||||
const string MF_TOTAL = "TOTAL" ;
|
||||
const string MF_SIZE = "SIZE" ;
|
||||
const int MF_CURR_VER = 1013 ;
|
||||
const int MF_CURR_VER = 1012 ;
|
||||
const string MF_GENERAL = "[GENERAL]" ;
|
||||
const string MF_3AXCOMP = "3AXCOMP" ;
|
||||
const bool MF_CURR_3AXCOMP = false ;
|
||||
@@ -65,8 +64,6 @@ const string MF_INTSAWARCMAXSIDEANG = "INTSAWARCMAXSIDEANG" ;
|
||||
const double MF_CURR_INTSAWARCMAXSIDEANG = 45 ;
|
||||
const string MF_SPLITARCS = "SPLITARCS" ;
|
||||
const int MF_CURR_SPLITARCS = SPLAR_NEVER ;
|
||||
const string MF_APPROX_LINTOL = "APPROX_LINTOL" ;
|
||||
const double MF_CURR_APPROX_LINTOL = 0.05 ;
|
||||
const string MF_MAXDEPTHSAFE = "MAXDEPTHSAFE" ;
|
||||
const double MF_CURR_MAXDEPTHSAFE = 2.0 ;
|
||||
|
||||
@@ -88,7 +85,6 @@ MachiningsMgr::MachiningsMgr( void)
|
||||
m_dExtSawArcMinRad = MF_CURR_EXTSAWARCMINRAD ;
|
||||
m_dIntSawArcMaxSideAng = MF_CURR_INTSAWARCMAXSIDEANG ;
|
||||
m_nSplitArcs = MF_CURR_SPLITARCS ;
|
||||
m_dApproxLinTol = MF_CURR_APPROX_LINTOL ;
|
||||
m_dMaxDepthSafe = MF_CURR_MAXDEPTHSAFE ;
|
||||
}
|
||||
|
||||
@@ -316,8 +312,6 @@ MachiningsMgr::LoadGeneral( Scanner& TheScanner, bool& bEnd)
|
||||
bOk = FromString( sVal, m_dIntSawArcMaxSideAng) ;
|
||||
else if ( ToUpper( sKey) == MF_SPLITARCS)
|
||||
bOk = FromString( sVal, m_nSplitArcs) ;
|
||||
else if ( ToUpper( sKey) == MF_APPROX_LINTOL)
|
||||
bOk = FromString( sVal, m_dApproxLinTol) ;
|
||||
else if ( ToUpper( sKey) == MF_MAXDEPTHSAFE)
|
||||
bOk = FromString( sVal, m_dMaxDepthSafe) ;
|
||||
else
|
||||
@@ -505,10 +499,6 @@ MachiningsMgr::SaveGeneral( Writer& TheWriter) const
|
||||
sOut = MF_MAXDEPTHSAFE + "=" + ToString( m_dMaxDepthSafe) ;
|
||||
bOk = bOk && TheWriter.OutText( sOut) ;
|
||||
}
|
||||
if ( m_nDbVer >= 1013) {
|
||||
sOut = MF_APPROX_LINTOL + "=" + ToString( m_dApproxLinTol) ;
|
||||
bOk = bOk && TheWriter.OutText( sOut) ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
@@ -1185,20 +1175,6 @@ MachiningsMgr::SetSplitArcs( int nFlag)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachiningsMgr::SetApproxLinTol( double dLinTol)
|
||||
{
|
||||
// verifico non sia inferiore al minimo
|
||||
dLinTol = max( dLinTol, EPS_SMALL) ;
|
||||
// se cambiato, salvo e setto modifica
|
||||
if ( abs( dLinTol - m_dApproxLinTol) > EPS_SMALL) {
|
||||
m_dApproxLinTol = dLinTol ;
|
||||
m_bModified = true ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
MachiningsMgr::SetMaxDepthSafe( double dSafe)
|
||||
|
||||
+2
-6
@@ -1,7 +1,7 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2024
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : MachiningsMgr.h Data : 29.03.24 Versione : 2.6d1
|
||||
// File : MachiningsMgr.h Data : 02.06.15 Versione : 1.6f1
|
||||
// Contenuto : Dichiarazione della classe MachiningsMgr.
|
||||
//
|
||||
//
|
||||
@@ -79,9 +79,6 @@ class MachiningsMgr
|
||||
bool SetSplitArcs( int nFlag) ;
|
||||
int GetSplitArcs( void) const
|
||||
{ return m_nSplitArcs ; }
|
||||
bool SetApproxLinTol( double dLinTol) ;
|
||||
double GetApproxLinTol( void) const
|
||||
{ return m_dApproxLinTol ; }
|
||||
bool SetMaxDepthSafe( double dSafe) ;
|
||||
double GetMaxDepthSafe( void) const
|
||||
{ return m_dMaxDepthSafe ; }
|
||||
@@ -134,6 +131,5 @@ class MachiningsMgr
|
||||
double m_dExtSawArcMinRad ;
|
||||
double m_dIntSawArcMaxSideAng ;
|
||||
int m_nSplitArcs ;
|
||||
double m_dApproxLinTol ;
|
||||
double m_dMaxDepthSafe ;
|
||||
} ;
|
||||
+536
-974
File diff suppressed because it is too large
Load Diff
@@ -85,7 +85,7 @@ class Milling : public Machining
|
||||
bool AdjustPathDrawForSaw( int nClPathId) ;
|
||||
bool CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double& dElev) const ;
|
||||
bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ;
|
||||
bool GenerateMillingPv( int nPathId, const ICurveComposite* pCompo, double dRbDist, double dDepth) ;
|
||||
bool GenerateMillingPv( int nPathId, const ICurveComposite* pCompo) ;
|
||||
bool AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
double dDepth, double dElev, bool bSplitArcs, bool bPathTabsEnable, bool bPathOscEnable) ;
|
||||
bool AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dElev,
|
||||
@@ -96,18 +96,15 @@ class Milling : public Machining
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs, bool bPathTabsEnable, bool bPathOscEnable) ;
|
||||
bool AddSawZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool AddSawOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bOutStart, bool bAboveStart, bool bFirst, bool bSplitArcs) ;
|
||||
double dElev, double dAppr, bool bOutStart, bool bAboveStart) ;
|
||||
bool AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, const Vector3d& vtTool,
|
||||
double dSafeZ, double dSawStElev, double dStElev, double dAppr,
|
||||
bool bFirst, bool bSplitArcs, bool bAddInsert = false) ;
|
||||
bool AddDirectApproach( const Point3d& ptP, bool bSplitArcs) ;
|
||||
double dSafeZ, double dSawStElev, double dStElev, double dAppr) ;
|
||||
bool AddDirectApproach( const Point3d& ptP) ;
|
||||
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bAboveEnd, bool bSplitArcs) ;
|
||||
double dElev, double dAppr, bool bAboveEnd) ;
|
||||
bool AddSawBladeSideRetract( const Point3d& ptP, const Vector3d& vtRetr, const Vector3d& vtTool,
|
||||
double dSafeZ, double dSawEndElev, double dEndElev, double dAppr, bool bAddExtract = false) ;
|
||||
double dSafeZ, double dSawEndElev, double dEndElev, double dAppr) ;
|
||||
bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool,
|
||||
double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1, Vector3d& vtDir1) const ;
|
||||
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart,
|
||||
@@ -124,14 +121,11 @@ class Milling : public Machining
|
||||
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( bool bExtra = true) const ;
|
||||
bool GetSimplePointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, const Vector3d& vtCorr) const ;
|
||||
bool GetPointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, const Vector3d& vtCorr, double dElev, double dSafeZ) const ;
|
||||
bool GetPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool) const ;
|
||||
bool GetPointBelowRaw( const Point3d& ptP, const Vector3d& vtTool) const ;
|
||||
bool CalcAndSetCorrAuxDir( const ICurveComposite* pCompo, double dU, bool bInvertSide = false, bool bSawSpecial = false) ;
|
||||
Vector3d CalcCorrDir( const ICurveComposite* pCompo, double dU, bool bInvertSide = false, bool bSawSpecial = false) ;
|
||||
bool CalcAndSetCorrAuxDir( const ICurveComposite* pCompo, double dU) ;
|
||||
Vector3d CalcCorrDir( const ICurveComposite* pCompo, double dU) ;
|
||||
bool CalcOffset( ICurveComposite* pCompo, double dSignOffs) ;
|
||||
bool TrimExtendCurveToClosedStm( ICurveComposite* pCompo, int nCstmId, bool bInvert) ;
|
||||
|
||||
private :
|
||||
double GetSpeed() const
|
||||
@@ -187,6 +181,4 @@ class Milling : public Machining
|
||||
double m_dCurrTabsLen ; // lunghezza corrente lungo il percorso per tabs
|
||||
bool m_bStartOutRaw ; // flag forzatura inizio fuori dal grezzo
|
||||
bool m_bEndOutRaw ; // flag forzatura fine fuori dal grezzo
|
||||
Vector3d m_vtStartDir ; // direzione iniziale del percorso in elaborazione
|
||||
Vector3d m_vtEndDir ; // direzione finale del percorso in elaborazione
|
||||
} ;
|
||||
+1
-1
@@ -1570,7 +1570,7 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co
|
||||
int nFirstFlag = ( bFirst ? 1 : 0) ;
|
||||
SetFlag( nFirstFlag) ;
|
||||
Point3d ptP1 = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * ( dDelta + dStartElev + dSafeZ) ;
|
||||
int nStart = AddRapidStartOrMove( ptP1, bFirst) ;
|
||||
int nStart = ( bFirst ? AddRapidStart( ptP1) : AddRapidMove( ptP1)) ;
|
||||
if ( nStart == GDB_ID_NULL)
|
||||
return false ;
|
||||
SetFlag( 0) ;
|
||||
|
||||
+748
-1046
File diff suppressed because it is too large
Load Diff
+10
-49
@@ -14,14 +14,15 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "MachMgr.h"
|
||||
#include "MachConst.h"
|
||||
#include "MachineStruConst.h"
|
||||
#include "/EgtDev/Include/EGkPoint3d.h"
|
||||
#include "/EgtDev/Include/EGkUserObj.h"
|
||||
#include "/EgtDev/Include/EGkSelection.h"
|
||||
#include "/EgtDev/Include/EgtNumCollection.h"
|
||||
#include "/EgtDev/Include/EGkStmStandard.h"
|
||||
|
||||
class MachMgr ;
|
||||
class CamData ;
|
||||
class ICurve ;
|
||||
class ICurveComposite ;
|
||||
@@ -43,7 +44,7 @@ class Operation : public IUserObj
|
||||
virtual int GetPhase( void) const
|
||||
{ return m_nPhase ; }
|
||||
virtual bool RemoveHome( void) ;
|
||||
std::string GetName( void) const ;
|
||||
std::string GetName( void) const ;
|
||||
|
||||
public :
|
||||
virtual int GetType( void) const = 0 ;
|
||||
@@ -61,21 +62,6 @@ class Operation : public IUserObj
|
||||
{ return true ; }
|
||||
virtual bool AdjustArcCenterForAxesCalc( const CamData* pCamData, Point3d& ptCen) const
|
||||
{ return true ; }
|
||||
virtual bool NeedSplit( bool bSplit = true, bool bFeed = true) const
|
||||
{ return ( bSplit && ( m_pMchMgr == nullptr || m_pMchMgr->GetCurrIsRobot())) ; }
|
||||
virtual double GetMaxSplitLen( bool bSplit = true, bool bFeed = true) const
|
||||
{ return ( bSplit && ( m_pMchMgr == nullptr || m_pMchMgr->GetCurrIsRobot()) ? ( bFeed ? 5 : 50) : 0) ; }
|
||||
virtual bool GetSplitArcs( const Vector3d& vtTool) const
|
||||
{ if ( m_pMchMgr == nullptr || m_pMchMgr->GetCurrIsRobot())
|
||||
return true ;
|
||||
int nSplitArcs = m_pMchMgr->GetCurrMachiningsMgr()->GetSplitArcs() ;
|
||||
return ( nSplitArcs == SPLAR_ALWAYS ||
|
||||
( nSplitArcs == SPLAR_NO_XY_PLANE && ! vtTool.IsZplus()) ||
|
||||
( nSplitArcs == SPLAR_GEN_PLANE && vtTool.IsGeneric())) ; }
|
||||
virtual double GetApproxLinTol( void) const
|
||||
{ if ( m_pMchMgr == nullptr)
|
||||
return 50 * EPS_SMALL ;
|
||||
return m_pMchMgr->GetCurrMachiningsMgr()->GetApproxLinTol() ; }
|
||||
|
||||
protected :
|
||||
Operation( void) ;
|
||||
@@ -104,6 +90,8 @@ class Operation : public IUserObj
|
||||
double dToolLen, bool bIsSaw, double dSafeZ, const Vector3d& vtDir, double& dElev) const ;
|
||||
bool GetUhPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev,
|
||||
double dToolLen, bool bIsSaw, double dSafeZ, const Vector3d& vtDir, double& dElev) const ;
|
||||
bool GetSignedDistFromStmRaw( int nPhase, const Point3d ptP, const Vector3d vtDir,
|
||||
double& dDist, Vector3d& vtNorm) const ;
|
||||
bool GetDistanceFromRawSide( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist) const ;
|
||||
bool GetMinDistanceFromRawSide( int nPhase, const Point3d& ptP, double dExpand,
|
||||
double& dDist, Vector3d& vtDir) const ;
|
||||
@@ -114,13 +102,14 @@ class Operation : public IUserObj
|
||||
{ double dDummy ;
|
||||
return GetDistanceFromRawBottom( nPhase, nPathId, dToler, dRbDist, dDummy) ; }
|
||||
bool GetDistanceFromRawBottom( int nPhase, int nPathId, double dToler, double& dRbDist, double& dAllRbDist) const ;
|
||||
bool GetDistanceFromRawBottom( int nPhase, BBox3d& b3Test, double dToler, double& dRbDist, double& dAllRbDist) const ;
|
||||
bool GetRawGlobBox( int nPhase, int nPathId, double dToler, BBox3d& b3Raw) const ;
|
||||
bool GetRawGlobBox( int nPhase, const BBox3d& b3Test, double dToler, BBox3d& b3Raw) const ;
|
||||
bool GetCurrRawsGlobBox( BBox3d& b3Raw) const ;
|
||||
|
||||
bool AdjustCurveFromSurf( ICurveComposite* pCrvCompo, int nToolDir, int nFaceUse, double dToolThick, int nGrade = 3) ;
|
||||
bool ApproxWithArcsIfUseful( ICurveComposite* pCompo, bool bCareTempProp = false) const ;
|
||||
bool ApproxWithLines( ICurveComposite* pCompo, bool bFeed = true) const ;
|
||||
bool ApproxWithLines( ICurveComposite* pCompo) const ;
|
||||
bool VerifyArcs( ICurveComposite* pCompo, double dMaxAngCen = MAX_ANG_CEN) const ;
|
||||
|
||||
bool CalcAndSetBBox( int nClId) ;
|
||||
@@ -144,15 +133,9 @@ class Operation : public IUserObj
|
||||
std::string ExtractHint( const std::string& sNotes) const ;
|
||||
bool SetBlockedRotAxis( const std::string& sBlockedAxis) const ;
|
||||
bool CalculateAxesValues( const std::string& sHint, bool bRotContOnNext = true, bool bSolChExact = false) ;
|
||||
bool CalculateClPathCenterAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
|
||||
bool bMaxDeltaR2OnFirst, bool bRotContOnNext, double dAngDeltaMinForHome,
|
||||
const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec) ;
|
||||
bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
|
||||
bool bMaxDeltaR2OnFirst, bool bRotContOnNext, double dAngDeltaMinForHome,
|
||||
const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec, int& nOutStrC) ;
|
||||
bool CalculateClPathRobotAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
|
||||
bool bMaxDeltaR2OnFirst, bool bRotContOnNext, double dAngDeltaMinForHome,
|
||||
const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec) ;
|
||||
bool AdjustStartEndMovements( bool bVerifyPreviousLink = true) ;
|
||||
bool AdjustOneStartMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOp, const DBLVECTOR& vAxPrev, bool bMaxZ) ;
|
||||
bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const ;
|
||||
@@ -162,9 +145,6 @@ class Operation : public IUserObj
|
||||
bool RemoveRise( int nClPathId = GDB_ID_NULL) ;
|
||||
bool AddHome( void) ;
|
||||
bool RemoveClimbRiseHome( void) ;
|
||||
bool AddRobotClimb( int nEntId, double dDeltaZ) ;
|
||||
bool CalcRobotAxesAbovePos( const Point3d& ptP, const Vector3d& vtT, const Vector3d& vtA, double dDeltaZ,
|
||||
DBLVECTOR& vAx, double* pdNewDeltaZ = nullptr) const ;
|
||||
bool CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ) const ;
|
||||
bool GetExtraZ( const DBLVECTOR& vAx1, const Vector3d& vtTool1,
|
||||
const DBLVECTOR& vAx2, const Vector3d& vtTool2,
|
||||
@@ -177,12 +157,10 @@ class Operation : public IUserObj
|
||||
int GetUserNotesZmax( void) const ;
|
||||
bool GetZHomeDown( void) const ;
|
||||
bool TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;
|
||||
int SpecialTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;
|
||||
bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ;
|
||||
bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ;
|
||||
bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) ;
|
||||
|
||||
bool GetAggrBottomData( const std::string& sHead, AggrBottom& agbData) const ;
|
||||
bool IsAggrBottom( const std::string& sHead) const ;
|
||||
|
||||
protected :
|
||||
int m_nOwnerId ; // identificativo dell'oggetto geometrico possessore
|
||||
@@ -198,7 +176,6 @@ class Operation : public IUserObj
|
||||
bool SetCorrAuxDir( const Vector3d& vtDir) ;
|
||||
bool SetFeed( double dFeed) ;
|
||||
bool SetFlag( int nFlag) ;
|
||||
bool SetFlagOnLastMove( int nFlag) ;
|
||||
bool SetFlag2( int nFlag2) ;
|
||||
bool SetIndex( int nIndex) ;
|
||||
bool GetCurrPos( Point3d& ptCurr) const
|
||||
@@ -213,26 +190,12 @@ class Operation : public IUserObj
|
||||
int AddRapidStart( const Point3d& ptP, const std::string& sName) ;
|
||||
int AddRapidMove( const Point3d& ptP) ;
|
||||
int AddRapidMove( const Point3d& ptP, const std::string& sName) ;
|
||||
int AddRapidMove( const Point3d& ptP, bool bSplit) ;
|
||||
int AddRapidMove( const Point3d& ptP, bool bSplit, const std::string& sName) ;
|
||||
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst)
|
||||
{ return ( bFirst ? AddRapidStart( ptP) : AddRapidMove( ptP)) ; }
|
||||
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst, const std::string& sName)
|
||||
{ return ( bFirst ? AddRapidStart( ptP, sName) : AddRapidMove( ptP, sName)) ; }
|
||||
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst, bool bSplit)
|
||||
{ return ( bFirst ? AddRapidStart( ptP) : AddRapidMove( ptP, bSplit)) ; }
|
||||
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst, bool bSplit, const std::string& sName)
|
||||
{ return ( bFirst ? AddRapidStart( ptP, sName) : AddRapidMove( ptP, bSplit, sName)) ; }
|
||||
int AddLinearMove( const Point3d& ptP) ;
|
||||
int AddLinearMove( const Point3d& ptP, const std::string& sName) ;
|
||||
int AddLinearMove( const Point3d& ptP, bool bSplit) ;
|
||||
int AddLinearMove( const Point3d& ptP, bool bSplit, const std::string& sName) ;
|
||||
int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) ;
|
||||
int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN, const std::string& sName) ;
|
||||
int AddCurveMove( const ICurve* pCrv) ;
|
||||
int AddCurveMove( const ICurve* pCrv, const std::string& sName) ;
|
||||
int AddCurveMove( const ICurve* pCrv, bool bSplit) ;
|
||||
int AddCurveMove( const ICurve* pCrv, bool bSplit, const std::string& sName) ;
|
||||
int AddCurveMove( const ICurve* pCrv, bool bOnlySimple = false) ;
|
||||
int AddCurveMove( const ICurve* pCrv, const std::string& sName, bool bOnlySimple = false) ;
|
||||
bool ResetMoveData( void) ;
|
||||
|
||||
protected :
|
||||
@@ -259,5 +222,3 @@ inline Operation* GetOperation( IUserObj* pUserObj)
|
||||
enum { TOOL_PARAL = 1, TOOL_ORTHO = 2, TOOL_ORTUP = 3, TOOL_PAR_SLANT= 4} ;
|
||||
// tipo di utilizzo contorno faccia
|
||||
enum { FACE_DOWN = 1, FACE_TOP = 2, FACE_FRONT = 3, FACE_BACK = 4, FACE_LEFT = 5, FACE_RIGHT = 6, FACE_CONT = 7} ;
|
||||
// risultato di SpecialTestCollisionAvoid
|
||||
enum { SCAV_ERROR = -1, SCAV_COLLIDE = 0, SCAV_AVOID = 1, SCAV_TOTEST = 2};
|
||||
|
||||
+6
-123
@@ -82,18 +82,6 @@ Operation::SetFlag( int nFlag)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::SetFlagOnLastMove( int nFlag)
|
||||
{
|
||||
int nLastEntId = m_pGeomDB->GetLastInGroup( m_nPathId) ;
|
||||
CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nLastEntId)) ;
|
||||
if ( pCamData == nullptr)
|
||||
return false ;
|
||||
pCamData->SetFlag( nFlag) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::SetFlag2( int nFlag2)
|
||||
@@ -212,46 +200,6 @@ Operation::AddRapidMove( const Point3d& ptP, const string& sName)
|
||||
return nId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddRapidMove( const Point3d& ptP, bool bSplit)
|
||||
{
|
||||
// se non richiesta spezzatura con massima lunghezza, emissione normale
|
||||
if ( ! NeedSplit( bSplit))
|
||||
return AddRapidMove( ptP) ;
|
||||
// altrimenti opportuna spezzatura
|
||||
Point3d ptS ;
|
||||
if ( ! GetCurrPos( ptS))
|
||||
return GDB_ID_NULL ;
|
||||
double dLen = Dist( ptS, ptP) ;
|
||||
double dStep = GetMaxSplitLen( true, false) ;
|
||||
int nStep = int( dLen / dStep + 0.999) ;
|
||||
int nFirstId = GDB_ID_NULL ;
|
||||
for ( int i = 1 ; i <= nStep ; ++ i) {
|
||||
int nId = AddRapidMove( Media( ptS, ptP, i * 1.0 / nStep)) ;
|
||||
if ( nId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
if ( nFirstId == GDB_ID_NULL)
|
||||
nFirstId = nId ;
|
||||
SetFlag( 0) ;
|
||||
SetFlag2( 0) ;
|
||||
}
|
||||
return nFirstId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddRapidMove( const Point3d& ptP, bool bSplit, const string& sName)
|
||||
{
|
||||
int nFirstId = AddRapidMove( ptP, bSplit) ;
|
||||
int nId = nFirstId ;
|
||||
while ( nId != GDB_ID_NULL) {
|
||||
m_pGeomDB->SetName( nId, sName) ;
|
||||
nId = m_pGeomDB->GetNext( nId) ;
|
||||
}
|
||||
return nFirstId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddLinearMove( const Point3d& ptP)
|
||||
@@ -310,44 +258,6 @@ Operation::AddLinearMove( const Point3d& ptP, const string& sName)
|
||||
return nId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddLinearMove( const Point3d& ptP, bool bSplit)
|
||||
{
|
||||
// se non richiesta spezzatura con massima lunghezza, emissione normale
|
||||
if ( ! NeedSplit( bSplit))
|
||||
return AddLinearMove( ptP) ;
|
||||
// altrimenti opportuna spezzatura
|
||||
Point3d ptS ;
|
||||
if ( ! GetCurrPos( ptS))
|
||||
return GDB_ID_NULL ;
|
||||
double dLen = Dist( ptS, ptP) ;
|
||||
double dStep = GetMaxSplitLen( true, true) ;
|
||||
int nStep = int( dLen / dStep + 0.999) ;
|
||||
int nFirstId = GDB_ID_NULL ;
|
||||
for ( int i = 1 ; i <= nStep ; ++ i) {
|
||||
int nId = AddLinearMove( Media( ptS, ptP, i * 1.0 / nStep)) ;
|
||||
if ( nId == GDB_ID_NULL)
|
||||
return GDB_ID_NULL ;
|
||||
if ( nFirstId == GDB_ID_NULL)
|
||||
nFirstId = nId ;
|
||||
}
|
||||
return nFirstId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddLinearMove( const Point3d& ptP, bool bSplit, const string& sName)
|
||||
{
|
||||
int nFirstId = AddLinearMove( ptP, bSplit) ;
|
||||
int nId = nFirstId ;
|
||||
while ( nId != GDB_ID_NULL) {
|
||||
m_pGeomDB->SetName( nId, sName) ;
|
||||
nId = m_pGeomDB->GetNext( nId) ;
|
||||
}
|
||||
return nFirstId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN)
|
||||
@@ -424,7 +334,7 @@ Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen,
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddCurveMove( const ICurve* pCrv)
|
||||
Operation::AddCurveMove( const ICurve* pCrv, bool bOnlySimple)
|
||||
{
|
||||
// verifico che la curva esista
|
||||
if ( pCrv == nullptr)
|
||||
@@ -445,8 +355,8 @@ Operation::AddCurveMove( const ICurve* pCrv)
|
||||
pArc->GetEndPoint( ptP3) ;
|
||||
return AddArcMove( ptP3, ptCen, dAngCen, vtN) ;
|
||||
}
|
||||
// se arco o curva composita
|
||||
else if ( pCrv->GetType() == CRV_ARC || pCrv->GetType() == CRV_COMPO) {
|
||||
// se ammesse curve composite
|
||||
else if ( ! bOnlySimple) {
|
||||
// in ogni caso, converto in archi e rette
|
||||
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
|
||||
if ( ! pCompo->AddCurve( *pCrv))
|
||||
@@ -485,43 +395,16 @@ Operation::AddCurveMove( const ICurve* pCrv)
|
||||
}
|
||||
return nFirstId ;
|
||||
}
|
||||
// altre curve non ammesse
|
||||
// altrimenti
|
||||
else
|
||||
return GDB_ID_NULL ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddCurveMove( const ICurve* pCrv, const string& sName)
|
||||
Operation::AddCurveMove( const ICurve* pCrv, const string& sName, bool bOnlySimple)
|
||||
{
|
||||
int nFirstId = AddCurveMove( pCrv) ;
|
||||
int nId = nFirstId ;
|
||||
while ( nId != GDB_ID_NULL) {
|
||||
m_pGeomDB->SetName( nId, sName) ;
|
||||
nId = m_pGeomDB->GetNext( nId) ;
|
||||
}
|
||||
return nFirstId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddCurveMove( const ICurve* pCrv, bool bSplit)
|
||||
{
|
||||
// se non richiesta spezzatura, emissione normale
|
||||
if ( ! bSplit)
|
||||
return AddCurveMove( pCrv) ;
|
||||
// altrimenti opportuna spezzatura
|
||||
PtrOwner<ICurveComposite> pCompo ;
|
||||
if ( ! pCompo.Set( ConvertCurveToComposite( pCrv->Clone())) || ! ApproxWithLines( pCompo))
|
||||
return false ;
|
||||
return AddCurveMove( pCompo) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Operation::AddCurveMove( const ICurve* pCrv, bool bSplit, const string& sName)
|
||||
{
|
||||
int nFirstId = AddCurveMove( pCrv, bSplit) ;
|
||||
int nFirstId = AddCurveMove( pCrv, bOnlySimple) ;
|
||||
int nId = nFirstId ;
|
||||
while ( nId != GDB_ID_NULL) {
|
||||
m_pGeomDB->SetName( nId, sName) ;
|
||||
|
||||
+44
-114
@@ -103,9 +103,6 @@ static const std::string GVAR_R1 = ".R1" ; // (num) valore de
|
||||
static const std::string GVAR_R2 = ".R2" ; // (num) valore del secondo asse rotante
|
||||
static const std::string GVAR_R3 = ".R3" ; // (num) valore del terzo asse rotante
|
||||
static const std::string GVAR_R4 = ".R4" ; // (num) valore del quarto asse rotante
|
||||
static const std::string GVAR_R5 = ".R5" ; // (num) valore del quinto asse rotante
|
||||
static const std::string GVAR_R6 = ".R6" ; // (num) valore del sesto asse rotante
|
||||
static const std::string GVAR_R7 = ".R7" ; // (num) valore del settimo asse rotante
|
||||
static const std::string GVAR_C1 = ".C1" ; // (num) valore del primo asse lineare per centro arco
|
||||
static const std::string GVAR_C2 = ".C2" ; // (num) valore del secondo asse lineare per centro arco
|
||||
static const std::string GVAR_C3 = ".C3" ; // (num) valore del terzo asse lineare per centro arco
|
||||
@@ -121,9 +118,6 @@ static const std::string GVAR_R1P = ".R1p" ; // (num) valore pr
|
||||
static const std::string GVAR_R2P = ".R2p" ; // (num) valore precedente del secondo asse rotante
|
||||
static const std::string GVAR_R3P = ".R3p" ; // (num) valore precedente del terzo asse rotante
|
||||
static const std::string GVAR_R4P = ".R4p" ; // (num) valore precedente del quarto asse rotante
|
||||
static const std::string GVAR_R5P = ".R5p" ; // (num) valore precedente del quinto asse rotante
|
||||
static const std::string GVAR_R6P = ".R6p" ; // (num) valore precedente del sesto asse rotante
|
||||
static const std::string GVAR_R7P = ".R7p" ; // (num) valore precedente del settimo asse rotante
|
||||
static const std::string GVAR_L1T = ".L1t" ; // (string) token del primo asse lineare
|
||||
static const std::string GVAR_L2T = ".L2t" ; // (string) token del secondo asse lineare
|
||||
static const std::string GVAR_L3T = ".L3t" ; // (string) token del terzo asse lineare
|
||||
@@ -131,9 +125,6 @@ static const std::string GVAR_R1T = ".R1t" ; // (string) token del
|
||||
static const std::string GVAR_R2T = ".R2t" ; // (string) token del secondo asse rotante
|
||||
static const std::string GVAR_R3T = ".R3t" ; // (string) token del terzo asse rotante
|
||||
static const std::string GVAR_R4T = ".R4t" ; // (string) token del quarto asse rotante
|
||||
static const std::string GVAR_R5T = ".R5t" ; // (string) token del quinto asse rotante
|
||||
static const std::string GVAR_R6T = ".R6t" ; // (string) token del sesto asse rotante
|
||||
static const std::string GVAR_R7T = ".R7t" ; // (string) token del settimo asse rotante
|
||||
static const std::string GVAR_C1T = ".C1t" ; // (string) token del primo asse lineare per centro arco
|
||||
static const std::string GVAR_C2T = ".C2t" ; // (string) token del secondo asse lineare per centro arco
|
||||
static const std::string GVAR_C3T = ".C3t" ; // (string) token del terzo asse lineare per centro arco
|
||||
@@ -148,9 +139,6 @@ static const std::string GVAR_R1N = ".R1n" ; // (string) nome del
|
||||
static const std::string GVAR_R2N = ".R2n" ; // (string) nome del secondo asse rotante
|
||||
static const std::string GVAR_R3N = ".R3n" ; // (string) nome del terzo asse rotante
|
||||
static const std::string GVAR_R4N = ".R4n" ; // (string) nome del quarto asse rotante
|
||||
static const std::string GVAR_R5N = ".R5n" ; // (string) nome del quinto asse rotante
|
||||
static const std::string GVAR_R6N = ".R6n" ; // (string) nome del sesto asse rotante
|
||||
static const std::string GVAR_R7N = ".R7n" ; // (string) nome del settimo asse rotante
|
||||
static const std::string GVAR_MASK = ".MASK" ; // (int) mask associato ai movimenti in rapido
|
||||
static const std::string GVAR_FLAG = ".FLAG" ; // (int) flag associato ad ogni movimento
|
||||
static const std::string GVAR_FLAG2 = ".FLAG2" ; // (int) secondo flag associato ad ogni movimento
|
||||
@@ -218,8 +206,6 @@ static const std::string ON_ESTIM_RAPID = "OnEstimRapid" ;
|
||||
static const std::string ON_ESTIM_LINEAR = "OnEstimLinear" ;
|
||||
static const std::string ON_ESTIM_ARC = "OnEstimArc" ;
|
||||
// Funzioni simulazione
|
||||
static const std::string ON_SIMUL_INIT = "OnSimulInit" ;
|
||||
static const std::string ON_SIMUL_EXIT = "OnSimulExit" ;
|
||||
static const std::string ON_SIMUL_START = "OnSimulStart" ;
|
||||
static const std::string ON_SIMUL_END = "OnSimulEnd" ;
|
||||
static const std::string ON_SIMUL_DISPOSITION_STARTING = "OnSimulDispositionStarting" ;
|
||||
@@ -241,120 +227,64 @@ static const std::string ON_RESET_MACHINE = "OnResetMachine" ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline std::string
|
||||
GetGlobVarAxisValue( int nAx, const std::string& sVar = GLOB_VAR, bool bIsRobot = false)
|
||||
GetGlobVarAxisValue( int nAx, const std::string& sVar = GLOB_VAR)
|
||||
{
|
||||
if ( ! bIsRobot) {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( sVar + GVAR_L1) ;
|
||||
case 2 : return ( sVar + GVAR_L2) ;
|
||||
case 3 : return ( sVar + GVAR_L3) ;
|
||||
case 4 : return ( sVar + GVAR_R1) ;
|
||||
case 5 : return ( sVar + GVAR_R2) ;
|
||||
case 6 : return ( sVar + GVAR_R3) ;
|
||||
case 7 : return ( sVar + GVAR_R4) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( sVar + GVAR_R1) ;
|
||||
case 2 : return ( sVar + GVAR_R2) ;
|
||||
case 3 : return ( sVar + GVAR_R3) ;
|
||||
case 4 : return ( sVar + GVAR_R4) ;
|
||||
case 5 : return ( sVar + GVAR_R5) ;
|
||||
case 6 : return ( sVar + GVAR_R6) ;
|
||||
case 7 : return ( sVar + GVAR_R7) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
switch ( nAx) {
|
||||
case 1 : return ( sVar + GVAR_L1) ;
|
||||
case 2 : return ( sVar + GVAR_L2) ;
|
||||
case 3 : return ( sVar + GVAR_L3) ;
|
||||
case 4 : return ( sVar + GVAR_R1) ;
|
||||
case 5 : return ( sVar + GVAR_R2) ;
|
||||
case 6 : return ( sVar + GVAR_R3) ;
|
||||
case 7 : return ( sVar + GVAR_R4) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline std::string
|
||||
GetGlobVarAxisPrev( int nAx, const std::string& sVar = GLOB_VAR, bool bIsRobot = false)
|
||||
GetGlobVarAxisPrev( int nAx, const std::string& sVar = GLOB_VAR)
|
||||
{
|
||||
if ( ! bIsRobot) {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( sVar + GVAR_L1P) ;
|
||||
case 2 : return ( sVar + GVAR_L2P) ;
|
||||
case 3 : return ( sVar + GVAR_L3P) ;
|
||||
case 4 : return ( sVar + GVAR_R1P) ;
|
||||
case 5 : return ( sVar + GVAR_R2P) ;
|
||||
case 6 : return ( sVar + GVAR_R3P) ;
|
||||
case 7 : return ( sVar + GVAR_R4P) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( sVar + GVAR_R1P) ;
|
||||
case 2 : return ( sVar + GVAR_R2P) ;
|
||||
case 3 : return ( sVar + GVAR_R3P) ;
|
||||
case 4 : return ( sVar + GVAR_R4P) ;
|
||||
case 5 : return ( sVar + GVAR_R5P) ;
|
||||
case 6 : return ( sVar + GVAR_R6P) ;
|
||||
case 7 : return ( sVar + GVAR_R7P) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
switch ( nAx) {
|
||||
case 1 : return ( sVar + GVAR_L1P) ;
|
||||
case 2 : return ( sVar + GVAR_L2P) ;
|
||||
case 3 : return ( sVar + GVAR_L3P) ;
|
||||
case 4 : return ( sVar + GVAR_R1P) ;
|
||||
case 5 : return ( sVar + GVAR_R2P) ;
|
||||
case 6 : return ( sVar + GVAR_R3P) ;
|
||||
case 7 : return ( sVar + GVAR_R4P) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline std::string
|
||||
GetGlobVarAxisToken( int nAx, bool bIsRobot = false)
|
||||
GetGlobVarAxisToken( int nAx)
|
||||
{
|
||||
if ( ! bIsRobot) {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( GLOB_VAR + GVAR_L1T) ;
|
||||
case 2 : return ( GLOB_VAR + GVAR_L2T) ;
|
||||
case 3 : return ( GLOB_VAR + GVAR_L3T) ;
|
||||
case 4 : return ( GLOB_VAR + GVAR_R1T) ;
|
||||
case 5 : return ( GLOB_VAR + GVAR_R2T) ;
|
||||
case 6 : return ( GLOB_VAR + GVAR_R3T) ;
|
||||
case 7 : return ( GLOB_VAR + GVAR_R4T) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( GLOB_VAR + GVAR_R1T) ;
|
||||
case 2 : return ( GLOB_VAR + GVAR_R2T) ;
|
||||
case 3 : return ( GLOB_VAR + GVAR_R3T) ;
|
||||
case 4 : return ( GLOB_VAR + GVAR_R4T) ;
|
||||
case 5 : return ( GLOB_VAR + GVAR_R5T) ;
|
||||
case 6 : return ( GLOB_VAR + GVAR_R6T) ;
|
||||
case 7 : return ( GLOB_VAR + GVAR_R7T) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
switch ( nAx) {
|
||||
case 1 : return ( GLOB_VAR + GVAR_L1T) ;
|
||||
case 2 : return ( GLOB_VAR + GVAR_L2T) ;
|
||||
case 3 : return ( GLOB_VAR + GVAR_L3T) ;
|
||||
case 4 : return ( GLOB_VAR + GVAR_R1T) ;
|
||||
case 5 : return ( GLOB_VAR + GVAR_R2T) ;
|
||||
case 6 : return ( GLOB_VAR + GVAR_R3T) ;
|
||||
case 7 : return ( GLOB_VAR + GVAR_R4T) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline std::string
|
||||
GetGlobVarAxisName( int nAx, bool bIsRobot = false)
|
||||
GetGlobVarAxisName( int nAx)
|
||||
{
|
||||
if ( ! bIsRobot) {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( GLOB_VAR + GVAR_L1N) ;
|
||||
case 2 : return ( GLOB_VAR + GVAR_L2N) ;
|
||||
case 3 : return ( GLOB_VAR + GVAR_L3N) ;
|
||||
case 4 : return ( GLOB_VAR + GVAR_R1N) ;
|
||||
case 5 : return ( GLOB_VAR + GVAR_R2N) ;
|
||||
case 6 : return ( GLOB_VAR + GVAR_R3N) ;
|
||||
case 7 : return ( GLOB_VAR + GVAR_R4N) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch ( nAx) {
|
||||
case 1 : return ( GLOB_VAR + GVAR_R1N) ;
|
||||
case 2 : return ( GLOB_VAR + GVAR_R2N) ;
|
||||
case 3 : return ( GLOB_VAR + GVAR_R3N) ;
|
||||
case 4 : return ( GLOB_VAR + GVAR_R4N) ;
|
||||
case 5 : return ( GLOB_VAR + GVAR_R5N) ;
|
||||
case 6 : return ( GLOB_VAR + GVAR_R6N) ;
|
||||
case 7 : return ( GLOB_VAR + GVAR_R7N) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
switch ( nAx) {
|
||||
case 1 : return ( GLOB_VAR + GVAR_L1N) ;
|
||||
case 2 : return ( GLOB_VAR + GVAR_L2N) ;
|
||||
case 3 : return ( GLOB_VAR + GVAR_L3N) ;
|
||||
case 4 : return ( GLOB_VAR + GVAR_R1N) ;
|
||||
case 5 : return ( GLOB_VAR + GVAR_R2N) ;
|
||||
case 6 : return ( GLOB_VAR + GVAR_R3N) ;
|
||||
case 7 : return ( GLOB_VAR + GVAR_R4N) ;
|
||||
default : return "" ;
|
||||
}
|
||||
}
|
||||
|
||||
+9502
-2754
File diff suppressed because it is too large
Load Diff
+189
-62
@@ -19,6 +19,9 @@
|
||||
#include "/EgtDev/Include/EGkCurveComposite.h"
|
||||
#include "/EgtDev/Include/EGkCurveLine.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
#include "/EgtDev/Include/EGkSurfFlatRegion.h"
|
||||
#include "/EgtDev/Include/EGkSurfTriMesh.h"
|
||||
#include "/EgtDev/Include/EGkCurveArc.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
class Pocketing : public Machining
|
||||
@@ -67,81 +70,195 @@ class Pocketing : public Machining
|
||||
|
||||
private :
|
||||
bool VerifyGeometry( SelData Id, int& nSubs, int& nType) ;
|
||||
bool GetCurves( SelData Id, ICURVEPLIST& lstPC) ;
|
||||
bool GetCurvesAndPartialVolume( SelData Id, ICURVEPLIST& lstPC, ISurfTriMesh* pStmTmp, Vector3d& vtN) ;
|
||||
bool GetForcedClosed( void) ;
|
||||
bool SetCurveAllTempProp( int nCrvId, bool bForcedClose, ICurve* pCurve, bool* pbSomeOpen = nullptr) ;
|
||||
bool ResetCurveAllTempProp( ICurve* pCurve) ;
|
||||
bool Chain( int nGrpDestId) ;
|
||||
bool ProcessPath( int nPathId, int nPvId, int nClId) ;
|
||||
bool CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double dLen, double& dElev) const ;
|
||||
bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ;
|
||||
bool GeneratePocketingPv( int nPathId, const ICurveComposite* pCompo) ;
|
||||
bool AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs, int nPathId) ;
|
||||
bool CalcZigZag( const ICurveComposite* pOffs, ICRVCOMPOPOVECTOR& vpCrvs) ;
|
||||
bool OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth, double dSafeZ,
|
||||
Frame3d& frPocket, bool& bOptimizedZigZag, ICRVCOMPOPOVECTOR& vpCrvs, double& dOffs) ;
|
||||
bool GeneratePocketingPv( int nPathId, const ISurfTriMesh* pStm_PartVolume) ;
|
||||
bool CheckSimpleOverlap( const ICurve* pCrv, const ICurveComposite* pCrvOri, int& nStat, double dToll) ;
|
||||
bool CalcDepth( const int nId, const Vector3d& vtExtr, double dThick, double& dDepth) ;
|
||||
bool ChainCurveArray( const SELVECTOR vInds, ICURVEPOVECTOR& vpCrvs, ICRVCOMPOPOVECTOR& vCrvCompo) ;
|
||||
bool CreateStmForIntersection( ISurfTriMesh* pStm, ICRVCOMPOPOVECTOR& vCrvCompo, const Vector3d& vtN) ;
|
||||
bool CalcOffsExtensionsForCurves( const ICurveComposite* pCrvCompo, const Vector3d& vtN, double& dExt) ;
|
||||
bool GetExtendedLoopToFitStmVolume( ICurveComposite* pCrvLoop, const double& dExt, const Vector3d& vtN) ;
|
||||
bool GetCurrentPart( const Point3d& ptInside, ISurfTriMesh* pStmPart) ;
|
||||
bool SetPocketingVolume( const Point3d& ptInside, ISurfTriMesh* pStm) ;
|
||||
bool AdjustPocketingSideForVolumePart( ISurfTriMesh* pStmVolPart, const Vector3d& vtTool) ;
|
||||
bool SewingMissingFacesOnPlanes( ISurfTriMesh* pStm, const Plane3d& plPlane) ;
|
||||
bool SliceVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Part, ISURFFRPOVECTOR& vSrfSliced,
|
||||
std::vector<ICRVCOMPOPOVECTOR>& vCrvOEWithFlags, BOOLVECTOR& vbChangedPrec,
|
||||
VCT3DVECTOR& vVtTrasl, int& nStep, const Vector3d vtTool,
|
||||
const double dElev, const double dDepth, const double dStep) ;
|
||||
bool CalcExtraSteps( const ISurfTriMesh* pStmVol, VCT3DVECTOR& vVtTrasl, int& nStep, const double dElev,
|
||||
const double dDepth, const double dStep, INTVECTOR& vIndExtraSteps,
|
||||
ISURFTMPOVECTOR& vStmES_Edges_OC) ;
|
||||
bool CutVolumeByPlane( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Part, const Vector3d& vtTrasl,
|
||||
const bool bIsExtraStep, ISurfFlatRegion* pSfrResult) ;
|
||||
bool ProjectVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Part, const Vector3d& vtTrasl,
|
||||
const Vector3d& vtTraslPrec, ISurfFlatRegion* pSfrOpenProjPrec, ISurfFlatRegion* pSfr) ;
|
||||
bool ChooseCloseOrOpenEdge( ISurfFlatRegion* pSfr, const ISurfTriMesh* pStm, const bool bOnIsClosed = false) ;
|
||||
bool GetCurvesForOptimizedPocketing( ISurfFlatRegion* pSfr, ICRVCOMPOPOVECTOR& vCrvOEWithFlags) ;
|
||||
bool ModifySurfByOpenEdges( ISurfFlatRegion* pSfr, const ISurfFlatRegion* pSfrLimit) ;
|
||||
bool AdjustContourWithOpenEdges( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vCrvIsl, const double dDiam,
|
||||
const double dOffR, const double dStep, const ISurfFlatRegion* pSfrLimit) ;
|
||||
bool AdjustOpenEdge( const ICurveComposite* pCrvCompo, const ICRVCOMPOPOVECTOR& vCrvIsland,
|
||||
const double dParS, const double dParE, const double dRad, const double dDiamJ,
|
||||
const ISurfFlatRegion* pSfrLimit, ICurveComposite* pCrvBorder) ;
|
||||
bool GetProjectionOfStmToNotPocket( const ISurfTriMesh* pStmPart, const ISurfTriMesh* pStmVol,
|
||||
const Vector3d& vtTrasl, ISurfFlatRegion* pSfrProj) ;
|
||||
bool CreateSurfFrIncidence( const ICurveComposite* pCrv, const double dRad, ISurfFlatRegion* pSfrInc) ;
|
||||
bool GetNewSfrByAnotherPocketing( ISurfFlatRegion* pSfrPock, const ISurfFlatRegion* pSfrNoExtendedByOpenEdges,
|
||||
const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Part,
|
||||
const ISurfFlatRegion* pSfrLimit) ;
|
||||
bool CalcAdaptedElevation( const Point3d& pt1, const Point3d& pt2) ;
|
||||
bool GetHomogeneousParts( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCrvs) ;
|
||||
bool ModifyCurveToSmoothed( ICurveComposite* pCrv, double dRightLen, double dLeftLen, bool bAsParam) ;
|
||||
bool OrderCurvesByLastPntOfPath( ICRVCOMPOPOVECTOR& vCrv, Point3d ptEnd, PNTVECTOR& vPtStart,
|
||||
VCT3DVECTOR& vVtOut, BOOLVECTOR& vbMidOut) ;
|
||||
bool SetBetterPtStartForSubChunks( ICurveComposite* pCrv0, const ISurfFlatRegion* pSrfToWork, Point3d& ptStart,
|
||||
Vector3d& vtMidOut, bool& bMidOut) ;
|
||||
bool GetOptCrvIndex( const std::vector<ICRVCOMPOPOVECTOR>& vCrvOEWithFlags, int nStep, ISurfFlatRegion* pSrfChunkFinal,
|
||||
int& nIndex) ;
|
||||
bool GetTrapezoidFromShape( const ICurveComposite* pCrvCompo, ICurveComposite* pCrvTrap, Frame3d& frTrap,
|
||||
double& dPocketSize, int& nBase, int& nSecondBase) ;
|
||||
bool CheckTrapezoidClosedEdgePosition( const ICurveComposite* pCrvCompo, const int nCrvInd, const double dDimBoxY,
|
||||
INTVECTOR& vIndClosedSides, bool& bOk,
|
||||
ICurveComposite* pCrvTrap) ;
|
||||
bool CheckSecondBaseTrapezoid( const ICurveComposite* pCrvCompo, const int nCrvInd, int& nSecondBase) ;
|
||||
bool PreparareTrapezoidTwoBases( const ICurveComposite* pCrvCompo, BBox3d BBox, const int nBase, int& nSecondBase,
|
||||
bool& bOk, ICurveComposite* pCrvTrap) ;
|
||||
bool GetSfrByStm( const ISurfTriMesh* pStm, ISurfFlatRegion* pSfr, const Plane3d plPock, const Vector3d& vtExtr,
|
||||
const double dThick, double dToll = 5 * EPS_SMALL) ;
|
||||
bool ProjectStmOnPlane( const ISurfTriMesh* pStmAbove, const Plane3d plPock, ISurfFlatRegion* pSfrProj) ;
|
||||
bool GetCoeffLinArc( const ICurveArc* pArc, double dDiam, double& dSubArc) ;
|
||||
bool GetParamOnOpenSide( const ICurveComposite* pCompo,const ICRVCOMPOPOVECTOR& vCrvIsl, Point3d& ptMid, Vector3d& vtMidOut) ;
|
||||
bool AdjustContourStart( ICurveComposite* pCompo, const ICRVCOMPOPOVECTOR& vCrvIsl, bool bOrder = false) ;
|
||||
bool GetParamForPtStartOnEdge( const ICurve* pCrv, const ICurveComposite* pCompo, const ICRVCOMPOPOVECTOR& vCrvIsl,
|
||||
double& dPar) ;
|
||||
bool CheckForRemovingIsland( const ICurveComposite* pCrvIslandBorder, double dOffs, bool bRemove) ;
|
||||
bool AddZigZag( ISURFFRPOVECTOR& vSfr, const std::vector<ICRVCOMPOPOVECTOR>& vCrvOrig, BOOLVECTOR& vbChangedPrec,
|
||||
VCT3DVECTOR& vVtTrasl, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dMaxElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool CalcZigZag( const ISurfFlatRegion* pSrfZigZag, ICRVCOMPOPOVECTOR& vpCrvs) ;
|
||||
bool CalcZigZagLink( ICurveComposite* pCrv1, ICurveComposite* pCrv2, ICurveComposite* pCrvLink) ;
|
||||
bool OptimizedZigZag( ISurfFlatRegion* pSrf, const Vector3d & vtTool, double dDepth, double dSafeZ,
|
||||
Frame3d& frPocket, ICurveComposite* pCrvOrig, bool& bOptimizedZigZag,
|
||||
ICRVCOMPOPOVECTOR& vpCrvs, ICRVCOMPOPOVECTOR& vCrvIslMergeBorders, double& dOffs,
|
||||
int& nClosedSides, bool& bTwoOpposite) ;
|
||||
bool ZigZagOptimizedNoClosedEdges( ICurveComposite* pCrvPocket, bool& bOptimizedZigZag, Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag, Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag,
|
||||
bool& bOpposite, Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag,
|
||||
Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds,
|
||||
bool& bOptimizedZigZag, bool& bOpposite, Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag,
|
||||
bool& bOpposite, Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedComputeOffset( ICurveComposite* pCrvPocket, const Vector3d& vtMainDir, int nOffsettedEdgesOnY,
|
||||
const INTVECTOR& vnClosedIds, double& dOffs) ;
|
||||
bool& bOpposite, Vector3d& vtDir, double& dOffs) ;
|
||||
bool ZigZagOptimizedComputeOffset( ICurveComposite* pCrvPocket, const Vector3d& vtMainDir, int nOffsettedEdgesOnY,
|
||||
const INTVECTOR& vnClosedIds, double& dOffs) ;
|
||||
bool CutCurveWithLine( ICurveComposite* pCrvA, const ICurveLine* pCrvB) ;
|
||||
bool AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs, bool bMidOpen,
|
||||
const Point3d& ptMidOpen, const Vector3d& vtMidOut, int nPathId) ;
|
||||
bool AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dOkStep, bool bSplitArcs, int nPathId) ;
|
||||
bool CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs,
|
||||
ICurveComposite* pMCrv, ICurveComposite* pRCrv, int nPathId, bool& bOptimizedTrap) ;
|
||||
bool CalcBoundedLink( const Point3d& ptStart, const Point3d& ptEnd, const ICurve* pCrvBound,
|
||||
bool AddOneWay( ISURFFRPOVECTOR& vSfr, const std::vector<ICRVCOMPOPOVECTOR>& vCrvOrig, BOOLVECTOR& vbChangedPrec,
|
||||
VCT3DVECTOR& vVtTrasl, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dMaxElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool AddSpiralIn( ISURFFRPOVECTOR& vSfr, const std::vector<ICRVCOMPOPOVECTOR>& vCrvOrig, BOOLVECTOR& vbChangedPrec,
|
||||
VCT3DVECTOR& vVtTrasl, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dMaxElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vector<ICRVCOMPOPOVECTOR>& vCrvOrig, BOOLVECTOR& vbChangedPrec,
|
||||
VCT3DVECTOR& vVtTrasl, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, double dMaxElev, double dOkStep, bool bSplitArcs) ;
|
||||
bool CalcSpiral( const ISurfFlatRegion* pSrfPock, int& nReg, Point3d& ptStart, Vector3d& vtMidOut , bool& bMidOut,
|
||||
bool bSplitArcs,ICurveComposite* pMCrv, ICurveComposite* pRCrv, ICurveComposite* pCrvOEWithFlags,
|
||||
bool vbChangedPrec, bool& bOptimizedTrap) ;
|
||||
bool CheckIfOffsetIsNecessary( const ICurveComposite* pCrvOffs, const double dOffs, const int nIter,
|
||||
const int nOffsCount, const Vector3d& vtN, bool& bInsert) ;
|
||||
bool GetUnclearedRegion( ICRVCOMPOPOVECTOR& vFirstOffs, ICRVCOMPOPOVECTOR& vCrvs, ICURVEPOVECTOR& vLinks,
|
||||
const ICurveComposite* pCrv_orig, ISurfFlatRegion* pSrfToCut) ;
|
||||
bool GetDynamicClearedRegion( ISurfFlatRegion* pSrfPrec, const ICurveComposite* pCrv) ;
|
||||
bool RemoveFirstLoopFromSfr( ISurfFlatRegion* pSrfOrig ) ;
|
||||
bool RemoveExtraParts( ISurfFlatRegion* pSrfToCut, ICRVCOMPOPOVECTOR& vOffs, ICRVCOMPOPOVECTOR& vOffsClosedCurves,
|
||||
ICRVCOMPOPOVECTOR& vOffsFirstCurve, ICURVEPOVECTOR& vLinks) ;
|
||||
bool RemoveExtraPartByMedialAxis( const ISurfFlatRegion* pChunkToCut, ICRVCOMPOPOVECTOR& vOffsFirstCurve,
|
||||
int& nOptFlag, Point3d& ptCentroid, ICurveComposite* pCrvPath) ;
|
||||
bool CutOffsetToClosestPoint( ICRVCOMPOPOVECTOR& vCurves, const Point3d& ptFocus, ICurveComposite* pCrv1,
|
||||
ICurveComposite* pCrv2, int& nIndex) ;
|
||||
bool CutLinkToClosestPoint( ICURVEPOVECTOR& vCurves, ICRVCOMPOPOVECTOR& vOffs, const Point3d& ptFocus,
|
||||
ICurveComposite* pCrv1, ICurveComposite* pCrv2, bool& bFound, int& nIndex) ;
|
||||
bool GetNewCurvetWithCentroid( const ICurveComposite* pCrvH1, const ICurveComposite* pCrvH2, Point3d& ptC, bool bCir,
|
||||
ICRVCOMPOPOVECTOR& VFirstOff, ICurveComposite* pCrvNewCurve) ;
|
||||
bool GetNewCurvetWithPath( const ICurveComposite* pCrvH1, const ICurveComposite* pCrvH2, ICurveComposite* pCrvPath,
|
||||
ICRVCOMPOPOVECTOR& VFirstOff, ICRVCOMPOPOVECTOR& VoffsCl, ICurveComposite* pCrvNewCurve) ;
|
||||
bool ManageSmoothAndAutoInters( ICurveComposite* pCrv, ICurveComposite* pCrvPath, ICurveComposite* pPath1,
|
||||
ICurveComposite* pPath2, ICRVCOMPOPOVECTOR& vOffsCL) ;
|
||||
bool GetCurveWeightInfo( const ICurveComposite* pCrvCompo, double dMaxLen, double& dToTRot, int& nSmallArcs, int& nSmallLines) ;
|
||||
bool ChoosePath( const ICurveComposite* pCrv1, const ICurveComposite* pCrv2, int nP, double dPerP, double dMaxLen, int& nC) ;
|
||||
bool CalcBoundedLink( const Point3d& ptStart, const Point3d& ptEnd, ICRVCOMPOPOVECTOR& vOffIslands,
|
||||
ICurveComposite* pCrvLink) ;
|
||||
bool CalcBoundedSmootedLink( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd, double dParMeet,
|
||||
ICRVCOMPOPOVECTOR& vOffIslands, ICurveComposite* pCrvLink) ;
|
||||
bool ModifyBiArc( ICurve* pCrvBiArc, double dCutToll, ICurveComposite* pNewCrv) ;
|
||||
bool CutCurveByOffsets( ICurveComposite* pCurve, ICRVCOMPOPOVECTOR& vOffs) ;
|
||||
bool CutCurveToConnect( ICurveComposite* pCrvS, ICurveComposite* pCrvE, ICRVCOMPOPOVECTOR& vOffs, ICRVCOMPOPOVECTOR& vOffIslands,
|
||||
ICurveComposite* pCrvLink, double dLenPercS = 0.01, double dLenPercE = 0.01, int nMaxIter = 2) ;
|
||||
bool CalcBoundedLinkWithBiArcs( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd,
|
||||
const ICurve* pCrvBound, ICurveComposite* pCrvLink) ;
|
||||
bool CalcCircleSpiral( const Point3d& ptCen, const Vector3d& vtN, double dOutRad, double dIntRad,
|
||||
bool bSplitArcs, ICurveComposite* pMCrv, ICurveComposite* pRCrv) ;
|
||||
bool CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtDir, double dPocketSize,
|
||||
ICurveComposite* pMCrv, ICurveComposite* pRCrv, bool& bOptimizedTrap) ;
|
||||
bool CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double dPocketSize, int nBase,
|
||||
int nSecondBase, ICurveComposite* pMCrv, ICurveComposite* pRCrv, bool& bOptimizedTrap) ;
|
||||
bool CalcTrapezoidSpiralLocalFrame( ICurveComposite * pCrvPocket, const Vector3d& vtDir, Frame3d& frLoc) ;
|
||||
bool CalcTrapezoidSpiralXCoord( const ICurveComposite * pCrvPocket, bool bStart, double dYCoord, double& dXCoord, double dPocketSize) ;
|
||||
bool AdjustTrapezoidSpiralForAngles( ICurveComposite * pMCrv, const ICurveComposite * pCrvPocket, bool bStart) ;
|
||||
bool SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* pCrvPocket) ;
|
||||
bool CalcTrapezoidSpiralXCoord( const ICurveComposite * pCrvPocket, int nBase,int nSecondBase,
|
||||
bool bStart, double dYCoord, double& dXCoord, double dPocketSize) ;
|
||||
bool AdjustTrapezoidSpiralForAngles( ICurveComposite * pMCrv, const ICurveComposite * pCrvPocket,
|
||||
bool bStart) ;
|
||||
bool SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const bool bEven, const ICurveComposite* pCrvPocket) ;
|
||||
bool AdjustTrapezoidSpiralForLeadInLeadOut( ICurveComposite * pCompo, ICurveComposite * pRCrv, const Vector3d& vtTool,
|
||||
double dDepth, int& nOutsideRaw) ;
|
||||
bool ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite * pCompo, const Vector3d& vtMainDir, bool bLeadIn, const Vector3d& vtTool, double dDepth, bool& bIsOutsideRaw) ;
|
||||
bool ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite * pCompo, const Vector3d& vtMainDir, bool bLeadIn, const Vector3d& vtTool, double dDepth,
|
||||
bool& bIsOutsideRaw) ;
|
||||
bool GetSignedDistFromRealDirection( const Point3d ptP, const Vector3d vtDir, double& dDist, Vector3d& vtNorm) ;
|
||||
double GetMinFeed( void ) const { return GetFeed() * GetSideStep() / m_TParams.m_dDiam ; }
|
||||
double GetMaxFeed( void ) const { return GetFeed() ; }
|
||||
bool GetFeedForParam( double& dPar, double& dFeed) ;
|
||||
bool AssignDefaultFeed( ICurveComposite* pCrv) ;
|
||||
bool DrawColoredCrvForFeedTest( ICurve* pCurve, double dFeed) ;
|
||||
bool AssignFeedForOpenEdge( ICurveComposite* pCrv, const ICurveComposite* pCrvOF_ori) ;
|
||||
bool AssignFeedForLineInOut( ICurveComposite* pCrv, const bool bIsIn) ;
|
||||
bool AssignFeedOnCorners( ICurveComposite* pCrv, const ICurveComposite* pCrv_orig, const double dLenToll) ;
|
||||
bool AssignFeedForEdgeCleaning( ICurveComposite *pCrv, const ICRVCOMPOPOVECTOR& vCrvOF_orig, int nInd = -1) ;
|
||||
bool AssignFeedZigZagOneWay( ICurveComposite* pCompoLine, const bool bIsLink, const ICURVEPOVECTOR& vLAbove,
|
||||
const ICURVEPOVECTOR& vLUnder, const ICRVCOMPOPOVECTOR& vAddedLinks) ;
|
||||
bool AssignFeedSpiral( ICurveComposite* pCrv, const ISurfFlatRegion* pSrfRemoved_offs, const bool bIsLink,
|
||||
const ICRVCOMPOPOVECTOR& vLinks_done, const ICurveComposite* pCrv_orig, double dToll) ;
|
||||
bool AssignFeedSpiralOpt( const int nOptType, ICurveComposite* pCrv) ;
|
||||
bool AssignFeedCrvOnUnclearedRegions( ICurveComposite* pCrv) ;
|
||||
bool AssignFeedForReturnPath( ICurveComposite* pCrv) ;
|
||||
bool VerifyLeadInHelix( ISurfFlatRegion* pSrfChunk, const Point3d& ptCen, double dRad) const ;
|
||||
bool VerifyLeadInZigZag( ISurfFlatRegion* pSrfChunk, const Point3d& ptPa, const Point3d& ptPb) const ;
|
||||
bool ComputePolishingPath( ICurveComposite* pMCrv, ICurveComposite* pRCrv, bool bSplitArcs) ;
|
||||
bool AddEpicycles( ICurveComposite * pCompo, ICurveComposite * pCrv, ICurveComposite * pCrvBound = nullptr) ;
|
||||
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bSplitArcs, bool bOutStart) ;
|
||||
double dElev, double dAppr, bool bOutStart) ;
|
||||
bool AddLinkApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bSplitArcs, bool bOutStart = false) ;
|
||||
double dElev, double dAppr, bool bOutStart = false) ;
|
||||
bool AddLinkRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bSplitArcs) ;
|
||||
double dElev, double dAppr) ;
|
||||
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
|
||||
double dElev, double dAppr, bool bSplitArcs) ;
|
||||
double dElev, double dAppr) ;
|
||||
bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
|
||||
const ICurveComposite* pRCrv, Point3d& ptP1) const ;
|
||||
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
|
||||
const ICurveComposite* pCompo, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs,
|
||||
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
|
||||
ISurfFlatRegion* pSrfChunk, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs,
|
||||
bool bNoneForced = false, bool bSkipControl = false) ;
|
||||
bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtN,
|
||||
const ICurveComposite* pRCrv, bool bSplitArcs, bool bNoneForced,
|
||||
Point3d& ptP1, double& dElev) ;
|
||||
const ICurveComposite* pRCrv, bool bSplitArcs, bool bNoneForced, Point3d& ptP1,
|
||||
double& dElev, bool bRecalcElev = true) ;
|
||||
bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtN,
|
||||
const ICurveComposite* pRCrv, bool bSplitArcs, bool bNoneForced,
|
||||
Point3d& ptP1, double& dElev, bool& bOppositeHome) ;
|
||||
Point3d& ptP1, double& dElev, bool& bOppositeHome, bool bRecalcElev = true) ;
|
||||
double GetRadiusForStartEndElevation( void) const ;
|
||||
bool GetForcedClosed( void) ;
|
||||
bool GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMid, Vector3d& vtMidOut) ;
|
||||
bool AdjustContourWithOpenEdges( ICurveComposite* pCompo) ;
|
||||
bool AdjustContourStart( ICurveComposite* pCompo) ;
|
||||
bool VerifyLeadInHelix( const ICurveComposite* pCompo, const Point3d& ptCen, double dRad) const ;
|
||||
bool VerifyLeadInZigZag( const ICurveComposite* pCompo, const Point3d& ptPa, const Point3d& ptPb) const ;
|
||||
bool CalcDistanceFromRawSurface( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist, Vector3d& vtNorm) ;
|
||||
// ===================================================================
|
||||
|
||||
private :
|
||||
double GetSpeed( void) const
|
||||
@@ -177,21 +294,31 @@ class Pocketing : public Machining
|
||||
return m_Params.m_nLeadOutType ; }
|
||||
|
||||
private :
|
||||
SELVECTOR m_vId ; // identificativi entità geometriche da lavorare
|
||||
PocketingData m_Params ; // parametri lavorazione
|
||||
ToolData m_TParams ; // parametri utensile
|
||||
double m_dTHoldBase ; // posizione base del porta-utensile
|
||||
double m_dTHoldLen ; // lunghezza del porta-utensile
|
||||
double m_dTHoldDiam ; // diametro del porta-utensile
|
||||
double m_dMaxHelixRad ; // raggio massimo attacco ad elica nel caso di cerchi
|
||||
int m_nStatus ; // stato di aggiornamento della lavorazione
|
||||
int m_nPockets ; // numero di percorsi di svuotatura generati
|
||||
bool m_bTiltingTab ; // flag utilizzo tavola basculante
|
||||
Vector3d m_vtTiltingAx ; // versore direzione eventuale asse basculante
|
||||
bool m_bAboveHead ; // flag utilizzo testa da sopra
|
||||
bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto
|
||||
Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto
|
||||
AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto
|
||||
bool m_bOpenOutRaw ; // flag forzatura lati aperti sempre fuori dal grezzo
|
||||
double m_dOpenMinSafe ; // minima distanza di sicurezza di attacco su lato aperto
|
||||
SELVECTOR m_vId ; // identificativi entit� geometriche da lavorare
|
||||
PocketingData m_Params ; // parametri lavorazione
|
||||
ToolData m_TParams ; // parametri utensile
|
||||
double m_dTHoldBase ; // posizione base del porta-utensile
|
||||
double m_dTHoldLen ; // lunghezza del porta-utensile
|
||||
double m_dTHoldDiam ; // diametro del porta-utensile
|
||||
double m_dMaxHelixRad ; // raggio massimo attacco ad elica nel caso di cerchi
|
||||
int m_nStatus ; // stato di aggiornamento della lavorazione
|
||||
int m_nPockets ; // numero di percorsi di svuotatura generati
|
||||
bool m_bTiltingTab ; // flag utilizzo tavola basculante
|
||||
Vector3d m_vtTiltingAx ; // versore direzione eventuale asse basculante
|
||||
bool m_bAboveHead ; // flag utilizzo testa da sopra
|
||||
bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto
|
||||
Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto
|
||||
AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto
|
||||
bool m_bOpenOutRaw ; // flag forzatura lati aperti sempre fuori dal grezzo
|
||||
double m_dOpenMinSafe ; // minima distanza di sicurezza di attacco su lato aperto
|
||||
bool m_bOptOffset = true ; // flag per ottimizzazione numero di Offset necessari
|
||||
bool m_bOptOffsetCM = false ; // flag per ottimizzazione numero di Offset necessari con centroidi e medial Axis
|
||||
bool m_bAssignFeed = false ; // flag per controllo della Feed
|
||||
double m_dDiam_Prec = 0.0 ; // diametro utensile per precedente svuotatura
|
||||
double m_dOffsetR_Prec = 0.0 ; // offset radiale della svuotatura precedente
|
||||
double m_dSideStep_Prec = 0.0 ; // side Step della svuotatura precedente
|
||||
double m_dLen_Prec = 0.0 ; // Lunghezza del tool precedente
|
||||
bool m_bOrderStepZ = true ; // parametro per ordinare gli step Extra per Z decrescente o meno
|
||||
bool m_bPocketPlane = false ; // flag per svuotare solo la rimanenza sullo Step Extra
|
||||
|
||||
} ;
|
||||
+12
-16
@@ -521,8 +521,8 @@ bool
|
||||
Processor::UpdateAxes( void)
|
||||
{
|
||||
// Carico i nomi degli assi macchina attivi
|
||||
return m_pMachine->GetAllCurrAxesNames( m_AxesName) &&
|
||||
m_pMachine->GetAllCurrAxesTokens( m_AxesToken) ;
|
||||
return m_pMachine->GetAllCurrAxesName( m_AxesName) &&
|
||||
m_pMachine->GetAllCurrAxesToken( m_AxesToken) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -843,16 +843,15 @@ Processor::OnToolSelect( const string& sTool, const string& sHead, int nExit, co
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, nExit) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos) ;
|
||||
// assegno il token e il nome degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( m_AxesName.size()) ;
|
||||
for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
|
||||
if ( i <= nNumAxes) {
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken( i, bIsRobot), m_AxesToken[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisName( i, bIsRobot), m_AxesName[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken(i), m_AxesToken[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisName(i), m_AxesName[i-1]) ;
|
||||
}
|
||||
else {
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken( i, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisName( i, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken(i)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisName(i)) ;
|
||||
}
|
||||
}
|
||||
// chiamo la funzione di selezione utensile
|
||||
@@ -984,13 +983,12 @@ Processor::OnRapid( int nEntId, int nEntInd, int nMove, const DBLVECTOR& AxesEnd
|
||||
// assegno il tipo di movimento
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ;
|
||||
// assegno il valore degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( AxesEnd.size()) ;
|
||||
for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
|
||||
if ( i <= nNumAxes)
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue(i), AxesEnd[i-1]) ;
|
||||
else
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue(i)) ;
|
||||
}
|
||||
// assegno la mascheratura degli assi
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MASK, nAxesMask) ;
|
||||
@@ -1025,13 +1023,12 @@ Processor::OnLinear( int nEntId, int nEntInd, int nMove, const DBLVECTOR& AxesEn
|
||||
// assegno il tipo di movimento
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ;
|
||||
// assegno il valore degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( AxesEnd.size()) ;
|
||||
for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
|
||||
if ( i <= nNumAxes)
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue(i), AxesEnd[i-1]) ;
|
||||
else
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue(i)) ;
|
||||
}
|
||||
// assegno il valore del versore utensile
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIR, vtTool) ;
|
||||
@@ -1065,13 +1062,12 @@ Processor::OnArc( int nEntId, int nEntInd, int nMove, const DBLVECTOR& AxesEnd,
|
||||
// assegno il tipo di movimento
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ;
|
||||
// assegno il valore degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( AxesEnd.size()) ;
|
||||
for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
|
||||
if ( i <= nNumAxes)
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue(i), AxesEnd[i-1]) ;
|
||||
else
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue(i)) ;
|
||||
}
|
||||
// assegno le coordinate del centro
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_C1, ptCen.x) ;
|
||||
|
||||
+47
-86
@@ -4,7 +4,7 @@
|
||||
// File : Sawing.cpp Data : 24.10.15 Versione : 1.6j3
|
||||
// Contenuto : Implementazione gestione tagli con lama.
|
||||
//
|
||||
// Note : Questa lavorazione è sempre espressa nel riferimento globale.
|
||||
// Note : Questa lavorazione è sempre espressa nel riferimento globale.
|
||||
//
|
||||
// Modifiche : 07.06.15 DS Creazione modulo.
|
||||
//
|
||||
@@ -532,15 +532,15 @@ Sawing::SetParam( int nType, const string& sVal)
|
||||
bool
|
||||
Sawing::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
|
||||
// verifico che gli identificativi rappresentino delle entità ammissibili
|
||||
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 Sawing : Skipped entity " + ToString( Id) ;
|
||||
@@ -563,14 +563,14 @@ Sawing::Preview( bool bRecalc)
|
||||
// reset numero tagli nella lavorazione
|
||||
m_nCuts = 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)
|
||||
@@ -603,7 +603,7 @@ Sawing::Preview( bool bRecalc)
|
||||
|
||||
// recupero gruppo per anteprima di lavorazione (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)
|
||||
@@ -633,7 +633,7 @@ Sawing::Apply( bool bRecalc, bool bPostApply)
|
||||
int nCurrCuts = m_nCuts ;
|
||||
m_nCuts = 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 ;
|
||||
|
||||
@@ -662,7 +662,7 @@ Sawing::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)
|
||||
@@ -689,7 +689,7 @@ Sawing::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)
|
||||
@@ -732,7 +732,7 @@ Sawing::Apply( bool bRecalc, bool bPostApply)
|
||||
bool
|
||||
Sawing::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 ;
|
||||
|
||||
@@ -742,7 +742,7 @@ Sawing::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
|
||||
@@ -794,7 +794,7 @@ Sawing::Update( bool bPostApply)
|
||||
bool
|
||||
Sawing::AdjustFeeds( void)
|
||||
{
|
||||
// controlli su GeomDB e simili non ripetuti perchè già fatti
|
||||
// controlli su GeomDB e simili non ripetuti perchè già fatti
|
||||
|
||||
// recupero gruppo della geometria di lavorazione (Cutter Location)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_CL) ;
|
||||
@@ -804,11 +804,11 @@ Sawing::AdjustFeeds( void)
|
||||
// ciclo sui gruppi CL
|
||||
int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ;
|
||||
while ( nClPathId != GDB_ID_NULL) {
|
||||
// ciclo su tutte le entità del percorso CL
|
||||
// ciclo su tutte le entità del percorso CL
|
||||
for ( int nEntId = m_pGeomDB->GetFirstInGroup( nClPathId) ;
|
||||
nEntId != GDB_ID_NULL ;
|
||||
nEntId = m_pGeomDB->GetNext( nEntId)) {
|
||||
// recupero i dati Cam dell'entità
|
||||
// recupero i dati Cam dell'entità
|
||||
CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ;
|
||||
if ( pCamData == nullptr)
|
||||
continue ;
|
||||
@@ -1075,7 +1075,7 @@ Sawing::UpdateToolData( bool* pbChanged)
|
||||
bool
|
||||
Sawing::GetGeometry( SELVECTOR& vIds) const
|
||||
{
|
||||
// restituisco l'elenco delle entità
|
||||
// restituisco l'elenco delle entità
|
||||
vIds = m_vId ;
|
||||
return true ;
|
||||
}
|
||||
@@ -1098,7 +1098,7 @@ Sawing::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 ;
|
||||
@@ -1122,7 +1122,7 @@ Sawing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
}
|
||||
return ( pCurve != nullptr) ;
|
||||
}
|
||||
// se altrimenti ammesse superfici trimesh ed è tale
|
||||
// se altrimenti ammesse superfici trimesh ed è tale
|
||||
else if ( ( nType == GEO_NONE || nType == GEO_SURF) && pGObj->GetType() == SRF_TRIMESH) {
|
||||
nType = GEO_SURF ;
|
||||
const ISurfTriMesh* pSurf = ::GetSurfTriMesh( pGObj) ;
|
||||
@@ -1142,7 +1142,7 @@ Sawing::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 == GEO_SURF) && pGObj->GetType() == SRF_FLATRGN) {
|
||||
nType = GEO_SURF ;
|
||||
const ISurfFlatRegion* pReg = ::GetSurfFlatRegion( pGObj) ;
|
||||
@@ -1335,7 +1335,7 @@ Sawing::Chain( int nGrpDestId)
|
||||
for ( const auto& Id : m_vId) {
|
||||
// prendo curva
|
||||
vpCrvs.emplace_back( GetCurve( Id)) ;
|
||||
// ne verifico la validità
|
||||
// ne verifico la validità
|
||||
if ( IsNull( vpCrvs.back())) {
|
||||
string sInfo = "Warning in Sawing : Skipped entity " + ToString( Id) ;
|
||||
m_pMchMgr->SetWarning( 2251, sInfo) ;
|
||||
@@ -1477,7 +1477,7 @@ Sawing::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)
|
||||
@@ -1542,7 +1542,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
// elaboro la curva composita e la esplodo nelle curve componenti
|
||||
if ( m_Params.m_nCurveUse == SAW_CRV_APPROX ||
|
||||
m_Params.m_nCurveUse == SAW_CRV_CONVEX) {
|
||||
// calcolo l'approssimazione lineare con eventuale convessità
|
||||
// calcolo l'approssimazione lineare con eventuale convessità
|
||||
PolyLine PL ;
|
||||
int nType = ICurve::APL_STD ;
|
||||
if ( m_Params.m_nWorkSide == SAW_WS_LEFT)
|
||||
@@ -1631,7 +1631,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
// flag di curva chiusa
|
||||
bool bClosed = pCompo->IsClosed() ;
|
||||
|
||||
// calcolo gli eventuali punti di perdita di tangenza e di cambio di concavità
|
||||
// calcolo gli eventuali punti di perdita di tangenza e di cambio di concavità
|
||||
DBLVECTOR vU ;
|
||||
const double ANG_PERD_TG = 1.0 ;
|
||||
const ICurveArc* pArc = ( bClosed ? GetCurveArc( pCompo->GetLastCurve()) : nullptr) ;
|
||||
@@ -1647,7 +1647,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
nCurrConv = 0 ;
|
||||
continue ;
|
||||
}
|
||||
// verifico cambio di concavità e/o lavorazione interna
|
||||
// verifico cambio di concavità e/o lavorazione interna
|
||||
const ICurve* pCrv = pCompo->GetCurve( i) ;
|
||||
if ( pCrv->GetType() == CRV_ARC) {
|
||||
if ( GetCurveArc( pCrv)->GetAngCenter() > 0) {
|
||||
@@ -1729,7 +1729,7 @@ Sawing::ProcessEntity( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* p
|
||||
// altrimenti
|
||||
else {
|
||||
if ( m_Params.m_nCurveUse == SAW_CRV_KEEP) {
|
||||
// determino la convessità
|
||||
// determino la convessità
|
||||
int nConv = 0 ;
|
||||
for ( int i = 0 ; i < pCompo->GetCurveCount() ; ++ i) {
|
||||
const ICurveArc* pArc = GetCurveArc( pCompo->GetCurve( i)) ;
|
||||
@@ -1830,7 +1830,7 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
|
||||
( m_Params.m_nWorkSide == SAW_WS_RIGHT && dAngCN < - EPS_ANG_SMALL))
|
||||
bExtAngCN = false ;
|
||||
}
|
||||
// verifico eventuale attacco speciale a step (se parametri validi e su entità linea singola)
|
||||
// verifico eventuale attacco speciale a step (se parametri validi e su entità linea singola)
|
||||
double dLiStep = 0 ;
|
||||
double dLiElev = 0 ;
|
||||
if ( m_Params.m_dLiTang > 10 * EPS_SMALL && m_Params.m_dLiElev > 10 * EPS_SMALL &&
|
||||
@@ -1851,7 +1851,7 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
|
||||
return true ;
|
||||
}
|
||||
|
||||
// Eventuale variazioni di velocità all'inizio e alla fine del percorso
|
||||
// Eventuale variazioni di velocità all'inizio e alla fine del percorso
|
||||
FseVar FvVar ;
|
||||
if ( pCrvP == nullptr) {
|
||||
string sFsta = ExtractInfo( m_Params.m_sUserNotes, "Fsta=") ;
|
||||
@@ -1999,7 +1999,7 @@ Sawing::GenerateLinePv( const ICurveLine* pLine, const Vector3d& vtTool, const V
|
||||
ptREnd + vtDir * ( dDtEnd + 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
|
||||
@@ -2057,23 +2057,6 @@ Sawing::GenerateLinePv( const ICurveLine* pLine, const Vector3d& vtTool, const V
|
||||
}
|
||||
}
|
||||
|
||||
// creo regioni di lavorazione che interessano le superfici superiore e inferiore del grezzo considerando anche gli
|
||||
// allungamenti dei baffi
|
||||
int nSurfUpId = ExeCreateSurfFrRectangle3P( nPxId, ptIni - vtDir * ( dStartWhiskExt + 5 * EPS_SMALL),
|
||||
ptCross + vtDir * ( dEndWhiskExt + 5 * EPS_SMALL),
|
||||
ptEnd + vtDir * ( dEndWhiskExt + 5 * EPS_SMALL), RTY_LOC) ;
|
||||
m_pGeomDB->SetName( nSurfUpId, MCH_PV_UP_RAWCUT) ;
|
||||
m_pGeomDB->SetMaterial( nSurfUpId, INVISIBLE) ;
|
||||
// solo se la lavorazione interessa il fondo del grezzo creo la superficie down
|
||||
if ( dRbHeight < EPS_SMALL) {
|
||||
int nSurfDownId = m_pGeomDB->CopyGlob( nSurfUpId, GDB_ID_NULL, nPxId) ;
|
||||
double dMove = dElev + dRbHeight / cos( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
Vector3d vtMove = - dMove * vtCorr ; vtMove.z = 0 ;
|
||||
ExeMove( {nSurfDownId}, vtMove, RTY_LOC) ;
|
||||
m_pGeomDB->SetName( nSurfDownId, MCH_PV_DOWN_RAWCUT) ;
|
||||
m_pGeomDB->SetMaterial( nSurfDownId, INVISIBLE) ;
|
||||
}
|
||||
|
||||
// salvo in info gruppo : larghezza XY del taglio, distanza XY tra centro e bordo taglio, extra taglio e quota minima della lama
|
||||
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, vtToolH.LenXY()) ;
|
||||
if ( dLiElev > EPS_SMALL)
|
||||
@@ -2296,7 +2279,7 @@ Sawing::GenerateLineCl( const ICurveLine* pLine, const Vector3d& vtTool, const V
|
||||
Point3d ptP3 = pLine->GetEnd() + vtCorr * dDelta ;
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// se non è ultimo passo
|
||||
// se non è ultimo passo
|
||||
if ( i != 0) {
|
||||
// movimento di risalita sopra il punto finale
|
||||
SetFeed( GetEndFeed()) ;
|
||||
@@ -2492,7 +2475,7 @@ Sawing::GenerateExtCurvePv( const ICurveComposite* pCrv, double dOffs,
|
||||
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL)
|
||||
colCut = FUCHSIA ;
|
||||
|
||||
// dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata
|
||||
// dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata
|
||||
double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ;
|
||||
|
||||
// lunghezza taglio parziale
|
||||
@@ -2640,17 +2623,6 @@ Sawing::GenerateExtCurvePv( const ICurveComposite* pCrv, double dOffs,
|
||||
return false ;
|
||||
if ( ! ExeSurfFrAdd( nRId, nRsId) || ! ExeSurfFrAdd( nRId, nReId))
|
||||
return false ;
|
||||
|
||||
// creo regioni di lavorazione che interessano le superfici superiore e inferiore del grezzo
|
||||
int nSurfUpId = m_pGeomDB->CopyGlob( nRrId, GDB_ID_NULL, nPxId) ;
|
||||
m_pGeomDB->SetName( nSurfUpId, MCH_PV_UP_RAWCUT) ;
|
||||
m_pGeomDB->SetMaterial( nSurfUpId, INVISIBLE) ;
|
||||
// solo se lavorazione interessa il fondo del grezzo creo la superficie down
|
||||
if ( dRbHeight < EPS_SMALL) {
|
||||
int nSurfDownId = m_pGeomDB->CopyGlob( nSurfUpId, GDB_ID_NULL, nPxId) ;
|
||||
m_pGeomDB->SetName( nSurfDownId, MCH_PV_DOWN_RAWCUT) ;
|
||||
m_pGeomDB->SetMaterial( nSurfDownId, INVISIBLE) ;
|
||||
}
|
||||
}
|
||||
|
||||
// altrimenti errore
|
||||
@@ -2896,7 +2868,7 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
|
||||
CalculateToolAndCorrVersors( vtCurrDir, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtCurrTool, vtCurrCorr) ;
|
||||
SetToolDir( vtCurrTool) ;
|
||||
SetCorrAuxDir( vtCurrCorr) ;
|
||||
if ( AddCurveMove( pSmpCrv) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pSmpCrv, true) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// 4 -> retrazione
|
||||
@@ -2974,7 +2946,7 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
|
||||
pCopy->SimpleOffset( dOffs) ;
|
||||
}
|
||||
// emissione
|
||||
if ( AddCurveMove( pCopy) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCopy, true) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
@@ -3007,7 +2979,7 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
|
||||
// inversione
|
||||
pCopy->Invert() ;
|
||||
// emissione
|
||||
if ( AddCurveMove( pCopy) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCopy, true) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
@@ -3074,10 +3046,10 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
|
||||
pCopy->SimpleOffset( dOffs) ;
|
||||
}
|
||||
// emissione
|
||||
if ( AddCurveMove( pCopy) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCopy, true) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se non è ultimo passo
|
||||
// se non è ultimo passo
|
||||
if ( i != 0) {
|
||||
// ricavo punto di risalita e punto iniziale
|
||||
Point3d ptP4 ;
|
||||
@@ -3221,7 +3193,7 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
|
||||
m_pMchMgr->SetWarning( 2257, "Warning in Sawing : skipped Entity too small") ;
|
||||
return true ;
|
||||
}
|
||||
// ricalcolo i versori fresa alle estremità (potrebbero essere cambiate)
|
||||
// ricalcolo i versori fresa alle estremità (potrebbero essere cambiate)
|
||||
pArc->GetStartDir( vtStaDirC) ;
|
||||
pArc->GetMidDir( vtMidDirC) ;
|
||||
pArc->GetEndDir( vtEndDirC) ;
|
||||
@@ -3313,7 +3285,7 @@ Sawing::GenerateIntArcPv( const ICurveArc* pArc,
|
||||
m_pGeomDB->SetName( nId3, MCH_PV_POST_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nId3, BLUE) ;
|
||||
|
||||
// dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata
|
||||
// dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata
|
||||
double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ;
|
||||
|
||||
// regione ridotta di taglio per nesting (escluse parti iniziali e finali)
|
||||
@@ -3367,17 +3339,6 @@ Sawing::GenerateIntArcPv( const ICurveArc* pArc,
|
||||
if ( ! ExeSurfFrAdd( nRId, nRsId) || ! ExeSurfFrAdd( nRId, nReId))
|
||||
return false ;
|
||||
|
||||
// creo regioni di lavorazione che interessano le superfici superiore e inferiore del grezzo
|
||||
int nSurfUpId = m_pGeomDB->CopyGlob( nRrId, GDB_ID_NULL, nPxId) ;
|
||||
m_pGeomDB->SetName( nSurfUpId, MCH_PV_UP_RAWCUT) ;
|
||||
m_pGeomDB->SetMaterial( nSurfUpId, INVISIBLE) ;
|
||||
// solo se lavorazione interessa il fondo del grezzo creo la superficie down
|
||||
if ( dRbHeight < EPS_SMALL) {
|
||||
int nSurfDownId = m_pGeomDB->CopyGlob( nSurfUpId, GDB_ID_NULL, nPxId) ;
|
||||
m_pGeomDB->SetName( nSurfDownId, MCH_PV_DOWN_RAWCUT) ;
|
||||
m_pGeomDB->SetMaterial( nSurfDownId, INVISIBLE) ;
|
||||
}
|
||||
|
||||
// salvo in info gruppo : larghezza XY del taglio, distanza XY tra centro e bordo taglio, extra taglio e quota minima della lama
|
||||
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, dDeltaInt + dDeltaExt) ;
|
||||
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_DT, dDeltaT * dLenCoeff) ;
|
||||
@@ -3610,12 +3571,12 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc,
|
||||
else {
|
||||
Point3d ptMid ;
|
||||
pArc->GetMidPoint( ptMid) ;
|
||||
// prima metà arco
|
||||
// prima metà arco
|
||||
SetToolDir( vtMidTool) ;
|
||||
SetCorrAuxDir( vtMidCorr) ;
|
||||
if ( AddArcMove( ptMid, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// seconda metà arco
|
||||
// seconda metà arco
|
||||
SetToolDir( vtEndTool) ;
|
||||
SetCorrAuxDir( vtEndCorr) ;
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
|
||||
@@ -3696,12 +3657,12 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc,
|
||||
pArc->GetMidPoint( ptMid) ;
|
||||
ptMid += Z_AX * dDelta ;
|
||||
double dCurrAngCen = dAngCen / 2 * ((( i % 2) == 0) ? -1 : 1) ;
|
||||
// prima metà arco
|
||||
// prima metà arco
|
||||
SetToolDir( vtMidTool) ;
|
||||
SetCorrAuxDir( vtMidCorr) ;
|
||||
if ( AddArcMove( ptMid, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// seconda metà arco
|
||||
// seconda metà arco
|
||||
SetToolDir( ( ( i % 2) == 0) ? vtStaTool : vtEndTool) ;
|
||||
SetCorrAuxDir( ( ( i % 2) == 0) ? vtStaCorr : vtEndCorr) ;
|
||||
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
|
||||
@@ -3785,18 +3746,18 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc,
|
||||
Point3d ptMid ;
|
||||
pArc->GetMidPoint( ptMid) ;
|
||||
ptMid += Z_AX * dDelta ;
|
||||
// prima metà arco
|
||||
// prima metà arco
|
||||
SetToolDir( vtMidTool) ;
|
||||
SetCorrAuxDir( vtMidCorr) ;
|
||||
if ( AddArcMove( ptMid, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// seconda metà arco
|
||||
// seconda metà arco
|
||||
SetToolDir( vtEndTool) ;
|
||||
SetCorrAuxDir( vtEndCorr) ;
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se non è ultimo passo
|
||||
// se non è ultimo passo
|
||||
if ( i != 0) {
|
||||
// movimento di risalita sopra il punto finale
|
||||
SetFeed( GetEndFeed()) ;
|
||||
@@ -3918,7 +3879,7 @@ Sawing::CalculateToolAndCorrVersors( const Vector3d& vtTang, int nHeadSide, int
|
||||
bool
|
||||
Sawing::AdjustForSide( ICurve* pCurve)
|
||||
{
|
||||
// se lato lavoro e lato mandrino coincidono, non devo fare alcunché
|
||||
// se lato lavoro e lato mandrino coincidono, non devo fare alcunché
|
||||
if ( ( m_Params.m_nWorkSide == SAW_WS_LEFT && m_Params.m_nHeadSide == SAW_HS_LEFT) ||
|
||||
( m_Params.m_nWorkSide == SAW_WS_RIGHT && m_Params.m_nHeadSide == SAW_HS_RIGHT))
|
||||
return true ;
|
||||
@@ -4087,7 +4048,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
|
||||
dDeltaLoExt = dDeltaF ;
|
||||
}
|
||||
}
|
||||
// controllo se lunghezza entità accettabile
|
||||
// controllo se lunghezza entità accettabile
|
||||
const double MIN_LEN = 1 ;
|
||||
double dLenXY = DistXY( pLine->GetStart(), pLine->GetEnd()) ;
|
||||
if ( dDeltaI + dLenXY + dDeltaF < MIN_LEN) {
|
||||
@@ -4158,7 +4119,7 @@ Sawing::AdjustCurveForEdges( ICurve* pCrv, double dElev, double dLenCoeff,
|
||||
dDeltaF = dDeltaT ;
|
||||
}
|
||||
dDeltaF *= dLenCoeff ;
|
||||
// controllo se lunghezza entità accettabile
|
||||
// controllo se lunghezza entità accettabile
|
||||
const double MIN_LEN = 1 ;
|
||||
double dLenXY ;
|
||||
pCrv->GetLength( dLenXY) ;
|
||||
|
||||
+37
-91
@@ -61,7 +61,6 @@ Simulator::Simulator( void)
|
||||
m_pGeomDB = nullptr ;
|
||||
m_pMachine = nullptr ;
|
||||
m_pPerfCnt = nullptr ;
|
||||
m_nStatus = SIS_CREATED ;
|
||||
m_dStep = MID_STEP ;
|
||||
m_nUiStatus = MCH_UISIM_NULL ;
|
||||
m_nOpId = GDB_ID_NULL ;
|
||||
@@ -93,8 +92,6 @@ Simulator::~Simulator( void)
|
||||
{
|
||||
// porto la macchina in posizione home
|
||||
GoHome() ;
|
||||
// gestione evento uscita dal simulatore
|
||||
OnExit() ;
|
||||
// rimuovo tavola variabili globali
|
||||
m_pMachine->LuaResetGlobVar( GLOB_VAR) ;
|
||||
// rimuovo performance counter
|
||||
@@ -116,7 +113,6 @@ Simulator::Init( MachMgr* pMchMgr)
|
||||
m_pGeomDB = m_pMchMgr->GetGeomDB() ;
|
||||
m_pMachine = m_pMchMgr->GetCurrMachine() ;
|
||||
m_pPerfCnt = new PerformanceCounter ;
|
||||
m_nStatus = SIS_INITIALIZED ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -133,8 +129,8 @@ Simulator::Start( bool bFirst)
|
||||
|
||||
bool bOk = true ;
|
||||
|
||||
// Se appena entrati in simulazione
|
||||
if ( m_nStatus == SIS_INITIALIZED) {
|
||||
// Se avvio vero
|
||||
if ( bFirst) {
|
||||
// Forzo aggiornamento attrezzaggio della macchinata
|
||||
if ( ! m_pMchMgr->UpdateCurrSetup())
|
||||
bOk = false ;
|
||||
@@ -171,42 +167,19 @@ Simulator::Start( bool bFirst)
|
||||
m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_VER, GetEMkVer()) ;
|
||||
m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MACHNAME, m_pMachine->GetMachineName()) ;
|
||||
|
||||
// Se appena entrati in simulazione
|
||||
if ( m_nStatus == SIS_INITIALIZED) {
|
||||
if ( ! OnInit())
|
||||
bOk = false ;
|
||||
m_nStatus = SIS_READYTOSTART ;
|
||||
}
|
||||
|
||||
// Richiamo funzione per evento avvio simulazione
|
||||
if ( ! OnProgramStart( bFirst))
|
||||
// Richiamo funzione su avvio simulazione
|
||||
if ( ! OnStart( bFirst))
|
||||
bOk = false ;
|
||||
|
||||
// Arrivo alla preparazione per la prima lavorazione
|
||||
int nStatus ;
|
||||
if ( ! FindAndManageOperationStart( true, bFirst, nStatus) && nStatus != MCH_SIM_STOP)
|
||||
bOk = false ;
|
||||
// se sono ancora su disposizione
|
||||
if ( m_pMchMgr->GetOperationType( m_nOpId) == OPER_DISP) {
|
||||
// ricerca e gestione inizio percorso di lavoro
|
||||
if ( ! FindAndManagePathStart( nStatus))
|
||||
return false ;
|
||||
// eventuali comandi ausiliari di inizio percorso
|
||||
while ( m_nAuxSInd < m_nAuxSTot) {
|
||||
if ( ! ManagePathStartAux( nStatus))
|
||||
return false ;
|
||||
}
|
||||
// aggiornamento assi per eventuali teste caricate
|
||||
UpdateAxes() ;
|
||||
}
|
||||
|
||||
// Reset timer
|
||||
if ( m_pPerfCnt != nullptr)
|
||||
m_pPerfCnt->Start() ;
|
||||
|
||||
// Imposto lo stato interno
|
||||
m_nStatus = ( bOk ? SIS_READYTORUN : SIS_READYTOSTART) ;
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
@@ -262,7 +235,7 @@ bool
|
||||
Simulator::Move( int& nStatus)
|
||||
{
|
||||
// Verifiche
|
||||
if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr || m_pMachine == nullptr || m_nStatus != SIS_READYTORUN) {
|
||||
if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr || m_pMachine == nullptr) {
|
||||
nStatus = MCH_SIM_ERR ;
|
||||
return false ;
|
||||
}
|
||||
@@ -282,15 +255,15 @@ Simulator::Move( int& nStatus)
|
||||
m_dCoeff = 0 ;
|
||||
}
|
||||
|
||||
// Se appena arrivato alla fine di un percorso di lavoro (verifico anche completamento dei comandi aux di start per path vuote)
|
||||
if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd == 0 && m_nCLPathInd > 0 && m_nAuxSInd >= m_nAuxSTot) {
|
||||
// Se appena arrivato alla fine di un percorso di lavoro
|
||||
if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd == 0 && m_nCLPathInd > 0) {
|
||||
// gestione fine percorso di lavoro
|
||||
if ( ! ManagePathEnd( nStatus))
|
||||
return false ;
|
||||
}
|
||||
|
||||
// Se alla fine del percorso dopo esecuzione azioni ausiliarie (verifico anche completamento dei comandi aux di start per path vuote)
|
||||
if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd >= m_nAuxETot && m_nAuxSInd >= m_nAuxSTot) {
|
||||
// Se alla fine del percorso dopo esecuzione azioni ausiliarie
|
||||
if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd >= m_nAuxETot) {
|
||||
// ricerca e gestione inizio percorso di lavoro
|
||||
if ( ! FindAndManagePathStart( nStatus))
|
||||
return false ;
|
||||
@@ -306,7 +279,7 @@ Simulator::Move( int& nStatus)
|
||||
return false ;
|
||||
// se non ce ne sono altre, sono alla fine
|
||||
if ( m_nOpId == GDB_ID_NULL) {
|
||||
OnProgramEnd() ;
|
||||
OnEnd() ;
|
||||
nStatus = MCH_SIM_END ;
|
||||
return false ;
|
||||
}
|
||||
@@ -579,10 +552,10 @@ Simulator::UpdateAxes( void)
|
||||
if ( pMachine == nullptr)
|
||||
return false ;
|
||||
// Carico i nomi e i token degli assi macchina attivi
|
||||
if ( ! pMachine->GetAllCurrAxesNames( m_AxesName) ||
|
||||
! pMachine->GetAllCurrAxesTokens( m_AxesToken))
|
||||
if ( ! pMachine->GetAllCurrAxesName( m_AxesName) ||
|
||||
! pMachine->GetAllCurrAxesToken( m_AxesToken))
|
||||
return false ;
|
||||
// Aggiorno flag di invertito, offset, tipo e posizione corrente degli assi macchina attivi
|
||||
// Aggiorno flag invertito, il tipo e la posizione corrente degli assi macchina attivi
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
|
||||
bool bInvert ;
|
||||
m_pMachine->GetAxisInvert( m_AxesName[i], bInvert) ;
|
||||
@@ -860,9 +833,8 @@ Simulator::FindAndManagePathStart( int& nStatus)
|
||||
}
|
||||
// se altrimenti trovato nuovo CL path vuoto
|
||||
else if ( m_nCLPathId != GDB_ID_NULL) {
|
||||
// recupero il numero di eventi ausiliari di inizio
|
||||
if ( ! m_pGeomDB->GetInfo( m_nCLPathId, KEY_AS_TOT, m_nAuxSTot))
|
||||
m_nAuxSTot = 0 ;
|
||||
// non ci possono essere eventi ausiliari di inizio
|
||||
m_nAuxSTot = 0 ;
|
||||
m_nAuxSInd = 0 ;
|
||||
// recupero il numero di eventi ausiliari di fine
|
||||
if ( ! m_pGeomDB->GetInfo( m_nCLPathId, KEY_AE_TOT, m_nAuxETot))
|
||||
@@ -1026,8 +998,8 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
|
||||
// Calcolo distanza di movimento
|
||||
double dSqDist = 0 ;
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
|
||||
// coefficiente moltiplicativo per differenziare assi lineari e rotanti
|
||||
double dSqCoeff = ( m_AxesLinear[i] ? 1 : SQ_COEFF_ROT_MOVE) ;
|
||||
// coefficiente moltiplicativo per differenziare assi lineari (primi 3) e rotanti (altri)
|
||||
double dSqCoeff = (( i < 3) ? 1 : SQ_COEFF_ROT_MOVE) ;
|
||||
dSqDist += dSqCoeff * ( AxesEnd[i] - m_AxesVal[i]) * ( AxesEnd[i] - m_AxesVal[i]) ;
|
||||
}
|
||||
// Calcolo distanza di movimento eventuali assi ausiliari
|
||||
@@ -1439,27 +1411,27 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType)
|
||||
if ( m_CollObj[j].nType == MCH_SIM_COB_BOX) {
|
||||
Vector3d vtDiag( m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3) ;
|
||||
if ( pVZM != nullptr)
|
||||
bOk = ! pVZM->CDeBox( frObj, vtDiag, m_dSafeDist) ;
|
||||
bOk = pVZM->AvoidBox( frObj, vtDiag, m_dSafeDist) ;
|
||||
else
|
||||
bOk = ! CDeBoxClosedSurfTm( frObj, vtDiag, *pSTM, m_dSafeDist) ;
|
||||
bOk = ! CDeBoxClosedSurfTm( frObj, vtDiag, m_dSafeDist, *pSTM) ;
|
||||
}
|
||||
else if ( m_CollObj[j].nType == MCH_SIM_COB_CYL) {
|
||||
if ( pVZM != nullptr)
|
||||
bOk = ! pVZM->CDeCylinder( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_dSafeDist) ;
|
||||
bOk = pVZM->AvoidCylinder( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_dSafeDist) ;
|
||||
else
|
||||
bOk = ! CDeCylClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, *pSTM, m_dSafeDist) ;
|
||||
bOk = ! CDeCylClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_dSafeDist, *pSTM) ;
|
||||
}
|
||||
else if ( m_CollObj[j].nType == MCH_SIM_COB_SPHE) {
|
||||
if ( pVZM != nullptr)
|
||||
bOk = ! pVZM->CDeSphere( frObj.Orig(), m_CollObj[j].dPar1, m_dSafeDist) ;
|
||||
bOk = pVZM->AvoidSphere( frObj.Orig(), m_CollObj[j].dPar1, m_dSafeDist) ;
|
||||
else
|
||||
bOk = ! CDeSpheClosedSurfTm( frObj.Orig(), m_CollObj[j].dPar1, *pSTM, m_dSafeDist) ;
|
||||
bOk = ! CDeSpheClosedSurfTm( frObj.Orig(), m_CollObj[j].dPar1, m_dSafeDist, *pSTM) ;
|
||||
}
|
||||
else if ( m_CollObj[j].nType == MCH_SIM_COB_CONE) {
|
||||
if ( pVZM != nullptr)
|
||||
bOk = ! pVZM->CDeConeFrustum( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, m_dSafeDist) ;
|
||||
bOk = pVZM->AvoidConeFrustum( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, m_dSafeDist) ;
|
||||
else
|
||||
bOk = ! CDeConeFrustumClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, *pSTM, m_dSafeDist) ;
|
||||
bOk = ! CDeConeFrustumClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, m_dSafeDist, *pSTM) ;
|
||||
}
|
||||
}
|
||||
// altrimenti poliedro
|
||||
@@ -1468,7 +1440,7 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType)
|
||||
const ISurfTriMesh* pStmLoc = GetSurfTriMesh( SurfLoc) ;
|
||||
if ( pStmLoc != nullptr) {
|
||||
if ( pVZM != nullptr)
|
||||
bOk = ! pVZM->CDeSurfTm( *pStmLoc, m_dSafeDist) ;
|
||||
bOk = pVZM->AvoidSurfTm( *pStmLoc, m_dSafeDist) ;
|
||||
else
|
||||
bOk = ! CDeClosedSurfTmClosedSurfTm( *pStmLoc, *pSTM, m_dSafeDist) ;
|
||||
}
|
||||
@@ -1488,29 +1460,7 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Simulator::OnInit( void)
|
||||
{
|
||||
// verifico esistenza funzione
|
||||
if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_INIT))
|
||||
return true ;
|
||||
// chiamo la funzione di ingresso nella simulazione
|
||||
return m_pMachine->LuaCallFunction( ON_SIMUL_INIT) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Simulator::OnExit( void)
|
||||
{
|
||||
// verifico esistenza funzione
|
||||
if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_EXIT))
|
||||
return true ;
|
||||
// chiamo la funzione di uscita dalla simulazione
|
||||
return m_pMachine->LuaCallFunction( ON_SIMUL_EXIT) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Simulator::OnProgramStart( bool bFirst)
|
||||
Simulator::OnStart( bool bFirst)
|
||||
{
|
||||
// assegno flag inizio simulazione
|
||||
bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_SIM1ST, bFirst) ;
|
||||
@@ -1524,7 +1474,7 @@ Simulator::OnProgramStart( bool bFirst)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Simulator::OnProgramEnd( void)
|
||||
Simulator::OnEnd( void)
|
||||
{
|
||||
// verifico esistenza funzione
|
||||
if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_END))
|
||||
@@ -1622,17 +1572,16 @@ Simulator::OnToolSelect( const string& sTool, const string& sHead, int nExit, co
|
||||
! m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos))
|
||||
return false ;
|
||||
// assegno il token e il nome degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( m_AxesName.size()) ;
|
||||
for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
|
||||
if ( i <= nNumAxes) {
|
||||
if ( ! m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken( i, bIsRobot), m_AxesToken[i-1]) ||
|
||||
! m_pMachine->LuaSetGlobVar( GetGlobVarAxisName( i, bIsRobot), m_AxesName[i-1]))
|
||||
if ( ! m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken(i), m_AxesToken[i-1]) ||
|
||||
! m_pMachine->LuaSetGlobVar( GetGlobVarAxisName(i), m_AxesName[i-1]))
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
if ( ! m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken( i, bIsRobot)) ||
|
||||
! m_pMachine->LuaResetGlobVar( GetGlobVarAxisName( i, bIsRobot)))
|
||||
if ( ! m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken(i)) ||
|
||||
! m_pMachine->LuaResetGlobVar( GetGlobVarAxisName(i)))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
@@ -1875,17 +1824,16 @@ Simulator::OnMoveStart( const CamData* pCamData, int& nErr)
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_INDEX, pCamData->GetIndex()) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_ERR, nErr) ;
|
||||
// valore degli assi all'inizio e alla fine del movimento
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( m_AxesName.size()) ;
|
||||
const DBLVECTOR& AxesEnd = pCamData->GetAxesVal() ;
|
||||
for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
|
||||
if ( i <= nNumAxes) {
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisPrev( i, GLOB_VAR, bIsRobot), m_AxesVal[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisPrev( i), m_AxesVal[i-1]) ;
|
||||
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i), AxesEnd[i-1]) ;
|
||||
}
|
||||
else {
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisPrev( i, GLOB_VAR, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisPrev( i)) ;
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i)) ;
|
||||
}
|
||||
}
|
||||
// versori utensile, correzione e ausiliario alla fine del movimento
|
||||
@@ -2139,8 +2087,6 @@ Simulator::SetToolForVmill( const string& sTool, const string& sHead, int nExit,
|
||||
ExeVolZmapSetSawTool( vVmill, sTool, dLen, dDiam, dThick, 0, dCornR, nFlag, bFirst) ;
|
||||
else if ( nType == TT_WATERJET)
|
||||
ExeVolZmapSetStdTool( vVmill, sTool, dLen + 50, dDiam, dCornR, dMaxMat, nFlag, bFirst) ;
|
||||
else if ( nType == TT_ADDITIVE)
|
||||
ExeVolZmapSetAdditiveTool( vVmill, sTool, dLen, dDiam, dCornR, nFlag, bFirst) ;
|
||||
else if ( abs( dSideAng) < EPS_ANG_SMALL || abs( dThick) < EPS_SMALL) {
|
||||
ExeVolZmapSetStdTool( vVmill, sTool, dLen, dDiam, dCornR, dMaxMat, nFlag, bFirst) ;
|
||||
}
|
||||
@@ -2277,7 +2223,7 @@ Simulator::MoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt)
|
||||
}
|
||||
}
|
||||
// Aggiorno visualizzazione
|
||||
if ( bViewAllFrames || ( i % 4) == 0 || i == nStep)
|
||||
if ( bViewAllFrames || ( i % 2) == 0 || i == nStep)
|
||||
ExeDraw() ;
|
||||
// Verifico collisioni
|
||||
int nCdInd, nObjInd ;
|
||||
|
||||
+2
-9
@@ -86,10 +86,8 @@ class Simulator
|
||||
{ return ( ! m_CollObj.empty() && ! m_CdId.empty()) ; }
|
||||
bool Stopped( void)
|
||||
{ return ( m_nUiStatus == MCH_UISIM_STOP) ; }
|
||||
bool OnInit( void) ;
|
||||
bool OnExit( void) ;
|
||||
bool OnProgramStart( bool bFirst) ;
|
||||
bool OnProgramEnd( void) ;
|
||||
bool OnStart( bool bFirst) ;
|
||||
bool OnEnd( void) ;
|
||||
bool OnDispositionStarting( int nOpId, int nOpInd, int nPhase,
|
||||
const std::string& sTable, const Point3d& ptOri1, bool bEmpty, bool bSomeByHand) ;
|
||||
bool OnDispositionStart( int nOpId, int nOpInd, int nPhase,
|
||||
@@ -137,17 +135,12 @@ class Simulator
|
||||
: sName( sN), sHead( sH), nExit( nE), dTdOffs( dT), dAdOffs( dA) {}
|
||||
} ;
|
||||
typedef std::vector<VmTool> VMTVECTOR ;
|
||||
enum { SIS_CREATED = 0,
|
||||
SIS_INITIALIZED = 1,
|
||||
SIS_READYTOSTART = 2,
|
||||
SIS_READYTORUN = 3} ;
|
||||
|
||||
private :
|
||||
MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni
|
||||
IGeomDB* m_pGeomDB ; // puntatore al DB geometrico
|
||||
Machine* m_pMachine ; // puntatore alla macchina
|
||||
PerformanceCounter* m_pPerfCnt ; // timer per calcolo FPS
|
||||
int m_nStatus ; // stato interno del simulatore (creato, inizializzato, pronto al movimento)
|
||||
double m_dStep ; // lunghezza di riferimento per la velocità di simulazione
|
||||
int m_nUiStatus ; // stato simulazione a livello utente
|
||||
int m_nOpId ; // identificativo della operazione (lavoraz.) corrente
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2024
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : Table.cpp Data : 19.03.24 Versione : 2.6c2
|
||||
// File : Table.cpp Data : 25.05.15 Versione : 1.6e7
|
||||
// Contenuto : Oggetto tavola per gruppo tavola di macchina.
|
||||
//
|
||||
//
|
||||
@@ -45,7 +45,6 @@ Table::Clone( void) const
|
||||
pTab->m_sName = m_sName ;
|
||||
pTab->m_nType = m_nType ;
|
||||
pTab->m_ptRef1 = m_ptRef1 ;
|
||||
pTab->m_vsColl = m_vsColl ;
|
||||
}
|
||||
catch( ...) {
|
||||
delete pTab ;
|
||||
@@ -64,10 +63,7 @@ Table::Dump( string& sOut, bool bMM, const char* szNewLine) const
|
||||
sOut += "Id=" + ToString( m_nOwnerId) + szNewLine ;
|
||||
sOut += "Name=" + m_sName + szNewLine ;
|
||||
sOut += "Type=" + ToString( m_nType) + szNewLine ;
|
||||
sOut += "Ref1=(" + ToString( GetInUiUnits( m_ptRef1, bMM), 4) + ")" + szNewLine ;
|
||||
sOut += "Area1=(" + ToString( GetInUiUnits( m_b3Area1.GetMin(), bMM), 4) + ";" +
|
||||
ToString( GetInUiUnits( m_b3Area1.GetMax(), bMM), 4) + szNewLine ;
|
||||
sOut += "Coll=" + ToString( m_vsColl) + szNewLine ;
|
||||
sOut += "Ref1=(" + ToString( GetInUiUnits(m_ptRef1, bMM), 4) + ")" + szNewLine ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -103,12 +99,11 @@ Table::Table( void)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Table::Set( const string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1, const STRVECTOR& vsColl)
|
||||
Table::Set( const string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1)
|
||||
{
|
||||
m_sName = sName ;
|
||||
m_nType = nType ;
|
||||
m_ptRef1 = ptRef1 ;
|
||||
m_b3Area1 = b3Area1 ;
|
||||
m_vsColl = vsColl ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class Table : public IUserObj
|
||||
|
||||
public :
|
||||
Table( void) ;
|
||||
bool Set( const std::string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1, const STRVECTOR& vsColl) ;
|
||||
bool Set( const std::string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1) ;
|
||||
const std::string& GetName( void)
|
||||
{ return m_sName ; }
|
||||
int GetType( void)
|
||||
@@ -39,8 +39,6 @@ class Table : public IUserObj
|
||||
{ return m_ptRef1 ; }
|
||||
const BBox3d& GetArea1( void)
|
||||
{ return m_b3Area1 ; }
|
||||
const STRVECTOR& GetCollGroups( void) const
|
||||
{ return m_vsColl ; }
|
||||
|
||||
private :
|
||||
int m_nOwnerId ;
|
||||
@@ -49,5 +47,4 @@ class Table : public IUserObj
|
||||
int m_nType ;
|
||||
Point3d m_ptRef1 ;
|
||||
BBox3d m_b3Area1 ;
|
||||
STRVECTOR m_vsColl ;
|
||||
} ;
|
||||
+8
-8
@@ -738,11 +738,10 @@ ToolsMgr::GetCurrToolThDiam( double& dThDiam) const
|
||||
if ( ! m_bCurrTool)
|
||||
return false ;
|
||||
|
||||
// se punta a forare, lama, fresa, mortasatrice/sega a catena o scalpello
|
||||
// se punta a forare, lama, fresa o scalpello
|
||||
if ( ( m_tdCurrTool.m_nType & TF_DRILLBIT) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_SAWBLADE) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_MILL) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_CHISEL) != 0) {
|
||||
// recupero le dimensioni del porta utensili
|
||||
double dTHoldBase = 0 ;
|
||||
@@ -762,8 +761,9 @@ ToolsMgr::GetCurrToolThDiam( double& dThDiam) const
|
||||
dThDiam = dTHoldDiam ;
|
||||
return true ;
|
||||
}
|
||||
// se waterjet
|
||||
else if ( ( m_tdCurrTool.m_nType & TF_WATERJET) != 0) {
|
||||
// se mortasatrice/sega a catena o waterjet
|
||||
else if ( ( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_WATERJET) != 0) {
|
||||
dThDiam = 0 ;
|
||||
return true ;
|
||||
}
|
||||
@@ -779,11 +779,10 @@ ToolsMgr::GetCurrToolThLength( double& dThLen) const
|
||||
if ( ! m_bCurrTool)
|
||||
return false ;
|
||||
|
||||
// se punta a forare, lama, fresa, mortasatrice/sega a catena o scalpello
|
||||
// se punta a forare, lama, fresa o scalpello
|
||||
if ( ( m_tdCurrTool.m_nType & TF_DRILLBIT) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_SAWBLADE) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_MILL) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_CHISEL) != 0) {
|
||||
// recupero le dimensioni del porta utensili
|
||||
double dTHoldBase = 0 ;
|
||||
@@ -803,8 +802,9 @@ ToolsMgr::GetCurrToolThLength( double& dThLen) const
|
||||
dThLen = dTHoldLen ;
|
||||
return true ;
|
||||
}
|
||||
// se waterjet
|
||||
else if ( ( m_tdCurrTool.m_nType & TF_WATERJET) != 0) {
|
||||
// se mortasatrice/sega a catena o waterjet
|
||||
else if ( ( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
|
||||
( m_tdCurrTool.m_nType & TF_WATERJET) != 0) {
|
||||
dThLen = 0 ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
+152
-166
@@ -1676,12 +1676,18 @@ WaterJetting::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
m_pGeomDB->GetName( nPathId, sPathName) ;
|
||||
|
||||
// eventuale approssimazione con segmenti di retta
|
||||
bool bSplitArcs = GetSplitArcs( vtTool) ;
|
||||
if ( ! bSplitArcs) {
|
||||
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi
|
||||
VerifyArcs( pCompo) ;
|
||||
int nSplitArcs = m_pMchMgr->GetCurrMachiningsMgr()->GetSplitArcs() ;
|
||||
bool bSplitArcs = ( nSplitArcs == SPLAR_ALWAYS ||
|
||||
( nSplitArcs == SPLAR_NO_XY_PLANE && ! vtTool.IsZplus()) ||
|
||||
( nSplitArcs == SPLAR_GEN_PLANE && vtTool.IsGeneric())) ;
|
||||
if ( bSplitArcs && ! ApproxWithLines( pCompo)) {
|
||||
m_pMchMgr->SetLastError( 3211, "Error in WaterJetting : Linear Approx not computable") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi
|
||||
VerifyArcs( pCompo) ;
|
||||
|
||||
// se abilitato probing, verifico lunghezza entità ed eventualmente le divido
|
||||
if ( m_Params.m_bProbing)
|
||||
VerifyMaxLenCurves( pCompo, m_Params.m_dProbingMaxDist) ;
|
||||
@@ -1774,8 +1780,8 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
|
||||
// calcolo la regione
|
||||
PtrOwner<ISurfFlatRegion> pSfr ;
|
||||
double dSideCoeff = ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL ? 1. / cos( m_Params.m_dSideAngle * DEGTORAD) : 1) ;
|
||||
double dRad = 0.5 * m_TParams.m_dDiam * dSideCoeff ;
|
||||
pSfr.Set( GetSurfFlatRegionFromFatCurve( Release( pCrv), dRad, false, false)) ;
|
||||
double Rad = 0.5 * m_TParams.m_dDiam * dSideCoeff ;
|
||||
pSfr.Set( GetSurfFlatRegionFromFatCurve( Release( pCrv), Rad, false, false)) ;
|
||||
if ( IsNull( pSfr))
|
||||
return false ;
|
||||
// aggiungo eventuale attacco
|
||||
@@ -1787,18 +1793,32 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
|
||||
// aggiungo eventuali anelli su angoli esterni
|
||||
if ( ! AddLoopsPreview( pCompo, pSfr))
|
||||
return false ;
|
||||
// ne recupero i contorni
|
||||
for ( int i = 0 ; i < pSfr->GetLoopCount( 0) ; ++i) {
|
||||
PtrOwner<ICurve> pCrv2( pSfr->GetLoop( 0, i)) ;
|
||||
if ( IsNull( pCrv2))
|
||||
return false ;
|
||||
// ne recupero il contorno
|
||||
PtrOwner< ICurve> pCrv2 ;
|
||||
pCrv2.Set( pSfr->GetLoop( 0, 0)) ;
|
||||
if ( IsNull( pCrv2))
|
||||
return false ;
|
||||
// inserisco la curva nel DB
|
||||
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ;
|
||||
if ( nC2Id == GDB_ID_NULL)
|
||||
return false ;
|
||||
// assegno nome e colore
|
||||
m_pGeomDB->SetName( nC2Id, MCH_PV_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
|
||||
// eventuali altri contorni ( interni di contornatura chiusa)
|
||||
const int MAX_INT_LOOP = 1000 ;
|
||||
for ( int i = 1 ; i <= MAX_INT_LOOP ; ++i) {
|
||||
PtrOwner< ICurve> pCrv3 ;
|
||||
pCrv3.Set( pSfr->GetLoop( 0, i)) ;
|
||||
if ( IsNull( pCrv3))
|
||||
break ;
|
||||
// inserisco la curva nel DB
|
||||
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ;
|
||||
if ( nC2Id == GDB_ID_NULL)
|
||||
int nC3Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv3)) ;
|
||||
if ( nC3Id == GDB_ID_NULL)
|
||||
return false ;
|
||||
// assegno nome e colore
|
||||
m_pGeomDB->SetName( nC2Id, MCH_PV_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
|
||||
m_pGeomDB->SetName( nC3Id, MCH_PV_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nC3Id, colCut) ;
|
||||
}
|
||||
// inserisco la regione nel DB
|
||||
int nRId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pSfr)) ;
|
||||
@@ -1812,11 +1832,10 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
|
||||
return false ;
|
||||
m_pGeomDB->SetName( nRrId, MCH_PV_RRCUT) ;
|
||||
m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ;
|
||||
|
||||
// eventuali ripetizioni in basso per tagli inclinati
|
||||
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
|
||||
// creo copia della curva composita
|
||||
PtrOwner<ICurveComposite> pCrv( pCompo->Clone()) ;
|
||||
PtrOwner< ICurve> pCrv( pCompo->Clone()) ;
|
||||
if ( IsNull( pCrv))
|
||||
return false ;
|
||||
// rimuovo eventuale overlap
|
||||
@@ -1825,114 +1844,98 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
|
||||
pCrv->TrimStartAtLen( dAddedOverlap) ;
|
||||
pCrv->Invert() ;
|
||||
}
|
||||
|
||||
ICURVEPOVECTOR vpCrvs ;
|
||||
if ( m_Params.m_dSideAngle < 0) {
|
||||
// se inclinazione negativa devo considerare separatamente ogni sottocurva della composita
|
||||
vpCrvs.reserve( pCrv->GetCurveCount()) ;
|
||||
for ( int i = 0 ; i < pCrv->GetCurveCount() ; i++)
|
||||
vpCrvs.emplace_back( pCrv->GetCurve( i)->Clone()) ;
|
||||
}
|
||||
else {
|
||||
// se inclinazione positiva posso considerare la curva completa
|
||||
vpCrvs.emplace_back( pCrv->Clone()) ;
|
||||
}
|
||||
|
||||
// offset per raggio utensile
|
||||
double dSignOffs1 = dRad ;
|
||||
double dRad = 0.5 * m_TParams.m_dDiam / cos( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
double dSignOffs1 = dRad ;
|
||||
if ( ( m_Params.m_nWorkSide == WJET_WS_RIGHT && m_Params.m_dSideAngle > 0) ||
|
||||
( m_Params.m_nWorkSide == WJET_WS_LEFT && m_Params.m_dSideAngle < 0))
|
||||
dSignOffs1 = - dSignOffs1 ;
|
||||
OffsetCurve OffsCrv1 ;
|
||||
OffsCrv1.Make( pCrv, dSignOffs1, ICurve::OFF_FILLET) ;
|
||||
PtrOwner< ICurve> pOffs1( OffsCrv1.GetLongerCurve()) ;
|
||||
if ( IsNull( pOffs1))
|
||||
return false ;
|
||||
// offset per inclinazione
|
||||
double dSignOffs2 = dRad + m_dElev * abs( sin( m_Params.m_dSideAngle * DEGTORAD)) ;
|
||||
if ( ( m_Params.m_nWorkSide == WJET_WS_RIGHT && m_Params.m_dSideAngle < 0) ||
|
||||
( m_Params.m_nWorkSide == WJET_WS_LEFT && m_Params.m_dSideAngle > 0))
|
||||
dSignOffs2 = - dSignOffs2 ;
|
||||
|
||||
OffsetCurve OffsCrv2 ;
|
||||
OffsCrv2.Make( pCrv, dSignOffs2, ICurve::OFF_EXTEND) ;
|
||||
PtrOwner< ICurve> pOffs2( OffsCrv2.GetLongerCurve()) ;
|
||||
if ( IsNull( pOffs2))
|
||||
return false ;
|
||||
// calcolo la regione
|
||||
PtrOwner<ISurfFlatRegion> pSfr( CreateSurfFlatRegion()) ;
|
||||
PtrOwner<ISurfFlatRegion> pSfr ;
|
||||
// se i due offset sono aperti
|
||||
if ( ! pOffs1->IsClosed() && ! pOffs2->IsClosed()) {
|
||||
// li unisco
|
||||
PtrOwner<ICurveComposite> pBound( CreateCurveComposite()) ;
|
||||
if ( IsNull( pBound))
|
||||
return false ;
|
||||
pBound->AddCurve( Release( pOffs1)) ;
|
||||
pOffs2->Invert() ;
|
||||
Point3d ptStart ; pOffs2->GetStartPoint( ptStart) ;
|
||||
pBound->AddLine( ptStart) ;
|
||||
pBound->AddCurve( Release( pOffs2)) ;
|
||||
pBound->Close() ;
|
||||
// creo la regione
|
||||
SurfFlatRegionByContours SfrCntr( false, false) ;
|
||||
SfrCntr.AddCurve( Release( pBound)) ;
|
||||
pSfr.Set( SfrCntr.GetSurf()) ;
|
||||
}
|
||||
// altrimenti sono chiusi
|
||||
else {
|
||||
// creo la regione
|
||||
SurfFlatRegionByContours SfrCntr( false, false) ;
|
||||
SfrCntr.AddCurve( Release( pOffs1)) ;
|
||||
SfrCntr.AddCurve( Release( pOffs2)) ;
|
||||
pSfr.Set( SfrCntr.GetSurf()) ;
|
||||
}
|
||||
if ( IsNull( pSfr))
|
||||
return false ;
|
||||
for ( int i = 0 ; i < int( vpCrvs.size()) ; i++) {
|
||||
OffsetCurve OffsCrv1 ;
|
||||
OffsCrv1.Make( vpCrvs[i], dSignOffs1, ICurve::OFF_FILLET) ;
|
||||
PtrOwner< ICurve> pOffs1( OffsCrv1.GetLongerCurve()) ;
|
||||
if ( IsNull( pOffs1))
|
||||
return false ;
|
||||
OffsetCurve OffsCrv2 ;
|
||||
OffsCrv2.Make( vpCrvs[i], dSignOffs2, ICurve::OFF_EXTEND) ;
|
||||
PtrOwner< ICurve> pOffs2( OffsCrv2.GetLongerCurve()) ;
|
||||
if ( IsNull( pOffs2))
|
||||
return false ;
|
||||
// calcolo la regione corrente
|
||||
PtrOwner<ISurfFlatRegion> pSfrCurr ;
|
||||
// se i due offset sono aperti
|
||||
if ( ! pOffs1->IsClosed() && ! pOffs2->IsClosed()) {
|
||||
// li unisco
|
||||
PtrOwner<ICurveComposite> pBound( CreateCurveComposite()) ;
|
||||
if ( IsNull( pBound))
|
||||
return false ;
|
||||
pBound->AddCurve( Release( pOffs1)) ;
|
||||
pOffs2->Invert() ;
|
||||
Point3d ptStart ; pOffs2->GetStartPoint( ptStart) ;
|
||||
pBound->AddLine( ptStart) ;
|
||||
pBound->AddCurve( Release( pOffs2)) ;
|
||||
pBound->Close() ;
|
||||
// creo la regione
|
||||
SurfFlatRegionByContours SfrCntr( false, false) ;
|
||||
SfrCntr.AddCurve( Release( pBound)) ;
|
||||
pSfrCurr.Set( SfrCntr.GetSurf()) ;
|
||||
}
|
||||
// altrimenti sono chiusi
|
||||
else {
|
||||
// creo la regione
|
||||
SurfFlatRegionByContours SfrCntr( false, false) ;
|
||||
SfrCntr.AddCurve( Release( pOffs1)) ;
|
||||
SfrCntr.AddCurve( Release( pOffs2)) ;
|
||||
pSfrCurr.Set( SfrCntr.GetSurf()) ;
|
||||
}
|
||||
if ( IsNull( pSfrCurr))
|
||||
return false ;
|
||||
|
||||
// aggiungo alla superficie complessiva
|
||||
if ( pSfr->IsValid())
|
||||
pSfr->Add( *pSfrCurr) ;
|
||||
else
|
||||
pSfr.Set( Release( pSfrCurr)) ;
|
||||
}
|
||||
// la regione deve essere rivolta verso Z+
|
||||
if ( pSfr->GetNormVersor().z < 0)
|
||||
pSfr->Invert() ;
|
||||
|
||||
// aggiungo eventuali loops
|
||||
AddLoopsPreview( pCrv, pSfr) ;
|
||||
|
||||
// ne recupero i contorni
|
||||
for ( int i = 0 ; i < pSfr->GetLoopCount( 0) ; ++i) {
|
||||
PtrOwner<ICurve> pCrv2( pSfr->GetLoop( 0, i)) ;
|
||||
if ( IsNull( pCrv2))
|
||||
// ne recupero il contorno
|
||||
PtrOwner< ICurve> pCrv2 ;
|
||||
pCrv2.Set( pSfr->GetLoop( 0, 0)) ;
|
||||
if ( IsNull( pCrv2))
|
||||
return false ;
|
||||
// inserisco la curva nel DB
|
||||
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ;
|
||||
if ( nC2Id == GDB_ID_NULL)
|
||||
return false ;
|
||||
// assegno nome e colore
|
||||
m_pGeomDB->SetName( nC2Id, MCH_PV_DOWN_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
|
||||
// eventuali altri contorni ( interni di contornatura chiusa)
|
||||
const int MAX_INT_LOOP = 1000 ;
|
||||
for ( int i = 1 ; i <= MAX_INT_LOOP ; ++i) {
|
||||
PtrOwner< ICurve> pCrv3 ;
|
||||
pCrv3.Set( pSfr->GetLoop( 0, i)) ;
|
||||
if ( IsNull( pCrv3))
|
||||
break ;
|
||||
// inserisco la curva nel DB
|
||||
int nC3Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv3)) ;
|
||||
if ( nC3Id == GDB_ID_NULL)
|
||||
return false ;
|
||||
// inserisco la curva nel DB
|
||||
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ;
|
||||
if ( nC2Id == GDB_ID_NULL)
|
||||
return false ;
|
||||
// assegno nome e colore
|
||||
m_pGeomDB->SetName( nC2Id, MCH_PV_DOWN_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
|
||||
// assegno nome e colore
|
||||
m_pGeomDB->SetName( nC3Id, MCH_PV_DOWN_CUT) ;
|
||||
m_pGeomDB->SetMaterial( nC3Id, colCut) ;
|
||||
}
|
||||
|
||||
// inserisco la regione nel DB
|
||||
// inserisco la regione nel DB
|
||||
int nRId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pSfr)) ;
|
||||
if ( nRId == GDB_ID_NULL)
|
||||
return false ;
|
||||
m_pGeomDB->SetName( nRId, MCH_PV_DOWN_RCUT) ;
|
||||
m_pGeomDB->SetMaterial( nRId, INVISIBLE) ;
|
||||
// la copio anche come regione ridotta
|
||||
// la copio anche come regione ridotta
|
||||
int nRrId = m_pGeomDB->Copy( nRId, GDB_ID_NULL, nPathId) ;
|
||||
if ( nRrId == GDB_ID_NULL)
|
||||
return false ;
|
||||
m_pGeomDB->SetName( nRrId, MCH_PV_DOWN_RRCUT) ;
|
||||
m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ;
|
||||
m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -2080,11 +2083,6 @@ WaterJetting::AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* p
|
||||
return false ;
|
||||
// lunghezza tratti lineari e loro punti estremi
|
||||
double dTgLen = 0.5 * m_TParams.m_dDiam * tan( 0.5 * dAng * DEGTORAD) ;
|
||||
if ( m_Params.m_dSideAngle > EPS_ANG_SMALL) {
|
||||
double dW = m_dElev * sin( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
double dExtraLen = dW / tan( ( 180 - abs( dAng)) / 2 * DEGTORAD) ;
|
||||
dTgLen += dExtraLen ;
|
||||
}
|
||||
Point3d ptP ; pCrvC->GetStartPoint( ptP) ;
|
||||
Point3d ptPe = ptP + vtEnd * dTgLen ;
|
||||
Point3d ptPs = ptP - vtStart * dTgLen ;
|
||||
@@ -2117,6 +2115,7 @@ WaterJetting::AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* p
|
||||
if ( IsNull( pSfr) || ! pSPV->Add( *pSfr))
|
||||
return false ;
|
||||
}
|
||||
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -2248,7 +2247,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
// imposto versore correzione e ausiliario sul punto di partenza
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i) ;
|
||||
// aggiungo approccio al punto iniziale
|
||||
if ( ! AddApproach( ptP1, vtTool, dSafeZ, bSplitArcs)) {
|
||||
if ( ! AddApproach( ptP1, vtTool, dSafeZ)) {
|
||||
m_pMchMgr->SetLastError( 3207, "Error in WaterJetting : Approach not computable") ;
|
||||
return false ;
|
||||
}
|
||||
@@ -2274,57 +2273,27 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
vtEnd.GetAngleXY( vtStart, dAng) ;
|
||||
// Se angolo esterno e richiesto anello esterno
|
||||
if ( IsExternalAngle( dAng) && m_Params.m_nExtCornerType == WJET_EC_LOOP) {
|
||||
// lunghezza tratti lineari
|
||||
// lunghezza tratti lineari e loro punti estremi
|
||||
double dTgLen = 0.5 * m_TParams.m_dDiam * tan( 0.5 * dAng * DEGTORAD) ;
|
||||
if ( m_Params.m_dSideAngle > EPS_ANG_SMALL) {
|
||||
// se inclinazione positiva calcolo di quanto deve uscire per non rovinare lo spigolo
|
||||
double dW = m_dElev * sin( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
double dExtraLen = dW / tan( ( 180 - abs( dAng)) / 2 * DEGTORAD) ;
|
||||
dTgLen += dExtraLen ;
|
||||
}
|
||||
// calcolo punti estremi
|
||||
Point3d ptP ; pCrvC->GetStartPoint( ptP) ;
|
||||
Point3d ptPe = ptP + vtEnd * dTgLen ;
|
||||
Point3d ptPs = ptP - vtStart * dTgLen ;
|
||||
|
||||
// tratto prima dell'anello
|
||||
SetFeed( GetActualFeed()) ;
|
||||
if ( AddLinearMove( ptPe, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptPe) == GDB_ID_NULL)
|
||||
return false ;
|
||||
|
||||
// anello
|
||||
PtrOwner<ICurve> pCrvA( GetArc2PVN( ptPe, ptPs, vtEnd, vtN)) ;
|
||||
if ( ! IsNull( pCrvA) && pCrvA->GetType() == CRV_ARC) {
|
||||
// suddivido l'anello in due parti per forzare il passaggio dalla posizione vtTool = Z_AX
|
||||
PtrOwner<ICurveComposite> pCompoArc( ConvertCurveToComposite( Release( ( pCrvA)))) ;
|
||||
if ( IsNull( pCompoArc))
|
||||
if ( AddCurveMove( pCrvA) == GDB_ID_NULL)
|
||||
return false ;
|
||||
if ( pCompoArc->AddJoint( 0.5)) {
|
||||
// aggiungo il primo tratto
|
||||
Vector3d vtCorr = CalcCorrDir( pCompoArc, 1) ;
|
||||
SetToolCorrAuxDir( Z_AX, vtCorr) ;
|
||||
if ( AddCurveMove( pCompoArc->GetCurve(0), bSplitArcs) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// aggiungo secondo tratto
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
|
||||
if ( AddCurveMove( pCompoArc->GetCurve(1), bSplitArcs) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
// se non è possibile suddividere anello
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
|
||||
if ( AddCurveMove( pCompoArc, bSplitArcs) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
|
||||
if ( AddLinearMove( ptPs, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptPs) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// tratto dopo l'anello
|
||||
if ( AddLinearMove( ptP, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se angolo esterno e richiesto rallentamento esterno, eseguo accelerazione
|
||||
@@ -2344,7 +2313,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
return false ;
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + dU) ;
|
||||
SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetActualFeed()) ;
|
||||
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
|
||||
return false ;
|
||||
dUprev = dU ;
|
||||
}
|
||||
@@ -2386,7 +2355,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ;
|
||||
SetToolCorrAuxDir( vtTool, vtCorr) ;
|
||||
SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetActualFeed()) ;
|
||||
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
|
||||
return false ;
|
||||
dUprev = dU ;
|
||||
}
|
||||
@@ -2423,7 +2392,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
return false ;
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + dU) ;
|
||||
SetFeed( ( 1 - dCoeff) * GetActualFeed() + dCoeff * dMinFeed) ;
|
||||
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
|
||||
return false ;
|
||||
dUprev = dU ;
|
||||
}
|
||||
@@ -2466,22 +2435,15 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ;
|
||||
SetToolCorrAuxDir( vtTool, vtCorr) ;
|
||||
SetFeed( ( 1 - dCoeff) * GetActualFeed() + dCoeff * dMinFeed) ;
|
||||
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
|
||||
return false ;
|
||||
dUprev = dU ;
|
||||
}
|
||||
dNextFeed = dMinFeed ;
|
||||
}
|
||||
|
||||
// se successivo non è angolo esterno ad anello imposto versore correzione e ausiliario del punto di arrivo
|
||||
if ( ! IsExternalAngle( dAng) || m_Params.m_nExtCornerType != WJET_EC_LOOP)
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + 1) ;
|
||||
}
|
||||
else {
|
||||
// se ultima entità imposto versore correzione e ausiliario del punto finale
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + 1) ;
|
||||
}
|
||||
|
||||
// imposto versore correzione e ausiliario del punto di arrivo
|
||||
CalcAndSetToolCorrAuxDir( pCompo, i + 1) ;
|
||||
// elaborazioni sulla curva corrente
|
||||
if ( pCurve->GetType() == CRV_LINE) {
|
||||
ICurveLine* pLine = GetCurveLine( pCurve) ;
|
||||
@@ -2494,20 +2456,25 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
}
|
||||
else
|
||||
++ nIdxSkip ;
|
||||
if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddLinearMove( ptP3) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
else if ( pCurve->GetType() == CRV_ARC) {
|
||||
ICurveArc* pArc = GetCurveArc( pCurve) ;
|
||||
Point3d ptCen = pArc->GetCenter() ;
|
||||
double dAngCen = pArc->GetAngCenter() ;
|
||||
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
|
||||
Point3d ptCurr ; GetCurrPos( ptCurr) ;
|
||||
double dDeltaAng ; pArc->CalcPointAngle( ptCurr, dDeltaAng) ;
|
||||
SetFeed( dNextFeed) ;
|
||||
// controlli per indice del punto di arrivo
|
||||
Point3d ptP3 ; pCurve->GetEndPoint( ptP3) ;
|
||||
if ( SqDistXY( ptP3, m_ptLastProbe) >= m_Params.m_dProbingMinDist * m_Params.m_dProbingMinDist) {
|
||||
SetIndex( i + 1 - nIdxSkip) ;
|
||||
m_ptLastProbe = ptP3 ;
|
||||
}
|
||||
else
|
||||
++ nIdxSkip ;
|
||||
if ( AddCurveMove( pCurve, bSplitArcs) == GDB_ID_NULL)
|
||||
if ( AddArcMove( ptP3, ptCen, dAngCen - dDeltaAng, vtN) == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// se ultima entità, uscita e retrazione
|
||||
@@ -2524,7 +2491,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
|
||||
}
|
||||
// aggiungo retrazione
|
||||
SetFlag( 203) ;
|
||||
if ( ! AddRetract( ptP1, vtTool, dSafeZ, bSplitArcs)) {
|
||||
if ( ! AddRetract( ptP1, vtTool, dSafeZ)) {
|
||||
m_pMchMgr->SetLastError( 3210, "Error in WaterJetting : Retract not computable") ;
|
||||
return false ;
|
||||
}
|
||||
@@ -2558,7 +2525,7 @@ class LeadIOStatus
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
WaterJetting::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit)
|
||||
WaterJetting::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ)
|
||||
{
|
||||
SetFlag( 1) ;
|
||||
// 1 -> punto sopra inizio
|
||||
@@ -2567,18 +2534,18 @@ WaterJetting::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dS
|
||||
return false ;
|
||||
// affondo al punto iniziale
|
||||
SetFlag( ( m_Params.m_bLiHole ? 201 : 202)) ;
|
||||
if ( AddRapidMove( ptP, bSplit) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP) == GDB_ID_NULL)
|
||||
return false ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
WaterJetting::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit)
|
||||
WaterJetting::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ)
|
||||
{
|
||||
// Risalgo in rapido alla quota di sicurezza
|
||||
Point3d ptP4 = ptP + vtTool * dSafeZ ;
|
||||
if ( AddRapidMove( ptP4, bSplit) == GDB_ID_NULL)
|
||||
if ( AddRapidMove( ptP4) == GDB_ID_NULL)
|
||||
return false ;
|
||||
return true ;
|
||||
}
|
||||
@@ -2628,19 +2595,29 @@ WaterJetting::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vect
|
||||
{
|
||||
// Assegno il tipo
|
||||
int nType = GetLeadInType() ;
|
||||
double dTang = m_Params.m_dLiTang ;
|
||||
// Eseguo a seconda del tipo
|
||||
switch ( nType) {
|
||||
case WJET_LI_NONE :
|
||||
return true ;
|
||||
case WJET_LI_LINEAR :
|
||||
return ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ;
|
||||
return ( AddLinearMove( ptStart, MCH_CL_LEADIN) != GDB_ID_NULL) ;
|
||||
case WJET_LI_TANGENT :
|
||||
{
|
||||
PtrOwner<ICurve> pCrv( GetArc2PVN( ptStart, ptP1, - vtStart, vtN)) ;
|
||||
if ( IsNull( pCrv))
|
||||
return false ;
|
||||
pCrv->Invert() ;
|
||||
return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ;
|
||||
// eventuale spezzatura
|
||||
if ( bSplitArcs) {
|
||||
PtrOwner<ICurveComposite> pCompo ;
|
||||
if ( ! pCompo.Set( ConvertCurveToComposite( Release( pCrv))) || ! ApproxWithLines( pCompo))
|
||||
return false ;
|
||||
return ( AddCurveMove( pCompo, MCH_CL_LEADIN) != GDB_ID_NULL) ;
|
||||
}
|
||||
else {
|
||||
return ( AddCurveMove( pCrv, MCH_CL_LEADIN) != GDB_ID_NULL) ;
|
||||
}
|
||||
}
|
||||
default :
|
||||
return false ;
|
||||
@@ -2690,7 +2667,7 @@ WaterJetting::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vec
|
||||
Vector3d vtPerp = vtEnd ;
|
||||
vtPerp.Rotate( vtN, 0, ( bCcwRot ? 1 : - 1)) ;
|
||||
ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp ;
|
||||
return ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
|
||||
return ( AddLinearMove( ptP1, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
|
||||
}
|
||||
case WJET_LO_TANGENT :
|
||||
{
|
||||
@@ -2702,7 +2679,16 @@ WaterJetting::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vec
|
||||
PtrOwner<ICurve> pCrv( GetArc2PVN( ptEnd, ptP1, vtEnd, vtN)) ;
|
||||
if ( IsNull( pCrv))
|
||||
return false ;
|
||||
return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
|
||||
// eventuale spezzatura
|
||||
if ( bSplitArcs) {
|
||||
PtrOwner<ICurveComposite> pCompo ;
|
||||
if ( ! pCompo.Set( ConvertCurveToComposite( Release( pCrv))) || ! ApproxWithLines( pCompo))
|
||||
return false ;
|
||||
return ( AddCurveMove( pCompo, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
|
||||
}
|
||||
else {
|
||||
return ( AddCurveMove( pCrv, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
|
||||
}
|
||||
}
|
||||
default :
|
||||
return false ;
|
||||
@@ -2966,7 +2952,7 @@ WaterJetting::CalcOffset( ICurveComposite* pCompo, double dSignOffs)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Valore limite angolo per corner
|
||||
const double ANG_CORNER = 10 ;
|
||||
const double ANG_CORNER = 10 ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
|
||||
+2
-2
@@ -81,8 +81,8 @@ class WaterJetting : public Machining
|
||||
bool AddLeadOutPreview( const ICurveComposite* pCompo, ISurfFlatRegion* pSPV) ;
|
||||
bool AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* pSPV) ;
|
||||
bool AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTool, bool bSplitArcs) ;
|
||||
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit) ;
|
||||
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit) ;
|
||||
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ) ;
|
||||
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ) ;
|
||||
bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
|
||||
const ICurveComposite* pCompo, Point3d& ptP1) const ;
|
||||
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart,
|
||||
|
||||
Reference in New Issue
Block a user