0020943: EDF 1463 SMESH: additional fonctionnality to the feature 20749

+    class BareBorderVolume: public Predicate
+    class BareBorderFace: public Predicate
This commit is contained in:
eap 2010-11-15 11:51:29 +00:00
parent 8a18df0d9a
commit 3b2ddf07cc
21 changed files with 348 additions and 49 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -32,6 +32,7 @@ Edge quality controls:
Face quality controls: Face quality controls:
<ul> <ul>
<li>\subpage free_faces_page "Free faces"</li> <li>\subpage free_faces_page "Free faces"</li>
<li>\subpage bare_border_faces_page "Bare border faces"</li>
<li>\subpage length_2d_page "Length 2D"</li> <li>\subpage length_2d_page "Length 2D"</li>
<li>\subpage borders_at_multi_connection_2d_page "Borders at multi-connection 2D"</li> <li>\subpage borders_at_multi_connection_2d_page "Borders at multi-connection 2D"</li>
<li>\subpage area_page "Area"</li> <li>\subpage area_page "Area"</li>
@ -48,6 +49,7 @@ Volume quality controls:
<li>\subpage aspect_ratio_3d_page "Aspect ratio 3D"</li> <li>\subpage aspect_ratio_3d_page "Aspect ratio 3D"</li>
<li>\subpage volume_page "Volume"</li> <li>\subpage volume_page "Volume"</li>
<li>\subpage max_element_length_3d_page "Max element length 3D"</li> <li>\subpage max_element_length_3d_page "Max element length 3D"</li>
<li>\subpage bare_border_volumes_page "Bare border volumes"</li>
</ul> </ul>
*/ */

View File

@ -0,0 +1,15 @@
/*!
\page bare_border_faces_page Bare border faces
This mesh quality control highlights the faces having the border not
shared with other faces (free border) and missing an edge based on
nodes of the free border. The faces with bare border are shown with a
color different from the color of shared faces.
\image html bare_border_faces_smpl.png
\sa A sample TUI Script making a group of faces highlighted in the
picture is \ref tui_bare_border_faces "Bare border faces Control".
*/

View File

@ -0,0 +1,15 @@
/*!
\page bare_border_volumes_page Bare border volumes
This mesh quality control highlights the volumes having the border not
shared with other volumes (free border) and missing a face based on
nodes of the free border. The volumes with bare border are shown with a
color different from the color of shared volumes.
\image html bare_border_volumes_smpl.png
\sa A sample TUI Script making a group of volumes highlighted in the
picture is \ref tui_bare_border_volumes "Bare border volumes Control".
*/

View File

@ -144,7 +144,10 @@ Additional criteria to select mesh <b>Faces</b> are the following:
one element of mesh only. See also a one element of mesh only. See also a
\ref free_edges_page "Free Edges quality control". \ref free_edges_page "Free Edges quality control".
</li><li> </li><li>
<b>Free faces</b> selects 3D mesh elements wich belong to less than two volumes. <b>Free faces</b> selects 2D mesh elements wich belong to less than two volumes.
</li><li>
<b>Faces with bare border</b> selects 2D mesh elements having a free border without an edge on it.
See also \ref bare_border_faces_page "Bare border faces quality control".
</li><li> </li><li>
<b>Borders at Multi-Connections 2D</b> selects cells consisting of edges belonging to <b>Borders at Multi-Connections 2D</b> selects cells consisting of edges belonging to
several elements of mesh. The number of mesh elements should be more, less or equal several elements of mesh. The number of mesh elements should be more, less or equal
@ -181,6 +184,9 @@ diagonals with a value of length, which is more, less or equal
</li><li> </li><li>
<b>Bad oriented volume</b> selects mesh volumes, which are incorrectly oriented from <b>Bad oriented volume</b> selects mesh volumes, which are incorrectly oriented from
the point of view of MED convention. the point of view of MED convention.
</li><li>
<b>Volumes with bare border</b> selects 3D mesh elements having a free border without a face on it.
See also \ref bare_border_volumes_page "Bare border volumes quality control".
</li> </li>
</ul> </ul>

View File

@ -309,6 +309,54 @@ aGroup.Add(aFaceIds)
salome.sg.updateObjBrowser(1) salome.sg.updateObjBrowser(1)
\endcode \endcode
\section tui_bare_border_faces Bare border faces
\code
from smesh import *
SetCurrentStudy(salome.myStudy)
box = geompy.MakeBoxDXDYDZ(100, 100, 100)
geompy.addToStudy( box, "box" )
mesh = smesh.Mesh(box)
mesh.Segment().NumberOfSegments(3)
mesh.Quadrangle()
mesh.Compute()
# remove 2 faces
allFaces = mesh.GetElementsByType(FACE)
mesh.RemoveElements( allFaces[0:2])
bareGroup = mesh.MakeGroup("bare faces", FACE, FT_BareBorderFace)
assert(bareGroup.Size() == 3)
\endcode
\section tui_bare_border_volumes Bare border volumes
\code
from smesh import *
SetCurrentStudy(salome.myStudy)
box = geompy.MakeBoxDXDYDZ(100, 30, 10)
# the smallest face of the box
face = geompy.SubShapeAllSorted( box, geompy.ShapeType["FACE"])[0]
geompy.addToStudy( box, "box" )
geompy.addToStudyInFather( box, face, "face" )
mesh = Mesh(box)
mesh.AutomaticHexahedralization();
# remove half of mesh faces from the smallest face
faceFaces = mesh.GetSubMeshElementsId(face)
faceToRemove = faceFaces[: len(faceFaces)/2]
mesh.RemoveElements( faceToRemove )
# make a group of volumes missing the removed faces
bareGroup = mesh.MakeGroup("bare volumes", VOLUME, FT_BareBorderVolume)
assert(bareGroup.Size() == len( faceToRemove))
\endcode
\section tui_length_2d Length 2D \section tui_length_2d Length 2D
\code \code

View File

