EgtExchange :
- in BeamMgr aggiunto calcolo di tutti i solidi dei pezzi in multithread.
This commit is contained in:
+143
-25
@@ -22,6 +22,7 @@
|
||||
#include "/EgtDev/Include/EgtKeyCodes.h"
|
||||
#include "/EgtDev/Include/EgtStringEncoder.h"
|
||||
#include "/EgtDev/Include/EgtPointerOwner.h"
|
||||
#include <future>
|
||||
|
||||
using namespace std ;
|
||||
|
||||
@@ -82,7 +83,7 @@ BeamMgr::SetFlag( int nFlag)
|
||||
int
|
||||
BeamMgr::CreatePart( void)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return GDB_ID_NULL ;
|
||||
// Aggiorno posizione
|
||||
@@ -95,7 +96,7 @@ BeamMgr::CreatePart( void)
|
||||
bool
|
||||
BeamMgr::SetPart( int nPartId)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Imposto il pezzo come corrente
|
||||
@@ -106,7 +107,7 @@ BeamMgr::SetPart( int nPartId)
|
||||
bool
|
||||
BeamMgr::ErasePart( void)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Cancello il pezzo corrente
|
||||
@@ -117,7 +118,7 @@ BeamMgr::ErasePart( void)
|
||||
bool
|
||||
BeamMgr::UpdatePart( void)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Forzo aggiornamento del pezzo corrente
|
||||
@@ -128,10 +129,10 @@ BeamMgr::UpdatePart( void)
|
||||
bool
|
||||
BeamMgr::SetPartProdNbr( int nProdNbr)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Verifico validità nuovo PDN
|
||||
// Verifico validità nuovo PDN
|
||||
if ( ! m_BtlGeom.VerifyNewPartProdNbr( nProdNbr))
|
||||
return false ;
|
||||
// Imposto il numero di produzione sul pezzo corrente
|
||||
@@ -142,7 +143,7 @@ BeamMgr::SetPartProdNbr( int nProdNbr)
|
||||
bool
|
||||
BeamMgr::SetPartName( const string& sName)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Imposto il nome sul pezzo corrente
|
||||
@@ -153,7 +154,7 @@ BeamMgr::SetPartName( const string& sName)
|
||||
bool
|
||||
BeamMgr::SetPartCount( int nCount)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Imposto il numero delle parti da produrre sul pezzo corrente
|
||||
@@ -164,7 +165,7 @@ BeamMgr::SetPartCount( int nCount)
|
||||
bool
|
||||
BeamMgr::SetPartBox( double dLength, double dHeight, double dWidth, bool bUpdate)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Imposto le dimensioni sul pezzo corrente
|
||||
@@ -185,10 +186,10 @@ BeamMgr::SetPartBox( double dLength, double dHeight, double dWidth, bool bUpdate
|
||||
bool
|
||||
BeamMgr::GetSideData( int nSide, Frame3d& frRef, double& dLength, double& dWidth, double& dHeight)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Verifico validità identificativo di faccia
|
||||
// Verifico validità identificativo di faccia
|
||||
if ( nSide < BTL_SIDE_FRONT || nSide > BTL_SIDE_RIGHT)
|
||||
return false ;
|
||||
// Recupero riferimento del pezzo corrente
|
||||
@@ -210,7 +211,7 @@ BeamMgr::GetSideData( int nSide, Frame3d& frRef, double& dLength, double& dWidth
|
||||
bool
|
||||
BeamMgr::ShowFacesName( bool bShow)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Verifico esistenza del pezzo corrente
|
||||
@@ -253,7 +254,7 @@ BeamMgr::ShowFacesName( bool bShow)
|
||||
// porto il testo nel piano della faccia
|
||||
Frame3d frRef = m_BtlGeom.GetSideFrame( nS) ;
|
||||
pText->ToGlob( frRef) ;
|
||||
// recupero eventuale nome già presente
|
||||
// recupero eventuale nome già presente
|
||||
int nOldTextId = m_pGDB->GetFirstNameInGroup( nFcsNameLayId, sFace) ;
|
||||
// se gia presente, lo rimpiazzo
|
||||
if ( nOldTextId != GDB_ID_NULL) {
|
||||
@@ -293,7 +294,7 @@ BeamMgr::UpdateFacesName( void)
|
||||
bool
|
||||
BeamMgr::ShowLoadingSide( bool bShow, bool bFromLeft)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Verifico esistenza del pezzo corrente
|
||||
@@ -363,7 +364,7 @@ BeamMgr::AddProcess( int nGroup, int nProc, int nSide, const string& sDes, int n
|
||||
const Frame3d& frRef, const DBLVECTOR& vdPar, const string& sPar, const STRVECTOR& vsUAtt,
|
||||
int nCrvId, int nCrv2Id, bool bUpdate)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return GDB_ID_NULL ;
|
||||
// Recupero i dati di default della feature
|
||||
@@ -415,7 +416,7 @@ BeamMgr::ModifyProcess( int nGeomId, int nGroup, int nProc, int nSide, const str
|
||||
const Frame3d& frRef, const DBLVECTOR& vdPar, const string& sPar, const STRVECTOR& vsUAtt,
|
||||
int nCrvId, int nCrv2Id, bool bUpdate)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return GDB_ID_NULL ;
|
||||
// Recupero il pezzo di appartenenza
|
||||
@@ -464,7 +465,7 @@ BeamMgr::ModifyProcess( int nGeomId, int nGroup, int nProc, int nSide, const str
|
||||
bool
|
||||
BeamMgr::EraseProcess( int nGeomId, bool bUpdate)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Recupero il pezzo di appartenenza
|
||||
@@ -528,7 +529,7 @@ MyEnableProcess( IGeomDB* pGDB, BtlGeom& BtlG, int nGeomId, bool bEnable)
|
||||
bool
|
||||
BeamMgr::EnableProcess( int nGeomId, bool bEnable, bool bUpdate)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Recupero il pezzo di appartenenza
|
||||
@@ -560,6 +561,113 @@ BeamMgr::EnableProcess( int nGeomId, bool bEnable, bool bUpdate)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
BeamMgr::CalcAllSolids( bool bShow, bool bRecalc, pcfProcEvents pFun)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
|
||||
// Recupero tutti i pezzi
|
||||
INTVECTOR vPartId ;
|
||||
int nPartId = m_pGDB->GetFirstGroupInGroup( GDB_ID_ROOT) ;
|
||||
while ( nPartId != GDB_ID_NULL) {
|
||||
int nLevel ;
|
||||
if ( m_pGDB->GetLevel( nPartId, nLevel) && nLevel == GDB_LV_USER &&
|
||||
m_pGDB->GetFirstNameInGroup( nPartId, BOX_LAYER_NAME) != GDB_ID_NULL) {
|
||||
vPartId.push_back( nPartId) ;
|
||||
// nascondo il layer del solido per non avere problemi con le visualizzazioni durante i calcoli in multithread
|
||||
m_pGDB->SetStatus( m_pGDB->GetFirstNameInGroup( nPartId, SOLID_LAYER_NAME), GDB_ST_OFF) ;
|
||||
}
|
||||
nPartId = m_pGDB->GetNextGroup( nPartId) ;
|
||||
}
|
||||
|
||||
// Calcolo i solidi
|
||||
bool bOk = true ;
|
||||
|
||||
constexpr bool MULTITHREAD = true ;
|
||||
if ( MULTITHREAD) {
|
||||
int nPartCnt = int( vPartId.size()) ;
|
||||
int nThreadMax = min( max( 1, int( thread::hardware_concurrency()) - 1), nPartCnt) ;
|
||||
vector< future<bool>> vRes( nPartCnt) ;
|
||||
INTVECTOR vInd( nThreadMax) ;
|
||||
// lancio tutto quanto possibile
|
||||
for ( int i = 0 ; i < nThreadMax ; ++ i) {
|
||||
vInd[i] = i ;
|
||||
vRes[vInd[i]] = async( launch::async, &BeamMgr::CalcSolid, this, vPartId[vInd[i]], bRecalc) ;
|
||||
}
|
||||
// attesa completamento e rilancio successivi (occupando sempre lo stesso numero di thread)
|
||||
int nNext = nThreadMax ;
|
||||
int nTerminated = 0 ;
|
||||
while ( nTerminated < nPartCnt) {
|
||||
for ( int i = 0 ; i < nThreadMax ; ++ i) {
|
||||
if ( vInd[i] >= 0 && vRes[vInd[i]].valid() && vRes[vInd[i]].wait_for( chrono::microseconds{ 1}) == future_status::ready) {
|
||||
++ nTerminated ;
|
||||
if ( ! vRes[vInd[i]].get())
|
||||
bOk = false ;
|
||||
ShowSolid( vPartId[vInd[i]], bShow) ;
|
||||
if ( pFun != nullptr)
|
||||
pFun( ( 100 * nTerminated) / nPartCnt, -1) ;
|
||||
if ( nNext < nPartCnt) {
|
||||
vInd[i] = nNext ;
|
||||
++ nNext ;
|
||||
vRes[vInd[i]] = async( launch::async, &BeamMgr::CalcSolid, this, vPartId[vInd[i]], bRecalc) ;
|
||||
}
|
||||
else
|
||||
vInd[i] = -1 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// non multithread solo per DEBUG
|
||||
else {
|
||||
int nPartCnt = int( vPartId.size()) ;
|
||||
for ( int i = 0 ; i < nPartCnt ; ++ i) {
|
||||
if ( ! CalcSolid( vPartId[i], bRecalc))
|
||||
bOk = false ;
|
||||
ShowSolid( vPartId[i], bShow) ;
|
||||
if ( pFun != nullptr)
|
||||
pFun( ( 100 * ( i + 1)) / nPartCnt, -1) ;
|
||||
}
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
BeamMgr::ShowAllSolids( bool bShow, pcfProcEvents pFun)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
|
||||
// Recupero tutti i pezzi
|
||||
INTVECTOR vPartId ;
|
||||
int nPartId = m_pGDB->GetFirstGroupInGroup( GDB_ID_ROOT) ;
|
||||
while ( nPartId != GDB_ID_NULL) {
|
||||
int nLevel ;
|
||||
if ( m_pGDB->GetLevel( nPartId, nLevel) && nLevel == GDB_LV_USER &&
|
||||
m_pGDB->GetFirstNameInGroup( nPartId, BOX_LAYER_NAME) != GDB_ID_NULL)
|
||||
vPartId.push_back( nPartId) ;
|
||||
nPartId = m_pGDB->GetNextGroup( nPartId) ;
|
||||
}
|
||||
|
||||
// Aggiorno visualizzazione dei solidi
|
||||
bool bOk = true ;
|
||||
int nPartCnt = int( vPartId.size()) ;
|
||||
for ( int i = 0 ; i < nPartCnt ; ++ i) {
|
||||
if ( ! ShowSolid( vPartId[i], bShow))
|
||||
bOk = false ;
|
||||
if ( pFun != nullptr)
|
||||
pFun( ( 100 * ( i + 1)) / nPartCnt, -1) ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static ISurfTriMesh*
|
||||
RegularizeTriMesh( const ISurfTriMesh* pStm, double dStep)
|
||||
@@ -671,7 +779,7 @@ IntersectOneFeature( int nProcId, int nTrim, double dStep, IGeomDB* pGDB, ISurfT
|
||||
bool
|
||||
BeamMgr::CalcSolid( int nPartId, bool bRecalc)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Verifico esistenza del pezzo
|
||||
@@ -689,6 +797,8 @@ BeamMgr::CalcSolid( int nPartId, bool bRecalc)
|
||||
m_pGDB->SetMaterial( nSolLayId, Color(255, 160, 32)) ;
|
||||
}
|
||||
int nSolidId = m_pGDB->GetFirstNameInGroup( nSolLayId, SOLID_SOLID_NAME) ;
|
||||
if ( ! m_pGDB->ExistsInfo( nSolidId, IKEY_VALID))
|
||||
bRecalc = true ;
|
||||
const ISurfTriMesh* pOldStm = GetSurfTriMesh( m_pGDB->GetGeoObj( nSolidId)) ;
|
||||
if ( pOldStm == nullptr || pOldStm->IsEmpty())
|
||||
bRecalc = true ;
|
||||
@@ -794,7 +904,7 @@ BeamMgr::CalcSolid( int nPartId, bool bRecalc)
|
||||
int
|
||||
BeamMgr::GetSolid( int nPartId) const
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Recupero layer del solido e Id del solido
|
||||
@@ -807,7 +917,7 @@ BeamMgr::GetSolid( int nPartId) const
|
||||
bool
|
||||
BeamMgr::ShowSolid( int nPartId, bool bShow)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
// Verifico esistenza del pezzo
|
||||
@@ -831,6 +941,10 @@ BeamMgr::ShowSolid( int nPartId, bool bShow)
|
||||
bool
|
||||
BeamMgr::GetBuildingIsOn( int nAssGrpId) const
|
||||
{
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
|
||||
// se gruppo di assemblaggio indicato lo verifico
|
||||
if ( nAssGrpId != GDB_ID_NULL) {
|
||||
string sAssName ;
|
||||
@@ -848,7 +962,7 @@ BeamMgr::GetBuildingIsOn( int nAssGrpId) const
|
||||
int nAssId = m_pGDB->GetFirstInGroup( nAssGrpId) ;
|
||||
if ( nAssId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// se contiene oggetti, assemblaggio è On
|
||||
// se contiene oggetti, assemblaggio è On
|
||||
return ( m_pGDB->GetGroupObjs( nAssId) > 0) ;
|
||||
}
|
||||
|
||||
@@ -856,6 +970,10 @@ BeamMgr::GetBuildingIsOn( int nAssGrpId) const
|
||||
bool
|
||||
BeamMgr::ShowBuilding( int nAssGrpId, bool bShow)
|
||||
{
|
||||
// Verifico validità GDB
|
||||
if ( m_pGDB == nullptr)
|
||||
return false ;
|
||||
|
||||
// se gruppo di assemblaggio indicato lo verifico
|
||||
if ( nAssGrpId != GDB_ID_NULL) {
|
||||
string sAssName ;
|
||||
@@ -881,7 +999,7 @@ BeamMgr::ShowBuilding( int nAssGrpId, bool bShow)
|
||||
if ( m_pGDB->GetInfo( nAssId, GDB_SI_SOURCE, nSouId)) {
|
||||
m_pGDB->SetMode( nSouId, GDB_MD_STD) ;
|
||||
m_pGDB->SetStatus( nSouId, GDB_ST_ON) ;
|
||||
// se già utilizzato, ne faccio una copia
|
||||
// se già utilizzato, ne faccio una copia
|
||||
if ( m_pGDB->GetParentId( nSouId) != GDB_ID_ROOT) {
|
||||
int nCopyId = m_pGDB->Copy( nSouId, GDB_ID_NULL, GDB_ID_ROOT) ;
|
||||
if ( nCopyId != GDB_ID_NULL) {
|
||||
@@ -892,7 +1010,7 @@ BeamMgr::ShowBuilding( int nAssGrpId, bool bShow)
|
||||
m_pGDB->SetInfo( nAssId, GDB_SI_SOURCE, nSouId) ;
|
||||
}
|
||||
}
|
||||
m_pGDB->SetStatus( m_pGDB->GetFirstNameInGroup( nSouId, BOX_LAYER_NAME), GDB_ST_OFF) ;
|
||||
m_pGDB->SetMode( m_pGDB->GetFirstNameInGroup( nSouId, BOX_LAYER_NAME), GDB_MD_HIDDEN) ;
|
||||
m_pGDB->GroupSwap( nSouId, nAssId, true, true) ;
|
||||
}
|
||||
}
|
||||
@@ -907,7 +1025,7 @@ BeamMgr::ShowBuilding( int nAssGrpId, bool bShow)
|
||||
m_pGDB->SetInfo( nBaseId, GDB_SI_SOURCE, nCopyId) ;
|
||||
}
|
||||
else {
|
||||
m_pGDB->SetStatus( m_pGDB->GetFirstNameInGroup( nAssId, BOX_LAYER_NAME), GDB_ST_ON) ;
|
||||
m_pGDB->SetMode( m_pGDB->GetFirstNameInGroup( nAssId, BOX_LAYER_NAME), GDB_MD_STD) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@ class BeamMgr : public IBeamMgr
|
||||
int nCrvId, int nCrv2Id, bool bUpdate = true) override ;
|
||||
bool EraseProcess( int nGeomId, bool bUpdate = true) override ;
|
||||
bool EnableProcess( int nGeomId, bool bEnable, bool bUpdate = true) override ;
|
||||
bool CalcAllSolids( bool bShow, bool bRecalc, pcfProcEvents pFun = nullptr) override ;
|
||||
bool ShowAllSolids( bool bShow, pcfProcEvents pFun = nullptr) override ;
|
||||
bool CalcSolid( int nPartId, bool bRecalc = false) override ;
|
||||
int GetSolid( int nPartId) const override ;
|
||||
bool ShowSolid( int nPartId, bool bShow) override ;
|
||||
|
||||
Reference in New Issue
Block a user