From 114c13d781fd492211bad4f7a7254b8cd47a1ba7 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 7 Aug 2024 09:42:47 +0200 Subject: [PATCH 1/2] EgtMachKernel : - in sgrossatura superfici correzioni nell'applicazione dell'offset longitudinale. --- SurfRoughing.cpp | 122 +++++++++++++++++++++++------------------------ 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/SurfRoughing.cpp b/SurfRoughing.cpp index 93d4885..260c61f 100644 --- a/SurfRoughing.cpp +++ b/SurfRoughing.cpp @@ -96,61 +96,6 @@ static string _DEBUG_GROUP_FEED = "Feeds" ; bool _DEBUG_CLEAR_GROUP_TERRACE = TRUE ; bool _DEBUG_CLEAR_GROUP_FEED = TRUE ; -/* start debug functions */ -void -SurfRoughing::DrawLoopsSurf( const ISurfFlatRegion* pSfr, bool bWithSurf, Color Col, bool bAlphaCoverage, int nStep) -{ - int myId = m_pGeomDB->GetFirstNameInGroup( GDB_ID_ROOT, _DEBUG_GROUP_TERRACE) ; - if ( myId == GDB_ID_NULL) { - myId = m_pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, GLOB_FRM) ; - m_pGeomDB->SetName( myId, _DEBUG_GROUP_TERRACE) ; - } - else { - if ( nStep == 0) - m_pGeomDB->EmptyGroup( myId) ; - } - int myStepId = m_pGeomDB->AddGroup( GDB_ID_NULL, myId, GLOB_FRM) ; - m_pGeomDB->SetName( myStepId, "Step " + ToString( nStep)) ; - int nInd = m_pGeomDB->AddGeoObj( GDB_ID_NULL, myStepId, pSfr->Clone()) ; - m_pGeomDB->SetMaterial( nInd, Col) ; - for ( int c = 0 ; c < pSfr->GetChunkCount() ; ++ c) { - for ( int l = 0 ; l < pSfr->GetLoopCount( c) ; ++ l) { - PtrOwner pCrvCompo( GetCurveComposite( pSfr->GetLoop( c, l))) ; - for ( int u = 0 ; u < pCrvCompo->GetCurveCount() ; ++ u) { - int nProp0 ; pCrvCompo->GetCurveTempProp( u, nProp0, 0) ; - int nProp1 ; pCrvCompo->GetCurveTempProp( u, nProp1, 1) ; - nInd = m_pGeomDB->AddGeoObj( GDB_ID_NULL, myStepId, pCrvCompo->GetCurve( u)->Clone()) ; - m_pGeomDB->SetMaterial( nInd, nProp0 == 0 ? ! bAlphaCoverage ? BLUE : AQUA : ! bAlphaCoverage ? RED : ORANGE) ; - } - } - } - return ; -} - -void -SurfRoughing::DrawFeed( const ICurveComposite* pCrv, int nStep) -{ - int myId = m_pGeomDB->GetFirstNameInGroup( GDB_ID_ROOT, _DEBUG_GROUP_FEED) ; - if ( myId == GDB_ID_NULL) { - myId = m_pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, GLOB_FRM) ; - m_pGeomDB->SetName( myId, _DEBUG_GROUP_FEED) ; - } - else { - if ( nStep == 0) - m_pGeomDB->EmptyGroup( myId) ; - } - int myStepId = m_pGeomDB->AddGroup( GDB_ID_NULL, myId, GLOB_FRM) ; - m_pGeomDB->SetName( myStepId, "Step " + ToString( nStep)) ; - double dMinFeed = GetFeed() * GetSideStep() / m_TParams.m_dDiam ; - for ( int u = 0 ; u < pCrv->GetCurveCount() ; ++ u) { - double myAngle = 120 * ( ( ( pCrv->GetCurve( u)->GetTempParam( 0) - dMinFeed) / ( GetFeed() - dMinFeed))) ; - int nInd = m_pGeomDB->AddGeoObj( GDB_ID_NULL, myStepId, pCrv->GetCurve( u)->Clone()) ; - m_pGeomDB->SetMaterial( nInd, GetColorFromHSV( HSV( myAngle, 1., 1.))) ; - } - return ; -} -/* end debug functions */ - //---------------------------------------------------------------------------- USEROBJ_REGISTER( GetOperationClass( OPER_SURFROUGHING), SurfRoughing) ; @@ -1409,19 +1354,19 @@ SurfRoughing::ProcessPath( int nPathId, int nTempId, int nPvId, int nClId) m_pMchMgr->SetLastError( 3024, "Error in SurfRoughing : region not computable") ; return false ; } - pSfr->Translate( ( it->dDepth - GetOffsL()) * vtTool) ; + pSfr->Translate( ( it->dDepth + GetOffsL()) * vtTool) ; /* ******************** Regione adattata al grezzo ******************** */ // questa regione bisogna ridurla basandosi sulla geometria del grezzo, in modo da non lavorare // parti in eccesso ; taglio il grezzo sul piano corrente e interseco con questa regione - PtrOwner pSfrRaw( GetSfrByStmIntersection( IPPStm, it->dDepth - GetOffsL(), 0)) ; + PtrOwner pSfrRaw( GetSfrByStmIntersection( IPPStm, it->dDepth + GetOffsL(), 0)) ; if ( IsNull( pSfrRaw)) { m_pMchMgr->SetLastError( 3027, "Error in SurfRoughing : Slicing Raw failed") ; return false ; } PtrOwner pCompoPocket( CloneCurveComposite( pCompo)) ; if ( IsNull( pCompoPocket) || ! pCompoPocket->IsValid() || - ! pCompoPocket->Translate( ( it->dDepth - GetOffsL()) * vtTool)) + ! pCompoPocket->Translate( ( it->dDepth + GetOffsL()) * vtTool)) return false ; if ( pSfrRaw->IsValid() && pSfrRaw->GetChunkCount() > 0) { // per la curva composita selezionata, assegno i lati aperti e chiusi controllando @@ -1438,7 +1383,7 @@ SurfRoughing::ProcessPath( int nPathId, int nTempId, int nPvId, int nClId) /* *************************** Silhouette **************************** */ // determino la regione da non lavorare e la sottraggo POLYLINEVECTOR vPL ; - if ( ! pCavParSilh->GetSilhouette( it->dDepth - GetOffsL(), vPL)) { + if ( ! pCavParSilh->GetSilhouette( it->dDepth, vPL)) { m_pMchMgr->SetLastError( 3024, "Error in SurfRoughing : region not computable") ; return false ; } @@ -1562,7 +1507,7 @@ SurfRoughing::ProcessPath( int nPathId, int nTempId, int nPvId, int nClId) pSfr->SetTempProp( it->bSubStep ? 1 : 0, 0) ; // salvo nel temp Param della FlatRegion la sua Depth di traslazione - pSfr->SetTempParam( it->dDepth - GetOffsL(), 0) ; + pSfr->SetTempParam( it->dDepth + GetOffsL(), 0) ; // salvo come temp Param 1 della FlatRegion il Coefficiente correttivo // per Zloc della Feed ( valore compreso tra 0 e 1) @@ -3004,7 +2949,6 @@ SurfRoughing::GetHomogeneousParts( const ICurveComposite* pCrvCompo, ICRVCOMPOPO } - //---------------------------------------------------------------------------- bool SurfRoughing::VerifyLeadInLeadOut( const ICurve* pCrv, const ICurveComposite* pCrvPock, bool& bValidLeadIn) const @@ -3062,3 +3006,59 @@ SurfRoughing::VerifyLeadInLeadOut( const ICurve* pCrv, const ICurveComposite* pC } +//---------------------------------------------------------------------------- +// Debug Functions +//---------------------------------------------------------------------------- +void +SurfRoughing::DrawLoopsSurf( const ISurfFlatRegion* pSfr, bool bWithSurf, Color Col, bool bAlphaCoverage, int nStep) +{ + int myId = m_pGeomDB->GetFirstNameInGroup( GDB_ID_ROOT, _DEBUG_GROUP_TERRACE) ; + if ( myId == GDB_ID_NULL) { + myId = m_pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, GLOB_FRM) ; + m_pGeomDB->SetName( myId, _DEBUG_GROUP_TERRACE) ; + } + else { + if ( nStep == 0) + m_pGeomDB->EmptyGroup( myId) ; + } + int myStepId = m_pGeomDB->AddGroup( GDB_ID_NULL, myId, GLOB_FRM) ; + m_pGeomDB->SetName( myStepId, "Step " + ToString( nStep)) ; + int nInd = m_pGeomDB->AddGeoObj( GDB_ID_NULL, myStepId, pSfr->Clone()) ; + m_pGeomDB->SetMaterial( nInd, Col) ; + for ( int c = 0 ; c < pSfr->GetChunkCount() ; ++ c) { + for ( int l = 0 ; l < pSfr->GetLoopCount( c) ; ++ l) { + PtrOwner pCrvCompo( GetCurveComposite( pSfr->GetLoop( c, l))) ; + for ( int u = 0 ; u < pCrvCompo->GetCurveCount() ; ++ u) { + int nProp0 ; pCrvCompo->GetCurveTempProp( u, nProp0, 0) ; + int nProp1 ; pCrvCompo->GetCurveTempProp( u, nProp1, 1) ; + nInd = m_pGeomDB->AddGeoObj( GDB_ID_NULL, myStepId, pCrvCompo->GetCurve( u)->Clone()) ; + m_pGeomDB->SetMaterial( nInd, nProp0 == 0 ? ! bAlphaCoverage ? BLUE : AQUA : ! bAlphaCoverage ? RED : ORANGE) ; + } + } + } + return ; +} + +//---------------------------------------------------------------------------- +void +SurfRoughing::DrawFeed( const ICurveComposite* pCrv, int nStep) +{ + int myId = m_pGeomDB->GetFirstNameInGroup( GDB_ID_ROOT, _DEBUG_GROUP_FEED) ; + if ( myId == GDB_ID_NULL) { + myId = m_pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, GLOB_FRM) ; + m_pGeomDB->SetName( myId, _DEBUG_GROUP_FEED) ; + } + else { + if ( nStep == 0) + m_pGeomDB->EmptyGroup( myId) ; + } + int myStepId = m_pGeomDB->AddGroup( GDB_ID_NULL, myId, GLOB_FRM) ; + m_pGeomDB->SetName( myStepId, "Step " + ToString( nStep)) ; + double dMinFeed = GetFeed() * GetSideStep() / m_TParams.m_dDiam ; + for ( int u = 0 ; u < pCrv->GetCurveCount() ; ++ u) { + double myAngle = 120 * ( ( ( pCrv->GetCurve( u)->GetTempParam( 0) - dMinFeed) / ( GetFeed() - dMinFeed))) ; + int nInd = m_pGeomDB->AddGeoObj( GDB_ID_NULL, myStepId, pCrv->GetCurve( u)->Clone()) ; + m_pGeomDB->SetMaterial( nInd, GetColorFromHSV( HSV( myAngle, 1., 1.))) ; + } + return ; +} From b1d0f10b55daef70fe556bc435c9f51c7287eb72 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 7 Aug 2024 14:28:14 +0200 Subject: [PATCH 2/2] =?UTF-8?q?EgtMachKernel=20:=20-=20inserite=20diverse?= =?UTF-8?q?=20modalit=C3=A0=20di=20movimento=20assi=20nei=20link=20tra=20l?= =?UTF-8?q?avorazioni,=20per=20ora=20impostato=20sempre=20tutti=20interpol?= =?UTF-8?q?ati=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