diff --git a/EXE_NstCreateFlatParts.cpp b/EXE_NstCreateFlatParts.cpp index 5b8073b..3abbb0d 100644 --- a/EXE_NstCreateFlatParts.cpp +++ b/EXE_NstCreateFlatParts.cpp @@ -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 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 ; diff --git a/EXE_NstPartNesting.cpp b/EXE_NstPartNesting.cpp index ee5976d..137f129 100644 --- a/EXE_NstPartNesting.cpp +++ b/EXE_NstPartNesting.cpp @@ -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) { diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 4e9bb5e..93945d5 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