@ -64,6 +64,8 @@ module SMESH
FT_LyingOnGeom, FT_LyingOnGeom,
FT_RangeOfIds, FT_RangeOfIds,
FT_BadOrientedVolume, FT_BadOrientedVolume,
FT_BareBorderVolume,
FT_BareBorderFace,
FT_LinearOrQuadratic, FT_LinearOrQuadratic,
FT_GroupColor, FT_GroupColor,
FT_ElemGeomType, FT_ElemGeomType,
@ -87,6 +89,7 @@ module SMESH
}; };
typedef sequence<HistogramRectangle> Histogram; typedef sequence<HistogramRectangle> Histogram;
/*! /*!
* Base interface for all functors ( i.e. numerical functors and predicates ) * Base interface for all functors ( i.e. numerical functors and predicates )
*/ */
@ -97,8 +100,6 @@ module SMESH
ElementType GetElementType(); ElementType GetElementType();
}; };
/*! /*!
* Numerical functors are intended for calculating value by Id of mesh entity * Numerical functors are intended for calculating value by Id of mesh entity
*/ */
@ -149,6 +150,7 @@ module SMESH
Values GetValues(); Values GetValues();
}; };
/*! /*!
* Predicates are intended for verification of criteria, * Predicates are intended for verification of criteria,
* must return bool value by mesh id * must return bool value by mesh id
@ -165,6 +167,18 @@ module SMESH
*/ */
interface BadOrientedVolume: Predicate {}; interface BadOrientedVolume: Predicate {};
/*!
* Logical functor (predicate) "Volumes with bare border" and "Faces with bare border".
* Verify whether a mesh volume has a free facet without a mesh face on it
*/
interface BareBorderVolume: Predicate {};
/*!
* Logical functor (predicate) "Faces with bare border".
* Verify whether a mesh face has a side not shared with another face
* and without a mesh edge on it
*/
interface BareBorderFace: Predicate {};
/*! /*!
* Logical functor (predicate) "Belong To Geometry". * Logical functor (predicate) "Belong To Geometry".
* Verify whether mesh element or node belong to pointed Geom Object * Verify whether mesh element or node belong to pointed Geom Object
@ -492,6 +506,8 @@ module SMESH
RangeOfIds CreateRangeOfIds(); RangeOfIds CreateRangeOfIds();
BadOrientedVolume CreateBadOrientedVolume(); BadOrientedVolume CreateBadOrientedVolume();
BareBorderVolume CreateBareBorderVolume();
BareBorderFace CreateBareBorderFace();
LinearOrQuadratic CreateLinearOrQuadratic(); LinearOrQuadratic CreateLinearOrQuadratic();
GroupColor CreateGroupColor(); GroupColor CreateGroupColor();

View File

@ -102,6 +102,8 @@ dist_salomeres_DATA = \
mesh_vertex_n.png \ mesh_vertex_n.png \
mesh_vertex.png \ mesh_vertex.png \
mesh_volume_3d.png \ mesh_volume_3d.png \
bare_border_volume.png \
bare_border_face.png \
mesh_wireframe.png \ mesh_wireframe.png \
mesh_points.png \ mesh_points.png \
mesh_wrap.png \ mesh_wrap.png \

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -199,6 +199,25 @@ SMESH_ActorDef::SMESH_ActorDef()
aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID); aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
my3DExtActor = SMESH_DeviceActor::New();
my3DExtActor->SetUserMatrix(aMatrix);
my3DExtActor->PickableOff();
my3DExtActor->SetProperty(my2DExtProp);
my3DExtActor->SetBackfaceProperty(my2DExtProp);
my3DExtActor->SetRepresentation(SMESH_DeviceActor::eSurface);
aFilter = my3DExtActor->GetExtractUnstructuredGrid();
aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
aFilter->RegisterCellsWithType(VTK_TETRA);
aFilter->RegisterCellsWithType(VTK_VOXEL);
aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
aFilter->RegisterCellsWithType(VTK_WEDGE);
aFilter->RegisterCellsWithType(VTK_PYRAMID);
aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
//Definition 1D device of the actor //Definition 1D device of the actor
//--------------------------------- //---------------------------------
myEdgeProp = vtkProperty::New(); myEdgeProp = vtkProperty::New();
@ -532,6 +551,7 @@ SMESH_ActorDef::~SMESH_ActorDef()
my2DExtProp->Delete(); my2DExtProp->Delete();
my2DExtActor->Delete(); my2DExtActor->Delete();
my3DActor->Delete(); my3DActor->Delete();
my3DExtActor->Delete();
myNodeActor->Delete(); myNodeActor->Delete();
myBaseActor->Delete(); myBaseActor->Delete();
@ -723,8 +743,8 @@ SetControlMode(eControl theMode,
bool anIsScalarVisible = theMode > eNone; bool anIsScalarVisible = theMode > eNone;
if(anIsScalarVisible){ if(anIsScalarVisible) {
switch(theMode){ switch(theMode) {
case eLength: case eLength:
{ {
SMESH::Controls::Length* aControl = new SMESH::Controls::Length(); SMESH::Controls::Length* aControl = new SMESH::Controls::Length();
@ -755,6 +775,10 @@ SetControlMode(eControl theMode,
myFunctor.reset(new SMESH::Controls::FreeFaces()); myFunctor.reset(new SMESH::Controls::FreeFaces());
myControlActor = my2DActor; myControlActor = my2DActor;
break; break;
case eBareBorderFace:
myFunctor.reset(new SMESH::Controls::BareBorderFace());
myControlActor = my2DActor;
break;
case eMultiConnection: case eMultiConnection:
myFunctor.reset(new SMESH::Controls::MultiConnection()); myFunctor.reset(new SMESH::Controls::MultiConnection());
myControlActor = my1DActor; myControlActor = my1DActor;
@ -819,6 +843,12 @@ SetControlMode(eControl theMode,
myControlActor = my3DActor; myControlActor = my3DActor;
break; break;
} }
case eBareBorderVolume:
{
myFunctor.reset(new SMESH::Controls::BareBorderVolume());
myControlActor = my3DActor;
break;
}
case eMinimumAngle: case eMinimumAngle:
{ {
SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle(); SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle();
@ -862,6 +892,12 @@ SetControlMode(eControl theMode,
case eFreeFaces: case eFreeFaces:
my2DExtActor->SetExtControlMode(myFunctor); my2DExtActor->SetExtControlMode(myFunctor);
break; break;
case eBareBorderFace:
my2DExtActor->SetExtControlMode(myFunctor);
break;
case eBareBorderVolume:
my3DExtActor->SetExtControlMode(myFunctor);
break;
case eLength2D: case eLength2D:
case eMultiConnection2D: case eMultiConnection2D:
my1DExtActor->SetExtControlMode(myFunctor,myScalarBarActor,myLookupTable); my1DExtActor->SetExtControlMode(myFunctor,myScalarBarActor,myLookupTable);
@ -911,6 +947,7 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
theRenderer->AddActor(myNodeExtActor); theRenderer->AddActor(myNodeExtActor);
my3DActor->AddToRender(theRenderer); my3DActor->AddToRender(theRenderer);
my3DExtActor->AddToRender(theRenderer);
my2DActor->AddToRender(theRenderer); my2DActor->AddToRender(theRenderer);
my2DExtActor->AddToRender(theRenderer); my2DExtActor->AddToRender(theRenderer);
@ -954,6 +991,7 @@ void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){
my2DActor->RemoveFromRender(theRenderer); my2DActor->RemoveFromRender(theRenderer);
my2DExtActor->RemoveFromRender(theRenderer); my2DExtActor->RemoveFromRender(theRenderer);
my3DActor->RemoveFromRender(theRenderer); my3DActor->RemoveFromRender(theRenderer);
my3DExtActor->RemoveFromRender(theRenderer);
theRenderer->RemoveActor(myScalarBarActor); theRenderer->RemoveActor(myScalarBarActor);
theRenderer->RemoveActor(myPointLabels); theRenderer->RemoveActor(myPointLabels);
@ -989,6 +1027,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj,
my2DActor->Init(myVisualObj,myImplicitBoolean); my2DActor->Init(myVisualObj,myImplicitBoolean);
my2DExtActor->Init(myVisualObj,myImplicitBoolean); my2DExtActor->Init(myVisualObj,myImplicitBoolean);
my3DActor->Init(myVisualObj,myImplicitBoolean); my3DActor->Init(myVisualObj,myImplicitBoolean);
my3DExtActor->Init(myVisualObj,myImplicitBoolean);
my0DActor->GetMapper()->SetLookupTable(myLookupTable); my0DActor->GetMapper()->SetLookupTable(myLookupTable);
//my0DExtActor->GetMapper()->SetLookupTable(myLookupTable); //my0DExtActor->GetMapper()->SetLookupTable(myLookupTable);
@ -999,6 +1038,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj,
my2DActor->GetMapper()->SetLookupTable(myLookupTable); my2DActor->GetMapper()->SetLookupTable(myLookupTable);
my2DExtActor->GetMapper()->SetLookupTable(myLookupTable); my2DExtActor->GetMapper()->SetLookupTable(myLookupTable);
my3DActor->GetMapper()->SetLookupTable(myLookupTable); my3DActor->GetMapper()->SetLookupTable(myLookupTable);
my3DExtActor->GetMapper()->SetLookupTable(myLookupTable);
vtkFloatingPointType aFactor, aUnits; vtkFloatingPointType aFactor, aUnits;
my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); my2DActor->GetPolygonOffsetParameters(aFactor,aUnits);
@ -1071,6 +1111,7 @@ void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){
my2DActor->SetTransform(theTransform); my2DActor->SetTransform(theTransform);
my2DExtActor->SetTransform(theTransform); my2DExtActor->SetTransform(theTransform);
my3DActor->SetTransform(theTransform); my3DActor->SetTransform(theTransform);
my3DExtActor->SetTransform(theTransform);
Modified(); Modified();
} }
@ -1126,6 +1167,7 @@ void SMESH_ActorDef::SetShrinkFactor(vtkFloatingPointType theValue){
my2DActor->SetShrinkFactor(theValue); my2DActor->SetShrinkFactor(theValue);
my2DExtActor->SetShrinkFactor(theValue); my2DExtActor->SetShrinkFactor(theValue);
my3DActor->SetShrinkFactor(theValue); my3DActor->SetShrinkFactor(theValue);
my3DExtActor->SetShrinkFactor(theValue);
Modified(); Modified();
} }
@ -1141,6 +1183,7 @@ void SMESH_ActorDef::SetShrink(){
my2DActor->SetShrink(); my2DActor->SetShrink();
my2DExtActor->SetShrink(); my2DExtActor->SetShrink();
my3DActor->SetShrink(); my3DActor->SetShrink();
my3DExtActor->SetShrink();
myIsShrunk = true; myIsShrunk = true;
Modified(); Modified();
@ -1157,6 +1200,7 @@ void SMESH_ActorDef::UnShrink(){
my2DActor->UnShrink(); my2DActor->UnShrink();
my2DExtActor->UnShrink(); my2DExtActor->UnShrink();
my3DActor->UnShrink(); my3DActor->UnShrink();
my3DExtActor->UnShrink();
myIsShrunk = false; myIsShrunk = false;
Modified(); Modified();
@ -1203,6 +1247,7 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
my2DActor->VisibilityOff(); my2DActor->VisibilityOff();
my2DExtActor->VisibilityOff(); my2DExtActor->VisibilityOff();
my3DActor->VisibilityOff(); my3DActor->VisibilityOff();
my3DExtActor->VisibilityOff();
myScalarBarActor->VisibilityOff(); myScalarBarActor->VisibilityOff();
myPointLabels->VisibilityOff(); myPointLabels->VisibilityOff();
@ -1222,8 +1267,12 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
my1DExtActor->VisibilityOn(); my1DExtActor->VisibilityOn();
break; break;
case eFreeFaces: case eFreeFaces:
case eBareBorderFace:
my2DExtActor->VisibilityOn(); my2DExtActor->VisibilityOn();
break; break;
case eBareBorderVolume:
my3DExtActor->VisibilityOn();
break;
case eLength2D: case eLength2D:
case eMultiConnection2D: case eMultiConnection2D:
my1DExtActor->VisibilityOn(); my1DExtActor->VisibilityOn();
@ -1456,6 +1505,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
//my0DExtActor->SetVisibility(false); //my0DExtActor->SetVisibility(false);
my1DExtActor->SetVisibility(false); my1DExtActor->SetVisibility(false);
my2DExtActor->SetVisibility(false); my2DExtActor->SetVisibility(false);
my3DExtActor->SetVisibility(false);
// ??? // ???
//my0DActor->SetProperty(aProp); //my0DActor->SetProperty(aProp);
@ -1786,6 +1836,7 @@ SMESH_ActorDef::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed)
my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
my2DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); my2DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
my3DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
} }
vtkIdType vtkIdType

View File

@ -123,7 +123,7 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eFreeNodes, enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eFreeNodes,
eFreeFaces, eMultiConnection, eArea, eTaper, eAspectRatio, eFreeFaces, eMultiConnection, eArea, eTaper, eAspectRatio,
eMinimumAngle, eWarping, eSkew, eAspectRatio3D, eMultiConnection2D, eVolume3D, eMinimumAngle, eWarping, eSkew, eAspectRatio3D, eMultiConnection2D, eVolume3D,
eMaxElementLength2D, eMaxElementLength3D}; eMaxElementLength2D, eMaxElementLength3D, eBareBorderFace, eBareBorderVolume};
virtual void SetControlMode(eControl theMode) = 0; virtual void SetControlMode(eControl theMode) = 0;
virtual eControl GetControlMode() = 0; virtual eControl GetControlMode() = 0;
virtual SMESH::Controls::FunctorPtr GetFunctor() = 0; virtual SMESH::Controls::FunctorPtr GetFunctor() = 0;

View File

@ -234,6 +234,7 @@ class SMESH_ActorDef : public SMESH_Actor
SMESH_DeviceActor* my2DActor; SMESH_DeviceActor* my2DActor;
SMESH_DeviceActor* my2DExtActor; SMESH_DeviceActor* my2DExtActor;
SMESH_DeviceActor* my3DActor; SMESH_DeviceActor* my3DActor;
SMESH_DeviceActor* my3DExtActor;
SMESH_DeviceActor* myControlActor; SMESH_DeviceActor* myControlActor;
vtkProperty* myNodeExtProp; vtkProperty* myNodeExtProp;

View File

@ -501,7 +501,10 @@ SMESH_DeviceActor
using namespace SMESH::Controls; using namespace SMESH::Controls;
if ( dynamic_cast<FreeBorders*>(theFunctor.get()) || if ( dynamic_cast<FreeBorders*>(theFunctor.get()) ||
dynamic_cast<FreeFaces*>(theFunctor.get()) ) { dynamic_cast<FreeFaces*>(theFunctor.get()) ||
dynamic_cast<BareBorderVolume*>(theFunctor.get())||
dynamic_cast<BareBorderFace*>(theFunctor.get()))
{
Predicate* aFreePredicate = dynamic_cast<Predicate*>(theFunctor.get()); Predicate* aFreePredicate = dynamic_cast<Predicate*>(theFunctor.get());
myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
@ -514,7 +517,9 @@ SMESH_DeviceActor
if(!myExtractUnstructuredGrid->IsCellsRegistered()) if(!myExtractUnstructuredGrid->IsCellsRegistered())
myExtractUnstructuredGrid->RegisterCell(-1); myExtractUnstructuredGrid->RegisterCell(-1);
SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
}else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get())){ }
else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get()))
{
SMESH::Controls::FreeEdges::TBorders aBorders; SMESH::Controls::FreeEdges::TBorders aBorders;
aFreeEdges->GetBoreders(aBorders); aFreeEdges->GetBoreders(aBorders);
vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
@ -561,7 +566,9 @@ SMESH_DeviceActor
SetUnstructuredGrid(aDataSet); SetUnstructuredGrid(aDataSet);
aDataSet->Delete(); aDataSet->Delete();
}else if(FreeNodes* aFreeNodes = dynamic_cast<FreeNodes*>(theFunctor.get())){ }
else if(FreeNodes* aFreeNodes = dynamic_cast<FreeNodes*>(theFunctor.get()))
{
myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
vtkIdType aNbNodes = myVisualObj->GetNbEntities(SMDSAbs_Node); vtkIdType aNbNodes = myVisualObj->GetNbEntities(SMDSAbs_Node);
for( vtkIdType i = 0; i < aNbNodes; i++ ){ for( vtkIdType i = 0; i < aNbNodes; i++ ){

View File

@ -757,6 +757,10 @@
type = QObject::tr( "FREE_BORDERS" ); type = QObject::tr( "FREE_BORDERS" );
else if ( dynamic_cast< SMESH::Controls::FreeFaces* >( f.get() ) ) else if ( dynamic_cast< SMESH::Controls::FreeFaces* >( f.get() ) )
type = QObject::tr( "FREE_FACES" ); type = QObject::tr( "FREE_FACES" );
else if ( dynamic_cast< SMESH::Controls::BareBorderVolume* >( f.get() ) )
type = QObject::tr( "BARE_BORDER_VOLUME" );
else if ( dynamic_cast< SMESH::Controls::BareBorderFace* >( f.get() ) )
type = QObject::tr( "BARE_BORDER_FACE" );
return type; return type;
} }
@ -1176,6 +1180,12 @@
case 6023: case 6023:
aControl = SMESH_Actor::eMaxElementLength3D; aControl = SMESH_Actor::eMaxElementLength3D;
break; break;
case 6024:
aControl = SMESH_Actor::eBareBorderVolume;
break;
case 6025:
aControl = SMESH_Actor::eBareBorderFace;
break;
} }
anActor->SetControlMode(aControl); anActor->SetControlMode(aControl);
anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() ); anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() );
@ -2951,6 +2961,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
case 6021: case 6021:
case 6022: case 6022:
case 6023: case 6023:
case 6024:
case 6025:
if ( vtkwnd ) { if ( vtkwnd ) {
LightApp_SelectionMgr* mgr = selectionMgr(); LightApp_SelectionMgr* mgr = selectionMgr();
@ -3192,6 +3204,8 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 6021, "FREE_FACES", "ICON_FREE_FACES", 0, true ); createSMESHAction( 6021, "FREE_FACES", "ICON_FREE_FACES", 0, true );
createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true ); createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true );
createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true ); createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true );
createSMESHAction( 6024, "BARE_BORDER_VOLUME","ICON_BARE_BORDER_VOLUME", 0, true );
createSMESHAction( 6025, "BARE_BORDER_FACE","ICON_BARE_BORDER_FACE", 0, true );
createSMESHAction( 6003, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true ); createSMESHAction( 6003, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true );
createSMESHAction( 6004, "CONNECTION", "ICON_CONNECTION", 0, true ); createSMESHAction( 6004, "CONNECTION", "ICON_CONNECTION", 0, true );
createSMESHAction( 6005, "FREE_NODE", "ICON_FREE_NODE", 0, true ); createSMESHAction( 6005, "FREE_NODE", "ICON_FREE_NODE", 0, true );
@ -3363,6 +3377,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 6001, edgeId, -1 ); createMenu( 6001, edgeId, -1 );
createMenu( 6004, edgeId, -1 ); createMenu( 6004, edgeId, -1 );
createMenu( 6021, faceId, -1 ); createMenu( 6021, faceId, -1 );
createMenu( 6025, faceId, -1 );
createMenu( 6018, faceId, -1 ); createMenu( 6018, faceId, -1 );
createMenu( 6019, faceId, -1 ); createMenu( 6019, faceId, -1 );
createMenu( 6011, faceId, -1 ); createMenu( 6011, faceId, -1 );
@ -3375,6 +3390,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 6017, volumeId, -1 ); createMenu( 6017, volumeId, -1 );
createMenu( 6009, volumeId, -1 ); createMenu( 6009, volumeId, -1 );
createMenu( 6023, volumeId, -1 ); createMenu( 6023, volumeId, -1 );
createMenu( 6024, volumeId, -1 );
createMenu( 4000, addId, -1 ); createMenu( 4000, addId, -1 );
createMenu( 4009, addId, -1 ); createMenu( 4009, addId, -1 );
@ -3468,6 +3484,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createTool( 6004, ctrlTb ); createTool( 6004, ctrlTb );
createTool( separator(), ctrlTb ); createTool( separator(), ctrlTb );
createTool( 6021, ctrlTb ); createTool( 6021, ctrlTb );
createTool( 6025, ctrlTb );
createTool( 6018, ctrlTb ); createTool( 6018, ctrlTb );
createTool( 6019, ctrlTb ); createTool( 6019, ctrlTb );
createTool( 6011, ctrlTb ); createTool( 6011, ctrlTb );
@ -3481,6 +3498,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createTool( 6017, ctrlTb ); createTool( 6017, ctrlTb );
createTool( 6009, ctrlTb ); createTool( 6009, ctrlTb );
createTool( 6023, ctrlTb ); createTool( 6023, ctrlTb );
createTool( 6024, ctrlTb );
createTool( separator(), ctrlTb ); createTool( separator(), ctrlTb );
createTool( 4000, addRemTb ); createTool( 4000, addRemTb );
@ -3783,50 +3801,54 @@ void SMESHGUI::initialize( CAM_Application* app )
aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
popupMgr()->insert( action( 6021 ), aSubId, -1 ); // FREE_FACE popupMgr()->insert ( action( 6021 ), aSubId, -1 ); // FREE_FACE
popupMgr()->setRule( action( 6021 ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/, popupMgr()->setRule( action( 6021 ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
QtxPopupMgr::VisibleRule ); QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6021 ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6021 ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6018 ), aSubId, -1 ); // LENGTH_2D popupMgr()->insert ( action( 6018 ), aSubId, -1 ); // LENGTH_2D
popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6019 ), aSubId, -1 ); // CONNECTION_2D popupMgr()->insert ( action( 6019 ), aSubId, -1 ); // CONNECTION_2D
popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6011 ), aSubId, -1 ); // AREA popupMgr()->insert ( action( 6011 ), aSubId, -1 ); // AREA
popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6012 ), aSubId, -1 ); // TAPER popupMgr()->insert ( action( 6012 ), aSubId, -1 ); // TAPER
popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6013 ), aSubId, -1 ); // ASPECT popupMgr()->insert ( action( 6013 ), aSubId, -1 ); // ASPECT
popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6014 ), aSubId, -1 ); // MIN_ANG popupMgr()->insert ( action( 6014 ), aSubId, -1 ); // MIN_ANG
popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6015 ), aSubId, -1 ); // WARP popupMgr()->insert ( action( 6015 ), aSubId, -1 ); // WARP
popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6016 ), aSubId, -1 ); // SKEW popupMgr()->insert ( action( 6016 ), aSubId, -1 ); // SKEW
popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6022 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_2D popupMgr()->insert ( action( 6022 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_2D
popupMgr()->setRule( action( 6022 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6022 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6022 ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6022 ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule );
popupMgr()->insert ( action( 6025 ), aSubId, -1 ); // BARE_BORDER_FACE
popupMgr()->setRule( action( 6025 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6025 ), "controlMode = 'eBareBorderFace'", QtxPopupMgr::ToggleRule );
aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS
popupMgr()->insert( action( 6017 ), aSubId, -1 ); // ASPECT_3D popupMgr()->insert ( action( 6017 ), aSubId, -1 ); // ASPECT_3D
popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule );
@ -3834,10 +3856,14 @@ void SMESHGUI::initialize( CAM_Application* app )
popupMgr()->setRule( action( 6009 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6009 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6009 ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6009 ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( action( 6023 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_3D popupMgr()->insert ( action( 6023 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_3D
popupMgr()->setRule( action( 6023 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6023 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6023 ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule ); popupMgr()->setRule( action( 6023 ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule );
popupMgr()->insert ( action( 6024 ), aSubId, -1 ); // BARE_BORDER_VOLUME
popupMgr()->setRule( action( 6024 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6024 ), "controlMode = 'eBareBorderVolume'", QtxPopupMgr::ToggleRule );
popupMgr()->insert( separator(), anId, -1 ); popupMgr()->insert( separator(), anId, -1 );
popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP

View File

@ -1170,6 +1170,8 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow,
theCriterion.Type != SMESH::FT_FreeNodes && theCriterion.Type != SMESH::FT_FreeNodes &&
theCriterion.Type != SMESH::FT_FreeFaces && theCriterion.Type != SMESH::FT_FreeFaces &&
theCriterion.Type != SMESH::FT_BadOrientedVolume && theCriterion.Type != SMESH::FT_BadOrientedVolume &&
theCriterion.Type != SMESH::FT_BareBorderFace &&
theCriterion.Type != SMESH::FT_BareBorderVolume &&
theCriterion.Type != SMESH::FT_LinearOrQuadratic) theCriterion.Type != SMESH::FT_LinearOrQuadratic)
aTable->item( theRow, 2 )->setText(QString("%1").arg(theCriterion.Threshold, 0, 'g', 15)); aTable->item( theRow, 2 )->setText(QString("%1").arg(theCriterion.Threshold, 0, 'g', 15));
else else
@ -1324,11 +1326,13 @@ void SMESHGUI_FilterTable::updateAdditionalWidget()
ComboItem* anItem = ((ComboItem*)aTable->item(aRow, 0)); ComboItem* anItem = ((ComboItem*)aTable->item(aRow, 0));
int aCriterion = GetCriterionType(aRow); int aCriterion = GetCriterionType(aRow);
bool toEnable = ((ComboItem*)aTable->item(aRow, 1))->value() == SMESH::FT_EqualTo && bool toEnable = (((ComboItem*)aTable->item(aRow, 1))->value() == SMESH::FT_EqualTo &&
aCriterion != SMESH::FT_RangeOfIds && aCriterion != SMESH::FT_RangeOfIds &&
aCriterion != SMESH::FT_FreeEdges && aCriterion != SMESH::FT_FreeEdges &&
aCriterion != SMESH::FT_FreeFaces && aCriterion != SMESH::FT_FreeFaces &&
aCriterion != SMESH::FT_BadOrientedVolume; aCriterion != SMESH::FT_BadOrientedVolume &&
aCriterion != SMESH::FT_BareBorderFace &&
aCriterion != SMESH::FT_BareBorderVolume);
if (!myAddWidgets.contains(anItem)) if (!myAddWidgets.contains(anItem))
{ {
@ -1504,9 +1508,11 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con
if (aType == SMESH::NODE && aCriterionType == SMESH::FT_FreeNodes || if (aType == SMESH::NODE && aCriterionType == SMESH::FT_FreeNodes ||
aType == SMESH::EDGE && aCriterionType == SMESH::FT_FreeBorders || aType == SMESH::EDGE && aCriterionType == SMESH::FT_FreeBorders ||
aType == SMESH::FACE && (aCriterionType == SMESH::FT_FreeEdges || aType == SMESH::FACE && (aCriterionType == SMESH::FT_BareBorderFace ||
aCriterionType == SMESH::FT_FreeEdges ||
aCriterionType == SMESH::FT_FreeFaces) || aCriterionType == SMESH::FT_FreeFaces) ||
aType == SMESH::VOLUME && aCriterionType == SMESH::FT_BadOrientedVolume || aType == SMESH::VOLUME && (aCriterionType == SMESH::FT_BadOrientedVolume ||
aCriterionType == SMESH::FT_BareBorderVolume) ||
aCriterionType == SMESH::FT_LinearOrQuadratic || aCriterionType == SMESH::FT_LinearOrQuadratic ||
aCriterionType == SMESH::FT_GroupColor || aCriterionType == SMESH::FT_GroupColor ||
aCriterionType == SMESH::FT_ElemGeomType) aCriterionType == SMESH::FT_ElemGeomType)
@ -1789,6 +1795,7 @@ const QMap<int, QString>& SMESHGUI_FilterTable::getCriteria (const int theType)
aCriteria[ SMESH::FT_Length2D ] = tr("LENGTH2D"); aCriteria[ SMESH::FT_Length2D ] = tr("LENGTH2D");
aCriteria[ SMESH::FT_MultiConnection2D ] = tr("MULTI2D_BORDERS"); aCriteria[ SMESH::FT_MultiConnection2D ] = tr("MULTI2D_BORDERS");
aCriteria[ SMESH::FT_FreeFaces ] = tr("FREE_FACES"); aCriteria[ SMESH::FT_FreeFaces ] = tr("FREE_FACES");
aCriteria[ SMESH::FT_BareBorderFace ] = tr("BARE_BORDER_FACE");
aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR"); aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR");
aCriteria[ SMESH::FT_GroupColor ] = tr("GROUP_COLOR"); aCriteria[ SMESH::FT_GroupColor ] = tr("GROUP_COLOR");
aCriteria[ SMESH::FT_ElemGeomType ] = tr("GEOM_TYPE"); aCriteria[ SMESH::FT_ElemGeomType ] = tr("GEOM_TYPE");
@ -1805,6 +1812,7 @@ const QMap<int, QString>& SMESHGUI_FilterTable::getCriteria (const int theType)
aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM");
aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM");
aCriteria[ SMESH::FT_BadOrientedVolume ] = tr("BAD_ORIENTED_VOLUME"); aCriteria[ SMESH::FT_BadOrientedVolume ] = tr("BAD_ORIENTED_VOLUME");
aCriteria[ SMESH::FT_BareBorderVolume ] = tr("BARE_BORDER_VOLUME");
aCriteria[ SMESH::FT_Volume3D ] = tr("VOLUME_3D"); aCriteria[ SMESH::FT_Volume3D ] = tr("VOLUME_3D");
aCriteria[ SMESH::FT_MaxElementLength3D ] = tr("MAX_ELEMENT_LENGTH_3D"); aCriteria[ SMESH::FT_MaxElementLength3D ] = tr("MAX_ELEMENT_LENGTH_3D");
aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR"); aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR");

View File

@ -457,6 +457,14 @@
<source>ICON_VOLUME_3D</source> <source>ICON_VOLUME_3D</source>
<translation>mesh_volume_3d.png</translation> <translation>mesh_volume_3d.png</translation>
</message> </message>
<message>
<source>ICON_BARE_BORDER_VOLUME</source>
<translation>bare_border_volume.png</translation>
</message>
<message>
<source>ICON_BARE_BORDER_FACE</source>
<translation>bare_border_face.png</translation>
</message>
<message> <message>
<source>ICON_WARP</source> <source>ICON_WARP</source>
<translation>mesh_wrap.png</translation> <translation>mesh_wrap.png</translation>

View File

@ -391,6 +391,14 @@
<source>TOP_FIND_ELEM</source> <source>TOP_FIND_ELEM</source>
<translation>Find Element by Point</translation> <translation>Find Element by Point</translation>
</message> </message>
<message>
<source>MEN_BARE_BORDER_VOLUME</source>
<translation>Volumes with bare border</translation>
</message>
<message>
<source>MEN_BARE_BORDER_FACE</source>
<translation>Faces with bare border</translation>
</message>
<message> <message>
<source>MEN_FREE_BORDER</source> <source>MEN_FREE_BORDER</source>
<translation>Free Borders</translation> <translation>Free Borders</translation>
@ -2424,6 +2432,14 @@ Consider saving your work before application crash</translation>
<source>STB_FACES</source> <source>STB_FACES</source>
<translation>Faces</translation> <translation>Faces</translation>
</message> </message>
<message>
<source>STB_BARE_BORDER_VOLUME</source>
<translation>Volumes with bare border</translation>
</message>
<message>
<source>STB_BARE_BORDER_FACE</source>
<translation>Faces with bare border</translation>
</message>
<message> <message>
<source>STB_FREE_BORDER</source> <source>STB_FREE_BORDER</source>
<translation>Free Borders</translation> <translation>Free Borders</translation>
@ -2960,6 +2976,14 @@ Consider saving your work before application crash</translation>
<source>TOP_FACES</source> <source>TOP_FACES</source>
<translation>Faces</translation> <translation>Faces</translation>
</message> </message>
<message>
<source>TOP_BARE_BORDER_VOLUME</source>
<translation>Volumes with bare border</translation>
</message>
<message>
<source>TOP_BARE_BORDER_FACE</source>
<translation>Faces with bare border</translation>
</message>
<message> <message>
<source>TOP_FREE_BORDER</source> <source>TOP_FREE_BORDER</source>
<translation>Free Borders</translation> <translation>Free Borders</translation>
@ -4299,6 +4323,14 @@ Please check input data and try again</translation>
<source>BAD_ORIENTED_VOLUME</source> <source>BAD_ORIENTED_VOLUME</source>
<translation>Bad oriented volume</translation> <translation>Bad oriented volume</translation>
</message> </message>
<message>
<source>BARE_BORDER_VOLUME</source>
<translation>Volumes with bare border</translation>
</message>
<message>
<source>BARE_BORDER_FACE</source>
<translation>Faces with bare border</translation>
</message>
<message> <message>
<source>BELONG_TO_CYLINDER</source> <source>BELONG_TO_CYLINDER</source>
<translation>Belong to Cylinder</translation> <translation>Belong to Cylinder</translation>

View File

@ -120,6 +120,7 @@ namespace // INTERNAL STUFF
enum _ListenerDataType enum _ListenerDataType
{ {
WAIT_HYP_MODIF=1, // data indicating awaiting for valid parameters of src hyp WAIT_HYP_MODIF=1, // data indicating awaiting for valid parameters of src hyp
LISTEN_SRC_MESH, // data storing submesh depending on source mesh state
SRC_HYP // data storing ImportSource hyp SRC_HYP // data storing ImportSource hyp
}; };
//================================================================================ //================================================================================
@ -130,10 +131,10 @@ namespace // INTERNAL STUFF
struct _ListenerData : public SMESH_subMeshEventListenerData struct _ListenerData : public SMESH_subMeshEventListenerData
{ {
const StdMeshers_ImportSource1D* _srcHyp; const StdMeshers_ImportSource1D* _srcHyp;
_ListenerData(const StdMeshers_ImportSource1D* h): _ListenerData(const StdMeshers_ImportSource1D* h, _ListenerDataType type=SRC_HYP):
SMESH_subMeshEventListenerData(/*isDeletable=*/true), _srcHyp(h) SMESH_subMeshEventListenerData(/*isDeletable=*/true), _srcHyp(h)
{ {
myType = SRC_HYP; myType = type;
} }
}; };
//================================================================================ //================================================================================
@ -246,10 +247,9 @@ namespace // INTERNAL STUFF
// set a listener to hear events of the source mesh // set a listener to hear events of the source mesh
SMESH_subMesh* smToNotify = importSub; SMESH_subMesh* smToNotify = importSub;
SMESH_subMesh* smToListen = srcMesh->GetSubMeshContaining(1); SMESH_subMesh* smToListen = srcMesh->GetSubMeshContaining(1);
importSub->SetEventListener SMESH_subMeshEventListenerData* data = new _ListenerData(srcHyp, LISTEN_SRC_MESH);
( new SMESH_subMeshEventListener(/*isDeletable=*/true), data->mySubMeshes.push_back( smToNotify );
SMESH_subMeshEventListenerData::MakeData( smToNotify ), importSub->SetEventListener( get(), data, smToListen );
smToListen );
// remeber the submesh // remeber the submesh
_ImportData* iData = _Listener::getImportData( srcMesh, importSub->GetFather()); _ImportData* iData = _Listener::getImportData( srcMesh, importSub->GetFather());
@ -320,6 +320,12 @@ namespace // INTERNAL STUFF
bool copyMesh = !d->_copyMeshSubM.empty(); bool copyMesh = !d->_copyMeshSubM.empty();
if ( copyMesh ) if ( copyMesh )
{ {
// remove imported mesh and groups
d->removeImportedMesh( sm->GetFather()->GetMeshDS() );
if ( data )
d->removeGroups( sm, data->_srcHyp );
// clear submeshes // clear submeshes
if ( !d->_computedSubM.empty() ) if ( !d->_computedSubM.empty() )
{ {
@ -335,11 +341,10 @@ namespace // INTERNAL STUFF
subM->ComputeStateEngine( SMESH_subMesh::CLEAN ); subM->ComputeStateEngine( SMESH_subMesh::CLEAN );
} }
} }
// remove imported mesh and groups }
d->removeImportedMesh( sm->GetFather()->GetMeshDS() ); else
{
if ( data ) sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
d->removeGroups( sm, data->_srcHyp );
} }
} }
if ( data ) if ( data )
@ -360,6 +365,7 @@ namespace // INTERNAL STUFF
{ {
if ( data && data->myType == WAIT_HYP_MODIF ) if ( data && data->myType == WAIT_HYP_MODIF )
{ {
// event of Import submesh
if ( SMESH_subMesh::MODIF_HYP == event && if ( SMESH_subMesh::MODIF_HYP == event &&
SMESH_subMesh::ALGO_EVENT == eventType ) SMESH_subMesh::ALGO_EVENT == eventType )
{ {
@ -368,13 +374,39 @@ namespace // INTERNAL STUFF
algo->SetEventListener( subMesh ); algo->SetEventListener( subMesh );
} }
} }
else else if ( data && data->myType == LISTEN_SRC_MESH )
{ {
SMESH_Gen* gen = subMesh->GetFather()->GetGen(); // event of source mesh
SMESH_Algo* algo = gen->GetAlgo(*subMesh->GetFather(),subMesh->GetSubShape() ); if ( SMESH_subMesh::COMPUTE_EVENT == eventType )
{
switch ( event ) {
case SMESH_subMesh::CLEAN:
clearSubmesh( data->mySubMeshes.front(), (_ListenerData*) data );
break;
case SMESH_subMesh::COMPUTE:
if ( subMesh->GetComputeState() == SMESH_subMesh::COMPUTE_OK )
data->mySubMeshes.front()->ComputeStateEngine( SMESH_subMesh::SUBMESH_COMPUTED );
break;
default:;
}
}
}
else // event of Import submesh
{
bool removeImport = false;
if ( subMesh->GetAlgoState() != SMESH_subMesh::HYP_OK )
{
removeImport = true;
}
else if ( SMESH_subMesh::REMOVE_ALGO == event ||
SMESH_subMesh::REMOVE_FATHER_ALGO == event )
{
SMESH_Gen* gen = subMesh->GetFather()->GetGen();
SMESH_Algo* algo = gen->GetAlgo(*subMesh->GetFather(),subMesh->GetSubShape() );
removeImport = ( strncmp( "Import", algo->GetName(), 6 ) != 0 );
}
if ( subMesh->GetAlgoState() != SMESH_subMesh::HYP_OK || if ( removeImport )
strncmp( "Import", algo->GetName(), 6 ) != 0 )
{ {
// treate removal of Import algo from subMesh // treate removal of Import algo from subMesh
removeSubmesh( subMesh, (_ListenerData*) data ); removeSubmesh( subMesh, (_ListenerData*) data );
@ -543,8 +575,8 @@ bool StdMeshers_Import_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & th
subShapeIDs.insert( shapeID ); subShapeIDs.insert( shapeID );
// get nodes on vertices // get nodes on vertices
list < SMESH_MeshEditor::TNodeXYZ > vertexNodes; list < SMESH_MeshEditor::TNodeXYZ > vertexNodes;
list < SMESH_MeshEditor::TNodeXYZ >::iterator vNIt; list < SMESH_MeshEditor::TNodeXYZ >::iterator vNIt;
TopExp_Explorer vExp( theShape, TopAbs_VERTEX ); TopExp_Explorer vExp( theShape, TopAbs_VERTEX );
for ( ; vExp.More(); vExp.Next() ) for ( ; vExp.More(); vExp.Next() )
{ {
@ -797,6 +829,17 @@ void StdMeshers_Import_1D::importMesh(const SMESH_Mesh* srcMesh,
n2n->clear(); n2n->clear();
e2e->clear(); e2e->clear();
{
cout << "IMPORT SubMesh " << endl << " Elems:";
SMDS_ElemIteratorPtr eIt = tgtSubMesh->GetElements();
while ( eIt->more() )
cout << " " << eIt->next()->GetID();
cout << endl << " Nodes:";
SMDS_NodeIteratorPtr nIt = tgtSubMesh->GetNodes();
while ( nIt->more() )
cout << " " << nIt->next()->GetID();
cout << endl;
}
// Remember created groups in order to remove them as soon as the srcHyp is // Remember created groups in order to remove them as soon as the srcHyp is
// modified or something other similar happens. Store them in a hypothesis // modified or something other similar happens. Store them in a hypothesis
// as it stores its values anyway // as it stores its values anyway

View File

@ -153,8 +153,8 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
const bool toCheckOri = (helper.NbAncestors( geomFace, theMesh, TopAbs_SOLID ) == 1 ); const bool toCheckOri = (helper.NbAncestors( geomFace, theMesh, TopAbs_SOLID ) == 1 );
Handle(Geom_Surface) surface = BRep_Tool::Surface( geomFace ); Handle(Geom_Surface) surface = BRep_Tool::Surface( geomFace );
if ( helper.GetSubShapeOri( tgtMesh->ShapeToMesh(), geomFace) == TopAbs_REVERSED ) const bool reverse =
surface->UReverse(); ( helper.GetSubShapeOri( tgtMesh->ShapeToMesh(), geomFace) == TopAbs_REVERSED );
gp_Pnt p; gp_Vec du, dv; gp_Pnt p; gp_Vec du, dv;
set<int> subShapeIDs; set<int> subShapeIDs;
@ -262,7 +262,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
{ {
uv = helper.GetNodeUV( geomFace, newNodes[++iNode] ); uv = helper.GetNodeUV( geomFace, newNodes[++iNode] );
surface->D1( uv.X(),uv.Y(), p, du,dv ); surface->D1( uv.X(),uv.Y(), p, du,dv );
geomNorm = du ^ dv; geomNorm = reverse ? dv^du : du^dv;
} }
while ( geomNorm.SquareMagnitude() < 1e-6 && iNode+1 < face->NbCornerNodes()); while ( geomNorm.SquareMagnitude() < 1e-6 && iNode+1 < face->NbCornerNodes());
@ -458,6 +458,25 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape &
for ( unsigned iE = 0; iE < edges.size(); ++iE ) for ( unsigned iE = 0; iE < edges.size(); ++iE )
theMesh.GetSubMesh( edges[iE] )->ComputeStateEngine(SMESH_subMesh::CHECK_COMPUTE_STATE); theMesh.GetSubMesh( edges[iE] )->ComputeStateEngine(SMESH_subMesh::CHECK_COMPUTE_STATE);
SMESH_subMesh* sm = theMesh.GetSubMesh(theShape);
SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(true,false);
cout << endl << string(80,'=') << endl
<< "Compute( face " << tgtMesh->ShapeToIndex(theShape) << endl;
while ( smIt->more() )
{
sm = smIt->next();
TopAbs::Print(sm->GetSubShape().ShapeType(), cout);
cout << " " << sm->GetId() << endl << " Elems:";
SMDS_ElemIteratorPtr eIt = sm->GetSubMeshDS()->GetElements();
while ( eIt->more() )
cout << " " << eIt->next()->GetID();
cout << endl << " Nodes:";
SMDS_NodeIteratorPtr nIt = sm->GetSubMeshDS()->GetNodes();
while ( nIt->more() )
cout << " " << nIt->next()->GetID();
cout << endl;
}
// ============ // ============
// Copy meshes // Copy meshes
// ============ // ============