EgtExecutor 2.1c2 :

-aggiunta gestione lunghezza baffi adiacenti a lati inclinati per semplificare nesting con lati inclinati.
This commit is contained in:
Dario Sassi
2019-03-12 08:15:25 +00:00
parent d270ab77f9
commit e562ee96af
3 changed files with 106 additions and 57 deletions
+105 -56
View File
@@ -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 ;
+1 -1
View File
@@ -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) {
BIN
View File
Binary file not shown.