From b1d0f10b55daef70fe556bc435c9f51c7287eb72 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 7 Aug 2024 14:28:14 +0200 Subject: [PATCH] =?UTF-8?q?EgtMachKernel=20:=20-=20inserite=20diverse=20mo?= =?UTF-8?q?dalit=C3=A0=20di=20movimento=20assi=20nei=20link=20tra=20lavora?= =?UTF-8?q?zioni,=20per=20ora=20impostato=20sempre=20tutti=20interpolati?= =?UTF-8?q?=20tra=20loro.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Operation.cpp | 63 +++++++++++++++++++++++++++++++++++++++------------ Operation.h | 10 ++++++-- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/Operation.cpp b/Operation.cpp index 7ae5dfe..b5d07ed 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -4042,24 +4042,32 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn // Verifica standard bool bCollAvoid ; - int nHeadOrder = 0 ; - if ( nHeadOrder == 0) { - bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxEnd, pMch, vRawId, vFxtId) ; - } - else { - DBLVECTOR vAxMid( int( vAxName.size())) ; - // ciclo sugli assi correnti, assegno opportunamente valori a seconda del tipo (testa o tavola) - for ( int i = 0 ; i < int( vAxName.size()) ; ++ i) { - bool bLinear, bHead ; pMch->GetCurrAxisType( i, bLinear, bHead) ; - if ( nHeadOrder == -1) - vAxMid[i] = ( bHead ? vAxEnd[i] : vAxStart[i]) ; - else if ( nHeadOrder == +1) { - vAxMid[i] = ( bHead ? vAxStart[i] : vAxEnd[i]) ; - } - } + int nLinkAxisOrder = LKAO_INTERP ; + // se ordine stabilito tra gli assi di tavola e testa (LKAO_HEAD_BEFORE(-1)=prima testa, LKAO_HEAD_AFTER(+1)=dopo testa) + if ( nLinkAxisOrder == LKAO_HEAD_BEFORE || nLinkAxisOrder == LKAO_HEAD_AFTER) { + // assegno il valore degli assi nella posizione intermedia opportuna + DBLVECTOR vAxMid ; + GetAxisMidForTestCollisionAvoid( vAxStart, vAxEnd, nLinkAxisOrder, pMch, vAxMid) ; + // eseguo i test bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxMid, pMch, vRawId, vFxtId) && OneMoveTestCollisionAvoid( vAxName, vAxMid, vAxEnd, pMch, vRawId, vFxtId) ; } + // se verifico entrambi gli ordini degli assi di tavola e testa LKAO_HEAD_BOTH(11) + else if ( nLinkAxisOrder == LKAO_HEAD_BOTH) { + // assegno il valore degli assi nelle posizioni intermedie + DBLVECTOR vAxMidB, vAxMidA ; + GetAxisMidForTestCollisionAvoid( vAxStart, vAxEnd, LKAO_HEAD_BEFORE, pMch, vAxMidB) ; + GetAxisMidForTestCollisionAvoid( vAxStart, vAxEnd, LKAO_HEAD_AFTER, pMch, vAxMidA) ; + // eseguo i test + bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxMidB, pMch, vRawId, vFxtId) && + OneMoveTestCollisionAvoid( vAxName, vAxMidB, vAxEnd, pMch, vRawId, vFxtId) && + OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxMidA, pMch, vRawId, vFxtId) && + OneMoveTestCollisionAvoid( vAxName, vAxMidA, vAxEnd, pMch, vRawId, vFxtId) ; + } + // altrimenti interpolo tutti gli assi tra loro LKAO_INTERP(0) + else { + bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxEnd, pMch, vRawId, vFxtId) ; + } // Ripristino lo stato macchina ResetMachine( pMch) ; @@ -4067,6 +4075,31 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn return bCollAvoid ; } +//---------------------------------------------------------------------------- +bool +Operation::GetAxisMidForTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nAxisOrder, Machine* pMch, + DBLVECTOR& vAxMid) const +{ + // reset del risultato + vAxMid.clear() ; + // verifico che i vettori degli assi abbiano la stessa dimensione e che la macchina sia definita + if ( vAxStart.size() != vAxEnd.size() || pMch == nullptr) + return false ; + // assegno dimensione al risultato + vAxMid.resize( vAxStart.size()) ; + // ciclo sugli assi correnti, assegno opportunamente valori a seconda del tipo (testa o tavola) + for ( int i = 0 ; i < int( vAxStart.size()) ; ++ i) { + bool bLinear, bHead ; pMch->GetCurrAxisType( i, bLinear, bHead) ; + if ( nAxisOrder == -1) + vAxMid[i] = ( bHead ? vAxEnd[i] : vAxStart[i]) ; + else if ( nAxisOrder == +1) { + vAxMid[i] = ( bHead ? vAxStart[i] : vAxEnd[i]) ; + } + } + // tutto bene + return true ; +} + //---------------------------------------------------------------------------- bool Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, diff --git a/Operation.h b/Operation.h index 4dbd58b..d2b6669 100644 --- a/Operation.h +++ b/Operation.h @@ -220,8 +220,6 @@ class Operation : public IUserObj int GetUserNotesZmax( void) const ; bool GetZHomeDown( void) const ; bool TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ; - bool OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, - Machine* pMch, const INTVECTOR& vRawId, const INTVECTOR& vFxtId) const ; int SpecialTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ; bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ; bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) ; @@ -229,6 +227,12 @@ class Operation : public IUserObj bool GetAggrBottomData( const std::string& sHead, AggrBottom& agbData) const ; bool IsAggrBottom( const std::string& sHead) const ; + private : + bool GetAxisMidForTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nAxisOrder, Machine* pMch, + DBLVECTOR& vAxMid) const ; + bool OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, + Machine* pMch, const INTVECTOR& vRawId, const INTVECTOR& vFxtId) const ; + protected : int m_nOwnerId ; // identificativo dell'oggetto geometrico possessore IGeomDB* m_pGeomDB ; // puntatore al DB geometrico @@ -306,3 +310,5 @@ enum { TOOL_PARAL = 1, TOOL_ORTHO = 2, TOOL_ORTUP = 3, TOOL_PAR_SLANT= 4} ; enum { FACE_DOWN = 1, FACE_TOP = 2, FACE_FRONT = 3, FACE_BACK = 4, FACE_LEFT = 5, FACE_RIGHT = 6, FACE_CONT = 7, FACE_VERSOR = 8} ; // risultato di SpecialTestCollisionAvoid enum { SCAV_ERROR = -1, SCAV_COLLIDE = 0, SCAV_AVOID = 1, SCAV_TOTEST = 2} ; +// ordine di movimento assi nei link +enum { LKAO_INTERP = 0, LKAO_HEAD_BEFORE = -1, LKAO_HEAD_AFTER = +1, LKAO_HEAD_BOTH = 11} ; \ No newline at end of file