EgtGeomKernel 1.6d6 :

- modifica radicale della gestione dei selezionati (ora lista parallela su oggetti di GDB).
This commit is contained in:
Dario Sassi
2015-04-25 20:32:37 +00:00
parent 1aaf135f2f
commit 950a2b90af
5 changed files with 68 additions and 51 deletions
BIN
View File
Binary file not shown.
+5 -5
View File
@@ -25,7 +25,7 @@ using namespace std ;
//----------------------------------------------------------------------------
GdbObj::GdbObj( void)
: m_nId( GDB_ID_NULL), m_pAttribs( nullptr),
: m_nId( GDB_ID_NULL), m_pAttribs( nullptr), m_pSelPrev( nullptr), m_pSelNext( nullptr),
m_pGDB( nullptr), m_pNext( nullptr), m_pPrev( nullptr), m_pParent( nullptr)
{
}
@@ -39,11 +39,11 @@ GdbObj::~GdbObj( void)
m_pAttribs = nullptr ;
// aggiorno managers del Db geometrico di appartenenza
if ( m_pGDB != nullptr) {
// elimino da mappa dei nomi
// elimino da mappa dei nomi
m_pGDB->m_IdManager.RemoveObj( m_nId) ;
// eliminazione eventuale da lista dei selezionati
m_pGDB->m_SelManager.RemoveObj( this) ;
// sistemazioni in eventuali GdbIterator con quell'oggetto corrente
// eventuale rimozione da lista selezionati
m_pGDB->m_SelManager.RemoveObj(this) ;
// sistemazioni in eventuali GdbIterator con quell'oggetto corrente
m_pGDB->m_IterManager.ResetObjIfSame( this) ;
}
m_pGDB = nullptr ;
+6
View File
@@ -29,6 +29,8 @@ class NgeReader ;
//----------------------------------------------------------------------------
class GdbObj
{
friend class SelManager ;
public :
virtual ~GdbObj( void) ;
virtual GdbObj* Clone( int nId) const = 0 ;
@@ -144,4 +146,8 @@ class GdbObj
GdbObj* m_pNext ;
GdbObj* m_pPrev ;
GdbGroup* m_pParent ;
private :
GdbObj* m_pSelNext ;
GdbObj* m_pSelPrev ;
} ;
-2
View File
@@ -86,8 +86,6 @@ GeomDB::Clear( void)
ClearSelection() ;
// disalloco i gruppi e gli oggetti
m_GrpRadix.Clear() ;
// pulisco lista dei selezionati
m_SelManager.Clear() ;
// pulisco mappa degli identificatori
m_IdManager.Clear() ;
// cancello i materiali custom
+57 -44
View File
@@ -14,70 +14,83 @@
#pragma once
#include <list>
class GdbObj ;
//----------------------------------------------------------------------------
typedef std::list<GdbObj*> PGDBO_LIST ;
//----------------------------------------------------------------------------
class SelManager
{
public :
SelManager( void)
{ m_Iter = m_SelList.end() ; }
void Clear( void)
{ m_SelList.clear() ;
m_Iter = m_SelList.end() ; }
: m_nCount( 0), m_pFirst( nullptr), m_pLast( nullptr), m_pCurr( nullptr) {}
int GetSize( void) const
{ return int ( m_SelList.size()) ; }
{ return m_nCount ; }
bool AddObj( GdbObj* pGObj)
{ if ( pGObj == nullptr)
return false ;
try { m_SelList.push_back( pGObj) ; }
catch (...) { return false ;}
if ( m_pLast == nullptr) {
m_pLast = pGObj ;
m_pFirst = pGObj ;
pGObj->m_pSelNext = nullptr ;
pGObj->m_pSelPrev = nullptr ;
}
else {
pGObj->m_pSelNext = nullptr ;
pGObj->m_pSelPrev = m_pLast ;
m_pLast->m_pSelNext = pGObj ;
m_pLast = pGObj ;
}
++ m_nCount ;
return true ; }
bool RemoveObj( GdbObj* pGObj)
{ PGDBO_LIST::iterator Iter ;
for ( Iter = m_SelList.begin() ; Iter != m_SelList.end() ; ++ Iter) {
if ( *Iter == pGObj) {
if ( Iter == m_Iter)
m_Iter = m_SelList.end() ;
m_SelList.erase( Iter) ;
return true ;
}
{ if ( pGObj == nullptr)
return false ;
if ( m_pCurr == pGObj)
m_pCurr = nullptr ;
if ( m_pFirst == pGObj && m_pLast == pGObj) {
m_pFirst = nullptr ;
m_pLast = nullptr ;
}
else if ( m_pFirst == pGObj) {
m_pFirst = pGObj->m_pSelNext ;
if ( m_pFirst != nullptr)
m_pFirst->m_pSelPrev = nullptr ;
}
else if ( m_pLast == pGObj) {
m_pLast = pGObj->m_pSelPrev ;
if ( m_pLast != nullptr)
m_pLast->m_pSelNext = nullptr ;
}
else {
if ( pGObj->m_pSelNext == nullptr && pGObj->m_pSelPrev == nullptr)
return false ;
if ( pGObj->m_pSelPrev != nullptr)
pGObj->m_pSelPrev->m_pSelNext = pGObj->m_pSelNext ;
if ( pGObj->m_pSelNext != nullptr)
pGObj->m_pSelNext->m_pSelPrev = pGObj->m_pSelPrev ;
}
pGObj->m_pSelNext = nullptr ;
pGObj->m_pSelPrev = nullptr ;
-- m_nCount ;
return true ; }
GdbObj* GetFirstObj( void) const
{ m_Iter = m_SelList.begin() ;
if ( m_Iter == m_SelList.end())
return nullptr ;
return (*m_Iter) ; }
{ m_pCurr = m_pFirst ;
return m_pCurr ; }
GdbObj* GetNextObj( void) const
{ if ( m_Iter == m_SelList.end())
return nullptr ;
++ m_Iter ;
if ( m_Iter == m_SelList.end())
return nullptr ;
return (*m_Iter) ; }
{ if ( m_pCurr != nullptr)
m_pCurr = m_pCurr->m_pSelNext ;
return m_pCurr ; }
GdbObj* GetLastObj( void) const
{ m_Iter = m_SelList.end() ;
if ( m_Iter == m_SelList.begin())
return nullptr ;
-- m_Iter ;
if ( m_Iter == m_SelList.end())
return nullptr ;
return (*m_Iter) ; }
{ m_pCurr = m_pLast ;
return m_pCurr ; }
GdbObj* GetPrevObj( void) const
{ if ( m_Iter == m_SelList.begin())
return nullptr ;
-- m_Iter ;
if ( m_Iter == m_SelList.end())
return nullptr ;
return (*m_Iter) ; }
{ if ( m_pCurr != nullptr)
m_pCurr = m_pCurr->m_pSelPrev ;
return m_pCurr ; }
private :
PGDBO_LIST m_SelList ;
mutable PGDBO_LIST::const_iterator m_Iter ;
int m_nCount ;
GdbObj* m_pFirst ;
GdbObj* m_pLast ;
mutable GdbObj* m_pCurr ;
} ;