diff --git a/Disposition.cpp b/Disposition.cpp index 1d14577..df45785 100644 --- a/Disposition.cpp +++ b/Disposition.cpp @@ -45,6 +45,8 @@ static std::string DIS_NUM = "NUM" ; static std::string DIS_HEAD = "Head" ; static std::string DIS_EXIT = "Exit" ; static std::string DIS_SOMEBYHAND = "Sbh" ; +//---------------------------------------------------------------------------- +static double DISP_BOX_TOL = - 0.5 ; //---------------------------------------------------------------------------- USEROBJ_REGISTER( "EMkDisposition", Disposition) ; @@ -472,6 +474,17 @@ Disposition::AddFixture( const string& sName, const Point3d& ptPos, double dAngD // la ruoto if ( fabs( dAngDeg) > EPS_ANG_SMALL) m_pGeomDB->RotateGroup( nFixtId, ORIG, Z_AX, dAngDeg) ; + // recupero ingombro sottopezzo (rimpicciolisco un poco per tolleranza) + BBox3d b3Fixt ; + if ( m_pGeomDB == nullptr || ! m_pGeomDB->GetGlobalBBox( nFixtId, b3Fixt)) + return false ; + b3Fixt.Expand( DISP_BOX_TOL) ; + // verifico che la posizione finale sia nell'area della tavola (espressa in posizione 0) + b3Fixt.Translate( - vtDelta1) ; + if ( ! m_b3Area1.EnclosesXY( b3Fixt)) { + RemoveFixture( nFixtId) ; + return GDB_ID_NULL ; + } // muovo eventuale parte mobile int nMobId = m_pGeomDB->GetFirstNameInGroup( nFixtId, FXT_MOBILE) ; if ( nMobId != GDB_ID_NULL) { @@ -539,10 +552,14 @@ Disposition::MoveFixture( int nId, const Vector3d& vtMove) Machine* pMch = m_pMchMgr->GetCurrMachine() ; if ( pMch == nullptr || ! pMch->GetCurrTableDeltaRef1( vtDelta1)) return false ; + // recupero ingombro sottopezzo + BBox3d b3Fixt ; + if ( m_pGeomDB == nullptr || ! m_pGeomDB->GetGlobalBBox( nId, b3Fixt)) + return false ; + b3Fixt.Expand( DISP_BOX_TOL) ; // verifico che la posizione finale sia nell'area della tavola (espressa in posizione 0) - Frame3d frFixt ; - if ( ! m_pGeomDB->GetGroupFrame( nId, frFixt) || - ! m_b3Area1.EnclosesXY( frFixt.Orig() - vtDelta1 + vtMove)) + b3Fixt.Translate( vtMove - vtDelta1) ; + if ( ! m_b3Area1.EnclosesXY( b3Fixt)) return false ; // muovo l'oggetto m_pGeomDB->TranslateGlob( nId, vtMove) ; @@ -618,8 +635,17 @@ Disposition::PlaceFixture( int nId, const Point3d& ptPos, double dAngDeg, double // verifico aggiornamento tavola if ( ! m_bTabOk && ! SetTable( m_sTabName)) return false ; + // recupero ingombro sottopezzo + BBox3d b3Fixt ; + if ( m_pGeomDB == nullptr || ! m_pGeomDB->GetGlobalBBox( nId, b3Fixt)) + return false ; + b3Fixt.Expand( DISP_BOX_TOL) ; + // recupero riferimento sottopezzo + Frame3d frFixt ; + m_pGeomDB->GetGroupGlobFrame( nId, frFixt) ; // verifico che la posizione sia nell'area della tavola - if ( ! m_b3Area1.EnclosesXY( m_ptRef1 + ptPos)) + b3Fixt.Translate( m_ptRef1 + ptPos - frFixt.Orig()) ; + if ( ! m_b3Area1.EnclosesXY( b3Fixt)) return false ; // aggiorno visualizzazione m_pGeomDB->SetStatus( nId, GDB_ST_ON) ;