From adf61b1ea1dfef90286811c839c8884b149cfeed Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 3 Dec 2019 20:01:43 +0000 Subject: [PATCH] EgtNesting 2.1l2 : - aggiunte nuove funzioni e fatte varie migliorie. --- AutoNester.cpp | 76 +++++++++++++++++++++++++++++++++++++++++-------- AutoNester.h | 19 ++++++++++--- EgtNesting.rc | Bin 11646 -> 11646 bytes 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/AutoNester.cpp b/AutoNester.cpp index 05f6a66..a7b26ae 100644 --- a/AutoNester.cpp +++ b/AutoNester.cpp @@ -57,7 +57,7 @@ GetCNSPath( const PolyArc& Outline, vector& vElem) // AutoNester //---------------------------------------------------------------------------- AutoNester::AutoNester( void) - : m_pOrder( nullptr), m_pComp( nullptr) + : m_pOrder( nullptr), m_pComp( nullptr), m_dInterpartGap( 0) { } @@ -81,6 +81,9 @@ AutoNester::Clear( void) m_pOrder = nullptr ; m_pComp = nullptr ; } + m_IdSheetPtr.clear() ; + m_IdPartPtr.clear() ; + m_dInterpartGap = 0 ; return true ; } @@ -99,7 +102,8 @@ AutoNester::AddSheet( int nSheetId, const PolyArc& Outline, double dKerf, int nP { if ( m_pOrder == nullptr) return false ; - if ( ! Outline.IsClosed()) + // verifico outline + if ( Outline.GetArcNbr() == 0 || ! Outline.IsClosed()) return false ; // aggiungo contorno vector vElem ; @@ -111,16 +115,39 @@ AutoNester::AddSheet( int nSheetId, const PolyArc& Outline, double dKerf, int nP CNS_SetSheetUserString( pSheet, ToString( nSheetId).c_str()) ; CNS_SetSheetPriority( pSheet, nPriority) ; CNS_SetNonRectangularSheetGaps( pSheet, dKerf, dKerf, dKerf, dKerf, dKerf) ; + // lo inserisco nel map + m_IdSheetPtr.emplace( nSheetId, pSheet) ; return true ; } //---------------------------------------------------------------------------- bool -AutoNester::AddPart( int nPartId, const PolyArc& Outline, const PolyArc& ToolOutline, - bool bCanFlip, bool bCanRotate, double dRotStep, int nPriority, int nCount) +AutoNester::AddDefectToSheet( int nSheetId, const PolyArc& Outline) { if ( m_pOrder == nullptr) return false ; + // verifico outline + if ( Outline.GetArcNbr() == 0 || ! Outline.IsClosed()) + return false ; + // cerco lo sheet + const auto Iter = m_IdSheetPtr.find( nSheetId) ; + if ( Iter == m_IdSheetPtr.end()) + return false ; + CNS_SheetPtr pSheet = Iter->second ; + // aggiungo difetto tramite suo contorno + vector vElem ; + GetCNSPath( Outline, vElem) ; + CNS_AddDefectToSheet( pSheet, int( vElem.size()), vElem.data()) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +AutoNester::AddPart( int nPartId, const PolyArc& Outline, bool bCanFlip, bool bCanRotate, double dRotStep, int nPriority, int nCount) +{ + if ( m_pOrder == nullptr) + return false ; + // verifico outline if ( Outline.GetArcNbr() == 0 || ! Outline.IsClosed()) return false ; // aggiungo contorno @@ -129,16 +156,33 @@ AutoNester::AddPart( int nPartId, const PolyArc& Outline, const PolyArc& ToolOut CNS_PartPtr pPart = CNS_AddPart( m_pOrder, nCount, int( vElem.size()), vElem.data()) ; if ( pPart == nullptr) return false ; - // eventuale contorno esterno del percorso utensili - if ( ToolOutline.GetArcNbr() > 0 && ToolOutline.IsClosed()) { - vector vTOl ; - GetCNSPath( ToolOutline, vTOl) ; - CNS_AddToolPathToPart( pPart, int( vTOl.size()), vTOl.data()) ; - } - // altri dati + // imposto altri dati CNS_SetPartUserString( pPart, ToString( nPartId).c_str()) ; CNS_SetPartAuthorizations( pPart, ( bCanFlip ? 1 : 0), ( bCanRotate ? 1 : 0), dRotStep) ; CNS_SetPartPriority( pPart, nPriority) ; + // lo inserisco nel map + m_IdPartPtr.emplace( nPartId, pPart) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +AutoNester::AddToolOutlineToPart( int nPartId, const PolyArc& ToolOutline) +{ + if ( m_pOrder == nullptr) + return false ; + // verifico outline + if ( ToolOutline.GetArcNbr() == 0 || ! ToolOutline.IsClosed()) + return false ; + // cerco il pezzo + const auto Iter = m_IdPartPtr.find( nPartId) ; + if ( Iter == m_IdPartPtr.end()) + return false ; + CNS_PartPtr pPart = Iter->second ; + // aggiungo contorno di lavorazione + vector vElem ; + GetCNSPath( ToolOutline, vElem) ; + CNS_AddToolPathToPart( pPart, int( vElem.size()), vElem.data()) ; return true ; } @@ -148,7 +192,7 @@ AutoNester::SetInterpartGap( double dGap) { if ( m_pOrder == nullptr) return false ; - CNS_SetInterpartGap( m_pOrder, dGap) ; + m_dInterpartGap = max( 0., dGap) ; return true ; } @@ -158,6 +202,14 @@ AutoNester::Compute( int nMaxTime) { if ( m_pOrder == nullptr) return false ; + // se necessario, imposto i gap ( di default sono a 0) + if ( m_dInterpartGap > 10 * EPS_SMALL) { + // gap tra i pezzi + CNS_SetInterpartGap( m_pOrder, m_dInterpartGap) ; + // gap sui difetti + for ( auto Iter = m_IdSheetPtr.begin() ; Iter != m_IdSheetPtr.end() ; ++ Iter) + CNS_SetDefectGap( Iter->second, m_dInterpartGap) ; + } // recupero i codici di sblocco del nesting string sKeyId, sKeySign ; SplitFirst( GetENsKey2(), "-", sKeyId, sKeySign) ; diff --git a/AutoNester.h b/AutoNester.h index 46589fa..3d79296 100644 --- a/AutoNester.h +++ b/AutoNester.h @@ -14,9 +14,12 @@ #pragma once #include "/EgtDev/Include/ENsAutoNester.h" +#include struct CNS_LaunchingOrder ; struct CNS_Computation ; +struct CNS_Sheet ; +struct CNS_Part ; //---------------------------------------------------------------------------- class AutoNester : public IAutoNester @@ -25,8 +28,9 @@ class AutoNester : public IAutoNester ~AutoNester( void) override ; bool Start( void) override ; bool AddSheet( int nSheetId, const PolyArc& Outline, double dKerf, int nPriority, int nCount) override ; - bool AddPart( int nPartId, const PolyArc& Outline, const PolyArc& ToolOutline, - bool bCanFlip, bool bCanRotate, double dRotStep, int nPriority, int nCount) override ; + bool AddDefectToSheet( int nSheetId, const PolyArc& Outline) override ; + bool AddPart( int nPartId, const PolyArc& Outline, bool bCanFlip, bool bCanRotate, double dRotStep, int nPriority, int nCount) override ; + bool AddToolOutlineToPart( int nPartId, const PolyArc& ToolOutline) override ; bool SetInterpartGap( double dGap) override ; bool Compute( int nMaxTime) override ; bool CancelComputation( void) override ; @@ -41,6 +45,13 @@ class AutoNester : public IAutoNester bool Clear( void) ; private : - CNS_LaunchingOrder* m_pOrder ; // ordine di esecuzione per OptaLog - CNS_Computation* m_pComp ; // calcolo di ottimizzazione + typedef std::unordered_map< int, CNS_Sheet*> IDSHEETPTR_UMAP ; + typedef std::unordered_map< int, CNS_Part*> IDPARTPTR_UMAP ; + + private : + CNS_LaunchingOrder* m_pOrder ; // ordine di esecuzione per OptaLog + CNS_Computation* m_pComp ; // calcolo di ottimizzazione + IDSHEETPTR_UMAP m_IdSheetPtr ; // map dei pannelli basato su identificativi + IDPARTPTR_UMAP m_IdPartPtr ; // map dei pannelli basato su identificativi + double m_dInterpartGap ; // distanza minima tra i pezzi } ; diff --git a/EgtNesting.rc b/EgtNesting.rc index 8290537a269ed50539b0e6884683ff11156c10a0..8a81426a715d224239068ff6763547ee53d4afcc 100644 GIT binary patch delta 97 zcmewt^)G6}A2vp#&41annHh~HPvp|w9LCke0v6fNG