X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMGUI%2FGeometryGUI.cxx;h=f2d36230ae88e578cb6c2240ffca8777d039665d;hb=81eb14d32092a9cb23b23b2253de1dfb97103de2;hp=ffe4ee97f4022bb421b19b89dd9794054274ffb0;hpb=c94c721135361d4ac877d3a67b98bc29b7ee2c5f;p=modules%2Fgeom.git diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index ffe4ee97f..f2d36230a 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -39,20 +39,22 @@ #include "GEOM_Displayer.h" #include "GEOM_AISShape.hxx" #include "GEOMUtils_XmlHandler.hxx" +#include "GEOMGUI_AnnotationMgr.h" +#include "GEOMGUI_TextTreeSelector.h" #include "GEOM_Actor.h" #include #include +#include + #include #include #include #include #include -#include - #include #include #include @@ -66,7 +68,9 @@ #include #include +#ifndef DISABLE_GRAPHICSVIEW #include +#endif #include #include @@ -86,8 +90,8 @@ #include -#include #include +#include // External includes #include @@ -137,8 +141,6 @@ extern "C" { } } -GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap; - GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil(); GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen() @@ -171,23 +173,32 @@ CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject) anObj = anORB->string_to_object(aValue.c_str()); } } catch(...) { - INFOS("ClientSObjectToObject - Unknown exception was occured!!!"); + INFOS("ClientSObjectToObject - Unknown exception has occurred!!!"); } return anObj._retn(); } +//================================================================================= +// function : IsInGeomComponent +// purpose : Check if an SObject is under GEOM component +//================================================================================= +bool GeometryGUI::IsInGeomComponent( _PTR(SObject) sobject ) +{ + if ( sobject ) + if ( _PTR(SComponent) aComp = sobject->GetFatherComponent() ) + return aComp->ComponentDataType() == "GEOM"; + return false; +} //======================================================================= -// function : ClientStudyToStudy +// function : GetStudy // purpose : //======================================================================= -SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy) +SALOMEDS::Study_var GeometryGUI::getStudyServant() { SALOME_NamingService *aNamingService = SalomeApp_Application::namingService(); - CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager"); - SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject); - int aStudyID = theStudy->StudyId(); - SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID); - return aDSStudy._retn(); + CORBA::Object_var aStudyObject = aNamingService->Resolve("/Study"); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(aStudyObject); + return aStudy._retn(); } void GeometryGUI::Modified (bool theIsUpdateActions) @@ -227,8 +238,9 @@ GeometryGUI::GeometryGUI() : myCreationInfoWdg = 0; myTextTreeWdg = 0; + myAnnotationMgr = 0; - connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) ); + connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ), Qt::UniqueConnection ); Q_INIT_RESOURCE( GEOMGUI ); } @@ -257,20 +269,26 @@ GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName ) { if ( !myGUIMap.contains( libraryName ) ) { // try to load library if it is not loaded yet -#ifndef WIN32 - QString dirs = getenv( "LD_LIBRARY_PATH" ); - QString sep = ":"; +#if defined(WIN32) + QString dirs = Qtx::getenv( "PATH" ); +#elif defined(__APPLE__) + QString dirs = Qtx::getenv( "DYLD_LIBRARY_PATH" ); #else - QString dirs = getenv( "PATH" ); + QString dirs = Qtx::getenv( "LD_LIBRARY_PATH" ); +#endif +#if defined(WIN32) QString sep = ";"; +#else + QString sep = ":"; #endif + if ( !dirs.isEmpty() ) { QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries QListIterator it( dirList ); it.toBack(); while ( it.hasPrevious() ) { QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName ); if ( fi.exists() ) { - OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() ); + OSD_SharedLibrary aSharedLibrary( fi.fileName().toUtf8().constData() ); bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY ); if ( !res ) { MESSAGE( "Can't open library : " << aSharedLibrary.DlError() ); @@ -301,20 +319,27 @@ GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName ) { if ( !myGUIMap.contains( libraryName ) ) { // try to load library if it is not loaded yet -#ifndef WIN32 - QString dirs = getenv( "LD_LIBRARY_PATH" ); - QString sep = ":"; + +#if defined(WIN32) + QString dirs = Qtx::getenv( "PATH" ); +#elif defined(__APPLE__) + QString dirs = Qtx::getenv( "DYLD_LIBRARY_PATH" ); #else - QString dirs = getenv( "PATH" ); + QString dirs = Qtx::getenv( "LD_LIBRARY_PATH" ); +#endif +#if defined(WIN32) QString sep = ";"; +#else + QString sep = ":"; #endif + if ( !dirs.isEmpty() ) { QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries QListIterator it( dirList ); it.toBack(); while ( it.hasPrevious() ) { QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName ); if ( fi.exists() ) { - OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() ); + OSD_SharedLibrary aSharedLibrary( fi.fileName().toUtf8().constData() ); bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY ); if ( !res ) { MESSAGE( "Can't open library : " << aSharedLibrary.DlError() ); @@ -373,6 +398,26 @@ void GeometryGUI::ActiveWorkingPlane() } } +//======================================================================= +// function : GeometryGUI::SetActiveDialogBox() +// purpose : Set active dialog box +//======================================================================= +GEOMGUI_AnnotationMgr* GeometryGUI::GetAnnotationMgr() +{ + if ( !myAnnotationMgr ) + myAnnotationMgr = new GEOMGUI_AnnotationMgr( getApp() ); + return myAnnotationMgr; +} + +//======================================================================= +// function : GeometryGUI::SetActiveDialogBox() +// purpose : Set active dialog box +//======================================================================= +GEOMGUI_TextTreeWdg* GeometryGUI::GetTextTreeWdg() const +{ + return myTextTreeWdg; +} + //======================================================================= // function : GeometryGUI::SetActiveDialogBox() // purpose : Set active dialog box @@ -438,7 +483,11 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) SUIT_ViewWindow* window = desk->activeWindow(); bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); +#ifndef DISABLE_GRAPHICSVIEW bool ViewDep = ( window && window->getViewManager()->getType() == GraphicsView_Viewer::Type() ); +#else + bool ViewDep = 0; +#endif // if current viewframe is not of OCC and not of VTK type - return immediately // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example) QList NotViewerDependentCommands; @@ -479,7 +528,9 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpSelectCompound: // POPUP MENU - SELECT ONLY - COMPOUND case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL case GEOMOp::OpDelete: // MENU EDIT - DELETE +#ifndef DISABLE_PYCONSOLE case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY +#endif case GEOMOp::OpMaterialsLibrary: // MENU TOOLS - MATERIALS LIBRARY case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT case GEOMOp::OpColor: // POPUP MENU - COLOR @@ -498,15 +549,18 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES - case GEOMOp::OpPredefMaterial: // POPUP MENU - - case GEOMOp::OpPredefMaterCustom: // POPUP MENU - MATERIAL PROPERTIES - CUSTOM... + case GEOMOp::OpMaterialMenu: // POPUP MENU - MATERIAL PROPERTIES (sub-menu) + case GEOMOp::OpPredefMaterial: // POPUP MENU - MATERIAL PROPERTIES (sub-menu) - + case GEOMOp::OpPredefMaterCustom: // POPUP MENU - MATERIAL PROPERTIES (sub-menu) - CUSTOM... case GEOMOp::OpEdgeWidth: // POPUP MENU - LINE WIDTH - EDGE WIDTH case GEOMOp::OpIsosWidth: // POPUP MENU - LINE WIDTH - ISOS WIDTH case GEOMOp::OpBringToFront: // POPUP MENU - BRING TO FRONT case GEOMOp::OpClsBringToFront: // case GEOMOp::OpCreateFolder: // POPUP MENU - CREATE FOLDER case GEOMOp::OpSortChildren: // POPUP MENU - SORT CHILD ITEMS +#ifndef DISABLE_GRAPHICSVIEW case GEOMOp::OpShowDependencyTree: // POPUP MENU - SHOW DEPENDENCY TREE +#endif case GEOMOp::OpReduceStudy: // POPUP MENU - REDUCE STUDY libName = "GEOMToolsGUI"; break; @@ -580,7 +634,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpFace: // MENU BUILD - FACE case GEOMOp::OpShell: // MENU BUILD - SHELL case GEOMOp::OpSolid: // MENU BUILD - SOLID - case GEOMOp::OpCompound: // MENU BUILD - COMPUND + case GEOMOp::OpCompound: // MENU BUILD - COMPOUND libName = "BuildGUI"; break; case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE @@ -607,7 +661,6 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER - case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D @@ -615,6 +668,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpExtrudedBoss: // MENU OPERATION - EXTRUDED BOSS case GEOMOp::OpExtrudedCut: // MENU OPERATION - EXTRUDED CUT case GEOMOp::OpTransferData: // MENU OPERATION - TRANSFER DATA + case GEOMOp::OpExtraction: // MENU OPERATION - EXTRACT AND REBUILD libName = "OperationGUI"; break; case GEOMOp::OpSewing: // MENU REPAIR - SEWING @@ -653,9 +707,16 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS case GEOMOp::OpFastCheckInters: // MENU MEASURE - FAST CHECK INTERSECTIONS case GEOMOp::OpManageDimensions: // MENU MEASURE - MANAGE DIMENSIONS + case GEOMOp::OpAnnotation: // MENU MEASURE - ANNOTATION + case GEOMOp::OpEditAnnotation: // POPUP MENU - EDIT ANNOTATION + case GEOMOp::OpDeleteAnnotation: // POPUP MENU - DELETE ANNOTATION +#ifndef DISABLE_PLOT2DVIEWER case GEOMOp::OpShapeStatistics: // MENU MEASURE - SHAPE STATISTICS +#endif case GEOMOp::OpShowAllDimensions: // POPUP MENU - SHOW ALL DIMENSIONS case GEOMOp::OpHideAllDimensions: // POPUP MENU - HIDE ALL DIMENSIONS + case GEOMOp::OpShowAllAnnotations: // POPUP MENU - SHOW ALL ANNOTATIONS + case GEOMOp::OpHideAllAnnotations: // POPUP MENU - HIDE ALL ANNOTATIONS libName = "MeasureGUI"; break; case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE @@ -688,10 +749,12 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) GEOMPluginGUI* library = 0; if ( !libName.isEmpty() ) { -#ifndef WIN32 - libName = QString( "lib" ) + libName + ".so"; -#else +#if defined(WIN32) libName = libName + ".dll"; +#elif defined(__APPLE__) + libName = QString( "lib" ) + libName + ".dylib"; +#else + libName = QString( "lib" ) + libName + ".so"; #endif library = getPluginLibrary( libName ); } @@ -717,10 +780,12 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) GEOMGUI* library = 0; if ( !libName.isEmpty() ) { -#ifndef WIN32 - libName = QString( "lib" ) + libName + ".so"; -#else +#if defined(WIN32) libName = libName + ".dll"; +#elif defined(__APPLE__) + libName = QString( "lib" ) + libName + ".dylib"; +#else + libName = QString( "lib" ) + libName + ".so"; #endif library = getLibrary( libName ); } @@ -872,9 +937,8 @@ void GeometryGUI::createOriginAndBaseVectors() return; } if ( appStudy ) { - _PTR(Study) studyDS = appStudy->studyDS(); - if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) { - GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() ); + if ( !CORBA::is_nil( GetGeomGen() ) ) { + GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations(); if ( !aBasicOperations->_is_nil() ) { SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 ); @@ -883,11 +947,15 @@ void GeometryGUI::createOriginAndBaseVectors() GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 ); GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength ); - SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOrigin, "O" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOX, "OX" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOY, "OY" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOZ, "OZ" ); + anOrigin->UnRegister(); + anOX->UnRegister(); + anOY->UnRegister(); + anOZ->UnRegister(); + aBasicOperations->UnRegister(); getApp()->updateObjectBrowser( true ); } @@ -986,10 +1054,10 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpArchimede, "ARCHIMEDE" ); createGeomAction( GEOMOp::OpFillet3d, "FILLET" ); createGeomAction( GEOMOp::OpChamfer, "CHAMFER" ); - //createGeomAction( GEOMOp::OpClipping, "CLIPPING" ); createGeomAction( GEOMOp::OpShapesOnShape, "GET_SHAPES_ON_SHAPE" ); createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" ); createGeomAction( GEOMOp::OpTransferData, "TRANSFER_DATA" ); + createGeomAction( GEOMOp::OpExtraction, "EXTRACTION" ); createGeomAction( GEOMOp::OpExtrudedCut, "EXTRUDED_CUT" ); createGeomAction( GEOMOp::OpExtrudedBoss, "EXTRUDED_BOSS" ); createGeomAction( GEOMOp::OpFillet1d, "FILLET_1D" ); @@ -1027,6 +1095,9 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpMinDistance, "MIN_DIST" ); createGeomAction( GEOMOp::OpAngle, "MEASURE_ANGLE" ); createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" ); + createGeomAction( GEOMOp::OpAnnotation, "ANNOTATION" ); + createGeomAction( GEOMOp::OpEditAnnotation, "EDIT_ANNOTATION" ); + createGeomAction( GEOMOp::OpDeleteAnnotation, "DELETE_ANNOTATION" ); createGeomAction( GEOMOp::OpTolerance, "TOLERANCE" ); createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" ); @@ -1035,10 +1106,14 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpGetNonBlocks, "GET_NON_BLOCKS" ); createGeomAction( GEOMOp::OpCheckSelfInters, "CHECK_SELF_INTERSECTIONS" ); createGeomAction( GEOMOp::OpFastCheckInters, "FAST_CHECK_INTERSECTIONS" ); +#ifndef DISABLE_PLOT2DVIEWER createGeomAction( GEOMOp::OpShapeStatistics, "SHAPE_STATISTICS" ); +#endif +#ifndef DISABLE_PYCONSOLE #ifdef _DEBUG_ // PAL16821 createGeomAction( GEOMOp::OpCheckGeom, "CHECK_GEOMETRY" ); +#endif #endif createGeomAction( GEOMOp::OpMaterialsLibrary, "MATERIALS_LIBRARY" ); @@ -1091,12 +1166,18 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" ); createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" ); createGeomAction( GEOMOp::OpPredefMaterCustom, "POP_PREDEF_MATER_CUSTOM" ); + createGeomAction( GEOMOp::OpMaterialMenu, "POP_MATERIAL_PROPERTIES"); + action(GEOMOp::OpMaterialMenu)->setMenu( new QMenu() ); createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" ); createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" ); +#ifndef DISABLE_GRAPHICSVIEW createGeomAction( GEOMOp::OpShowDependencyTree, "POP_SHOW_DEPENDENCY_TREE" ); - createGeomAction( GEOMOp::OpReduceStudy, "POP_REDUCE_STUDY" ); - createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" ); - createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" ); +#endif + createGeomAction( GEOMOp::OpReduceStudy, "POP_REDUCE_STUDY" ); + createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" ); + createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" ); + createGeomAction( GEOMOp::OpShowAllAnnotations, "POP_SHOW_ALL_ANNOTATIONS" ); + createGeomAction( GEOMOp::OpHideAllAnnotations, "POP_HIDE_ALL_ANNOTATIONS" ); // Create actions for increase/decrease transparency shortcuts createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false, @@ -1118,7 +1199,7 @@ void GeometryGUI::initialize( CAM_Application* app ) // ---- create menus -------------------------- - int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 ); + /*int fileId =*/ createMenu( tr( "MEN_FILE" ), -1, -1 ); int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 ); createMenu( GEOMOp::OpDelete, editId, -1 ); @@ -1241,6 +1322,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpShapesOnShape, operId, -1 ); createMenu( GEOMOp::OpSharedShapes, operId, -1 ); createMenu( GEOMOp::OpTransferData, operId, -1 ); + createMenu( GEOMOp::OpExtraction, operId, -1 ); createMenu( separator(), operId, -1 ); @@ -1250,7 +1332,6 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpChamfer, operId, -1 ); createMenu( GEOMOp::OpExtrudedBoss, operId, -1 ); createMenu( GEOMOp::OpExtrudedCut, operId, -1 ); - //createMenu( GEOMOp::OpClipping, operId, -1 ); int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 ); createMenu( GEOMOp::OpShapeProcess, repairId, -1 ); @@ -1289,6 +1370,8 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpAngle, dimId, -1 ); createMenu( GEOMOp::OpManageDimensions, dimId, -1 ); + createMenu( GEOMOp::OpAnnotation, measurId, -1 ); + createMenu( separator(), measurId, -1 ); createMenu( GEOMOp::OpTolerance, measurId, -1 ); createMenu( separator(), measurId, -1 ); @@ -1299,12 +1382,16 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 ); createMenu( GEOMOp::OpFastCheckInters, measurId, -1 ); createMenu( GEOMOp::OpInspectObj, measurId, -1 ); +#ifndef DISABLE_PLOT2DVIEWER createMenu( GEOMOp::OpShapeStatistics, measurId, -1 ); +#endif int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 ); +#ifndef DISABLE_PYCONSOLE #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821 createMenu( separator(), toolsId, -1 ); createMenu( GEOMOp::OpCheckGeom, toolsId, -1 ); +#endif #endif createMenu( separator(), toolsId, -1 ); @@ -1413,6 +1500,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpShapesOnShape, operTbId ); createTool( GEOMOp::OpSharedShapes, operTbId ); createTool( GEOMOp::OpTransferData, operTbId ); + createTool( GEOMOp::OpExtraction, operTbId ); int featTbId = createTool( tr( "TOOL_FEATURES" ), QString( "GEOMModification" ) ); createTool( GEOMOp::OpFillet1d, featTbId ); @@ -1440,6 +1528,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpBoundingBox, measureTbId ); createTool( GEOMOp::OpMinDistance, measureTbId ); createTool( GEOMOp::OpAngle, measureTbId ); + createTool( GEOMOp::OpAnnotation, measureTbId ); createTool( GEOMOp::OpTolerance , measureTbId ); createTool( separator(), measureTbId ); createTool( GEOMOp::OpFreeBoundaries, measureTbId ); @@ -1540,7 +1629,9 @@ void GeometryGUI::initialize( CAM_Application* app ) // material properties mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 ); - mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and matMenu=false", QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpMaterialMenu ), -1, -1 ); + mgr->setRule( action( GEOMOp::OpMaterialMenu ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and matMenu=true", QtxPopupMgr::VisibleRule ); // texture mgr->insert( action( GEOMOp::OpSetTexture ), -1, -1 ); @@ -1560,6 +1651,12 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpEditAnnotation ), -1, -1 ); // edit annotation + mgr->setRule( action( GEOMOp::OpEditAnnotation ), clientOCC + " and annotationsCount=1", QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpDeleteAnnotation ), -1, -1 ); // delete annotation + mgr->setRule( action( GEOMOp::OpDeleteAnnotation ), clientOCC + " and annotationsCount>0", QtxPopupMgr::VisibleRule ); + mgr->insert( separator(), -1, -1 ); // ----------- + QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ", onlyComponent = "((type='Component') and selcount=1)", rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")", @@ -1614,6 +1711,10 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpShowAllAnnotations ), -1, -1 ); // show all annotations + mgr->setRule( action( GEOMOp::OpShowAllAnnotations ), aDimensionRule.arg( "hasHiddenAnnotations" ), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpHideAllAnnotations ), -1, -1 ); // hide all annotations + mgr->setRule( action( GEOMOp::OpHideAllAnnotations ), aDimensionRule.arg( "hasVisibleAnnotations" ), QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object @@ -1633,9 +1734,11 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule ); +#ifndef DISABLE_GRAPHICSVIEW mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpShowDependencyTree ), -1, -1 ); // Show dependency tree mgr->setRule( action( GEOMOp::OpShowDependencyTree ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule ); +#endif mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpReduceStudy ), -1, -1 ); // Reduce Study @@ -1686,7 +1789,7 @@ void GeometryGUI::addPluginActions() // icon QPixmap icon; if ( !adata.icon.empty() ) - icon = resMgr->loadPixmap( pdata.name.c_str(), adata.icon.c_str() ); + icon = resMgr->loadPixmap( pdata.name.c_str(), adata.icon.c_str() ); // menu text (path) QStringList smenus = QString( adata.menuText.c_str() ).split( "/" ); QString actionName = smenus.last(); @@ -1703,30 +1806,30 @@ void GeometryGUI::addPluginActions() actionStat = actionStat.toUpper().prepend( "STB_" ); createAction( id, // ~ adata.label - tr( actionTool.toLatin1().constData() ), - icon, - tr( actionName.toLatin1().constData() ), - tr( actionStat.toLatin1().constData() ), - QKeySequence( tr( adata.accel.c_str() ) ), - application()->desktop(), - false /*toggle*/, - this, SLOT( OnGUIEvent() ), - QString() /*shortcutAction*/ ); + tr( actionTool.toLatin1().constData() ), + icon, + tr( actionName.toLatin1().constData() ), + tr( actionStat.toLatin1().constData() ), + QKeySequence( tr( adata.accel.c_str() ) ), + application()->desktop(), + false /*toggle*/, + this, SLOT( OnGUIEvent() ), + QString() /*shortcutAction*/ ); int menuId = -1; foreach ( QString subMenu, smenus ) { - QStringList subMenuList = subMenu.split( ":" ); - QString subMenuName = subMenuList[0].toUpper().prepend( "MEN_" ); - int subMenuGroup = subMenuList.size() > 1 ? subMenuList[1].toInt() : -1; - menuId = createMenu( tr( subMenuName.toLatin1().constData() ), menuId, -1, subMenuGroup ); + QStringList subMenuList = subMenu.split( ":" ); + QString subMenuName = subMenuList[0].toUpper().prepend( "MEN_" ); + int subMenuGroup = subMenuList.size() > 1 ? subMenuList[1].toInt() : -1; + menuId = createMenu( tr( subMenuName.toLatin1().constData() ), menuId, -1, subMenuGroup ); } createMenu( id, menuId, -1 ); if ( !stools.isEmpty() ) { - QString subTool = stools[0]; - subTool = subTool.toUpper().prepend( "TOOL_" ); - int toolId = createTool( tr( subTool.toLatin1().constData() ) ); - createTool(id, toolId); + QString subTool = stools[0]; + subTool = subTool.toUpper().prepend( "TOOL_" ); + int toolId = createTool( tr( subTool.toLatin1().constData() ) ); + createTool(id, toolId); } // add action id to map @@ -1738,12 +1841,58 @@ void GeometryGUI::addPluginActions() } } +namespace +{ + QString wrap(const QString& text, const QString& tag) + { return QString("<%1>%2").arg(tag).arg(text).arg(tag);} +} + //======================================================================= // function : GeometryGUI::activateModule() // purpose : Called when GEOM module is activated //======================================================================= bool GeometryGUI::activateModule( SUIT_Study* study ) { + // Fill in: Help Panel + SalomeApp_Application* app = dynamic_cast( application() ); + app->infoPanel()->setTitle(tr("INFO_WELCOME_TO_GEOM")); + + int gb = app->infoPanel()->addGroup(tr("INFO_GRP_CREATE_MODEL")); + QString lab; + QStringList items; + items << wrap(tr("INFO_VERTICES"), "li") + << wrap(tr("INFO_EDGES"), "li") + << wrap(tr("INFO_WIRES"), "li") + << wrap(tr("INFO_FACES"), "li") + << wrap(tr("INFO_SHELLS"), "li") + << wrap(tr("INFO_SOLIDS"), "li"); + lab = tr("INFO_BOTTOM_UP_CONSTRUCTION") + ":" + wrap(items.join(""), "ul"); + items.clear(); + + items << wrap(tr("INFO_BOX"), "li") + << wrap(tr("INFO_CYLINDER"), "li") + << wrap(tr("INFO_CONE"), "li") + << wrap("...", "li"); + lab = lab + tr("INFO_PRIMITIVES") + ":" + wrap(items.join(""), "ul"); + items.clear(); + + lab = lab + tr("INFO_BOOLEANS") + "
"; + lab = lab + tr("INFO_TRANSFORMATIONS"); + + app->infoPanel()->addLabel(lab, gb); + + gb = app->infoPanel()->addGroup(tr("INFO_GRP_IMPORT_MODEL")); + items << wrap("BREP", "li") + << wrap("STEP", "li") + << wrap("IGES", "li") + << wrap("STL", "li") + << wrap("XAO", "li"); + lab = tr("INFO_AVAILABLE_FORMATS") + ":" + wrap(items.join(""), "ul"); + items.clear(); + + app->infoPanel()->addLabel(lab, gb); + // << Help Panel + if ( CORBA::is_nil( myComponentGeom ) ) return false; @@ -1756,23 +1905,24 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module) PyGILState_STATE gstate = PyGILState_Ensure(); - PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager"); + PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager"); if ( !pluginsmanager ) { PyErr_Print(); } else { - PyObjWrapper result = + PyObject* result = PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom", - tr("MEN_NEW_ENTITY").toStdString().c_str(), - tr("GEOM_PLUGINS_OTHER").toStdString().c_str()); + tr("MEN_NEW_ENTITY").toUtf8().data(), + tr("GEOM_PLUGINS_OTHER").toUtf8().data()); if ( !result ) PyErr_Print(); + Py_XDECREF(result); } PyGILState_Release(gstate); // end of GEOM plugins loading connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), - this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); + this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); // Reset actions accelerator keys action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete @@ -1783,17 +1933,20 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) LightApp_SelectionMgr* sm = getApp()->selectionMgr(); - connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() )); - connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() )); - connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ), Qt::UniqueConnection ); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ), Qt::UniqueConnection ); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ), Qt::UniqueConnection ); if ( !myCreationInfoWdg ) myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() ); getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg ); getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea ); - if ( !myTextTreeWdg ) + if ( !myTextTreeWdg ) { myTextTreeWdg = new GEOMGUI_TextTreeWdg( getApp() ); + new GEOMGUI_TextTreeSelector( myTextTreeWdg, GetAnnotationMgr(), getApp()->selectionMgr() ); + } + getApp()->insertDockWindow( myTextTreeWdg->getWinID(), myTextTreeWdg ); getApp()->placeDockWindow( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea ); @@ -1819,7 +1972,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId ); if ( viewMenu ) - connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) ); + connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ), Qt::UniqueConnection ); // 0020836 (Basic vectors and origin) SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); @@ -1835,6 +1988,8 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) } } + Py_XDECREF(pluginsmanager); + return true; } @@ -1857,7 +2012,7 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study ) LightApp_SelectionMgr* selMrg = getApp()->selectionMgr(); disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() )); - disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); + //disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); if ( myCreationInfoWdg ) { getApp()->removeDockWindow( myCreationInfoWdg->getWinID() ); myCreationInfoWdg = 0; @@ -1920,8 +2075,11 @@ void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win ) void GeometryGUI::windows( QMap& mappa ) const { mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea ); + mappa.insert( SalomeApp_Application::WT_InfoPanel, Qt::RightDockWidgetArea ); mappa.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea ); +#ifndef DISABLE_PYCONSOLE mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea ); +#endif if ( myCreationInfoWdg ) mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea ); if ( myTextTreeWdg ) @@ -1996,6 +2154,10 @@ void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm ) break; } } + SOCC_Viewer* aSOCCView = dynamic_cast(viewer); + if ( aSOCCView ) { + GetAnnotationMgr()->RemoveView( aSOCCView ); + } } //================================================================================ @@ -2026,7 +2188,7 @@ void GeometryGUI::updateCreationInfo() Handle(SALOME_InteractiveObject) io = selIt.Value(); if ( !io->hasEntry() ) continue; _PTR(SObject) sobj = study->FindObjectID( io->getEntry() ); - if ( !sobj ) continue; + if ( !GeometryGUI::IsInGeomComponent( sobj )) continue; CORBA::Object_var obj = GeometryGUI::ClientSObjectToObject( sobj ); GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj ); if ( !gobj->_is_nil() ) @@ -2041,38 +2203,15 @@ void GeometryGUI::updateCreationInfo() // pass creation info of geomObj to myCreationInfoWdg if ( myCreationInfoWdg ) { - QPixmap icon; - QString operationName; - myCreationInfoWdg->setOperation( icon, operationName ); + GEOM::CreationInformationSeq_var info; try { OCC_CATCH_SIGNALS; - GEOM::CreationInformation_var info = geomObj->GetCreationInformation(); - if ( &info.in() ) { - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - QString name = info->operationName.in(); - if ( !name.isEmpty() ) { - - QString plugin_name; - for ( size_t i = 0; i < info->params.length(); ++i ) { - myCreationInfoWdg->addParam( info->params[i].name.in(), - info->params[i].value.in() ); - QString value = info->params[i].name.in(); - if( value == PLUGIN_NAME ) { - plugin_name = info->params[i].value.in(); - } - } - QString prefix = plugin_name.isEmpty() ? "GEOM" : plugin_name; - icon = resMgr->loadPixmap( prefix, tr( ("ICO_"+name).toLatin1().constData() ), false ); - operationName = tr( ("MEN_"+name).toLatin1().constData() ); - if ( operationName.startsWith( "MEN_" )) - operationName = name; // no translation - myCreationInfoWdg->setOperation( icon, operationName ); - } - } + info = geomObj->GetCreationInformation(); } catch (...) { } + myCreationInfoWdg->setInfo( info ); } } @@ -2089,7 +2228,7 @@ void GeometryGUI::onAutoBringToFront() SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() ); if (!appStudy) return; - GEOM_Displayer displayer( appStudy ); + GEOM_Displayer displayer; SALOME_View* window = displayer.GetActiveView(); if ( !window ) return; @@ -2132,11 +2271,8 @@ void GeometryGUI::onAutoBringToFront() void GeometryGUI::updateFieldColorScale() { - if( SalomeApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ) ) - { - GEOM_Displayer aDisplayer( aStudy ); - aDisplayer.UpdateColorScale(); - } + GEOM_Displayer aDisplayer; + aDisplayer.UpdateColorScale(); } QString GeometryGUI::engineIOR() const @@ -2146,32 +2282,23 @@ QString GeometryGUI::engineIOR() const return ""; } -Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture - (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight) +Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture (int theId, int& theWidth, int& theHeight) { theWidth = theHeight = 0; - Handle(TColStd_HArray1OfByte) aTexture; - if (theStudy) { - TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ]; - aTexture = aTextureMap[ theId ]; - if ( aTexture.IsNull() ) { - GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() ); - if ( !aInsOp->_is_nil() ) { - CORBA::Long aWidth, aHeight; - SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight ); - if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) { - theWidth = aWidth; - theHeight = aHeight; - - aTexture = new TColStd_HArray1OfByte (1, aStream->length()); - - for (int i = 0; i < aStream->length(); i++) - aTexture->SetValue( i+1, (Standard_Byte)aStream[i] ); - aTextureMap[ theId ] = aTexture; - } - } + GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations(); + if ( !aInsOp->_is_nil() ) { + CORBA::Long aWidth, aHeight; + SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight ); + if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) { + theWidth = aWidth; + theHeight = aHeight; + + aTexture = new TColStd_HArray1OfByte (1, aStream->length()); + + for ( CORBA::ULong i = 0; i < aStream->length(); i++) + aTexture->SetValue( i+1, (Standard_Byte)aStream[i] ); } } return aTexture; @@ -2188,55 +2315,44 @@ void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& SALOME_ListIO lst; getApp()->selectionMgr()->selectedObjects( lst ); - //Add submenu for predefined materials - bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" ); + // Update submenu for predefined materials if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) { - QtxPopupMgr* mgr = popupMgr(); - //get parrent for submenu - QAction* act = mgr->action( mgr->actionId( action( GEOMOp::OpMaterialProperties ) ) ); - //Clear old menu - QMenu* oldMenu = act->menu() ; - if( oldMenu ) { - delete oldMenu; - } - if( isPredefMat ){ - QMenu* matMenu = new QMenu(); - QSignalMapper* signalMapper = new QSignalMapper( matMenu ); - - //Get current material model for the object - QVariant v; - LightApp_Application* anApp = dynamic_cast( getApp() ); - if ( anApp && anApp->activeViewManager() ) { - LightApp_Study* aStudy = dynamic_cast( anApp->activeStudy() ); - if( aStudy ) { - v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() ); - } + QMenu* matMenu = action( GEOMOp::OpMaterialMenu )->menu(); + matMenu->clear(); + QSignalMapper* signalMapper = new QSignalMapper( menu ); + + QVariant v; + LightApp_Application* anApp = dynamic_cast( getApp() ); + if ( anApp && anApp->activeViewManager() ) { + LightApp_Study* aStudy = dynamic_cast( anApp->activeStudy() ); + if( aStudy ) { + v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() ); } - QString curModel = ""; - if ( v.canConvert() ) curModel = v.toString(); - // get list of all predefined materials - QStringList materials = Material_ResourceMgr::resourceMgr()->materials(); - bool found = false; - foreach ( QString material, materials ) - { - QAction* menAct = matMenu->addAction( material ); - connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) ); - signalMapper->setMapping( menAct, material ); - menAct->setCheckable( true ); - // Set checked if this material is current - Material_Model aModel; - aModel.fromResources( material ); - if ( !found && aModel.toProperties() == curModel ) { - menAct->setChecked( true ); - found = true; - } + } + QString curModel = ""; + if ( v.canConvert() ) curModel = v.toString(); + + // get list of all predefined materials + QStringList materials = Material_ResourceMgr::resourceMgr()->materials(); + bool found = false; + foreach ( QString material, materials ) + { + QAction* a = matMenu->addAction( material ); + connect( a, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) ); + signalMapper->setMapping( a, material ); + a->setCheckable( true ); + + Material_Model aModel; + aModel.fromResources( material ); + if ( !found && aModel.toProperties() == curModel ) { + a->setChecked( true ); + found = true; } - matMenu->insertAction( matMenu->addSeparator(), action( GEOMOp::OpPredefMaterCustom ) ); - matMenu->insertSeparator( action( GEOMOp::OpPredefMaterCustom ) ); - connect( signalMapper, SIGNAL( mapped( const QString & ) ), - this, SLOT( OnSetMaterial( const QString & ) ) ); - act->setMenu( matMenu ); } + matMenu->addSeparator(); + matMenu->addAction( action( GEOMOp::OpPredefMaterCustom ) ); + connect( signalMapper, SIGNAL( mapped( const QString & ) ), + this, SLOT( OnSetMaterial( const QString & ) ) ); } //Set name if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) { @@ -2304,7 +2420,7 @@ void GeometryGUI::createPreferences() LightApp_Preferences::Selector, "Geometry", "toplevel_dm" ); int transparency = addPreference( tr( "PREF_TRANSPARENCY" ), genGroup, - LightApp_Preferences::IntSpin, "Geometry", "transparency" ); + LightApp_Preferences::IntSpin, "Geometry", "transparency" ); int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup, LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" ); @@ -2346,6 +2462,10 @@ void GeometryGUI::createPreferences() addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup, LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" ); + // -------------------------------------------------------------------------- + // Dimensions (Measurements) preferences + // -------------------------------------------------------------------------- + int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId ); setPreferenceProperty( aDimGroupId, "columns", 2 ); @@ -2369,11 +2489,10 @@ void GeometryGUI::createPreferences() resMgr->value("resources", "GEOM", aFontFile); aFontFile = aFontFile + QDir::separator() + "Y14.5M-2009.ttf"; // add enginier font into combobox - int fontID = QFontDatabase::addApplicationFont( aFontFile ); - Handle(Font_SystemFont) sf = new Font_SystemFont( - new TCollection_HAsciiString("Y14.5M-2009"), - Font_FA_Regular, - new TCollection_HAsciiString(aFontFile.toLatin1().data()) ); + /*int fontID =*/ QFontDatabase::addApplicationFont( aFontFile ); + Handle(Font_SystemFont) sf = new Font_SystemFont( TCollection_AsciiString("Y14.5M-2009") ); + sf->SetFontPath( Font_FA_Regular, + TCollection_AsciiString( aFontFile.toLatin1().data() ) ); // register font in OCC font manager fmgr->RegisterFont( sf, Standard_False ); @@ -2429,6 +2548,53 @@ void GeometryGUI::createPreferences() addPreference( tr( "PREF_DIMENSIONS_USE_TEXT3D" ), aDimGroupId, LightApp_Preferences::Bool, "Geometry", "dimensions_use_text3d" ); + // -------------------------------------------------------------------------- + // Shape annotation preferences + // -------------------------------------------------------------------------- + + const int aShapeAnnGroupId = addPreference( tr( "PREF_SHAPE_ANNOTATIONS" ), tabId ); + setPreferenceProperty( aShapeAnnGroupId, "columns", 2 ); + + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_font_color" ); + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_line_color" ); + const int aShapeAnnFont = + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT" ), aShapeAnnGroupId, LightApp_Preferences::Font, "Geometry", "shape_annotation_font" ); + + int aShapeAnnFontFeatures = QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::Bold | QtxFontEdit::Italic; + setPreferenceProperty( aShapeAnnFont, "features", aShapeAnnFontFeatures ); + setPreferenceProperty( aShapeAnnFont, "mode", QtxFontEdit::Custom ); + setPreferenceProperty( aShapeAnnFont, "fonts", anOCCFonts ); + + const int aShapeAnnLineWidth = + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_WIDTH" ), aShapeAnnGroupId, LightApp_Preferences::IntSpin, "Geometry", "shape_annotation_line_width" ); + + setPreferenceProperty( aShapeAnnLineWidth, "min", 1 ); + setPreferenceProperty( aShapeAnnLineWidth, "max", 5 ); + + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_AUTOHIDE" ), aShapeAnnGroupId, LightApp_Preferences::Bool, "Geometry", "shape_annotation_autohide" ); + + const int aShapeAnnLineStyle = + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_STYLE" ), aShapeAnnGroupId, LightApp_Preferences::Selector, "Geometry", "shape_annotation_line_style" ); + + QStringList aLineStyleList; + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_SOLID") ); + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DASH") ); + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOT") ); + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOTDASH") ); + + QList aLineStyleIds; + aLineStyleIds.append(0); + aLineStyleIds.append(1); + aLineStyleIds.append(2); + aLineStyleIds.append(3); + + setPreferenceProperty( aShapeAnnLineStyle, "strings", aLineStyleList ); + setPreferenceProperty( aShapeAnnLineStyle, "indexes", aLineStyleIds ); + + // -------------------------------------------------------------------------- + // Isoline drawing preferences + // -------------------------------------------------------------------------- + int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId ); setPreferenceProperty( isoGroup, "columns", 2 ); int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup, @@ -2687,21 +2853,23 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par param == QString("scalar_bar_height") || param == QString("scalar_bar_text_height") || param == QString("scalar_bar_nb_intervals")) { - if( SalomeApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ) ) - { - GEOM_Displayer aDisplayer( aStudy ); - bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals"); - aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true ); - } + updateFieldColorScale(); } - else if ( param == QString("dimensions_color") || - param == QString("dimensions_line_width") || - param == QString("dimensions_font") || - param == QString("dimensions_arrow_length") || - param == QString("dimensions_show_units") || - param == QString("dimensions_length_units") || - param == QString("dimensions_angle_units") || - param == QString("dimensions_use_text3d") || + else if ( param == QString("dimensions_color") || + param == QString("dimensions_line_width") || + param == QString("dimensions_font") || + param == QString("dimensions_arrow_length") || + param == QString("dimensions_show_units") || + param == QString("dimensions_length_units") || + param == QString("dimensions_angle_units") || + param == QString("dimensions_use_text3d") || + param == QString("shape_annotation_font_color") || + param == QString("shape_annotation_line_color") || + param == QString("shape_annotation_font") || + param == QString("shape_annotation_line_width") || + param == QString("shape_annotation_autohide") || + param == QString("shape_annotation_line_style") || + param == QString("shape_annotation_line_style") || param == QString("label_color") ) { SalomeApp_Application* anApp = getApp(); @@ -2710,13 +2878,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par return; } - SalomeApp_Study* aStudy = dynamic_cast( anApp->activeStudy() ); - if ( !aStudy ) - { - return; - } - - GEOM_Displayer aDisplayer( aStudy ); + GEOM_Displayer aDisplayer; ViewManagerList aVMs; anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs ); @@ -2731,6 +2893,20 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par SALOME_ListIO aVisible; aViewer->GetVisible( aVisible ); + + GEOMGUI_AnnotationMgr* anAnnotationMgr = GetAnnotationMgr(); + if ( anAnnotationMgr ) { + SALOME_ListIteratorOfListIO anIter( aVisible ); + while ( anIter.More() ) { + if ( anAnnotationMgr->isAnnotationEntry( anIter.Value()->getEntry() ) ) { + aVisible.Remove( anIter ); + } + else { + anIter.Next(); + } + } + } + aDisplayer.Redisplay( aVisible, false, aViewer ); } if ( param == QString( "label_color" ) ) { @@ -2759,7 +2935,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par LightApp_Displayer* GeometryGUI::displayer() { if ( !myDisplayer ) - myDisplayer = new GEOM_Displayer( dynamic_cast( getApp()->activeStudy() ) ); + myDisplayer = new GEOM_Displayer(); return myDisplayer; } @@ -2787,6 +2963,7 @@ void GeometryGUI::storeVisualParameters (int savePoint) SalomeApp_Study* appStudy = dynamic_cast(application()->activeStudy()); if ( !appStudy || !appStudy->studyDS() ) return; + _PTR(Study) studyDS = appStudy->studyDS(); // componentName is used for encoding of entries when storing them in IParameters @@ -2804,12 +2981,17 @@ void GeometryGUI::storeVisualParameters (int savePoint) QList lst; QList::Iterator it; + GEOMGUI_AnnotationMgr* aAnnotationMgr = GetAnnotationMgr(); + // main cycle to store parameters of displayed objects lst.clear(); getApp()->viewManagers(lst); for (it = lst.begin(); it != lst.end(); it++) { SUIT_ViewManager* vman = *it; QString vType = vman->getType(); + SUIT_ViewModel* vmodel = vman->getViewModel(); + SALOME_View* aView = dynamic_cast(vmodel); + int aMgrId = vman->getGlobalId(); // saving VTK actors properties QVector views = vman->getViews(); @@ -2820,13 +3002,13 @@ void GeometryGUI::storeVisualParameters (int savePoint) const PropMap& aProps = o_it.value(); //Check that object exists in the study - _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) ); + _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toUtf8().data() ) ); if ( !obj || !(aProps.count() > 0)) continue; - // entry is "encoded" = it does NOT contain component adress, since it is a + // entry is "encoded" = it does NOT contain component address, since it is a // subject to change on next component loading - std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName); + std::string entry = ip->encodeEntry(o_it.key().toUtf8().data(), componentName); _PTR(GenericAttribute) anAttr; if (!obj->FindAttribute(anAttr, "AttributeIOR")) @@ -2931,28 +3113,41 @@ void GeometryGUI::storeVisualParameters (int savePoint) param = occParam + GEOM::propertyName( GEOM::IsosWidth ); ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString()); } + + if ( vType == SOCC_Viewer::Type() && aAnnotationMgr ) { + std::string anAnnotationInfo = GetAnnotationMgr()->getDisplayedIndicesInfo( + o_it.key().toUtf8().data(), dynamic_cast(aView) ).toStdString(); + if (!anAnnotationInfo.empty()) { + param = occParam + "ShapeAnnotationVisibleItems"; + ip->setParameter(entry, param.toStdString(), anAnnotationInfo); + } + } } // object iterator } // for (views) } // for (viewManagers) - // store dimension attributes of objects: + // store shape annotation and dimension attributes of objects: // since the displayed object always persists in property map, we remember the object entries // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree. - QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions ); + const QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions ); + const QString aAnnotationParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::ShapeAnnotations ); QSet::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin(); for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt ) { - std::string aStudyEntry = (*aEntryIt).toLatin1().data(); - std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName); + std::string aStudyEntry = (*aEntryIt).toUtf8().data(); + std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName ); - GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry ); - - if ( aDimensions.GetNumber() == 0 ) - { - continue; + // store dimension parameters + GEOMGUI_DimensionProperty aDimensions( aStudyEntry ); + if ( aDimensions.GetNumber() != 0 ) { + ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toUtf8().data() ); } - ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() ); + _PTR(SObject) aObj( studyDS->FindObjectID( aStudyEntry ) ); + const Handle(GEOMGUI_AnnotationAttrs) aShapeAnnAttr = GEOMGUI_AnnotationAttrs::FindAttributes( aObj ); + if ( !aShapeAnnAttr.IsNull() ) { + ip->setParameter( aStoreEntry, aAnnotationParam.toStdString(), aShapeAnnAttr->ExportAsPropertyString().toUtf8().data() ); + } } } @@ -2984,12 +3179,12 @@ void GeometryGUI::restoreVisualParameters (int savePoint) for (std::vector::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt) { - // entry is a normal entry - it should be "decoded" (setting base adress of component) + // entry is a normal entry - it should be "decoded" (setting base address of component) QString entry (ip->decodeEntry(*entIt).c_str()); // Check that the entry corresponds to a real object in the Study // as the object may be deleted or modified after the visual state is saved. - _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data()); + _PTR(SObject) so = studyDS->FindObjectID(entry.toUtf8().data()); if (!so) continue; //Skip the not existent entry std::vector paramNames = ip->getAllParameterNames( *entIt ); @@ -3033,7 +3228,14 @@ void GeometryGUI::restoreVisualParameters (int savePoint) if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) ) { GEOMGUI_DimensionProperty aDimensionProp( aValuesStr ); - aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() ); + aDimensionProp.SaveToAttribute( entry.toUtf8().data() ); + } + else if ( aParamNameStr == GEOM::propertyName( GEOM::ShapeAnnotations ) ) + { + Handle(GEOMGUI_AnnotationAttrs) anAttr = + GEOMGUI_AnnotationAttrs::FindOrCreateAttributes( so, appStudy ); + + anAttr->ImportFromPropertyString( aValuesStr ); } continue; @@ -3090,7 +3292,10 @@ void GeometryGUI::restoreVisualParameters (int savePoint) aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt()); } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt()); + } else if (paramNameStr == "ShapeAnnotationVisibleItems") { + aListOfMap[viewIndex].insert( "ShapeAnnotationVisibleItems", val); } + } // for names/parameters iterator QList lst = getApp()->viewManagers(); @@ -3102,7 +3307,16 @@ void GeometryGUI::restoreVisualParameters (int savePoint) if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) { SUIT_ViewManager* vman = lst.at(index); SUIT_ViewModel* vmodel = vman->getViewModel(); - displayer()->Display(entry, true, dynamic_cast(vmodel)); + SALOME_View* aView = dynamic_cast(vmodel); + displayer()->Display(entry, true, aView); + + if ( vmodel->getType() == SOCC_Viewer::Type() ) { + PropMap& aProps = aListOfMap[index]; + if ( aProps.contains( "ShapeAnnotationVisibleItems" ) ) { + SOCC_Viewer* aSOCCView = dynamic_cast( aView ); + GetAnnotationMgr()->setDisplayedIndicesInfo( entry, aSOCCView, aProps["ShapeAnnotationVisibleItems"].toString() ); + } + } } } } // for entries iterator @@ -3126,6 +3340,10 @@ void GeometryGUI::restoreVisualParameters (int savePoint) occVMod->Repaint(); } } + + if ( myTextTreeWdg ) { + myTextTreeWdg->updateTree(); + } } // Compute current name mode of the viewer @@ -3134,7 +3352,7 @@ void UpdateNameMode( SalomeApp_Application* app ) bool isMode = false; SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( app->activeStudy() ); SUIT_ViewWindow* viewWindow = app->desktop()->activeWindow(); - GEOM_Displayer displayer( aStudy ); + GEOM_Displayer displayer; int aMgrId = viewWindow->getViewManager()->getGlobalId(); SALOME_View* window = displayer.GetActiveView(); @@ -3237,12 +3455,14 @@ void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) TCollection_AsciiString asciiIOR( (char *)IOR.in() ); GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR ); - SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr(); + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication()); + SalomeApp_Study* appStudy = app ? dynamic_cast( app->activeStudy() ) : 0; - if (!aManager) + if (!appStudy) return; - _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID()); + _PTR(Study) aStudy = appStudy->studyDS(); if ( !aStudy ) return; @@ -3347,17 +3567,18 @@ bool GeometryGUI::renameObject( const QString& entry, const QString& name) return result; } - _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) ); + _PTR(SObject) obj ( aStudy->FindObjectID(qUtf8Printable(entry)) ); _PTR(GenericAttribute) anAttr; if ( obj ) { if ( obj->FindAttribute(anAttr, "AttributeName") ) { _PTR(AttributeName) aName (anAttr); - aName->SetValue( name.toLatin1().data() ); // rename the SObject + aName->SetValue( name.toUtf8().data() ); // rename the SObject GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj)); if (!CORBA::is_nil(anObj)) { - anObj->SetName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object + anObj->SetName( name.toUtf8().data() ); // Rename the corresponding GEOM_Object emit SignalDependencyTreeRenameObject( anObj->GetEntry() ); + emit SignalTextTreeRenameObject( entry ); } result = true; } @@ -3408,7 +3629,7 @@ bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const _PTR(SObject) aSO = dataObj->object(); if ( aSO ) { _PTR(GenericAttribute) anAttr; - _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO ); + _PTR(SObject) aFatherSO = SalomeApp_Application::getStudy()->GetUseCaseBuilder()->GetFather( aSO ); if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) { _PTR(AttributeLocalID) aLocalID( anAttr ); anObjectInFolder = aLocalID->Value() == 999; @@ -3485,7 +3706,7 @@ void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* wher _PTR(SObject) parentObj = dataObj->object(); // Find the current Study and StudyBuilder - _PTR(Study) aStudy = parentObj->GetStudy(); + _PTR(Study) aStudy = SalomeApp_Application::getStudy(); _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder(); // collect all parents of the target node QStringList parentIDs; @@ -3525,3 +3746,8 @@ void GeometryGUI::emitDimensionsUpdated( QString entry ) { emit DimensionsUpdated( entry ); } + +void GeometryGUI::emitAnnotationsUpdated( QString entry ) +{ + emit SignalAnnotationsUpdated( entry ); +}