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 ; +} ;