Merge commit 'b1d0f10b55daef70fe556bc435c9f51c7287eb72' into Sgrossature

This commit is contained in:
Riccardo Elitropi
2024-08-19 08:08:22 +02:00
3 changed files with 117 additions and 78 deletions
+48 -15
View File
@@ -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,
+8 -2
View File
@@ -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} ;
+61 -61
View File
@@ -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<ICurveComposite> 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<ISurfFlatRegion> pSfrRaw( GetSfrByStmIntersection( IPPStm, it->dDepth - GetOffsL(), 0)) ;
PtrOwner<ISurfFlatRegion> pSfrRaw( GetSfrByStmIntersection( IPPStm, it->dDepth + GetOffsL(), 0)) ;
if ( IsNull( pSfrRaw)) {
m_pMchMgr->SetLastError( 3027, "Error in SurfRoughing : Slicing Raw failed") ;
return false ;
}
PtrOwner<ICurveComposite> 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<ICurveComposite> 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 ;
}