EgtExecutor 2.1c2 :
-aggiunta gestione lunghezza baffi adiacenti a lati inclinati per semplificare nesting con lati inclinati.
This commit is contained in:
+105
-56
@@ -873,8 +873,8 @@ ExeAdjustFlatPartLayer( int nLayerId)
|
||||
dAngDeg1 = - 1 ;
|
||||
}
|
||||
// Scrivo l'angolo nelle info delle curve
|
||||
pGeomDB->SetInfo( nId, MCH_PV_KEY_NEXTANG, dAngDeg1) ;
|
||||
pGeomDB->SetInfo( nCalcId, MCH_PV_KEY_PREVANG, dAngDeg2) ;
|
||||
pGeomDB->SetInfo( nId, MCH_KEY_NEXTANG, dAngDeg1) ;
|
||||
pGeomDB->SetInfo( nCalcId, MCH_KEY_PREVANG, dAngDeg2) ;
|
||||
}
|
||||
// Passo all'entità successiva
|
||||
nId = nNextId ;
|
||||
@@ -1041,6 +1041,31 @@ ExeUpdateFlatPartRegion( int nPartId, bool bCalc)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static bool
|
||||
AdjustLayerCurves( IGeomDB* pGeomDB, int nLayId)
|
||||
{
|
||||
// aggiusto tra loro le entità curve del layer
|
||||
int nFirstCrvId = pGeomDB->GetFirstInGroup( nLayId) ;
|
||||
ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nFirstCrvId)) ;
|
||||
int nNextCrvId = pGeomDB->GetNext( nFirstCrvId) ;
|
||||
ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nNextCrvId)) ;
|
||||
while ( nNextCrvId != GDB_ID_NULL) {
|
||||
// sistemo le curve
|
||||
pCrv2 = GetCurve( pGeomDB->GetGeoObj( nNextCrvId)) ;
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr || ! AdjustCurves( pCrv1, pCrv2))
|
||||
return false ;
|
||||
// passo alla successiva
|
||||
pCrv1 = pCrv2 ;
|
||||
nNextCrvId = pGeomDB->GetNext( nNextCrvId) ;
|
||||
}
|
||||
// anche prima e ultima
|
||||
pCrv2 = GetCurve( pGeomDB->GetGeoObj( nFirstCrvId)) ;
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr || ! AdjustCurves( pCrv1, pCrv2))
|
||||
return false ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
ExeCalcFlatPartUpRegion( int nPartId, bool bCalc)
|
||||
@@ -1105,23 +1130,8 @@ ExeCalcFlatPartUpRegion( int nPartId, bool bCalc)
|
||||
// passo alla successiva
|
||||
nCrvId = pGeomDB->GetNext( nCrvId) ;
|
||||
}
|
||||
// aggiusto tra loro le entità offsettate
|
||||
int nFirstCrvId = pGeomDB->GetFirstInGroup( nUpRegId) ;
|
||||
ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nFirstCrvId)) ;
|
||||
int nNextCrvId = pGeomDB->GetNext( nFirstCrvId) ;
|
||||
ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nNextCrvId)) ;
|
||||
while ( nNextCrvId != GDB_ID_NULL) {
|
||||
// sistemo le curve
|
||||
pCrv2 = GetCurve( pGeomDB->GetGeoObj( nNextCrvId)) ;
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr || ! AdjustCurves( pCrv1, pCrv2))
|
||||
return false ;
|
||||
// passo alla successiva
|
||||
pCrv1 = pCrv2 ;
|
||||
nNextCrvId = pGeomDB->GetNext( nNextCrvId) ;
|
||||
}
|
||||
// anche prima e ultima
|
||||
pCrv2 = GetCurve( pGeomDB->GetGeoObj( nFirstCrvId)) ;
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr || ! AdjustCurves( pCrv1, pCrv2))
|
||||
// aggiusto tra loro le curve offsettate (allungandole e/o accorciandole)
|
||||
if ( ! AdjustLayerCurves( pGeomDB, nUpRegId))
|
||||
return false ;
|
||||
|
||||
// creo la regione
|
||||
@@ -1191,10 +1201,12 @@ AdjustLayerForSideAngle( IGeomDB* pGeomDB, int nLayOrigId, const string& sLayOri
|
||||
return true ;
|
||||
}
|
||||
|
||||
// creo un layer temporaneo
|
||||
const string sTmpLayName = "TmpLay" ;
|
||||
// recupero il riferimento del layer
|
||||
Frame3d frLay ;
|
||||
pGeomDB->GetGroupFrame( nLayId, frLay) ;
|
||||
|
||||
// creo un primo layer temporaneo (sotto)
|
||||
const string sTmpLayName = "TmpLay" ;
|
||||
int nTmpLayId = pGeomDB->AddGroup( GDB_ID_NULL, pGeomDB->GetParentId( nLayId), frLay) ;
|
||||
if ( nTmpLayId == GDB_ID_NULL)
|
||||
return false ;
|
||||
@@ -1221,23 +1233,40 @@ AdjustLayerForSideAngle( IGeomDB* pGeomDB, int nLayOrigId, const string& sLayOri
|
||||
pCrv->SimpleOffset( dCalcOffset) ;
|
||||
}
|
||||
}
|
||||
// aggiusto tra loro le entità offsettate
|
||||
int nFirstCrvId = pGeomDB->GetFirstInGroup( nTmpLayId) ;
|
||||
ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nFirstCrvId)) ;
|
||||
int nNextCrvId = pGeomDB->GetNext( nFirstCrvId) ;
|
||||
ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nNextCrvId)) ;
|
||||
while ( nNextCrvId != GDB_ID_NULL) {
|
||||
// sistemo le curve
|
||||
pCrv2 = GetCurve( pGeomDB->GetGeoObj( nNextCrvId)) ;
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr || ! AdjustCurves( pCrv1, pCrv2))
|
||||
// aggiusto tra loro le curve offsettate (allungandole e/o accorciandole)
|
||||
if ( ! AdjustLayerCurves( pGeomDB, nTmpLayId))
|
||||
return false ;
|
||||
|
||||
// creo un secondo layer temporaneo (sopra)
|
||||
const string sTmpLay2Name = "TmpLay2" ;
|
||||
int nTmpLay2Id = pGeomDB->AddGroup( GDB_ID_NULL, pGeomDB->GetParentId( nLayId), frLay) ;
|
||||
if ( nTmpLay2Id == GDB_ID_NULL)
|
||||
return false ;
|
||||
pGeomDB->SetName( nTmpLay2Id, sTmpLay2Name) ;
|
||||
pGeomDB->SetLevel( nTmpLay2Id, GDB_LV_TEMP) ;
|
||||
|
||||
// copio le entità del contorno e le offsetto opportunamente
|
||||
for ( int nCrvId = pGeomDB->GetFirstInGroup( nLayId) ;
|
||||
nCrvId != GDB_ID_NULL ;
|
||||
nCrvId = pGeomDB->GetNext( nCrvId)) {
|
||||
// copio la curva nel gruppo temporaneo
|
||||
int nNewId = pGeomDB->CopyGlob( nCrvId, GDB_ID_NULL, nTmpLay2Id) ;
|
||||
if ( nNewId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// passo alla successiva
|
||||
pCrv1 = pCrv2 ;
|
||||
nNextCrvId = pGeomDB->GetNext( nNextCrvId) ;
|
||||
// determino ed eseguo offset
|
||||
double dSideAng ;
|
||||
if ( pGeomDB->GetInfo( nCrvId, NST_KEY_SIDEANG, dSideAng) && abs( dSideAng) > EPS_ANG_SMALL) {
|
||||
double dOffset = 0 ;
|
||||
pGeomDB->GetInfo( nCrvId, NST_KEY_OFFSET, dOffset) ;
|
||||
double dCalcOffset = dOffset ;
|
||||
ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nNewId)) ;
|
||||
if ( pCrv == nullptr)
|
||||
return false ;
|
||||
pCrv->SimpleOffset( dCalcOffset) ;
|
||||
}
|
||||
}
|
||||
// anche prima e ultima
|
||||
pCrv2 = GetCurve( pGeomDB->GetGeoObj( nFirstCrvId)) ;
|
||||
if ( pCrv1 == nullptr || pCrv2 == nullptr || ! AdjustCurves( pCrv1, pCrv2))
|
||||
// aggiusto tra loro le curve offsettate (allungandole e/o accorciandole)
|
||||
if ( ! AdjustLayerCurves( pGeomDB, nTmpLay2Id))
|
||||
return false ;
|
||||
|
||||
// eventuali allungamenti/accorciamenti per le curve del loop
|
||||
@@ -1248,56 +1277,75 @@ AdjustLayerForSideAngle( IGeomDB* pGeomDB, int nLayOrigId, const string& sLayOri
|
||||
string sName ;
|
||||
if ( ! pGeomDB->GetName( nCrvId, sName))
|
||||
continue ;
|
||||
// recupero curva con lo stesso nome nel gruppo della regione sotto
|
||||
// recupero curve con lo stesso nome nei gruppi delli regioni sotto e sopra
|
||||
int nCrvDrId = pGeomDB->GetFirstNameInGroup( nTmpLayId, sName) ;
|
||||
if ( nCrvDrId == GDB_ID_NULL)
|
||||
continue ;
|
||||
int nCrvUrId = pGeomDB->GetFirstNameInGroup( nTmpLay2Id, sName) ;
|
||||
// verifico siano curve
|
||||
ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCrvId)) ;
|
||||
ICurve* pCrvDr = GetCurve( pGeomDB->GetGeoObj( nCrvDrId)) ;
|
||||
if ( pCrv == nullptr || pCrvDr == nullptr)
|
||||
ICurve* pCrvUr = GetCurve( pGeomDB->GetGeoObj( nCrvUrId)) ;
|
||||
if ( pCrv == nullptr || pCrvDr == nullptr || pCrvUr == nullptr)
|
||||
continue ;
|
||||
// verifico se devo allungare o accorciare la curva all'inizio
|
||||
double dPrevAng = 0 ;
|
||||
pGeomDB->GetInfo( nCrvId, MCH_PV_KEY_PREVANG, dPrevAng) ;
|
||||
pGeomDB->GetInfo( nCrvId, MCH_KEY_PREVANG, dPrevAng) ;
|
||||
Point3d ptStart ;
|
||||
pCrv->GetStartPoint( ptStart) ;
|
||||
Vector3d vtStartDir ;
|
||||
pCrv->GetStartDir( vtStartDir) ;
|
||||
Point3d ptStartDr ;
|
||||
pCrvDr->GetStartPoint( ptStartDr) ;
|
||||
double dStartPro = - ( ( ptStartDr - ptStart) * vtStartDir) ;
|
||||
Point3d ptStartUr ;
|
||||
pCrvUr->GetStartPoint( ptStartUr) ;
|
||||
double dStartProD = - ( ( ptStartDr - ptStart) * vtStartDir) ;
|
||||
double dStartProU = - ( ( ptStartUr - ptStart) * vtStartDir) ;
|
||||
if ( dPrevAng > - EPS_ANG_SMALL) {
|
||||
if ( dStartPro > EPS_SMALL)
|
||||
pCrv->ExtendStartByLen( dStartPro) ;
|
||||
//if ( dStartProD > EPS_SMALL)
|
||||
// pCrv->ExtendStartByLen( dStartProD) ;
|
||||
double dStartProMin = min( dStartProD, dStartProU) ;
|
||||
if ( dStartProMin < - EPS_SMALL)
|
||||
pCrv->TrimStartAtLen( - dStartProMin) ;
|
||||
if ( abs( dStartProD - dStartProU) > EPS_SMALL)
|
||||
pGeomDB->SetInfo( nCrvId, MCH_KEY_START_WHISKEXT, abs( dStartProD - dStartProU)) ;
|
||||
}
|
||||
else {
|
||||
if ( dStartPro < - EPS_SMALL)
|
||||
pCrv->TrimStartAtLen( - dStartPro) ;
|
||||
if ( dStartProD < - EPS_SMALL)
|
||||
pCrv->TrimStartAtLen( - dStartProD) ;
|
||||
}
|
||||
// verifico se devo allungare la curva alla fine
|
||||
double dNextAng = 0 ;
|
||||
pGeomDB->GetInfo( nCrvId, MCH_PV_KEY_NEXTANG, dNextAng) ;
|
||||
pGeomDB->GetInfo( nCrvId, MCH_KEY_NEXTANG, dNextAng) ;
|
||||
Point3d ptEnd ;
|
||||
pCrv->GetEndPoint( ptEnd) ;
|
||||
Vector3d vtEndDir ;
|
||||
pCrv->GetEndDir( vtEndDir) ;
|
||||
Point3d ptEndDr ;
|
||||
pCrvDr->GetEndPoint( ptEndDr) ;
|
||||
double dEndPro = ( ptEndDr - ptEnd) * vtEndDir ;
|
||||
Point3d ptEndUr ;
|
||||
pCrvUr->GetEndPoint( ptEndUr) ;
|
||||
double dEndProD = ( ptEndDr - ptEnd) * vtEndDir ;
|
||||
double dEndProU = ( ptEndUr - ptEnd) * vtEndDir ;
|
||||
if ( dNextAng > - EPS_ANG_SMALL) {
|
||||
if ( dEndPro > EPS_SMALL)
|
||||
pCrv->ExtendEndByLen( dEndPro) ;
|
||||
}
|
||||
else {
|
||||
if ( dEndPro < - EPS_SMALL) {
|
||||
//if ( dEndProD > EPS_SMALL)
|
||||
// pCrv->ExtendEndByLen( dEndProD) ;
|
||||
double dEndProMin = min( dEndProD, dEndProU) ;
|
||||
if ( dEndProMin < - EPS_SMALL) {
|
||||
double dLen ;
|
||||
pCrv->GetLength( dLen) ;
|
||||
pCrv->TrimEndAtLen( dLen + dEndPro) ;
|
||||
pCrv->TrimEndAtLen( dLen + dEndProMin) ;
|
||||
}
|
||||
if ( abs( dEndProD - dEndProU) > EPS_SMALL)
|
||||
pGeomDB->SetInfo( nCrvId, MCH_KEY_END_WHISKEXT, abs( dEndProD - dEndProU)) ;
|
||||
}
|
||||
else {
|
||||
if ( dEndProD < - EPS_SMALL) {
|
||||
double dLen ;
|
||||
pCrv->GetLength( dLen) ;
|
||||
pCrv->TrimEndAtLen( dLen + dEndProD) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// concateno le curve del layer temporaneo
|
||||
// concateno le curve del primo layer temporaneo
|
||||
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
|
||||
if ( IsNull( pCompo))
|
||||
return false ;
|
||||
@@ -1310,8 +1358,9 @@ AdjustLayerForSideAngle( IGeomDB* pGeomDB, int nLayOrigId, const string& sLayOri
|
||||
else
|
||||
pGeomDB->Erase( nCrvId) ;
|
||||
}
|
||||
// cancello il layer temporaneo
|
||||
// cancello i layer temporanei
|
||||
pGeomDB->Erase( nTmpLayId) ;
|
||||
pGeomDB->Erase( nTmpLay2Id) ;
|
||||
// inserisco la curva concatenata nel layer della regione
|
||||
if ( pGeomDB->AddGeoObj( GDB_ID_NULL, nLayReg, Release( pCompo)) == GDB_ID_NULL)
|
||||
return false ;
|
||||
|
||||
@@ -1147,7 +1147,7 @@ static SCollInfoEx s_scInfoSaved ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static double
|
||||
UpdateCollId( double dLen, double dPrevLen, int nId1, int nId2, bool bIsCut1, bool bIsCut2, SCollInfo scInfoCurr)
|
||||
UpdateCollId( double dLen, double dPrevLen, int nId1, int nId2, bool bIsCut1, bool bIsCut2, const SCollInfo& scInfoCurr)
|
||||
{
|
||||
if ( abs( dLen - dPrevLen) < EPS_SMALL) {
|
||||
if ( scInfoCurr.nType == SCI_PNT_LINE || scInfoCurr.nType == SCI_LINE_LINE) {
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user