Files
EgtExchange/ImportDxfTabs.cpp
Dario Sassi 6806b3f22a EgtExchange 1.8c1 :
- gestione controllo nomi in output Dxf su misura per Dxf
- gestione controllo nomi in input liberalizzato.
2017-03-02 18:04:06 +00:00

329 lines
9.3 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/EGnStringKeyVal.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 ;
}
// se Style
else if ( sTabName == "STYLE") {
if ( ! ReadStyleTable( 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
ValidateVal( 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 ;
// assegnazione flag
if ( ! m_pGDB->SetInfo( nId, DXF_INFO, 1))
return false ;
// aggiorno Map dei Layer
m_nmLayer.insert( NameMap::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
NameMap::iterator Iter = m_nmLayer.find( sName) ;
if ( Iter != m_nmLayer.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_nmLayer.insert( NameMap::value_type( sName, nId)).second)
return nId ;
return GDB_ID_NULL ;
}
//----------------------------------------------------------------------------
bool
ImportDxf::ReadStyleTable( 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 Style ( 0 -> STYLE)
if ( nCode == 0 && m_sCurrItem == "STYLE") {
if ( ! ReadStyle( 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::ReadStyle( bool& bFileEnd)
{
string sName ;
string sFont ;
double dH = 0 ;
double dRat = 1 ;
// 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 3 :
sFont = m_sCurrItem ;
break ;
case 40 :
FromString( m_sCurrItem, dH) ;
break ;
case 41 :
FromString( m_sCurrItem, dRat) ;
break ;
}
} while ( nCode != 0) ;
UngetItem() ;
// eventuale aggiustamento del nome per caratteri non ammessi e trasformazione in maiuscolo
ValidateVal( sName) ;
ToUpper( sName) ;
// sistemazioni sui nomi dei font
string sFontName ;
string sExt ;
SplitLast( sFont, ".", sFontName, sExt) ;
ToUpper( sExt) ;
if ( sExt == "TTF")
sFont = sFontName ;
else if ( sExt == "SHX")
sFont = sFontName + ".Nfe" ;
else if ( sExt.empty() && sFontName == "txt")
sFont = sFontName + ".Nfe" ;
// aggiorno Map degli Style
Style style( sFont, dH, dRat) ;
m_smStyle.insert( StyleMap::value_type( sName, style)) ;
return true ;
}
//----------------------------------------------------------------------------
bool
ImportDxf::GetStyleData( const string& sStyle, string& sFont, double& dH, double& dRat)
{
// se trovo il layer nel map, ne restituisco l'Id
StyleMap::iterator Iter = m_smStyle.find( sStyle) ;
if ( Iter != m_smStyle.end()) {
sFont = Iter->second.sFont ;
dH = Iter->second.dH ;
dRat = Iter->second.dRat ;
return true ;
}
else {
sFont = "txt.Nfe" ;
dH = 0 ;
dRat = 1 ;
return false ;
}
}