EgtMachKernel :
- migliorata la regione di incidenza per lati aperti - controllo pulizia dei lati aperti con angoli piccoli.
This commit is contained in:
+303
-108
@@ -1227,71 +1227,73 @@ Pocketing::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
pCrvCompo->SetExtrusion( vtN) ;
|
||||
|
||||
// --------------------------------- Proiezioni lati adiacenti --------------------------------------
|
||||
// 1) Creo una regione piana dalla curva esterna
|
||||
PtrOwner<ISurfFlatRegion> pSrfpCompo( CreateSurfFlatRegion()) ;
|
||||
if ( IsNull( pSrfpCompo))
|
||||
return false ;
|
||||
pSrfpCompo->AddExtLoop( pCrvCompo->Clone()) ;
|
||||
if ( IsNull( pSrfpCompo) || pSrfpCompo->GetChunkCount() == 0)
|
||||
return false ;
|
||||
if ( m_TParams.m_dSideAng == 0) { // controllare se le facce effettivamente sono inclinate come il tool ?
|
||||
// 1) Creo una regione piana dalla curva esterna
|
||||
PtrOwner<ISurfFlatRegion> pSrfpCompo( CreateSurfFlatRegion()) ;
|
||||
if ( IsNull( pSrfpCompo))
|
||||
return false ;
|
||||
pSrfpCompo->AddExtLoop( pCrvCompo->Clone()) ;
|
||||
if ( IsNull( pSrfpCompo) || pSrfpCompo->GetChunkCount() == 0)
|
||||
return false ;
|
||||
|
||||
bool bIspCompoMod = false ;
|
||||
INTVECTOR vBannedId{ -1, nFacet} ;
|
||||
bool bIspCompoMod = false ;
|
||||
INTVECTOR vBannedId{ -1, nFacet} ;
|
||||
|
||||
// 2) scorro tutte le curve del bordo esterno
|
||||
for ( int j = 0 ; j < pCrvCompo->GetCurveCount() ; ++ j) {
|
||||
int nProp = 0 ;
|
||||
// 3) controllo che nella seconda temp prop ho una faccia adiancente non già considerata da un altro bordo
|
||||
// e creo un vettore con gli Id delle facce del bordo laterale adiacente alla curva j della pCrvCompo
|
||||
if ( pCrvCompo->GetCurveTempProp( j, nProp, 1) && nProp != -1 //-> se la curva j ha una faccia adiacente...
|
||||
&& find( vBannedId.begin(), vBannedId.end(), nProp) == vBannedId.end() //-> ...non già considerata da altre curve...
|
||||
&& GetSurfByAdj( pSurf, vBannedId, nProp)) { //-> ...e riesco a ricavare tutte le facce del bordo
|
||||
// 4) creo una regione piana con tutte le facce proiettate contenute
|
||||
PtrOwner<ISurfFlatRegion> pSfrProj( CreateSurfFlatRegion()) ;
|
||||
if ( ! IsNull( pSfrProj) && ProjectEdgesOnSelFace( pSrfpCompo, pSurf, vBannedId, nFacet, pSfrProj)) {
|
||||
// sto modificando le singole superifici, quindi superificie del bordo esterno e superificie delle isole
|
||||
if ( i == 0) {
|
||||
if ( ! pSrfpCompo->Subtract( *pSfrProj))
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
if ( ! pSrfpCompo->Add( *pSfrProj))
|
||||
return false ;
|
||||
}
|
||||
bIspCompoMod = true ;
|
||||
// 2) scorro tutte le curve del bordo esterno
|
||||
for ( int j = 0 ; j < pCrvCompo->GetCurveCount() ; ++ j) {
|
||||
int nProp = 0 ;
|
||||
// 3) controllo che nella seconda temp prop ho una faccia adiancente non già considerata da un altro bordo
|
||||
// e creo un vettore con gli Id delle facce del bordo laterale adiacente alla curva j della pCrvCompo
|
||||
if ( pCrvCompo->GetCurveTempProp( j, nProp, 1) && nProp != -1 //-> se la curva j ha una faccia adiacente...
|
||||
&& find( vBannedId.begin(), vBannedId.end(), nProp) == vBannedId.end() //-> ...non già considerata da altre curve...
|
||||
&& GetSurfByAdj( pSurf, vBannedId, nProp)) { //-> ...e riesco a ricavare tutte le facce del bordo
|
||||
// 4) creo una regione piana con tutte le facce proiettate contenute
|
||||
PtrOwner<ISurfFlatRegion> pSfrProj( CreateSurfFlatRegion()) ;
|
||||
if ( ! IsNull( pSfrProj) && ProjectEdgesOnSelFace( pSrfpCompo, pSurf, vBannedId, nFacet, pSfrProj)) {
|
||||
// sto modificando le singole superifici, quindi superificie del bordo esterno e superificie delle isole
|
||||
if ( i == 0) {
|
||||
if ( ! pSrfpCompo->Subtract( *pSfrProj))
|
||||
return false ;
|
||||
}
|
||||
else {
|
||||
if ( ! pSrfpCompo->Add( *pSfrProj))
|
||||
return false ;
|
||||
}
|
||||
bIspCompoMod = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ho creato una nuova FlatRegion.
|
||||
// *** Se la curva originale è quella esterna -> tolgo le proiezioni ( non devo passare con il tool in quelle aree )
|
||||
// *** Se la curva originale è quella di un'isola -> aggiungo le proiezioni ( così estraendo poi la curva mi trovo
|
||||
// con un'isola più grande, comprendendo quindi le parti proiettare dove il tool non può passare )
|
||||
// Ho creato una nuova FlatRegion.
|
||||
// *** Se la curva originale è quella esterna -> tolgo le proiezioni ( non devo passare con il tool in quelle aree )
|
||||
// *** Se la curva originale è quella di un'isola -> aggiungo le proiezioni ( così estraendo poi la curva mi trovo
|
||||
// con un'isola più grande, comprendendo quindi le parti proiettare dove il tool non può passare )
|
||||
|
||||
// se questa nuova superificie è modificata rispetto a quella selezionata, devo aggiornare le curve, con quelle
|
||||
// della nuova FlatRegion
|
||||
// se questa nuova superificie è modificata rispetto a quella selezionata, devo aggiornare le curve, con quelle
|
||||
// della nuova FlatRegion
|
||||
|
||||
if ( bIspCompoMod) {
|
||||
// scorro ora il bordo della mia superificie
|
||||
if( pSrfpCompo->GetChunkCount() == 0)
|
||||
return false ;
|
||||
PtrOwner<ICurveComposite> pCrvBorder( GetCurveComposite( pSrfpCompo->GetLoop( 0, 0))) ;
|
||||
if ( IsNull( pCrvBorder) || pCrvBorder->GetCurveCount() == 0)
|
||||
return false ;
|
||||
for ( int c = 0 ; c < pCrvBorder->GetCurveCount() ; ++ c) {
|
||||
int nStat = 0 ;
|
||||
if ( ! SetTmpPropByOverlap( pCrvBorder, c, pCrvCompo, nStat))
|
||||
if ( bIspCompoMod) {
|
||||
// scorro ora il bordo della mia superificie
|
||||
if( pSrfpCompo->GetChunkCount() == 0)
|
||||
return false ;
|
||||
if ( nStat == 0 || nStat == 2) { // se non c'è overlap o geometria complessa
|
||||
pCrvBorder->SetCurveTempProp( c, 0, 0) ; // lato chiuso
|
||||
pCrvBorder->SetCurveTempProp( c, -1, 1) ; // lato esterno non definito
|
||||
PtrOwner<ICurveComposite> pCrvBorder( GetCurveComposite( pSrfpCompo->GetLoop( 0, 0))) ;
|
||||
if ( IsNull( pCrvBorder) || pCrvBorder->GetCurveCount() == 0)
|
||||
return false ;
|
||||
for ( int c = 0 ; c < pCrvBorder->GetCurveCount() ; ++ c) {
|
||||
int nStat = 0 ;
|
||||
if ( ! SetTmpPropByOverlap( pCrvBorder, c, pCrvCompo, nStat))
|
||||
return false ;
|
||||
if ( nStat == 0 || nStat == 2) { // se non c'è overlap o geometria complessa
|
||||
pCrvBorder->SetCurveTempProp( c, 0, 0) ; // lato chiuso
|
||||
pCrvBorder->SetCurveTempProp( c, -1, 1) ; // lato esterno non definito
|
||||
}
|
||||
}
|
||||
|
||||
// risetto le proprietà iniziali della curva
|
||||
pCrvCompo->Clear() ;
|
||||
pCrvCompo->AddCurve( Release( pCrvBorder)) ;
|
||||
|
||||
}
|
||||
|
||||
// risetto le proprietà iniziali della curva
|
||||
pCrvCompo->Clear() ;
|
||||
pCrvCompo->AddCurve( Release( pCrvBorder)) ;
|
||||
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// assegno l'estrusione dalla normale alla faccia
|
||||
@@ -3337,9 +3339,9 @@ Pocketing::OptimizedZigZag( ISurfFlatRegion* pSrf, const Vector3d& vtTool, doubl
|
||||
}
|
||||
int nClosedSides = vnInfoClosed.size() ;
|
||||
|
||||
PtrOwner<ICurveComposite> pCrvDraw1( CloneCurveComposite( pCrvPocket)) ;
|
||||
pCrvDraw1->ToGlob( frPocket) ;
|
||||
m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvDraw1->Clone()) ;
|
||||
//PtrOwner<ICurveComposite> pCrvDraw1( CloneCurveComposite( pCrvPocket)) ;
|
||||
//pCrvDraw1->ToGlob( frPocket) ;
|
||||
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvDraw1->Clone()) ;
|
||||
|
||||
|
||||
// modifico pCrvPocket per poterla passare a CalcZigZag
|
||||
@@ -3363,9 +3365,9 @@ Pocketing::OptimizedZigZag( ISurfFlatRegion* pSrf, const Vector3d& vtTool, doubl
|
||||
break ;
|
||||
}
|
||||
|
||||
PtrOwner<ICurveComposite> pCrvDraw( CloneCurveComposite( pCrvPocket)) ;
|
||||
pCrvDraw->ToGlob( frPocket) ;
|
||||
m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvDraw->Clone()) ;
|
||||
//PtrOwner<ICurveComposite> pCrvDraw( CloneCurveComposite( pCrvPocket)) ;
|
||||
//pCrvDraw->ToGlob( frPocket) ;
|
||||
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvDraw->Clone()) ;
|
||||
|
||||
if ( ! bOptimizedZigZag)
|
||||
return true ;
|
||||
@@ -4618,8 +4620,10 @@ Pocketing::AddSpiralIn( const ISurfFlatRegion* pSrfPock, const Vector3d& vtTool,
|
||||
// 3) il numero di chunk allo step precedente è maggiore di 1 o ...
|
||||
// 4) dal primo offset del chunk cc-esimo ottengo più regioni o ...
|
||||
// determino inizio attacco
|
||||
|
||||
if ( ! CalcLeadInStart( ptStart, vtStart, vtExtr, pRCrv, ptP1))
|
||||
return false ;
|
||||
|
||||
// determino elevazione su inizio attacco (se non trovata, elevazione è step)
|
||||
double dStElev ;
|
||||
if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev))
|
||||
@@ -4630,7 +4634,7 @@ Pocketing::AddSpiralIn( const ISurfFlatRegion* pSrfPock, const Vector3d& vtTool,
|
||||
bool bUhAboveRaw = ! m_bAboveHead &&
|
||||
GetUhPointAboveRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(),
|
||||
m_TParams.m_dLen, false, dSafeZ, vtTool, dStElev) ;
|
||||
//if ( bAhUnderRaw || bUhAboveRaw )
|
||||
if ( bAhUnderRaw || bUhAboveRaw )
|
||||
dStElev = max( dStElev, j * dStep) ;
|
||||
dStElev -= ( ptP1 - ptStart) * vtExtr ;
|
||||
// se attacco a zigzag o a spirale o a scivolo, l'elevazione va nell'attacco
|
||||
@@ -4645,6 +4649,7 @@ Pocketing::AddSpiralIn( const ISurfFlatRegion* pSrfPock, const Vector3d& vtTool,
|
||||
m_pMchMgr->SetLastError( 2414, "Error in Pocketing : Approach not computable") ;
|
||||
return false ;
|
||||
}
|
||||
dStElev = max( dStElev, j * dStep) ;
|
||||
// aggiungo attacco
|
||||
SetFeed( GetStartFeed()) ;
|
||||
if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pSrfLeanInOut, pRCrv, !m_Params.m_bInvert, bSplitArcs, bOutStart || bForcedOutStart)) {
|
||||
@@ -4730,12 +4735,14 @@ Pocketing::AddSpiralIn( const ISurfFlatRegion* pSrfPock, const Vector3d& vtTool,
|
||||
pCurve->GetEndDir( vtEnd) ;
|
||||
// aggiungo uscita
|
||||
Point3d ptP1 ;
|
||||
double dEndElev = j * dStep ;
|
||||
double dEndElev = dElev ;
|
||||
SetFeed( GetEndFeed()) ;
|
||||
if ( ! AddLeadOut( ptEnd, vtEnd, vtExtr, pRCrv, bSplitArcs, false, ptP1, dEndElev, false)) {
|
||||
if ( ! AddLeadOut( ptEnd, vtEnd, vtExtr, pRCrv, bSplitArcs, false, ptP1, dEndElev, true)) {
|
||||
m_pMchMgr->SetLastError( 2416, "Error in Pocketing : LeadOut not computable") ;
|
||||
return false ;
|
||||
}
|
||||
//if ( ! m_bAboveHead)
|
||||
// dEndElev = max( dEndElev, j * dStep) ;
|
||||
// aggiungo retrazione
|
||||
if ( ! AddRetract( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dEndElev, dAppr)) {
|
||||
m_pMchMgr->SetLastError( 2417, "Error in Pocketing : Retract not computable") ;
|
||||
@@ -5089,7 +5096,6 @@ Pocketing::CalcSpiral( const ISurfFlatRegion* pSrfPock, int& nReg, Point3d& ptSt
|
||||
// caso spirale
|
||||
PtrOwner<ICurveComposite> pCrvBorder( GetCurveComposite( pSrfPock->GetLoop( 0, 0))) ;
|
||||
Point3d ptCen ; Vector3d vtN ; double dRad ; bool bCCW ;
|
||||
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvBorder->Clone()) ;
|
||||
if ( pCrvBorder->IsACircle( 100 * EPS_SMALL, ptCen, vtN, dRad, bCCW)) {
|
||||
double dIntRad = 0 ;
|
||||
if ( m_Params.m_nSubType == POCKET_SUB_SPIRALOUT && GetLeadInType() == POCKET_LI_HELIX) {
|
||||
@@ -5215,9 +5221,8 @@ Pocketing::CalcSpiral( const ISurfFlatRegion* pSrfPock, int& nReg, Point3d& ptSt
|
||||
|
||||
bool bSmallRad = ( nIter == 0 ? dOffs < dTRad + GetOffsR() + EPS_ZERO : dOffs < dTRad + EPS_ZERO) ;
|
||||
|
||||
if ( nChunks > 0) {
|
||||
if ( nChunks > 0)
|
||||
dOffs = GetSideStep() ;
|
||||
}
|
||||
else if ( ! bSmallRad) {
|
||||
pSrfAct.Set( pSrfPrec) ;
|
||||
dOffs = ( nIter == 0 ? dTRad + GetOffsR() : dTRad) ;
|
||||
@@ -8527,6 +8532,7 @@ Pocketing::GetParamOnOpenSide( const ICurveComposite* pCompo, const ICRVCOMPOPOV
|
||||
if ( pPrevCrv != nullptr && pPrevCrv->GetTempProp() == 1)
|
||||
pPrevCrv->GetLength( dLenPrev) ;
|
||||
const ICurve* pCrv = pCompo->GetFirstCurve() ;
|
||||
int nPriorityOpenEdge = -1 ;
|
||||
while ( pCrv != nullptr) {
|
||||
// analizzo la curva successiva
|
||||
const ICurve* pNextCrv = pCompo->GetNextCurve() ;
|
||||
@@ -8536,6 +8542,7 @@ Pocketing::GetParamOnOpenSide( const ICurveComposite* pCompo, const ICRVCOMPOPOV
|
||||
double dLenNext = 0 ;
|
||||
if ( pNextCrv != nullptr && pNextCrv->GetTempProp() == 1)
|
||||
pNextCrv->GetLength( dLenNext) ;
|
||||
++ nPriorityOpenEdge ;
|
||||
// verifico la curva corrente
|
||||
if ( pCrv->GetTempProp() == 1) {
|
||||
// contributo dalle entità adiacenti (se non tutte aperte)
|
||||
@@ -8586,6 +8593,8 @@ Pocketing::GetParamOnOpenSide( const ICurveComposite* pCompo, const ICRVCOMPOPOV
|
||||
pCompoClone->GetStartDir( vtMidOrt) ;
|
||||
vtMidOrt.Rotate( vtExtr, 0, -1) ;
|
||||
bFound = true ;
|
||||
if ( nPriorityOpenEdge == 0)
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
dLenPrev = dLen ;
|
||||
@@ -8797,12 +8806,27 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
|
||||
// assegno alle sue sottocurve la proprietà di curva aperta
|
||||
for ( int u = 0 ; u < pJCrv->GetCurveCount() ; ++ u)
|
||||
pJCrv->SetCurveTempProp( u, 1, 0) ;
|
||||
|
||||
// controllo se ci sono degli "overlap"
|
||||
bool bSucc = false ;
|
||||
PtrOwner<ICurveComposite> pNewCrv( CreateCurveComposite()) ;
|
||||
if ( ! CheckOpenEdgeOverlapParts( pJCrv, vpCrvs[i], true, bSucc, pNewCrv))
|
||||
return false ;
|
||||
if ( bSucc) { // se "overlap Trovato", modifico la vpCrvs[i]
|
||||
vpCrvs[i].Set( Release( pNewCrv)) ;
|
||||
}
|
||||
|
||||
// calcolo l'intersezione nel piano della svuotatura dell'amo con la curva aperta
|
||||
pJCrv->ToLoc( frPocket) ;
|
||||
vpCrvs[i]->ToLoc( frPocket) ;
|
||||
IntersCurveCurve intCC( *pJCrv, *vpCrvs[i]) ;
|
||||
pJCrv->ToGlob( frPocket) ;
|
||||
vpCrvs[i]->ToGlob( frPocket) ;
|
||||
|
||||
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pJCrv->Clone()) ;
|
||||
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, vpCrvs[i]->Clone()) ;
|
||||
|
||||
|
||||
// taglio opportunamente le curve
|
||||
bool bFound = false ;
|
||||
IntCrvCrvInfo aInfo ;
|
||||
@@ -8830,7 +8854,6 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
|
||||
}
|
||||
// se passo da aperto a chiuso
|
||||
else if ( bOpenPrev && ! bOpenCurr) {
|
||||
|
||||
// determino la curva ad amo
|
||||
Vector3d vtTg ; vpCrvs[i]->GetStartDir( vtTg) ;
|
||||
Vector3d vtOrt = vtTg ; vtOrt.Rotate( vtExtr, 0, 1) ;
|
||||
@@ -8859,15 +8882,37 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
|
||||
if ( pCompo->GetCurveCount() >= 2)
|
||||
pLCrv->AddCurve( pCompo->GetPrevCurve()->Clone(), false) ;
|
||||
double dUL = pLCrv->GetCurveCount() ;
|
||||
//const ICurveComposite* PCrvH( CloneCurveComposite( pCompo)) ;
|
||||
//for ( int u = 0 ; u < PCrvH->GetCurveCount() ; ++ u)
|
||||
// pLCrv->AddCurve( PCrvH->GetCurve(u)->Clone()) ;
|
||||
//double dUL = pLCrv->GetCurveCount() ;
|
||||
//int A = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pLCrv->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( A, AQUA) ;
|
||||
|
||||
// controllo se ci sono degli "overlap"
|
||||
bool bSucc = false ;
|
||||
PtrOwner<ICurveComposite> pNewCrv( CreateCurveComposite()) ;
|
||||
if ( ! CheckOpenEdgeOverlapParts( pJCrv, pLCrv, false, bSucc, pNewCrv))
|
||||
return false ;
|
||||
if ( bSucc) { // se "overlap Trovato", modifico la vpCrvs[i]
|
||||
pLCrv.Set( pNewCrv->Clone()) ;
|
||||
double dUS_tmp, dUE_tmp ;
|
||||
pCompo->GetDomain( dUS_tmp, dUE_tmp) ;
|
||||
if ( dUE_tmp >= 2) { // sempre ( ho sempre un pezzo di chiuso e il tratto aperto)
|
||||
pCompo->TrimEndAtParam( dUE_tmp - dUL) ;
|
||||
pCompo->AddCurve( pLCrv->Clone()) ;
|
||||
}
|
||||
}
|
||||
dUL = pLCrv->GetCurveCount() ;
|
||||
|
||||
pJCrv->ToLoc( frPocket) ;
|
||||
pLCrv->ToLoc( frPocket) ;
|
||||
IntersCurveCurve intCC( *pJCrv, *pLCrv) ;
|
||||
pJCrv->ToGlob( frPocket) ;
|
||||
pLCrv->ToGlob( frPocket) ;
|
||||
// taglio opportunamente le curve
|
||||
|
||||
// taglio opportunamente le curve
|
||||
|
||||
IntCrvCrvInfo aInfo ;
|
||||
if ( intCC.GetIntCrvCrvInfo( 0, aInfo) && !bInVsOut) {
|
||||
double dUs, dUe ; pCompo->GetDomain( dUs, dUe) ;
|
||||
@@ -8893,7 +8938,8 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
|
||||
}
|
||||
}
|
||||
// aggiungo la curva
|
||||
pCompo->AddCurve( ::Release( vpCrvs[i]), true, 10 * EPS_SMALL) ;
|
||||
//pCompo->AddCurve( ::Release( vpCrvs[i]), true, 10 * EPS_SMALL) ;
|
||||
pCompo->AddCurve( vpCrvs[i]->Clone(), true, 10 * EPS_SMALL) ;
|
||||
|
||||
//int p = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCompo->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( p, PURPLE) ;
|
||||
@@ -8908,6 +8954,110 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
|
||||
return true ;
|
||||
}
|
||||
|
||||
bool
|
||||
Pocketing::CheckOpenEdgeOverlapParts( const ICurve* pCrvJ, const ICurve* pCrvOffBorder, bool bCloseToOpen, bool& bSucc,
|
||||
ICurveComposite* pCrvFinal)
|
||||
{
|
||||
// controllo validità dei parametri
|
||||
if ( pCrvJ == nullptr || ! pCrvJ->IsValid() ||
|
||||
pCrvOffBorder == nullptr || ! pCrvOffBorder->IsValid() ||
|
||||
pCrvFinal == nullptr )
|
||||
return false ;
|
||||
bSucc = false ;
|
||||
pCrvFinal->Clear() ;
|
||||
|
||||
//int G = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvJ->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( G, GREEN) ;
|
||||
//int Gg = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvOffBorder->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( Gg, BLACK) ;
|
||||
|
||||
// converto la curva ad amo in curva composita
|
||||
PtrOwner<ICurveComposite> pCrvJ_Cut( ConvertCurveToComposite( pCrvJ->Clone())) ;
|
||||
if ( IsNull( pCrvJ_Cut) || ! pCrvJ_Cut->IsValid() || pCrvJ_Cut->GetCurveCount() == 0)
|
||||
return false ;
|
||||
|
||||
// parametri per taglio
|
||||
double dUTrim = EPS_SMALL ;
|
||||
Point3d ptCut, ptBase ;
|
||||
|
||||
// se passo da chiuso ad aperto
|
||||
if ( bCloseToOpen) {
|
||||
pCrvOffBorder->GetStartPoint( ptCut) ; // punto di Trim
|
||||
DistPointCurve DistPC( ptCut, *pCrvJ_Cut, true) ;
|
||||
double dDist = INFINITO ;
|
||||
// se distante esco...
|
||||
if ( ! DistPC.GetDist( dDist) || dDist > 200 * EPS_SMALL)
|
||||
return true ;
|
||||
// dato che il punto è molto vicino...
|
||||
if ( pCrvJ_Cut->GetParamAtPoint( ptCut, dUTrim, 200 * EPS_SMALL)) {
|
||||
// cerco il parametro sulla curva J e taglio la parte finale
|
||||
if ( ! pCrvJ_Cut->TrimEndAtParam( dUTrim))
|
||||
return true ;
|
||||
// punto finale della curva J ottenuta
|
||||
pCrvJ_Cut->GetEndPoint( ptBase) ;
|
||||
// ricavo il nuovo bordo esterno presso il lato aperto corrente
|
||||
// ( estendendolo all'inizio per trovare l'intersezione)
|
||||
if ( pCrvFinal->AddPoint( ptBase) &&
|
||||
pCrvFinal->AddLine( ptCut) &&
|
||||
pCrvFinal->ExtendStartByLen( 10) &&
|
||||
pCrvFinal->AddCurve( pCrvOffBorder->Clone())) {
|
||||
bSucc = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// se passo da aperto a chiuso
|
||||
else {
|
||||
pCrvOffBorder->GetEndPoint( ptCut) ; // punto di Trim
|
||||
DistPointCurve DistPC( ptCut, *pCrvJ_Cut, true) ;
|
||||
double dDist = INFINITO ;
|
||||
// se distante esco...
|
||||
if ( ! DistPC.GetDist( dDist) || dDist > 200 * EPS_SMALL)
|
||||
return true ;
|
||||
// dato che il punto è molto vicino...
|
||||
if ( pCrvJ_Cut->GetParamAtPoint( ptCut, dUTrim, 200 * EPS_SMALL)) {
|
||||
// cerco il parametro sulla curva J e taglio la parte iniziale
|
||||
if ( ! pCrvJ_Cut->TrimStartAtParam( dUTrim))
|
||||
return true ;
|
||||
// punto iniziale della curva J ottenuta
|
||||
pCrvJ_Cut->GetStartPoint( ptBase) ;
|
||||
// ricavo il nuovo bordo esterno presso il lato aperto corrente
|
||||
// ( estendendolo alla fine per trovare l'intersezione)
|
||||
if ( pCrvFinal->AddCurve( pCrvOffBorder->Clone()) &&
|
||||
pCrvFinal->AddLine( ptBase) &&
|
||||
pCrvFinal->ExtendEndByLen( 10))
|
||||
bSucc = true ;
|
||||
}
|
||||
}
|
||||
|
||||
// controllo che tutto sia andato a buon fine, altrimenti esco
|
||||
if ( bSucc == false)
|
||||
return true ;
|
||||
|
||||
// assegno le proprietà :
|
||||
// thickness
|
||||
double dThick = pCrvOffBorder->GetThickness( dThick) ;
|
||||
pCrvFinal->SetThickness( dThick) ;
|
||||
// estrusione
|
||||
Vector3d vtExtr ; pCrvOffBorder->GetExtrusion( vtExtr) ;
|
||||
pCrvFinal->SetExtrusion( vtExtr) ;
|
||||
// TmpProp0 + TmpProp1
|
||||
int nProp0 = pCrvOffBorder->GetTempProp( 0) ;
|
||||
pCrvFinal->SetTempProp( nProp0, 0) ;
|
||||
int nProp1 = pCrvOffBorder->GetTempProp( 1) ;
|
||||
pCrvFinal->SetTempProp( nProp1, 1) ;
|
||||
// Proprietà di sottocurve aperte
|
||||
for ( int u = 0 ; u < pCrvFinal->GetCurveCount() ; ++ u)
|
||||
pCrvFinal->SetCurveTempProp( u, 1, 0) ; // sottocurve tutte aperte
|
||||
|
||||
//int b = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvFinal->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( b, BLUE) ;
|
||||
|
||||
return true ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
bool
|
||||
Pocketing::AdustTmpPropLinesForProjection( ICurveComposite* pCompo)
|
||||
@@ -9049,9 +9199,6 @@ Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, cons
|
||||
if ( ! GetHomogeneousParts( pCrvCurrPartIn_, vCrvOpen, vCrvClose))
|
||||
return false ;
|
||||
|
||||
if ( pCompo->GetCurveCount() == 86)
|
||||
int a = 0 ;
|
||||
|
||||
for ( int t_Open = 0 ; t_Open < ( int)vCrvClose.size() ; ++ t_Open) {
|
||||
PtrOwner<ICurveComposite> pCrvCurrPartIn( CreateCurveComposite()) ;
|
||||
pCrvCurrPartIn->AddCurve( vCrvClose[t_Open]->Clone()) ;
|
||||
@@ -9121,7 +9268,37 @@ Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, cons
|
||||
if ( pSfrExpan->IsValid()) {
|
||||
if ( AreOppositeVectorApprox( pSfrExpan->GetNormVersor(), vtExtr))
|
||||
pSfrExpan->Invert() ;
|
||||
// ----------- AGGIORNAMENTO DELLA REGIONE DI INFLUENZA ----------
|
||||
PtrOwner<ISurfFlatRegion> pSfrInc_c( CloneSurfFlatRegion( pSfrInc)) ;
|
||||
if ( IsNull( pSfrInc_c))
|
||||
return false ;
|
||||
//int OOOOOO = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrInc_c->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( OOOOOO, BLACK) ;
|
||||
//int OOOOOOg = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrExpan->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( OOOOOOg, WHITE) ;
|
||||
|
||||
if ( pSfrInc_c->Subtract( *pSfrExpan)) {
|
||||
pSfrInc->Clear() ;
|
||||
for ( int cc = 0 ; cc < pSfrInc_c->GetChunkCount() ; ++ cc) {
|
||||
CRVCVECTOR ccClass_cc ;
|
||||
const ISurfFlatRegion* pSfrChunk_cc = pSfrInc_c->CloneChunk( cc) ;
|
||||
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrChunk_cc->Clone()) ;
|
||||
if ( pSfrChunk_cc->GetCurveClassification( *pCrvOpen, EPS_SMALL, ccClass_cc)) {
|
||||
for ( int jj = 0 ; jj < ( int)ccClass_cc.size() ; ++ jj) {
|
||||
if ( ccClass_cc[jj].nClass == CRVC_IN) {
|
||||
if ( IsNull( pSfrInc) || ! pSfrInc->IsValid())
|
||||
pSfrInc.Set( pSfrChunk_cc->Clone()) ;
|
||||
else
|
||||
pSfrInc->Add( *pSfrChunk_cc) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
pSfrInc->Add( *pSfrExpan) ;
|
||||
//int GRR = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrInc->Clone()) ;
|
||||
//m_pGeomDB->SetMaterial( GRR, GRAY) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9173,6 +9350,8 @@ Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, cons
|
||||
PtrOwner<ICurveComposite> pCrvNewBorder( GetCurveComposite( pSfrInc->GetLoop( 0, 0))) ;
|
||||
if ( IsNull( pCrvNewBorder))
|
||||
return false ;
|
||||
//int brown = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvNewBorder->Clone()) ; //
|
||||
//m_pGeomDB->SetMaterial( brown, LIME) ;
|
||||
|
||||
double dUSTART ;
|
||||
if ( ! pCrvNewBorder->GetParamAtPoint( ptSTART, dUSTART, 5000 * EPS_SMALL)) {
|
||||
@@ -9195,8 +9374,8 @@ Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, cons
|
||||
for ( int u = 0 ; u < pNewCrv->GetCurveCount() ; ++ u)
|
||||
pNewCrv->SetCurveTempProp( u, 1, 0) ;
|
||||
|
||||
//int P = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pNewCrv->Clone()) ; //
|
||||
//m_pGeomDB->SetMaterial( P, LIME) ;
|
||||
//int Ptttt = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pNewCrv->Clone()) ; //
|
||||
//m_pGeomDB->SetMaterial( Ptttt, LIME) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -10222,7 +10401,8 @@ Pocketing::IntersSurfWithRaw( ISurfFlatRegion* pSfrPock, const ISurfTriMesh* pSt
|
||||
if ( ! frPock.IsValid())
|
||||
return false ;
|
||||
pCrv->ToLoc( frPock) ;
|
||||
pCrv->ApproxWithArcsEx( 5 * EPS_SMALL, ANG_TOL_STD_DEG, LIN_FEA_STD, PA) ; // 500 * EPS_SMALL
|
||||
//pCrv->ApproxWithArcsEx( 5 * EPS_SMALL, ANG_TOL_STD_DEG, LIN_FEA_STD, PA) ; // 500 * EPS_SMALL
|
||||
pCrv->ApproxWithArcsEx( 0.5 , ANG_TOL_STD_DEG, LIN_FEA_STD, PA) ;
|
||||
pCrv->Clear() ;
|
||||
pCrv->FromPolyArc( PA) ;
|
||||
pCrv->ToGlob( frPock) ;
|
||||
@@ -10569,7 +10749,7 @@ Pocketing::GetStmRawPart( int nId, ISurfTriMesh* pSrfTMRaw, Frame3d frPocket)
|
||||
return false ;
|
||||
|
||||
// dall'indice della geometria da svuotare, recupero l'Id del gruppo Processing in cui mi trovo
|
||||
int nProcessingId = m_pGeomDB->GetParentId( nId) ;
|
||||
/*int nProcessingId = m_pGeomDB->GetParentId( nId) ;
|
||||
if ( nProcessingId != GDB_ID_NULL) {
|
||||
int nPartId = m_pGeomDB->GetParentId( nProcessingId) ;
|
||||
if ( nPartId != GDB_ID_NULL) {
|
||||
@@ -10592,37 +10772,37 @@ Pocketing::GetStmRawPart( int nId, ISurfTriMesh* pSrfTMRaw, Frame3d frPocket)
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
int nRawId = m_pMchMgr->GetFirstRawPart() ;
|
||||
|
||||
while ( nRawId != GDB_ID_NULL) {
|
||||
// verifico che il grezzo compaia nella fase
|
||||
if ( m_pMchMgr->VerifyRawPartPhase( nRawId, m_nPhase)) {
|
||||
// recupero l'oggetto dal database con tale Id
|
||||
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
|
||||
const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( nRawSolidId) ;
|
||||
// recupero il frame in cui si trova
|
||||
Frame3d frRaw ;
|
||||
m_pGeomDB->GetGlobFrame( nRawSolidId, frRaw) ;
|
||||
if ( pGObj == nullptr)
|
||||
return false ;
|
||||
// controllo che sia una Trimesh
|
||||
if ( pGObj->GetType() == SRF_TRIMESH) {
|
||||
// Trimesh della parte p-esima
|
||||
PtrOwner<ISurfTriMesh> pStmRawPart( CloneSurfTriMesh( GetSurfTriMesh( pGObj))) ;
|
||||
if ( IsNull( pStmRawPart))
|
||||
return false ;
|
||||
// porto la trimesh in globale
|
||||
pStmRawPart->LocToLoc( frRaw, frPocket) ;
|
||||
// lo aggiungo alla Trimesh complessiva
|
||||
pSrfTMRaw->Add( *Release( pStmRawPart)) ;
|
||||
}
|
||||
}
|
||||
// passo al grezzo successivo
|
||||
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
|
||||
}
|
||||
|
||||
//int nRawId = m_pMchMgr->GetFirstRawPart() ;
|
||||
|
||||
//while ( nRawId != GDB_ID_NULL) {
|
||||
// // verifico che il grezzo compaia nella fase
|
||||
// if ( m_pMchMgr->VerifyRawPartPhase( nRawId, m_nPhase)) {
|
||||
// // recupero l'oggetto dal database con tale Id
|
||||
// int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
|
||||
// const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( nRawSolidId) ;
|
||||
// // recupero il frame in cui si trova
|
||||
// Frame3d frRaw ;
|
||||
// m_pGeomDB->GetGlobFrame( nRawSolidId, frRaw) ;
|
||||
// if ( pGObj == nullptr)
|
||||
// return false ;
|
||||
// // controllo che sia una Trimesh
|
||||
// if ( pGObj->GetType() == SRF_TRIMESH) {
|
||||
// // Trimesh della parte p-esima
|
||||
// PtrOwner<ISurfTriMesh> pStmRawPart( CloneSurfTriMesh( GetSurfTriMesh( pGObj))) ;
|
||||
// if ( IsNull( pStmRawPart))
|
||||
// return false ;
|
||||
// // porto la trimesh in globale
|
||||
// pStmRawPart->LocToLoc( frRaw, frPocket) ;
|
||||
// // lo aggiungo alla Trimesh complessiva
|
||||
// pSrfTMRaw->Add( *Release( pStmRawPart)) ;
|
||||
// }
|
||||
// }
|
||||
// // passo al grezzo successivo
|
||||
// nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
|
||||
//}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -12014,7 +12194,7 @@ Pocketing::GetCoeffLinArc( const ICurveArc* pArc, double dDiam, double& dSubArc)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Pocketing::SetBetterPtStartForSubChunks( ICurveComposite* pCrvOffsAct, const ISurfFlatRegion* pSrfToWork, Point3d& ptStart,
|
||||
Pocketing::SetBetterPtStartForSubChunks( ICurveComposite* pCrvOffsAct, const ISurfFlatRegion* pSrfToWork, Point3d& ptStart,
|
||||
Vector3d& vtMidOut, bool& bMidOut, double dOffs)
|
||||
{
|
||||
// ============================= INFO ==============================================================
|
||||
@@ -12028,7 +12208,7 @@ Pocketing::SetBetterPtStartForSubChunks( ICurveComposite* pCrvOffsAct, const ISu
|
||||
pSrfToWork == nullptr || ! pSrfToWork->IsValid() || pSrfToWork->GetChunkCount() != 1)
|
||||
return false ;
|
||||
|
||||
// clono le curva su cui devo entrares
|
||||
// clono le curva su cui devo entrare
|
||||
PtrOwner<ICurveComposite> pCrv( CloneCurveComposite( pCrvOffsAct)) ;
|
||||
if ( IsNull( pCrv))
|
||||
return false ;
|
||||
@@ -12073,6 +12253,21 @@ Pocketing::SetBetterPtStartForSubChunks( ICurveComposite* pCrvOffsAct, const ISu
|
||||
pCrv->SetCurveTempProp( i, 1, 0) ; // <- tmp prop = 0
|
||||
}
|
||||
|
||||
// cambio il punto iniziale della curva all'inizio del lato aperto più lungo ( se presente)
|
||||
double dLenMax = EPS_SMALL ;
|
||||
int nCrvForMax = 0 ;
|
||||
if ( bSomeOpen) {
|
||||
for ( int u = 0 ; u < pCrv->GetCurveCount() ; ++ u) {
|
||||
int nTmpProp = 0 ;
|
||||
double dLenAct = EPS_SMALL ;
|
||||
if ( pCrv->GetCurveTempProp( u, nTmpProp, 0) && nTmpProp == 1 &&
|
||||
pCrv->GetCurve( u)->GetLength( dLenAct) && dLenAct > dLenMax) {
|
||||
dLenMax = dLenAct ;
|
||||
nCrvForMax = u ;
|
||||
}
|
||||
}
|
||||
pCrv->ChangeStartPoint( nCrvForMax) ;
|
||||
}
|
||||
|
||||
// creo un vettore con tutti i Loops della pSwfToWork per i quali, mediante l'Offset, non hanno
|
||||
// generato alcuna curva presente nella pCrv ( quella da cui devo entrare )
|
||||
|
||||
+4
-2
@@ -143,6 +143,8 @@ class Pocketing : public Machining
|
||||
const Point3d& ptCrvOpenE, const double dRad, const double dDiam,
|
||||
ICurveComposite* pNewCrv, const Vector3d& vtTrasl,
|
||||
ISurfTriMesh* pStmRaw = nullptr, bool bInVsOut = false) ;
|
||||
bool CheckOpenEdgeOverlapParts( const ICurve* pCrvJ, const ICurve* pCrvOffBorder, bool bCloseToOpen, bool& bSucc,
|
||||
ICurveComposite* pCrvFinal) ;
|
||||
bool AdjustContourStart( ICurveComposite* pCompo, const ICRVCOMPOPOVECTOR& vCrvIsl, bool bOrder = false) ;
|
||||
bool GetParamForPtStartOnEdge( const ICurve* pCrv, const ICurveComposite* pCompo, const ICRVCOMPOPOVECTOR& vCrvIsl,
|
||||
double& dPar) ;
|
||||
@@ -337,11 +339,11 @@ class Pocketing : public Machining
|
||||
bool m_bOpenOutRaw ; // flag forzatura lati aperti sempre fuori dal grezzo
|
||||
double m_dOpenMinSafe ; // minima distanza di sicurezza di attacco su lato aperto
|
||||
bool m_bIntersRaw = true ; // flag per intersezione con grezzo
|
||||
bool m_bProjectRaw = true ; // flag di proiezione del grezzo
|
||||
bool m_bProjectRaw = true ; // flag di proiezione del grezzo
|
||||
double m_dMaxLenRawProj = 100 ; // lunghezza massima per contatto di proiezione
|
||||
bool m_bOptOffset = true ; // flag per ottimizzazione numero di Offset necessari
|
||||
bool m_bOptOffsetCM = false ; // flag per ottimizzazione numero di Offset necessari con centroidi e medial Axis
|
||||
bool m_bAssignFeed = false ; // flag per controllo della Feed
|
||||
bool m_bAssignFeed = false ; // flag per controllo della Feed
|
||||
double m_dDiam_Prec = 0.0 ; // diametro utensile per precedente svuotatura
|
||||
double m_dOffsetR_Prec = 0.0 ; // offset radiale della svuotatura precedente
|
||||
double m_dSideStep_Prec = 0.0 ; // side Step della svuotatura precedente
|
||||
|
||||
Reference in New Issue
Block a user