EgtGeomKernel :

- miglioria nella creazione dell'offset 3d
- aggiunta messaggio di errore nel log per le ruled guided.
This commit is contained in:
Daniele Bariletti
2026-06-23 15:08:40 +02:00
parent 4cdcfe1b8b
commit 0c7f3d5fd8
2 changed files with 104 additions and 93 deletions
+98 -91
View File
@@ -445,7 +445,7 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
// controllo tutto i punti
bool bErasedSomePart = false ;
bool bCheckStart = false ;
INTINTVECTOR vInters ;
vector<INTINTVECTOR> vEditZones ;
for ( int j = 0 ; j < ssize( vLines) ; ++j) {
Point3d ptStart, ptEnd ;
const ICurve* pSubCrv = vOffsetCrvs[vLines[j]].pCrv ;
@@ -468,19 +468,21 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
bErasedSomePart = true ;
if ( ! bStartInsideCyl)
bCheckStart = true ;
// se avevo un'interruzione nella zona da modificare, la colmo
if ( ! vInters.empty() && vInters.back().first != vLines[j-1]) {
// aggiungo tutti i precedenti che mancano
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.emplace_back( vLines[j], j) ;
//// se avevo un'interruzione nella zona da modificare, la colmo
//if ( ! vInters.empty() && vInters.back().first != vLines[j-1]) {
// // aggiungo tutti i precedenti che mancano
// 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 ;
// }
//}
if ( vEditZones.empty() || vEditZones.back().back().first != vLines[j-1])
vEditZones.emplace_back() ;
vEditZones.back().emplace_back( vLines[j], j) ;
if ( ! bStartInsideCyl && j < ssize( vLines) - 1) {
vInters.emplace_back( vLines[j+1], j + 1) ;
vEditZones.back().emplace_back( vLines[j+1], j + 1) ;
++j ;
}
break ;
@@ -492,95 +494,100 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v
}
}
if ( bErasedSomePart) {
//// controllo che effettivamente tutti i tratti cancellati siano consecutivi
//for ( int j = 1 ; j < ssize( vInters) ; ++j) {
// if ( vInters[j].first != vInters[j-1].first + 1)
// return false ;
//}
// 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].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].first, EditCrvInfo::DEL) ;
for ( int z = 0 ; z < ssize( vEditZones) ; ++z) {
INTINTVECTOR& vInters = vEditZones[z] ;
if ( ssize( vInters) == 1)
continue ;
}
// per il primo e ultimo controllo le intersezioni con tutti i cilindri
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].second == k)
for ( int j = 0 ; j < ssize( vInters) ; ++j) {
// cancello i tratti intermedi
if ( j > 0 && j < ssize( vInters) - 1) {
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::DEL) ;
continue ;
Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ;
double dU1, dU2 ;
Vector3d vtN1, vtN2 ;
if ( IntersLineCyl( ptStart, vtStart * dLen, vCyl[k].frCyl, vCyl[k].dH, vCyl[k].dRad, false, false, dU1, ptInt1, vtN1, dU2, ptInt2, vtN2, true)) {
bool bUpdate = ( j == 0 ? dU1 < dUTrim : dU1 > dUTrim) ;
bUpdate = bUpdate && ptInt1.IsValid() && dU1 > 0 && dU1 < 1 ;
bUpdate = bUpdate && vtN1 * vtStart < 0 ;
if ( bUpdate) {
dUTrim = dU1 ;
ptTrim = ptInt1 ;
}
bUpdate = ( j == 0 ? dU2 < dUTrim : dU2 > dUTrim) ;
bUpdate = bUpdate && ptInt2.IsValid() && dU2 > 0 && dU2 < 1 ;
bUpdate = bUpdate && vtN2 * vtStart > 0 ;
if ( bUpdate) {
dUTrim = dU2 ;
ptTrim = ptInt2 ;
}
// per il primo e ultimo controllo le intersezioni con tutti i cilindri
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].second == k)
continue ;
Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ;
double dU1, dU2 ;
Vector3d vtN1, vtN2 ;
if ( IntersLineCyl( ptStart, vtStart * dLen, vCyl[k].frCyl, vCyl[k].dH, vCyl[k].dRad, false, false, dU1, ptInt1, vtN1, dU2, ptInt2, vtN2, true)) {
bool bUpdate = ( j == 0 ? dU1 < dUTrim : dU1 > dUTrim) ;
bUpdate = bUpdate && ptInt1.IsValid() && dU1 > 0 && dU1 < 1 ;
bUpdate = bUpdate && vtN1 * vtStart < 0 ;
if ( bUpdate) {
dUTrim = dU1 ;
ptTrim = ptInt1 ;
}
bUpdate = ( j == 0 ? dU2 < dUTrim : dU2 > dUTrim) ;
bUpdate = bUpdate && ptInt2.IsValid() && dU2 > 0 && dU2 < 1 ;
bUpdate = bUpdate && vtN2 * vtStart > 0 ;
if ( bUpdate) {
dUTrim = dU2 ;
ptTrim = ptInt2 ;
}
}
}
}
if ( j == 0) {
if ( ptTrim.IsValid()) {
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 ;
vEditInfo.end()[-c].nFlag = EditCrvInfo::EDIT ;
vEditInfo.end()[-c].ptEnd = ptTrim ;
vEditInfo.emplace_back( nPrev + 1, EditCrvInfo::DEL) ;
}
else
vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, ptTrim) ;
}
else
vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
}
else {
if ( ptTrim.IsValid()) {
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))
++c ;
if ( vEditInfo.end()[-c].nId == nNext) {
if ( j == 0) {
if ( ptTrim.IsValid()) {
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 ;
vEditInfo.end()[-c].nFlag = EditCrvInfo::EDIT ;
vEditInfo.end()[-c].ptStart = ptTrim ;
vEditInfo.end()[-c].ptEnd = ptTrim ;
vEditInfo.emplace_back( nPrev + 1, EditCrvInfo::DEL) ;
}
else
vEditInfo.emplace_back( nNext, EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, ptTrim) ;
}
else
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
}
else {
if ( ptTrim.IsValid()) {
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))
++c ;
if ( vEditInfo.end()[-c].nId == nNext) {
vEditInfo.end()[-c].nFlag = EditCrvInfo::EDIT ;
vEditInfo.end()[-c].ptStart = ptTrim ;
}
else
vEditInfo.emplace_back( nNext, EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
}
else
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, ptTrim, P_INVALID) ;
}
else
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
}
else
vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ;
}
}
}