Merge commit 'b1d0f10b55daef70fe556bc435c9f51c7287eb72' into Sgrossature
This commit is contained in:
+48
-15
@@ -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
@@ -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
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user