EgtGeomKernel :
- miglioria nella creazione dell'offset 3d - aggiunta messaggio di errore nel log per le ruled guided.
This commit is contained in:
+98
-91
@@ -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) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -6946,14 +6946,18 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c
|
||||
if ( vIso[c].dParam0 < dLastParam0) {
|
||||
if ( dLastParam0 - vIso[c].dParam0 < EPS_ZERO)
|
||||
vIso[c].dParam0 = dLastParam0 + EPS_PARAM ;
|
||||
else
|
||||
else {
|
||||
LOG_DBG_ERR( GetEGkLogger(), "ERROR : Bezier Surface couldn't be created with the isocurves provided") ;
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
if ( vIso[c].dParam1 < dLastParam1) {
|
||||
if ( dLastParam1 - vIso[c].dParam1 < EPS_ZERO)
|
||||
vIso[c].dParam1 = dLastParam1 + EPS_PARAM ;
|
||||
else
|
||||
else {
|
||||
LOG_DBG_ERR( GetEGkLogger(), "ERROR : Bezier Surface couldn't be created with the isocurves provided") ;
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
dLastParam0 = vIso[c].dParam0 ;
|
||||
dLastParam1 = vIso[c].dParam1 ;
|
||||
|
||||
Reference in New Issue
Block a user