EgtExchange :

- in BeamMgr aggiunto calcolo di tutti i solidi dei pezzi in multithread.
This commit is contained in:
Dario Sassi
2025-10-13 08:47:55 +02:00
parent 8d70d31eff
commit 1f24ff1dfb
2 changed files with 145 additions and 25 deletions
+143 -25
View File
@@ -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) ;
}
}
}
+2
View File
@@ -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 ;