e5f28f8de1
- agg. importazione DXF di SOLID, ELLIPSE e SPLINE (solo poligono di controllo) - migliorie e correzioni varie.
217 lines
6.1 KiB
C++
217 lines
6.1 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2014-2014
|
|
//----------------------------------------------------------------------------
|
|
// File : ImportDxfTabs.cpp Data : 21.04.14 Versione : 1.5d4
|
|
// Contenuto : Implementazione di ImportDxf : gestione delle tavole.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 21.04.14 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "ImportDxf.h"
|
|
#include "DxfConst.h"
|
|
#include "DllMain.h"
|
|
#include "/EgtDev/Include/EGnStringUtils.h"
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ImportDxf::ReadTables( bool& bFileEnd)
|
|
{
|
|
// ciclo di lettura
|
|
bool bOk = true ;
|
|
bool bSectEnd = false ;
|
|
string sTabName ;
|
|
do {
|
|
// leggo intestazione entità, per avere il tipo
|
|
bool bOkLoc = GetTableName( sTabName, bSectEnd, bFileEnd) ;
|
|
if ( bOkLoc && ! bSectEnd) {
|
|
// se Layer
|
|
if ( sTabName == "LAYER") {
|
|
if ( ! ReadLayerTable( bFileEnd))
|
|
bOkLoc = false ;
|
|
}
|
|
// altrimenti
|
|
else {
|
|
if ( ! SkipTable( bFileEnd))
|
|
bOkLoc = false ;
|
|
}
|
|
}
|
|
// gestisco eventuale errore
|
|
if ( ! bOkLoc) {
|
|
bOk = false ;
|
|
string sOut = "ImportDxf : Error on line " + ToString( m_theScanner.GetCurrLineNbr()) ;
|
|
LOG_ERROR( GetEExLogger(), sOut.c_str())
|
|
}
|
|
} while ( ! bSectEnd) ;
|
|
|
|
return bOk ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ImportDxf::GetTableName( string& sTabName, bool& bSectEnd, bool& bFileEnd)
|
|
{
|
|
// inizializzo
|
|
sTabName.clear() ;
|
|
bSectEnd = false ;
|
|
bFileEnd = false ;
|
|
// leggo il primo Item (mi aspetto 0 -> TABLE)
|
|
int nCode = ReadNextItem() ;
|
|
if ( nCode == CODE_NULL) {
|
|
bSectEnd = true ;
|
|
bFileEnd = true ;
|
|
return false ;
|
|
}
|
|
if ( nCode != 0)
|
|
return false ;
|
|
if ( m_sCurrItem == "SECTION") {
|
|
UngetItem() ;
|
|
bSectEnd = true ;
|
|
return true ;
|
|
}
|
|
if ( m_sCurrItem == "ENDSEC") {
|
|
bSectEnd = true ;
|
|
return true ;
|
|
}
|
|
if ( m_sCurrItem == "EOF") {
|
|
bSectEnd = true ;
|
|
bFileEnd = true ;
|
|
return true ;
|
|
}
|
|
if ( m_sCurrItem != "TABLE")
|
|
return false ;
|
|
// leggo il secondo Item (mi aspetto 2 -> NomeTavola)
|
|
nCode = ReadNextItem() ;
|
|
if ( nCode == CODE_NULL) {
|
|
bFileEnd = true ;
|
|
return false ;
|
|
}
|
|
if ( nCode != 2)
|
|
return false ;
|
|
sTabName = m_sCurrItem ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ImportDxf::SkipTable( bool& bFileEnd)
|
|
{
|
|
bFileEnd = false ;
|
|
int nCode = CODE_NULL ;
|
|
do {
|
|
// leggo un Item ( cerco 0 -> ENDTAB)
|
|
nCode = ReadNextItem() ;
|
|
if ( nCode == CODE_NULL) {
|
|
bFileEnd = true ;
|
|
return false ;
|
|
}
|
|
} while ( nCode != 0 || m_sCurrItem != "ENDTAB") ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ImportDxf::ReadLayerTable( bool& bFileEnd)
|
|
{
|
|
bFileEnd = false ;
|
|
bool bOk = true ;
|
|
// ciclo sui diversi layer (fino a fine tavola 0-> ENDTAB)
|
|
int nCode = CODE_NULL ;
|
|
do {
|
|
// leggo un Item
|
|
nCode = ReadNextItem() ;
|
|
if ( nCode == CODE_NULL) {
|
|
bFileEnd = true ;
|
|
return false ;
|
|
}
|
|
// se intestazione Layer ( 0 -> LAYER)
|
|
if ( nCode == 0 && m_sCurrItem == "LAYER") {
|
|
if ( ! ReadLayer( bFileEnd)) {
|
|
bOk = false ;
|
|
string sOut = "ImportDxf : Error on line " + ToString( m_theScanner.GetCurrLineNbr()) ;
|
|
LOG_ERROR( GetEExLogger(), sOut.c_str())
|
|
}
|
|
// per forzare la rilettura dell'ultimo gruppo che è stato rifiutato
|
|
nCode = CODE_NULL ;
|
|
}
|
|
} while ( nCode != 0 || m_sCurrItem != "ENDTAB") ;
|
|
return bOk ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ImportDxf::ReadLayer( bool& bFileEnd)
|
|
{
|
|
string sName ;
|
|
int nColor = COL_BYLAYER ;
|
|
// ciclo di lettura degli item della linea
|
|
bFileEnd = false ;
|
|
int nCode = CODE_NULL ;
|
|
do {
|
|
// leggo un Item
|
|
nCode = ReadNextItem() ;
|
|
if ( nCode == CODE_NULL) {
|
|
bFileEnd = true ;
|
|
return false ;
|
|
}
|
|
// eventuale gestione
|
|
switch ( nCode) {
|
|
case 2 :
|
|
sName = m_sCurrItem ;
|
|
break ;
|
|
case 62 :
|
|
FromString( m_sCurrItem, nColor) ;
|
|
break ;
|
|
}
|
|
} while ( nCode != 0) ;
|
|
UngetItem() ;
|
|
// eventuale aggiustamento del nome per caratteri non ammessi
|
|
ValidateName( sName) ;
|
|
// inserisco il layer nel DB geometrico
|
|
int nId = m_pGDB->AddGroup( GDB_ID_NULL, m_nIdGroup, GLOB_FRM) ;
|
|
if ( nId == GDB_ID_NULL)
|
|
return false ;
|
|
// assegnazione nome
|
|
if ( ! m_pGDB->SetName( nId, sName))
|
|
return false ;
|
|
// aggiorno Map dei Layer
|
|
m_lmLayer.insert( LayerMap::value_type( sName, nId)) ;
|
|
// eventuale assegnazione del colore
|
|
Color cCol ;
|
|
if ( ColorFromACI( nColor, cCol)) {
|
|
if ( ! m_pGDB->SetMaterial( nId, cCol))
|
|
return false ;
|
|
}
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int
|
|
ImportDxf::GetLayerId( const string& sName)
|
|
{
|
|
// se trovo il layer nel map, ne restituisco l'Id
|
|
LayerMap::iterator Iter = m_lmLayer.find( sName) ;
|
|
if ( Iter != m_lmLayer.end())
|
|
return Iter->second ;
|
|
|
|
// inserisco un nuovo layer nel DB geometrico
|
|
int nId = m_pGDB->AddGroup( GDB_ID_NULL, m_nIdGroup, GLOB_FRM) ;
|
|
if ( nId == GDB_ID_NULL)
|
|
return GDB_ID_NULL ;
|
|
// assegnazione nome
|
|
if ( ! m_pGDB->SetName( nId, sName))
|
|
return GDB_ID_NULL ;
|
|
// aggiorno Map dei Layer
|
|
if ( m_lmLayer.insert( LayerMap::value_type( sName, nId)).second)
|
|
return nId ;
|
|
|
|
return GDB_ID_NULL ;
|
|
}
|