From 918481ee671a6b18292e850f26e02da560550bdc Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 12 Sep 2025 10:16:47 +0200 Subject: [PATCH] EgtNesting 2.7i2 : - aggiunte funzioni per calcolo shear sequence. --- AutoNester.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++---- AutoNester.h | 7 +++- EgtNesting.rc | Bin 11638 -> 11638 bytes 3 files changed, 88 insertions(+), 7 deletions(-) diff --git a/AutoNester.cpp b/AutoNester.cpp index cc5d960..b121090 100644 --- a/AutoNester.cpp +++ b/AutoNester.cpp @@ -21,6 +21,7 @@ #include "/EgtDev/Extern/Optalog/Include/cns_tooling.h" #include "/EgtDev/Extern/Optalog/Include/cns_restricted_zone.h" #include "/EgtDev/Extern/Optalog/Include/cns_textile.h" +#include "/EgtDev/Extern/Optalog/Include/cns_shear_sequence.h" #include "/EgtDev/Extern/Optalog/Include/cns_egaltech.h" #include "/EgtDev/Include/SELkLockId.h" @@ -59,7 +60,7 @@ GetCNSPath( const PolyArc& Outline, double dOffsX, double dOffsY, vectorsecond.pSheet, m_dInterpartGap) ; } + // shear gap + if ( m_dShearGap > 10 * EPS_SMALL) + CNS_SetShearGap( m_pOrder, m_dShearGap) ; + // per evitare pezzi posti inutilmente di sghembo su ultimo pannello CNS_SetObjective( m_pOrder, ( bMinimizeOnXvsY ? CNS_IntelligentMinimizeX : CNS_IntelligentMinimizeY)) ; // recupero i codici di sblocco del nesting @@ -491,7 +509,7 @@ AutoNester::GetComputationStatus( int& nStatus) bool AutoNester::GetResults( double& dTotFillRatio, ANIVECT& vANI) { - // verifico validità calcolo + // verifico validità calcolo if ( m_pComp == nullptr) return false ; // recupero la soluzione @@ -537,11 +555,69 @@ AutoNester::GetResults( double& dTotFillRatio, ANIVECT& vANI) return true ; } +//---------------------------------------------------------------------------- +bool +AutoNester::CalcShearSequence( int nNesting, PNTVECTOR& vPtStart, PNTVECTOR& vPtEnd) +{ + vPtStart.clear() ; + vPtEnd.clear() ; + + // verifico se impostata modalità ghigliottina + if ( ! m_bGuillotine) + return false ; + // verifico vincolo con intergap tra i pezzi + if ( m_dShearGap < m_dInterpartGap - EPS_SMALL) + return false ; + // verifico validità calcolo + if ( m_pComp == nullptr) + return false ; + // recupero la soluzione + CNS_SolutionPtr pSol = CNS_GetSolution( m_pComp) ; + if ( pSol == nullptr) + return false ; + // recupero il nesting richiesto + int nNestCount = CNS_GetNumberOfNestings( pSol) ; + if ( nNesting < 0 || nNesting > nNestCount - 1) + return false ; + CNS_NestingPtr pNest = CNS_GetNesting( pSol, nNesting) ; + // recupero pannello + CNS_SheetPtr pSheet = CNS_GetSheet( pNest) ; + const char* szSheetId = CNS_GetSheetUserString( pSheet) ; + int nSheetId = 999 ; + if ( szSheetId != nullptr) + FromString( szSheetId, nSheetId) ; + const auto Iter = m_IdSheetInfo.find( nSheetId) ; + + // verifico vincolo con kerf del pannello + double dSheetKerf = ( Iter != m_IdSheetInfo.end() ? Iter->second.dKerf : 0) ; + if ( dSheetKerf > EPS_SMALL && m_dShearGap > dSheetKerf + EPS_SMALL) + return false ; + + // offset per origine pannello + double dOffsX = ( Iter != m_IdSheetInfo.end() ? Iter->second.dOffsX : 0) ; + double dOffsY = ( Iter != m_IdSheetInfo.end() ? Iter->second.dOffsY : 0) ; + + // calcolo shear sequence + CNS_ShearSequencePtr pShearSeq = CNS_ComputeShearSequence( pNest) ; + int nCnt = CNS_GetNumberOfElementsInShearSequence( pShearSeq) ; + vPtStart.reserve( nCnt) ; + vPtEnd.reserve( nCnt) ; + for ( int j = 0 ; j < nCnt ; j ++) { + double dStartX, dEndX, dStartY, dEndY ; + CNS_GetElementInShearSequence( pShearSeq, j, &dStartX, &dStartY, &dEndX, &dEndY) ; + vPtStart.emplace_back( dStartX + dOffsX, dStartY + dOffsY, 0) ; + vPtEnd.emplace_back( dEndX + dOffsX, dEndY + dOffsY, 0) ; + } + CNS_DeleteShearSequence( pShearSeq) ; + + return true ; +} + //---------------------------------------------------------------------------- bool AutoNester::PrintResults( const string& sHtmlFile) { - // verifico validità calcolo + // verifico validità calcolo if ( m_pComp == nullptr) return false ; // recupero la soluzione diff --git a/AutoNester.h b/AutoNester.h index f6df30e..28baba6 100644 --- a/AutoNester.h +++ b/AutoNester.h @@ -41,11 +41,13 @@ class AutoNester : public IAutoNester bool SetStripYconstraintToPart( int nPartId, const Point3d& ptRef, double dStripStart, double dStripRepeat) override ; bool SetStripXconstraintToPart( int nPartId, const Point3d& ptRef, double dStripStart, double dStripRepeat) override ; bool SetInterpartGap( double dGap) override ; + bool SetShearGap( double dShearGap) override ; bool SetReportFile( const std::string& sReportFile) override ; bool Compute( bool bMinimizeOnXvsY, int nMaxTime) override ; bool CancelComputation( void) override ; bool GetComputationStatus( int& nStatus) override ; bool GetResults( double& dTotFillRatio, ANIVECT& vANI) override ; + bool CalcShearSequence( int nNesting, std::vector& vPtStart, std::vector& vPtEnd) override ; bool PrintResults( const std::string& sHtmlFile) override ; public : @@ -59,7 +61,8 @@ class AutoNester : public IAutoNester CNS_Sheet* pSheet ; double dOffsX ; double dOffsY ; - SheetInfo( CNS_Sheet* pS, double dX, double dY) : pSheet( pS), dOffsX( dX), dOffsY( dY) {} + double dKerf ; + SheetInfo( CNS_Sheet* pS, double dX, double dY, double dKerf) : pSheet( pS), dOffsX( dX), dOffsY( dY), dKerf( dKerf) {} } ; typedef std::unordered_map< int, SheetInfo> IDSHEETINFO_UMAP ; typedef std::unordered_map< int, CNS_RestrictedZoneConstraint*> IDRZCSTRPTR_UMAP ; @@ -72,5 +75,7 @@ class AutoNester : public IAutoNester IDRZCSTRPTR_UMAP m_IdRzCstrPtr ; // map dei vincoli di zone ristrette basato su identificativi IDPARTPTR_UMAP m_IdPartPtr ; // map dei pezzi basato su identificativi double m_dInterpartGap ; // distanza minima tra i pezzi + double m_dShearGap ; + bool m_bGuillotine ; // flag per indicare se è impostata modalità a ghigliottina std::string m_sReportFile ; // file di report dei dati da inviare a Optalog in caso di problemi } ; diff --git a/EgtNesting.rc b/EgtNesting.rc index 47f32126e7e4d455679fea2cd5f404fa1478fe01..6ff81fc6289644d22229cc339268e286d1bd8781 100644 GIT binary patch delta 257 zcmews^(|_{I%aiGhCGIJh8%`ehGHOAV9;O)W+-7u1ma8}FBB-731Uxf)RLZjPc3V6 z9LpRgMx)KWa{HMk@8Zm1G@5KEsJod*%8POHJZ>{)u#`TKf(m;uZmtrxfC!`MXkfvj w*hu*qBMELgIJr+}-sDAUB7*r~w|j!!o&$7qBFM#?@2O2=#+2IJsP&Zz0M-{ntN;K2 delta 241 zcmews^(|_{I%aKGhCGIJh8%`WhGK>c1_cHUhESkLCPN8BDnkm89}HwAf_cT08?~f2 ze_&=~W;EP