diff --git a/CMakeLists.txt b/CMakeLists.txt index a2d069f66..ef42ec11a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,11 +31,11 @@ ENDIF(WIN32) STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) SET(${PROJECT_NAME_UC}_MAJOR_VERSION 8) -SET(${PROJECT_NAME_UC}_MINOR_VERSION 2) +SET(${PROJECT_NAME_UC}_MINOR_VERSION 3) SET(${PROJECT_NAME_UC}_PATCH_VERSION 0) SET(${PROJECT_NAME_UC}_VERSION ${${PROJECT_NAME_UC}_MAJOR_VERSION}.${${PROJECT_NAME_UC}_MINOR_VERSION}.${${PROJECT_NAME_UC}_PATCH_VERSION}) -SET(${PROJECT_NAME_UC}_VERSION_DEV 1) +SET(${PROJECT_NAME_UC}_VERSION_DEV 0) # Common CMake macros # =================== diff --git a/doc/salome/gui/SMESH/input/skew.doc b/doc/salome/gui/SMESH/input/skew.doc index 036c70d83..01f3c5fea 100644 --- a/doc/salome/gui/SMESH/input/skew.doc +++ b/doc/salome/gui/SMESH/input/skew.doc @@ -3,8 +3,8 @@ \page skew_page Skew \n \b Skew mesh quality criterion reflects the angle between the lines -that join opposite sides of a quadrangle element or the greatesr angle -between three medians in triangle elements. This mesh quality +that join opposite sides of a quadrangle element or the greatest angle +between a median and a midline in a triangle element. This mesh quality criterion can be applied to elements composed of 4 and 3 nodes (quadrangles and triangles). diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index da52e0783..d2801c905 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -226,6 +226,8 @@ SET(SMESH_RESOURCES_FILES mesh_extmeth_surf_offset_smooth.png mesh_extmeth_face_offset.png mesh_quality.png + mesh_show.png + mesh_hide.png ) INSTALL(FILES ${SMESH_RESOURCES_FILES} DESTINATION ${SALOME_SMESH_INSTALL_RES_DATA}) diff --git a/resources/mesh_hide.png b/resources/mesh_hide.png new file mode 100644 index 000000000..31c505d82 Binary files /dev/null and b/resources/mesh_hide.png differ diff --git a/resources/mesh_show.png b/resources/mesh_show.png new file mode 100644 index 000000000..61ebe4703 Binary files /dev/null and b/resources/mesh_show.png differ diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index f9a89fed7..bd5654c89 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -73,6 +73,19 @@ SMESH_Gen::SMESH_Gen() //vtkDebugLeaks::SetExitError(0); } +namespace +{ + // a structure used to nullify SMESH_Gen field of SMESH_Hypothesis, + // which is needed for SMESH_Hypothesis not deleted before ~SMESH_Gen() + struct _Hyp : public SMESH_Hypothesis + { + void NullifyGen() + { + _gen = 0; + } + }; +} + //============================================================================= /*! * Destructor @@ -84,9 +97,16 @@ SMESH_Gen::~SMESH_Gen() std::map < int, StudyContextStruct * >::iterator i_sc = _mapStudyContext.begin(); for ( ; i_sc != _mapStudyContext.end(); ++i_sc ) { - delete i_sc->second->myDocument; - delete i_sc->second; - } + StudyContextStruct* context = i_sc->second; + std::map < int, SMESH_Hypothesis * >::iterator i_hyp = context->mapHypothesis.begin(); + for ( ; i_hyp != context->mapHypothesis.end(); ++i_hyp ) + { + if ( _Hyp* h = static_cast< _Hyp*>( i_hyp->second )) + h->NullifyGen(); + } + delete context->myDocument; + delete context; + } } //============================================================================= diff --git a/src/SMESH/SMESH_Hypothesis.cxx b/src/SMESH/SMESH_Hypothesis.cxx index 2d1e10c16..c4107fb38 100644 --- a/src/SMESH/SMESH_Hypothesis.cxx +++ b/src/SMESH/SMESH_Hypothesis.cxx @@ -25,20 +25,18 @@ // Author : Paul RASCLE, EDF // Module : SMESH // -#include "SMESH_Hypothesis.hxx" + +#include "SMESH_Gen.hxx" #include "SMESHDS_Mesh.hxx" -#include "SMESH_Gen.hxx" +#include "SMESH_Hypothesis.hxx" #include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" - -#include "utilities.h" using namespace std; //============================================================================= /*! - * + * */ //============================================================================= @@ -63,8 +61,11 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId, SMESH_Hypothesis::~SMESH_Hypothesis() { - StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); - myStudyContext->mapHypothesis[_hypId] = 0; + if ( _gen ) + { + StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); + myStudyContext->mapHypothesis[_hypId] = 0; + } } //============================================================================= @@ -77,20 +78,20 @@ int SMESH_Hypothesis::GetDim() const { int dim = 0; switch (_type) - { - case ALGO_1D: dim = 1; break; - case ALGO_2D: dim = 2; break; - case ALGO_3D: dim = 3; break; - case ALGO_0D: dim = 0; break; - case PARAM_ALGO: - dim = ( _param_algo_dim < 0 ) ? -_param_algo_dim : _param_algo_dim; break; - } + { + case ALGO_1D: dim = 1; break; + case ALGO_2D: dim = 2; break; + case ALGO_3D: dim = 3; break; + case ALGO_0D: dim = 0; break; + case PARAM_ALGO: + dim = ( _param_algo_dim < 0 ) ? -_param_algo_dim : _param_algo_dim; break; + } return dim; } //============================================================================= /*! - * + * */ //============================================================================= diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 0f08808d0..526b6c650 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -4020,8 +4020,8 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpPropertiesArea, "MEASURE_AREA", "ICON_MEASURE_AREA" ); createSMESHAction( SMESHOp::OpPropertiesVolume, "MEASURE_VOLUME", "ICON_MEASURE_VOLUME" ); - createSMESHAction( SMESHOp::OpHide, "HIDE" ); - createSMESHAction( SMESHOp::OpShow, "SHOW" ); + createSMESHAction( SMESHOp::OpHide, "HIDE", "ICON_HIDE" ); + createSMESHAction( SMESHOp::OpShow, "SHOW", "ICON_SHOW" ); createSMESHAction( SMESHOp::OpShowOnly, "DISPLAY_ONLY" ); createSMESHAction( SMESHOp::OpSortChild, "SORT_CHILD_ITEMS" ); diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index fde04d78c..9531e409f 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -631,5 +631,13 @@ ICON_MEASURE_BND_BOX mesh_bounding_box.png + + ICON_SHOW + mesh_show.png + + + ICON_HIDE + mesh_hide.png + diff --git a/src/SMESHUtils/SMESH_TypeDefs.hxx b/src/SMESHUtils/SMESH_TypeDefs.hxx index 77c095cc1..c9be990f6 100644 --- a/src/SMESHUtils/SMESH_TypeDefs.hxx +++ b/src/SMESHUtils/SMESH_TypeDefs.hxx @@ -169,6 +169,7 @@ struct SMESH_TNodeXYZ : public gp_XYZ double SquareDistance(const SMDS_MeshNode* n) const { return (SMESH_TNodeXYZ( n )-*this).SquareModulus(); } bool operator==(const SMESH_TNodeXYZ& other) const { return _node == other._node; } }; +typedef SMESH_TNodeXYZ SMESH_NodeXYZ; //-------------------------------------------------- /*! diff --git a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx index f356bd9ba..231dd33b5 100644 --- a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx +++ b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx @@ -610,6 +610,148 @@ const char* SMESH_Swig::AddSubMeshOnShape(const char* theMeshEntry, return ""; } +/*! + \brief Gets window with specified identifier + \internal + \param id window identifier + \return pointer on the window +*/ + +SUIT_ViewWindow* getWnd( const int id ) +{ + SUIT_ViewWindow* resWnd = 0; + SUIT_Session* aSession = SUIT_Session::session(); + SUIT_Application* anApplication = aSession->activeApplication(); + SalomeApp_Application* app = dynamic_cast(anApplication); + if ( app ) { + ViewManagerList vmlist = app->viewManagers(); + foreach( SUIT_ViewManager* vm, vmlist ) { + QVector vwlist = vm->getViews(); + foreach ( SUIT_ViewWindow* vw, vwlist ) { + if ( id == vw->getId() ) { + resWnd = vw; + break; + } + } + } + } + return resWnd; +} + +class TGetActorAspect: public SALOME_Event +{ +public: + typedef actorAspect TResult; + TResult myResult; + const char* _entry; + int _wid; + TGetActorAspect( const char* Mesh_Entry, int viewId ) + { + _entry = Mesh_Entry; + _wid = viewId; + } + virtual void Execute() + { + SMESH_Actor* anActor; + if (_wid) + { + SUIT_ViewWindow* w = getWnd(_wid); + anActor = SMESH::FindActorByEntry( w, _entry ); + } + else + anActor = SMESH::FindActorByEntry( _entry ); + if ( !anActor ) + { + MESSAGE("GetActorAspect: no actor corresponding to: " << _entry); + return; + } + anActor->GetSufaceColor(myResult.surfaceColor.r, + myResult.surfaceColor.g, + myResult.surfaceColor.b, + myResult.surfaceColor.delta); + anActor->GetVolumeColor(myResult.volumeColor.r, + myResult.volumeColor.g, + myResult.volumeColor.b, + myResult.volumeColor.delta); + anActor->GetEdgeColor(myResult.edgeColor.r, + myResult.edgeColor.g, + myResult.edgeColor.b); + anActor->GetNodeColor(myResult.nodeColor.r, + myResult.nodeColor.g, + myResult.nodeColor.b); + myResult.opacity= anActor->GetOpacity(); + MESSAGE("opacity: " << myResult.opacity); + } +}; + +actorAspect SMESH_Swig::GetActorAspect( const char* Mesh_Entry, int viewId ) +{ + return ProcessEvent(new TGetActorAspect( Mesh_Entry, viewId)); +} + +void SMESH_Swig::SetActorAspect( const actorAspect& actorPres, const char* Mesh_Entry, int viewId ) +{ + class TSetActorAspect: public SALOME_Event + { + public: + const char* _entry; + actorAspect _actorPres; + int _wid; + TSetActorAspect(const actorAspect& actorPres, const char* Mesh_Entry, int viewId ) + { + _entry = Mesh_Entry; + _actorPres = actorPres; + _wid = viewId; + } + virtual void Execute() + { + SMESH_Actor* anActor; + if (_wid) + { + SUIT_ViewWindow* w = getWnd(_wid); + anActor = SMESH::FindActorByEntry( w, _entry ); + } + else + anActor = SMESH::FindActorByEntry( _entry ); + if ( !anActor ) + { + MESSAGE("SetActorAspect: no actor corresponding to: " << _entry); + return; + } + anActor->SetSufaceColor(_actorPres.surfaceColor.r, + _actorPres.surfaceColor.g, + _actorPres.surfaceColor.b, + _actorPres.surfaceColor.delta); + anActor->SetVolumeColor(_actorPres.volumeColor.r, + _actorPres.volumeColor.g, + _actorPres.volumeColor.b, + _actorPres.volumeColor.delta); + anActor->SetEdgeColor(_actorPres.edgeColor.r, + _actorPres.edgeColor.g, + _actorPres.edgeColor.b); + anActor->SetNodeColor(_actorPres.nodeColor.r, + _actorPres.nodeColor.g, + _actorPres.nodeColor.b); + anActor->SetOpacity(_actorPres.opacity); + if (_wid) + { + SUIT_ViewWindow* w = getWnd(_wid); + w->repaint(); + } + else + { + SUIT_Session* aSession = SUIT_Session::session(); + SUIT_Application* anApplication = aSession->activeApplication(); + SalomeApp_Application* anApp = dynamic_cast(anApplication); + SUIT_ViewManager* vman = anApp->getViewManager(VTKViewer_Viewer::Type(),true); + vman->getActiveView()->repaint(); + } + } + }; + + ProcessVoidEvent(new TSetActorAspect(actorPres, Mesh_Entry, viewId)); +} + void SMESH_Swig::CreateAndDisplayActor( const char* Mesh_Entry ) { // SMESH_Actor* Mesh = smeshGUI->ReadScript(aM); diff --git a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h index c6c948fcf..86682ff5b 100644 --- a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h +++ b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h @@ -58,6 +58,37 @@ enum Ball = BallSelection }; +typedef struct +{ + double r, g, b; + int delta; +} surfaceColorStruct; + +typedef struct +{ + double r, g, b; + int delta; +} volumeColorStruct; + +typedef struct +{ + double r, g, b; +} edgeColorStruct; + +typedef struct +{ + double r, g, b; +} nodeColorStruct; + +struct actorAspect +{ + surfaceColorStruct surfaceColor; + volumeColorStruct volumeColor; + edgeColorStruct edgeColor; + nodeColorStruct nodeColor; + double opacity; +}; + class SMESH_SWIG_EXPORT SMESH_Swig { public: @@ -94,6 +125,9 @@ public: */ void SetMeshIcon( const char*, const bool, const bool ); + actorAspect GetActorAspect(const char* Mesh_Entry, int viewId = 0 ); + void SetActorAspect( const actorAspect& actorPres, const char* Mesh_Entry, int viewId = 0 ); + // --------------------- for the test purposes ----------------------- int getSelectionMode(); void select( const char *id, std::vector ids, bool append = false ); diff --git a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i index 73c08a5f1..ac732d467 100644 --- a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i +++ b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i @@ -68,6 +68,37 @@ enum Ball }; +typedef struct +{ + double r, g, b; + int delta; +} surfaceColorStruct; + +typedef struct +{ + double r, g, b; + int delta; +} volumeColorStruct; + +typedef struct +{ + double r, g, b; +} edgeColorStruct; + +typedef struct +{ + double r, g, b; +} nodeColorStruct; + +struct actorAspect +{ + surfaceColorStruct surfaceColor; + volumeColorStruct volumeColor; + edgeColorStruct edgeColor; + nodeColorStruct nodeColor; + double opacity; +}; + class SMESH_Swig { public: @@ -97,6 +128,9 @@ class SMESH_Swig void CreateAndDisplayActor( const char* Mesh_Entry ); void EraseActor( const char* Mesh_Entry, const bool allViewers = false ); + actorAspect GetActorAspect(const char* Mesh_Entry, int viewId = 0 ); + void SetActorAspect( const actorAspect& actorPres, const char* Mesh_Entry, int viewId = 0 ); + // --------------------- for the test purposes ----------------------- int getSelectionMode(); void select( const char *id, std::vector ids, bool append = false ); diff --git a/src/Tools/ZCracksPlug/__init__.py b/src/Tools/ZCracksPlug/__init__.py index b06743239..967dc97cf 100644 --- a/src/Tools/ZCracksPlug/__init__.py +++ b/src/Tools/ZCracksPlug/__init__.py @@ -2,15 +2,20 @@ import sys, os, shutil, pickle, tempfile from Zcracks import main, genereCrack, Zset from Zcracks import utilityFunctions as uF +os.environ['QT_QPA_PLATFORM_PLUGIN_PATH']=os.path.join(os.environ['QTDIR'],'plugins','platforms') + +if 'MESHGEMSHOME' in os.environ: + meshgemsdir=os.environ['MESHGEMSHOME'] + if len(meshgemsdir) > 0: + meshgems=meshgemsdir.split(os.sep)[-1] + uF.removeFromSessionPath('LD_LIBRARY_PATH', meshgems) + #commande="/bin/bash -c ""source $HOME/zebulon/Z8.6.6_NEW/do_config_bash""" #os.system(commande) def IHM(): - try: - from PyQt5.QtWidgets import QApplication - except: - from PyQt4.QtGui import QApplication + from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) myapp = main.ShipHolderApplication() @@ -31,8 +36,7 @@ def SCRIPT(dataFile=None, data=None, dim=3, names=None): print(data) - tmpdir=tempfile.mkdtemp() - uF.removeFromSessionPath('LD_LIBRARY_PATH', 'Meshgems-2111') + tmpdir=tempfile.mkdtemp(prefix='tmpZcracks') if names==None: names={'saneGeoName':'salome_sane', 'crackGeoName':'salome_crack', 'crackedGeoName':'salome_cracked'} diff --git a/src/Tools/ZCracksPlug/casTests/launchCas.py b/src/Tools/ZCracksPlug/casTests/launchCas.py index 3522ee67e..592305cce 100644 --- a/src/Tools/ZCracksPlug/casTests/launchCas.py +++ b/src/Tools/ZCracksPlug/casTests/launchCas.py @@ -18,13 +18,13 @@ import string #tmpdir = "/local00/home/B27118/projets/Zcracks/Zcracks/casTests/tmpdir" #if not os.path.isdir(tmpdir): os.mkdir(tmpdir) -tmpdir=tempfile.mktemp(prefix='tmpZcracks') +tmpdir=tempfile.mkdtemp(prefix='tmpZcracks') print("tmpdir=", tmpdir) -meshgemsdir=os.environ('MESHGEMSHOME') -if len(meshgemsdir) > 0: - meshgems=string.split(meshgemsdir,os.sep)[-1] - uF.removeFromSessionPath('LD_LIBRARY_PATH', meshgems) +#meshgemsdir=os.environ('MESHGEMSHOME') +#if len(meshgemsdir) > 0: + #meshgems=string.split(meshgemsdir,os.sep)[-1] + #uF.removeFromSessionPath('LD_LIBRARY_PATH', meshgems) def LAUNCH(listCas=[]): if not isinstance(listCas, list): listCas=[listCas] @@ -194,7 +194,7 @@ def LAUNCH(listCas=[]): OK=[] NOOK=[] - for s in list(synthese.keys()): + for s in synthese: if synthese[s]: OK.append(s) else: diff --git a/src/Tools/ZCracksPlug/main.py b/src/Tools/ZCracksPlug/main.py index 347c7c0ad..fb75c82e1 100644 --- a/src/Tools/ZCracksPlug/main.py +++ b/src/Tools/ZCracksPlug/main.py @@ -1,13 +1,9 @@ import sys, pickle, tempfile, shutil from os import path, getpid, environ, remove, system -try: - from PyQt5.QtCore import * - from PyQt5.QtGui import * - from PyQt5.QtWidgets import * -except: - from PyQt4.QtCore import * - from PyQt4.QtGui import * +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * from . import utilityFunctions as uF from . import genereCrack, Zset, output, zcracks_ui @@ -21,8 +17,6 @@ from .zcracks_ui import Ui_Zui # --------------------- -uF.removeFromSessionPath('LD_LIBRARY_PATH', 'Meshgems-2111') - def stringToFloat(string, typ=float): if str(string).replace(' ','')=='': out=[] @@ -78,25 +72,6 @@ class ShipHolderApplication(QGroupBox): self.verbose=1 - #self.connect(self.ui.CBQuad, SIGNAL("toggled(bool)"),self.pressQuad) - #self.connect(self.ui.btReset, SIGNAL("clicked()"),self.pressReset) - #self.connect(self.ui.btCancel, SIGNAL("clicked()"),self.pressCancel) - #self.connect(self.ui.btApply, SIGNAL("clicked()"),self.pressApply) - #self.connect(self.ui.btApplyClose, SIGNAL("clicked()"),self.pressApplyClose) - #self.connect(self.ui.btLoad, SIGNAL("clicked()"),self.pressCharger) - #self.connect(self.ui.btSave, SIGNAL("clicked()"),self.pressSauver) - #self.connect(self.ui.btLoadCracked, SIGNAL("clicked()"),self.pressLoadCracked) - #self.connect(self.ui.btLoadSane, SIGNAL("clicked()"),self.pressLoadSane) - - #self.connect(self.ui.btGrVol, SIGNAL("clicked()"),self.pressLoadGroupVOL) - #self.connect(self.ui.btGrFace, SIGNAL("clicked()"),self.pressLoadGroupFACE) - #self.connect(self.ui.btGrEdge, SIGNAL("clicked()"),self.pressLoadGroupEDGE) - #self.connect(self.ui.btGrNode, SIGNAL("clicked()"),self.pressLoadGroupNODE) - #self.connect(self.ui.btGrAll, SIGNAL("clicked()"),self.pressLoadGroupALL) - #self.connect(self.ui.btVisu, SIGNAL("clicked()"),self.pressVisu) - - #self.connect(self.ui.CBAdvanced, SIGNAL("toggled(bool)"),self.pressAdvanced) - self.ui.CBQuad.toggled.connect(self.pressQuad) self.ui.btReset.clicked.connect(self.pressReset) self.ui.btCancel.clicked.connect(self.pressCancel) @@ -144,9 +119,9 @@ class ShipHolderApplication(QGroupBox): def pressQuad(self): if self.ui.CBQuad.isChecked(): self.ui.CBBarsoum.setEnabled(True) - self.ui.valGradation.setText(QString('2.3')) + self.ui.valGradation.setText('2.3') else: - self.ui.valGradation.setText(QString('1.3')) + self.ui.valGradation.setText('1.3') self.ui.CBBarsoum.setChecked(False) self.ui.CBBarsoum.setEnabled(False) @@ -162,10 +137,10 @@ class ShipHolderApplication(QGroupBox): tab=onglet.findChildren(QTableWidget)[0] for irow in range(tab.rowCount()): if tab.item(irow,0) != None: - tab.item(irow,0).setText(QString('')) - self.ui.valGradation.setText(QString('1.3')) - self.ui.valLayers.setText(QString('5')) - self.ui.valIterations.setText(QString('2')) + tab.item(irow,0).setText('') + self.ui.valGradation.setText('1.3') + self.ui.valLayers.setText('6') + self.ui.valIterations.setText('2') self.ui.CBIs2D.setChecked(False) self.ui.CBRefine.setChecked(False) @@ -257,7 +232,7 @@ class ShipHolderApplication(QGroupBox): fileNames = fileDiag.selectedFiles() filedef = fileNames[0] filedef = addExtension(str(filedef), 'med') - self.ui.valCrackedName.setText(QString(filedef)) + self.ui.valCrackedName.setText(filedef) def pressLoadSane(self): @@ -268,7 +243,7 @@ class ShipHolderApplication(QGroupBox): if fileDiag.exec_() : fileNames = fileDiag.selectedFiles() filedef = fileNames[0] - self.ui.valSaneName.setText(QString(filedef)) + self.ui.valSaneName.setText(filedef) def pressCharger(self): @@ -287,23 +262,15 @@ class ShipHolderApplication(QGroupBox): for cont, obj in enumerate(self.lineEditObjects): if self.lineEditTypes[cont] in [float, int]: - obj.setText(QString(self.data['TXT'+self.lineEditNames[cont]])) + obj.setText(self.data['TXT'+self.lineEditNames[cont]]) else: - obj.setText(QString(self.data[self.lineEditNames[cont]])) + obj.setText(self.data[self.lineEditNames[cont]]) self.ui.CBQuad.setChecked(True if 'quad' in list(self.data.keys()) and self.data['quad'] else False) self.ui.CBBarsoum.setChecked(True if 'barsoum' in list(self.data.keys()) and self.data['barsoum'] else False) self.ui.CBIs2D.setChecked(True if 'is2D' in list(self.data.keys()) and self.data['is2D'] else False) self.ui.CBRefine.setChecked(True if 'refine' in list(self.data.keys()) and self.data['refine'] else False) - - - - - #if self.data['quad']: self.ui.CBQuad.setChecked(True) - #if self.data['barsoum']: self.ui.CBBarsoum.setChecked(True) - #if self.data['is2D']: self.ui.CBIs2D.setChecked(True) - #if self.data['refine']: self.ui.CBRefine.setChecked(True) self.setTableParameters() @@ -451,7 +418,7 @@ class ShipHolderApplication(QGroupBox): if tab.item(irow,0) == None: item = QTableWidgetItem() tab.setItem(irow, 0, item) - tab.item(irow,0).setText(QString(self.data['TXTcrack'][str(self.ui.tabWidget.tabText(iongl))][str(label)])) + tab.item(irow,0).setText(self.data['TXTcrack'][str(self.ui.tabWidget.tabText(iongl))][str(label)]) if str(self.ui.tabWidget.tabText(iongl)) == self.data['TXTcrack']['actif']: self.ui.tabWidget.setCurrentWidget(onglet) @@ -475,19 +442,19 @@ class ShipHolderApplication(QGroupBox): for group in objetSain.GetGroups(): if (self.GroupToLoad in ['VOL','ALL']) and (group.GetType()==SMESH.VOLUME): - groupsVOL+=group.GetName().replace(' ','')+" " + groupsVOL+=self.cleanGroupName(group) nGr+=1 if (self.GroupToLoad in ['FACE','ALL']) and (group.GetType()==SMESH.FACE): - groupsFAC+=group.GetName().replace(' ','')+" " + groupsFAC+=self.cleanGroupName(group) nGr+=1 if (self.GroupToLoad in ['EDGE','ALL']) and (group.GetType()==SMESH.EDGE): - groupsEDG+=group.GetName().replace(' ','')+" " + groupsEDG+=self.cleanGroupName(group) nGr+=1 if (self.GroupToLoad in ['NODE','ALL']) and (group.GetType()==SMESH.NODE): - groupsNOD+=group.GetName().replace(' ','')+" " + groupsNOD+=self.cleanGroupName(group) nGr+=1 if groupsVOL!='': self.ui.valGrVol.setText(groupsVOL) @@ -503,6 +470,24 @@ class ShipHolderApplication(QGroupBox): remove(f) except: pass + + def cleanGroupName(self, group): + name=group.GetName() + while name.endswith(' '): name=name[:-1] + if ' ' in name: + message('A','%s group has a space in its name --> ignored' %name) + return('') + else: + return(name+" ") + + def checkNamesSpaces(self, names): + if type(names) is str: names=[names] + ok=True + for n in names: + if ' ' in n: + message('E','%s has a space in its name, please remove it' %n, goOn=True) + ok=False + return(ok) # --------------------------------- diff --git a/src/Tools/ZCracksPlug/output.py b/src/Tools/ZCracksPlug/output.py index 8a316b0dd..00b31f59f 100644 --- a/src/Tools/ZCracksPlug/output.py +++ b/src/Tools/ZCracksPlug/output.py @@ -22,9 +22,9 @@ class output(): pass f = open(self.tmpFile,'w') f.write('\n ------------------------------\n') - f.write(' | BIENVENU DANS L\'INTERFACE |\n') + f.write(' | BIENVENUE DANS L\'INTERFACE |\n') f.write(' | ZCRACKS DE SALOME |\n') - f.write(' | VERSION ALPHA |\n') + f.write(' | VERSION BETA |\n') f.write(' ------------------------------\n\n') f.close() diff --git a/src/Tools/ZCracksPlug/utilityFunctions.py b/src/Tools/ZCracksPlug/utilityFunctions.py index 34e46f857..997f02f7c 100644 --- a/src/Tools/ZCracksPlug/utilityFunctions.py +++ b/src/Tools/ZCracksPlug/utilityFunctions.py @@ -178,7 +178,13 @@ def extendElsets(meshFile, outFile=None): smesh = smeshBuilder.New(theStudy) ([mesh], status) = smesh.CreateMeshesFromMED(meshFile) - + + if mesh.NbVolumes()>0: + case2D=False + mesh.Reorient2DBy3D( [ mesh ], mesh, 1 ) + else: + case2D=True + mesh=cleanGroups(mesh) # Node color status @@ -339,91 +345,6 @@ def getMaxAspectRatio(tmpdir): return(float(maxAR)) -#def extendElsets(meshFile): - #if not path.isfile(meshFile): - #message('E','Mesh med file is not valid') - #return(-1) - - #import SMESH, salome - ##salome.salome_init() - #theStudy = salome.myStudy - #from salome.smesh import smeshBuilder - #smesh = smeshBuilder.New(theStudy) - - #([mesh], status) = smesh.CreateMeshesFromMED(meshFile) - - ## Node color status - #nodeList=mesh.GetNodesId() - #colorList=[0]*len(nodeList) - - ## Init using SIDE0 SIDE1 - #for group in mesh.GetGroups(): - #if group.GetType()==SMESH.FACE : - #color=0 - #if group.GetName()[0:4]=='SIDE0' : - #color=1 - #elif group.GetName()[0:4]=='SIDE1' : - #color=2 - #else : continue - ## Get faces - #faces=group.GetIDs() - ## Set faces nodes to given color - #for face_id in faces : - #for face_node_id in mesh.GetElemNodes(face_id) : - #colorList[face_node_id-1]=color - - ## Propagates color using elem connectivity - ## Always propagates max color - #volElemList=mesh.GetElementsByType(SMESH.VOLUME) - #ifChanged=True - #while ifChanged : - #ifChanged=False - #minColor=100 - #maxColor=0 - #for elemId in volElemList: - #for elemNodeId in mesh.GetElemNodes(elemId) : - #nodeColor=colorList[elemNodeId-1] - #if nodeColormaxColor : maxColor=nodeColor - #if minColor!=maxColor : - #ifChanged = True - #for elemNodeId in mesh.GetElemNodes(elemId) : - #colorList[elemNodeId-1]=maxColor - - #velem0 = [] - #velem1 = [] - #for elemId in volElemList: - #elemNodesId=mesh.GetElemNodes(elemId) - #elemColor=colorList[elemNodesId[0]-1] - #if(elemColor==1) : velem0.append(elemId) - #if(elemColor==2) : velem1.append(elemId) - - #mesh.MakeGroupByIds('SIDE_co',SMESH.VOLUME,velem0) - #mesh.MakeGroupByIds('SIDE_ext',SMESH.VOLUME,velem1) - - #surfElemList=mesh.GetElementsByType(SMESH.FACE) - #selem0 = [] - #selem1 = [] - #nbelem0=0 - #nbelem1=0 - - #for elemId in surfElemList: - #elemNodesId=mesh.GetElemNodes(elemId) - #elemColor=colorList[elemNodesId[0]-1] - #if(elemColor==1) : selem0.append(elemId) - #if(elemColor==2) : selem1.append(elemId) - - #mesh.MakeGroupByIds('SIDE_co',SMESH.FACE,selem0) - #mesh.MakeGroupByIds('SIDE_ext',SMESH.FACE,selem1) - - #maxAR=0. - #for elem in volElemList: - #maxAR=max(mesh.GetAspectRatio(elem),maxAR) - #for elem in surfElemList: - #maxAR=max(mesh.GetAspectRatio(elem),maxAR) - - #mesh.ExportMED(meshFile, 0, SMESH.MED_V2_2, 1, None ,1) - #return(maxAR) def removeFromSessionPath(envVar, patern): diff --git a/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx b/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx index e1cd4e7d2..10b5b94c8 100644 --- a/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx +++ b/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx @@ -146,11 +146,12 @@ bool SPADDERPluginTester_i::testsmesh(CORBA::Long studyId) // extern "C" { - PortableServer::ObjectId * SPADDERPluginTesterEngine_factory( CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName) + SPADDERPLUGINTESTERENGINE_EXPORT PortableServer::ObjectId * + SPADDERPluginTesterEngine_factory( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName) { MESSAGE("PortableServer::ObjectId * SPADDERPluginTesterEngine_factory()"); SPADDERPluginTester_i * myEngine = new SPADDERPluginTester_i(orb, poa, contId, instanceName, interfaceName); diff --git a/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx b/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx index 36c7637fc..9a2193d55 100644 --- a/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx +++ b/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx @@ -22,13 +22,23 @@ #ifndef _SPADDER_PLUGINTESTER_HXX_ #define _SPADDER_PLUGINTESTER_HXX_ +#ifdef WIN32 + #if defined SPADDERPLUGINTESTERENGINE_EXPORTS || defined SPADDERPluginTesterEngine_EXPORTS + #define SPADDERPLUGINTESTERENGINE_EXPORT __declspec( dllexport ) + #else + #define SPADDERPLUGINTESTERENGINE_EXPORT __declspec( dllimport ) + #endif +#else + #define SPADDERPLUGINTESTERENGINE_EXPORT +#endif + // include the stubs generating from SPADDERPluginTest.idl #include #include CORBA_SERVER_HEADER(SPADDERPluginTest) #include #include "SALOME_Component_i.hxx" -class SPADDERPluginTester_i: +class SPADDERPLUGINTESTERENGINE_EXPORT SPADDERPluginTester_i: public virtual POA_SPADDERPluginTest::SPADDERPluginTester, public Engines_Component_i { diff --git a/src/Tools/padder/spadderpy/gui/inputdialog.py b/src/Tools/padder/spadderpy/gui/inputdialog.py index a5e08488c..6620020b7 100644 --- a/src/Tools/padder/spadderpy/gui/inputdialog.py +++ b/src/Tools/padder/spadderpy/gui/inputdialog.py @@ -38,6 +38,14 @@ from salome.smesh.spadder.gui.inputdata import InputData DEBUG_MODE=True GROUPNAME_MAXLENGTH=8 +INPUTDATA_KEY_FILES="meshfiles" +INPUTDATA_KEY_PARAM="parameters" + +PARAM_KEY_NBITER = "NbIteration" +PARAM_KEY_RMAXRMIN = "RmaxRmin" +PARAM_NBITER_DEFAULT_VALUE = 10 +PARAM_RMAXRMIN_DEFAULT_VALUE = 3 + class InputDialog(GenericDialog): TBL_HEADER_LABEL=["Input Mesh", "Output group name"] @@ -116,7 +124,8 @@ class InputDialog(GenericDialog): # name item. # Setup default values for numerical parameters - self.__ui.txtParamNbIter.setValue(3) + self.__ui.txtParamNbIter.setValue(PARAM_NBITER_DEFAULT_VALUE) + self.__ui.txtParamRmaxRmin.setValue(PARAM_RMAXRMIN_DEFAULT_VALUE) # Note that PADDER does not support group name longer than 8 # characters. We apply then this limit in the gui field. @@ -138,7 +147,7 @@ class InputDialog(GenericDialog): self.__ui.txtSmeshObject.setEnabled(False) self.__ui.btnAddInput.setEnabled(False) self.__selectedMesh = None - self.__dictInputData = {} + self.__dictInputFiles = {} self.__nbConcreteMesh = 0 self.__nbSteelbarMesh = 0 @@ -231,7 +240,7 @@ class InputDialog(GenericDialog): """ # if the entry already exists, we remove it to replace by a # new one - if meshName in self.__dictInputData: + if meshName in self.__dictInputFiles: self.__delInputFromMap(meshName) inputData = InputData() @@ -240,7 +249,7 @@ class InputDialog(GenericDialog): inputData.meshType = meshType inputData.groupName = groupName # The key of the map is the mesh name - self.__dictInputData[meshName] = inputData + self.__dictInputFiles[meshName] = inputData if inputData.meshType == InputData.MESHTYPES.CONCRETE: self.__nbConcreteMesh += 1 else: @@ -272,7 +281,7 @@ class InputDialog(GenericDialog): This function removes the specified entry from the internal map (for data management purpose) """ - inputData = self.__dictInputData.pop(meshName) + inputData = self.__dictInputFiles.pop(meshName) if inputData.meshType == InputData.MESHTYPES.CONCRETE: self.__nbConcreteMesh -= 1 else: @@ -283,33 +292,51 @@ class InputDialog(GenericDialog): print("nb steelbar mesh ",self.__nbSteelbarMesh) - def setData(self, listInputData=[]): + def setData(self, dictInputData={}): """ This function fills the dialog widgets with values provided by the specified data list. """ self.clear() - for inputData in listInputData: + if INPUTDATA_KEY_FILES in dictInputData: + listInputData = dictInputData["meshfiles"] + for inputData in listInputData: - meshName = inputData.meshName - meshObject = inputData.meshObject - meshType = inputData.meshType - groupName = inputData.groupName + meshName = inputData.meshName + meshObject = inputData.meshObject + meshType = inputData.meshType + groupName = inputData.groupName - self.__addInputInGui(meshName, meshObject, meshType, groupName) - self.__addInputInMap(meshName, meshObject, meshType, groupName) + self.__addInputInGui(meshName, meshObject, meshType, groupName) + self.__addInputInMap(meshName, meshObject, meshType, groupName) - if not DEBUG_MODE: - self.onSelectSmeshObject() + if not DEBUG_MODE: + self.onSelectSmeshObject() + + if INPUTDATA_KEY_PARAM in dictInputData: + dictInputParameters = dictInputData[INPUTDATA_KEY_PARAM] + if PARAM_KEY_NBITER in dictInputParameters: + self.__ui.txtParamNbIter.setValue(dictInputParameters[PARAM_KEY_NBITER]) + if PARAM_KEY_RMAXRMIN in dictInputParameters: + self.__ui.txtParamRminRmax.setValue(dictInputParameters[PARAM_KEY_RMAXRMIN]) def getData(self): """ This function returns a list of InputData that corresponds to the data in the dialog widgets of the current dialog. """ + # Get the list of mesh files # Note that the values() function returns a copy of the list # of values. - return list(self.__dictInputData.values()) + dictInputData={} + dictInputData[INPUTDATA_KEY_FILES] = self.__dictInputFiles.values() + + # Get the list of additionnal parameters + dictInputParameters = {} + dictInputParameters[PARAM_KEY_NBITER] = self.__ui.txtParamNbIter.value() + dictInputParameters[PARAM_KEY_RMAXRMIN] = self.__ui.txtParamRmaxRmin.value() + dictInputData[INPUTDATA_KEY_PARAM] = dictInputParameters + return dictInputData def checkData(self): """ @@ -328,7 +355,6 @@ class InputDialog(GenericDialog): return True - #def setParameters(self, # ============================================================================== # Basic use case diff --git a/src/Tools/padder/spadderpy/gui/inputframe.ui b/src/Tools/padder/spadderpy/gui/inputframe.ui index b1ba72d96..a8882f44c 100644 --- a/src/Tools/padder/spadderpy/gui/inputframe.ui +++ b/src/Tools/padder/spadderpy/gui/inputframe.ui @@ -111,7 +111,7 @@ - Béton + Beton @@ -213,9 +213,9 @@ - + - Rmin / Rmax + Rmax / Rmin @@ -227,7 +227,7 @@ - + diff --git a/src/Tools/padder/spadderpy/gui/plugindialog.py b/src/Tools/padder/spadderpy/gui/plugindialog.py index c3f30e55b..ba00df765 100644 --- a/src/Tools/padder/spadderpy/gui/plugindialog.py +++ b/src/Tools/padder/spadderpy/gui/plugindialog.py @@ -23,7 +23,8 @@ from qtsalome import QDialog, QIcon, Qt from salome.smesh.spadder.gui.plugindialog_ui import Ui_PluginDialog -from salome.smesh.spadder.gui.inputdialog import InputDialog +from salome.smesh.spadder.gui.inputdialog import InputDialog, INPUTDATA_KEY_FILES, INPUTDATA_KEY_PARAM +from salome.smesh.spadder.gui.inputdialog import PARAM_KEY_NBITER, PARAM_KEY_RMAXRMIN from salome.smesh.spadder.gui.inputdata import InputData # __GBO__: uncomment this line and comment the previous one to use the # demo input dialog instead of the real one. @@ -218,6 +219,7 @@ class PluginDialog(QDialog): This function clears the log area and the states of the buttons """ self.__listInputData = [] + self.__dictInputParameters = {} self.__ui.txtLog.clear() self.__setGuiState(["CAN_SELECT"]) self.__isRunning = False @@ -241,7 +243,10 @@ class PluginDialog(QDialog): windows to process the validation event (see the slot onProcessInput which is connected to this event). ''' - self.__inputDialog.setData(self.__listInputData) + dictInputData = {} + dictInputData[INPUTDATA_KEY_FILES] = self.__listInputData + dictInputData[INPUTDATA_KEY_PARAM] = self.__dictInputParameters + self.__inputDialog.setData(dictInputData) self.__inputDialog.open() def onProcessInput(self): @@ -252,7 +257,10 @@ class PluginDialog(QDialog): """ # The processing simply consists in requesting the input data # from the dialog window. - self.__listInputData = self.__inputDialog.getData() + dictInputData = self.__inputDialog.getData() + self.__listInputData = dictInputData[INPUTDATA_KEY_FILES] + self.__dictInputParameters = dictInputData[INPUTDATA_KEY_PARAM] + self.__ui.lblStatusBar.setText("Input data OK") self.__log("INF: Press \"Compute\" to start the job") self.__setGuiState(["CAN_SELECT", "CAN_COMPUTE"]) @@ -283,8 +291,16 @@ class PluginDialog(QDialog): group_name = inputData.groupName) meshJobFileList.append(parameter) + # And to create a list of the additional parameters. + # WARN: the CORBA interface requires string values. + meshJobParameterList=[] + for inputParameterKey in self.__dictInputParameters: + value = self.__dictInputParameters[inputParameterKey] + parameter = MESHJOB.MeshJobParameter(name=inputParameterKey,value=str(value)) + meshJobParameterList.append(parameter) + jobManager = self.__getJobManager() - self.__jobid = jobManager.initialize(meshJobFileList, self.__configId) + self.__jobid = jobManager.initialize(meshJobFileList, meshJobParameterList, self.__configId) if self.__jobid < 0: self.__log("ERR: the job can't be initialized") self.__log("ERR: %s"%jobManager.getLastErrorMessage()) diff --git a/src/Tools/padder/unittests/usecase_meshJobManager.py b/src/Tools/padder/unittests/usecase_meshJobManager.py index 393840239..4fe3da6d9 100644 --- a/src/Tools/padder/unittests/usecase_meshJobManager.py +++ b/src/Tools/padder/unittests/usecase_meshJobManager.py @@ -83,7 +83,7 @@ PADDERTESTDIR = getPadderTestDir(defaultConfig) # padder.cfg). # def test00_parameters(): - """Test using a concrete mesh and a single steelbar mesh""" + """Test using a concrete mesh and a single steelbar mesh""" file_concrete=os.path.join(spadder.getTestDataDir(),"concrete.med") file_steelbar=os.path.join(spadder.getTestDataDir(),"ferraill.med") @@ -109,7 +109,7 @@ def test01_parameters(): file_type=MESHJOB.MED_CONCRETE, group_name="concrete") meshJobFileList.append(param) - + medfile = os.path.join(datadir,"ferraill.med") param = MESHJOB.MeshJobFile(file_name=medfile, file_type=MESHJOB.MED_STEELBAR, @@ -121,7 +121,7 @@ def test01_parameters(): file_type=MESHJOB.MED_STEELBAR, group_name="ferrtran") meshJobFileList.append(param) - + return meshJobFileList def test02_parameters(): @@ -161,7 +161,7 @@ def test03_parameters(): meshJobFileList = test03_parameters() meshJobParameterList = [] -param = MESHJOB.MeshJobParameter(name="RminRmax",value="1.5") +param = MESHJOB.MeshJobParameter(name="RmaxRmin",value="1.5") meshJobParameterList.append(param) param = MESHJOB.MeshJobParameter(name="NbIteration",value="3") meshJobParameterList.append(param) @@ -174,7 +174,7 @@ if jobid<0: msg = component.getLastErrorMessage() print("ERR: %s"%msg) sys.exit(1) - + created = False nbiter = 0 while not created: @@ -217,11 +217,11 @@ while not ended: ended=True time.sleep(0.5) nbiter+=1 - + if state not in end_states: print("ERR: jobid = "+str(jobid)+" ended abnormally with state="+str(state)) msg = component.getLastErrorMessage() - print("ERR: %s"%msg) + print("ERR: %s"%msg) else: print("OK: jobid = "+str(jobid)+" ended with state="+str(state)) meshJobResults = component.finalize(jobid)