diff --git a/Attribs.cpp b/Attribs.cpp
index c5bc538..e73f53b 100644
--- a/Attribs.cpp
+++ b/Attribs.cpp
@@ -45,9 +45,9 @@ Attribs::Dump( string& sOut, const char* szNewLine) const
// stato
sOut += " Sta=" ;
switch ( m_Data[STATUS]) {
+ case GDB_ST_OFF : sOut += "off" ; break ;
default : /* GDB_ST_ON */ sOut += "on" ; break ;
case GDB_ST_SEL : sOut += "sel" ; break ;
- case GDB_ST_OFF : sOut += "off" ; break ;
}
sOut += szNewLine ;
// materiale
@@ -90,11 +90,11 @@ Attribs::Save( ostream& osOut) const
osOut << ToString( m_Data[LEVEL]) << "," ;
// modo
osOut << ToString( m_Data[MODE]) << "," ;
- // stato (se SEL viene convertito in ON)
- int nStat = (( m_Data[STATUS] == GDB_ST_SEL) ? GDB_ST_ON : m_Data[STATUS]) ;
+ // stato (se SEL è convertito in ON)
+ int nStat = (( m_Data[STATUS] > GDB_ST_ON) ? GDB_ST_ON : m_Data[STATUS]) ;
osOut << ToString( nStat) << "," ;
- // altro
- osOut << ToString( m_Data[OTHER]) << ";" ;
+ // marcatura (sempre OFF)
+ osOut << ToString( GDB_MK_OFF) << ";" ;
// materiale
osOut << ToString( m_Material) << ";" ;
// colore
@@ -173,16 +173,16 @@ Attribs::DataFromString( const string& sParam)
if ( ! FromString( vsParams[1], nMode))
return false ;
m_Data[MODE] = CLIP( nMode, GDB_MD_STD, GDB_MD_HIDDEN) ;
- // stato
+ // stato (ammessi solo OFF e ON)
int nStat ;
if ( ! FromString( vsParams[2], nStat))
return false ;
- m_Data[STATUS] = CLIP( nStat, GDB_ST_ON, GDB_ST_OFF) ;
- // altro
- int nOldStatus ;
- if ( ! FromString( vsParams[3], nOldStatus))
+ m_Data[STATUS] = CLIP( nStat, GDB_ST_OFF, GDB_ST_ON) ;
+ // marcatura (ammesso solo OFF)
+ int nMark ;
+ if ( ! FromString( vsParams[3], nMark))
return false ;
- m_Data[OTHER] = CLIP( nOldStatus, 0, 255) ;
+ m_Data[MARK] = CLIP( nMark, GDB_MK_OFF, GDB_MK_OFF) ;
return true ;
}
diff --git a/Attribs.h b/Attribs.h
index 383caac..1fd3a8e 100644
--- a/Attribs.h
+++ b/Attribs.h
@@ -30,7 +30,7 @@ class Attribs
{ m_Data[LEVEL] = GDB_LV_USER ; m_OldData[LEVEL] = m_Data[LEVEL] ;
m_Data[MODE] = GDB_MD_STD ; m_OldData[MODE] = m_Data[MODE] ;
m_Data[STATUS] = GDB_ST_ON ; m_OldData[STATUS] = m_Data[STATUS] ;
- m_Data[OTHER] = 0 ; m_OldData[OTHER] = m_Data[OTHER] ;
+ m_Data[MARK] = GDB_MK_OFF ; m_OldData[MARK] = m_Data[MARK] ;
m_Material = GDB_MT_PARENT ; m_Color.Set() ;}
Attribs* Clone( void) const
{ Attribs* pAttribs ;
@@ -56,17 +56,19 @@ class Attribs
{ std::swap( m_Data[MODE], m_OldData[MODE]) ; }
int GetMode( void) const
{ return m_Data[MODE] ; }
- void SetStatus( int nStat) // non si conserva il selezionato
- { if ( m_Data[STATUS] != GDB_ST_SEL)
- m_OldData[STATUS] = m_Data[STATUS] ;
- m_Data[STATUS] = CLIP( nStat, GDB_ST_ON, GDB_ST_OFF) ; }
+ void SetStatus( int nStat)
+ { m_OldData[STATUS] = m_Data[STATUS] ;
+ m_Data[STATUS] = CLIP( nStat, GDB_ST_OFF, GDB_ST_SEL) ; }
void RevertStatus( void)
- { if ( m_Data[STATUS] != GDB_ST_SEL)
- std::swap( m_Data[STATUS], m_OldData[STATUS]) ;
- else
- m_Data[STATUS] = m_OldData[STATUS] ; }
+ { std::swap( m_Data[STATUS], m_OldData[STATUS]) ; }
int GetStatus( void) const
{ return m_Data[STATUS] ; }
+ void SetMark( void)
+ { m_Data[MARK] = GDB_MK_ON ; }
+ void ResetMark( void)
+ { m_Data[MARK] = GDB_MK_OFF ; }
+ int GetMark( void) const
+ { return m_Data[MARK] ; }
void SetMaterial( int nMat)
{ if ( nMat >= GDB_MT_PARENT)
m_Material = nMat ; }
@@ -84,7 +86,7 @@ class Attribs
bool RemoveInfo( const std::string& sKey) ;
private :
- enum { LEVEL = 0, MODE = 1, STATUS = 2, OTHER = 3, DIM = 4} ;
+ enum { LEVEL = 0, MODE = 1, STATUS = 2, MARK = 3, DIM = 4} ;
private :
bool DataFromString( const std::string& sParam) ;
diff --git a/Color.cpp b/Color.cpp
index 49e435b..f261e93 100644
--- a/Color.cpp
+++ b/Color.cpp
@@ -19,24 +19,24 @@
using namespace std ;
//------------------------- Constants ----------------------------------------
-static const char* SZ_BLACK = "BLACK" ;
-static const char* SZ_GRAY = "GRAY" ;
-static const char* SZ_LGRAY = "LGRAY" ;
static const char* SZ_WHITE = "WHITE" ;
+static const char* SZ_LGRAY = "LGRAY" ;
+static const char* SZ_GRAY = "GRAY" ;
+static const char* SZ_BLACK = "BLACK" ;
static const char* SZ_RED = "RED" ;
-static const char* SZ_GREEN = "GREEN" ;
-static const char* SZ_BLUE = "BLUE" ;
-static const char* SZ_CYAN = "CYAN" ;
-static const char* SZ_MAGENTA = "MAGENTA" ;
+static const char* SZ_MAROON = "MAROON" ;
static const char* SZ_YELLOW = "YELLOW" ;
-static const char* SZ_BROWN = "BROWN" ;
+static const char* SZ_OLIVE = "OLIVE" ;
+static const char* SZ_LIME = "LIME" ;
+static const char* SZ_GREEN = "GREEN" ;
+static const char* SZ_AQUA = "AQUA" ;
+static const char* SZ_TEAL = "TEAL" ;
+static const char* SZ_BLUE = "BLUE" ;
+static const char* SZ_NAVY = "NAVY" ;
+static const char* SZ_FUCHSIA = "FUCHSIA" ;
static const char* SZ_PURPLE = "PURPLE" ;
static const char* SZ_ORANGE = "ORANGE" ;
-static const char* SZ_LRED = "LRED" ;
-static const char* SZ_LGREEN = "LGREEN" ;
-static const char* SZ_LBLUE = "LBLUE" ;
-static const char* SZ_LCYAN = "LCYAN" ;
-static const char* SZ_LMAGENTA = "LMAGENTA" ;
+static const char* SZ_BROWN = "BROWN" ;
//----------------------------------------------------------------------------
bool
@@ -44,42 +44,42 @@ GetStdColor( const string& sName, Color& cCol)
{
string sCol = sName ;
ToUpper( sCol) ;
- if ( sCol == SZ_BLACK)
- cCol = BLACK ;
- else if ( sCol == SZ_GRAY)
- cCol = GRAY ;
+ if ( sCol == SZ_WHITE)
+ cCol = WHITE ;
else if ( sCol == SZ_LGRAY)
cCol = LGRAY ;
- else if ( sCol == SZ_WHITE)
- cCol = WHITE ;
+ else if ( sCol == SZ_GRAY)
+ cCol = GRAY ;
+ else if ( sCol == SZ_BLACK)
+ cCol = BLACK ;
else if ( sCol == SZ_RED)
cCol = RED ;
- else if ( sCol == SZ_GREEN)
- cCol = GREEN ;
- else if ( sCol == SZ_BLUE)
- cCol = BLUE ;
- else if ( sCol == SZ_CYAN)
- cCol = CYAN ;
- else if ( sCol == SZ_MAGENTA)
- cCol = MAGENTA ;
+ else if ( sCol == SZ_MAROON)
+ cCol = MAROON ;
else if ( sCol == SZ_YELLOW)
cCol = YELLOW ;
- else if ( sCol == SZ_BROWN)
- cCol = BROWN ;
+ else if ( sCol == SZ_OLIVE)
+ cCol = OLIVE ;
+ else if ( sCol == SZ_LIME)
+ cCol = LIME ;
+ else if ( sCol == SZ_GREEN)
+ cCol = GREEN ;
+ else if ( sCol == SZ_AQUA)
+ cCol = AQUA ;
+ else if ( sCol == SZ_TEAL)
+ cCol = TEAL ;
+ else if ( sCol == SZ_BLUE)
+ cCol = BLUE ;
+ else if ( sCol == SZ_NAVY)
+ cCol = NAVY ;
+ else if ( sCol == SZ_FUCHSIA)
+ cCol = FUCHSIA ;
else if ( sCol == SZ_PURPLE)
cCol = PURPLE ;
else if ( sCol == SZ_ORANGE)
cCol = ORANGE ;
- else if ( sCol == SZ_LRED)
- cCol = LRED ;
- else if ( sCol == SZ_LGREEN)
- cCol = LGREEN ;
- else if ( sCol == SZ_LBLUE)
- cCol = LBLUE ;
- else if ( sCol == SZ_LCYAN)
- cCol = LCYAN ;
- else if ( sCol == SZ_LMAGENTA)
- cCol = LMAGENTA ;
+ else if ( sCol == SZ_BROWN)
+ cCol = BROWN ;
else
return false ;
@@ -88,46 +88,56 @@ GetStdColor( const string& sName, Color& cCol)
//----------------------------------------------------------------------------
bool
-GetNameOfStdColor( const Color& cCol, string& sName)
+GetNameOfStdColor( Color cCol, string& sName)
{
- if ( cCol == BLACK)
- sName = SZ_BLACK ;
- else if ( cCol == GRAY)
- sName = SZ_GRAY ;
+ if ( cCol == WHITE)
+ sName = SZ_WHITE ;
else if ( cCol == LGRAY)
sName = SZ_LGRAY ;
- else if ( cCol == WHITE)
- sName = SZ_WHITE ;
+ else if ( cCol == GRAY)
+ sName = SZ_GRAY ;
+ else if ( cCol == BLACK)
+ sName = SZ_BLACK ;
else if ( cCol == RED)
sName = SZ_RED ;
- else if ( cCol == GREEN)
- sName = SZ_GREEN ;
- else if ( cCol == BLUE)
- sName = SZ_BLUE ;
- else if ( cCol == CYAN)
- sName = SZ_CYAN ;
- else if ( cCol == MAGENTA)
- sName = SZ_MAGENTA ;
+ else if ( cCol == MAROON)
+ sName = SZ_MAROON ;
else if ( cCol == YELLOW)
sName = SZ_YELLOW ;
- else if ( cCol == BROWN)
- sName = SZ_BROWN ;
+ else if ( cCol == OLIVE)
+ sName = SZ_OLIVE ;
+ else if ( cCol == LIME)
+ sName = SZ_LIME ;
+ else if ( cCol == GREEN)
+ sName = SZ_GREEN ;
+ else if ( cCol == AQUA)
+ sName = SZ_AQUA ;
+ else if ( cCol == TEAL)
+ sName = SZ_TEAL ;
+ else if ( cCol == BLUE)
+ sName = SZ_BLUE ;
+ else if ( cCol == NAVY)
+ sName = SZ_NAVY ;
+ else if ( cCol == FUCHSIA)
+ sName = SZ_FUCHSIA ;
else if ( cCol == PURPLE)
sName = SZ_PURPLE ;
else if ( cCol == ORANGE)
sName = SZ_ORANGE ;
- else if ( cCol == LRED)
- sName = SZ_LRED ;
- else if ( cCol == LGREEN)
- sName = SZ_LGREEN ;
- else if ( cCol == LBLUE)
- sName = SZ_LBLUE ;
- else if ( cCol == LCYAN)
- sName = SZ_LCYAN ;
- else if ( cCol == LMAGENTA)
- sName = SZ_LMAGENTA ;
+ else if ( cCol == BROWN)
+ sName = SZ_BROWN ;
else
return false ;
return true ;
}
+
+//----------------------------------------------------------------------------
+Color
+GetOppositeColor( Color cCol)
+{
+ return Color( MAX_RGB - cCol.GetIntRed(),
+ MAX_RGB - cCol.GetIntGreen(),
+ MAX_RGB - cCol.GetIntBlue(),
+ cCol.GetIntAlpha()) ;
+}
\ No newline at end of file
diff --git a/CurveBezier.cpp b/CurveBezier.cpp
index b3a0528..9448595 100644
--- a/CurveBezier.cpp
+++ b/CurveBezier.cpp
@@ -1171,7 +1171,7 @@ CurveBezier::TrimStartAtParam( double dUTrim)
m_aPtCtrl[i] = ( 1 - dUTrim) * m_aPtCtrl[i] + dUTrim * m_aPtCtrl[i+1] ;
}
else {
- m_aPtCtrl[i] = ( 1 - dUTrim) * m_aPtCtrl[i] * m_aWeCtrl[i] + dUTrim * m_aPtCtrl[i+1] * m_aWeCtrl[i+1] ;
+ m_aPtCtrl[i] = ( 1 - dUTrim) * m_aWeCtrl[i] * m_aPtCtrl[i] + dUTrim * m_aWeCtrl[i+1] * m_aPtCtrl[i+1] ;
m_aWeCtrl[i] = ( 1 - dUTrim) * m_aWeCtrl[i] + dUTrim * m_aWeCtrl[i+1] ;
m_aPtCtrl[i] = m_aPtCtrl[i] * ( 1 / m_aWeCtrl[i]) ;
}
@@ -1205,7 +1205,7 @@ CurveBezier::TrimEndAtParam( double dUTrim)
m_aPtCtrl[i] = ( 1 - dUTrim) * m_aPtCtrl[i-1] + dUTrim * m_aPtCtrl[ i] ;
}
else {
- m_aPtCtrl[i] = ( 1 - dUTrim) * m_aPtCtrl[i-1] * m_aWeCtrl[i-1] + dUTrim * m_aPtCtrl[ i] * m_aWeCtrl[ i] ;
+ m_aPtCtrl[i] = ( 1 - dUTrim) * m_aWeCtrl[i-1] * m_aPtCtrl[i-1] + dUTrim * m_aWeCtrl[ i] * m_aPtCtrl[ i] ;
m_aWeCtrl[i] = ( 1 - dUTrim) * m_aWeCtrl[i-1] + dUTrim * m_aWeCtrl[ i] ;
m_aPtCtrl[i] = m_aPtCtrl[i] * ( 1 / m_aWeCtrl[i]) ;
}
diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc
index 8d09da0..85ef52e 100644
Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ
diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj
index f641a1a..e3b9ab9 100644
--- a/EgtGeomKernel.vcxproj
+++ b/EgtGeomKernel.vcxproj
@@ -330,6 +330,7 @@ copy $(TargetPath) \EgtProg\Dll64
+
diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters
index 557f574..06e5222 100644
--- a/EgtGeomKernel.vcxproj.filters
+++ b/EgtGeomKernel.vcxproj.filters
@@ -332,6 +332,9 @@
File di intestazione
+
+ File di intestazione
+
diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp
index 360101c..45548ef 100644
--- a/GdbExecutor.cpp
+++ b/GdbExecutor.cpp
@@ -34,8 +34,9 @@
using namespace std ;
//----------------------------------------------------------------------------
-static const int ID_NO = -2 ;
-static const int ID_ERROR = -3 ;
+static const int ID_SEL = -2 ;
+static const int ID_NO = -3 ;
+static const int ID_ERROR = -4 ;
//----------------------------------------------------------------------------
IGdbExecutor*
@@ -49,7 +50,58 @@ GdbExecutor::GdbExecutor( void)
{
m_pGDB = nullptr ;
m_pParser = nullptr ;
- m_pOtherExec = nullptr ;
+ // assegno chiavi a funzioni di esecuzione
+ m_ExecMgr.Init( 128) ;
+ m_ExecMgr.Insert( "GR", &GdbExecutor::ExecuteGroup) ;
+ m_ExecMgr.Insert( "GROUP", &GdbExecutor::ExecuteGroup) ;
+ m_ExecMgr.Insert( "P", &GdbExecutor::ExecutePoint) ;
+ m_ExecMgr.Insert( "POINT", &GdbExecutor::ExecutePoint) ;
+ m_ExecMgr.Insert( "V", &GdbExecutor::ExecuteVector) ;
+ m_ExecMgr.Insert( "VECTOR", &GdbExecutor::ExecuteVector) ;
+ m_ExecMgr.Insert( "FR", &GdbExecutor::ExecuteFrame) ;
+ m_ExecMgr.Insert( "FRAME", &GdbExecutor::ExecuteFrame) ;
+ m_ExecMgr.Insert( "CL", &GdbExecutor::ExecuteCurveLine) ;
+ m_ExecMgr.Insert( "CURVELINE", &GdbExecutor::ExecuteCurveLine) ;
+ m_ExecMgr.Insert( "CA", &GdbExecutor::ExecuteCurveArc) ;
+ m_ExecMgr.Insert( "CURVEARC", &GdbExecutor::ExecuteCurveArc) ;
+ m_ExecMgr.Insert( "CB", &GdbExecutor::ExecuteCurveBez) ;
+ m_ExecMgr.Insert( "CURVEBEZIER", &GdbExecutor::ExecuteCurveBez) ;
+ m_ExecMgr.Insert( "CC", &GdbExecutor::ExecuteCurveCompo) ;
+ m_ExecMgr.Insert( "CURVECOMPO", &GdbExecutor::ExecuteCurveCompo) ;
+ m_ExecMgr.Insert( "LEV", &GdbExecutor::ExecuteLevel) ;
+ m_ExecMgr.Insert( "LEVEL", &GdbExecutor::ExecuteLevel) ;
+ m_ExecMgr.Insert( "MOD", &GdbExecutor::ExecuteMode) ;
+ m_ExecMgr.Insert( "MODE", &GdbExecutor::ExecuteMode) ;
+ m_ExecMgr.Insert( "STA", &GdbExecutor::ExecuteStatus) ;
+ m_ExecMgr.Insert( "STATUS", &GdbExecutor::ExecuteStatus) ;
+ m_ExecMgr.Insert( "SEL", &GdbExecutor::ExecuteSelect) ;
+ m_ExecMgr.Insert( "SELECT", &GdbExecutor::ExecuteSelect) ;
+ m_ExecMgr.Insert( "DESEL", &GdbExecutor::ExecuteDeselect) ;
+ m_ExecMgr.Insert( "DESELECT", &GdbExecutor::ExecuteDeselect) ;
+ m_ExecMgr.Insert( "MAT", &GdbExecutor::ExecuteMaterial) ;
+ m_ExecMgr.Insert( "MATERIAL", &GdbExecutor::ExecuteMaterial) ;
+ m_ExecMgr.Insert( "NAM", &GdbExecutor::ExecuteName) ;
+ m_ExecMgr.Insert( "NAME", &GdbExecutor::ExecuteName) ;
+ m_ExecMgr.Insert( "INF", &GdbExecutor::ExecuteInfo) ;
+ m_ExecMgr.Insert( "INFO", &GdbExecutor::ExecuteInfo) ;
+ m_ExecMgr.Insert( "COPY", &GdbExecutor::ExecuteCopy) ;
+ m_ExecMgr.Insert( "ERASE", &GdbExecutor::ExecuteErase) ;
+ m_ExecMgr.Insert( "MOV", &GdbExecutor::ExecuteTranslate) ;
+ m_ExecMgr.Insert( "MOVE", &GdbExecutor::ExecuteTranslate) ;
+ m_ExecMgr.Insert( "ROT", &GdbExecutor::ExecuteRotate) ;
+ m_ExecMgr.Insert( "ROTATE", &GdbExecutor::ExecuteRotate) ;
+ m_ExecMgr.Insert( "SCA", &GdbExecutor::ExecuteScale) ;
+ m_ExecMgr.Insert( "SCALE", &GdbExecutor::ExecuteScale) ;
+ m_ExecMgr.Insert( "MIR", &GdbExecutor::ExecuteMirror) ;
+ m_ExecMgr.Insert( "MIRROR", &GdbExecutor::ExecuteMirror) ;
+ m_ExecMgr.Insert( "INVC", &GdbExecutor::ExecuteInvertCurve) ;
+ m_ExecMgr.Insert( "INVERTCURVE", &GdbExecutor::ExecuteInvertCurve) ;
+ m_ExecMgr.Insert( "TRC", &GdbExecutor::ExecuteTrimCurve) ;
+ m_ExecMgr.Insert( "TRIMCURVE", &GdbExecutor::ExecuteTrimCurve) ;
+ m_ExecMgr.Insert( "NEW", &GdbExecutor::ExecuteNew) ;
+ m_ExecMgr.Insert( "LOAD", &GdbExecutor::ExecuteLoad) ;
+ m_ExecMgr.Insert( "SAVE", &GdbExecutor::ExecuteSave) ;
+ m_ExecMgr.Insert( "OUTSCL", &GdbExecutor::ExecuteOutScl) ;
}
//----------------------------------------------------------------------------
@@ -61,33 +113,8 @@ GdbExecutor::~GdbExecutor( void)
bool
GdbExecutor::SetCmdParser( ICmdParser* pParser)
{
- // salvo e verifico
m_pParser = pParser ;
- if ( m_pParser == nullptr)
- return false ;
-
- // imposto eventuale parser dipendente
- if ( m_pOtherExec != nullptr)
- m_pOtherExec->SetCmdParser( m_pParser) ;
-
- return true ;
-}
-
-//----------------------------------------------------------------------------
-bool
-GdbExecutor::AddExecutor( ICmdExecutor* pOtherExec)
-{
- m_pOtherExec = pOtherExec ;
- return true ;
-}
-
-//----------------------------------------------------------------------------
-bool
-GdbExecutor::SetGeomDB( IGeomDB* pGdb)
-{
- m_pGDB = pGdb ;
-
- return ( m_pGDB != nullptr) ;
+ return ( m_pParser != nullptr) ;
}
//----------------------------------------------------------------------------
@@ -96,88 +123,37 @@ GdbExecutor::AddStandardVariables( void)
{
// imposto variabili predefinite
m_pParser->AddVariable( "$ROOT", GDB_ID_ROOT) ;
+ m_pParser->AddVariable( "$SEL", ID_SEL) ;
m_pParser->AddVariable( "$NN", ID_NO) ;
- // se c'è esecutore dipendente
- if ( m_pOtherExec != nullptr)
- return m_pOtherExec->AddStandardVariables() ;
- else
- return true ;
+ return true ;
}
//----------------------------------------------------------------------------
-bool
+int
GdbExecutor::Execute( const string& sCmd1, const string& sCmd2, const STRVECTOR& vsParams)
{
-
// verifico validita GeomDB
if ( m_pGDB == nullptr) {
LOG_ERROR( GetEGkLogger(), "Error : null GeomDb.")
- return false ;
+ return ER_ERR ;
}
// verifico validità CmdParser
if ( m_pParser == nullptr) {
LOG_ERROR( GetEGkLogger(), "Error : null CmdParser.")
- return false ;
+ return ER_ERR ;
}
// esecuzione comando
- if ( sCmd1 == "GR" || sCmd1 == "GROUP")
- return ExecuteGroup( sCmd2, vsParams) ;
- else if ( sCmd1 == "P" || sCmd1 == "POINT")
- return ExecutePoint( sCmd2, vsParams) ;
- else if ( sCmd1 == "V" || sCmd1 == "VECTOR")
- return ExecuteVector( sCmd2, vsParams) ;
- else if ( sCmd1 == "FR" || sCmd1 == "FRAME")
- return ExecuteFrame( sCmd2, vsParams) ;
- else if ( sCmd1 == "CL" || sCmd1 == "CURVELINE")
- return ExecuteCurveLine( sCmd2, vsParams) ;
- else if ( sCmd1 == "CA" || sCmd1 == "CURVEARC")
- return ExecuteCurveArc( sCmd2, vsParams) ;
- else if ( sCmd1 == "CB" || sCmd1 == "CURVEBEZIER")
- return ExecuteCurveBez( sCmd2, vsParams) ;
- else if ( sCmd1 == "CC" || sCmd1 == "CURVECOMPO")
- return ExecuteCurveCompo( sCmd2, vsParams) ;
- else if ( sCmd1 == "LEV" || sCmd1 == "LEVEL")
- return ExecuteLevel( sCmd2, vsParams) ;
- else if ( sCmd1 == "MOD" || sCmd1 == "MODE")
- return ExecuteMode( sCmd2, vsParams) ;
- else if ( sCmd1 == "STA" || sCmd1 == "STATUS")
- return ExecuteStatus( sCmd2, vsParams) ;
- else if ( sCmd1 == "MAT" || sCmd1 == "MATERIAL")
- return ExecuteMaterial( sCmd2, vsParams) ;
- else if ( sCmd1 == "NAM" || sCmd1 == "NAME")
- return ExecuteName( sCmd2, vsParams) ;
- else if ( sCmd1 == "INF" || sCmd1 == "INFO")
- return ExecuteInfo( sCmd2, vsParams) ;
- else if ( sCmd1 == "COPY")
- return ExecuteCopy( sCmd2, vsParams) ;
- else if ( sCmd1 == "ERASE")
- return ExecuteErase( vsParams) ;
- else if ( sCmd1 == "MOV" || sCmd1 == "MOVE")
- return ExecuteTranslate( sCmd2, vsParams) ;
- else if ( sCmd1 == "ROT" || sCmd1 == "ROTATE")
- return ExecuteRotate( sCmd2, vsParams) ;
- else if ( sCmd1 == "SCA" || sCmd1 == "SCALE")
- return ExecuteScale( sCmd2, vsParams) ;
- else if ( sCmd1 == "MIR" || sCmd1 == "MIRROR")
- return ExecuteMirror( sCmd2, vsParams) ;
- else if ( sCmd1 == "INVC" || sCmd1 == "INVERTCURVE")
- return ExecuteInvertCurve( vsParams) ;
- else if ( sCmd1 == "TRC" || sCmd1 == "TRIMCURVE")
- return ExecuteTrimCurve( sCmd2, vsParams) ;
- else if ( sCmd1 == "NEW")
- return ExecuteNew( vsParams) ;
- else if ( sCmd1 == "LOAD")
- return ExecuteLoad( vsParams) ;
- else if ( sCmd1 == "SAVE")
- return ExecuteSave( vsParams) ;
- else if ( sCmd1 == "OUTSCL")
- return ExecuteOutScl( sCmd2, vsParams) ;
- else if ( m_pOtherExec != nullptr)
- return m_pOtherExec->Execute( sCmd1, sCmd2, vsParams) ;
+ return m_ExecMgr.Execute( *this, sCmd1, sCmd2, vsParams) ;
+}
- return false ;
+//----------------------------------------------------------------------------
+bool
+GdbExecutor::SetGeomDB( IGeomDB* pGdb)
+{
+ m_pGDB = pGdb ;
+ return ( m_pGDB != nullptr) ;
}
//----------------------------------------------------------------------------
@@ -188,7 +164,7 @@ GdbExecutor::ExecuteGroup( const string& sCmd2, const STRVECTOR& vsParams)
// gruppo generico
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
Point3d ptOrig ;
Vector3d vtDirX ;
Vector3d vtDirY ;
@@ -207,7 +183,7 @@ GdbExecutor::ExecuteGroup( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
}
// gruppo orientato come il padre
- else if ( sCmd2 == "PLANEXY" || sCmd2 == "XY") {
+ else if ( sCmd2 == "XY" || sCmd2 == "PLANEXY") {
Point3d ptOrig ;
// 3 parametri : Id, Id del padre, Orig
if ( vsParams.size() != 3)
@@ -237,7 +213,7 @@ bool
GdbExecutor::ExecutePoint( const string& sCmd2, const STRVECTOR& vsParams)
{
// analisi ed esecuzione dei comandi
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
Point3d Pnt ;
// 5 parametri : Id, IdParent e 3 coordinate
if ( vsParams.size() != 5)
@@ -263,7 +239,7 @@ bool
GdbExecutor::ExecuteVector( const string& sCmd2, const STRVECTOR& vsParams)
{
// analisi ed esecuzione dei comandi
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
Vector3d Vect ;
// 5 parametri
if ( vsParams.size() != 5)
@@ -289,7 +265,7 @@ bool
GdbExecutor::ExecuteFrame( const string& sCmd2, const STRVECTOR& vsParams)
{
// analisi ed esecuzione dei comandi
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
Point3d ptOrig ;
Vector3d vtDirX ;
Vector3d vtDirY ;
@@ -324,7 +300,7 @@ GdbExecutor::ExecuteCurveLine( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
// creazione linea dando gli estremi
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
// 4 parametri
if ( vsParams.size() != 4)
return false ;
@@ -341,7 +317,7 @@ GdbExecutor::ExecuteCurveLine( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
}
// creazione linea di minima distanza tra punto e curva
- else if ( sCmd2 == "MINPOINTCURVE" || sCmd2 == "MPC") {
+ else if ( sCmd2 == "MPC" || sCmd2 == "MINPOINTCURVE") {
// almeno 4 parametri
if ( vsParams.size() < 4)
return false ;
@@ -408,7 +384,7 @@ GdbExecutor::ExecuteCurveArc( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
// arco generico
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
// 8 parametri
if ( vsParams.size() != 8)
return false ;
@@ -441,7 +417,7 @@ GdbExecutor::ExecuteCurveArc( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
}
// arco nel piano XY
- else if ( sCmd2 == "PLANEXY" || sCmd2 == "XY") {
+ else if ( sCmd2 == "XY" || sCmd2 == "PLANEXY") {
// 7 parametri
if ( vsParams.size() != 7)
return false ;
@@ -470,7 +446,7 @@ GdbExecutor::ExecuteCurveArc( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
}
// circonferenza nel piano XY
- else if ( sCmd2 == "CIRCLEXY" || sCmd2 == "CXY") {
+ else if ( sCmd2 == "CXY" || sCmd2 == "CIRCLEXY") {
// 4 parametri
if ( vsParams.size() != 4)
return false ;
@@ -507,7 +483,7 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
int nIdArc = ID_ERROR ;
// curva di Bezier intera (polinomiale)
- if ( sCmd2 == "INTEG" || sCmd2 == "I") {
+ if ( sCmd2 == "I" || sCmd2 == "INTEG") {
int i ;
int nDeg ;
Point3d ptP ;
@@ -528,7 +504,7 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
}
}
// curva di Bezier razionale
- else if ( sCmd2 == "RATIO" || sCmd2 == "R") {
+ else if ( sCmd2 == "R" || sCmd2 == "RATIO") {
int i ;
int nDeg ;
double dW ;
@@ -550,7 +526,7 @@ GdbExecutor::ExecuteCurveBez( const string& sCmd2, const STRVECTOR& vsParams)
}
}
// curva di Bezier ricavata da un arco
- else if ( sCmd2 == "FROMARC" || sCmd2 == "A") {
+ else if ( sCmd2 == "A" || sCmd2 == "FROMARC") {
// 3 o 4 parametri
switch ( vsParams.size()) {
case 3 : bErase = false ; break ;
@@ -605,11 +581,11 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
// per eventuale cancellazione curve di origine
bool bErase ;
- STRVECTOR vsNames ;
- STRVECTOR::iterator Iter ;
+ INTVECTOR vnNames ;
+ INTVECTOR::iterator Iter ;
// curva composita generica
- if ( sCmd2 == "MAKE" || sCmd2 == "") {
+ if ( sCmd2 == "" || sCmd2 == "MAKE") {
// 3 o 4 parametri
switch ( vsParams.size()) {
case 3 : bErase = false ; break ;
@@ -617,16 +593,16 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
default : return false ; break ;
}
// recupero lista nomi
- if ( ! GetNamesParam( vsParams[2], vsNames))
+ if ( ! GetNamesParam( vsParams[2], vnNames))
return false ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// esecuzione
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero la curva
- int nIdCrv = GetIdParam( *Iter) ;
+ int nIdCrv = *Iter ;
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
if ( pCrv == nullptr)
return false ;
@@ -656,7 +632,7 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
}
}
// da split di curva semplice
- else if ( sCmd2 == "FROMSPLIT" || sCmd2 == "S") {
+ else if ( sCmd2 == "S" || sCmd2 == "FROMSPLIT") {
// 4 o 5 parametri
switch ( vsParams.size()) {
case 4 : bErase = false ; break ;
@@ -664,9 +640,9 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
default : return false ; break ;
}
// salvo nome curva originale per eventuale cancellazione
- vsNames.push_back( vsParams[2]) ;
- // recupero la curva
int nIdCrv = GetIdParam( vsParams[2]) ;
+ vnNames.push_back( nIdCrv) ;
+ // recupero la curva
const ICurve* pCrv = GetCurve( m_pGDB->GetGeoObj( nIdCrv)) ;
if ( pCrv == nullptr)
return false ;
@@ -699,8 +675,8 @@ GdbExecutor::ExecuteCurveCompo( const string& sCmd2, const STRVECTOR& vsParams)
if ( AddGeoObj( vsParams[0], vsParams[1], Release( pCrvCompo))) {
// se richiesto, cancello le curve originali
if ( bErase) {
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->Erase( GetIdParam(*Iter)))
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->Erase( *Iter))
return false ;
}
}
@@ -754,15 +730,29 @@ GdbExecutor::GetIdParam( const std::string& sParam, bool bNewAllowed)
//----------------------------------------------------------------------------
bool
-GdbExecutor::GetNamesParam( const std::string& sParam, STRVECTOR& vsNames)
+GdbExecutor::GetNamesParam( const std::string& sParam, INTVECTOR& vnNames)
{
- STRVECTOR::iterator Iter ;
-
-
// divido in parti
+ STRVECTOR vsNames ;
Tokenize( sParam, ",", vsNames) ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter)
+ // converto in interi
+ vnNames.clear() ;
+ vnNames.reserve( vsNames.size()) ;
+ STRVECTOR::iterator Iter ;
+ for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
Trim( (*Iter), " \t\r\n()") ;
+ int nId = GetIdParam( *Iter) ;
+ if ( nId != ID_SEL) {
+ vnNames.push_back( nId) ;
+ }
+ else {
+ nId = m_pGDB->GetFirstSelectedObj() ;
+ while ( nId != GDB_ID_NULL) {
+ vnNames.push_back( nId) ;
+ nId = m_pGDB->GetNextSelectedObj() ;
+ }
+ }
+ }
return true ;
}
@@ -902,7 +892,7 @@ GdbExecutor::GetFrameParam( const std::string& sParam, Frame3d& frF)
//----------------------------------------------------------------------------
bool
-GdbExecutor::GetColorParam( const std::string& sParam, Color& cCol)
+GdbExecutor::GetColorParam( const std::string& sParam, bool& bByParent, Color& cCol)
{
// se insieme di tre o quattro valori
if ( sParam[0] == '(') {
@@ -924,13 +914,28 @@ GdbExecutor::GetColorParam( const std::string& sParam, Color& cCol)
if ( vsParams.size() == 4 &&
! FromString( vsParams[3], nAlpha))
return false ;
+ bByParent = false ;
cCol.Set( nRed, nGreen, nBlue, nAlpha) ;
return true ;
}
- // altrimenti colore predefinito
- else {
- return GetStdColor( sParam, cCol) ;
+ // se colore predefinito
+ else if ( GetStdColor( sParam, cCol)) {
+ bByParent = false ;
+ return true ;
}
+ // altrimeti
+ else {
+ // verifico se colore dal padre
+ string sTemp = sParam ;
+ ToUpper( sTemp) ;
+ ReplaceString( sTemp, " ", "") ;
+ if ( sTemp == "BYPARENT") {
+ bByParent = true ;
+ return true ;
+ }
+ }
+
+ return false ;
}
//----------------------------------------------------------------------------
@@ -941,8 +946,8 @@ GdbExecutor::ExecuteLevel( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero livello
string sLevel = vsParams[1] ;
@@ -957,9 +962,9 @@ GdbExecutor::ExecuteLevel( const string& sCmd2, const STRVECTOR& vsParams)
else
return false ;
// esecuzione impostazione livello
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->SetLevel( GetIdParam( *Iter), nLevel))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SetLevel( *Iter, nLevel))
return false ;
}
return true ;
@@ -973,8 +978,8 @@ GdbExecutor::ExecuteMode( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero modo
string sMode = vsParams[1] ;
@@ -989,9 +994,9 @@ GdbExecutor::ExecuteMode( const string& sCmd2, const STRVECTOR& vsParams)
else
return false ;
// esecuzione impostazione modo
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->SetMode( GetIdParam( *Iter), nMode))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SetMode( *Iter, nMode))
return false ;
}
return true ;
@@ -1005,8 +1010,8 @@ GdbExecutor::ExecuteStatus( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero stato
string sStat = vsParams[1] ;
@@ -1021,14 +1026,108 @@ GdbExecutor::ExecuteStatus( const string& sCmd2, const STRVECTOR& vsParams)
else
return false ;
// esecuzione impostazione stato
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->SetStatus( GetIdParam( *Iter), nStat))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SetStatus( *Iter, nStat))
return false ;
}
return true ;
}
+//----------------------------------------------------------------------------
+bool
+GdbExecutor::ExecuteSelect( const string& sCmd2, const STRVECTOR& vsParams)
+{
+ // selezione di un oggetto
+ if ( sCmd2.empty()) {
+ // deve essere 1 parametro ( Id)
+ if ( vsParams.size() != 1)
+ return false ;
+ // recupero lista Id
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
+ return false ;
+ // esecuzione selezione
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SelectObj( *Iter))
+ return false ;
+ }
+ return true ;
+ }
+ // selezione di tutti gli oggetti di un gruppo
+ else if ( sCmd2 == "GOBJS") {
+ // deve essere 1 parametro ( Id)
+ if ( vsParams.size() != 1)
+ return false ;
+ // recupero lista Id
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
+ return false ;
+ // esecuzione selezione di tutti gli oggetti di ogni gruppo
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SelectGroupObjs( *Iter))
+ return false ;
+ }
+ return true ;
+ }
+
+ return false ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbExecutor::ExecuteDeselect( const string& sCmd2, const STRVECTOR& vsParams)
+{
+ // deselezione di un oggetto
+ if ( sCmd2.empty()) {
+ // deve essere 1 parametro ( Id)
+ if ( vsParams.size() != 1)
+ return false ;
+ // recupero lista Id
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
+ return false ;
+ // esecuzione deselezione
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->DeselectObj( *Iter))
+ return false ;
+ }
+ return true ;
+ }
+ // deselezione di tutti gli oggetti di un gruppo
+ else if ( sCmd2 == "GOBJS") {
+ // deve essere 1 parametro ( Id)
+ if ( vsParams.size() != 1)
+ return false ;
+ // recupero lista Id
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
+ return false ;
+ // esecuzione deselezione di tutti gli oggetti di ogni gruppo
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->DeselectGroupObjs( *Iter))
+ return false ;
+ }
+ return true ;
+ }
+ // deselezione di tutto
+ else if ( sCmd2 == "ALL") {
+ // nessun parametro
+ if ( vsParams.size() != 0)
+ return false ;
+ // cancello selezione oggetti
+ if ( ! m_pGDB->ClearSelection())
+ return false ;
+ return true ;
+ }
+
+ return false ;
+}
+
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteMaterial( const string& sCmd2, const STRVECTOR& vsParams)
@@ -1039,18 +1138,25 @@ GdbExecutor::ExecuteMaterial( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero il colore
+ bool bByParent ;
Color cCol ;
- if ( ! GetColorParam( vsParams[1], cCol))
+ if ( ! GetColorParam( vsParams[1], bByParent, cCol))
return false ;
// esecuzione impostazione colore
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->SetMaterial( GetIdParam( *Iter), cCol))
- return false ;
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( bByParent) {
+ if ( ! m_pGDB->SetMaterial( *Iter, GDB_MT_PARENT))
+ return false ;
+ }
+ else {
+ if ( ! m_pGDB->SetMaterial( *Iter, cCol))
+ return false ;
+ }
}
return true ;
}
@@ -1059,9 +1165,10 @@ GdbExecutor::ExecuteMaterial( const string& sCmd2, const STRVECTOR& vsParams)
// 1 parametro ( Colore)
if ( vsParams.size() != 1)
return false ;
- // recupero il colore
+ // recupero il colore (deve essere concreto)
+ bool bByParent ;
Color cCol ;
- if ( ! GetColorParam( vsParams[0], cCol))
+ if ( ! GetColorParam( vsParams[0], bByParent, cCol) || bByParent)
return false ;
// imposto il colore di default
return m_pGDB->SetDefaultMaterial( cCol) ;
@@ -1080,13 +1187,13 @@ GdbExecutor::ExecuteName( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// eseguo assegnazione nome
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->SetName( GetIdParam( *Iter), vsParams[1]))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SetName( *Iter, vsParams[1]))
return false ;
}
return true ;
@@ -1097,13 +1204,13 @@ GdbExecutor::ExecuteName( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 1)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// eseguo rimozione nome
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->RemoveName( GetIdParam( *Iter)))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->RemoveName( *Iter))
return false ;
}
return true ;
@@ -1122,13 +1229,13 @@ GdbExecutor::ExecuteInfo( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 3)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// eseguo assegnazione Info di data Key
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->SetInfo( GetIdParam( *Iter), vsParams[1], vsParams[2]))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->SetInfo( *Iter, vsParams[1], vsParams[2]))
return false ;
}
return true ;
@@ -1139,13 +1246,13 @@ GdbExecutor::ExecuteInfo( const string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 2)
return false ;
// recupero lista Id
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// eseguo rimozione nome Info di data Key
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->RemoveInfo( GetIdParam( *Iter), vsParams[1]))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->RemoveInfo( *Iter, vsParams[1]))
return false ;
}
return true ;
@@ -1179,19 +1286,19 @@ GdbExecutor::ExecuteCopy( const std::string& sCmd2, const STRVECTOR& vsParams)
//----------------------------------------------------------------------------
bool
-GdbExecutor::ExecuteErase( const STRVECTOR& vsParams)
+GdbExecutor::ExecuteErase( const std::string& sCmd2, const STRVECTOR& vsParams)
{
// 1 parametro ( Nome/i)
if ( vsParams.size() != 1)
return false ;
// recupero lista nomi
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// esecuzione cancellazioni
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ! m_pGDB->Erase( GetIdParam( *Iter)))
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->Erase( *Iter))
return false ;
}
@@ -1206,8 +1313,8 @@ GdbExecutor::ExecuteTranslate( const std::string& sCmd2, const STRVECTOR& vsPara
if ( vsParams.size() != 2)
return false ;
// recupero lista nomi
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero il vettore
Vector3d vtVN ;
@@ -1216,14 +1323,14 @@ GdbExecutor::ExecuteTranslate( const std::string& sCmd2, const STRVECTOR& vsPara
// recupero flag per globale
bool bGlob = ( sCmd2 == "GLOB" || sCmd2 == "G") ;
// esecuzione traslazioni
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
if ( bGlob) {
- if ( ! m_pGDB->TranslateGlob( GetIdParam( *Iter), vtVN))
+ if ( ! m_pGDB->TranslateGlob( *Iter, vtVN))
return false ;
}
else {
- if ( ! m_pGDB->Translate( GetIdParam( *Iter), vtVN))
+ if ( ! m_pGDB->Translate( *Iter, vtVN))
return false ;
}
}
@@ -1239,8 +1346,8 @@ GdbExecutor::ExecuteRotate( const std::string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 4)
return false ;
// recupero lista nomi
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero il punto
Point3d ptPC ;
@@ -1257,14 +1364,14 @@ GdbExecutor::ExecuteRotate( const std::string& sCmd2, const STRVECTOR& vsParams)
// recupero flag per globale
bool bGlob = ( sCmd2 == "GLOB" || sCmd2 == "G") ;
// esecuzione rotazioni
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
if ( bGlob) {
- if ( ! m_pGDB->RotateGlob( GetIdParam( *Iter), ptPC, vtVN, dAngDeg))
+ if ( ! m_pGDB->RotateGlob( *Iter, ptPC, vtVN, dAngDeg))
return false ;
}
else {
- if ( ! m_pGDB->Rotate( GetIdParam( *Iter), ptPC, vtVN, dAngDeg))
+ if ( ! m_pGDB->Rotate( *Iter, ptPC, vtVN, dAngDeg))
return false ;
}
}
@@ -1280,8 +1387,8 @@ GdbExecutor::ExecuteScale( const std::string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 5)
return false ;
// recupero lista nomi
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// provo a recuperare un punto
Point3d ptPC ;
@@ -1303,14 +1410,14 @@ GdbExecutor::ExecuteScale( const std::string& sCmd2, const STRVECTOR& vsParams)
// recupero flag per globale
bool bGlob = ( sCmd2 == "GLOB" || sCmd2 == "G") ;
// esecuzione scalature
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
if ( bGlob) {
- if ( ! m_pGDB->ScaleGlob( GetIdParam( *Iter), frRef, dCoeffX, dCoeffY, dCoeffZ))
+ if ( ! m_pGDB->ScaleGlob( *Iter, frRef, dCoeffX, dCoeffY, dCoeffZ))
return false ;
}
else {
- if ( ! m_pGDB->Scale( GetIdParam( *Iter), frRef, dCoeffX, dCoeffY, dCoeffZ))
+ if ( ! m_pGDB->Scale( *Iter, frRef, dCoeffX, dCoeffY, dCoeffZ))
return false ;
}
}
@@ -1326,8 +1433,8 @@ GdbExecutor::ExecuteMirror( const std::string& sCmd2, const STRVECTOR& vsParams)
if ( vsParams.size() != 3)
return false ;
// recupero lista nomi
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero il punto
Point3d ptPC ;
@@ -1340,14 +1447,14 @@ GdbExecutor::ExecuteMirror( const std::string& sCmd2, const STRVECTOR& vsParams)
// recupero flag per globale
bool bGlob = ( sCmd2 == "GLOB" || sCmd2 == "G") ;
// esecuzione specchiature
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
if ( bGlob) {
- if ( ! m_pGDB->MirrorGlob( GetIdParam( *Iter), ptPC, vtVN))
+ if ( ! m_pGDB->MirrorGlob( *Iter, ptPC, vtVN))
return false ;
}
else {
- if ( ! m_pGDB->Mirror( GetIdParam( *Iter), ptPC, vtVN))
+ if ( ! m_pGDB->Mirror( *Iter, ptPC, vtVN))
return false ;
}
}
@@ -1357,19 +1464,19 @@ GdbExecutor::ExecuteMirror( const std::string& sCmd2, const STRVECTOR& vsParams)
//----------------------------------------------------------------------------
bool
-GdbExecutor::ExecuteInvertCurve( const STRVECTOR& vsParams)
+GdbExecutor::ExecuteInvertCurve( const std::string& sCmd2, const STRVECTOR& vsParams)
{
// 1 parametro ( Nome/i)
if ( vsParams.size() != 1)
return false ;
// recupero lista nomi
- STRVECTOR vsNames ;
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// esecuzione inversione curve
- STRVECTOR::iterator Iter ;
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- ICurve* pCurve = GetCurve( m_pGDB->GetGeoObj( GetIdParam( *Iter))) ;
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ ICurve* pCurve = GetCurve( m_pGDB->GetGeoObj( *Iter)) ;
if ( pCurve == nullptr || ! pCurve->Invert())
return false ;
}
@@ -1382,23 +1489,21 @@ bool
GdbExecutor::ExecuteTrimCurve( const std::string& sCmd2, const STRVECTOR& vsParams)
{
enum SeLp { SL, EL, SP, EP} ;
- SeLp StEnLenPar ;
- double dPar ;
- STRVECTOR vsNames ;
- STRVECTOR::iterator Iter ;
- ICurve* pCurve ;
// 2 parametri ( Nome, parametro)
if ( vsParams.size() != 2)
return false ;
// recupero lista nomi
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// recupero i dati di inizio
+ double dPar ;
if ( ! FromString( vsParams[1], dPar))
return false ;
// determino il tipo di trim
+ SeLp StEnLenPar ;
if ( sCmd2 == "STARTLEN" || sCmd2 == "SL")
StEnLenPar = SL ;
else if ( sCmd2 == "ENDLEN" || sCmd2 == "EL")
@@ -1410,8 +1515,10 @@ GdbExecutor::ExecuteTrimCurve( const std::string& sCmd2, const STRVECTOR& vsPara
else
return false ;
// esecuzione trim
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
- if ( ( pCurve = GetCurve( m_pGDB->GetGeoObj( GetIdParam( *Iter)))) != nullptr) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ ICurve* pCurve ;
+ if ( ( pCurve = GetCurve( m_pGDB->GetGeoObj( *Iter))) != nullptr) {
switch ( StEnLenPar) {
case SL :
if ( ! pCurve->TrimStartAtLen( dPar))
@@ -1440,7 +1547,7 @@ GdbExecutor::ExecuteTrimCurve( const std::string& sCmd2, const STRVECTOR& vsPara
//----------------------------------------------------------------------------
bool
-GdbExecutor::ExecuteNew( const STRVECTOR& vsParams)
+GdbExecutor::ExecuteNew( const std::string& sCmd2, const STRVECTOR& vsParams)
{
// nessun parametro
if ( vsParams.size() != 0)
@@ -1453,7 +1560,7 @@ GdbExecutor::ExecuteNew( const STRVECTOR& vsParams)
//----------------------------------------------------------------------------
bool
-GdbExecutor::ExecuteLoad( const STRVECTOR& vsParams)
+GdbExecutor::ExecuteLoad( const std::string& sCmd2, const STRVECTOR& vsParams)
{
// 1 parametro ( NomeFile)
if ( vsParams.size() != 1)
@@ -1467,7 +1574,7 @@ GdbExecutor::ExecuteLoad( const STRVECTOR& vsParams)
//----------------------------------------------------------------------------
bool
-GdbExecutor::ExecuteSave( const STRVECTOR& vsParams)
+GdbExecutor::ExecuteSave( const std::string& sCmd2, const STRVECTOR& vsParams)
{
// 1 parametro ( NomeFile)
if ( vsParams.size() != 1)
@@ -1520,52 +1627,48 @@ GdbExecutor::ExecuteOutScl( const string& sCmd2, const STRVECTOR& vsParams)
}
// emetto gruppo
else if ( sCmd2 == "PUTGR") {
- int nFlag ;
- int nId ;
- STRVECTOR vsNames ;
- STRVECTOR::iterator Iter ;
// almeno un parametro
if ( vsParams.size() < 1)
return false ;
// se esiste il secondo
+ int nFlag ;
if ( vsParams.size() == 2)
FromString( vsParams[1], nFlag) ;
else
nFlag = 0 ;
// recupero lista nomi
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// esecuzione
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero l'oggetto ed eseguo l'output
- nId = GetIdParam( *Iter) ;
- if ( ! OutGroupScl( nId, nFlag))
+ if ( ! OutGroupScl( *Iter, nFlag))
return false ;
}
return true ;
}
// emetto oggetto geometrico
else if ( sCmd2 == "PUT") {
- int nFlag ;
- int nId ;
- STRVECTOR vsNames ;
- STRVECTOR::iterator Iter ;
// almeno un parametro
if ( vsParams.size() < 1)
return false ;
// se esiste il secondo
+ int nFlag ;
if ( vsParams.size() == 2)
FromString( vsParams[1], nFlag) ;
else
nFlag = 0 ;
// recupero lista nomi
- if ( ! GetNamesParam( vsParams[0], vsNames))
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// esecuzione
- for ( Iter = vsNames.begin() ; Iter != vsNames.end() ; ++Iter) {
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero l'oggetto ed eseguo l'output
- nId = GetIdParam( *Iter) ;
- if ( ! m_OutScl.PutGeoObj( m_pGDB->GetGeoObj( nId), nFlag))
+ if ( ! m_OutScl.PutGeoObj( m_pGDB->GetGeoObj( *Iter), nFlag))
return false ;
}
return true ;
diff --git a/GdbExecutor.h b/GdbExecutor.h
index e6ca7a6..fe5ad85 100644
--- a/GdbExecutor.h
+++ b/GdbExecutor.h
@@ -16,18 +16,21 @@
#include "OutScl.h"
#include "/EgtDev/Include/EgkGdbExecutor.h"
#include "/EgtDev/Include/EgtPerfCounter.h"
+#include "/EgtDev/Include/EgtExecMgr.h"
class Vector3d ;
class Color ;
+//----------------------------------------------------------------------------
+typedef std::vector INTVECTOR ;
+
//----------------------------------------------------------------------------
class GdbExecutor : public IGdbExecutor
{
public : // ICmdExecutor
virtual bool SetCmdParser( ICmdParser* pParser) ;
- virtual bool AddExecutor( ICmdExecutor* pOtherExec) ;
virtual bool AddStandardVariables( void) ;
- virtual bool Execute( const std::string& sCmd1, const std::string& sCmd2, const STRVECTOR& vsParams) ;
+ virtual int Execute( const std::string& sCmd1, const std::string& sCmd2, const STRVECTOR& vsParams) ;
public : // IGdbExecutor
~GdbExecutor( void) ;
@@ -39,12 +42,12 @@ class GdbExecutor : public IGdbExecutor
private :
bool AddGeoObj( const std::string& sId, const std::string& sIdParent, IGeoObj* pGeoObj) ;
int GetIdParam( const std::string& sParam, bool bNewAllowed = false) ;
- bool GetNamesParam( const std::string& sParam, STRVECTOR& vsNames) ;
+ bool GetNamesParam( const std::string& sParam, INTVECTOR& vnNames) ;
bool GetVectorParam( const std::string& sParam, Vector3d& vtV) ;
bool GetPointParam( const std::string& sParam, Point3d& ptP) ;
bool GetPointWParam( const std::string& sParam, Point3d& ptP, double& dW) ;
bool GetFrameParam( const std::string& sParam, Frame3d& frF) ;
- bool GetColorParam( const std::string& sParam, Color& cCol) ;
+ bool GetColorParam( const std::string& sParam, bool& bByParent, Color& cCol) ;
bool ExecuteGroup( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecutePoint( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteVector( const std::string& sCmd2, const STRVECTOR& vsParams) ;
@@ -56,26 +59,28 @@ class GdbExecutor : public IGdbExecutor
bool ExecuteLevel( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteMode( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteStatus( const std::string& sCmd2, const STRVECTOR& vsParams) ;
+ bool ExecuteSelect( const std::string& sCmd2, const STRVECTOR& vsParams) ;
+ bool ExecuteDeselect( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteMaterial( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteName( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteInfo( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteCopy( const std::string& sCmd2, const STRVECTOR& vsParams) ;
- bool ExecuteErase( const STRVECTOR& vsParams) ;
+ bool ExecuteErase( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteTranslate( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteRotate( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteScale( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteMirror( const std::string& sCmd2, const STRVECTOR& vsParams) ;
- bool ExecuteInvertCurve( const STRVECTOR& vsParams) ;
+ bool ExecuteInvertCurve( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteTrimCurve( const std::string& sCmd2, const STRVECTOR& vsParams) ;
- bool ExecuteNew( const STRVECTOR& vsParams) ;
- bool ExecuteLoad( const STRVECTOR& vsParams) ;
- bool ExecuteSave( const STRVECTOR& vsParams) ;
+ bool ExecuteNew( const std::string& sCmd2, const STRVECTOR& vsParams) ;
+ bool ExecuteLoad( const std::string& sCmd2, const STRVECTOR& vsParams) ;
+ bool ExecuteSave( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool ExecuteOutScl( const std::string& sCmd2, const STRVECTOR& vsParams) ;
bool OutGroupScl( int nId, int nFlag) ;
private :
- IGeomDB* m_pGDB ;
- ICmdParser* m_pParser ;
- ICmdExecutor* m_pOtherExec ;
- OutScl m_OutScl ;
+ IGeomDB* m_pGDB ;
+ ICmdParser* m_pParser ;
+ ExecManager m_ExecMgr ;
+ OutScl m_OutScl ;
} ;
diff --git a/GdbIterator.cpp b/GdbIterator.cpp
index 502c6db..4b5d814 100644
--- a/GdbIterator.cpp
+++ b/GdbIterator.cpp
@@ -444,8 +444,8 @@ GdbIterator::SetStatus( int nStat)
if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
return false ;
- // assegno lo stato
- return m_pCurrObj->SetStatus( nStat) ;
+ // la funzione chiamata gestisce l'aggiornamento della lista dei selezionati
+ return m_pGDB->SetStatus( m_pCurrObj, nStat) ;
}
//----------------------------------------------------------------------------
@@ -455,8 +455,8 @@ GdbIterator::RevertStatus( void)
if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
return false ;
- // ripristino lo stato precedente
- return m_pCurrObj->RevertStatus() ;
+ // la funzione chiamata gestisce l'aggiornamento della lista dei selezionati
+ return m_pGDB->RevertStatus( m_pCurrObj) ;
}
//----------------------------------------------------------------------------
@@ -481,6 +481,50 @@ GdbIterator::GetCalcStatus( int& nStat) const
return m_pCurrObj->GetCalcStatus( nStat) ;
}
+//----------------------------------------------------------------------------
+bool
+GdbIterator::SetMark( void)
+{
+ if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
+ return false ;
+
+ // imposto la marcatura
+ return m_pCurrObj->SetMark() ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbIterator::ResetMark( void)
+{
+ if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
+ return false ;
+
+ // cancello la marcatura
+ return m_pCurrObj->ResetMark() ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbIterator::GetMark( int& nMark) const
+{
+ if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
+ return false ;
+
+ // recupero la marcatura
+ return m_pCurrObj->GetMark( nMark) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbIterator::GetCalcMark( int& nMark) const
+{
+ if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
+ return false ;
+
+ // recupero la marcatura calcolata
+ return m_pCurrObj->GetCalcMark( nMark) ;
+}
+
//----------------------------------------------------------------------------
bool
GdbIterator::SetMaterial( int nMat)
diff --git a/GdbIterator.h b/GdbIterator.h
index b51f140..1427bc0 100644
--- a/GdbIterator.h
+++ b/GdbIterator.h
@@ -55,6 +55,10 @@ class GdbIterator : public IGdbIterator
virtual bool RevertStatus( void) ;
virtual bool GetStatus( int& nStat) const ;
virtual bool GetCalcStatus( int& nStat) const ;
+ virtual bool SetMark( void) ;
+ virtual bool ResetMark( void) ;
+ virtual bool GetMark( int& nMark) const ;
+ virtual bool GetCalcMark( int& nMark) const ;
virtual bool SetMaterial( int nMat) ;
virtual bool SetMaterial( Color cCol) ;
virtual bool GetMaterial( int& nMat) const ;
diff --git a/GdbObj.cpp b/GdbObj.cpp
index b539f15..9dccfd3 100644
--- a/GdbObj.cpp
+++ b/GdbObj.cpp
@@ -391,6 +391,42 @@ GdbObj::RevertStatus( void)
return true ;
}
+//----------------------------------------------------------------------------
+bool
+GdbObj::IsOff( void) const
+{
+ // se non ci sono attributi
+ if ( m_pAttribs == nullptr)
+ return false ;
+
+ // lo stato è definito
+ return ( m_pAttribs->GetStatus() == GDB_ST_OFF) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbObj::IsOn( void) const
+{
+ // se non ci sono attributi (On di default)
+ if ( m_pAttribs == nullptr)
+ return true ;
+
+ // lo stato è definito
+ return ( m_pAttribs->GetStatus() == GDB_ST_ON) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbObj::IsSelected( void) const
+{
+ // se non ci sono attributi
+ if ( m_pAttribs == nullptr)
+ return false ;
+
+ // lo stato è definito
+ return ( m_pAttribs->GetStatus() == GDB_ST_SEL) ;
+}
+
//----------------------------------------------------------------------------
bool
GdbObj::GetStatus( int& nStat) const
@@ -437,6 +473,70 @@ GdbObj::GetCalcStatus( int& nStat, int nLev) const
return true ;
}
+//----------------------------------------------------------------------------
+bool
+GdbObj::SetMark( void)
+{
+ // verifico esistenza (con eventuale creazione) degli attributi
+ if ( GetSafeAttribs() == nullptr)
+ return false ;
+
+ // assegno la marcatura
+ m_pAttribs->SetMark() ;
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbObj::ResetMark( void)
+{
+ // se non ci sono attributi non fa alcunchè
+ if ( m_pAttribs == nullptr)
+ return true ;
+
+ // cancello la marcatura
+ m_pAttribs->ResetMark() ;
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbObj::GetMark( int& nMark) const
+{
+ // se non ci sono attributi
+ if ( m_pAttribs == nullptr)
+ return false ;
+
+ // la marcatura è definito
+ nMark = m_pAttribs->GetMark() ;
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GdbObj::GetCalcMark( int& nMark) const
+{
+ // recupero la marcatura dell'oggetto
+ int nObjMark = GDB_MK_OFF ;
+ if ( m_pAttribs != nullptr)
+ nObjMark = m_pAttribs->GetMark() ;
+
+ // se la marcatura è ON, non ho bisogno di sapere altro
+ if ( nObjMark == GDB_MK_ON) {
+ nMark = GDB_MK_ON ;
+ return true ;
+ }
+
+ // recupero la marcatura dell'eventuale padre
+ int nParentMark = GDB_MK_OFF ;
+ if ( GetParent() != nullptr)
+ GetParent()->GetCalcMark( nParentMark) ;
+
+ // calcolo la marcatura
+ nMark = ::CalcMark( nObjMark, nParentMark) ;
+ return true ;
+}
+
//----------------------------------------------------------------------------
bool
GdbObj::SetMaterial( int nMat)
diff --git a/GdbObj.h b/GdbObj.h
index 49d1b19..8406b09 100644
--- a/GdbObj.h
+++ b/GdbObj.h
@@ -63,8 +63,15 @@ class GdbObj
bool GetCalcMode( int& nMode) const ;
bool SetStatus( int nStat) ;
bool RevertStatus( void) ;
+ bool IsOff( void) const ;
+ bool IsOn( void) const ;
+ bool IsSelected( void) const ;
bool GetStatus( int& nStat) const ;
bool GetCalcStatus( int& nStat, int nLev = 0) const ;
+ bool SetMark( void) ;
+ bool ResetMark( void) ;
+ bool GetMark( int& nMark) const ;
+ bool GetCalcMark( int& nMark) const ;
bool SetMaterial( int nMat) ;
bool SetMaterial( Color cCol) ;
bool GetMaterial( int& nMat) const ;
diff --git a/GeomDB.cpp b/GeomDB.cpp
index e53ebc3..7084125 100644
--- a/GeomDB.cpp
+++ b/GeomDB.cpp
@@ -50,6 +50,8 @@ GeomDB::~GeomDB( void)
bool
GeomDB::Init( void)
{
+ // pulizia
+ Clear() ;
// imposto numero minimo buckets del map degli Id
m_IdManager.Init( 1024) ;
// imposto materiale di default
@@ -62,9 +64,10 @@ GeomDB::Init( void)
bool
GeomDB::Clear( void)
{
- // elimino mappa degli identificatori
+ // pulisco mappa degli identificatori
m_IdManager.Clear() ;
-
+ // pulisco lista dei selezionati
+ m_SelManager.Clear() ;
// disalloco i gruppi e gli oggetti
m_GrpRadix.Clear() ;
@@ -247,7 +250,7 @@ GeomDB::SaveHeader( ostream& osOut) const
{
// intestazione
osOut << "START" << endl ;
- osOut << "GeomDB,1.5.3.7;" << endl ;
+ osOut << "GeomDB,1.5.3.8;" << endl ;
// materiale di default come colore
osOut << "MAT_DEF" << endl ;
@@ -607,15 +610,12 @@ GeomDB::CopyGlob( int nIdSou, int nIdDest, int nParentIdDest)
bool
GeomDB::Erase( int nId)
{
- INTPGDBO_UMAP::const_iterator Iter ;
- GdbObj* pGdbObj ;
-
-
// non si può cancellare il gruppo radice (escludo anche Id non validi)
if ( nId <= GDB_ID_ROOT)
return false ;
// recupero l'oggetto
+ GdbObj* pGdbObj ;
pGdbObj = m_IdManager.FindObj( nId) ;
if ( pGdbObj == nullptr)
return false ;
@@ -623,6 +623,9 @@ GeomDB::Erase( int nId)
// elimino da mappa dei nomi
m_IdManager.RemoveObj( nId) ;
+ // eliminazione eventuale da lista dei selezionati
+ m_SelManager.RemoveObj( pGdbObj) ;
+
// lo tolgo dalla lista
pGdbObj->Remove() ;
@@ -766,6 +769,130 @@ GeomDB::MirrorGlob( int nId, const Point3d& ptOn, const Vector3d& vtNorm)
return pGdbObj->Mirror( ptOnLoc, vtNormLoc) ;
}
+//----------------------------------------------------------------------------
+// Selection
+//----------------------------------------------------------------------------
+bool
+GeomDB::SelectObj( int nId)
+{
+ // recupero l'oggetto
+ GdbObj* pGdbObj ;
+ if ( ( pGdbObj = GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ return SetStatus( pGdbObj, GDB_ST_SEL) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::DeselectObj( int nId)
+{
+ // recupero l'oggetto
+ GdbObj* pGdbObj ;
+ if ( ( pGdbObj = GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ // se selezionato, lo deseleziono
+ if ( pGdbObj->IsSelected())
+ return SetStatus( pGdbObj, GDB_ST_ON) ;
+ // altrimenti, va già bene
+ else
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::SelectGroupObjs( int nId)
+{
+ // recupero il gruppo Gdb
+ GdbGroup* pGdbGroup ;
+ if ( ( pGdbGroup = GetGdbGroup( nId)) == nullptr)
+ return false ;
+
+ // ciclo sugli oggetti del gruppo e li seleziono
+ GdbObj* pGdbObj = pGdbGroup->GetFirstObj() ;
+ while ( pGdbObj != nullptr) {
+ if ( ! SetStatus( pGdbObj, GDB_ST_SEL))
+ return false ;
+ pGdbObj = pGdbObj->GetNext() ;
+ }
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::DeselectGroupObjs( int nId)
+{
+ // recupero il gruppo Gdb
+ GdbGroup* pGdbGroup ;
+ if ( ( pGdbGroup = GetGdbGroup( nId)) == nullptr)
+ return false ;
+
+ // ciclo sugli oggetti del gruppo e li seleziono
+ GdbObj* pGdbObj = pGdbGroup->GetFirstObj() ;
+ while ( pGdbObj != nullptr) {
+ // se selezionato, lo deseleziono
+ if ( pGdbObj->IsSelected()) {
+ if ( ! SetStatus( pGdbObj, GDB_ST_ON))
+ return false ;
+ }
+ pGdbObj = pGdbObj->GetNext() ;
+ }
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::IsSelectedObj( int nId) const
+{
+ // recupero l'oggetto
+ const GdbObj* pGdbObj ;
+ if ( ( pGdbObj = (const_cast(this))->GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ // recupero lo stato
+ return pGdbObj->IsSelected() ;
+}
+
+//----------------------------------------------------------------------------
+int
+GeomDB::GetSelectedObjNbr( void) const
+{
+ return m_SelManager.GetSize() ;
+}
+
+//----------------------------------------------------------------------------
+int
+GeomDB::GetFirstSelectedObj( void) const
+{
+ GdbObj* pGObj = m_SelManager.GetFirstObj() ;
+
+ return (( pGObj == nullptr) ? GDB_ID_NULL : pGObj->m_nId) ;
+}
+
+//----------------------------------------------------------------------------
+int
+GeomDB::GetNextSelectedObj( void) const
+{
+ GdbObj* pGObj = m_SelManager.GetNextObj() ;
+
+ return (( pGObj == nullptr) ? GDB_ID_NULL : pGObj->m_nId) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::ClearSelection( void)
+{
+ GdbObj* pGObj = m_SelManager.GetFirstObj() ;
+ while ( pGObj != nullptr) {
+ m_SelManager.RemoveObj( pGObj) ;
+ pGObj->SetStatus( GDB_ST_ON) ;
+ pGObj = m_SelManager.GetFirstObj() ;
+ }
+
+ return true ;
+}
+
//----------------------------------------------------------------------------
// Attributes
//----------------------------------------------------------------------------
@@ -899,8 +1026,29 @@ GeomDB::SetStatus( int nId, int nStat)
if ( ( pGdbObj = GetGdbObj( nId)) == nullptr)
return false ;
+ return SetStatus( pGdbObj, nStat) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::SetStatus( GdbObj* pGdbObj, int nStat)
+{
+ // verifico validità oggetto
+ if ( pGdbObj == nullptr)
+ return false ;
+
// assegno lo stato
- return pGdbObj->SetStatus( nStat) ;
+ if ( ! pGdbObj->SetStatus( nStat))
+ return false ;
+
+ // se il nuovo stato è selezionato, inserisco oggetto in lista selezionati
+ if ( nStat == GDB_ST_SEL)
+ m_SelManager.AddObj( pGdbObj) ;
+ // altrimenti provo a toglierlo
+ else
+ m_SelManager.RemoveObj( pGdbObj) ;
+
+ return true ;
}
//----------------------------------------------------------------------------
@@ -912,8 +1060,30 @@ GeomDB::RevertStatus( int nId)
if ( ( pGdbObj = GetGdbObj( nId)) == nullptr)
return false ;
+ return RevertStatus( pGdbObj) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::RevertStatus( GdbObj* pGdbObj)
+{
+ // verifico validità oggetto
+ if ( pGdbObj == nullptr)
+ return false ;
+
// ripristino lo stato precedente
- return pGdbObj->RevertStatus() ;
+ if ( ! pGdbObj->RevertStatus())
+ return false ;
+
+ // se il nuovo stato è selezionato, inserisco oggetto in lista selezionati
+ int nStat = GDB_ST_ON ;
+ if ( pGdbObj->GetStatus( nStat) && nStat == GDB_ST_SEL)
+ m_SelManager.AddObj( pGdbObj) ;
+ // altrimenti provo a toglierlo
+ else
+ m_SelManager.RemoveObj( pGdbObj) ;
+
+ return true ;
}
//----------------------------------------------------------------------------
@@ -942,6 +1112,58 @@ GeomDB::GetCalcStatus( int nId, int& nStat) const
return pGdbObj->GetCalcStatus( nStat) ;
}
+//----------------------------------------------------------------------------
+bool
+GeomDB::SetMark( int nId)
+{
+ // recupero l'oggetto
+ GdbObj* pGdbObj ;
+ if ( ( pGdbObj = GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ // imposto la marcatura
+ return pGdbObj->SetMark() ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::ResetMark( int nId)
+{
+ // recupero l'oggetto
+ GdbObj* pGdbObj ;
+ if ( ( pGdbObj = GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ // cancello la marcatura
+ return pGdbObj->ResetMark() ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::GetMark( int nId, int& nMark) const
+{
+ // recupero l'oggetto
+ const GdbObj* pGdbObj ;
+ if ( ( pGdbObj = (const_cast(this))->GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ // recupero la marcatura
+ return pGdbObj->GetMark( nMark) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+GeomDB::GetCalcMark( int nId, int& nMark) const
+{
+ // recupero l'oggetto
+ const GdbObj* pGdbObj ;
+ if ( ( pGdbObj = (const_cast(this))->GetGdbObj( nId)) == nullptr)
+ return false ;
+
+ // recupero la marcatura calcolata
+ return pGdbObj->GetCalcMark( nMark) ;
+}
+
//----------------------------------------------------------------------------
bool
GeomDB::SetDefaultMaterial( Color cCol)
diff --git a/GeomDB.h b/GeomDB.h
index 96985fc..be733d2 100644
--- a/GeomDB.h
+++ b/GeomDB.h
@@ -16,6 +16,7 @@
#include "GdbGeo.h"
#include "GdbGroup.h"
#include "IdManager.h"
+#include "SelManager.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include
@@ -66,6 +67,17 @@ class GeomDB : public IGeomDB
virtual bool ScaleGlob( int nId, const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ) ;
virtual bool Mirror( int nId, const Point3d& ptOn, const Vector3d& vtNorm) ;
virtual bool MirrorGlob( int nId, const Point3d& ptOn, const Vector3d& vtNorm) ;
+ // selection
+ virtual bool SelectObj( int nId) ;
+ virtual bool DeselectObj( int nId) ;
+ virtual bool SelectGroupObjs( int nId) ;
+ virtual bool DeselectGroupObjs( int nId) ;
+ virtual bool IsSelectedObj( int nId) const ;
+ virtual int GetSelectedObjNbr( void) const ;
+ virtual int GetFirstSelectedObj( void) const ;
+ virtual int GetNextSelectedObj( void) const ;
+ virtual bool ClearSelection( void) ;
+ // attributes
virtual bool DumpAttributes( int nId, std::string& sOut, const char* szNewLine) const ;
virtual bool SetLevel( int nId, int nLevel) ;
virtual bool RevertLevel( int nId) ;
@@ -79,6 +91,10 @@ class GeomDB : public IGeomDB
virtual bool RevertStatus( int nId) ;
virtual bool GetStatus( int nId, int& nStat) const ;
virtual bool GetCalcStatus( int nId, int& nStat) const ;
+ virtual bool SetMark( int nId) ;
+ virtual bool ResetMark( int nId) ;
+ virtual bool GetMark( int nId, int& nMark) const ;
+ virtual bool GetCalcMark( int nId, int& nMark) const ;
virtual bool SetDefaultMaterial( Color cCol) ;
virtual bool GetDefaultMaterial( Color& cCol) const ;
virtual bool SetMaterial( int nId, int nMat) ;
@@ -107,8 +123,11 @@ class GeomDB : public IGeomDB
bool LoadHeader( Scanner& TheScanner) ;
bool LoadOneObj( Scanner& TheScanner, bool& bEnd) ;
bool SaveHeader( std::ostream& osOut) const ;
+ bool SetStatus( GdbObj* pGdbObj, int nStat) ;
+ bool RevertStatus( GdbObj* pGdbObj) ;
private :
- GdbGroup m_GrpRadix ; // gruppo radice di tutto il DB
- IdManager m_IdManager ; // gestore del nuovo Id
+ GdbGroup m_GrpRadix ; // gruppo radice di tutto il DB
+ IdManager m_IdManager ; // gestore del nuovo Id
+ SelManager m_SelManager ; // gestore lista oggetti selezionati
} ;
diff --git a/IdManager.h b/IdManager.h
index b737f87..186af9b 100644
--- a/IdManager.h
+++ b/IdManager.h
@@ -16,9 +16,6 @@
#include
-//----------------------------------------------------------------------------
-typedef std::unordered_map< int, GdbObj*> INTPGDBO_UMAP ;
-
//----------------------------------------------------------------------------
class IdManager
{
@@ -47,6 +44,9 @@ class IdManager
void UpdateMaxId( int nId)
{ if ( nId > m_nMaxId) m_nMaxId = nId ; }
+ private :
+ typedef std::unordered_map< int, GdbObj*> INTPGDBO_UMAP ;
+
private :
int m_nMaxId ;
INTPGDBO_UMAP m_GdbIdMap ; // map basato sugli identificatori
diff --git a/SelManager.h b/SelManager.h
new file mode 100644
index 0000000..dbe2cdc
--- /dev/null
+++ b/SelManager.h
@@ -0,0 +1,76 @@
+//----------------------------------------------------------------------------
+// EgalTech 2014-2014
+//----------------------------------------------------------------------------
+// File : SelManager.h Data : 19.03.14 Versione : 1.5c8
+// Contenuto : Dichiarazione e implementazione della classe SelManager.
+//
+//
+//
+// Modifiche : 19.03.14 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+#pragma once
+
+#include "GdbObj.h"
+#include
+
+
+//----------------------------------------------------------------------------
+typedef std::list PGDBO_LIST ;
+
+//----------------------------------------------------------------------------
+class SelManager
+{
+ public :
+ SelManager( void)
+ { m_Iter = m_SelList.end() ; }
+ void Clear( void)
+ { m_SelList.clear() ;
+ m_Iter = m_SelList.end() ; }
+ int GetSize( void) const
+ { return int ( m_SelList.size()) ; }
+ bool IsObjInList( GdbObj* pGObj)
+ { PGDBO_LIST::const_iterator Iter ;
+ for ( Iter = m_SelList.begin() ; Iter != m_SelList.end() ; ++ Iter) {
+ if ( *Iter == pGObj)
+ return true ;
+ }
+ return false ; }
+ bool AddObj( GdbObj* pGObj)
+ { if ( pGObj == nullptr)
+ return false ;
+ if ( IsObjInList( pGObj))
+ return true ;
+ try { m_SelList.push_back( pGObj) ; }
+ catch (...) { return false ;}
+ 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 ;
+ }
+ }
+ return true ; }
+ GdbObj* GetFirstObj( void) const
+ { m_Iter = m_SelList.begin() ;
+ if ( m_Iter == m_SelList.end())
+ return nullptr ;
+ return (*m_Iter) ; }
+ 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) ; }
+
+ private :
+ PGDBO_LIST m_SelList ;
+ mutable PGDBO_LIST::const_iterator m_Iter ;
+} ;