EgtGeomKernel :

- correzioni all'offset 3d.
This commit is contained in:
Daniele Bariletti
2026-06-22 12:00:24 +02:00
parent 96cb7e5cc3
commit 4cdcfe1b8b
+52 -25
View File
@@ -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) ;
}
}
}