X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI.cxx;h=10d66e8a778e195f5dafd47938920908985023be;hb=5a4525c20ffd12158602096a7abfaa340cadbba9;hp=8849df32c2b1c3b8247ea07115d86d0524bf6e2d;hpb=1cf05200258a28303c2fcc0fdb4fc4c41ab0f1ee;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 8849df32c..10d66e8a7 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -59,8 +59,8 @@ #include "SMESHGUI_MeshPatternDlg.h" #include "SMESHGUI_MultiEditDlg.h" #include "SMESHGUI_NodesDlg.h" -#include "SMESHGUI_Preferences_ColorDlg.h" #include "SMESHGUI_Preferences_ScalarBarDlg.h" +#include "SMESHGUI_PropertiesDlg.h" #include "SMESHGUI_RemoveElementsDlg.h" #include "SMESHGUI_RemoveNodesDlg.h" #include "SMESHGUI_RenumberingDlg.h" @@ -165,6 +165,8 @@ #include #include +#include + //To disable automatic genericobj management, the following line should be commented. //Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx #define WITHGENERICOBJ @@ -939,6 +941,8 @@ SALOMEDS::Color aColor = aGroupObject->GetColor(); _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject); if (aGroupSObject) { + QColor c; + int delta; if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) { switch ( aGroupObject->GetType ()) { case SMESH::NODE: @@ -949,9 +953,11 @@ anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); break; case SMESH::BALL: anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break; + case SMESH::VOLUME: + SMESH::GetColor("SMESH", "volume_color", c, delta, "255,0,170|-100"); + anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break; + case SMESH::FACE: default: - QColor c; - int delta; SMESH::GetColor("SMESH", "fill_color", c, delta, "0,170,255|-100"); anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); } @@ -1202,250 +1208,224 @@ (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show(); return; } - case 1132:{ - QColor c, e, b, n, c0D, cBall, o, outl, selection, preselection; - int delta; - int size0D = 0, ballSize = 0; - int Edgewidth = 0; - vtkFloatingPointType Shrink = 0.0; - vtkFloatingPointType faces_orientation_scale = 0.0; - bool faces_orientation_3dvectors = false; - - VTK::MarkerType aMarkerTypeCurrent = VTK::MT_NONE; - VTK::MarkerScale aMarkerScaleCurrent = VTK::MS_NONE; - int aMarkerTextureCurrent = 0; + case 1132: { + vtkFloatingPointType color[3]; + QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor; + QColor orientationColor, outlineColor, volumeColor; + int deltaF = 0, deltaV = 0; + int elem0dSize = 1; + int ballSize = 1; + int edgeWidth = 1; + int outlineWidth = 1; + vtkFloatingPointType shrinkCoef = 0.0; + vtkFloatingPointType orientationScale = 0.0; + bool orientation3d = false; + VTK::MarkerType markerType = VTK::MT_NONE; + VTK::MarkerScale markerScale = VTK::MS_NONE; + int markerId = 0; + bool hasNodes = false; + int presentEntities = 0; + bool firstTime = true; SALOME_ListIteratorOfListIO It( selected ); - for( ; It.More(); It.Next()){ + for ( ; It.More(); It.Next() ) { Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()){ - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ - vtkFloatingPointType color[3]; - anActor->GetSufaceColor(color[0], color[1], color[2],delta); - int c0 = int (color[0] * 255); - int c1 = int (color[1] * 255); - int c2 = int (color[2] * 255); - c.setRgb(c0, c1, c2); - - vtkFloatingPointType edgecolor[3]; - anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]); - c0 = int (edgecolor[0] * 255); - c1 = int (edgecolor[1] * 255); - c2 = int (edgecolor[2] * 255); - e.setRgb(c0, c1, c2); - - vtkFloatingPointType nodecolor[3]; - anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]); - c0 = int (nodecolor[0] * 255); - c1 = int (nodecolor[1] * 255); - c2 = int (nodecolor[2] * 255); - n.setRgb(c0, c1, c2); - - vtkFloatingPointType color0D[3]; - anActor->Get0DColor(color0D[0], color0D[1], color0D[2]); - c0 = int (color0D[0] * 255); - c1 = int (color0D[1] * 255); - c2 = int (color0D[2] * 255); - c0D.setRgb(c0, c1, c2); - - vtkFloatingPointType ballcolor[3]; - anActor->GetBallColor(ballcolor[0], ballcolor[1], ballcolor[2]); - c0 = int (ballcolor[0] * 255); - c1 = int (ballcolor[1] * 255); - c2 = int (ballcolor[2] * 255); - cBall.setRgb(c0, c1, c2); - - vtkFloatingPointType outlineColor[3]; - anActor->GetOutlineColor(outlineColor[0], outlineColor[1], outlineColor[2]); - c0 = int (outlineColor[0] * 255); - c1 = int (outlineColor[1] * 255); - c2 = int (outlineColor[2] * 255); - outl.setRgb(c0, c1, c2); - - vtkFloatingPointType hColor[3]; - anActor->GetHighlightColor(hColor[0], hColor[1], hColor[2]); - c0 = int (hColor[0] * 255); - c1 = int (hColor[1] * 255); - c2 = int (hColor[2] * 255); - selection.setRgb(c0, c1, c2); - - vtkFloatingPointType phColor[3]; - anActor->GetPreHighlightColor(phColor[0], phColor[1], phColor[2]); - c0 = int (phColor[0] * 255); - c1 = int (phColor[1] * 255); - c2 = int (phColor[2] * 255); - preselection.setRgb(c0, c1, c2); - - size0D = (int)anActor->Get0DSize(); - if(size0D == 0) - size0D = 1; - ballSize = (int)anActor->GetBallSize(); - if(ballSize == 0) - ballSize = 1; - Edgewidth = (int)anActor->GetLineWidth(); - if(Edgewidth == 0) - Edgewidth = 1; - Shrink = anActor->GetShrinkFactor(); - - vtkFloatingPointType faces_orientation_color[3]; - anActor->GetFacesOrientationColor(faces_orientation_color); - c0 = int (faces_orientation_color[0] * 255); - c1 = int (faces_orientation_color[1] * 255); - c2 = int (faces_orientation_color[2] * 255); - o.setRgb(c0, c1, c2); - - faces_orientation_scale = anActor->GetFacesOrientationScale(); - faces_orientation_3dvectors = anActor->GetFacesOrientation3DVectors(); - - aMarkerTypeCurrent = anActor->GetMarkerType(); - aMarkerScaleCurrent = anActor->GetMarkerScale(); - aMarkerTextureCurrent = anActor->GetMarkerTexture(); - - // even if there are multiple objects in the selection, - // we need only the first one to get values for the dialog - break; - } + if ( !IObject->hasEntry() ) continue; + SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() ); + if ( !anActor || !anActor->GetObject() ) continue; + + if ( firstTime ) { + // nodes: color, marker + anActor->GetNodeColor( color[0], color[1], color[2] ); + nodeColor.setRgbF( color[0], color[1], color[2] ); + markerType = anActor->GetMarkerType(); + markerScale = anActor->GetMarkerScale(); + markerId = anActor->GetMarkerTexture(); + // edges: color, width + anActor->GetEdgeColor( color[0], color[1], color[2] ); + edgeColor.setRgbF( color[0], color[1], color[2] ); + edgeWidth = qMax( (int)anActor->GetLineWidth(), 1 ); // minimum allowed width is 1 + // faces: front color, back color (delta) + anActor->GetSufaceColor( color[0], color[1], color[2], deltaF ); + faceColor.setRgbF( color[0], color[1], color[2] ); + // faces: front color, back color (delta) + anActor->GetVolumeColor( color[0], color[1], color[2], deltaV ); + volumeColor.setRgbF( color[0], color[1], color[2] ); + // 0d elements: color, size + anActor->Get0DColor( color[0], color[1], color[2] ); + elem0dColor.setRgbF( color[0], color[1], color[2] ); + elem0dSize = qMax( (int)anActor->Get0DSize(), 1 ); // minimum allowed size is 1 + // balls: color, size + anActor->GetBallColor( color[0], color[1], color[2] ); + ballColor.setRgbF( color[0], color[1], color[2] ); + ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1 + // outlines: color + anActor->GetOutlineColor( color[0], color[1], color[2] ); + outlineColor.setRgbF( color[0], color[1], color[2] ); + outlineWidth = qMax( (int)anActor->GetOutlineWidth(), 1 ); // minimum allowed width is 1 + // orientation vectors: color, scale, 3d flag + anActor->GetFacesOrientationColor( color[0], color[1], color[2] ); + orientationColor.setRgbF( color[0], color[1], color[2] ); + orientationScale = anActor->GetFacesOrientationScale(); + orientation3d = anActor->GetFacesOrientation3DVectors(); + // shrink factor + shrinkCoef = anActor->GetShrinkFactor(); } + + firstTime = false; // we only take properties from first object (for performance reasons) + + if ( !hasNodes ) + hasNodes = anActor->GetObject()->GetNbEntities( SMDSAbs_Node ); + if ( !(presentEntities & SMESH_Actor::eEdges) && anActor->GetObject()->GetNbEntities( SMDSAbs_Edge ) ) + presentEntities = presentEntities | SMESH_Actor::eEdges; + if ( !(presentEntities & SMESH_Actor::eFaces) && anActor->GetObject()->GetNbEntities( SMDSAbs_Face ) ) + presentEntities = presentEntities | SMESH_Actor::eFaces; + if ( !(presentEntities & SMESH_Actor::eVolumes) && anActor->GetObject()->GetNbEntities( SMDSAbs_Volume ) ) + presentEntities = presentEntities | SMESH_Actor::eVolumes; + if ( !(presentEntities & SMESH_Actor::e0DElements) && anActor->GetObject()->GetNbEntities( SMDSAbs_0DElement ) ) + presentEntities = presentEntities | SMESH_Actor::e0DElements; + if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) ) + presentEntities = presentEntities | SMESH_Actor::eBallElem; + + // as we know that all types of elements are present, we can exit the loop + if ( presentEntities == SMESH_Actor::eAllEntity ) + break; } - SMESHGUI_Preferences_ColorDlg *aDlg = - new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI() ); - aDlg->SetBooleanValue(1, faces_orientation_3dvectors); - aDlg->SetColor(1, c); - aDlg->SetColor(2, e); - aDlg->SetColor(3, n); - aDlg->SetColor(4, outl); - aDlg->SetColor(5, c0D); - aDlg->SetColor(6, cBall); - aDlg->SetColor(7, o); - aDlg->SetColor(8, selection); - aDlg->SetColor(9, preselection); - aDlg->SetDeltaBrightness(delta); - aDlg->SetDoubleValue(1, faces_orientation_scale); - aDlg->SetIntValue(1, Edgewidth); - aDlg->SetIntValue(2, int(Shrink*100.)); - aDlg->SetIntValue(3, size0D); - aDlg->SetIntValue(4, ballSize); - - aDlg->setCustomMarkerMap( theMarkerMap[ aStudy->StudyId() ] ); - - if( aMarkerTypeCurrent != VTK::MT_USER ) - aDlg->setStandardMarker( aMarkerTypeCurrent, aMarkerScaleCurrent ); + SMESHGUI_PropertiesDlg dlg( theMarkerMap[ aStudy->StudyId() ], SMESHGUI::desktop() ); + // nodes: color, marker + dlg.setNodeColor( nodeColor ); + if( markerType != VTK::MT_USER ) + dlg.setNodeMarker( markerType, markerScale ); else - aDlg->setCustomMarker( aMarkerTextureCurrent ); - - if(aDlg->exec()){ - QColor color = aDlg->GetColor(1); - QColor edgecolor = aDlg->GetColor(2); - QColor nodecolor = aDlg->GetColor(3); - QColor outlinecolor = aDlg->GetColor(4); - QColor color0D = aDlg->GetColor(5); - QColor ballcolor = aDlg->GetColor(6); - QColor faces_orientation_color = aDlg->GetColor(7); - QColor selectioncolor = aDlg->GetColor(8); - QColor preSelectioncolor = aDlg->GetColor(9); - int delta = aDlg->GetDeltaBrightness(); - - /* Point marker */ - theMarkerMap[ aStudy->StudyId() ] = aDlg->getCustomMarkerMap(); - + dlg.setNodeCustomMarker( markerId ); + // edges: color, line width + dlg.setEdgeColor( edgeColor ); + dlg.setEdgeWidth( edgeWidth ); + // faces: front color, back color + dlg.setFaceColor( faceColor, deltaF ); + // volumes: normal color, reversed color + dlg.setVolumeColor( volumeColor, deltaV ); + // outlines: color, line width + dlg.setOutlineColor( outlineColor ); + dlg.setOutlineWidth( outlineWidth ); + // 0d elements: color, size + dlg.setElem0dColor( elem0dColor ); + dlg.setElem0dSize( elem0dSize ); + // balls: color, size + dlg.setBallColor( ballColor ); + dlg.setBallSize( ballSize ); + // orientation: color, scale, 3d flag + dlg.setOrientationColor( orientationColor ); + dlg.setOrientationSize( int( orientationScale * 100. ) ); + dlg.setOrientation3d( orientation3d ); + // shrink: scale factor + dlg.setShrinkCoef( int( shrinkCoef * 100. ) ); + // hide unused controls + dlg.showControls( presentEntities, hasNodes ); + + if ( dlg.exec() ) { + nodeColor = dlg.nodeColor(); + markerType = dlg.nodeMarkerType(); + markerScale = dlg.nodeMarkerScale(); + markerId = dlg.nodeMarkerId(); + edgeColor = dlg.edgeColor(); + edgeWidth = dlg.edgeWidth(); + faceColor = dlg.faceColor(); + deltaF = dlg.faceColorDelta(); + volumeColor = dlg.volumeColor(); + deltaV = dlg.volumeColorDelta(); + outlineColor = dlg.outlineColor(); + outlineWidth = dlg.outlineWidth(); + elem0dColor = dlg.elem0dColor(); + elem0dSize = dlg.elem0dSize(); + ballColor = dlg.ballColor(); + ballSize = dlg.ballSize(); + orientationColor = dlg.orientationColor(); + orientationScale = dlg.orientationSize() / 100.; + orientation3d = dlg.orientation3d(); + shrinkCoef = dlg.shrinkCoef() / 100.; + + // store point markers map that might be changed by the user + theMarkerMap[ aStudy->StudyId() ] = dlg.customMarkers(); + + // set properties from dialog box to the presentations SALOME_ListIteratorOfListIO It( selected ); - for( ; It.More(); It.Next()){ + for ( ; It.More(); It.Next() ) { Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()){ - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ - /* actor color and backface color */ - anActor->SetSufaceColor(vtkFloatingPointType (color.red()) / 255., - vtkFloatingPointType (color.green()) / 255., - vtkFloatingPointType (color.blue()) / 255., - delta); - /* edge color */ - anActor->SetEdgeColor(vtkFloatingPointType (edgecolor.red()) / 255., - vtkFloatingPointType (edgecolor.green()) / 255., - vtkFloatingPointType (edgecolor.blue()) / 255.); - /* edge outline */ - anActor->SetOutlineColor(vtkFloatingPointType (outlinecolor.red()) / 255., - vtkFloatingPointType (outlinecolor.green()) / 255., - vtkFloatingPointType (outlinecolor.blue()) / 255.); - - /* selection */ - anActor->SetHighlightColor(vtkFloatingPointType (selectioncolor.red()) / 255., - vtkFloatingPointType (selectioncolor.green()) / 255., - vtkFloatingPointType (selectioncolor.blue()) / 255.); - /* pre-selection */ - anActor->SetPreHighlightColor(vtkFloatingPointType (preSelectioncolor.red()) / 255., - vtkFloatingPointType (preSelectioncolor.green()) / 255., - vtkFloatingPointType (preSelectioncolor.blue()) / 255.); - - - /* Shrink factor and size edges */ - anActor->SetShrinkFactor(aDlg->GetIntValue(2) / 100.); - anActor->SetLineWidth(aDlg->GetIntValue(1)); - - /* Nodes color and size */ - anActor->SetNodeColor(vtkFloatingPointType (nodecolor.red()) / 255., - vtkFloatingPointType (nodecolor.green()) / 255., - vtkFloatingPointType (nodecolor.blue()) / 255.); - - /* 0D elements */ - anActor->Set0DColor(vtkFloatingPointType (color0D.red()) / 255., - vtkFloatingPointType (color0D.green()) / 255., - vtkFloatingPointType (color0D.blue()) / 255.); - anActor->Set0DSize(aDlg->GetIntValue(3)); - - /* Ball elements */ - anActor->SetBallColor(vtkFloatingPointType (ballcolor.red()) / 255., - vtkFloatingPointType (ballcolor.green()) / 255., - vtkFloatingPointType (ballcolor.blue()) / 255.); - anActor->SetBallSize(aDlg->GetIntValue(4)); - - /* Faces orientation */ - vtkFloatingPointType c[3] = {vtkFloatingPointType(faces_orientation_color.redF()), - vtkFloatingPointType(faces_orientation_color.greenF()), - vtkFloatingPointType(faces_orientation_color.blueF())}; - anActor->SetFacesOrientationColor(c); - anActor->SetFacesOrientationScale(aDlg->GetDoubleValue(1)); - anActor->SetFacesOrientation3DVectors(aDlg->GetBooleanValue(1)); - - VTK::MarkerType aMarkerTypeNew = aDlg->getMarkerType(); - VTK::MarkerScale aMarkerScaleNew = aDlg->getStandardMarkerScale(); - int aMarkerTextureNew = aDlg->getCustomMarkerID(); - if( aMarkerTypeNew != VTK::MT_USER ) - anActor->SetMarkerStd( aMarkerTypeNew, aMarkerScaleNew ); - else { - const VTK::MarkerMap& aMarkerMap = theMarkerMap[ aStudy->StudyId() ]; - VTK::MarkerMap::const_iterator anIter = aMarkerMap.find( aMarkerTextureNew ); - if( anIter != aMarkerMap.end() ) - anActor->SetMarkerTexture( aMarkerTextureNew, anIter->second.second ); - } - - SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); - if( !aGroupObject->_is_nil() ) - { - SMESH::ElementType anElementType = aGroupObject->GetType(); - QColor aColor; - switch( anElementType ) - { - case SMESH::NODE: aColor = nodecolor; break; - case SMESH::EDGE: aColor = edgecolor; break; - default: aColor = color; break; - } - - SALOMEDS::Color aGroupColor; - aGroupColor.R = (float)aColor.red() / 255.0; - aGroupColor.G = (float)aColor.green() / 255.0; - aGroupColor.B = (float)aColor.blue() / 255.0; - aGroupObject->SetColor( aGroupColor ); - } - } + if ( !IObject->hasEntry() ) continue; + SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() ); + if ( !anActor ) continue; + + // nodes: color, marker + anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() ); + if ( markerType != VTK::MT_USER ) { + anActor->SetMarkerStd( markerType, markerScale ); } - } + else { + const VTK::MarkerMap& markerMap = theMarkerMap[ aStudy->StudyId() ]; + VTK::MarkerMap::const_iterator iter = markerMap.find( markerId ); + if ( iter != markerMap.end() ) + anActor->SetMarkerTexture( markerId, iter->second.second ); + } + // volumes: normal color, reversed color (delta) + anActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV ); + // faces: front color, back color (delta) + anActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF ); + // edges: color, width + anActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() ); + anActor->SetLineWidth( edgeWidth ); + // outlines: color + anActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() ); + anActor->SetOutlineWidth( outlineWidth ); + // 0D elements: color, size + anActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() ); + anActor->Set0DSize( elem0dSize ); + // balls: color, size + anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() ); + anActor->SetBallSize( ballSize ); + // orientation: color, scale, 3d flag + anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() ); + anActor->SetFacesOrientationScale( orientationScale ); + anActor->SetFacesOrientation3DVectors( orientation3d ); + // shrink factor + anActor->SetShrinkFactor( shrinkCoef ); + + // for groups, set also proper color + SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); + if ( !aGroupObject->_is_nil() ) { + SMESH::ElementType anElementType = aGroupObject->GetType(); + QColor aColor; + switch( anElementType ) { + case SMESH::NODE: + aColor = nodeColor; break; + case SMESH::EDGE: + aColor = edgeColor; break; + case SMESH::FACE: + aColor = faceColor; break; + case SMESH::VOLUME: + aColor = volumeColor; break; + case SMESH::ELEM0D: + aColor = elem0dColor; break; + case SMESH::BALL: + aColor = ballColor; break; + default: break; + } + + if ( aColor.isValid() ) { + SALOMEDS::Color aGroupColor; + aGroupColor.R = aColor.redF(); + aGroupColor.G = aColor.greenF(); + aGroupColor.B = aColor.blueF(); + aGroupObject->SetColor( aGroupColor ); + } + } // if ( !aGroupObject->_is_nil() ) + } // for ( ; It.More(); It.Next() ) SMESH::RepaintCurrentView(); - } - delete aDlg; + } // if ( dlg.exec() ) return; - } - } + } // case 1132: + } // switch(theCommandID) SALOME_ListIteratorOfListIO It( selected ); for( ; It.More(); It.Next()){ Handle(SALOME_InteractiveObject) IObject = It.Value(); @@ -1597,7 +1577,7 @@ bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO, - MeshObjectType theType, + SMESH::MeshObjectType theType, const QString theInTypeName, QString & theOutTypeName) { @@ -1629,11 +1609,11 @@ QString aTypeName; if ( - CheckOIType ( theIO, HYPOTHESIS, "Hypothesis", aTypeName ) || - CheckOIType ( theIO, ALGORITHM, "Algorithm", aTypeName ) || - CheckOIType ( theIO, MESH, "Mesh", aTypeName ) || - CheckOIType ( theIO, SUBMESH, "SubMesh", aTypeName ) || - CheckOIType ( theIO, GROUP, "Group", aTypeName ) + CheckOIType ( theIO, SMESH::HYPOTHESIS, "Hypothesis", aTypeName ) || + CheckOIType ( theIO, SMESH::ALGORITHM, "Algorithm", aTypeName ) || + CheckOIType ( theIO, SMESH::MESH, "Mesh", aTypeName ) || + CheckOIType ( theIO, SMESH::SUBMESH, "SubMesh", aTypeName ) || + CheckOIType ( theIO, SMESH::GROUP, "Group", aTypeName ) ) return aTypeName; @@ -3515,12 +3495,8 @@ void SMESHGUI::createPopupItem( const int id, const QString& theRule, const int pId ) { - int parentId = pId; - if( pId!=-1 ) - parentId = popupMgr()->actionId( action( pId ) ); - if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) ) - popupMgr()->insert( action( id ), parentId, 0 ); + popupMgr()->insert( action( id ), pId, 0 ); QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality(); QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam() @@ -3571,13 +3547,13 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 142, "CGNS"); createSMESHAction( 144, "SAUV"); createSMESHAction( 146, "GMF" ); - createSMESHAction( 124, "EXPORT_DAT" ); - createSMESHAction( 125, "EXPORT_MED" ); - createSMESHAction( 126, "EXPORT_UNV" ); - createSMESHAction( 141, "EXPORT_STL" ); - createSMESHAction( 143, "EXPORT_CGNS"); - createSMESHAction( 145, "EXPORT_SAUV"); - createSMESHAction( 147, "EXPORT_GMF" ); + createSMESHAction( 124, "DAT" ); + createSMESHAction( 125, "MED" ); + createSMESHAction( 126, "UNV" ); + createSMESHAction( 141, "STL" ); + createSMESHAction( 143, "CGNS"); + createSMESHAction( 145, "SAUV"); + createSMESHAction( 147, "GMF" ); createSMESHAction( 150, "FILE_INFO" ); createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete ); createSMESHAction( 5105, "SEL_FILTER_LIB" ); @@ -4021,17 +3997,17 @@ void SMESHGUI::initialize( CAM_Application* app ) QString OB = "'ObjectBrowser'", View = "'" + SVTK_Viewer::Type() + "'", pat = "'%1'", - mesh = pat.arg( SMESHGUI_Selection::typeName( MESH ) ), - group = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ), - hypo = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ), - algo = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ), + mesh = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ), + group = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ), + hypo = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ), + algo = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ), elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ). - arg( SMESHGUI_Selection::typeName( SUBMESH_VERTEX ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH ) ), + arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ). + arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ). + arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ). + arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ). + arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ). + arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ), subMesh = elems, mesh_part = mesh + " " + subMesh + " " + group, mesh_group = mesh + " " + group, @@ -4087,13 +4063,16 @@ void SMESHGUI::initialize( CAM_Application* app ) QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc ); QString only_one_2D = only_one_non_empty + " && dim>1"; - createPopupItem( 125, OB, mesh_group, multiple_non_empty ); // EXPORT_MED - createPopupItem( 126, OB, mesh_group, only_one_non_empty ); // EXPORT_UNV - createPopupItem( 141, OB, mesh_group, only_one_2D ); // EXPORT_STL + int anId = popupMgr()->insert( tr( "MEN_EXPORT" ), -1, -1 ); // EXPORT submenu + createPopupItem( 125, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_MED + createPopupItem( 126, OB, mesh_group, only_one_non_empty, anId ); // EXPORT_UNV + createPopupItem( 141, OB, mesh_group, only_one_2D, anId ); // EXPORT_STL #ifdef WITH_CGNS - createPopupItem( 143, OB, mesh_group, multiple_non_empty ); // EXPORT_CGNS + createPopupItem( 143, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_CGNS #endif - createPopupItem( 145, OB, mesh_group, multiple_non_empty ); // EXPORT_SAUV + createPopupItem( 145, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_SAUV + createPopupItem( 147, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_GMF + createPopupItem( 124, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_DAT createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE createPopupItem( 813, OB, group ); // DEL_GROUP with contents popupMgr()->insert( separator(), -1, 0 ); @@ -4113,7 +4092,6 @@ void SMESHGUI::initialize( CAM_Application* app ) createPopupItem( 1137, OB + " " + View, mesh, "&& isAutoColor" ); // DISABLE_AUTO_COLOR popupMgr()->insert( separator(), -1, 0 ); - int anId; QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" ); QString aType = QString( "%1type in {%2}" ).arg( lc ); aType = aType.arg( mesh_part ); @@ -4813,20 +4791,23 @@ void SMESHGUI::createPreferences() setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList ); int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab ); - setPreferenceProperty( elemGroup, "columns", 2 ); + //setPreferenceProperty( elemGroup, "columns", 2 ); - int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" ); + int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" ); + setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") ); + ColorId = addPreference( tr( "PREF_VOLUME" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "volume_color" ); + setPreferenceProperty( ColorId, "text", tr("PREF_REVERSEDVOLUME") ); addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" ); addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" ); addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" ); addPreference( tr( "PREF_WIREFRAME" ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" ); - setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") ); int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab ); setPreferenceProperty( grpGroup, "columns", 2 ); addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" ); + addPreference( tr( "PREF_GRP_DEF_COLOR" ), grpGroup, LightApp_Preferences::Color, "SMESH", "default_grp_color" ); int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "elem0d_size"); @@ -4834,6 +4815,8 @@ void SMESHGUI::createPreferences() LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size"); int elemW = addPreference(tr("PREF_WIDTH"), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "element_width"); + int outW = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup, + LightApp_Preferences::IntSpin, "SMESH", "outline_width"); int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup, LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff"); @@ -4846,6 +4829,9 @@ void SMESHGUI::createPreferences() setPreferenceProperty( elemW, "min", 1 ); setPreferenceProperty( elemW, "max", 5 ); + setPreferenceProperty( outW, "min", 1 ); + setPreferenceProperty( outW, "max", 5 ); + setPreferenceProperty( shrink, "min", 0 ); setPreferenceProperty( shrink, "max", 100 ); @@ -5221,16 +5207,16 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList& theReser aColor.setHsv( aHue, 255, 255 ); SALOMEDS::Color aSColor; - aSColor.R = (double)aColor.red() / 255.0; - aSColor.G = (double)aColor.green() / 255.0; - aSColor.B = (double)aColor.blue() / 255.0; + aSColor.R = aColor.redF(); + aSColor.G = aColor.greenF(); + aSColor.B = aColor.blueF(); return aSColor; } -const char gSeparator = '_'; // character used to separate parameter names -const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b) -const char gPathSep = '|'; // character used to separate paths +const char* gSeparator = "_"; // character used to separate parameter names +const char* gDigitsSep = ":"; // character used to separate numeric parameter values (color = r:g:b) +const char* gPathSep = "|"; // character used to separate paths /*! * \brief Store visual parameters @@ -5240,6 +5226,9 @@ const char gPathSep = '|'; // character used to separate paths */ void SMESHGUI::storeVisualParameters (int savePoint) { + // localizing + Kernel_Utils::Localizer loc; + SalomeApp_Study* appStudy = dynamic_cast(application()->activeStudy()); if (!appStudy || !appStudy->studyDS()) return; @@ -5380,9 +5369,11 @@ void SMESHGUI::storeVisualParameters (int savePoint) // Displayed entities unsigned int aMode = aSmeshActor->GetEntityMode(); - bool isE = aMode & SMESH_Actor::eEdges; - bool isF = aMode & SMESH_Actor::eFaces; - bool isV = aMode & SMESH_Actor::eVolumes; + bool isE = aMode & SMESH_Actor::eEdges; + bool isF = aMode & SMESH_Actor::eFaces; + bool isV = aMode & SMESH_Actor::eVolumes; + bool is0d = aMode & SMESH_Actor::e0DElements; + bool isB = aMode & SMESH_Actor::eBallElem; QString modeStr ("e"); modeStr += gDigitsSep; modeStr += QString::number(isE); @@ -5390,53 +5381,92 @@ void SMESHGUI::storeVisualParameters (int savePoint) modeStr += gDigitsSep; modeStr += QString::number(isF); modeStr += gDigitsSep; modeStr += "v"; modeStr += gDigitsSep; modeStr += QString::number(isV); + modeStr += gDigitsSep; modeStr += "0d"; + modeStr += gDigitsSep; modeStr += QString::number(is0d); + modeStr += gDigitsSep; modeStr += "b"; + modeStr += gDigitsSep; modeStr += QString::number(isB); param = vtkParam + "Entities"; ip->setParameter(entry, param, modeStr.toLatin1().data()); - // Colors (surface:edge:) + // Colors vtkFloatingPointType r, g, b; int delta; aSmeshActor->GetSufaceColor(r, g, b, delta); - QString colorStr ("surface"); - colorStr += gDigitsSep; colorStr += QString::number(r); - colorStr += gDigitsSep; colorStr += QString::number(g); - colorStr += gDigitsSep; colorStr += QString::number(b); - - colorStr += gDigitsSep; colorStr += "backsurface"; - colorStr += gDigitsSep; colorStr += QString::number(delta); - + QStringList colorStr; + colorStr << "surface"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); + + colorStr << "backsurface"; + colorStr << QString::number(delta); + + aSmeshActor->GetVolumeColor(r, g, b, delta); + colorStr << "volume"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); + colorStr << QString::number(delta); aSmeshActor->GetEdgeColor(r, g, b); - colorStr += gDigitsSep; colorStr += "edge"; - colorStr += gDigitsSep; colorStr += QString::number(r); - colorStr += gDigitsSep; colorStr += QString::number(g); - colorStr += gDigitsSep; colorStr += QString::number(b); + colorStr << "edge"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); aSmeshActor->GetNodeColor(r, g, b); - colorStr += gDigitsSep; colorStr += "node"; - colorStr += gDigitsSep; colorStr += QString::number(r); - colorStr += gDigitsSep; colorStr += QString::number(g); - colorStr += gDigitsSep; colorStr += QString::number(b); + colorStr << "node"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); aSmeshActor->GetOutlineColor(r, g, b); - colorStr += gDigitsSep; colorStr += "outline"; - colorStr += gDigitsSep; colorStr += QString::number(r); - colorStr += gDigitsSep; colorStr += QString::number(g); - colorStr += gDigitsSep; colorStr += QString::number(b); + colorStr << "outline"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); + + aSmeshActor->Get0DColor(r, g, b); + colorStr << "elem0d"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); + + aSmeshActor->GetBallColor(r, g, b); + colorStr << "ball"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); + + aSmeshActor->GetFacesOrientationColor(r, g, b); + colorStr << "orientation"; + colorStr << QString::number(r); + colorStr << QString::number(g); + colorStr << QString::number(b); param = vtkParam + "Colors"; - ip->setParameter(entry, param, colorStr.toLatin1().data()); - - // Sizes of lines and points - QString sizeStr ("line"); - sizeStr += gDigitsSep; sizeStr += QString::number((int)aSmeshActor->GetLineWidth()); - sizeStr += gDigitsSep; sizeStr += "shrink"; - sizeStr += gDigitsSep; sizeStr += QString::number(aSmeshActor->GetShrinkFactor()); + ip->setParameter(entry, param, qPrintable(colorStr.join(gDigitsSep))); + + // Sizes + QStringList sizeStr; + sizeStr << "line"; + sizeStr << QString::number((int)aSmeshActor->GetLineWidth()); + sizeStr << "outline"; + sizeStr << QString::number((int)aSmeshActor->GetOutlineWidth()); + sizeStr << "elem0d"; + sizeStr << QString::number((int)aSmeshActor->Get0DSize()); + sizeStr << "ball"; + sizeStr << QString::number((int)aSmeshActor->GetBallSize()); + sizeStr << "shrink"; + sizeStr << QString::number(aSmeshActor->GetShrinkFactor()); + sizeStr << "orientation"; + sizeStr << QString::number(aSmeshActor->GetFacesOrientationScale()); + sizeStr << QString::number(aSmeshActor->GetFacesOrientation3DVectors()); param = vtkParam + "Sizes"; - ip->setParameter(entry, param, sizeStr.toLatin1().data()); + ip->setParameter(entry, param, qPrintable(sizeStr.join(gDigitsSep))); // Point marker QString markerStr; @@ -5522,6 +5552,9 @@ typedef std::map TPlaneInfoMap; */ void SMESHGUI::restoreVisualParameters (int savePoint) { + // localizing + Kernel_Utils::Localizer loc; + SalomeApp_Study* appStudy = dynamic_cast(application()->activeStudy()); if (!appStudy || !appStudy->studyDS()) return; @@ -5758,96 +5791,280 @@ void SMESHGUI::restoreVisualParameters (int savePoint) // Displayed entities else if (paramNameStr == "Entities") { QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts); - if (mode.count() == 6) { - if (mode[0] != "e" || mode[2] != "f" || mode[4] != "v") { - MESSAGE("Invalid order of data in Entities, must be: " - "e:0/1:f:0/1:v:0/1"); - } - else { - unsigned int aMode = aSmeshActor->GetEntityMode(); - unsigned int aNewMode = - (int(SMESH_Actor::eEdges ) * mode[1].toInt()) | - (int(SMESH_Actor::eFaces ) * mode[3].toInt()) | - (int(SMESH_Actor::eVolumes) * mode[5].toInt()); - if (aNewMode != aMode) - aSmeshActor->SetEntityMode(aNewMode); - } - } + int aEntityMode = SMESH_Actor::eAllEntity; + for ( int i = 0; i < mode.count(); i+=2 ) { + if ( i < mode.count()-1 ) { + QString type = mode[i]; + bool val = mode[i+1].toInt(); + if ( type == "e" && !val ) + aEntityMode = aEntityMode & ~SMESH_Actor::eEdges; + else if ( type == "f" && !val ) + aEntityMode = aEntityMode & ~SMESH_Actor::eFaces; + else if ( type == "v" && !val ) + aEntityMode = aEntityMode & ~SMESH_Actor::eVolumes; + else if ( type == "0d" && !val ) + aEntityMode = aEntityMode & ~SMESH_Actor::e0DElements; + else if ( type == "b" && !val ) + aEntityMode = aEntityMode & ~SMESH_Actor::eBallElem; + } + } + aSmeshActor->SetEntityMode( aEntityMode ); } // Colors else if (paramNameStr == "Colors") { QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts); - if (colors.count() == 16 || colors.count() == 18 ) { - if (colors[0] != "surface" || colors[4] != "backsurface" || - (colors[8] != "edge" && colors[6] != "edge" ) || (colors[12] != "node" && colors[10] != "node") || - (colors.count() == 18 && colors[14] != "outline")) { - MESSAGE("Invalid order of data in Colors, must be: " - "surface:r:g:b:backsurface:r:g:b:edge:r:g:b:node:r:g:b or surface:r:g:b:backsurface:delta:edge:r:g:b:node:r:g:b:outline:r:g:b"); - } - else { - int delta = 0; - float er,eg,eb; - float nr,ng,nb; - vtkFloatingPointType otr,otg,otb; - //Old case backsurface color is independent - if( colors.count() == 16 ) { - QColor ffc; - SMESH::GetColor( "SMESH", "fill_color", ffc, delta, "0,170,255|-100" ) ; - er = colors[9].toFloat(); - eg = colors[10].toFloat(); - eb = colors[11].toFloat(); - - nr = colors[13].toFloat(); - ng = colors[14].toFloat(); - nb = colors[15].toFloat(); - SMESH::GetColor("SMESH", "outline_color", otr, otg, otb, QColor( 0, 70, 0 ) ); - } else { - //New case backsurface color depends on surface color - delta = colors[5].toInt(); - - er = colors[7].toFloat(); - eg = colors[8].toFloat(); - eb = colors[9].toFloat(); - - nr = colors[11].toFloat(); - ng = colors[12].toFloat(); - nb = colors[13].toFloat(); - - otr = colors[15].toFloat(); - otg = colors[16].toFloat(); - otb = colors[17].toFloat(); - } - aSmeshActor->SetSufaceColor(colors[1].toFloat(), colors[2].toFloat(), colors[3].toFloat(), delta); - aSmeshActor->SetEdgeColor(er,eg,eb); - aSmeshActor->SetNodeColor(nr,ng,nb); - aSmeshActor->SetOutlineColor(otr,otg,otb); - } - } + QColor nodeColor; + QColor edgeColor; + QColor faceColor; + QColor volumeColor; + QColor elem0dColor; + QColor ballColor; + QColor outlineColor; + QColor orientationColor; + int deltaF; + int deltaV; + QColor c; + double r, g, b; + bool bOk; + // below lines are required to get default values for delta coefficients + // of backface color for faces and color of reversed volumes + SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" ); + SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" ); + for ( int i = 0; i < colors.count(); i++ ) { + QString type = colors[i]; + if ( type == "surface" ) { + // face color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + faceColor.setRgbF( r, g, b ); + i += 3; + } + else if ( type == "backsurface" ) { + // backface color can be defined in several ways + // - in old versions, it is set as rgb triple r:g:b - this was is unsupported now + // - in latest versions, it is set as delta coefficient + bool rgbOk = false, deltaOk; + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + int delta = colors[i+1].toInt( &deltaOk ); + i++; // shift index + if ( i+1 < colors.count() ) // index is shifted to 1 + g = colors[i+1].toDouble( &rgbOk ); + if ( rgbOk ) i++; // shift index + if ( rgbOk && i+1 < colors.count() ) // index is shifted to 2 + b = colors[i+1].toDouble( &rgbOk ); + if ( rgbOk ) i++; + // - as currently there's no way to set directly backsurface color as it was before, + // we ignore old dump where r,g,b triple was set + // - also we check that delta parameter is set properly + if ( !rgbOk && deltaOk ) + deltaF = delta; + } + else if ( type == "volume" ) { + // volume color is set by 4 values r:g:b:delta, where + // - r,g,b - is a normal volume rgb color components + // - delta - is a reversed volume color delta coefficient + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+4 >= colors.count() ) break; // format error + int delta = colors[i+4].toInt( &bOk ); + if ( !bOk ) break; // format error + volumeColor.setRgbF( r, g, b ); + deltaV = delta; + i += 4; + } + else if ( type == "edge" ) { + // edge color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + edgeColor.setRgbF( r, g, b ); + i += 3; + } + else if ( type == "node" ) { + // node color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + nodeColor.setRgbF( r, g, b ); + i += 3; + } + else if ( type == "elem0d" ) { + // 0d element color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + elem0dColor.setRgbF( r, g, b ); + i += 3; + } + else if ( type == "ball" ) { + // ball color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + ballColor.setRgbF( r, g, b ); + i += 3; + } + else if ( type == "outline" ) { + // outline color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + outlineColor.setRgbF( r, g, b ); + i += 3; + } + else if ( type == "orientation" ) { + // orientation color is set by 3 values r:g:b, where + // - r,g,b - is rgb color components + if ( i+1 >= colors.count() ) break; // format error + r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= colors.count() ) break; // format error + g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+3 >= colors.count() ) break; // format error + b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error + orientationColor.setRgbF( r, g, b ); + i += 3; + } + } + // node color + if ( nodeColor.isValid() ) + aSmeshActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() ); + // edge color + if ( edgeColor.isValid() ) + aSmeshActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() ); + // face color + if ( faceColor.isValid() ) + aSmeshActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF ); + // volume color + if ( volumeColor.isValid() ) + aSmeshActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV ); + else if ( faceColor.isValid() ) // backward compatibility (no separate color for volumes) + aSmeshActor->SetVolumeColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF ); + // 0d element color + if ( elem0dColor.isValid() ) + aSmeshActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() ); + // ball color + if ( ballColor.isValid() ) + aSmeshActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() ); + // outline color + if ( outlineColor.isValid() ) + aSmeshActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() ); + // orientation color + if ( orientationColor.isValid() ) + aSmeshActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() ); } - // Sizes of lines and points + // Sizes else if (paramNameStr == "Sizes") { QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts); - if (sizes.count() == 4) { - if (sizes[0] != "line" || sizes[2] != "shrink") { - MESSAGE("Invalid order of data in Sizes, must be: " - "line:int:shrink:float"); - } - else { - aSmeshActor->SetLineWidth(sizes[1].toInt()); - aSmeshActor->SetShrinkFactor(sizes[3].toFloat()); - } - } - else if (sizes.count() == 6) { // just to support old format - if (sizes[0] != "line" || sizes[2] != "node" || sizes[4] != "shrink") { - MESSAGE("Invalid order of data in Sizes, must be: " - "line:int:node:int:shrink:float"); - } - else { - aSmeshActor->SetLineWidth(sizes[1].toInt()); - //aSmeshActor->SetNodeSize(sizes[3].toInt()); // made obsolete - aSmeshActor->SetShrinkFactor(sizes[5].toFloat()); - } - } + bool bOk; + int lineWidth = -1; + int outlineWidth = -1; + int elem0dSize = -1; + int ballSize = -1; + double shrinkSize = -1; + double orientationSize = -1; + bool orientation3d = false; + for ( int i = 0; i < sizes.count(); i++ ) { + QString type = sizes[i]; + if ( type == "line" ) { + // line (wireframe) width is given as single integer value + if ( i+1 >= sizes.count() ) break; // format error + int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error + lineWidth = v; + i++; + } + if ( type == "outline" ) { + // outline width is given as single integer value + if ( i+1 >= sizes.count() ) break; // format error + int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error + outlineWidth = v; + i++; + } + else if ( type == "elem0d" ) { + // 0d element size is given as single integer value + if ( i+1 >= sizes.count() ) break; // format error + int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error + elem0dSize = v; + i++; + } + else if ( type == "ball" ) { + // ball size is given as single integer value + if ( i+1 >= sizes.count() ) break; // format error + int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error + ballSize = v; + i++; + } + else if ( type == "shrink" ) { + // shrink factor is given as single floating point value + if ( i+1 >= sizes.count() ) break; // format error + double v = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + shrinkSize = v; + i++; + } + else if ( type == "orientation" ) { + // orientation vectors are specified by two values size:3d, where + // - size - is a floating point value specifying scale factor + // - 3d - is a boolean + if ( i+1 >= sizes.count() ) break; // format error + double v1 = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error + if ( i+2 >= sizes.count() ) break; // format error + int v2 = sizes[i+2].toInt( &bOk ); if ( !bOk ) break; // format error + orientationSize = v1; + orientation3d = (bool)v2; + i += 2; + } + } + // line (wireframe) width + if ( lineWidth > 0 ) + aSmeshActor->SetLineWidth( lineWidth ); + // outline width + if ( outlineWidth > 0 ) + aSmeshActor->SetOutlineWidth( outlineWidth ); + else if ( lineWidth > 0 ) // backward compatibility (no separate width for outlines) + aSmeshActor->SetOutlineWidth( lineWidth ); + // 0d element size + if ( elem0dSize > 0 ) + aSmeshActor->Set0DSize( elem0dSize ); + // ball size + if ( ballSize > 0 ) + aSmeshActor->SetBallSize( ballSize ); + // shrink factor + if ( shrinkSize > 0 ) + aSmeshActor->SetShrinkFactor( shrinkSize ); + // orientation vectors + if ( orientationSize > 0 ) { + aSmeshActor->SetFacesOrientationScale( orientationSize ); + aSmeshActor->SetFacesOrientation3DVectors( orientation3d ); + } } // Point marker else if (paramNameStr == "PointMarker") { @@ -6179,11 +6396,11 @@ bool SMESHGUI::renameAllowed( const QString& entry) const { // check type to prevent renaming of inappropriate objects int aType = SMESHGUI_Selection::type(qPrintable(entry), SMESH::GetActiveStudyDocument()); - if (aType == MESH || aType == GROUP || - aType == SUBMESH || aType == SUBMESH_COMPOUND || - aType == SUBMESH_SOLID || aType == SUBMESH_FACE || - aType == SUBMESH_EDGE || aType == SUBMESH_VERTEX || - aType == HYPOTHESIS || aType == ALGORITHM) + if (aType == SMESH::MESH || aType == SMESH::GROUP || + aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND || + aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE || + aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX || + aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM) return true; return false; @@ -6226,11 +6443,11 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) { aName = anAttr; // check type to prevent renaming of inappropriate objects int aType = SMESHGUI_Selection::type( qPrintable(entry), SMESH::GetActiveStudyDocument() ); - if (aType == MESH || aType == GROUP || - aType == SUBMESH || aType == SUBMESH_COMPOUND || - aType == SUBMESH_SOLID || aType == SUBMESH_FACE || - aType == SUBMESH_EDGE || aType == SUBMESH_VERTEX || - aType == HYPOTHESIS || aType == ALGORITHM) { + if (aType == SMESH::MESH || aType == SMESH::GROUP || + aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND || + aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE || + aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX || + aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM) { if ( !name.isEmpty() ) { SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) );