EgtGeomKernel :
- correzioni all'offset 3d.
This commit is contained in:
+52
-25
@@ -258,6 +258,7 @@ OffsetCurve3d::Make( const PolyLine& PL, const VCT3DVECTOR& vOffDir, double dOff
|
||||
vOffsetCrvs[vEditInfo[i].nId].pCrv->ModifyStart( vEditInfo[i].ptStart) ;
|
||||
if ( vEditInfo[i].ptEnd.IsValid())
|
||||
vOffsetCrvs[vEditInfo[i].nId].pCrv->ModifyEnd( vEditInfo[i].ptEnd) ;
|
||||
vOffsetCrvs[vEditInfo[i].nId].nParent = -2 ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -279,7 +280,9 @@ OffsetCurve3d::Make( const PolyLine& PL, const VCT3DVECTOR& vOffDir, double dOff
|
||||
#if SAVEOFFSET
|
||||
for ( int i = 0 ; i < ssize( vOffsetCrvs) ; ++i) {
|
||||
vGeo.push_back( vOffsetCrvs[i].pCrv->Clone()) ;
|
||||
if ( vOffsetCrvs[i].nFlag == OffsetCurve3d::AngType::ANG_SMOOTH_CONC)
|
||||
if ( vOffsetCrvs[i].nParent == -2)
|
||||
vCol.push_back( LIME) ;
|
||||
else if ( vOffsetCrvs[i].nFlag == OffsetCurve3d::AngType::ANG_SMOOTH_CONC)
|
||||
vCol.push_back( GREEN) ;
|
||||
else if ( vOffsetCrvs[i].nFlag == OffsetCurve3d::AngType::ANG_STR)
|
||||
vCol.push_back( PURPLE) ;
|
||||
@@ -408,6 +411,7 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
Point3d ptStart, ptEnd ;
|
||||
pSubCrv->GetStartPoint( ptStart) ;
|
||||
pSubCrv->GetEndPoint( ptEnd) ;
|
||||
////////// cilindri con asse sul parent
|
||||
Vector3d vtHeight = ptEnd - ptStart ;
|
||||
double dHeight = vtHeight.Len() ;
|
||||
vtHeight.Normalize() ;
|
||||
@@ -418,13 +422,30 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
vGeo.push_back( pSurfTm) ;
|
||||
vCol.push_back( LGRAY) ;
|
||||
#endif
|
||||
|
||||
// //// cilindri con la direz offset
|
||||
// Point3d ptOffEnd ; vOffsetCrvs[vLines[j]].pCrv->GetEndPoint( ptOffEnd) ;
|
||||
// Vector3d vtOff = ptOffEnd - ptEnd ; vtOff.Normalize() ;
|
||||
// Vector3d vtHeight = ptEnd - ptStart ;
|
||||
// double dHeight = vtHeight.Len() ;
|
||||
// Vector3d vtNewAxis = OrthoCompo( vtHeight, vtOff) ;
|
||||
// vtHeight.Normalize() ;
|
||||
// vtNewAxis.Normalize() ;
|
||||
// Point3d ptStartCyl = ptEnd -vtNewAxis * dHeight ;
|
||||
// vCyl.emplace_back( ptStartCyl, vtNewAxis, dHeight, dRad, dLinTol) ;
|
||||
//#if SAVECYL
|
||||
// CurveArc ca ; ca.Set( vCyl.back().frCyl.Orig(), vCyl.back().frCyl.VersZ(), dRad) ;
|
||||
// ISurfTriMesh* pSurfTm = GetSurfTriMeshByExtrusion( &ca, vCyl.back().frCyl.VersZ() * dHeight, false, 2 * EPS_SMALL) ;
|
||||
// vGeo.push_back( pSurfTm) ;
|
||||
// vCol.push_back( LGRAY) ;
|
||||
//#endif
|
||||
}
|
||||
|
||||
// controllo l'end di ogni linea per verificare se sta nel cilindro definito da uno degli altri tratti
|
||||
// controllo tutto i punti
|
||||
bool bErasedSomePart = false ;
|
||||
bool bCheckStart = false ;
|
||||
INTVECTOR vInters ;
|
||||
INTINTVECTOR vInters ;
|
||||
for ( int j = 0 ; j < ssize( vLines) ; ++j) {
|
||||
Point3d ptStart, ptEnd ;
|
||||
const ICurve* pSubCrv = vOffsetCrvs[vLines[j]].pCrv ;
|
||||
@@ -448,16 +469,18 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
if ( ! bStartInsideCyl)
|
||||
bCheckStart = true ;
|
||||
// se avevo un'interruzione nella zona da modificare, la colmo
|
||||
if ( ! vInters.empty() && vInters.back() != vLines[j-1]) {
|
||||
if ( ! vInters.empty() && vInters.back().first != vLines[j-1]) {
|
||||
// aggiungo tutti i precedenti che mancano
|
||||
for ( int h = vInters.back() + 1 ; h < vLines[j] ; ++h) {
|
||||
vInters.push_back( h) ;
|
||||
int z = vInters.back().second ;
|
||||
for ( int h = vInters.back().first + 1 ; h < vLines[j] ; ++h) {
|
||||
vInters.emplace_back( h, z) ;
|
||||
vEditInfo.pop_back() ;
|
||||
++z ;
|
||||
}
|
||||
}
|
||||
vInters.push_back( vLines[j]) ;
|
||||
vInters.emplace_back( vLines[j], j) ;
|
||||
if ( ! bStartInsideCyl && j < ssize( vLines) - 1) {
|
||||
vInters.push_back( vLines[j+1]) ;
|
||||
vInters.emplace_back( vLines[j+1], j + 1) ;
|
||||
++j ;
|
||||
}
|
||||
break ;
|
||||
@@ -472,24 +495,24 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
// calcolo le intersezioni effettive del primo e ultimo tratto cancellati con i cilindri che li hanno cancellati
|
||||
// controllo che effettivamente tutti i tratti cancellati siano consecutivi
|
||||
for ( int j = 1 ; j < ssize( vInters) ; ++j) {
|
||||
if ( vInters[j] != vInters[j-1] + 1)
|
||||
if ( vInters[j].first != vInters[j-1].first + 1)
|
||||
return false ;
|
||||
}
|
||||
for ( int j = 0 ; j < ssize( vInters) ; ++j) {
|
||||
// cancello i tratti intermedi
|
||||
if ( j > 0 && j < ssize( vInters) - 1) {
|
||||
vEditInfo.emplace_back( vInters[j], EditCrvInfo::DEL) ;
|
||||
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::DEL) ;
|
||||
continue ;
|
||||
}
|
||||
// per il primo e ultimo controllo le intersezioni con tutti i cilindri
|
||||
PtrOwner<ICurve> pCL ( vOffsetCrvs[vInters[j]].pCrv->Clone()) ;
|
||||
PtrOwner<ICurve> pCL ( vOffsetCrvs[vInters[j].first].pCrv->Clone()) ;
|
||||
Point3d ptStart ; pCL->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStart ; pCL->GetStartDir( vtStart) ;
|
||||
double dLen ; pCL->GetLength( dLen) ;
|
||||
double dUTrim = ( j == 0 ? INFINITO : 0) ;
|
||||
Point3d ptTrim = P_INVALID ;
|
||||
for ( int k = 0 ; k < ssize( vCyl) ; ++k) {
|
||||
if ( vInters[j] == k)
|
||||
if ( vInters[j].second == k)
|
||||
continue ;
|
||||
Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ;
|
||||
double dU1, dU2 ;
|
||||
@@ -513,11 +536,13 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
}
|
||||
if ( j == 0) {
|
||||
if ( ptTrim.IsValid()) {
|
||||
pCL->ModifyEnd( ptTrim) ;
|
||||
double dNewLen ; pCL->GetLength( dNewLen) ;
|
||||
if ( dNewLen < 0.1 && vInters[0] != 0) { // se fosse il primo allora potrei modificare il successivo
|
||||
int nPrev = vInters[0] - 1 ;
|
||||
vInters[0] = nPrev ;
|
||||
bool bOk = pCL->ModifyEnd( ptTrim) ;
|
||||
double dNewLen ;
|
||||
if ( bOk)
|
||||
pCL->GetLength( dNewLen) ;
|
||||
if ( ( ! bOk || dNewLen < 0.1) && vInters[0].first != 0) { // se fosse il primo allora potrei modificare il successivo
|
||||
int nPrev = vInters[0].first - 1 ;
|
||||
vInters[0].first = nPrev ;
|
||||
int c = 1 ;
|
||||
while( vEditInfo.end()[-c].nId != nPrev)
|
||||
++c ;
|
||||
@@ -526,18 +551,20 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
vEditInfo.emplace_back( nPrev + 1, EditCrvInfo::DEL) ;
|
||||
}
|
||||
else
|
||||
vEditInfo.emplace_back( vInters[0], EditCrvInfo::EDIT, P_INVALID, ptTrim) ;
|
||||
vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, ptTrim) ;
|
||||
}
|
||||
else
|
||||
vEditInfo.emplace_back( vInters[0], EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
|
||||
vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
|
||||
}
|
||||
else {
|
||||
if ( ptTrim.IsValid()) {
|
||||
pCL->ModifyStart( ptTrim) ;
|
||||
double dNewLen ; pCL->GetLength( dNewLen) ;
|
||||
if ( dNewLen < 0.1 && vInters[j] != ssize( vOffsetCrvs) - 1) { // se fosse l'ultima curva allora potrei modificare la precedente
|
||||
int nNext = vInters[j] + 1 ;
|
||||
vInters[j] = nNext ;
|
||||
bool bOk = pCL->ModifyStart( ptTrim) ;
|
||||
double dNewLen ;
|
||||
if ( bOk)
|
||||
pCL->GetLength( dNewLen) ;
|
||||
if ( ( ! bOk || dNewLen < 0.1) && vInters[j].first != ssize( vOffsetCrvs) - 1) { // se fosse l'ultima curva allora potrei modificare la precedente
|
||||
int nNext = vInters[j].first + 1 ;
|
||||
vInters[j].first = nNext ;
|
||||
vEditInfo.emplace_back( nNext - 1, EditCrvInfo::DEL) ;
|
||||
int c = 1 ;
|
||||
while ( vEditInfo.end()[-c].nId != nNext && c < ssize( vEditInfo))
|
||||
@@ -550,10 +577,10 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
|
||||
vEditInfo.emplace_back( nNext, EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
|
||||
}
|
||||
else
|
||||
vEditInfo.emplace_back( vInters[j], EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
|
||||
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
|
||||
}
|
||||
else
|
||||
vEditInfo.emplace_back( vInters[j], EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
|
||||
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user