EgtMachKernel :
- aggiunta gestione regioni come geometria sorgente in Milling, Pocketing e Chiseling - corretto controllo calcolo angoli con rinvio da sotto.
This commit is contained in:
+83
-14
@@ -833,7 +833,7 @@ Milling::GetGeometry( SELVECTOR& vIds) const
|
||||
bool
|
||||
Milling::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
{
|
||||
// ammessi : o curve o testi o facce di trimesh
|
||||
// ammessi : curve, testi, facce di trimesh o regioni
|
||||
const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( Id.nId) ;
|
||||
if ( pGObj == nullptr)
|
||||
return false ;
|
||||
@@ -844,21 +844,22 @@ Milling::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
// se direttamente la curva
|
||||
if ( Id.nSub == SEL_SUB_ALL) {
|
||||
pCurve = ::GetCurve( pGObj) ;
|
||||
if ( pCurve != nullptr) {
|
||||
if ( pCurve->GetType() == CRV_COMPO)
|
||||
nSubs = ::GetCurveComposite( pCurve)->GetCurveCount() ;
|
||||
else
|
||||
nSubs = 0 ;
|
||||
}
|
||||
if ( pCurve == nullptr)
|
||||
return false ;
|
||||
if ( pCurve->GetType() == CRV_COMPO)
|
||||
nSubs = ::GetCurveComposite( pCurve)->GetCurveCount() ;
|
||||
else
|
||||
nSubs = 0 ;
|
||||
}
|
||||
// altrimenti sottocurva di composita
|
||||
else {
|
||||
const ICurveComposite* pCompo = GetCurveComposite( pGObj) ;
|
||||
if ( pCompo != nullptr)
|
||||
pCurve = pCompo->GetCurve( Id.nSub) ;
|
||||
pCurve = ( pCompo != nullptr ? pCompo->GetCurve( Id.nSub) : nullptr) ;
|
||||
if ( pCurve == nullptr)
|
||||
return false ;
|
||||
nSubs = 0 ;
|
||||
}
|
||||
return ( pCurve != nullptr) ;
|
||||
return true ;
|
||||
}
|
||||
// se altrimenti ammessi testi ed è tale
|
||||
else if ( ( nType == GEO_NONE || nType == EXT_TEXT) && pGObj->GetType() == EXT_TEXT) {
|
||||
@@ -878,18 +879,39 @@ Milling::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
return false ;
|
||||
// se direttamente la superficie
|
||||
if ( Id.nSub == SEL_SUB_ALL) {
|
||||
nSubs = pSurf->GetFacetCount() ;
|
||||
return true ;
|
||||
// deve avere una sola faccia
|
||||
if ( pSurf->GetFacetCount() != 1)
|
||||
return false ;
|
||||
nSubs = 1 ;
|
||||
}
|
||||
// altrimenti faccia di superficie trimesh
|
||||
else {
|
||||
// se faccia non esistente
|
||||
if ( Id.nSub > pSurf->GetFacetCount())
|
||||
return false ;
|
||||
nSubs = 0 ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
// se altrimenti ammesse regioni ed è tale
|
||||
else if ( ( nType == GEO_NONE || nType == SRF_FLATRGN) && pGObj->GetType() == SRF_FLATRGN) {
|
||||
nType = SRF_FLATRGN ;
|
||||
const ISurfFlatRegion* pReg = ::GetSurfFlatRegion( pGObj) ;
|
||||
if ( pReg == nullptr)
|
||||
return false ;
|
||||
// se direttamente la regione
|
||||
if ( Id.nSub == SEL_SUB_ALL) {
|
||||
nSubs = pReg->GetChunkCount() ;
|
||||
}
|
||||
// altrimenti chunk di regione
|
||||
else {
|
||||
// se chunk non esistente
|
||||
if ( Id.nSub >= pReg->GetChunkCount())
|
||||
return false ;
|
||||
// tutto bene
|
||||
nSubs = 0 ;
|
||||
return true ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
@@ -900,7 +922,7 @@ Milling::VerifyGeometry( SelData Id, int& nSubs, int& nType)
|
||||
bool
|
||||
Milling::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
{
|
||||
// ammessi : curve, testi o facce di polymesh
|
||||
// ammessi : curve, testi, facce di trimesh o regioni
|
||||
const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( Id.nId) ;
|
||||
if ( pGObj == nullptr)
|
||||
return false ;
|
||||
@@ -1010,6 +1032,53 @@ Milling::GetCurves( SelData Id, ICURVEPLIST& lstPC)
|
||||
lstPC.emplace_back( Release( pCrvCompo)) ;
|
||||
return true ;
|
||||
}
|
||||
// se altrimenti regione
|
||||
else if ( pGObj->GetType() == SRF_FLATRGN) {
|
||||
// recupero la regione
|
||||
const ISurfFlatRegion* pReg = ::GetSurfFlatRegion( pGObj) ;
|
||||
if ( pReg == nullptr)
|
||||
return false ;
|
||||
// recupero la normale della regione
|
||||
Vector3d vtN = pReg->GetNormVersor() ;
|
||||
if ( vtN.IsSmall())
|
||||
return false ;
|
||||
// sistemazioni varie
|
||||
int nToolDir ;
|
||||
if ( ( m_Params.m_nFaceUse & 64) != 0)
|
||||
nToolDir = TOOL_ORTUP ;
|
||||
else if ( ( m_Params.m_nFaceUse & 32) != 0)
|
||||
nToolDir = TOOL_ORTHO ;
|
||||
else
|
||||
nToolDir = TOOL_PARAL ;
|
||||
int nFaceUse = ( m_Params.m_nFaceUse & 31) ;
|
||||
// determino intervallo di chunk
|
||||
int nCstart = 0 ;
|
||||
int nCend = pReg->GetChunkCount() ;
|
||||
if ( Id.nSub != SEL_SUB_ALL) {
|
||||
nCstart = Id.nSub ;
|
||||
nCend = nCstart + 1 ;
|
||||
}
|
||||
// ciclo sui chunk
|
||||
for ( int nC = nCstart ; nC < nCend ; ++ nC) {
|
||||
// recupero i contorni del chunk
|
||||
for ( int nL = 0 ; nL < pReg->GetLoopCount( nC) ; ++ nL) {
|
||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||
if ( IsNull( pCrvCompo) || ! pCrvCompo->AddCurve( pReg->GetLoop( nC, nL)))
|
||||
return false ;
|
||||
// assegno l'estrusione dalla normale alla regione
|
||||
pCrvCompo->SetExtrusion( vtN) ;
|
||||
// unisco le eventuali parti allineate
|
||||
pCrvCompo->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL) ;
|
||||
// la porto in globale
|
||||
pCrvCompo->ToGlob( frGlob) ;
|
||||
// sistemazioni varie
|
||||
AdjustCurveFromSurf( pCrvCompo, nToolDir, nFaceUse, m_TParams.m_dThick) ;
|
||||
// la restituisco
|
||||
lstPC.emplace_back( Release( pCrvCompo)) ;
|
||||
}
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
// altrimenti errore
|
||||
else
|
||||
return false ;
|
||||
|
||||
Reference in New Issue
Block a user