SALOME PAL V1_4_1
110
idl/SMESH_Filter.idl
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Filter.idl
|
||||||
|
// Author : Alexey Petrov, OCC
|
||||||
|
|
||||||
|
#ifndef _SMESH_FILTER_IDL_
|
||||||
|
#define _SMESH_FILTER_IDL_
|
||||||
|
|
||||||
|
#include "SALOME_Exception.idl"
|
||||||
|
#include "SALOME_GenericObj.idl"
|
||||||
|
#include "SMESH_Mesh.idl"
|
||||||
|
|
||||||
|
module SMESH{
|
||||||
|
|
||||||
|
interface Functor: SALOME::GenericObj{
|
||||||
|
void SetMesh(in SMESH_Mesh theMesh);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface NumericalFunctor: Functor{
|
||||||
|
double GetValue(in long theElementId);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface MinimumAngle: NumericalFunctor{};
|
||||||
|
interface AspectRatio: NumericalFunctor{};
|
||||||
|
interface Warping: NumericalFunctor{};
|
||||||
|
interface Taper: NumericalFunctor{};
|
||||||
|
interface Skew: NumericalFunctor{};
|
||||||
|
interface Area: NumericalFunctor{};
|
||||||
|
interface Length: NumericalFunctor{};
|
||||||
|
interface MultiConnection: NumericalFunctor{};
|
||||||
|
|
||||||
|
interface Predicate: Functor{
|
||||||
|
boolean IsSatisfy(in long thEntityId);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface FreeBorders: Predicate{};
|
||||||
|
|
||||||
|
interface Comparator: Predicate{
|
||||||
|
void SetMargin(in double theValue);
|
||||||
|
void SetNumFunctor(in NumericalFunctor theFunct);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface LessThan: Comparator{};
|
||||||
|
interface MoreThan: Comparator{};
|
||||||
|
interface EqualTo: Comparator{
|
||||||
|
void SetTolerance(in double theTolerance );
|
||||||
|
};
|
||||||
|
|
||||||
|
interface Logical: Predicate{};
|
||||||
|
|
||||||
|
interface LogicalNOT: Logical{
|
||||||
|
void SetPredicate(in Predicate thePredicate);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface LogicalBinary: Logical{
|
||||||
|
void SetPredicate1(in Predicate thePredicate);
|
||||||
|
void SetPredicate2(in Predicate thePredicate);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface LogicalAND: LogicalBinary{};
|
||||||
|
interface LogicalOR: LogicalBinary{};
|
||||||
|
interface Filter: SALOME::GenericObj{
|
||||||
|
void SetPredicate( in Predicate thePredicate );
|
||||||
|
long_array GetElementsId( in SMESH_Mesh theMesh );
|
||||||
|
};
|
||||||
|
|
||||||
|
interface FilterManager: SALOME::GenericObj{
|
||||||
|
MinimumAngle CreateMinimumAngle();
|
||||||
|
AspectRatio CreateAspectRatio();
|
||||||
|
Warping CreateWarping();
|
||||||
|
Taper CreateTaper();
|
||||||
|
Skew CreateSkew();
|
||||||
|
Area CreateArea();
|
||||||
|
Length CreateLength();
|
||||||
|
MultiConnection CreateMultiConnection();
|
||||||
|
|
||||||
|
FreeBorders CreateFreeBorders();
|
||||||
|
|
||||||
|
LessThan CreateLessThan();
|
||||||
|
MoreThan CreateMoreThan();
|
||||||
|
EqualTo CreateEqualTo();
|
||||||
|
|
||||||
|
LogicalNOT CreateLogicalNOT();
|
||||||
|
LogicalAND CreateLogicalAND();
|
||||||
|
LogicalOR CreateLogicalOR();
|
||||||
|
Filter CreateFilter();
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
103
idl/SMESH_Group.idl
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Group.idl
|
||||||
|
// Author : Sergey ANIKIN, OCC
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_GROUP_IDL_
|
||||||
|
#define _SMESH_GROUP_IDL_
|
||||||
|
|
||||||
|
#include "SALOME_Exception.idl"
|
||||||
|
#include "SALOME_GenericObj.idl"
|
||||||
|
|
||||||
|
#include "SMESH_Mesh.idl"
|
||||||
|
|
||||||
|
module SMESH
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
* SMESH_Group: interface of group object
|
||||||
|
*/
|
||||||
|
interface SMESH_Group : SALOME::GenericObj
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
* Sets group name
|
||||||
|
*/
|
||||||
|
void SetName( in string name );
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns group name
|
||||||
|
*/
|
||||||
|
string GetName();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns group type (type of elements in the group)
|
||||||
|
*/
|
||||||
|
ElementType GetType();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns the number of elements in the group
|
||||||
|
*/
|
||||||
|
long Size();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns true if the group does not contain any elements
|
||||||
|
*/
|
||||||
|
boolean IsEmpty();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Clears the group's contents
|
||||||
|
*/
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* returns true if the group contains an element with ID == <elem_id>
|
||||||
|
*/
|
||||||
|
boolean Contains( in long elem_id );
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Adds elements to the group
|
||||||
|
*/
|
||||||
|
long Add( in long_array elem_ids );
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns ID of an element at position <elem_index>
|
||||||
|
*/
|
||||||
|
long GetID( in long elem_index );
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns a sequence of all element IDs in the group
|
||||||
|
*/
|
||||||
|
long_array GetListOfID();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Removes elements from the group
|
||||||
|
*/
|
||||||
|
long Remove( in long_array elem_ids );
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns the mesh object this group belongs to
|
||||||
|
*/
|
||||||
|
SMESH_Mesh GetMesh();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
45
idl/SMESH_NetgenAlgorithm.idl
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_NetgenAlgorithm.idl
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_NETGENALGORITHM_IDL_
|
||||||
|
#define _SMESH_NETGENALGORITHM_IDL_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.idl"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* NETGENPlugin: interfaces to NETGEN related hypotheses and algorithms
|
||||||
|
*/
|
||||||
|
module NETGENPlugin
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
* NETGENPlugin_NETGEN_3D: interface of "Tetrahedron (Netgen)" algorithm
|
||||||
|
*/
|
||||||
|
interface NETGENPlugin_NETGEN_3D : SMESH::SMESH_3D_Algo
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
2
resources/SMESH.config
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
language=en
|
||||||
|
resources=StdMeshers:NETGENPlugin
|
78
resources/SMESH_Meshers.xml
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?xml version='1.0' encoding='us-ascii'?>
|
||||||
|
<!DOCTYPE meshers PUBLIC "" "desktop.dtd">
|
||||||
|
|
||||||
|
<!-- GUI customization for MESH component -->
|
||||||
|
|
||||||
|
<meshers>
|
||||||
|
|
||||||
|
<meshers-group name="Standard Meshers"
|
||||||
|
resources="StdMeshers"
|
||||||
|
server-lib="libStdMeshersEngine.so"
|
||||||
|
gui-lib="libStdMeshersGUI.so">
|
||||||
|
<hypotheses>
|
||||||
|
|
||||||
|
<hypothesis type="LocalLength"
|
||||||
|
label-id="Average length"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="LengthFromEdges"
|
||||||
|
label-id="Length From Edges (2D Hyp. for Triangulator)"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="NumberOfSegments"
|
||||||
|
label-id="Nb. Segments"
|
||||||
|
icon-id="mesh_hypo_segment.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="MaxElementArea"
|
||||||
|
label-id="Max. Triangle Area"
|
||||||
|
icon-id="mesh_hypo_area.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="MaxElementVolume"
|
||||||
|
label-id="Max. Hexahedron or Tetrahedron Volume"
|
||||||
|
icon-id="mesh_hypo_volume.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="NotConformAllowed"
|
||||||
|
label-id="Not Conform Mesh Allowed"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
</hypotheses>
|
||||||
|
|
||||||
|
<algorithms>
|
||||||
|
|
||||||
|
<algorithm type="Regular_1D"
|
||||||
|
label-id="Wire discretisation"
|
||||||
|
icon-id="mesh_algo_regular.png"/>
|
||||||
|
|
||||||
|
<algorithm type="MEFISTO_2D"
|
||||||
|
label-id="Triangle (Mefisto)"
|
||||||
|
icon-id="mesh_algo_mefisto.png"/>
|
||||||
|
|
||||||
|
<algorithm type="Quadrangle_2D"
|
||||||
|
label-id="Quadrangle (Mapping)"
|
||||||
|
icon-id="mesh_algo_quad.png"/>
|
||||||
|
|
||||||
|
<algorithm type="Hexa_3D"
|
||||||
|
label-id="Hexahedron (i,j,k)"
|
||||||
|
icon-id="mesh_algo_hexa.png"/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
<meshers-group name="Your Meshers Group"
|
||||||
|
resources=""
|
||||||
|
server-lib=""
|
||||||
|
gui-lib="">
|
||||||
|
<hypotheses>
|
||||||
|
|
||||||
|
<hypothesis type=""
|
||||||
|
label-id=""
|
||||||
|
icon-id=""/>
|
||||||
|
</hypotheses>
|
||||||
|
|
||||||
|
<algorithms>
|
||||||
|
|
||||||
|
<algorithm type=""
|
||||||
|
label-id=""
|
||||||
|
icon-id=""/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
</meshers>
|
89
resources/SMESH_MeshersWithNETGEN.xml
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version='1.0' encoding='us-ascii'?>
|
||||||
|
<!DOCTYPE meshers PUBLIC "" "desktop.dtd">
|
||||||
|
|
||||||
|
<!-- GUI customization for MESH component -->
|
||||||
|
|
||||||
|
<meshers>
|
||||||
|
|
||||||
|
<meshers-group name="Standard Meshers"
|
||||||
|
resources="StdMeshers"
|
||||||
|
server-lib="libStdMeshersEngine.so"
|
||||||
|
gui-lib="libStdMeshersGUI.so">
|
||||||
|
<hypotheses>
|
||||||
|
|
||||||
|
<hypothesis type="LocalLength"
|
||||||
|
label-id="Average length"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="LengthFromEdges"
|
||||||
|
label-id="Length From Edges (2D Hyp. for Triangulator)"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="NumberOfSegments"
|
||||||
|
label-id="Nb. Segments"
|
||||||
|
icon-id="mesh_hypo_segment.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="MaxElementArea"
|
||||||
|
label-id="Max. Triangle Area"
|
||||||
|
icon-id="mesh_hypo_area.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="MaxElementVolume"
|
||||||
|
label-id="Max. Hexahedron or Tetrahedron Volume"
|
||||||
|
icon-id="mesh_hypo_volume.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="NotConformAllowed"
|
||||||
|
label-id="Not Conform Mesh Allowed"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
</hypotheses>
|
||||||
|
|
||||||
|
<algorithms>
|
||||||
|
|
||||||
|
<algorithm type="Regular_1D"
|
||||||
|
label-id="Wire discretisation"
|
||||||
|
icon-id="mesh_algo_regular.png"/>
|
||||||
|
|
||||||
|
<algorithm type="MEFISTO_2D"
|
||||||
|
label-id="Triangle (Mefisto)"
|
||||||
|
icon-id="mesh_algo_mefisto.png"/>
|
||||||
|
|
||||||
|
<algorithm type="Quadrangle_2D"
|
||||||
|
label-id="Quadrangle (Mapping)"
|
||||||
|
icon-id="mesh_algo_quad.png"/>
|
||||||
|
|
||||||
|
<algorithm type="Hexa_3D"
|
||||||
|
label-id="Hexahedron (i,j,k)"
|
||||||
|
icon-id="mesh_algo_hexa.png"/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
<meshers-group name="NETGEN"
|
||||||
|
resources="NETGENPlugin"
|
||||||
|
server-lib="libNETGENEngine.so"
|
||||||
|
gui-lib="">
|
||||||
|
<algorithms>
|
||||||
|
<algorithm type="NETGEN_3D"
|
||||||
|
label-id="Tetrahedron (Netgen)"
|
||||||
|
icon-id="mesh_algo_tetra.png"/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
<meshers-group name="Your Meshers Group"
|
||||||
|
resources=""
|
||||||
|
server-lib=""
|
||||||
|
gui-lib="">
|
||||||
|
<hypotheses>
|
||||||
|
|
||||||
|
<hypothesis type=""
|
||||||
|
label-id=""
|
||||||
|
icon-id=""/>
|
||||||
|
</hypotheses>
|
||||||
|
|
||||||
|
<algorithms>
|
||||||
|
|
||||||
|
<algorithm type=""
|
||||||
|
label-id=""
|
||||||
|
icon-id=""/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
</meshers>
|
78
resources/StdMeshers.xml
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?xml version='1.0' encoding='us-ascii'?>
|
||||||
|
<!DOCTYPE meshers PUBLIC "" "desktop.dtd">
|
||||||
|
|
||||||
|
<!-- GUI customization for MESH component -->
|
||||||
|
|
||||||
|
<meshers>
|
||||||
|
|
||||||
|
<meshers-group name="Standard Meshers"
|
||||||
|
resources="StdMeshers"
|
||||||
|
server-lib="libStdMeshersEngine.so"
|
||||||
|
gui-lib="libStdMeshersGUI.so">
|
||||||
|
<hypotheses>
|
||||||
|
|
||||||
|
<hypothesis type="LocalLength"
|
||||||
|
label-id="Average length"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="LengthFromEdges"
|
||||||
|
label-id="Length From Edges (2D Hyp. for Triangulator)"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="NumberOfSegments"
|
||||||
|
label-id="Nb. Segments"
|
||||||
|
icon-id="mesh_hypo_segment.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="MaxElementArea"
|
||||||
|
label-id="Max. Triangle Area"
|
||||||
|
icon-id="mesh_hypo_area.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="MaxElementVolume"
|
||||||
|
label-id="Max. Hexahedron or Tetrahedron Volume"
|
||||||
|
icon-id="mesh_hypo_volume.png"/>
|
||||||
|
|
||||||
|
<hypothesis type="NotConformAllowed"
|
||||||
|
label-id="Not Conform Mesh Allowed"
|
||||||
|
icon-id="mesh_hypo_length.png"/>
|
||||||
|
</hypotheses>
|
||||||
|
|
||||||
|
<algorithms>
|
||||||
|
|
||||||
|
<algorithm type="Regular_1D"
|
||||||
|
label-id="Wire discretisation"
|
||||||
|
icon-id="mesh_algo_regular.png"/>
|
||||||
|
|
||||||
|
<algorithm type="MEFISTO_2D"
|
||||||
|
label-id="Triangle (Mefisto)"
|
||||||
|
icon-id="mesh_algo_mefisto.png"/>
|
||||||
|
|
||||||
|
<algorithm type="Quadrangle_2D"
|
||||||
|
label-id="Quadrangle (Mapping)"
|
||||||
|
icon-id="mesh_algo_quad.png"/>
|
||||||
|
|
||||||
|
<algorithm type="Hexa_3D"
|
||||||
|
label-id="Hexahedron (i,j,k)"
|
||||||
|
icon-id="mesh_algo_hexa.png"/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
<meshers-group name="Your Meshers Group"
|
||||||
|
resources=""
|
||||||
|
server-lib=""
|
||||||
|
gui-lib="">
|
||||||
|
<hypotheses>
|
||||||
|
|
||||||
|
<hypothesis type=""
|
||||||
|
label-id=""
|
||||||
|
icon-id=""/>
|
||||||
|
</hypotheses>
|
||||||
|
|
||||||
|
<algorithms>
|
||||||
|
|
||||||
|
<algorithm type=""
|
||||||
|
label-id=""
|
||||||
|
icon-id=""/>
|
||||||
|
</algorithms>
|
||||||
|
</meshers-group>
|
||||||
|
|
||||||
|
</meshers>
|
BIN
resources/mesh_edit_group.png
Normal file
After Width: | Height: | Size: 543 B |
BIN
resources/mesh_free_edges.png
Executable file
After Width: | Height: | Size: 489 B |
BIN
resources/mesh_make_group.png
Normal file
After Width: | Height: | Size: 432 B |
BIN
resources/mesh_multi_edges.png
Executable file
After Width: | Height: | Size: 480 B |
BIN
resources/mesh_points.png
Normal file
After Width: | Height: | Size: 499 B |
BIN
resources/mesh_tree_group.png
Normal file
After Width: | Height: | Size: 411 B |
BIN
resources/mesh_tree_importedmesh.png
Normal file
After Width: | Height: | Size: 912 B |
50
src/Controls/Makefile.in
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# SMESH OBJECT : interactive object for SMESH visualization
|
||||||
|
#
|
||||||
|
# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# File : Makefile.in
|
||||||
|
# Module : SMESH
|
||||||
|
|
||||||
|
top_srcdir=@top_srcdir@
|
||||||
|
top_builddir=../..
|
||||||
|
srcdir=@srcdir@
|
||||||
|
VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl
|
||||||
|
|
||||||
|
@COMMENCE@
|
||||||
|
|
||||||
|
EXPORT_HEADERS = SMESH_Controls.hxx
|
||||||
|
|
||||||
|
|
||||||
|
# Libraries targets
|
||||||
|
|
||||||
|
LIB = libSMESHControls.la
|
||||||
|
LIB_SRC = SMESH_Controls.cxx
|
||||||
|
|
||||||
|
# Executables targets
|
||||||
|
BIN = SMESHControls
|
||||||
|
BIN_SRC =
|
||||||
|
|
||||||
|
CPPFLAGS+=$(OCC_INCLUDES) $(BOOST_CPPFLAGS)
|
||||||
|
|
||||||
|
LDFLAGS+=$(OCC_KERNEL_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -lOpUtil -lSMDS
|
||||||
|
|
||||||
|
@CONCLUDE@
|
42
src/Controls/SMESHControls.cxx
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "SMESH_Controls.hxx"
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
using namespace SMESH::Controls;
|
||||||
|
new MinimumAngle();
|
||||||
|
new AspectRatio();
|
||||||
|
new Warping();
|
||||||
|
new Taper();
|
||||||
|
new Skew();
|
||||||
|
new Area();
|
||||||
|
new Length();
|
||||||
|
new MultiConnection();
|
||||||
|
new FreeBorders();
|
||||||
|
new LessThan();
|
||||||
|
new MoreThan();
|
||||||
|
new EqualTo();
|
||||||
|
new LogicalNOT();
|
||||||
|
new LogicalAND();
|
||||||
|
new LogicalOR();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
774
src/Controls/SMESH_Controls.cxx
Normal file
@ -0,0 +1,774 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <gp_Pnt.hxx>
|
||||||
|
#include <gp_Vec.hxx>
|
||||||
|
#include <gp_XYZ.hxx>
|
||||||
|
#include <Precision.hxx>
|
||||||
|
#include <TColgp_SequenceOfXYZ.hxx>
|
||||||
|
#include <TColStd_MapOfInteger.hxx>
|
||||||
|
|
||||||
|
#include "SMDS_Mesh.hxx"
|
||||||
|
#include "SMDS_Iterator.hxx"
|
||||||
|
#include "SMDS_MeshElement.hxx"
|
||||||
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
|
||||||
|
#include "SMESH_Controls.hxx"
|
||||||
|
|
||||||
|
/*
|
||||||
|
AUXILIARY METHODS
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline double getAngle( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 )
|
||||||
|
{
|
||||||
|
return gp_Vec( P1 - P2 ).Angle( gp_Vec( P3 - P2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double getArea( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 )
|
||||||
|
{
|
||||||
|
gp_Vec aVec1( P2 - P1 );
|
||||||
|
gp_Vec aVec2( P3 - P1 );
|
||||||
|
return ( aVec1 ^ aVec2 ).Magnitude() * 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double getArea( const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3 )
|
||||||
|
{
|
||||||
|
return getArea( P1.XYZ(), P2.XYZ(), P3.XYZ() );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double getDistance( const gp_XYZ& P1, const gp_XYZ& P2 )
|
||||||
|
{
|
||||||
|
double aDist = gp_Pnt( P1 ).Distance( gp_Pnt( P2 ) );
|
||||||
|
return aDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getNbMultiConnection( SMDS_Mesh* theMesh, const int theId )
|
||||||
|
{
|
||||||
|
if ( theMesh == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
const SMDS_MeshElement* anEdge = theMesh->FindElement( theId );
|
||||||
|
if ( anEdge == 0 || anEdge->GetType() != SMDSAbs_Edge || anEdge->NbNodes() != 2 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
TColStd_MapOfInteger aMap;
|
||||||
|
|
||||||
|
int aResult = 0;
|
||||||
|
SMDS_ElemIteratorPtr anIter = anEdge->nodesIterator();
|
||||||
|
if ( anIter != 0 )
|
||||||
|
{
|
||||||
|
while( anIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next();
|
||||||
|
if ( aNode == 0 )
|
||||||
|
return 0;
|
||||||
|
SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator();
|
||||||
|
while( anElemIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* anElem = anElemIter->next();
|
||||||
|
if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge )
|
||||||
|
{
|
||||||
|
int anId = anElem->GetID();
|
||||||
|
|
||||||
|
if ( anIter->more() ) // i.e. first node
|
||||||
|
aMap.Add( anId );
|
||||||
|
else if ( aMap.Contains( anId ) )
|
||||||
|
aResult++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
using namespace SMESH::Controls;
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTORS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : NumericalFunctor
|
||||||
|
Description : Base class for numerical functors
|
||||||
|
*/
|
||||||
|
NumericalFunctor::NumericalFunctor():
|
||||||
|
myMesh(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void NumericalFunctor::SetMesh( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
myMesh = theMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NumericalFunctor::getPoints( const int theId,
|
||||||
|
TColgp_SequenceOfXYZ& theRes ) const
|
||||||
|
{
|
||||||
|
theRes.Clear();
|
||||||
|
|
||||||
|
if ( myMesh == 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Get nodes of the face
|
||||||
|
const SMDS_MeshElement* anElem = myMesh->FindElement( theId );
|
||||||
|
if ( anElem == 0 || anElem->GetType() != GetType() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int nbNodes = anElem->NbNodes();
|
||||||
|
|
||||||
|
SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
|
||||||
|
if ( anIter != 0 )
|
||||||
|
{
|
||||||
|
while( anIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next();
|
||||||
|
if ( aNode != 0 )
|
||||||
|
theRes.Append( gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MinimumAngle
|
||||||
|
Description : Functor for calculation of minimum angle
|
||||||
|
*/
|
||||||
|
double MinimumAngle::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
double aMin;
|
||||||
|
|
||||||
|
if ( P.Length() == 3 )
|
||||||
|
{
|
||||||
|
double A0 = getAngle( P( 3 ), P( 1 ), P( 2 ) );
|
||||||
|
double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
double A2 = getAngle( P( 2 ), P( 3 ), P( 1 ) );
|
||||||
|
|
||||||
|
aMin = Min( A0, Min( A1, A2 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double A0 = getAngle( P( 4 ), P( 1 ), P( 2 ) );
|
||||||
|
double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
double A2 = getAngle( P( 2 ), P( 3 ), P( 4 ) );
|
||||||
|
double A3 = getAngle( P( 3 ), P( 4 ), P( 1 ) );
|
||||||
|
|
||||||
|
aMin = Min( Min( A0, A1 ), Min( A2, A3 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return aMin * 180 / PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType MinimumAngle::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : AspectRatio
|
||||||
|
Description : Functor for calculating aspect ratio
|
||||||
|
*/
|
||||||
|
double AspectRatio::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int nbNodes = P.Length();
|
||||||
|
|
||||||
|
// Compute lengths of the sides
|
||||||
|
|
||||||
|
double aLen[ nbNodes ];
|
||||||
|
for ( int i = 0; i < nbNodes - 1; i++ )
|
||||||
|
aLen[ i ] = getDistance( P( i + 1 ), P( i + 2 ) );
|
||||||
|
aLen[ nbNodes - 1 ] = getDistance( P( 1 ), P( nbNodes ) );
|
||||||
|
|
||||||
|
// Compute aspect ratio
|
||||||
|
|
||||||
|
if ( nbNodes == 3 )
|
||||||
|
{
|
||||||
|
double aMaxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
|
||||||
|
double anArea = getArea( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
static double aCoef = sqrt( 3. ) / 4;
|
||||||
|
|
||||||
|
return anArea != 0 ? aCoef * aMaxLen * aMaxLen / anArea : 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double aMaxLen = Max( Max( aLen[ 0 ], aLen[ 1 ] ), Max( aLen[ 2 ], aLen[ 3 ] ) );
|
||||||
|
double aMinLen = Min( Min( aLen[ 0 ], aLen[ 1 ] ), Min( aLen[ 2 ], aLen[ 3 ] ) );
|
||||||
|
|
||||||
|
return aMinLen != 0 ? aMaxLen / aMinLen : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType AspectRatio::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Warping
|
||||||
|
Description : Functor for calculating warping
|
||||||
|
*/
|
||||||
|
double Warping::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gp_XYZ G = ( P( 1 ) + P( 2 ) + P( 3 ) + P( 4 ) ) / 4;
|
||||||
|
|
||||||
|
double A1 = ComputeA( P( 1 ), P( 2 ), P( 3 ), G );
|
||||||
|
double A2 = ComputeA( P( 2 ), P( 3 ), P( 4 ), G );
|
||||||
|
double A3 = ComputeA( P( 3 ), P( 4 ), P( 1 ), G );
|
||||||
|
double A4 = ComputeA( P( 4 ), P( 1 ), P( 2 ), G );
|
||||||
|
|
||||||
|
return Max( Max( A1, A2 ), Max( A3, A4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
double Warping::ComputeA( const gp_XYZ& thePnt1,
|
||||||
|
const gp_XYZ& thePnt2,
|
||||||
|
const gp_XYZ& thePnt3,
|
||||||
|
const gp_XYZ& theG ) const
|
||||||
|
{
|
||||||
|
double aLen1 = gp_Pnt( thePnt1 ).Distance( gp_Pnt( thePnt2 ) );
|
||||||
|
double aLen2 = gp_Pnt( thePnt2 ).Distance( gp_Pnt( thePnt3 ) );
|
||||||
|
double L = Min( aLen1, aLen2 ) * 0.5;
|
||||||
|
|
||||||
|
gp_XYZ GI = ( thePnt2 - thePnt1 ) / 2. - theG;
|
||||||
|
gp_XYZ GJ = ( thePnt3 - thePnt2 ) / 2. - theG;
|
||||||
|
gp_XYZ N = GI.Crossed( GJ );
|
||||||
|
N.Normalize();
|
||||||
|
|
||||||
|
double H = gp_Vec( thePnt2 - theG ).Dot( gp_Vec( N ) );
|
||||||
|
return asin( fabs( H / L ) ) * 180 / PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType Warping::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Taper
|
||||||
|
Description : Functor for calculating taper
|
||||||
|
*/
|
||||||
|
double Taper::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Compute taper
|
||||||
|
double J1 = getArea( P( 4 ), P( 1 ), P( 2 ) ) / 2;
|
||||||
|
double J2 = getArea( P( 3 ), P( 1 ), P( 2 ) ) / 2;
|
||||||
|
double J3 = getArea( P( 2 ), P( 3 ), P( 4 ) ) / 2;
|
||||||
|
double J4 = getArea( P( 3 ), P( 4 ), P( 1 ) ) / 2;
|
||||||
|
|
||||||
|
double JA = 0.25 * ( J1 + J2 + J3 + J4 );
|
||||||
|
|
||||||
|
double T1 = fabs( ( J1 - JA ) / JA );
|
||||||
|
double T2 = fabs( ( J2 - JA ) / JA );
|
||||||
|
double T3 = fabs( ( J3 - JA ) / JA );
|
||||||
|
double T4 = fabs( ( J4 - JA ) / JA );
|
||||||
|
|
||||||
|
return Max( Max( T1, T2 ), Max( T3, T4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType Taper::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Skew
|
||||||
|
Description : Functor for calculating skew in degrees
|
||||||
|
*/
|
||||||
|
static inline double skewAngle( const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3 )
|
||||||
|
{
|
||||||
|
gp_XYZ p12 = ( p2 + p1 ) / 2;
|
||||||
|
gp_XYZ p23 = ( p3 + p2 ) / 2;
|
||||||
|
gp_XYZ p31 = ( p3 + p1 ) / 2;
|
||||||
|
|
||||||
|
return gp_Vec( p31 - p2 ).Angle( p12 - p23 );
|
||||||
|
}
|
||||||
|
|
||||||
|
double Skew::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Compute skew
|
||||||
|
static double PI2 = PI / 2;
|
||||||
|
if ( P.Length() == 3 )
|
||||||
|
{
|
||||||
|
double A0 = fabs( PI2 - skewAngle( P( 3 ), P( 1 ), P( 2 ) ) );
|
||||||
|
double A1 = fabs( PI2 - skewAngle( P( 1 ), P( 2 ), P( 3 ) ) );
|
||||||
|
double A2 = fabs( PI2 - skewAngle( P( 2 ), P( 3 ), P( 1 ) ) );
|
||||||
|
|
||||||
|
return Max( A0, Max( A1, A2 ) ) * 180 / PI;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gp_XYZ p12 = ( P( 1 ) + P( 2 ) ) / 2;
|
||||||
|
gp_XYZ p23 = ( P( 2 ) + P( 3 ) ) / 2;
|
||||||
|
gp_XYZ p34 = ( P( 3 ) + P( 4 ) ) / 2;
|
||||||
|
gp_XYZ p41 = ( P( 4 ) + P( 1 ) ) / 2;
|
||||||
|
|
||||||
|
double A = fabs( PI2 - gp_Vec( p34 - p12 ).Angle( p23 - p41 ) );
|
||||||
|
|
||||||
|
return A * 180 / PI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType Skew::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Area
|
||||||
|
Description : Functor for calculating area
|
||||||
|
*/
|
||||||
|
double Area::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ( P.Length() == 3 )
|
||||||
|
return getArea( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
else
|
||||||
|
return getArea( P( 1 ), P( 2 ), P( 3 ) ) + getArea( P( 1 ), P( 3 ), P( 4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType Area::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Length
|
||||||
|
Description : Functor for calculating length off edge
|
||||||
|
*/
|
||||||
|
double Length::GetValue( long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
return getPoints( theId, P ) && P.Length() == 2 ? getDistance( P( 1 ), P( 2 ) ) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType Length::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Edge;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MultiConnection
|
||||||
|
Description : Functor for calculating number of faces conneted to the edge
|
||||||
|
*/
|
||||||
|
double MultiConnection::GetValue( long theId )
|
||||||
|
{
|
||||||
|
return getNbMultiConnection( myMesh, theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType MultiConnection::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Edge;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
PREDICATES
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : FreeBorders
|
||||||
|
Description : Predicate for free borders
|
||||||
|
*/
|
||||||
|
|
||||||
|
FreeBorders::FreeBorders()
|
||||||
|
{
|
||||||
|
myMesh = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FreeBorders::SetMesh( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
myMesh = theMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FreeBorders::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return getNbMultiConnection( myMesh, theId ) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType FreeBorders::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Edge;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : FreeEdges
|
||||||
|
Description : Predicate for free Edges
|
||||||
|
*/
|
||||||
|
FreeEdges::FreeEdges()
|
||||||
|
{
|
||||||
|
myMesh = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FreeEdges::SetMesh( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
myMesh = theMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FreeEdges::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return getNbMultiConnection( myMesh, theId ) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType FreeEdges::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
FreeEdges::Border::Border(long thePntId1, long thePntId2){
|
||||||
|
PntId[0] = thePntId1; PntId[1] = thePntId2;
|
||||||
|
if(thePntId1 > thePntId2){
|
||||||
|
PntId[1] = thePntId1; PntId[0] = thePntId2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool operator<(const FreeEdges::Border& x, const FreeEdges::Border& y){
|
||||||
|
// if(x.PntId[0] < y.PntId[0]) return true;
|
||||||
|
// if(x.PntId[0] == y.PntId[0])
|
||||||
|
// if(x.PntId[1] < y.PntId[1]) return true;
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
|
||||||
|
namespace SMESH{
|
||||||
|
namespace Controls{
|
||||||
|
struct EdgeBorder: public FreeEdges::Border{
|
||||||
|
long ElemId;
|
||||||
|
EdgeBorder(long theElemId, long thePntId1, long thePntId2):
|
||||||
|
FreeEdges::Border(thePntId1,thePntId2),
|
||||||
|
ElemId(theElemId)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator<(const FreeEdges::Border& x, const FreeEdges::Border& y){
|
||||||
|
if(x.PntId[0] < y.PntId[0]) return true;
|
||||||
|
if(x.PntId[0] == y.PntId[0])
|
||||||
|
if(x.PntId[1] < y.PntId[1]) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef std::set<EdgeBorder> EdgeBorderS;
|
||||||
|
|
||||||
|
inline void UpdateBorders(const EdgeBorder& theBorder,
|
||||||
|
EdgeBorderS& theRegistry,
|
||||||
|
EdgeBorderS& theContainer)
|
||||||
|
{
|
||||||
|
if(theRegistry.find(theBorder) == theRegistry.end()){
|
||||||
|
theRegistry.insert(theBorder);
|
||||||
|
theContainer.insert(theBorder);
|
||||||
|
}else{
|
||||||
|
theContainer.erase(theBorder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FreeEdges::GetBoreders(Borders& theBorders)
|
||||||
|
{
|
||||||
|
EdgeBorderS aRegistry;
|
||||||
|
EdgeBorderS aContainer;
|
||||||
|
SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
|
||||||
|
for(; anIter->more(); ){
|
||||||
|
const SMDS_MeshFace* anElem = anIter->next();
|
||||||
|
long anElemId = anElem->GetID();
|
||||||
|
SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
|
||||||
|
long aNodeId[2];
|
||||||
|
const SMDS_MeshElement* aNode;
|
||||||
|
if(aNodesIter->more()){
|
||||||
|
aNode = aNodesIter->next();
|
||||||
|
aNodeId[0] = aNodeId[1] = aNode->GetID();
|
||||||
|
}
|
||||||
|
for(; aNodesIter->more(); ){
|
||||||
|
aNode = aNodesIter->next();
|
||||||
|
EdgeBorder aBorder(anElemId,aNodeId[1],aNode->GetID());
|
||||||
|
aNodeId[1] = aNode->GetID();
|
||||||
|
//std::cout<<aBorder.PntId[0]<<"; "<<aBorder.PntId[1]<<"; "<<aBorder.ElemId<<"\n";
|
||||||
|
UpdateBorders(aBorder,aRegistry,aContainer);
|
||||||
|
}
|
||||||
|
EdgeBorder aBorder(anElemId,aNodeId[0],aNodeId[1]);
|
||||||
|
UpdateBorders(aBorder,aRegistry,aContainer);
|
||||||
|
}
|
||||||
|
//std::cout<<"aContainer.size() = "<<aContainer.size()<<"\n";
|
||||||
|
if(aContainer.size()){
|
||||||
|
EdgeBorderS::const_iterator anIter = aContainer.begin();
|
||||||
|
for(; anIter != aContainer.end(); anIter++){
|
||||||
|
const EdgeBorder& aBorder = *anIter;
|
||||||
|
//std::cout<<aBorder.PntId[0]<<"; "<<aBorder.PntId[1]<<"; "<<aBorder.ElemId<<"\n";
|
||||||
|
theBorders.insert(Borders::value_type(aBorder.ElemId,aBorder));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Comparator
|
||||||
|
Description : Base class for comparators
|
||||||
|
*/
|
||||||
|
Comparator::Comparator():
|
||||||
|
myMargin(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Comparator::~Comparator()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Comparator::SetMesh( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
if ( myFunctor )
|
||||||
|
myFunctor->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comparator::SetMargin( double theValue )
|
||||||
|
{
|
||||||
|
myMargin = theValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comparator::SetNumFunctor( NumericalFunctorPtr theFunct )
|
||||||
|
{
|
||||||
|
myFunctor = theFunct;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType Comparator::GetType() const
|
||||||
|
{
|
||||||
|
return myFunctor ? myFunctor->GetType() : SMDSAbs_All;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LessThan
|
||||||
|
Description : Comparator "<"
|
||||||
|
*/
|
||||||
|
bool LessThan::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return myFunctor && myFunctor->GetValue( theId ) < myMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MoreThan
|
||||||
|
Description : Comparator ">"
|
||||||
|
*/
|
||||||
|
bool MoreThan::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return myFunctor && myFunctor->GetValue( theId ) > myMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : EqualTo
|
||||||
|
Description : Comparator "="
|
||||||
|
*/
|
||||||
|
EqualTo::EqualTo():
|
||||||
|
myToler(Precision::Confusion())
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool EqualTo::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return myFunctor && fabs( myFunctor->GetValue( theId ) - myMargin ) < myToler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EqualTo::SetTolerance( double theToler )
|
||||||
|
{
|
||||||
|
myToler = theToler;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalNOT
|
||||||
|
Description : Logical NOT predicate
|
||||||
|
*/
|
||||||
|
LogicalNOT::LogicalNOT()
|
||||||
|
{}
|
||||||
|
|
||||||
|
LogicalNOT::~LogicalNOT()
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool LogicalNOT::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return myPredicate && !myPredicate->IsSatisfy( theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalNOT::SetMesh( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
if ( myPredicate )
|
||||||
|
myPredicate->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalNOT::SetPredicate( PredicatePtr thePred )
|
||||||
|
{
|
||||||
|
myPredicate = thePred;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType LogicalNOT::GetType() const
|
||||||
|
{
|
||||||
|
return myPredicate ? myPredicate->GetType() : SMDSAbs_All;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalBinary
|
||||||
|
Description : Base class for binary logical predicate
|
||||||
|
*/
|
||||||
|
LogicalBinary::LogicalBinary()
|
||||||
|
{}
|
||||||
|
|
||||||
|
LogicalBinary::~LogicalBinary()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void LogicalBinary::SetMesh( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
if ( myPredicate1 )
|
||||||
|
myPredicate1->SetMesh( theMesh );
|
||||||
|
|
||||||
|
if ( myPredicate2 )
|
||||||
|
myPredicate2->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalBinary::SetPredicate1( PredicatePtr thePredicate )
|
||||||
|
{
|
||||||
|
myPredicate1 = thePredicate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalBinary::SetPredicate2( PredicatePtr thePredicate )
|
||||||
|
{
|
||||||
|
myPredicate2 = thePredicate;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDSAbs_ElementType LogicalBinary::GetType() const
|
||||||
|
{
|
||||||
|
if ( !myPredicate1 || !myPredicate2 )
|
||||||
|
return SMDSAbs_All;
|
||||||
|
|
||||||
|
SMDSAbs_ElementType aType1 = myPredicate1->GetType();
|
||||||
|
SMDSAbs_ElementType aType2 = myPredicate2->GetType();
|
||||||
|
|
||||||
|
return aType1 == aType2 ? aType1 : SMDSAbs_All;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalAND
|
||||||
|
Description : Logical AND
|
||||||
|
*/
|
||||||
|
bool LogicalAND::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return
|
||||||
|
myPredicate1 &&
|
||||||
|
myPredicate2 &&
|
||||||
|
myPredicate1->IsSatisfy( theId ) &&
|
||||||
|
myPredicate2->IsSatisfy( theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalOR
|
||||||
|
Description : Logical OR
|
||||||
|
*/
|
||||||
|
bool LogicalOR::IsSatisfy( long theId )
|
||||||
|
{
|
||||||
|
return
|
||||||
|
myPredicate1 &&
|
||||||
|
myPredicate2 &&
|
||||||
|
myPredicate1->IsSatisfy( theId ) ||
|
||||||
|
myPredicate2->IsSatisfy( theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FILTER
|
||||||
|
*/
|
||||||
|
|
||||||
|
Filter::Filter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
Filter::~Filter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Filter::SetPredicate( PredicatePtr thePredicate )
|
||||||
|
{
|
||||||
|
myPredicate = thePredicate;
|
||||||
|
}
|
||||||
|
|
||||||
|
Filter::TIdSequence
|
||||||
|
Filter::GetElementsId( SMDS_Mesh* theMesh )
|
||||||
|
{
|
||||||
|
TIdSequence aSequence;
|
||||||
|
if ( !theMesh || !myPredicate ) return aSequence;
|
||||||
|
|
||||||
|
myPredicate->SetMesh( theMesh );
|
||||||
|
|
||||||
|
SMDSAbs_ElementType aType = myPredicate->GetType();
|
||||||
|
switch(aType){
|
||||||
|
case SMDSAbs_Edge:{
|
||||||
|
SMDS_EdgeIteratorPtr anIter = theMesh->edgesIterator();
|
||||||
|
if ( anIter != 0 ) {
|
||||||
|
while( anIter->more() ) {
|
||||||
|
const SMDS_MeshElement* anElem = anIter->next();
|
||||||
|
long anId = anElem->GetID();
|
||||||
|
if ( myPredicate->IsSatisfy( anId ) )
|
||||||
|
aSequence.push_back( anId );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case SMDSAbs_Face:{
|
||||||
|
SMDS_FaceIteratorPtr anIter = theMesh->facesIterator();
|
||||||
|
if ( anIter != 0 ) {
|
||||||
|
while( anIter->more() ) {
|
||||||
|
const SMDS_MeshElement* anElem = anIter->next();
|
||||||
|
long anId = anElem->GetID();
|
||||||
|
if ( myPredicate->IsSatisfy( anId ) )
|
||||||
|
aSequence.push_back( anId );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aSequence;
|
||||||
|
}
|
340
src/Controls/SMESH_Controls.hxx
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#ifndef _SMESH_CONTROLS_HXX_
|
||||||
|
#define _SMESH_CONTROLS_HXX_
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include "SMDSAbs_ElementType.hxx"
|
||||||
|
|
||||||
|
class SMDS_Mesh;
|
||||||
|
class gp_Pnt;
|
||||||
|
class gp_XYZ;
|
||||||
|
class TColgp_SequenceOfXYZ;
|
||||||
|
|
||||||
|
namespace SMESH{
|
||||||
|
namespace Controls{
|
||||||
|
class Functor{
|
||||||
|
public:
|
||||||
|
~Functor(){}
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh ) = 0;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<Functor> FunctorPtr;
|
||||||
|
|
||||||
|
class NumericalFunctor: public virtual Functor{
|
||||||
|
public:
|
||||||
|
NumericalFunctor();
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh );
|
||||||
|
virtual double GetValue( long theElementId ) = 0;
|
||||||
|
virtual SMDSAbs_ElementType GetType() const = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool getPoints( const int theId,
|
||||||
|
TColgp_SequenceOfXYZ& theRes ) const;
|
||||||
|
protected:
|
||||||
|
SMDS_Mesh* myMesh;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<NumericalFunctor> NumericalFunctorPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_MinimumAngle
|
||||||
|
Description : Functor for calculation of minimum angle
|
||||||
|
*/
|
||||||
|
class MinimumAngle: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : AspectRatio
|
||||||
|
Description : Functor for calculating aspect ratio
|
||||||
|
*/
|
||||||
|
class AspectRatio: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Warping
|
||||||
|
Description : Functor for calculating warping
|
||||||
|
*/
|
||||||
|
class Warping: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
double ComputeA( const gp_XYZ&, const gp_XYZ&,
|
||||||
|
const gp_XYZ&, const gp_XYZ& ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Taper
|
||||||
|
Description : Functor for calculating taper
|
||||||
|
*/
|
||||||
|
class Taper: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Skew
|
||||||
|
Description : Functor for calculating skew in degrees
|
||||||
|
*/
|
||||||
|
class Skew: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Area
|
||||||
|
Description : Functor for calculating area
|
||||||
|
*/
|
||||||
|
class Area: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Length
|
||||||
|
Description : Functor for calculating length of edge
|
||||||
|
*/
|
||||||
|
class Length: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MultiConnection
|
||||||
|
Description : Functor for calculating number of faces conneted to the edge
|
||||||
|
*/
|
||||||
|
class MultiConnection: public virtual NumericalFunctor{
|
||||||
|
public:
|
||||||
|
virtual double GetValue( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
PREDICATES
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Class : Predicate
|
||||||
|
Description : Base class for all predicates
|
||||||
|
*/
|
||||||
|
class Predicate: public virtual Functor{
|
||||||
|
public:
|
||||||
|
virtual bool IsSatisfy( long theElementId ) = 0;
|
||||||
|
virtual SMDSAbs_ElementType GetType() const = 0;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<Predicate> PredicatePtr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : FreeBorders
|
||||||
|
Description : Predicate for free borders
|
||||||
|
*/
|
||||||
|
class FreeBorders: public virtual Predicate{
|
||||||
|
public:
|
||||||
|
FreeBorders();
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh );
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SMDS_Mesh* myMesh;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : FreeEdges
|
||||||
|
Description : Predicate for free Edges
|
||||||
|
*/
|
||||||
|
class FreeEdges: public virtual Predicate{
|
||||||
|
public:
|
||||||
|
FreeEdges();
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh );
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
struct Border{
|
||||||
|
long PntId[2];
|
||||||
|
Border(long thePntId1, long thePntId2);
|
||||||
|
};
|
||||||
|
typedef long TElemId;
|
||||||
|
typedef std::map<TElemId,Border> Borders;
|
||||||
|
void GetBoreders(Borders& theBorders);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SMDS_Mesh* myMesh;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<FreeEdges> FreeEdgesPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Comparator
|
||||||
|
Description : Base class for comparators
|
||||||
|
*/
|
||||||
|
class Comparator: public virtual Predicate{
|
||||||
|
public:
|
||||||
|
Comparator();
|
||||||
|
virtual ~Comparator();
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh );
|
||||||
|
virtual void SetMargin(double theValue);
|
||||||
|
virtual void SetNumFunctor(NumericalFunctorPtr theFunct);
|
||||||
|
virtual bool IsSatisfy( long theElementId ) = 0;
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double myMargin;
|
||||||
|
NumericalFunctorPtr myFunctor;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<Comparator> ComparatorPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LessThan
|
||||||
|
Description : Comparator "<"
|
||||||
|
*/
|
||||||
|
class LessThan: public virtual Comparator{
|
||||||
|
public:
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MoreThan
|
||||||
|
Description : Comparator ">"
|
||||||
|
*/
|
||||||
|
class MoreThan: public virtual Comparator{
|
||||||
|
public:
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : EqualTo
|
||||||
|
Description : Comparator "="
|
||||||
|
*/
|
||||||
|
class EqualTo: public virtual Comparator{
|
||||||
|
public:
|
||||||
|
EqualTo();
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
virtual void SetTolerance( double theTol );
|
||||||
|
|
||||||
|
private:
|
||||||
|
double myToler;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<EqualTo> EqualToPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalNOT
|
||||||
|
Description : Logical NOT predicate
|
||||||
|
*/
|
||||||
|
class LogicalNOT: public virtual Predicate{
|
||||||
|
public:
|
||||||
|
LogicalNOT();
|
||||||
|
virtual ~LogicalNOT();
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh );
|
||||||
|
virtual void SetPredicate(PredicatePtr thePred);
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
PredicatePtr myPredicate;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<LogicalNOT> LogicalNOTPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalBinary
|
||||||
|
Description : Base class for binary logical predicate
|
||||||
|
*/
|
||||||
|
class LogicalBinary: public virtual Predicate{
|
||||||
|
public:
|
||||||
|
LogicalBinary();
|
||||||
|
virtual ~LogicalBinary();
|
||||||
|
virtual void SetMesh( SMDS_Mesh* theMesh );
|
||||||
|
virtual void SetPredicate1(PredicatePtr thePred);
|
||||||
|
virtual void SetPredicate2(PredicatePtr thePred);
|
||||||
|
virtual SMDSAbs_ElementType GetType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
PredicatePtr myPredicate1;
|
||||||
|
PredicatePtr myPredicate2;
|
||||||
|
};
|
||||||
|
typedef boost::shared_ptr<LogicalBinary> LogicalBinaryPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalAND
|
||||||
|
Description : Logical AND
|
||||||
|
*/
|
||||||
|
class LogicalAND: public virtual LogicalBinary{
|
||||||
|
public:
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalOR
|
||||||
|
Description : Logical OR
|
||||||
|
*/
|
||||||
|
class LogicalOR: public virtual LogicalBinary{
|
||||||
|
public:
|
||||||
|
virtual bool IsSatisfy( long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FILTER
|
||||||
|
*/
|
||||||
|
class Filter{
|
||||||
|
public:
|
||||||
|
Filter();
|
||||||
|
virtual ~Filter();
|
||||||
|
virtual void SetPredicate(PredicatePtr thePred);
|
||||||
|
typedef std::vector<long> TIdSequence;
|
||||||
|
virtual TIdSequence GetElementsId( SMDS_Mesh* theMesh );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
PredicatePtr myPredicate;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
36
src/Driver/Driver_Document.cxx
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "Driver_Document.h"
|
||||||
|
|
||||||
|
Driver_Document::Driver_Document():
|
||||||
|
myDocument(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Driver_Document::SetFile(const std::string& theFileName)
|
||||||
|
{
|
||||||
|
myFile = theFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Driver_Document::SetDocument(SMESHDS_Document * theDocument)
|
||||||
|
{
|
||||||
|
myDocument = theDocument;
|
||||||
|
}
|
44
src/Driver/Driver_Document.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_DRIVER_DOCUMENT
|
||||||
|
#define _INCLUDE_DRIVER_DOCUMENT
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class SMESHDS_Document;
|
||||||
|
|
||||||
|
class Driver_Document
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Driver_Document();
|
||||||
|
virtual ~Driver_Document(){}
|
||||||
|
|
||||||
|
virtual void Perform() = 0;
|
||||||
|
void SetFile(const std::string& theFileName);
|
||||||
|
void SetDocument(SMESHDS_Document *theDocument);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SMESHDS_Document * myDocument;
|
||||||
|
std::string myFile;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
46
src/Driver/Driver_Mesh.cxx
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// SMESH Driver : implementaion of driver for reading and writing
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : Mesh_Reader.cxx
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
#include "Driver_Mesh.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
Driver_Mesh::Driver_Mesh():
|
||||||
|
myFile(""),
|
||||||
|
myMeshId(-1)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Driver_Mesh::SetMeshId(int theMeshId)
|
||||||
|
{
|
||||||
|
myMeshId = theMeshId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Driver_Mesh::SetFile(const std::string& theFileName)
|
||||||
|
{
|
||||||
|
myFile = theFileName;
|
||||||
|
}
|
57
src/Driver/Driver_Mesh.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// SMESH Driver : implementaion of driver for reading and writing
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : Mesh_Reader.h
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_DRIVER_MESH
|
||||||
|
#define _INCLUDE_DRIVER_MESH
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class Driver_Mesh
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Driver_Mesh();
|
||||||
|
virtual ~Driver_Mesh(){}
|
||||||
|
|
||||||
|
enum Status {
|
||||||
|
DRS_OK,
|
||||||
|
DRS_EMPTY, // a file contains no mesh with the given name
|
||||||
|
DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers,
|
||||||
|
// so the numbers from the file are ignored
|
||||||
|
DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data
|
||||||
|
DRS_FAIL // general failure (exception etc.)
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual Status Perform() = 0;
|
||||||
|
void SetMeshId(int theMeshId);
|
||||||
|
void SetFile(const std::string& theFileName);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string myFile;
|
||||||
|
int myMeshId;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
31
src/Driver/Driver_SMDS_Mesh.cxx
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "Driver_SMDS_Mesh.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
Driver_SMDS_Mesh::Driver_SMDS_Mesh():
|
||||||
|
myMesh(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Driver_SMDS_Mesh::SetMesh(SMDS_Mesh *theMesh)
|
||||||
|
{
|
||||||
|
myMesh = theMesh;
|
||||||
|
}
|
38
src/Driver/Driver_SMDS_Mesh.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_DRIVER_SMDS_MESH
|
||||||
|
#define _INCLUDE_DRIVER_SMDS_MESH
|
||||||
|
|
||||||
|
#include "Driver_Mesh.h"
|
||||||
|
|
||||||
|
class SMDS_Mesh;
|
||||||
|
|
||||||
|
class Driver_SMDS_Mesh: public Driver_Mesh
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Driver_SMDS_Mesh();
|
||||||
|
void SetMesh(SMDS_Mesh *theMesh);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SMDS_Mesh *myMesh;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
31
src/Driver/Driver_SMESHDS_Mesh.cxx
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "Driver_SMESHDS_Mesh.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
Driver_SMESHDS_Mesh::Driver_SMESHDS_Mesh():
|
||||||
|
myMesh(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Driver_SMESHDS_Mesh::SetMesh(SMESHDS_Mesh *theMesh)
|
||||||
|
{
|
||||||
|
myMesh = theMesh;
|
||||||
|
}
|
38
src/Driver/Driver_SMESHDS_Mesh.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_DRIVER_SMESHDS_MESH
|
||||||
|
#define _INCLUDE_DRIVER_SMESHDS_MESH
|
||||||
|
|
||||||
|
#include "Driver_Mesh.h"
|
||||||
|
|
||||||
|
class SMESHDS_Mesh;
|
||||||
|
|
||||||
|
class Driver_SMESHDS_Mesh: public Driver_Mesh
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Driver_SMESHDS_Mesh();
|
||||||
|
void SetMesh(SMESHDS_Mesh *theMesh);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SMESHDS_Mesh *myMesh;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
28
src/DriverDAT/DAT_Test.cxx
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "DriverDAT_R_SMDS_Mesh.h"
|
||||||
|
#include "DriverDAT_W_SMDS_Mesh.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
DriverDAT_R_SMDS_Mesh aR;
|
||||||
|
DriverDAT_W_SMDS_Mesh aW;
|
||||||
|
return 1;
|
||||||
|
}
|
367
src/DriverMED/DriverMED_Family.cxx
Normal file
@ -0,0 +1,367 @@
|
|||||||
|
// SMESH DriverMED : tool to split groups on families
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : DriverMED_Family.cxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#include "DriverMED_Family.h"
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* Split each group from list <aGroups> on some parts (families)
|
||||||
|
* on the basis of the elements membership in other groups from this list.
|
||||||
|
* Resulting families have no common elements.
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
|
||||||
|
(const map <int, SMESHDS_SubMesh*>& theSubMeshes,
|
||||||
|
const list<SMESHDS_Group*>& theGroups,
|
||||||
|
const bool doGroupOfNodes,
|
||||||
|
const bool doGroupOfEdges,
|
||||||
|
const bool doGroupOfFaces,
|
||||||
|
const bool doGroupOfVolumes)
|
||||||
|
{
|
||||||
|
list<DriverMED_FamilyPtr> aFamilies;
|
||||||
|
|
||||||
|
string anAllNodesGroupName = "Group_Of_All_Nodes";
|
||||||
|
string anAllEdgesGroupName = "Group_Of_All_Edges";
|
||||||
|
string anAllFacesGroupName = "Group_Of_All_Faces";
|
||||||
|
string anAllVolumesGroupName = "Group_Of_All_Volumes";
|
||||||
|
|
||||||
|
// Reserve four ids for families of free elements
|
||||||
|
// (1 - nodes, -1 - edges, -2 - faces, -3 - volumes).
|
||||||
|
// 'Free' means here not belonging to any group.
|
||||||
|
int aNodeFamId = FIRST_NODE_FAMILY;
|
||||||
|
int aElemFamId = FIRST_ELEM_FAMILY;
|
||||||
|
|
||||||
|
// Process sub-meshes
|
||||||
|
map<int, SMESHDS_SubMesh*>::const_iterator aSMIter = theSubMeshes.begin();
|
||||||
|
for (; aSMIter != theSubMeshes.end(); aSMIter++)
|
||||||
|
{
|
||||||
|
list<DriverMED_FamilyPtr> aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first);
|
||||||
|
list<DriverMED_FamilyPtr>::iterator aSMFamsIter = aSMFams.begin();
|
||||||
|
for (; aSMFamsIter != aSMFams.end(); aSMFamsIter++)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFam2 = (*aSMFamsIter);
|
||||||
|
|
||||||
|
list<DriverMED_FamilyPtr>::iterator aFamsIter = aFamilies.begin();
|
||||||
|
while (aFamsIter != aFamilies.end())
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFam1 = *aFamsIter;
|
||||||
|
list<DriverMED_FamilyPtr>::iterator aCurrIter = aFamsIter++;
|
||||||
|
if (aFam1->myType == aFam2->myType)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aCommon (new DriverMED_Family);
|
||||||
|
aFam1->Split(aFam2, aCommon);
|
||||||
|
if (!aCommon->IsEmpty())
|
||||||
|
{
|
||||||
|
aFamilies.push_back(aCommon);
|
||||||
|
}
|
||||||
|
if (aFam1->IsEmpty())
|
||||||
|
{
|
||||||
|
aFamilies.erase(aCurrIter);
|
||||||
|
}
|
||||||
|
if (aFam2->IsEmpty()) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The rest elements of family
|
||||||
|
if (!aFam2->IsEmpty())
|
||||||
|
{
|
||||||
|
aFamilies.push_back(aFam2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process groups
|
||||||
|
list<SMESHDS_Group*>::const_iterator aGroupsIter = theGroups.begin();
|
||||||
|
for (; aGroupsIter != theGroups.end(); aGroupsIter++)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFam2 (new DriverMED_Family);
|
||||||
|
aFam2->Init(*aGroupsIter);
|
||||||
|
|
||||||
|
list<DriverMED_FamilyPtr>::iterator aFamsIter = aFamilies.begin();
|
||||||
|
while (aFamsIter != aFamilies.end())
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFam1 = *aFamsIter;
|
||||||
|
list<DriverMED_FamilyPtr>::iterator aCurrIter = aFamsIter++;
|
||||||
|
if (aFam1->myType == aFam2->myType)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aCommon (new DriverMED_Family);
|
||||||
|
aFam1->Split(aFam2, aCommon);
|
||||||
|
if (!aCommon->IsEmpty())
|
||||||
|
{
|
||||||
|
aFamilies.push_back(aCommon);
|
||||||
|
}
|
||||||
|
if (aFam1->IsEmpty())
|
||||||
|
{
|
||||||
|
aFamilies.erase(aCurrIter);
|
||||||
|
}
|
||||||
|
if (aFam2->IsEmpty()) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The rest elements of group
|
||||||
|
if (!aFam2->IsEmpty())
|
||||||
|
{
|
||||||
|
aFamilies.push_back(aFam2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list<DriverMED_FamilyPtr>::iterator aFamsIter = aFamilies.begin();
|
||||||
|
for (; aFamsIter != aFamilies.end(); aFamsIter++)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFam = *aFamsIter;
|
||||||
|
if (aFam->myType == SMDSAbs_Node) {
|
||||||
|
aFam->SetId(aNodeFamId++);
|
||||||
|
if (doGroupOfNodes) aFam->myGroupNames.insert(anAllNodesGroupName);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aFam->SetId(aElemFamId--);
|
||||||
|
if (aFam->myType == SMDSAbs_Edge) {
|
||||||
|
if (doGroupOfEdges) aFam->myGroupNames.insert(anAllEdgesGroupName);
|
||||||
|
}
|
||||||
|
else if (aFam->myType == SMDSAbs_Face) {
|
||||||
|
if (doGroupOfFaces) aFam->myGroupNames.insert(anAllFacesGroupName);
|
||||||
|
}
|
||||||
|
else if (aFam->myType == SMDSAbs_Volume) {
|
||||||
|
if (doGroupOfVolumes) aFam->myGroupNames.insert(anAllVolumesGroupName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create families for elements, not belonging to any group
|
||||||
|
if (doGroupOfNodes)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFreeNodesFam (new DriverMED_Family);
|
||||||
|
aFreeNodesFam->SetId(REST_NODES_FAMILY);
|
||||||
|
aFreeNodesFam->myType = SMDSAbs_Node;
|
||||||
|
aFreeNodesFam->myGroupNames.insert(anAllNodesGroupName);
|
||||||
|
aFamilies.push_back(aFreeNodesFam);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doGroupOfEdges)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFreeEdgesFam (new DriverMED_Family);
|
||||||
|
aFreeEdgesFam->SetId(REST_EDGES_FAMILY);
|
||||||
|
aFreeEdgesFam->myType = SMDSAbs_Edge;
|
||||||
|
aFreeEdgesFam->myGroupNames.insert(anAllEdgesGroupName);
|
||||||
|
aFamilies.push_back(aFreeEdgesFam);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doGroupOfFaces)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFreeFacesFam (new DriverMED_Family);
|
||||||
|
aFreeFacesFam->SetId(REST_FACES_FAMILY);
|
||||||
|
aFreeFacesFam->myType = SMDSAbs_Face;
|
||||||
|
aFreeFacesFam->myGroupNames.insert(anAllFacesGroupName);
|
||||||
|
aFamilies.push_back(aFreeFacesFam);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doGroupOfVolumes)
|
||||||
|
{
|
||||||
|
DriverMED_FamilyPtr aFreeVolumesFam (new DriverMED_Family);
|
||||||
|
aFreeVolumesFam->SetId(REST_VOLUMES_FAMILY);
|
||||||
|
aFreeVolumesFam->myType = SMDSAbs_Volume;
|
||||||
|
aFreeVolumesFam->myGroupNames.insert(anAllVolumesGroupName);
|
||||||
|
aFamilies.push_back(aFreeVolumesFam);
|
||||||
|
}
|
||||||
|
|
||||||
|
DriverMED_FamilyPtr aNullFam (new DriverMED_Family);
|
||||||
|
aNullFam->SetId(0);
|
||||||
|
aNullFam->myType = SMDSAbs_All;
|
||||||
|
aFamilies.push_back(aNullFam);
|
||||||
|
|
||||||
|
return aFamilies;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* Create TFamilyInfo for this family
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
MEDA::PFamilyInfo DriverMED_Family::GetFamilyInfo
|
||||||
|
(const MEDA::PMeshInfo& theMeshInfo) const
|
||||||
|
{
|
||||||
|
string aValue;
|
||||||
|
ostringstream aStr;
|
||||||
|
aStr << myId;
|
||||||
|
aValue = aStr.str();
|
||||||
|
MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description,
|
||||||
|
MED::TIntVector anAttrIds (1, myId); // Id=0,
|
||||||
|
MED::TIntVector anAttrVals (1, myId); // Value=0
|
||||||
|
|
||||||
|
MEDA::PFamilyInfo anInfo = MEDA::TWrapper::CrFamilyInfo(theMeshInfo,
|
||||||
|
aValue,
|
||||||
|
myId,
|
||||||
|
myGroupNames,
|
||||||
|
anAttrDescs,anAttrIds,anAttrVals);
|
||||||
|
|
||||||
|
// cout << endl;
|
||||||
|
// cout << "Groups: ";
|
||||||
|
// set<string>::iterator aGrIter = myGroupNames.begin();
|
||||||
|
// for (; aGrIter != myGroupNames.end(); aGrIter++)
|
||||||
|
// {
|
||||||
|
// cout << " " << *aGrIter;
|
||||||
|
// }
|
||||||
|
// cout << endl;
|
||||||
|
//
|
||||||
|
// cout << "Elements: ";
|
||||||
|
// set<const SMDS_MeshElement *>::iterator anIter = myElements.begin();
|
||||||
|
// for (; anIter != myElements.end(); anIter++)
|
||||||
|
// {
|
||||||
|
// cout << " " << (*anIter)->GetID();
|
||||||
|
// }
|
||||||
|
// cout << endl;
|
||||||
|
|
||||||
|
return anInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* Initialize the tool by SMESHDS_Group
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
void DriverMED_Family::Init (SMESHDS_Group* group)
|
||||||
|
{
|
||||||
|
// Elements
|
||||||
|
myElements.clear();
|
||||||
|
group->InitIterator();
|
||||||
|
while (group->More())
|
||||||
|
{
|
||||||
|
myElements.insert(group->Next());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type
|
||||||
|
myType = group->GetType();
|
||||||
|
|
||||||
|
// Groups list
|
||||||
|
myGroupNames.clear();
|
||||||
|
myGroupNames.insert(string(group->GetStoreName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* Split <theSubMesh> on some parts (families)
|
||||||
|
* on the basis of the elements type.
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
list<DriverMED_FamilyPtr> DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh,
|
||||||
|
const int theId)
|
||||||
|
{
|
||||||
|
list<DriverMED_FamilyPtr> aFamilies;
|
||||||
|
DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family);
|
||||||
|
DriverMED_FamilyPtr anEdgesFamily (new DriverMED_Family);
|
||||||
|
DriverMED_FamilyPtr aFacesFamily (new DriverMED_Family);
|
||||||
|
DriverMED_FamilyPtr aVolumesFamily (new DriverMED_Family);
|
||||||
|
|
||||||
|
char submeshGrpName[ 30 ];
|
||||||
|
sprintf( submeshGrpName, "SubMesh %d", theId );
|
||||||
|
|
||||||
|
SMDS_NodeIteratorPtr aNodesIter = theSubMesh->GetNodes();
|
||||||
|
while (aNodesIter->more())
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* aNode = aNodesIter->next();
|
||||||
|
aNodesFamily->AddElement(aNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
SMDS_ElemIteratorPtr anElemsIter = theSubMesh->GetElements();
|
||||||
|
while (anElemsIter->more())
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* anElem = anElemsIter->next();
|
||||||
|
switch (anElem->GetType())
|
||||||
|
{
|
||||||
|
case SMDSAbs_Edge:
|
||||||
|
anEdgesFamily->AddElement(anElem);
|
||||||
|
break;
|
||||||
|
case SMDSAbs_Face:
|
||||||
|
aFacesFamily->AddElement(anElem);
|
||||||
|
break;
|
||||||
|
case SMDSAbs_Volume:
|
||||||
|
aVolumesFamily->AddElement(anElem);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!aNodesFamily->IsEmpty()) {
|
||||||
|
aNodesFamily->SetType(SMDSAbs_Node);
|
||||||
|
aNodesFamily->AddGroupName(submeshGrpName);
|
||||||
|
aFamilies.push_back(aNodesFamily);
|
||||||
|
}
|
||||||
|
if (!anEdgesFamily->IsEmpty()) {
|
||||||
|
anEdgesFamily->SetType(SMDSAbs_Edge);
|
||||||
|
anEdgesFamily->AddGroupName(submeshGrpName);
|
||||||
|
aFamilies.push_back(anEdgesFamily);
|
||||||
|
}
|
||||||
|
if (!aFacesFamily->IsEmpty()) {
|
||||||
|
aFacesFamily->SetType(SMDSAbs_Face);
|
||||||
|
aFacesFamily->AddGroupName(submeshGrpName);
|
||||||
|
aFamilies.push_back(aFacesFamily);
|
||||||
|
}
|
||||||
|
if (!aVolumesFamily->IsEmpty()) {
|
||||||
|
aVolumesFamily->SetType(SMDSAbs_Volume);
|
||||||
|
aVolumesFamily->AddGroupName(submeshGrpName);
|
||||||
|
aFamilies.push_back(aVolumesFamily);
|
||||||
|
}
|
||||||
|
|
||||||
|
return aFamilies;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* Remove from <myElements> elements, common with <by>,
|
||||||
|
* Remove from <by> elements, common with <myElements>,
|
||||||
|
* Create family <common> from common elements, with combined groups list.
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
void DriverMED_Family::Split (DriverMED_FamilyPtr by,
|
||||||
|
DriverMED_FamilyPtr common)
|
||||||
|
{
|
||||||
|
// Elements
|
||||||
|
set<const SMDS_MeshElement *>::iterator anIter = by->myElements.begin();
|
||||||
|
for (; anIter != by->myElements.end(); anIter++)
|
||||||
|
{
|
||||||
|
if (myElements.find(*anIter) != myElements.end())
|
||||||
|
{
|
||||||
|
common->myElements.insert(*anIter);
|
||||||
|
myElements.erase(*anIter);
|
||||||
|
by->myElements.erase(*anIter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!common->IsEmpty())
|
||||||
|
{
|
||||||
|
// Groups list
|
||||||
|
common->myGroupNames = myGroupNames;
|
||||||
|
set<string>::iterator aGrNamesIter = by->myGroupNames.begin();
|
||||||
|
for (; aGrNamesIter != by->myGroupNames.end(); aGrNamesIter++)
|
||||||
|
{
|
||||||
|
common->myGroupNames.insert(*aGrNamesIter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type
|
||||||
|
common->myType = myType;
|
||||||
|
}
|
||||||
|
}
|
121
src/DriverMED/DriverMED_Family.h
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
// SMESH DriverMED : tool to split groups on families
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : DriverMED_Family.hxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_DRIVERMED_FAMILY
|
||||||
|
#define _INCLUDE_DRIVERMED_FAMILY
|
||||||
|
|
||||||
|
#include "SMDS_Mesh.hxx"
|
||||||
|
#include "SMESHDS_Group.hxx"
|
||||||
|
#include "SMESHDS_SubMesh.hxx"
|
||||||
|
#include "MEDA_Wrapper.hxx"
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define REST_NODES_FAMILY 1
|
||||||
|
#define REST_EDGES_FAMILY -1
|
||||||
|
#define REST_FACES_FAMILY -2
|
||||||
|
#define REST_VOLUMES_FAMILY -3
|
||||||
|
#define FIRST_NODE_FAMILY 2
|
||||||
|
#define FIRST_ELEM_FAMILY -4
|
||||||
|
|
||||||
|
class DriverMED_Family;
|
||||||
|
typedef boost::shared_ptr<DriverMED_Family> DriverMED_FamilyPtr;
|
||||||
|
|
||||||
|
class DriverMED_Family
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Methods for groups storing to MED
|
||||||
|
|
||||||
|
static list<DriverMED_FamilyPtr> MakeFamilies (const map <int, SMESHDS_SubMesh*>& theSubMeshes,
|
||||||
|
const list<SMESHDS_Group*>& theGroups,
|
||||||
|
const bool doGroupOfNodes,
|
||||||
|
const bool doGroupOfEdges,
|
||||||
|
const bool doGroupOfFaces,
|
||||||
|
const bool doGroupOfVolumes);
|
||||||
|
// Split each group from list <theGroups> and each sub-mesh from list <theSubMeshes>
|
||||||
|
// on some parts (families) on the basis of the elements membership in other groups
|
||||||
|
// from <theGroups> and other sub-meshes from <theSubMeshes>.
|
||||||
|
// Resulting families have no common elements.
|
||||||
|
|
||||||
|
MEDA::PFamilyInfo GetFamilyInfo (const MEDA::PMeshInfo& theMeshInfo) const;
|
||||||
|
// Create TFamilyInfo for this family
|
||||||
|
|
||||||
|
const set<const SMDS_MeshElement *>& GetElements () const { return myElements; }
|
||||||
|
// Returns elements of this family
|
||||||
|
|
||||||
|
int GetId () const { return myId; }
|
||||||
|
// Returns a family ID
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Methods for groups reading from MED
|
||||||
|
|
||||||
|
void AddElement (const SMDS_MeshElement* theElement) { myElements.insert(theElement); }
|
||||||
|
|
||||||
|
void AddGroupName (string theGroupName) { myGroupNames.insert(theGroupName); }
|
||||||
|
|
||||||
|
void SetType (const SMDSAbs_ElementType theType) { myType = theType; }
|
||||||
|
SMDSAbs_ElementType GetType () { return myType; }
|
||||||
|
|
||||||
|
bool MemberOf (string theGroupName) const
|
||||||
|
{ return (myGroupNames.find(theGroupName) != myGroupNames.end()); }
|
||||||
|
|
||||||
|
const MED::TStringSet& GetGroupNames () const { return myGroupNames; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Init (SMESHDS_Group* group);
|
||||||
|
// Initialize the tool by SMESHDS_Group
|
||||||
|
|
||||||
|
static list<DriverMED_FamilyPtr> SplitByType (SMESHDS_SubMesh* theSubMesh,
|
||||||
|
const int theId);
|
||||||
|
// Split <theSubMesh> on some parts (families)
|
||||||
|
// on the basis of the elements type.
|
||||||
|
|
||||||
|
void Split (DriverMED_FamilyPtr by,
|
||||||
|
DriverMED_FamilyPtr common);
|
||||||
|
// Remove from <Elements> elements, common with <by>,
|
||||||
|
// Remove from <by> elements, common with <Elements>,
|
||||||
|
// Create family <common> from common elements, with combined groups list.
|
||||||
|
|
||||||
|
void SetId (const int theId) { myId = theId; }
|
||||||
|
// Sets a family ID
|
||||||
|
|
||||||
|
bool IsEmpty () const { return myElements.empty(); }
|
||||||
|
// Check, if this family has empty list of elements
|
||||||
|
|
||||||
|
private:
|
||||||
|
int myId;
|
||||||
|
SMDSAbs_ElementType myType;
|
||||||
|
set<const SMDS_MeshElement *> myElements;
|
||||||
|
MED::TStringSet myGroupNames;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
28
src/DriverMED/MED_Test.cxx
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "DriverMED_R_SMESHDS_Mesh.h"
|
||||||
|
#include "DriverMED_W_SMESHDS_Mesh.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
DriverMED_R_SMESHDS_Mesh aR;
|
||||||
|
DriverMED_W_SMESHDS_Mesh aW;
|
||||||
|
return 1;
|
||||||
|
}
|
123
src/DriverUNV/UNV2411_Structure.cxx
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "UNV2411_Structure.hxx"
|
||||||
|
#include "UNV_Utilities.hxx"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace UNV;
|
||||||
|
using namespace UNV2411;
|
||||||
|
|
||||||
|
#ifdef _DEBUG_
|
||||||
|
static int MYDEBUG = 1;
|
||||||
|
#else
|
||||||
|
static int MYDEBUG = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static string _label_dataset = "2411";
|
||||||
|
|
||||||
|
UNV2411::TRecord::TRecord():
|
||||||
|
exp_coord_sys_num(0),
|
||||||
|
disp_coord_sys_num(0),
|
||||||
|
color(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet)
|
||||||
|
{
|
||||||
|
if(!in_stream.good())
|
||||||
|
EXCEPTION(runtime_error,"ERROR: Input file not good.");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* adjust the \p istream to our
|
||||||
|
* position
|
||||||
|
*/
|
||||||
|
if(!beginning_of_dataset(in_stream,_label_dataset))
|
||||||
|
EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* always 3 coordinates in the UNV file, no matter
|
||||||
|
* which dimensionality libMesh is in
|
||||||
|
*/
|
||||||
|
TNodeLab aLabel;
|
||||||
|
std::string num_buf;
|
||||||
|
for(; !in_stream.eof();){
|
||||||
|
in_stream >> aLabel ;
|
||||||
|
if(aLabel == -1){
|
||||||
|
// end of dataset is reached
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRecord aRec;
|
||||||
|
in_stream>>aRec.exp_coord_sys_num;
|
||||||
|
in_stream>>aRec.disp_coord_sys_num;
|
||||||
|
in_stream>>aRec.color;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* take care of the
|
||||||
|
* floating-point data
|
||||||
|
*/
|
||||||
|
for(int d = 0; d < 3; d++){
|
||||||
|
in_stream>>num_buf;
|
||||||
|
aRec.coord[d] = D_to_e(num_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
theDataSet.insert(TDataSet::value_type(aLabel,aRec));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void UNV2411::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
|
||||||
|
{
|
||||||
|
if(!out_stream.good())
|
||||||
|
EXCEPTION(runtime_error,"ERROR: Output file not good.");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write beginning of dataset
|
||||||
|
*/
|
||||||
|
out_stream<<" -1\n";
|
||||||
|
out_stream<<" "<<_label_dataset<<"\n";
|
||||||
|
|
||||||
|
TDataSet::const_iterator anIter = theDataSet.begin();
|
||||||
|
for(; anIter != theDataSet.end(); anIter++){
|
||||||
|
const TNodeLab& aLabel = anIter->first;
|
||||||
|
const TRecord& aRec = anIter->second;
|
||||||
|
char buf[78];
|
||||||
|
sprintf(buf, "%10d%10d%10d%10d\n",
|
||||||
|
aLabel,
|
||||||
|
aRec.exp_coord_sys_num,
|
||||||
|
aRec.disp_coord_sys_num,
|
||||||
|
aRec.color);
|
||||||
|
out_stream<<buf;
|
||||||
|
|
||||||
|
// the coordinates
|
||||||
|
sprintf(buf, "%25.16E%25.16E%25.16E\n",
|
||||||
|
aRec.coord[0],
|
||||||
|
aRec.coord[1],
|
||||||
|
aRec.coord[2]);
|
||||||
|
out_stream<<buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write end of dataset
|
||||||
|
*/
|
||||||
|
out_stream<<" -1\n";
|
||||||
|
}
|
46
src/DriverUNV/UNV2411_Structure.hxx
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#ifndef UNV2411_Structure_HeaderFile
|
||||||
|
#define UNV2411_Structure_HeaderFile
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace UNV2411{
|
||||||
|
|
||||||
|
struct TRecord{
|
||||||
|
TRecord();
|
||||||
|
int exp_coord_sys_num; // export coordinate system number
|
||||||
|
int disp_coord_sys_num; // displacement coordinate system number
|
||||||
|
int color; // color
|
||||||
|
double coord[3]; // node coordinates in the part coordinate system
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef int TNodeLab; // type of node label
|
||||||
|
typedef std::map<TNodeLab,TRecord> TDataSet;
|
||||||
|
|
||||||
|
void Read(std::ifstream& in_stream, TDataSet& theDataSet);
|
||||||
|
|
||||||
|
void Write(std::ofstream& out_stream, const TDataSet& theDataSet);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
202
src/DriverUNV/UNV2412_Structure.cxx
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#include "UNV2412_Structure.hxx"
|
||||||
|
#include "UNV_Utilities.hxx"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace UNV;
|
||||||
|
using namespace UNV2412;
|
||||||
|
|
||||||
|
#ifdef _DEBUG_
|
||||||
|
static int MYDEBUG = 1;
|
||||||
|
#else
|
||||||
|
static int MYDEBUG = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static string _label_dataset = "2412";
|
||||||
|
|
||||||
|
UNV2412::TRecord::TRecord():
|
||||||
|
phys_prop_tab_num(2),
|
||||||
|
mat_prop_tab_num(1),
|
||||||
|
color(7),
|
||||||
|
beam_orientation(0),
|
||||||
|
beam_fore_end(0),
|
||||||
|
beam_aft_end(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
|
||||||
|
{
|
||||||
|
if(!in_stream.good())
|
||||||
|
EXCEPTION(runtime_error,"ERROR: Input file not good.");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* adjust the \p istream to our
|
||||||
|
* position
|
||||||
|
*/
|
||||||
|
if(!beginning_of_dataset(in_stream,_label_dataset))
|
||||||
|
EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
|
||||||
|
|
||||||
|
TElementLab aLabel;
|
||||||
|
for(; !in_stream.eof();){
|
||||||
|
in_stream >> aLabel ;
|
||||||
|
if(aLabel == -1){
|
||||||
|
// end of dataset is reached
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int n_nodes;
|
||||||
|
TRecord aRec;
|
||||||
|
in_stream>>aRec.fe_descriptor_id;
|
||||||
|
in_stream>>aRec.phys_prop_tab_num;
|
||||||
|
in_stream>>aRec.mat_prop_tab_num;
|
||||||
|
in_stream>>aRec.color;
|
||||||
|
in_stream>>n_nodes;
|
||||||
|
|
||||||
|
if(IsBeam(aRec.fe_descriptor_id)){
|
||||||
|
in_stream>>aRec.beam_orientation;
|
||||||
|
in_stream>>aRec.beam_fore_end;
|
||||||
|
in_stream>>aRec.beam_aft_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
aRec.node_labels.resize(n_nodes);
|
||||||
|
for(int j=0; j < n_nodes; j++){
|
||||||
|
// read node labels
|
||||||
|
in_stream>>aRec.node_labels[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
theDataSet.insert(TDataSet::value_type(aLabel,aRec));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
|
||||||
|
{
|
||||||
|
if(!out_stream.good())
|
||||||
|
EXCEPTION(runtime_error,"ERROR: Output file not good.");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write beginning of dataset
|
||||||
|
*/
|
||||||
|
out_stream<<" -1\n";
|
||||||
|
out_stream<<" "<<_label_dataset<<"\n";
|
||||||
|
|
||||||
|
TDataSet::const_iterator anIter = theDataSet.begin();
|
||||||
|
for(; anIter != theDataSet.end(); anIter++){
|
||||||
|
const TElementLab& aLabel = anIter->first;
|
||||||
|
const TRecord& aRec = anIter->second;
|
||||||
|
out_stream<<std::setw(10)<<aLabel; /* element ID */
|
||||||
|
out_stream<<std::setw(10)<<aRec.fe_descriptor_id; /* type of element */
|
||||||
|
out_stream<<std::setw(10)<<aRec.phys_prop_tab_num;
|
||||||
|
out_stream<<std::setw(10)<<aRec.mat_prop_tab_num;
|
||||||
|
out_stream<<std::setw(10)<<aRec.color;
|
||||||
|
out_stream<<std::setw(10)<<aRec.node_labels.size()<<std::endl; /* No. of nodes per element */
|
||||||
|
|
||||||
|
if(IsBeam(aRec.fe_descriptor_id)){
|
||||||
|
out_stream<<std::setw(10)<<aRec.beam_orientation;
|
||||||
|
out_stream<<std::setw(10)<<aRec.beam_fore_end;
|
||||||
|
out_stream<<std::setw(10)<<aRec.beam_aft_end<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int n_nodes = aRec.node_labels.size();
|
||||||
|
int iEnd = (n_nodes-1)/8 + 1;
|
||||||
|
for(int i = 0, k = 0; i < iEnd; i++){
|
||||||
|
int jEnd = n_nodes - 8*(i+1);
|
||||||
|
if(jEnd < 0)
|
||||||
|
jEnd = 8 + jEnd;
|
||||||
|
else
|
||||||
|
jEnd = 8;
|
||||||
|
for(int j = 0; j < jEnd ; k++, j++){
|
||||||
|
out_stream<<std::setw(10)<<aRec.node_labels[k];
|
||||||
|
}
|
||||||
|
out_stream<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write end of dataset
|
||||||
|
*/
|
||||||
|
out_stream<<" -1\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool UNV2412::IsBeam(int theFeDescriptorId){
|
||||||
|
switch (theFeDescriptorId){
|
||||||
|
case 11:
|
||||||
|
case 21:
|
||||||
|
case 22:
|
||||||
|
case 24:
|
||||||
|
case 25:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool UNV2412::IsFace(int theFeDescriptorId){
|
||||||
|
switch (theFeDescriptorId){
|
||||||
|
|
||||||
|
case 71: // TRI3
|
||||||
|
case 72:
|
||||||
|
case 74:
|
||||||
|
|
||||||
|
case 41: // Plane Stress Linear Triangle - TRI3
|
||||||
|
case 91: // Thin Shell Linear Triangle - TRI3
|
||||||
|
|
||||||
|
case 42: // Plane Stress Quadratic Triangle - TRI6
|
||||||
|
case 92: // Thin Shell Quadratic Triangle - TRI6
|
||||||
|
|
||||||
|
case 43: // Plane Stress Cubic Triangle
|
||||||
|
|
||||||
|
case 44: // Plane Stress Linear Quadrilateral - QUAD4
|
||||||
|
case 94: // Thin Shell Linear Quadrilateral - QUAD4
|
||||||
|
|
||||||
|
case 45: // Plane Stress Quadratic Quadrilateral - QUAD8
|
||||||
|
case 95: // Thin Shell Quadratic Quadrilateral - QUAD8
|
||||||
|
|
||||||
|
case 46: // Plane Stress Cubic Quadrilateral
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool UNV2412::IsVolume(int theFeDescriptorId){
|
||||||
|
//if(!IsBeam(theFeDescriptorId) && !IsFace(theFeDescriptorId))
|
||||||
|
// return true;
|
||||||
|
switch (theFeDescriptorId){
|
||||||
|
|
||||||
|
case 111: // Solid Linear Tetrahedron - TET4
|
||||||
|
case 118: // Solid Quadratic Tetrahedron - TET10
|
||||||
|
|
||||||
|
case 112: // Solid Linear Prism - PRISM6
|
||||||
|
|
||||||
|
case 115: // Solid Linear Brick - HEX8
|
||||||
|
case 116: // Solid Quadratic Brick - HEX20
|
||||||
|
|
||||||
|
case 117: // Solid Cubic Brick
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
59
src/DriverUNV/UNV2412_Structure.hxx
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#ifndef UNV2412_Structure_HeaderFile
|
||||||
|
#define UNV2412_Structure_HeaderFile
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
|
namespace UNV2412{
|
||||||
|
|
||||||
|
struct TRecord{
|
||||||
|
TRecord();
|
||||||
|
|
||||||
|
int fe_descriptor_id; // FE descriptor id
|
||||||
|
int phys_prop_tab_num; // physical property table number
|
||||||
|
int mat_prop_tab_num; // material property table number
|
||||||
|
int color; // color
|
||||||
|
std::vector<int> node_labels; // node labels defining element
|
||||||
|
|
||||||
|
//FOR BEAM ELEMENTS ONLY
|
||||||
|
int beam_orientation; // beam orientation node number
|
||||||
|
int beam_fore_end; // beam fore-end cross section number
|
||||||
|
int beam_aft_end; // beam aft-end cross section number
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef int TElementLab; // type of element label
|
||||||
|
typedef std::map<TElementLab,TRecord> TDataSet;
|
||||||
|
|
||||||
|
void Read(std::ifstream& in_stream, TDataSet& theDataSet);
|
||||||
|
|
||||||
|
void Write(std::ofstream& out_stream, const TDataSet& theDataSet);
|
||||||
|
|
||||||
|
bool IsBeam(int theFeDescriptorId);
|
||||||
|
bool IsFace(int theFeDescriptorId);
|
||||||
|
bool IsVolume(int theFeDescriptorId);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
69
src/DriverUNV/UNV_Test.cxx
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
#include "UNV2411_Structure.hxx"
|
||||||
|
#include "UNV2412_Structure.hxx"
|
||||||
|
#include "UNV_Utilities.hxx"
|
||||||
|
|
||||||
|
#include "DriverUNV_R_SMDS_Mesh.h"
|
||||||
|
#include "DriverUNV_W_SMDS_Mesh.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
static int MYDEBUG = 1;
|
||||||
|
#else
|
||||||
|
static int MYDEBUG = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void ReadMed(const char* theFileName){
|
||||||
|
std::ifstream in_stream(theFileName);
|
||||||
|
|
||||||
|
UNV2411::TDataSet aDataSet2411;
|
||||||
|
UNV2411::Read(in_stream,aDataSet2411);
|
||||||
|
|
||||||
|
in_stream.seekg(0);
|
||||||
|
UNV2412::TDataSet aDataSet2412;
|
||||||
|
UNV2412::Read(in_stream,aDataSet2412);
|
||||||
|
|
||||||
|
string aFileName(theFileName);
|
||||||
|
aFileName += "-";
|
||||||
|
std::ofstream out_stream(aFileName.c_str());
|
||||||
|
|
||||||
|
UNV2411::Write(out_stream,aDataSet2411);
|
||||||
|
UNV2412::Write(out_stream,aDataSet2412);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char** argv){
|
||||||
|
DriverUNV_R_SMDS_Mesh aR;
|
||||||
|
DriverUNV_W_SMDS_Mesh aW;
|
||||||
|
try{
|
||||||
|
if(argc > 1){
|
||||||
|
ReadMed(argv[1]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}catch(std::exception& exc){
|
||||||
|
cout<<"Follow exception was accured :\n"<<exc.what()<<endl;
|
||||||
|
}catch(...){
|
||||||
|
cout<<"Unknown exception was accured !!!"<<endl;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
37
src/DriverUNV/UNV_Utilities.cxx
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Copyright (C) 2003 CEA/DEN, EDF R&D
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : VISU_DatConvertor.cxx
|
||||||
|
// Author : Alexey PETROV
|
||||||
|
// Module : VISU
|
||||||
|
|
||||||
|
#include "UNV_Utilities.hxx"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#ifdef _DEBUG_
|
||||||
|
static int MYDEBUG = 1;
|
||||||
|
#else
|
||||||
|
static int MYDEBUG = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int UNV::PrefixPrinter::myCounter = 0;
|
||||||
|
|
||||||
|
UNV::PrefixPrinter::PrefixPrinter()
|
||||||
|
{
|
||||||
|
myCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNV::PrefixPrinter::~PrefixPrinter()
|
||||||
|
{
|
||||||
|
myCounter--;
|
||||||
|
}
|
||||||
|
|
||||||
|
string UNV::PrefixPrinter::GetPrefix()
|
||||||
|
{
|
||||||
|
if(myCounter)
|
||||||
|
return string(myCounter*2,' ');
|
||||||
|
return "";
|
||||||
|
}
|
104
src/DriverUNV/UNV_Utilities.hxx
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
// Copyright (C) 2003 CEA/DEN, EDF R&D
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : VISU_DatConvertor.hxx
|
||||||
|
// Author : Alexey PETROV
|
||||||
|
// Module : VISU
|
||||||
|
|
||||||
|
#ifndef MED_Utilities_HeaderFile
|
||||||
|
#define MED_Utilities_HeaderFile
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
|
||||||
|
namespace UNV{
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class PrefixPrinter{
|
||||||
|
static int myCounter;
|
||||||
|
public:
|
||||||
|
PrefixPrinter();
|
||||||
|
~PrefixPrinter();
|
||||||
|
|
||||||
|
static string GetPrefix();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns \p false when error occured, \p true otherwise.
|
||||||
|
* Adjusts the \p in_stream to the beginning of the
|
||||||
|
* dataset \p ds_name.
|
||||||
|
*/
|
||||||
|
inline bool beginning_of_dataset(std::istream& in_file, const std::string& ds_name)
|
||||||
|
{
|
||||||
|
assert (in_file.good());
|
||||||
|
assert (!ds_name.empty());
|
||||||
|
|
||||||
|
std::string olds, news;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
in_file >> olds >> news;
|
||||||
|
/*
|
||||||
|
* a "-1" followed by a number means the beginning of a dataset
|
||||||
|
* stop combing at the end of the file
|
||||||
|
*/
|
||||||
|
while( ((olds != "-1") || (news == "-1") ) && !in_file.eof() ){
|
||||||
|
olds = news;
|
||||||
|
in_file >> news;
|
||||||
|
}
|
||||||
|
if(in_file.eof())
|
||||||
|
return false;
|
||||||
|
if (news == ds_name)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// should never end up here
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method for converting exponential notation
|
||||||
|
* from "D" to "e", for example
|
||||||
|
* \p 3.141592654D+00 \p --> \p 3.141592654e+00
|
||||||
|
* in order to make it readable for C++.
|
||||||
|
*/
|
||||||
|
inline double D_to_e(std::string& number)
|
||||||
|
{
|
||||||
|
/* find "D" in string, start looking at
|
||||||
|
* 6th element, to improve speed.
|
||||||
|
* We dont expect a "D" earlier
|
||||||
|
*/
|
||||||
|
const int position = number.find("D",6);
|
||||||
|
if(position != std::string::npos){
|
||||||
|
number.replace(position, 1, "e");
|
||||||
|
}
|
||||||
|
return atof (number.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MESSAGE
|
||||||
|
|
||||||
|
#define MESSAGE(msg) std::cout<<__FILE__<<"["<<__LINE__<<"]::"<<msg<<endl;
|
||||||
|
|
||||||
|
#define BEGMSG(msg) std::cout<<UNV::PrefixPrinter::GetPrefix()<<msg
|
||||||
|
|
||||||
|
#define ADDMSG(msg) std::cout<<msg
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef EXCEPTION
|
||||||
|
|
||||||
|
#define EXCEPTION(TYPE, MSG) {\
|
||||||
|
std::ostringstream aStream;\
|
||||||
|
aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
|
||||||
|
throw TYPE(aStream.str());\
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
67
src/NETGENPlugin/Makefile.in
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# SMESH NETGENPlugin : implementaion of SMESH idl descriptions
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# File : Makefile.in
|
||||||
|
# Author : Julia DOROVSKIKH
|
||||||
|
# Module : SMESH
|
||||||
|
# $Header$
|
||||||
|
|
||||||
|
top_srcdir=@top_srcdir@
|
||||||
|
top_builddir=../..
|
||||||
|
srcdir=@srcdir@
|
||||||
|
VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:
|
||||||
|
|
||||||
|
|
||||||
|
@COMMENCE@
|
||||||
|
|
||||||
|
EXPORT_PYSCRIPTS =
|
||||||
|
|
||||||
|
# .po files to transform in .qm
|
||||||
|
PO_FILES = NETGENPlugin_icons.po
|
||||||
|
|
||||||
|
# Libraries targets
|
||||||
|
LIB = libNETGENEngine.la
|
||||||
|
LIB_SRC = \
|
||||||
|
NETGENPlugin_NETGEN_3D.cxx \
|
||||||
|
NETGENPlugin_NETGEN_3D_i.cxx \
|
||||||
|
NETGENPlugin_i.cxx
|
||||||
|
|
||||||
|
LIB_SERVER_IDL = SMESH_NetgenAlgorithm.idl
|
||||||
|
|
||||||
|
LIB_CLIENT_IDL = SMESH_Gen.idl SMESH_Mesh.idl SMESH_Group.idl
|
||||||
|
|
||||||
|
# Executables targets
|
||||||
|
BIN =
|
||||||
|
BIN_SRC =
|
||||||
|
|
||||||
|
# additionnal information to compil and link file
|
||||||
|
NETGEN_INCLUDES=@NETGEN_INCLUDES@
|
||||||
|
|
||||||
|
CPPFLAGS+= $(OCC_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \
|
||||||
|
-I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES) $(BOOST_CPPFLAGS)
|
||||||
|
CXXFLAGS+= $(OCC_CXXFLAGS) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \
|
||||||
|
-I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES)
|
||||||
|
|
||||||
|
LDFLAGS+= $(HDF5_LIBS) -lSMESHimpl -lSMESHEngine -lStdMeshers -lStdMeshersEngine -lNETGEN -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome -lSalomeGenericObj
|
||||||
|
|
||||||
|
@CONCLUDE@
|
1064
src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx
Normal file
43
src/NETGENPlugin/NETGENPlugin_NETGEN_3D.hxx
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
//=============================================================================
|
||||||
|
// File : NETGENPlugin_NETGEN_3D.hxx
|
||||||
|
// Moved here from SMESH_NETGEN_3D.hxx
|
||||||
|
// Created : lundi 27 Janvier 2003
|
||||||
|
// Author : Nadir BOUHAMOU (CEA)
|
||||||
|
// Project : SALOME
|
||||||
|
// Copyright : CEA 2003
|
||||||
|
// $Header$
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
#ifndef _NETGENPlugin_NETGEN_3D_HXX_
|
||||||
|
#define _NETGENPlugin_NETGEN_3D_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_3D_Algo.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
#include "StdMeshers_MaxElementVolume.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class NETGENPlugin_NETGEN_3D: public SMESH_3D_Algo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NETGENPlugin_NETGEN_3D(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~NETGENPlugin_NETGEN_3D();
|
||||||
|
|
||||||
|
virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus);
|
||||||
|
|
||||||
|
virtual bool Compute(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape);
|
||||||
|
|
||||||
|
ostream & SaveTo(ostream & save);
|
||||||
|
istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, NETGENPlugin_NETGEN_3D & hyp);
|
||||||
|
friend istream & operator >> (istream & load, NETGENPlugin_NETGEN_3D & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double _maxElementVolume;
|
||||||
|
|
||||||
|
const StdMeshers_MaxElementVolume* _hypMaxElementVolume;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
85
src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : NETGENPlugin_NETGEN_3D_i.cxx
|
||||||
|
// Moved here from SMESH_NETGEN_3D_i.cxx
|
||||||
|
// Author : Nadir Bouhamou CEA
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "NETGENPlugin_NETGEN_3D_i.hxx"
|
||||||
|
#include "SMESH_Gen.hxx"
|
||||||
|
|
||||||
|
#include "Utils_CorbaException.hxx"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i
|
||||||
|
*
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA,
|
||||||
|
int theStudyId,
|
||||||
|
::SMESH_Gen* theGenImpl )
|
||||||
|
: SALOME::GenericObj_i( thePOA ),
|
||||||
|
SMESH_Hypothesis_i( thePOA ),
|
||||||
|
SMESH_Algo_i( thePOA ),
|
||||||
|
SMESH_3D_Algo_i( thePOA )
|
||||||
|
{
|
||||||
|
MESSAGE( "NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i" );
|
||||||
|
myBaseImpl = new ::NETGENPlugin_NETGEN_3D( theGenImpl->GetANewId(),
|
||||||
|
theStudyId,
|
||||||
|
theGenImpl );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i
|
||||||
|
*
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i()
|
||||||
|
{
|
||||||
|
MESSAGE( "NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i" );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
* NETGENPlugin_NETGEN_3D_i::GetImpl
|
||||||
|
*
|
||||||
|
* Get implementation
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
::NETGENPlugin_NETGEN_3D* NETGENPlugin_NETGEN_3D_i::GetImpl()
|
||||||
|
{
|
||||||
|
MESSAGE( "NETGENPlugin_NETGEN_3D_i::GetImpl" );
|
||||||
|
return ( ::NETGENPlugin_NETGEN_3D* )myBaseImpl;
|
||||||
|
}
|
||||||
|
|
58
src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : NETGENPlugin_NETGEN_3D_i.hxx
|
||||||
|
// Moved here from SMESH_NETGEN_3D_i.hxx
|
||||||
|
// Author : Nadir Bouhamou CEA
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _NETGENPlugin_NETGEN_3D_I_HXX_
|
||||||
|
#define _NETGENPlugin_NETGEN_3D_I_HXX_
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_NetgenAlgorithm)
|
||||||
|
|
||||||
|
#include "SMESH_3D_Algo_i.hxx"
|
||||||
|
#include "NETGENPlugin_NETGEN_3D.hxx"
|
||||||
|
|
||||||
|
// ======================================================
|
||||||
|
// NETGEN 3d algorithm
|
||||||
|
// ======================================================
|
||||||
|
class NETGENPlugin_NETGEN_3D_i:
|
||||||
|
public virtual POA_NETGENPlugin::NETGENPlugin_NETGEN_3D,
|
||||||
|
public virtual SMESH_3D_Algo_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA,
|
||||||
|
int theStudyId,
|
||||||
|
::SMESH_Gen* theGenImpl );
|
||||||
|
// Destructor
|
||||||
|
virtual ~NETGENPlugin_NETGEN_3D_i();
|
||||||
|
|
||||||
|
// Get implementation
|
||||||
|
::NETGENPlugin_NETGEN_3D* GetImpl();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
60
src/NETGENPlugin/NETGENPlugin_i.cxx
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// SMESH NETGENPlugin : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : NETGENPlugin.cxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "SMESH_Hypothesis_i.hxx"
|
||||||
|
#include "SMESH_Gen_i.hxx"
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include "NETGENPlugin_NETGEN_3D_i.hxx"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName)
|
||||||
|
{
|
||||||
|
MESSAGE("GetHypothesisCreator " << aHypName);
|
||||||
|
|
||||||
|
GenericHypothesisCreator_i* aCreator = 0;
|
||||||
|
|
||||||
|
// Hypotheses
|
||||||
|
|
||||||
|
// Algorithms
|
||||||
|
if (strcmp(aHypName, "NETGEN_3D") == 0)
|
||||||
|
aCreator = new HypothesisCreator_i<NETGENPlugin_NETGEN_3D_i>;
|
||||||
|
else ;
|
||||||
|
|
||||||
|
return aCreator;
|
||||||
|
}
|
||||||
|
}
|
20
src/NETGENPlugin/NETGENPlugin_icons.po
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# This is a Qt message file in .po format. Each msgid starts with
|
||||||
|
# a scope. This scope should *NOT* be translated - eg. "Foo::Bar"
|
||||||
|
# would be translated to "Pub", not "Foo::Pub".
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
|
"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n"
|
||||||
|
"PO-Revision-Date: YYYY-MM-DD\n"
|
||||||
|
"Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Content-Type: text/plain; charset=iso-8859-1\n"
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# ObjectBrowser
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
#mesh_tree_algo_netgen
|
||||||
|
msgid "ICON_SMESH_TREE_ALGO_NETGEN_3D"
|
||||||
|
msgstr "mesh_tree_algo_tetra.png"
|
||||||
|
#msgstr "mesh_tree_algo_netgen.png"
|
357
src/OBJECT/SMESH_DeviceActor.cxx
Normal file
@ -0,0 +1,357 @@
|
|||||||
|
// SMESH OBJECT : interactive object for SMESH visualization
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Actor.cxx
|
||||||
|
// Author : Nicolas REJNERI
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
|
||||||
|
#include "SMESH_DeviceActor.h"
|
||||||
|
|
||||||
|
#include "SALOME_Transform.h"
|
||||||
|
#include "SALOME_TransformFilter.h"
|
||||||
|
#include "SALOME_PassThroughFilter.h"
|
||||||
|
#include "SALOME_ExtractUnstructuredGrid.h"
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
// VTK Includes
|
||||||
|
#include <vtkObjectFactory.h>
|
||||||
|
#include <vtkShrinkFilter.h>
|
||||||
|
#include <vtkShrinkPolyData.h>
|
||||||
|
|
||||||
|
#include <vtkProperty.h>
|
||||||
|
#include <vtkPolyData.h>
|
||||||
|
#include <vtkMergeFilter.h>
|
||||||
|
#include <vtkPolyDataMapper.h>
|
||||||
|
#include <vtkUnstructuredGrid.h>
|
||||||
|
|
||||||
|
#ifdef _DEBUG_
|
||||||
|
static int MYDEBUG = 0;
|
||||||
|
static int MYDEBUGWITHFILES = 0;
|
||||||
|
#else
|
||||||
|
static int MYDEBUG = 0;
|
||||||
|
static int MYDEBUGWITHFILES = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
vtkStandardNewMacro(SMESH_DeviceActor);
|
||||||
|
|
||||||
|
|
||||||
|
SMESH_DeviceActor::SMESH_DeviceActor(){
|
||||||
|
if(MYDEBUG) MESSAGE("SMESH_DeviceActor");
|
||||||
|
myIsShrunk = false;
|
||||||
|
myIsShrinkable = false;
|
||||||
|
myRepresentation = eSurface;
|
||||||
|
|
||||||
|
myProperty = vtkProperty::New();
|
||||||
|
myMapper = vtkPolyDataMapper::New();
|
||||||
|
|
||||||
|
vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
|
||||||
|
myPolygonOffsetUnits);
|
||||||
|
//myMapper->SetResolveCoincidentTopologyToShiftZBuffer();
|
||||||
|
//myMapper->SetResolveCoincidentTopologyZShift(0.02);
|
||||||
|
|
||||||
|
myMapper->UseLookupTableScalarRangeOn();
|
||||||
|
myMapper->SetColorModeToMapScalars();
|
||||||
|
|
||||||
|
myShrinkFilter = vtkShrinkFilter::New();
|
||||||
|
|
||||||
|
myExtractUnstructuredGrid = SALOME_ExtractUnstructuredGrid::New();
|
||||||
|
myExtractUnstructuredGrid->SetStoreMapping(true);
|
||||||
|
|
||||||
|
myMergeFilter = vtkMergeFilter::New();
|
||||||
|
|
||||||
|
myStoreMapping = false;
|
||||||
|
myGeomFilter = SALOME_GeometryFilter::New();
|
||||||
|
|
||||||
|
myTransformFilter = SALOME_TransformFilter::New();
|
||||||
|
|
||||||
|
for(int i = 0; i < 6; i++)
|
||||||
|
myPassFilter.push_back(SALOME_PassThroughFilter::New());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SMESH_DeviceActor::~SMESH_DeviceActor(){
|
||||||
|
if(MYDEBUG) MESSAGE("~SMESH_DeviceActor");
|
||||||
|
myProperty->Delete();
|
||||||
|
|
||||||
|
myMapper->RemoveAllInputs();
|
||||||
|
myMapper->Delete();
|
||||||
|
|
||||||
|
myShrinkFilter->UnRegisterAllOutputs();
|
||||||
|
myShrinkFilter->Delete();
|
||||||
|
|
||||||
|
myExtractUnstructuredGrid->UnRegisterAllOutputs();
|
||||||
|
myExtractUnstructuredGrid->Delete();
|
||||||
|
|
||||||
|
myMergeFilter->UnRegisterAllOutputs();
|
||||||
|
myMergeFilter->Delete();
|
||||||
|
|
||||||
|
myGeomFilter->UnRegisterAllOutputs();
|
||||||
|
myGeomFilter->Delete();
|
||||||
|
|
||||||
|
myTransformFilter->UnRegisterAllOutputs();
|
||||||
|
myTransformFilter->Delete();
|
||||||
|
|
||||||
|
for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){
|
||||||
|
myPassFilter[i]->UnRegisterAllOutputs();
|
||||||
|
myPassFilter[i]->Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetStoreMapping(int theStoreMapping){
|
||||||
|
myStoreMapping = theStoreMapping;
|
||||||
|
Modified();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){
|
||||||
|
if(theGrid){
|
||||||
|
//myIsShrinkable = theGrid->GetNumberOfCells() > 10;
|
||||||
|
myIsShrinkable = true;
|
||||||
|
|
||||||
|
myExtractUnstructuredGrid->SetInput(theGrid);
|
||||||
|
myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput());
|
||||||
|
|
||||||
|
theGrid = static_cast<vtkUnstructuredGrid*>(myMergeFilter->GetOutput());
|
||||||
|
|
||||||
|
int anId = 0;
|
||||||
|
myPassFilter.at( anId )->SetInput( theGrid );
|
||||||
|
myPassFilter.at( anId + 1)->SetInput( myPassFilter.at( anId )->GetOutput() );
|
||||||
|
|
||||||
|
anId++; // 1
|
||||||
|
myGeomFilter->SetStoreMapping( myStoreMapping );
|
||||||
|
myGeomFilter->SetInput( myPassFilter.at( anId )->GetOutput() );
|
||||||
|
|
||||||
|
anId++; // 2
|
||||||
|
myPassFilter.at( anId )->SetInput( myGeomFilter->GetOutput() );
|
||||||
|
myPassFilter.at( anId + 1 )->SetInput( myPassFilter.at( anId )->GetOutput() );
|
||||||
|
|
||||||
|
anId++; // 3
|
||||||
|
myTransformFilter->SetInput( myPassFilter.at( anId )->GetPolyDataOutput() );
|
||||||
|
|
||||||
|
anId++; // 4
|
||||||
|
myPassFilter.at( anId )->SetInput( myTransformFilter->GetOutput() );
|
||||||
|
myPassFilter.at( anId + 1 )->SetInput( myPassFilter.at( anId )->GetOutput() );
|
||||||
|
|
||||||
|
anId++; // 5
|
||||||
|
myMapper->SetInput( myPassFilter.at( anId )->GetPolyDataOutput() );
|
||||||
|
|
||||||
|
vtkLODActor::SetMapper( myMapper );
|
||||||
|
Modified();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SALOME_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){
|
||||||
|
return myExtractUnstructuredGrid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){
|
||||||
|
myExtractUnstructuredGrid->Update();
|
||||||
|
return myExtractUnstructuredGrid->GetOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vtkMergeFilter* SMESH_DeviceActor::GetMergeFilter(){
|
||||||
|
return myMergeFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vtkPolyData* SMESH_DeviceActor::GetPolyDataInput(){
|
||||||
|
return myPassFilter.back()->GetPolyDataOutput();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long int SMESH_DeviceActor::GetMTime(){
|
||||||
|
unsigned long mTime = this->Superclass::GetMTime();
|
||||||
|
mTime = max(mTime,myExtractUnstructuredGrid->GetMTime());
|
||||||
|
mTime = max(mTime,myMergeFilter->GetMTime());
|
||||||
|
mTime = max(mTime,myGeomFilter->GetMTime());
|
||||||
|
mTime = max(mTime,myTransformFilter->GetMTime());
|
||||||
|
return mTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetTransform(SALOME_Transform* theTransform){
|
||||||
|
myTransformFilter->SetTransform(theTransform);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetShrink()
|
||||||
|
{
|
||||||
|
if ( !myIsShrinkable ) return;
|
||||||
|
if ( vtkDataSet* aDataSet = myPassFilter.at( 0 )->GetOutput() )
|
||||||
|
{
|
||||||
|
myShrinkFilter->SetInput( aDataSet );
|
||||||
|
myPassFilter.at( 1 )->SetInput( myShrinkFilter->GetOutput() );
|
||||||
|
myIsShrunk = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::UnShrink()
|
||||||
|
{
|
||||||
|
if ( !myIsShrunk ) return;
|
||||||
|
if ( vtkDataSet* aDataSet = myPassFilter.at( 0 )->GetOutput() )
|
||||||
|
{
|
||||||
|
myPassFilter.at( 1 )->SetInput( aDataSet );
|
||||||
|
myPassFilter.at( 1 )->Modified();
|
||||||
|
myIsShrunk = false;
|
||||||
|
Modified();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){
|
||||||
|
switch(theMode){
|
||||||
|
case ePoint:
|
||||||
|
myGeomFilter->SetInside(true);
|
||||||
|
GetProperty()->SetRepresentation(0);
|
||||||
|
break;
|
||||||
|
case eInsideframe:
|
||||||
|
myGeomFilter->SetInside(true);
|
||||||
|
GetProperty()->SetRepresentation(1);
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
GetProperty()->SetRepresentation(theMode);
|
||||||
|
myGeomFilter->SetInside(false);
|
||||||
|
}
|
||||||
|
myRepresentation = theMode;
|
||||||
|
myMapper->Modified();
|
||||||
|
Modified();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetVisibility(int theMode){
|
||||||
|
if(!myExtractUnstructuredGrid->GetInput() || GetUnstructuredGrid()->GetNumberOfCells()){
|
||||||
|
vtkLODActor::SetVisibility(theMode);
|
||||||
|
}else{
|
||||||
|
vtkLODActor::SetVisibility(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SMESH_DeviceActor::GetVisibility(){
|
||||||
|
if(!GetUnstructuredGrid()->GetNumberOfCells()){
|
||||||
|
vtkLODActor::SetVisibility(false);
|
||||||
|
}
|
||||||
|
return vtkLODActor::GetVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SMESH_DeviceActor::GetObjId(int theVtkID){
|
||||||
|
if (GetRepresentation() == ePoint){
|
||||||
|
return GetNodeObjId(theVtkID);
|
||||||
|
}else{
|
||||||
|
return GetElemObjId(theVtkID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SMESH_DeviceActor::TVectorId SMESH_DeviceActor::GetVtkId(int theObjID){
|
||||||
|
if (GetRepresentation() == ePoint){
|
||||||
|
return GetNodeVtkId(theObjID);
|
||||||
|
}else{
|
||||||
|
return GetElemVtkId(theObjID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SMESH_DeviceActor::GetNodeObjId(int theVtkID){
|
||||||
|
vtkIdType aRetID = myVisualObj->GetNodeObjId(theVtkID);
|
||||||
|
if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<<theVtkID<<"; aRetID = "<<aRetID);
|
||||||
|
return aRetID;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESH_DeviceActor::TVectorId SMESH_DeviceActor::GetNodeVtkId(int theObjID){
|
||||||
|
SMESH_DeviceActor::TVectorId aVecId;
|
||||||
|
vtkIdType anID = myVisualObj->GetNodeVTKId(theObjID);
|
||||||
|
if(anID < 0)
|
||||||
|
return aVecId;
|
||||||
|
aVecId.push_back(anID);
|
||||||
|
return aVecId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SMESH_DeviceActor::GetElemObjId(int theVtkID){
|
||||||
|
vtkIdType aGridID = myGeomFilter->GetObjId(theVtkID);
|
||||||
|
if(aGridID < 0)
|
||||||
|
return -1;
|
||||||
|
vtkIdType anExtractID = myExtractUnstructuredGrid->GetOutId(aGridID);
|
||||||
|
if(anExtractID < 0)
|
||||||
|
return -1;
|
||||||
|
vtkIdType aRetID = myVisualObj->GetElemObjId(anExtractID);
|
||||||
|
if(MYDEBUG)
|
||||||
|
MESSAGE("GetElemObjId - theVtkID = "<<theVtkID<<"; anExtractID = "<<anExtractID<<"; aGridID = "<<aGridID<<"; aRetID = "<<aRetID);
|
||||||
|
return aRetID;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESH_DeviceActor::TVectorId SMESH_DeviceActor::GetElemVtkId(int theObjID){
|
||||||
|
TVectorId aVecId;
|
||||||
|
vtkIdType aGridID = myVisualObj->GetElemVTKId(theObjID);
|
||||||
|
if(aGridID < 0)
|
||||||
|
return aVecId;
|
||||||
|
aVecId = myGeomFilter->GetVtkId(aGridID);
|
||||||
|
if(MYDEBUG)
|
||||||
|
MESSAGE("GetElemVtkId - theObjID = "<<theObjID<<"; aGridID = "<<aGridID<<"; aGridID = "<<aGridID<<"; aVecId[0] = "<<aVecId[0]);
|
||||||
|
return aVecId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float SMESH_DeviceActor::GetShrinkFactor(){
|
||||||
|
return myShrinkFilter->GetShrinkFactor();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetShrinkFactor(float theValue){
|
||||||
|
theValue = theValue > 0.1? theValue: 0.8;
|
||||||
|
myShrinkFilter->SetShrinkFactor(theValue);
|
||||||
|
Modified();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::Render(vtkRenderer *ren, vtkMapper* m){
|
||||||
|
int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
|
||||||
|
float aFactor, aUnit;
|
||||||
|
vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit);
|
||||||
|
|
||||||
|
vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
|
||||||
|
vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
|
||||||
|
myPolygonOffsetUnits);
|
||||||
|
vtkLODActor::Render(ren,m);
|
||||||
|
|
||||||
|
vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit);
|
||||||
|
vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SMESH_DeviceActor::SetPolygonOffsetParameters(float factor, float units){
|
||||||
|
myPolygonOffsetFactor = factor;
|
||||||
|
myPolygonOffsetUnits = units;
|
||||||
|
}
|
||||||
|
|
133
src/OBJECT/SMESH_DeviceActor.h
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
// SMESH OBJECT : interactive object for SMESH visualization
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Actor.h
|
||||||
|
// Author : Nicolas REJNERI
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef SMESH_DEVICE_ACTOR_H
|
||||||
|
#define SMESH_DEVICE_ACTOR_H
|
||||||
|
|
||||||
|
#include "SALOME_GeometryFilter.h"
|
||||||
|
#include "SMESH_Object.h"
|
||||||
|
|
||||||
|
#include <vtkLODActor.h>
|
||||||
|
|
||||||
|
class vtkProperty;
|
||||||
|
class vtkMergeFilter;
|
||||||
|
class vtkShrinkFilter;
|
||||||
|
class vtkPolyDataMapper;
|
||||||
|
class vtkUnstructuredGrid;
|
||||||
|
|
||||||
|
class SALOME_Transform;
|
||||||
|
class SALOME_TransformFilter;
|
||||||
|
class SALOME_PassThroughFilter;
|
||||||
|
class SALOME_ExtractUnstructuredGrid;
|
||||||
|
|
||||||
|
|
||||||
|
class SMESH_DeviceActor: public vtkLODActor{
|
||||||
|
friend class SMESH_Actor;
|
||||||
|
|
||||||
|
public:
|
||||||
|
vtkTypeMacro(SMESH_DeviceActor,vtkLODActor);
|
||||||
|
static SMESH_DeviceActor* New();
|
||||||
|
|
||||||
|
void SetStoreMapping(int theStoreMapping);
|
||||||
|
int GetStoreMapping(){ return myStoreMapping;}
|
||||||
|
|
||||||
|
typedef SALOME_GeometryFilter::TVectorId TVectorId;
|
||||||
|
int GetObjId(int theVtkID);
|
||||||
|
TVectorId GetVtkId(int theObjID);
|
||||||
|
|
||||||
|
int GetNodeObjId(int theVtkID);
|
||||||
|
TVectorId GetNodeVtkId(int theObjID);
|
||||||
|
|
||||||
|
int GetElemObjId(int theVtkID);
|
||||||
|
TVectorId GetElemVtkId(int theObjID);
|
||||||
|
|
||||||
|
vtkPolyData* GetPolyDataInput();
|
||||||
|
|
||||||
|
virtual void SetTransform(SALOME_Transform* theTransform);
|
||||||
|
virtual unsigned long int GetMTime();
|
||||||
|
|
||||||
|
float GetShrinkFactor();
|
||||||
|
void SetShrinkFactor(float value);
|
||||||
|
|
||||||
|
bool IsShrunkable() { return myIsShrinkable;}
|
||||||
|
bool IsShrunk() { return myIsShrunk;}
|
||||||
|
void SetShrink();
|
||||||
|
void UnShrink();
|
||||||
|
|
||||||
|
enum EReperesent { ePoint, eWireframe, eSurface, eInsideframe};
|
||||||
|
EReperesent GetRepresentation(){ return myRepresentation;}
|
||||||
|
void SetRepresentation(EReperesent theMode);
|
||||||
|
|
||||||
|
virtual void SetVisibility(int theMode);
|
||||||
|
virtual int GetVisibility();
|
||||||
|
|
||||||
|
SALOME_ExtractUnstructuredGrid* GetExtractUnstructuredGrid();
|
||||||
|
vtkUnstructuredGrid* GetUnstructuredGrid();
|
||||||
|
vtkMergeFilter* GetMergeFilter();
|
||||||
|
|
||||||
|
virtual void Render(vtkRenderer *, vtkMapper *);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void SetUnstructuredGrid(vtkUnstructuredGrid* theGrid);
|
||||||
|
|
||||||
|
vtkPolyDataMapper *myMapper;
|
||||||
|
TVisualObjPtr myVisualObj;
|
||||||
|
|
||||||
|
vtkProperty *myProperty;
|
||||||
|
EReperesent myRepresentation;
|
||||||
|
|
||||||
|
vtkMergeFilter* myMergeFilter;
|
||||||
|
SALOME_ExtractUnstructuredGrid* myExtractUnstructuredGrid;
|
||||||
|
|
||||||
|
bool myStoreMapping;
|
||||||
|
SALOME_GeometryFilter *myGeomFilter;
|
||||||
|
SALOME_TransformFilter *myTransformFilter;
|
||||||
|
std::vector<SALOME_PassThroughFilter*> myPassFilter;
|
||||||
|
|
||||||
|
vtkShrinkFilter* myShrinkFilter;
|
||||||
|
bool myIsShrinkable;
|
||||||
|
bool myIsShrunk;
|
||||||
|
|
||||||
|
float myPolygonOffsetFactor;
|
||||||
|
float myPolygonOffsetUnits;
|
||||||
|
|
||||||
|
void SetPolygonOffsetParameters(float factor, float units);
|
||||||
|
void GetPolygonOffsetParameters(float& factor, float& units){
|
||||||
|
factor = myPolygonOffsetFactor;
|
||||||
|
units = myPolygonOffsetUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESH_DeviceActor();
|
||||||
|
~SMESH_DeviceActor();
|
||||||
|
SMESH_DeviceActor(const SMESH_DeviceActor&) {};
|
||||||
|
void operator=(const SMESH_DeviceActor&) {};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //SMESH_ACTOR_H
|
1037
src/OBJECT/SMESH_Object.cxx
Normal file
207
src/OBJECT/SMESH_Object.h
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
// SMESH OBJECT : interactive object for SMESH visualization
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Object.h
|
||||||
|
// Author : Nicolas REJNERI
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef SMESH_OBJECT_H
|
||||||
|
#define SMESH_OBJECT_H
|
||||||
|
|
||||||
|
// IDL Headers
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Mesh)
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Group)
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Filter)
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <list>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <vtkSystemIncludes.h>
|
||||||
|
|
||||||
|
class vtkUnstructuredGrid;
|
||||||
|
class vtkPoints;
|
||||||
|
class SALOME_ExtractUnstructuredGrid;
|
||||||
|
|
||||||
|
class SMESH_Actor;
|
||||||
|
class SMDS_Mesh;
|
||||||
|
class SMDS_MeshNode;
|
||||||
|
class SMDS_MeshElement;
|
||||||
|
|
||||||
|
class SMESH_VisualObj;
|
||||||
|
typedef boost::shared_ptr<SMESH_VisualObj> TVisualObjPtr;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_VisualObj
|
||||||
|
Description : Base class for all mesh objects to be visuilised
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESH_VisualObj
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
typedef std::list<const SMDS_MeshElement*> TEntityList;
|
||||||
|
typedef std::map<vtkIdType,vtkIdType> TMapOfIds;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESH_VisualObj();
|
||||||
|
virtual ~SMESH_VisualObj();
|
||||||
|
|
||||||
|
virtual void Update( int theIsClear = true ) = 0;
|
||||||
|
virtual void UpdateFunctor( SMESH::Functor_ptr theFunctor ) = 0;
|
||||||
|
virtual int GetElemDimension( const int theObjId ) = 0;
|
||||||
|
|
||||||
|
virtual int GetNbEntities( const SMESH::ElementType) const = 0;
|
||||||
|
virtual int GetEntities( const SMESH::ElementType, TEntityList& ) const = 0;
|
||||||
|
virtual bool IsNodePrs() const = 0;
|
||||||
|
|
||||||
|
vtkUnstructuredGrid* GetUnstructuredGrid() { return myGrid; }
|
||||||
|
|
||||||
|
vtkIdType GetNodeObjId( int theVTKID );
|
||||||
|
vtkIdType GetNodeVTKId( int theObjID );
|
||||||
|
vtkIdType GetElemObjId( int theVTKID );
|
||||||
|
vtkIdType GetElemVTKId( int theObjID );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void createPoints( vtkPoints* );
|
||||||
|
void buildPrs();
|
||||||
|
void buildNodePrs();
|
||||||
|
void buildElemPrs();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
TMapOfIds mySMDS2VTKNodes;
|
||||||
|
TMapOfIds myVTK2SMDSNodes;
|
||||||
|
TMapOfIds mySMDS2VTKElems;
|
||||||
|
TMapOfIds myVTK2SMDSElems;
|
||||||
|
|
||||||
|
vtkUnstructuredGrid* myGrid;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_MeshObj
|
||||||
|
Description : Class for visualisation of mesh
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESH_MeshObj: public SMESH_VisualObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
SMESH_MeshObj( SMESH::SMESH_Mesh_ptr );
|
||||||
|
virtual ~SMESH_MeshObj();
|
||||||
|
|
||||||
|
virtual void Update( int theIsClear = true );
|
||||||
|
|
||||||
|
virtual int GetNbEntities( const SMESH::ElementType) const;
|
||||||
|
virtual int GetEntities( const SMESH::ElementType, TEntityList& ) const;
|
||||||
|
virtual bool IsNodePrs() const;
|
||||||
|
|
||||||
|
virtual int GetElemDimension( const int theObjId );
|
||||||
|
|
||||||
|
virtual void UpdateFunctor( SMESH::Functor_ptr f );
|
||||||
|
|
||||||
|
SMESH::SMESH_Mesh_ptr GetMeshServer() { return myMeshServer.in(); }
|
||||||
|
SMDS_Mesh* GetMesh() { return myMesh; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
SMESH::SMESH_Mesh_var myMeshServer;
|
||||||
|
SMDS_Mesh* myMesh;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_SubMeshObj
|
||||||
|
Description : Base class for visualisation of submeshes and groups
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESH_SubMeshObj: public SMESH_VisualObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
SMESH_SubMeshObj(SMESH_MeshObj* theMeshObj);
|
||||||
|
virtual ~SMESH_SubMeshObj();
|
||||||
|
|
||||||
|
virtual void Update( int theIsClear = true );
|
||||||
|
|
||||||
|
virtual void UpdateFunctor( SMESH::Functor_ptr );
|
||||||
|
virtual int GetElemDimension( const int theObjId );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
SMESH_MeshObj* myMeshObj;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_GroupObj
|
||||||
|
Description : Class for visualisation of groups
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESH_GroupObj: public SMESH_SubMeshObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SMESH_GroupObj( SMESH::SMESH_Group_ptr, SMESH_MeshObj* );
|
||||||
|
virtual ~SMESH_GroupObj();
|
||||||
|
|
||||||
|
virtual int GetNbEntities( const SMESH::ElementType) const;
|
||||||
|
virtual int GetEntities( const SMESH::ElementType, TEntityList& ) const;
|
||||||
|
virtual bool IsNodePrs() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
SMESH::SMESH_Group_var myGroupServer;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_subMeshObj
|
||||||
|
Description : Class for visualisation of submeshes
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESH_subMeshObj : public SMESH_SubMeshObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr,
|
||||||
|
SMESH_MeshObj* );
|
||||||
|
virtual ~SMESH_subMeshObj();
|
||||||
|
|
||||||
|
virtual int GetNbEntities( const SMESH::ElementType) const;
|
||||||
|
virtual int GetEntities( const SMESH::ElementType, TEntityList& ) const;
|
||||||
|
virtual bool IsNodePrs() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
SMESH::SMESH_subMesh_var mySubMeshServer;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
55
src/SMESH/SMESH_Group.cxx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Group.cxx
|
||||||
|
// Author : Michael Sazonov (OCC)
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#include <SMESH_Group.hxx>
|
||||||
|
#include <SMESH_Mesh.hxx>
|
||||||
|
#include <SMESHDS_Group.hxx>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESH_Group::SMESH_Group (const SMESH_Mesh* theMesh,
|
||||||
|
const SMDSAbs_ElementType theType,
|
||||||
|
const char* theName)
|
||||||
|
: myName(theName)
|
||||||
|
{
|
||||||
|
myGroupDS = new SMESHDS_Group (const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(), theType);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESH_Group::~SMESH_Group ()
|
||||||
|
{
|
||||||
|
delete myGroupDS;
|
||||||
|
}
|
64
src/SMESH/SMESH_Group.hxx
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Group.hxx
|
||||||
|
// Author : Michael Sazonov (OCC)
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_Group_HeaderFile
|
||||||
|
#define _SMESH_Group_HeaderFile
|
||||||
|
|
||||||
|
#include <SMDSAbs_ElementType.hxx>
|
||||||
|
#include <string>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class SMESHDS_Group;
|
||||||
|
class SMESH_Mesh;
|
||||||
|
|
||||||
|
class SMESH_Group
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
SMESH_Group (const SMESH_Mesh* theMesh,
|
||||||
|
const SMDSAbs_ElementType theType,
|
||||||
|
const char* theName);
|
||||||
|
~SMESH_Group ();
|
||||||
|
|
||||||
|
void SetName (const char* theName) { myName = theName; }
|
||||||
|
|
||||||
|
const char* GetName () const { return myName.c_str(); }
|
||||||
|
|
||||||
|
SMESHDS_Group * GetGroupDS () { return myGroupDS; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
SMESH_Group (const SMESH_Group& theOther);
|
||||||
|
// prohibited copy constructor
|
||||||
|
SMESH_Group& operator = (const SMESH_Group& theOther);
|
||||||
|
// prohibited assign operator
|
||||||
|
|
||||||
|
SMESHDS_Group * myGroupDS;
|
||||||
|
string myName;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
129
src/SMESHDS/SMESHDS_Group.cxx
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHDS_Group.cxx
|
||||||
|
// Author : Michael Sazonov, OCC
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#include <SMESHDS_Group.hxx>
|
||||||
|
#include <SMESHDS_Mesh.hxx>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESHDS_Group::SMESHDS_Group (const SMESHDS_Mesh* theMesh,
|
||||||
|
const SMDSAbs_ElementType theType)
|
||||||
|
: SMDS_MeshGroup(theMesh,theType), myStoreName(""),
|
||||||
|
myCurIndex(0), myCurID(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool SMESHDS_Group::Contains (const int theID) const
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* aElem = findInMesh (theID);
|
||||||
|
if (aElem)
|
||||||
|
return SMDS_MeshGroup::Contains(aElem);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool SMESHDS_Group::Add (const int theID)
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* aElem = findInMesh (theID);
|
||||||
|
if (!aElem || SMDS_MeshGroup::Contains(aElem))
|
||||||
|
return false;
|
||||||
|
SMDS_MeshGroup::Add (aElem);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool SMESHDS_Group::Remove (const int theID)
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* aElem = findInMesh (theID);
|
||||||
|
if (!aElem || !SMDS_MeshGroup::Contains(aElem))
|
||||||
|
return false;
|
||||||
|
SMDS_MeshGroup::Remove (aElem);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
int SMESHDS_Group::GetID (const int theIndex)
|
||||||
|
{
|
||||||
|
if (theIndex < 1 || theIndex > Extent())
|
||||||
|
return -1;
|
||||||
|
if (myCurIndex < 1 || myCurIndex > theIndex) {
|
||||||
|
InitIterator();
|
||||||
|
myCurIndex = 0;
|
||||||
|
myCurID = -1;
|
||||||
|
}
|
||||||
|
while (myCurIndex < theIndex && More()) {
|
||||||
|
myCurIndex++;
|
||||||
|
myCurID = Next()->GetID();
|
||||||
|
}
|
||||||
|
return myCurID;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
const SMDS_MeshElement* SMESHDS_Group::findInMesh (const int theID) const
|
||||||
|
{
|
||||||
|
SMDSAbs_ElementType aType = GetType();
|
||||||
|
const SMDS_MeshElement* aElem = NULL;
|
||||||
|
if (aType == SMDSAbs_Node) {
|
||||||
|
aElem = GetMesh()->FindNode(theID);
|
||||||
|
}
|
||||||
|
else if (aType != SMDSAbs_All) {
|
||||||
|
aElem = GetMesh()->FindElement(theID);
|
||||||
|
if (aElem && aType != aElem->GetType())
|
||||||
|
aElem = NULL;
|
||||||
|
}
|
||||||
|
return aElem;
|
||||||
|
}
|
72
src/SMESHDS/SMESHDS_Group.hxx
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
// SMESH SMESHDS : management of mesh data and SMESH document
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHDS_Group.hxx
|
||||||
|
// Author : Michael Sazonov (OCC)
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESHDS_Group_HeaderFile
|
||||||
|
#define _SMESHDS_Group_HeaderFile
|
||||||
|
|
||||||
|
#include <SMDS_MeshGroup.hxx>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class SMESHDS_Mesh;
|
||||||
|
|
||||||
|
class SMESHDS_Group : public SMDS_MeshGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
SMESHDS_Group (const SMESHDS_Mesh* theMesh,
|
||||||
|
const SMDSAbs_ElementType theType);
|
||||||
|
|
||||||
|
void SetStoreName (const char* theName)
|
||||||
|
{ myStoreName = theName; }
|
||||||
|
|
||||||
|
const char* GetStoreName () const
|
||||||
|
{ return myStoreName.c_str(); }
|
||||||
|
|
||||||
|
bool Contains (const int theID) const;
|
||||||
|
|
||||||
|
bool Add (const int theID);
|
||||||
|
bool Remove (const int theID);
|
||||||
|
|
||||||
|
int GetID (const int theIndex);
|
||||||
|
// use it for iterations 1..Extent() as alternative to parent's
|
||||||
|
// InitIterator(), More(), Next()
|
||||||
|
|
||||||
|
private:
|
||||||
|
SMESHDS_Group (const SMESHDS_Group& theOther);
|
||||||
|
// prohibited copy constructor
|
||||||
|
SMESHDS_Group& operator = (const SMESHDS_Group& theOther);
|
||||||
|
// prohibited assign operator
|
||||||
|
|
||||||
|
const SMDS_MeshElement* findInMesh (const int theID) const;
|
||||||
|
|
||||||
|
string myStoreName;
|
||||||
|
int myCurIndex;
|
||||||
|
int myCurID;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
4
src/SMESHGUI/SMESHBin.cxx
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
int main(int argc, char** argv){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
290
src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.cxx
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_CreateHypothesesDlg.cxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "SMESHGUI_CreateHypothesesDlg.h"
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
#include "SALOME_ListIteratorOfListIO.hxx"
|
||||||
|
|
||||||
|
#include "QAD_Application.h"
|
||||||
|
#include "QAD_Desktop.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qbuttongroup.h>
|
||||||
|
#include <qgroupbox.h>
|
||||||
|
#include <qpushbutton.h>
|
||||||
|
#include <qlayout.h>
|
||||||
|
#include <qlistview.h>
|
||||||
|
#include <qheader.h>
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_CreateHypothesesDlg()
|
||||||
|
// purpose : Constructs a SMESHGUI_CreateHypothesesDlg which is a child of 'parent', with the
|
||||||
|
// name 'name' and widget flags set to 'f'.
|
||||||
|
// The dialog will by default be modeless, unless you set 'modal' to
|
||||||
|
// TRUE to construct a modal dialog.
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_CreateHypothesesDlg::SMESHGUI_CreateHypothesesDlg (QWidget* parent,
|
||||||
|
const char* name,
|
||||||
|
bool modal,
|
||||||
|
bool isAlgo)
|
||||||
|
: QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ),
|
||||||
|
myIsAlgo( isAlgo )
|
||||||
|
{
|
||||||
|
MESSAGE("SMESHGUI_CreateHypothesesDlg");
|
||||||
|
|
||||||
|
if ( !name )
|
||||||
|
setName( "SMESHGUI_CreateHypothesesDlg" );
|
||||||
|
setCaption( isAlgo ? tr( "SMESH_CREATE_ALGORITHMS" ) : tr( "SMESH_CREATE_HYPOTHESES" ) );
|
||||||
|
setSizeGripEnabled( TRUE );
|
||||||
|
|
||||||
|
QGridLayout* SMESHGUI_CreateHypothesesDlgLayout = new QGridLayout( this );
|
||||||
|
SMESHGUI_CreateHypothesesDlgLayout->setSpacing( 6 );
|
||||||
|
SMESHGUI_CreateHypothesesDlgLayout->setMargin( 11 );
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
GroupAlgorithms = new QGroupBox( this, "GroupAlgorithms" );
|
||||||
|
GroupAlgorithms->setTitle( isAlgo ? tr("SMESH_AVAILABLE_ALGORITHMS") : tr("SMESH_AVAILABLE_HYPOTHESES") );
|
||||||
|
GroupAlgorithms->setColumnLayout(0, Qt::Vertical );
|
||||||
|
GroupAlgorithms->layout()->setSpacing( 0 );
|
||||||
|
GroupAlgorithms->layout()->setMargin( 0 );
|
||||||
|
|
||||||
|
QGridLayout* hypLayout = new QGridLayout( GroupAlgorithms->layout() );
|
||||||
|
hypLayout->setGeometry( QRect( 12, 18, 139, 250 ) );
|
||||||
|
hypLayout->setAlignment( Qt::AlignTop );
|
||||||
|
hypLayout->setSpacing( 6 );
|
||||||
|
hypLayout->setMargin( 11 );
|
||||||
|
|
||||||
|
ListAlgoDefinition = new QListView( GroupAlgorithms, "ListAlgoDefinition" );
|
||||||
|
ListAlgoDefinition->setMinimumSize( 400, 200 );
|
||||||
|
ListAlgoDefinition->addColumn("");
|
||||||
|
ListAlgoDefinition->header()->hide();
|
||||||
|
ListAlgoDefinition->setSelectionMode(QListView::Single);
|
||||||
|
ListAlgoDefinition->setResizeMode(QListView::AllColumns);
|
||||||
|
ListAlgoDefinition->setRootIsDecorated( true );
|
||||||
|
|
||||||
|
hypLayout->addWidget( ListAlgoDefinition, 0, 0 );
|
||||||
|
SMESHGUI_CreateHypothesesDlgLayout->addWidget( GroupAlgorithms, 0, 0 );
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
GroupButtons = new QGroupBox( this, "GroupButtons" );
|
||||||
|
GroupButtons->setColumnLayout( 0, Qt::Vertical );
|
||||||
|
GroupButtons->layout()->setSpacing( 0 );
|
||||||
|
GroupButtons->layout()->setMargin( 0 );
|
||||||
|
QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
|
||||||
|
GroupButtonsLayout->setAlignment( Qt::AlignTop );
|
||||||
|
GroupButtonsLayout->setSpacing( 6 );
|
||||||
|
GroupButtonsLayout->setMargin( 11 );
|
||||||
|
|
||||||
|
buttonApply = new QPushButton( GroupButtons, "buttonApply" );
|
||||||
|
buttonApply->setText( tr( "SMESH_BUT_CREATE" ) );
|
||||||
|
buttonApply->setAutoDefault( TRUE );
|
||||||
|
buttonApply->setDefault( FALSE );
|
||||||
|
buttonApply->setEnabled( FALSE ) ;
|
||||||
|
GroupButtonsLayout->addWidget( buttonApply, 0, 1 );
|
||||||
|
|
||||||
|
QSpacerItem* spacer_9 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
|
||||||
|
GroupButtonsLayout->addItem( spacer_9, 0, 2 );
|
||||||
|
|
||||||
|
buttonCancel = new QPushButton( GroupButtons, "buttonCancel" );
|
||||||
|
buttonCancel->setText( tr( "SMESH_BUT_CLOSE" ) );
|
||||||
|
buttonCancel->setAutoDefault( TRUE );
|
||||||
|
buttonCancel->setDefault( TRUE );
|
||||||
|
buttonCancel->setEnabled( TRUE ) ;
|
||||||
|
GroupButtonsLayout->addWidget( buttonCancel, 0, 3 );
|
||||||
|
|
||||||
|
SMESHGUI_CreateHypothesesDlgLayout->addWidget( GroupButtons, 1, 0 );
|
||||||
|
/***************************************************************/
|
||||||
|
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ~SMESHGUI_CreateHypothesesDlg()
|
||||||
|
// purpose : Destroys the object and frees any allocated resources
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_CreateHypothesesDlg::~SMESHGUI_CreateHypothesesDlg()
|
||||||
|
{
|
||||||
|
// no need to delete child widgets, Qt does it all for us
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : Init()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::Init()
|
||||||
|
{
|
||||||
|
mySMESHGUI = SMESHGUI::GetSMESHGUI() ;
|
||||||
|
mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ;
|
||||||
|
|
||||||
|
InitAlgoDefinition();
|
||||||
|
|
||||||
|
/* signals and slots connections */
|
||||||
|
connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ) ;
|
||||||
|
connect( buttonApply , SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ) ;
|
||||||
|
|
||||||
|
// connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ;
|
||||||
|
connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ;
|
||||||
|
|
||||||
|
connect( ListAlgoDefinition, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
|
||||||
|
connect( ListAlgoDefinition, SIGNAL( doubleClicked(QListViewItem*) ), this, SLOT( onDoubleClicked(QListViewItem*) ) );
|
||||||
|
|
||||||
|
int x, y ;
|
||||||
|
mySMESHGUI->DefineDlgPosition( this, x, y ) ;
|
||||||
|
this->move( x, y ) ;
|
||||||
|
this->show() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ClickOnCancel()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::ClickOnCancel()
|
||||||
|
{
|
||||||
|
close() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ClickOnApply()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::ClickOnApply()
|
||||||
|
{
|
||||||
|
QListViewItem* item = ListAlgoDefinition->selectedItem();
|
||||||
|
if ( !item )
|
||||||
|
return;
|
||||||
|
QString aHypType = item->text( 1 );
|
||||||
|
MESSAGE("Apply " << aHypType);
|
||||||
|
char* sHypType = (char*)aHypType.latin1();
|
||||||
|
|
||||||
|
HypothesisData* aHypData = mySMESHGUI->GetHypothesisData(sHypType);
|
||||||
|
if ( !aHypData )
|
||||||
|
return;
|
||||||
|
QString aClientLibName = aHypData->ClientLibName;
|
||||||
|
MESSAGE("Client lib name = " << aClientLibName);
|
||||||
|
|
||||||
|
if (aClientLibName == "")
|
||||||
|
{
|
||||||
|
// Call hypothesis creation server method (without GUI)
|
||||||
|
QString aHypName = aHypData->Label;
|
||||||
|
mySMESHGUI->CreateHypothesis(sHypType, aHypName, myIsAlgo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Get hypotheses creator client (GUI)
|
||||||
|
SMESHGUI_GenericHypothesisCreator* aCreator =
|
||||||
|
mySMESHGUI->GetHypothesisCreator(sHypType);
|
||||||
|
|
||||||
|
// Create hypothesis/algorithm
|
||||||
|
aCreator->CreateHypothesis(myIsAlgo, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// buttonApply->setEnabled(FALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ActivateThisDialog()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::ActivateThisDialog()
|
||||||
|
{
|
||||||
|
mySMESHGUI->EmitSignalDeactivateDialog() ;
|
||||||
|
GroupButtons->setEnabled(true) ;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : enterEvent()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::enterEvent(QEvent* e)
|
||||||
|
{
|
||||||
|
ActivateThisDialog() ;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : closeEvent()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::closeEvent( QCloseEvent* e )
|
||||||
|
{
|
||||||
|
mySMESHGUI->ResetState();
|
||||||
|
QDialog::closeEvent( e );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onSelectionChanged()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::onSelectionChanged()
|
||||||
|
{
|
||||||
|
QListViewItem* item = ListAlgoDefinition->selectedItem();
|
||||||
|
buttonApply->setEnabled( item && item->depth() > 0 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onDoubleClicked()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::onDoubleClicked(QListViewItem* i)
|
||||||
|
{
|
||||||
|
if ( i && i->depth() > 0 )
|
||||||
|
this->ClickOnApply();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : InitAlgoDefinition()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_CreateHypothesesDlg::InitAlgoDefinition()
|
||||||
|
{
|
||||||
|
ListAlgoDefinition->clear();
|
||||||
|
QStringList HypList = mySMESHGUI->GetAvailableHypotheses(myIsAlgo);
|
||||||
|
for ( int i = 0; i < HypList.count(); ++i ) {
|
||||||
|
HypothesisData* aHypData = mySMESHGUI->GetHypothesisData( HypList[i] );
|
||||||
|
QListViewItem* parentItem = 0;
|
||||||
|
QListViewItem* childItem = ListAlgoDefinition->firstChild();
|
||||||
|
while ( childItem ) {
|
||||||
|
if ( childItem->text(0) == aHypData->PluginName ) {
|
||||||
|
parentItem = childItem;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
childItem = childItem->nextSibling();
|
||||||
|
}
|
||||||
|
if ( !parentItem )
|
||||||
|
parentItem = new QListViewItem( ListAlgoDefinition, aHypData->PluginName );
|
||||||
|
parentItem->setOpen( true );
|
||||||
|
QListViewItem* aItem = new QListViewItem( parentItem, aHypData->Label, HypList[i] );
|
||||||
|
QPixmap aPixMap (QAD_Desktop::getResourceManager()->loadPixmap
|
||||||
|
("SMESH", tr(aHypData->IconId)));
|
||||||
|
if ( !aPixMap.isNull() )
|
||||||
|
aItem->setPixmap( 0, aPixMap );
|
||||||
|
}
|
||||||
|
}
|
97
src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_CreateHypothesesDlg.h
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef DIALOGBOX_CREATE_HYPOTHESES_H
|
||||||
|
#define DIALOGBOX_CREATE_HYPOTHESES_H
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qvariant.h>
|
||||||
|
#include <qdialog.h>
|
||||||
|
#include <qstringlist.h>
|
||||||
|
|
||||||
|
// IDL Headers
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(GEOM_Gen)
|
||||||
|
#include CORBA_SERVER_HEADER(GEOM_Shape)
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Mesh)
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class QButtonGroup;
|
||||||
|
class QGroupBox;
|
||||||
|
class QPushButton;
|
||||||
|
class QListView;
|
||||||
|
class QListViewItem;
|
||||||
|
class SMESHGUI;
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_CreateHypothesesDlg
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
class SMESHGUI_CreateHypothesesDlg : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_CreateHypothesesDlg (QWidget* parent = 0,
|
||||||
|
const char* name = 0,
|
||||||
|
bool modal = FALSE,
|
||||||
|
bool isAlgo = FALSE);
|
||||||
|
~SMESHGUI_CreateHypothesesDlg ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void Init() ;
|
||||||
|
void closeEvent( QCloseEvent* e ) ;
|
||||||
|
void enterEvent ( QEvent * ) ;
|
||||||
|
|
||||||
|
void InitAlgoDefinition();
|
||||||
|
|
||||||
|
SMESHGUI* mySMESHGUI;
|
||||||
|
bool myIsAlgo;
|
||||||
|
|
||||||
|
QGroupBox* GroupButtons;
|
||||||
|
QPushButton* buttonCancel;
|
||||||
|
QPushButton* buttonApply;
|
||||||
|
|
||||||
|
QGroupBox* GroupAlgorithms;
|
||||||
|
QListView* ListAlgoDefinition;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void ClickOnCancel();
|
||||||
|
void ClickOnApply();
|
||||||
|
void ActivateThisDialog() ;
|
||||||
|
|
||||||
|
void onSelectionChanged();
|
||||||
|
void onDoubleClicked(QListViewItem*);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIALOGBOX_CREATE_HYPOTHESES_H
|
114
src/SMESHGUI/SMESHGUI_Filter.cxx
Executable file
@ -0,0 +1,114 @@
|
|||||||
|
// SMESHGUI_Filter : Filters for VTK viewer
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_Filter.cxx
|
||||||
|
// Author : Sergey LITONIN
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
#include "SMESHGUI_Filter.h"
|
||||||
|
|
||||||
|
#include <vtkCell.h>
|
||||||
|
|
||||||
|
#include <gp_Vec.hxx>
|
||||||
|
#include <Precision.hxx>
|
||||||
|
#include "SMESH_Actor.h"
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
|
||||||
|
IMPLEMENT_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter)
|
||||||
|
IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_Filter, VTKViewer_Filter)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESHGUI_Filter
|
||||||
|
Description : Selection filter for VTK viewer. This class aggregate object
|
||||||
|
of SMESH_Filter class and uses it for verification of criterion
|
||||||
|
*/
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// name : SMESHGUI_Filter::SMESHGUI_Filter
|
||||||
|
// Purpose : Constructor
|
||||||
|
//=======================================================================
|
||||||
|
SMESHGUI_Filter::SMESHGUI_Filter()
|
||||||
|
{
|
||||||
|
myActor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESHGUI_Filter::~SMESHGUI_Filter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// name : SMESHGUI_Filter::IsValid
|
||||||
|
// Purpose : Verify whether entry id satisfies to criterion of the filter
|
||||||
|
//=======================================================================
|
||||||
|
bool SMESHGUI_Filter::IsValid( const int theCellId ) const
|
||||||
|
{
|
||||||
|
if ( myActor == 0 || myPred->_is_nil() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
|
||||||
|
|
||||||
|
int aMeshId = anActor->GetElemObjId( theCellId );
|
||||||
|
|
||||||
|
return myPred->IsSatisfy( aMeshId );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// name : SMESHGUI_Filter::SetPredicate
|
||||||
|
// Purpose : Set new pridicate to the filter
|
||||||
|
//=======================================================================
|
||||||
|
void SMESHGUI_Filter::SetPredicate( SMESH::Predicate_ptr thePred )
|
||||||
|
{
|
||||||
|
myPred = thePred;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// name : SMESHGUI_Filter::GetActor
|
||||||
|
// Purpose : Get actor of the filter
|
||||||
|
//=======================================================================
|
||||||
|
SALOME_Actor* SMESHGUI_Filter::GetActor() const
|
||||||
|
{
|
||||||
|
return myActor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// name : SMESHGUI_Filter::SetActor
|
||||||
|
// Purpose : Set new actor
|
||||||
|
//=======================================================================
|
||||||
|
void SMESHGUI_Filter::SetActor( SALOME_Actor* theActor )
|
||||||
|
{
|
||||||
|
if ( myActor == theActor )
|
||||||
|
return;
|
||||||
|
VTKViewer_Filter::SetActor( theActor );
|
||||||
|
|
||||||
|
if ( myActor != 0 && !myPred->_is_nil() )
|
||||||
|
{
|
||||||
|
Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
|
||||||
|
if ( !anIO.IsNull() )
|
||||||
|
{
|
||||||
|
Standard_Boolean aRes = false;
|
||||||
|
SMESH::SMESH_Mesh_ptr aMeshPtr = SMESHGUI::GetSMESHGUI()->ConvertIOinMesh( anIO, aRes );
|
||||||
|
if ( aRes )
|
||||||
|
myPred->SetMesh( aMeshPtr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
68
src/SMESHGUI/SMESHGUI_Filter.h
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
// SMESHGUI_Filter : Filters for VTK viewer
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_Filter.h
|
||||||
|
// Author : Sergey LITONIN
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
#ifndef SMESHGUI_Filter_HeaderFile
|
||||||
|
#define SMESHGUI_Filter_HeaderFile
|
||||||
|
|
||||||
|
#include "VTKViewer_Filter.h"
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Filter)
|
||||||
|
|
||||||
|
class SALOME_Actor;
|
||||||
|
|
||||||
|
|
||||||
|
DEFINE_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESHGUI_Filter
|
||||||
|
Description : Selection filter for VTK viewer
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESHGUI_Filter : public VTKViewer_Filter
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_Filter();
|
||||||
|
virtual ~SMESHGUI_Filter();
|
||||||
|
|
||||||
|
virtual bool IsValid( const int theCellId ) const;
|
||||||
|
|
||||||
|
virtual void SetActor( SALOME_Actor* );
|
||||||
|
SALOME_Actor* GetActor() const;
|
||||||
|
|
||||||
|
void SetPredicate( SMESH::Predicate_ptr );
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
SMESH::Predicate_var myPred;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DEFINE_STANDARD_RTTI(SMESHGUI_Filter)
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
1302
src/SMESHGUI/SMESHGUI_FilterDlg.cxx
Executable file
195
src/SMESHGUI/SMESHGUI_FilterDlg.h
Executable file
@ -0,0 +1,195 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_FilterDlg.h
|
||||||
|
// Author : Sergey LITONIN
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SMESHGUI_FilterDlg_H
|
||||||
|
#define SMESHGUI_FilterDlg_H
|
||||||
|
|
||||||
|
#include <qdialog.h>
|
||||||
|
#include <qmap.h>
|
||||||
|
#include <qvaluelist.h>
|
||||||
|
#include <SALOME_Selection.h>
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Filter)
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Mesh)
|
||||||
|
|
||||||
|
class QCloseEvent;
|
||||||
|
class QWidgetStack;
|
||||||
|
class QStringList;
|
||||||
|
class QTableItem;
|
||||||
|
class QFrame;
|
||||||
|
class QEvent;
|
||||||
|
class QPushButton;
|
||||||
|
class QTable;
|
||||||
|
class SALOME_Selection;
|
||||||
|
class SMESHGUI;
|
||||||
|
class QComboBox;
|
||||||
|
class QButtonGroup;
|
||||||
|
class QCheckBox;
|
||||||
|
class QGroupBox;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESHGUI_FilterDlg
|
||||||
|
Description : Dialog to specify filters for VTK viewer
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SMESHGUI_FilterDlg : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
class Table;
|
||||||
|
|
||||||
|
// Edge criteria
|
||||||
|
enum { FreeBorders = 0, MultiBorders, Length };
|
||||||
|
|
||||||
|
// Face criteria
|
||||||
|
enum { AspectRatio = 0, Warping, MinimumAngle, Taper, Skew, Area };
|
||||||
|
|
||||||
|
// Comparision
|
||||||
|
enum { LessThan = 0, MoreThan, EqualTo };
|
||||||
|
|
||||||
|
// Logical operations
|
||||||
|
enum { LO_And = 0, LO_Or, LO_Undefined };
|
||||||
|
|
||||||
|
// Source elements to be selected
|
||||||
|
enum { Mesh, Selection, Dialog, None };
|
||||||
|
|
||||||
|
typedef QMap<int, Table*> TableMap;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_FilterDlg( QWidget* parent,
|
||||||
|
const int type,
|
||||||
|
const bool theModal = true,
|
||||||
|
const char* name = 0 );
|
||||||
|
virtual ~SMESHGUI_FilterDlg();
|
||||||
|
|
||||||
|
void Init( const int type );
|
||||||
|
|
||||||
|
void SetSelection( SALOME_Selection* );
|
||||||
|
void SetMesh( SMESH::SMESH_Mesh_ptr );
|
||||||
|
void SetSourceWg( QWidget* );
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void onAddBtn();
|
||||||
|
void onRemoveBtn();
|
||||||
|
void onClearBtn();
|
||||||
|
void onCriterionChanged( int, int );
|
||||||
|
|
||||||
|
void onOk();
|
||||||
|
bool onApply();
|
||||||
|
void onClose();
|
||||||
|
void onDeactivate();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void closeEvent( QCloseEvent* e );
|
||||||
|
void enterEvent ( QEvent * );
|
||||||
|
|
||||||
|
void updateBtnState();
|
||||||
|
|
||||||
|
// dialog creation
|
||||||
|
QFrame* createButtonFrame( QWidget*, const bool );
|
||||||
|
QFrame* createMainFrame( QWidget* );
|
||||||
|
Table* createTable( QWidget*, const int );
|
||||||
|
QButtonGroup* createSourceGroup( QWidget* );
|
||||||
|
void addRow( Table*, const int );
|
||||||
|
QTableItem* getCriterionItem( QTable*, const int );
|
||||||
|
QTableItem* getCompareItem( QTable* );
|
||||||
|
QTableItem* getNotItem( QTable* );
|
||||||
|
QTableItem* getLogOpItem( QTable* );
|
||||||
|
const QStringList& getCriteria( const int theType ) const;
|
||||||
|
const QStringList& getCompare () const;
|
||||||
|
|
||||||
|
// query
|
||||||
|
int getCurrType() const;
|
||||||
|
int getCriterion( const int theType, const int theRow ) const;
|
||||||
|
|
||||||
|
// execution
|
||||||
|
bool isValid() const;
|
||||||
|
SMESH::Predicate_ptr createPredicate( const int theType );
|
||||||
|
void insertFilterInViewer( SMESH::Predicate_ptr thePred );
|
||||||
|
void selectInViewer( const int theType,
|
||||||
|
const QValueList<int>& theIds );
|
||||||
|
void filterSource( const int theType,
|
||||||
|
SMESH::Predicate_ptr thePred,
|
||||||
|
QValueList<int>& theResIds );
|
||||||
|
void filterSelectionSource( const int theType,
|
||||||
|
SMESH::Predicate_ptr thePred,
|
||||||
|
QValueList<int>& theResIds );
|
||||||
|
void getIdsFromWg( const QWidget*, QValueList<int>& ) const;
|
||||||
|
void setIdsToWg( QWidget*, const QValueList<int>& );
|
||||||
|
Selection_Mode getSelMode( const int ) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// widgets
|
||||||
|
QFrame* myMainFrame;
|
||||||
|
QGroupBox* myTableGrp;
|
||||||
|
|
||||||
|
TableMap myTables;
|
||||||
|
QPushButton* myAddBtn;
|
||||||
|
QPushButton* myRemoveBtn;
|
||||||
|
QPushButton* myClearBtn;
|
||||||
|
QButtonGroup* mySourceGrp;
|
||||||
|
QCheckBox* mySetInViewer;
|
||||||
|
|
||||||
|
QPushButton* myOkBtn;
|
||||||
|
QPushButton* myApplyBtn;
|
||||||
|
QPushButton* myCloseBtn;
|
||||||
|
|
||||||
|
// initial fields
|
||||||
|
int myType;
|
||||||
|
SMESHGUI* mySMESHGUI;
|
||||||
|
SALOME_Selection* mySelection;
|
||||||
|
SMESH::SMESH_Mesh_ptr myMesh;
|
||||||
|
QWidget* mySourceWg;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
977
src/SMESHGUI/SMESHGUI_GroupDlg.cxx
Normal file
@ -0,0 +1,977 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_GroupDlg.cxx
|
||||||
|
// Author : Natalia KOPNOVA
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "SMESHGUI_GroupDlg.h"
|
||||||
|
#include "SMESHGUI_FilterDlg.h"
|
||||||
|
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
#include "SALOMEGUI_QtCatchCorbaException.hxx"
|
||||||
|
#include "SALOME_ListIteratorOfListIO.hxx"
|
||||||
|
#include "VTKViewer_InteractorStyleSALOME.h"
|
||||||
|
#include "VTKViewer_ViewFrame.h"
|
||||||
|
#include "QAD_Application.h"
|
||||||
|
#include "QAD_Desktop.h"
|
||||||
|
#include "QAD_MessageBox.h"
|
||||||
|
#include "QAD_RightFrame.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include "SMESH_Actor.h"
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qbuttongroup.h>
|
||||||
|
#include <qgroupbox.h>
|
||||||
|
#include <qhbox.h>
|
||||||
|
#include <qlabel.h>
|
||||||
|
#include <qlineedit.h>
|
||||||
|
#include <qpushbutton.h>
|
||||||
|
#include <qradiobutton.h>
|
||||||
|
#include <qcheckbox.h>
|
||||||
|
#include <qlayout.h>
|
||||||
|
#include <qlistbox.h>
|
||||||
|
#include <qimage.h>
|
||||||
|
#include <qpixmap.h>
|
||||||
|
#include <qmemarray.h>
|
||||||
|
|
||||||
|
// STL includes
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_GroupDlg()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_Selection* theSel,
|
||||||
|
SMESH::SMESH_Mesh_ptr theMesh, bool modal, WFlags fl )
|
||||||
|
: QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose )
|
||||||
|
{
|
||||||
|
if ( !name ) setName( "SMESHGUI_GroupDlg" );
|
||||||
|
initDialog(theSel, true);
|
||||||
|
init(theMesh);
|
||||||
|
|
||||||
|
/* Move widget on the botton right corner of main widget */
|
||||||
|
int x, y ;
|
||||||
|
mySMESHGUI->DefineDlgPosition(this, x, y);
|
||||||
|
this->move(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_Selection* theSel,
|
||||||
|
SMESH::SMESH_Group_ptr theGroup, bool modal, WFlags fl )
|
||||||
|
: QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose )
|
||||||
|
{
|
||||||
|
if ( !name ) setName( "SMESHGUI_GroupDlg" );
|
||||||
|
initDialog(theSel, false);
|
||||||
|
init(theGroup);
|
||||||
|
|
||||||
|
/* Move widget on the botton right corner of main widget */
|
||||||
|
int x, y ;
|
||||||
|
mySMESHGUI->DefineDlgPosition(this, x, y);
|
||||||
|
this->move(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create)
|
||||||
|
{
|
||||||
|
myFilterDlg = 0;
|
||||||
|
|
||||||
|
QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT")));
|
||||||
|
|
||||||
|
if (create)
|
||||||
|
setCaption( tr( "SMESH_CREATE_GROUP_TITLE" ) );
|
||||||
|
else
|
||||||
|
setCaption( tr( "SMESH_EDIT_GROUP_TITLE" ) );
|
||||||
|
setSizeGripEnabled( TRUE );
|
||||||
|
|
||||||
|
QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
myTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Group types");
|
||||||
|
myTypeGroup->setTitle(tr("SMESH_ELEMENTS_TYPE"));
|
||||||
|
myTypeGroup->setExclusive(true);
|
||||||
|
|
||||||
|
QStringList types;
|
||||||
|
types.append(tr("MESH_NODE"));
|
||||||
|
types.append(tr("SMESH_EDGE"));
|
||||||
|
types.append(tr("SMESH_FACE"));
|
||||||
|
types.append(tr("SMESH_VOLUME"));
|
||||||
|
QRadioButton* rb;
|
||||||
|
for (int i = 0; i < types.count(); i++) {
|
||||||
|
rb = new QRadioButton(types[i], myTypeGroup);
|
||||||
|
}
|
||||||
|
myTypeGroup->setEnabled(create);
|
||||||
|
myTypeId = -1;
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QHBox* aNameBox = new QHBox(this, "name box");
|
||||||
|
QLabel* aName = new QLabel(aNameBox, "name label");
|
||||||
|
aName->setText(tr("SMESH_NAME"));
|
||||||
|
aName->setMinimumSize(50,0);
|
||||||
|
myName = new QLineEdit(aNameBox, "name");
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QGroupBox* aContentBox = new QGroupBox(1, Qt::Horizontal, this, "content box");
|
||||||
|
aContentBox->setTitle(tr("SMESH_CONTENT"));
|
||||||
|
QFrame* aContent = new QFrame(aContentBox, "content");
|
||||||
|
QGridLayout* aLayout = new QGridLayout(aContent, 7, 4);
|
||||||
|
aLayout->setSpacing(6);
|
||||||
|
aLayout->setAutoAdd(false);
|
||||||
|
|
||||||
|
QLabel* aLabel = new QLabel(aContent, "elements label");
|
||||||
|
aLabel->setText(tr("SMESH_ID_ELEMENTS"));
|
||||||
|
myElements = new QListBox(aContent, "elements list");
|
||||||
|
myElements->setSelectionMode(QListBox::Extended);
|
||||||
|
// myElements->setMinimumHeight(150);
|
||||||
|
|
||||||
|
myFilter = new QPushButton(aContent, "filter");
|
||||||
|
myFilter->setText(tr("SMESH_BUT_FILTER"));
|
||||||
|
QPushButton* aAddBtn = new QPushButton(aContent, "add");
|
||||||
|
aAddBtn->setText(tr("SMESH_BUT_ADD"));
|
||||||
|
QPushButton* aRemoveBtn = new QPushButton(aContent, "remove");
|
||||||
|
aRemoveBtn->setText(tr("SMESH_BUT_REMOVE"));
|
||||||
|
QPushButton* aSortBtn = new QPushButton(aContent, "sort");
|
||||||
|
aSortBtn->setText(tr("SMESH_BUT_SORT"));
|
||||||
|
|
||||||
|
aLayout->addWidget(aLabel, 0, 0);
|
||||||
|
aLayout->addMultiCellWidget(myElements, 1, 6, 0, 0);
|
||||||
|
aLayout->addWidget(myFilter, 1, 2);
|
||||||
|
aLayout->addWidget(aAddBtn, 3, 2);
|
||||||
|
aLayout->addWidget(aRemoveBtn, 4, 2);
|
||||||
|
aLayout->addWidget(aSortBtn, 6, 2);
|
||||||
|
|
||||||
|
aLayout->setColStretch(0, 1);
|
||||||
|
aLayout->addColSpacing(1, 20);
|
||||||
|
aLayout->addColSpacing(3, 20);
|
||||||
|
aLayout->setRowStretch(2, 1);
|
||||||
|
aLayout->setRowStretch(5, 1);
|
||||||
|
|
||||||
|
aContentBox->setMinimumHeight(aContent->sizeHint().height() +
|
||||||
|
aContentBox->sizeHint().height());
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QGroupBox* aSelectBox = new QGroupBox(3, Qt::Horizontal, this, "select box");
|
||||||
|
aSelectBox->setTitle(tr("SMESH_SELECT_FROM"));
|
||||||
|
|
||||||
|
mySelectSubMesh = new QCheckBox(aSelectBox, "submesh checkbox");
|
||||||
|
mySelectSubMesh->setText(tr("SMESH_SUBMESH"));
|
||||||
|
mySelectSubMesh->setMinimumSize(50, 0);
|
||||||
|
mySubMeshBtn = new QPushButton(aSelectBox, "submesh button");
|
||||||
|
mySubMeshBtn->setText("");
|
||||||
|
mySubMeshBtn->setPixmap(image0);
|
||||||
|
mySubMeshLine = new QLineEdit(aSelectBox, "submesh line");
|
||||||
|
mySubMeshLine->setReadOnly(true);
|
||||||
|
onSelectSubMesh(false);
|
||||||
|
|
||||||
|
mySelectGroup = new QCheckBox(aSelectBox, "group checkbox");
|
||||||
|
mySelectGroup->setText(tr("SMESH_GROUP"));
|
||||||
|
mySelectGroup->setMinimumSize(50, 0);
|
||||||
|
myGroupBtn = new QPushButton(aSelectBox, "group button");
|
||||||
|
myGroupBtn->setText("");
|
||||||
|
myGroupBtn->setPixmap(image0);
|
||||||
|
myGroupLine = new QLineEdit(aSelectBox, "group line");
|
||||||
|
myGroupLine->setReadOnly(true);
|
||||||
|
onSelectGroup(false);
|
||||||
|
|
||||||
|
aSelectBox->setMinimumHeight(mySubMeshBtn->sizeHint().height() +
|
||||||
|
myGroupBtn->sizeHint().height() +
|
||||||
|
aSelectBox->sizeHint().height());
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QFrame* aButtons = new QFrame(this, "button box");
|
||||||
|
aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken);
|
||||||
|
QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6);
|
||||||
|
aBtnLayout->setAutoAdd(false);
|
||||||
|
|
||||||
|
QPushButton* aOKBtn = new QPushButton(aButtons, "ok");
|
||||||
|
aOKBtn->setText(tr("SMESH_BUT_OK"));
|
||||||
|
aOKBtn->setAutoDefault(true);
|
||||||
|
aOKBtn->setDefault(true);
|
||||||
|
QPushButton* aApplyBtn = new QPushButton(aButtons, "apply");
|
||||||
|
aApplyBtn->setText(tr("SMESH_BUT_APPLY"));
|
||||||
|
aApplyBtn->setAutoDefault(true);
|
||||||
|
QPushButton* aCloseBtn = new QPushButton(aButtons, "close");
|
||||||
|
aCloseBtn->setText(tr("SMESH_BUT_CLOSE"));
|
||||||
|
aCloseBtn->setAutoDefault(true);
|
||||||
|
|
||||||
|
aBtnLayout->addWidget(aOKBtn);
|
||||||
|
aBtnLayout->addWidget(aApplyBtn);
|
||||||
|
aBtnLayout->addStretch();
|
||||||
|
aBtnLayout->addWidget(aCloseBtn);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
aMainLayout->addWidget(myTypeGroup);
|
||||||
|
aMainLayout->addWidget(aNameBox);
|
||||||
|
aMainLayout->addWidget(aContentBox);
|
||||||
|
aMainLayout->addWidget(aSelectBox);
|
||||||
|
aMainLayout->addWidget(aButtons);
|
||||||
|
|
||||||
|
/* signals and slots connections */
|
||||||
|
connect(myTypeGroup, SIGNAL(clicked(int)), this, SLOT(onTypeChanged(int)));
|
||||||
|
|
||||||
|
connect(myName, SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&)));
|
||||||
|
connect(myElements, SIGNAL(selectionChanged()), this, SLOT(onListSelectionChanged()));
|
||||||
|
|
||||||
|
connect(myFilter, SIGNAL(clicked()), this, SLOT(setFilters()));
|
||||||
|
connect(aAddBtn, SIGNAL(clicked()), this, SLOT(onAdd()));
|
||||||
|
connect(aRemoveBtn, SIGNAL(clicked()), this, SLOT(onRemove()));
|
||||||
|
connect(aSortBtn, SIGNAL(clicked()), this, SLOT(onSort()));
|
||||||
|
|
||||||
|
connect(mySelectSubMesh, SIGNAL(toggled(bool)), this, SLOT(onSelectSubMesh(bool)));
|
||||||
|
connect(mySelectGroup, SIGNAL(toggled(bool)), this, SLOT(onSelectGroup(bool)));
|
||||||
|
connect(mySubMeshBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection()));
|
||||||
|
connect(myGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection()));
|
||||||
|
|
||||||
|
connect(aOKBtn, SIGNAL(clicked()), this, SLOT(onOK()));
|
||||||
|
connect(aApplyBtn, SIGNAL(clicked()), this, SLOT(onApply()));
|
||||||
|
connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(onClose()));
|
||||||
|
|
||||||
|
/* Init selection */
|
||||||
|
mySelection = theSel;
|
||||||
|
mySMESHGUI = SMESHGUI::GetSMESHGUI();
|
||||||
|
mySMESHGUI->SetActiveDialogBox(this);
|
||||||
|
mySMESHGUI->SetState(800);
|
||||||
|
|
||||||
|
mySelectionMode = -1;
|
||||||
|
mySubMeshFilter = new SMESH_TypeFilter(SUBMESH);
|
||||||
|
myGroupFilter = new SMESH_TypeFilter(GROUP);
|
||||||
|
|
||||||
|
connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onClose()));
|
||||||
|
connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose()));
|
||||||
|
connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged()));
|
||||||
|
|
||||||
|
updateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ~SMESHGUI_GroupDlg()
|
||||||
|
// purpose : Destroys the object and frees any allocated resources
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg()
|
||||||
|
{
|
||||||
|
// no need to delete child widgets, Qt does it all for us
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : Init()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::init(SMESH::SMESH_Mesh_ptr theMesh)
|
||||||
|
{
|
||||||
|
/* init data from current selection */
|
||||||
|
myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh);
|
||||||
|
myGroup = SMESH::SMESH_Group::_nil();
|
||||||
|
|
||||||
|
Standard_Boolean aResult;
|
||||||
|
myActor = mySMESHGUI->FindActor(myMesh, aResult, true);
|
||||||
|
mySMESHGUI->SetPickable(myActor);
|
||||||
|
|
||||||
|
myTypeGroup->setButton(0);
|
||||||
|
onTypeChanged(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : Init()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::init(SMESH::SMESH_Group_ptr theGroup)
|
||||||
|
{
|
||||||
|
|
||||||
|
myMesh = theGroup->GetMesh();
|
||||||
|
myGroup = SMESH::SMESH_Group::_duplicate(theGroup);
|
||||||
|
|
||||||
|
Standard_Boolean aResult;
|
||||||
|
myActor = mySMESHGUI->FindActor(myMesh, aResult, true);
|
||||||
|
if ( !myActor )
|
||||||
|
myActor = mySMESHGUI->FindActor(myGroup, aResult, true);
|
||||||
|
mySMESHGUI->SetPickable(myActor);
|
||||||
|
|
||||||
|
int aType = 0;
|
||||||
|
switch(theGroup->GetType()) {
|
||||||
|
case SMESH::NODE: aType= 0; break;
|
||||||
|
case SMESH::EDGE: aType = 1; break;
|
||||||
|
case SMESH::FACE: aType = 2; break;
|
||||||
|
case SMESH::VOLUME: aType = 3; break;
|
||||||
|
}
|
||||||
|
myTypeGroup->setButton(aType);
|
||||||
|
onTypeChanged(aType);
|
||||||
|
|
||||||
|
myName->setText(myGroup->GetName());
|
||||||
|
myName->home(false);
|
||||||
|
|
||||||
|
if (!theGroup->IsEmpty()) {
|
||||||
|
SMESH::long_array_var anElements = myGroup->GetListOfID();
|
||||||
|
int k = anElements->length();
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
myIdList.append(anElements[i]);
|
||||||
|
myElements->insertItem(QString::number(anElements[i]));
|
||||||
|
}
|
||||||
|
myElements->selectAll(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : updateButtons()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::updateButtons()
|
||||||
|
{
|
||||||
|
bool enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0;
|
||||||
|
QPushButton* aBtn;
|
||||||
|
aBtn = (QPushButton*) child("ok", "QPushButton");
|
||||||
|
if (aBtn) aBtn->setEnabled(enable);
|
||||||
|
aBtn = (QPushButton*) child("apply", "QPushButton");
|
||||||
|
if (aBtn) aBtn->setEnabled(enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onNameChanged()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onNameChanged(const QString& text)
|
||||||
|
{
|
||||||
|
updateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onTypeChanged()
|
||||||
|
// purpose : Radio button management
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onTypeChanged(int id)
|
||||||
|
{
|
||||||
|
if (myTypeId != id) {
|
||||||
|
myElements->clear();
|
||||||
|
if (myCurrentLineEdit == 0)
|
||||||
|
setSelectionMode(id);
|
||||||
|
myFilter->setEnabled(id == 1 || id == 2);
|
||||||
|
}
|
||||||
|
myTypeId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : setSelectionMode()
|
||||||
|
// purpose : Radio button management
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::setSelectionMode(int theMode)
|
||||||
|
{
|
||||||
|
if (mySelectionMode != theMode) {
|
||||||
|
mySelection->ClearIObjects();
|
||||||
|
mySelection->ClearFilters();
|
||||||
|
if (mySelectionMode == 0)
|
||||||
|
mySMESHGUI->EraseSimulationActors();
|
||||||
|
if (theMode < 4) {
|
||||||
|
if (theMode == 0) {
|
||||||
|
mySMESHGUI->ViewNodes();
|
||||||
|
QAD_Application::getDesktop()->SetSelectionMode(NodeSelection, true);
|
||||||
|
}
|
||||||
|
else if (theMode == 1) {
|
||||||
|
QAD_Application::getDesktop()->SetSelectionMode(EdgeSelection, true);
|
||||||
|
}
|
||||||
|
else if (theMode == 2) {
|
||||||
|
QAD_Application::getDesktop()->SetSelectionMode(FaceSelection, true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QAD_Application::getDesktop()->SetSelectionMode(VolumeSelection, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QAD_Application::getDesktop()->SetSelectionMode(ActorSelection, true);
|
||||||
|
if (theMode == 4)
|
||||||
|
mySelection->AddFilter(mySubMeshFilter);
|
||||||
|
else if (theMode == 5)
|
||||||
|
mySelection->AddFilter(myGroupFilter);
|
||||||
|
}
|
||||||
|
mySelectionMode = theMode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onApply()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
bool SMESHGUI_GroupDlg::onApply()
|
||||||
|
{
|
||||||
|
if (!myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0) {
|
||||||
|
mySelection->ClearIObjects();
|
||||||
|
if (myGroup->_is_nil()) {
|
||||||
|
SMESH::ElementType aType = SMESH::ALL;
|
||||||
|
switch(myTypeId) {
|
||||||
|
case 0: aType = SMESH::NODE; break;
|
||||||
|
case 1: aType = SMESH::EDGE; break;
|
||||||
|
case 2: aType = SMESH::FACE; break;
|
||||||
|
case 3: aType = SMESH::VOLUME; break;
|
||||||
|
}
|
||||||
|
SMESH::long_array_var anIdList = new SMESH::long_array;
|
||||||
|
int i, k = myElements->count();
|
||||||
|
anIdList->length(k);
|
||||||
|
QListBoxItem* anItem;
|
||||||
|
for (i = 0, anItem = myElements->firstItem(); anItem != 0; i++, anItem = anItem->next()) {
|
||||||
|
anIdList[i] = anItem->text().toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
myGroup = mySMESHGUI->AddGroup(myMesh, aType, myName->text());
|
||||||
|
myGroup->Add(anIdList);
|
||||||
|
|
||||||
|
/* init for next operation */
|
||||||
|
myName->setText("");
|
||||||
|
myElements->clear();
|
||||||
|
myGroup = SMESH::SMESH_Group::_nil();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myGroup->SetName(myName->text());
|
||||||
|
|
||||||
|
QValueList<int> aAddList;
|
||||||
|
QValueList<int>::iterator anIt;
|
||||||
|
QListBoxItem* anItem;
|
||||||
|
for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) {
|
||||||
|
int anId = anItem->text().toInt();
|
||||||
|
if ((anIt = myIdList.find(anId)) == myIdList.end())
|
||||||
|
aAddList.append(anId);
|
||||||
|
else
|
||||||
|
myIdList.remove(anIt);
|
||||||
|
}
|
||||||
|
if (!aAddList.empty()) {
|
||||||
|
SMESH::long_array_var anIdList = new SMESH::long_array;
|
||||||
|
anIdList->length(aAddList.count());
|
||||||
|
int i;
|
||||||
|
for (i = 0, anIt = aAddList.begin(); anIt != aAddList.end(); anIt++, i++)
|
||||||
|
anIdList[i] = *anIt;
|
||||||
|
myGroup->Add(anIdList);
|
||||||
|
}
|
||||||
|
if (!myIdList.empty()) {
|
||||||
|
SMESH::long_array_var anIdList = new SMESH::long_array;
|
||||||
|
anIdList->length(myIdList.count());
|
||||||
|
int i;
|
||||||
|
for (i = 0, anIt = myIdList.begin(); anIt != myIdList.end(); anIt++, i++)
|
||||||
|
anIdList[i] = *anIt;
|
||||||
|
myGroup->Remove(anIdList);
|
||||||
|
}
|
||||||
|
/* init for next operation */
|
||||||
|
myIdList.clear();
|
||||||
|
for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next())
|
||||||
|
myIdList.append(anItem->text().toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
mySMESHGUI->GetActiveStudy()->updateObjBrowser(true);
|
||||||
|
mySelection->ClearIObjects();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onOK()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onOK()
|
||||||
|
{
|
||||||
|
if ( onApply() )
|
||||||
|
onClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onClose()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onClose()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool busy = false;
|
||||||
|
//=================================================================================
|
||||||
|
// function : onListSelectionChanged()
|
||||||
|
// purpose : Called when selection in element list is changed
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onListSelectionChanged()
|
||||||
|
{
|
||||||
|
// MESSAGE("SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor);
|
||||||
|
if (busy || !myActor) return;
|
||||||
|
busy = true;
|
||||||
|
|
||||||
|
if (myCurrentLineEdit == 0) {
|
||||||
|
mySelection->ClearIObjects();
|
||||||
|
TColStd_MapOfInteger aIndexes;
|
||||||
|
QListBoxItem* anItem;
|
||||||
|
for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) {
|
||||||
|
if (anItem->isSelected()) {
|
||||||
|
std::vector<int> aVtkList;
|
||||||
|
if (myTypeId == 0)
|
||||||
|
aVtkList = myActor->GetNodeVtkId(anItem->text().toInt());
|
||||||
|
else
|
||||||
|
aVtkList = myActor->GetElemVtkId(anItem->text().toInt());
|
||||||
|
|
||||||
|
if (aVtkList.size() > 0) {
|
||||||
|
std::vector<int>::iterator it;
|
||||||
|
for (it = aVtkList.begin(); it != aVtkList.end(); ++it) {
|
||||||
|
aIndexes.Add(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mySelection->AddOrRemoveIndex(myActor->getIO(), aIndexes, false, false);
|
||||||
|
mySelection->AddIObject(myActor->getIO());
|
||||||
|
}
|
||||||
|
busy = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onObjectSelectionChanged()
|
||||||
|
// purpose : Called when selection in 3D view or ObjectBrowser is changed
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onObjectSelectionChanged()
|
||||||
|
{
|
||||||
|
if (busy) return;
|
||||||
|
busy = true;
|
||||||
|
|
||||||
|
int aNbSel = mySelection->IObjectCount();
|
||||||
|
myElements->clearSelection();
|
||||||
|
|
||||||
|
if (myCurrentLineEdit) {
|
||||||
|
myCurrentLineEdit->setText("") ;
|
||||||
|
QString aString = "";
|
||||||
|
if (aNbSel >= 1) {
|
||||||
|
if (aNbSel > 1) {
|
||||||
|
if (myCurrentLineEdit = mySubMeshLine)
|
||||||
|
aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel);
|
||||||
|
else if (myCurrentLineEdit = myGroupLine)
|
||||||
|
aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aString = mySelection->firstIObject()->getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
myCurrentLineEdit->setText(aString) ;
|
||||||
|
myCurrentLineEdit->home( false );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (aNbSel == 1) {
|
||||||
|
QString aListStr = "";
|
||||||
|
int aNbItems = 0;
|
||||||
|
if (myTypeId == 0) {
|
||||||
|
aNbItems = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aListStr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aNbItems = mySMESHGUI->GetNameOfSelectedElements(mySelection, aListStr);
|
||||||
|
}
|
||||||
|
if (aNbItems > 0) {
|
||||||
|
QStringList anElements = QStringList::split(" ", aListStr);
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) {
|
||||||
|
anItem = myElements->findItem(*it, Qt::ExactMatch);
|
||||||
|
if (anItem) myElements->setSelected(anItem, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
busy = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onSelectSubMesh()
|
||||||
|
// purpose : Called when selection in 3D view or ObjectBrowser is changed
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onSelectSubMesh(bool on)
|
||||||
|
{
|
||||||
|
if (on) {
|
||||||
|
if (mySelectGroup->isChecked()) {
|
||||||
|
mySelectGroup->setChecked(false);
|
||||||
|
}
|
||||||
|
myCurrentLineEdit = mySubMeshLine;
|
||||||
|
setSelectionMode(4);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mySubMeshLine->setText("");
|
||||||
|
myCurrentLineEdit = 0;
|
||||||
|
if (myTypeId != -1)
|
||||||
|
setSelectionMode(myTypeId);
|
||||||
|
}
|
||||||
|
mySubMeshBtn->setEnabled(on);
|
||||||
|
mySubMeshLine->setEnabled(on);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : (onSelectGroup)
|
||||||
|
// purpose : Called when selection in 3D view or ObjectBrowser is changed
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onSelectGroup(bool on)
|
||||||
|
{
|
||||||
|
if (on) {
|
||||||
|
if (mySelectSubMesh->isChecked()) {
|
||||||
|
mySelectSubMesh->setChecked(false);
|
||||||
|
}
|
||||||
|
myCurrentLineEdit = myGroupLine;
|
||||||
|
setSelectionMode(5);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myGroupLine->setText("");
|
||||||
|
myCurrentLineEdit = 0;
|
||||||
|
if (myTypeId != -1)
|
||||||
|
setSelectionMode(myTypeId);
|
||||||
|
}
|
||||||
|
myGroupBtn->setEnabled(on);
|
||||||
|
myGroupLine->setEnabled(on);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : setCurrentSelection()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::setCurrentSelection()
|
||||||
|
{
|
||||||
|
QPushButton* send = (QPushButton*)sender();
|
||||||
|
myCurrentLineEdit = 0;
|
||||||
|
if (send == mySubMeshBtn) {
|
||||||
|
myCurrentLineEdit = mySubMeshLine;
|
||||||
|
onObjectSelectionChanged();
|
||||||
|
}
|
||||||
|
else if (send == myGroupBtn) {
|
||||||
|
myCurrentLineEdit = myGroupLine;
|
||||||
|
onObjectSelectionChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : setFilters()
|
||||||
|
// purpose : SLOT. Called when "Filter" button pressed.
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::setFilters()
|
||||||
|
{
|
||||||
|
SMESH::ElementType aType = SMESH::ALL;
|
||||||
|
switch ( myTypeId )
|
||||||
|
{
|
||||||
|
case 0 : aType = SMESH::NODE; break;
|
||||||
|
case 1 : aType = SMESH::EDGE; break;
|
||||||
|
case 2 : aType = SMESH::FACE; break;
|
||||||
|
case 3 : aType = SMESH::VOLUME; break;
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( myFilterDlg == 0 )
|
||||||
|
myFilterDlg = new SMESHGUI_FilterDlg( this, aType, true );
|
||||||
|
else
|
||||||
|
myFilterDlg->Init( aType );
|
||||||
|
|
||||||
|
myFilterDlg->SetSelection( mySelection );
|
||||||
|
myFilterDlg->SetMesh( myMesh );
|
||||||
|
myFilterDlg->SetSourceWg( myElements );
|
||||||
|
|
||||||
|
if ( myFilterDlg->exec() != QDialog::Accepted )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( mySelectSubMesh->isChecked() || mySelectGroup->isChecked() )
|
||||||
|
{
|
||||||
|
mySelectionMode = myTypeId;
|
||||||
|
mySelectSubMesh->setChecked( false );
|
||||||
|
mySelectGroup->setChecked( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onAdd()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onAdd()
|
||||||
|
{
|
||||||
|
int aNbSel = mySelection->IObjectCount();
|
||||||
|
if (aNbSel == 0) return;
|
||||||
|
|
||||||
|
busy = true;
|
||||||
|
|
||||||
|
SMESH::ElementType aType = SMESH::ALL;
|
||||||
|
switch(myTypeId) {
|
||||||
|
case 0: aType = SMESH::NODE; break;
|
||||||
|
case 1: aType = SMESH::EDGE; break;
|
||||||
|
case 2: aType = SMESH::FACE; break;
|
||||||
|
case 3: aType = SMESH::VOLUME; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myCurrentLineEdit == 0) {
|
||||||
|
if (aNbSel != 1) { busy = false; return; }
|
||||||
|
QString aListStr = "";
|
||||||
|
int aNbItems = 0;
|
||||||
|
if (myTypeId == 0) {
|
||||||
|
aNbItems = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aListStr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aNbItems = mySMESHGUI->GetNameOfSelectedElements(mySelection, aListStr);
|
||||||
|
}
|
||||||
|
if (aNbItems > 0) {
|
||||||
|
QStringList anElements = QStringList::split(" ", aListStr);
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) {
|
||||||
|
anItem = myElements->findItem(*it, Qt::ExactMatch);
|
||||||
|
if (!anItem) {
|
||||||
|
anItem = new QListBoxText(*it);
|
||||||
|
myElements->insertItem(anItem);
|
||||||
|
}
|
||||||
|
myElements->setSelected(anItem, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (myCurrentLineEdit == mySubMeshLine) {
|
||||||
|
Standard_Boolean aRes;
|
||||||
|
SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects());
|
||||||
|
for (; anIt.More(); anIt.Next()) {
|
||||||
|
SMESH::SMESH_subMesh_var aSubMesh = mySMESHGUI->ConvertIOinSubMesh(anIt.Value(), aRes);
|
||||||
|
if (aRes && !aSubMesh->_is_nil()) {
|
||||||
|
// check if mesh is the same
|
||||||
|
if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) {
|
||||||
|
if (aType == SMESH::NODE) {
|
||||||
|
try {
|
||||||
|
SMESH::long_array_var anElements = aSubMesh->GetNodesId();
|
||||||
|
int k = anElements->length();
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
QString aText = QString::number(anElements[i]);
|
||||||
|
anItem = myElements->findItem(aText, Qt::ExactMatch);
|
||||||
|
if (!anItem) {
|
||||||
|
anItem = new QListBoxText(aText);
|
||||||
|
myElements->insertItem(anItem);
|
||||||
|
}
|
||||||
|
myElements->setSelected(anItem, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const SALOME::SALOME_Exception& ex) {
|
||||||
|
QtCatchCorbaException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
SMESH::long_array_var anElements = aSubMesh->GetElementsId();
|
||||||
|
int k = anElements->length();
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
QString aText = QString::number(anElements[i]);
|
||||||
|
anItem = myElements->findItem(aText, Qt::ExactMatch);
|
||||||
|
if (!anItem) {
|
||||||
|
anItem = new QListBoxText(aText);
|
||||||
|
myElements->insertItem(anItem);
|
||||||
|
}
|
||||||
|
myElements->setSelected(anItem, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const SALOME::SALOME_Exception& ex) {
|
||||||
|
QtCatchCorbaException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mySelectSubMesh->setChecked(false);
|
||||||
|
busy = false;
|
||||||
|
onListSelectionChanged();
|
||||||
|
}
|
||||||
|
else if (myCurrentLineEdit == myGroupLine) {
|
||||||
|
Standard_Boolean aRes;
|
||||||
|
SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects());
|
||||||
|
for (; anIt.More(); anIt.Next()) {
|
||||||
|
SMESH::SMESH_Group_var aGroup = mySMESHGUI->ConvertIOinSMESHGroup(anIt.Value(), aRes);
|
||||||
|
if (aRes && !aGroup->_is_nil()) {
|
||||||
|
// check if mesh is the same
|
||||||
|
if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) {
|
||||||
|
SMESH::long_array_var anElements = aGroup->GetListOfID();
|
||||||
|
int k = anElements->length();
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
QString aText = QString::number(anElements[i]);
|
||||||
|
anItem = myElements->findItem(aText, Qt::ExactMatch);
|
||||||
|
if (!anItem) {
|
||||||
|
anItem = new QListBoxText(aText);
|
||||||
|
myElements->insertItem(anItem);
|
||||||
|
}
|
||||||
|
myElements->setSelected(anItem, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mySelectGroup->setChecked(false);
|
||||||
|
busy = false;
|
||||||
|
onListSelectionChanged();
|
||||||
|
}
|
||||||
|
busy = false;
|
||||||
|
// mySelection->ClearIObjects();
|
||||||
|
updateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onRemove()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onRemove()
|
||||||
|
{
|
||||||
|
busy = true;
|
||||||
|
if (myCurrentLineEdit == 0) {
|
||||||
|
for (int i = myElements->count(); i > 0; i--) {
|
||||||
|
if (myElements->isSelected(i-1)) {
|
||||||
|
myElements->removeItem(i-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int aNbSel = mySelection->IObjectCount();
|
||||||
|
if (aNbSel == 0) { busy = false; return; }
|
||||||
|
|
||||||
|
SMESH::ElementType aType = SMESH::ALL;
|
||||||
|
switch(myTypeId) {
|
||||||
|
case 0: aType = SMESH::NODE; break;
|
||||||
|
case 1: aType = SMESH::EDGE; break;
|
||||||
|
case 2: aType = SMESH::FACE; break;
|
||||||
|
case 3: aType = SMESH::VOLUME; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myCurrentLineEdit == mySubMeshLine) {
|
||||||
|
Standard_Boolean aRes;
|
||||||
|
SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects());
|
||||||
|
for (; anIt.More(); anIt.Next()) {
|
||||||
|
SMESH::SMESH_subMesh_var aSubMesh = mySMESHGUI->ConvertIOinSubMesh(anIt.Value(), aRes);
|
||||||
|
if (aRes && !aSubMesh->_is_nil()) {
|
||||||
|
// check if mesh is the same
|
||||||
|
if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) {
|
||||||
|
if (aType == SMESH::NODE) {
|
||||||
|
try {
|
||||||
|
SMESH::long_array_var anElements = aSubMesh->GetNodesId();
|
||||||
|
int k = anElements->length();
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch);
|
||||||
|
if (anItem) delete anItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const SALOME::SALOME_Exception& ex) {
|
||||||
|
QtCatchCorbaException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
SMESH::long_array_var anElements = aSubMesh->GetElementsId();
|
||||||
|
int k = anElements->length();
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch);
|
||||||
|
if (anItem) delete anItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const SALOME::SALOME_Exception& ex) {
|
||||||
|
QtCatchCorbaException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (myCurrentLineEdit == myGroupLine) {
|
||||||
|
Standard_Boolean aRes;
|
||||||
|
SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects());
|
||||||
|
for (; anIt.More(); anIt.Next()) {
|
||||||
|
SMESH::SMESH_Group_var aGroup = mySMESHGUI->ConvertIOinSMESHGroup(anIt.Value(), aRes);
|
||||||
|
if (aRes && !aGroup->_is_nil()) {
|
||||||
|
// check if mesh is the same
|
||||||
|
if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) {
|
||||||
|
SMESH::long_array_var anElements = aGroup->GetListOfID();
|
||||||
|
int k = anElements->length();
|
||||||
|
QListBoxItem* anItem = 0;
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch);
|
||||||
|
if (anItem) delete anItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
busy = false;
|
||||||
|
updateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onSort()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::onSort()
|
||||||
|
{
|
||||||
|
// PAL5412: sorts items in ascending by "string" value
|
||||||
|
// myElements->sort(true);
|
||||||
|
// myElements->update();
|
||||||
|
int i, k = myElements->count();
|
||||||
|
if (k > 0) {
|
||||||
|
busy = true;
|
||||||
|
QStringList aSelected;
|
||||||
|
std::vector<int> anArray(k);
|
||||||
|
// QMemArray<int> anArray(k);
|
||||||
|
QListBoxItem* anItem;
|
||||||
|
// fill the array
|
||||||
|
for (anItem = myElements->firstItem(), i = 0; anItem != 0; anItem = anItem->next(), i++) {
|
||||||
|
anArray[i] = anItem->text().toInt();
|
||||||
|
if (anItem->isSelected())
|
||||||
|
aSelected.append(anItem->text());
|
||||||
|
}
|
||||||
|
// sort & update list
|
||||||
|
std::sort(anArray.begin(), anArray.end());
|
||||||
|
// anArray.sort();
|
||||||
|
myElements->clear();
|
||||||
|
for (i = 0; i < k; i++) {
|
||||||
|
myElements->insertItem(QString::number(anArray[i]));
|
||||||
|
}
|
||||||
|
for (QStringList::iterator it = aSelected.begin(); it != aSelected.end(); ++it) {
|
||||||
|
anItem = myElements->findItem(*it, Qt::ExactMatch);
|
||||||
|
if (anItem) myElements->setSelected(anItem, true);
|
||||||
|
}
|
||||||
|
busy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : closeEvent()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_GroupDlg::closeEvent( QCloseEvent* e )
|
||||||
|
{
|
||||||
|
QAD_StudyFrame* aStudyFrame = mySMESHGUI->GetActiveStudy()->getActiveStudyFrame();
|
||||||
|
if (aStudyFrame->getTypeView() == VIEW_VTK) {
|
||||||
|
mySMESHGUI->SetPickable();
|
||||||
|
if (mySelectionMode == 0)
|
||||||
|
mySMESHGUI->EraseSimulationActors();
|
||||||
|
|
||||||
|
// remove filters from viewer
|
||||||
|
VTKViewer_InteractorStyleSALOME* aStyle = ((VTKViewer_ViewFrame*)aStudyFrame->getRightFrame()->getViewFrame())->getRWInteractor()->GetInteractorStyleSALOME();
|
||||||
|
aStyle->RemoveEdgeFilter();
|
||||||
|
aStyle->RemoveFaceFilter();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
mySelection->ClearIObjects();
|
||||||
|
QAD_Application::getDesktop()->SetSelectionMode(ActorSelection);
|
||||||
|
mySelection->ClearFilters();
|
||||||
|
mySMESHGUI->ResetState();
|
||||||
|
|
||||||
|
QDialog::closeEvent( e );
|
||||||
|
}
|
132
src/SMESHGUI/SMESHGUI_GroupDlg.h
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_GroupDlg.h
|
||||||
|
// Author : Natalia KOPNOVA
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef DIALOGBOX_GROUP_H
|
||||||
|
#define DIALOGBOX_GROUP_H
|
||||||
|
|
||||||
|
#include "SALOME_Selection.h"
|
||||||
|
#include "SMESH_TypeFilter.hxx"
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qdialog.h>
|
||||||
|
#include <qvaluelist.h>
|
||||||
|
|
||||||
|
// IDL Headers
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Mesh)
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Group)
|
||||||
|
|
||||||
|
class QLineEdit;
|
||||||
|
class QButtonGroup;
|
||||||
|
class QListBox;
|
||||||
|
class QPushButton;
|
||||||
|
class QCheckBox;
|
||||||
|
class SMESHGUI;
|
||||||
|
class SMESH_Actor;
|
||||||
|
class SMESHGUI_FilterDlg;
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_GroupDlg
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
class SMESHGUI_GroupDlg : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_GroupDlg( QWidget* parent = 0, const char* name = 0, SALOME_Selection* theSel = 0,
|
||||||
|
SMESH::SMESH_Mesh_ptr theMesh = SMESH::SMESH_Mesh::_nil(),
|
||||||
|
bool modal = FALSE, WFlags fl = 0 );
|
||||||
|
SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_Selection* theSel,
|
||||||
|
SMESH::SMESH_Group_ptr theGroup, bool modal = FALSE, WFlags fl = 0 );
|
||||||
|
~SMESHGUI_GroupDlg();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
|
||||||
|
void onAdd();
|
||||||
|
void onRemove();
|
||||||
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void onTypeChanged(int id);
|
||||||
|
|
||||||
|
void onOK();
|
||||||
|
void onClose();
|
||||||
|
bool onApply();
|
||||||
|
|
||||||
|
void onListSelectionChanged();
|
||||||
|
void onObjectSelectionChanged();
|
||||||
|
|
||||||
|
void onSelectSubMesh(bool on);
|
||||||
|
void onSelectGroup(bool on);
|
||||||
|
void setCurrentSelection();
|
||||||
|
|
||||||
|
void setFilters();
|
||||||
|
void onSort();
|
||||||
|
|
||||||
|
void onNameChanged(const QString& text);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initDialog(SALOME_Selection* theSel, bool create);
|
||||||
|
void init(SMESH::SMESH_Mesh_ptr theMesh);
|
||||||
|
void init(SMESH::SMESH_Group_ptr theGroup);
|
||||||
|
void closeEvent(QCloseEvent* e);
|
||||||
|
void setSelectionMode(int theMode);
|
||||||
|
void updateButtons();
|
||||||
|
|
||||||
|
SMESHGUI* mySMESHGUI ; /* Current SMESHGUI object */
|
||||||
|
SALOME_Selection* mySelection ; /* User shape selection */
|
||||||
|
SMESH_Actor* myActor; /* Current mesh actor */
|
||||||
|
int myTypeId ; /* Current type id = radio button id */
|
||||||
|
QLineEdit* myCurrentLineEdit; /* Current LineEdit */
|
||||||
|
|
||||||
|
QButtonGroup* myTypeGroup;
|
||||||
|
QLineEdit* myName;
|
||||||
|
QListBox* myElements;
|
||||||
|
QPushButton* myFilter;
|
||||||
|
|
||||||
|
QCheckBox* mySelectSubMesh;
|
||||||
|
QPushButton* mySubMeshBtn;
|
||||||
|
QLineEdit* mySubMeshLine;
|
||||||
|
|
||||||
|
QCheckBox* mySelectGroup;
|
||||||
|
QPushButton* myGroupBtn;
|
||||||
|
QLineEdit* myGroupLine;
|
||||||
|
|
||||||
|
SMESH::SMESH_Mesh_var myMesh;
|
||||||
|
SMESH::SMESH_Group_var myGroup;
|
||||||
|
QValueList<int> myIdList;
|
||||||
|
|
||||||
|
int mySelectionMode;
|
||||||
|
Handle(SMESH_TypeFilter) mySubMeshFilter;
|
||||||
|
Handle(SMESH_TypeFilter) myGroupFilter;
|
||||||
|
|
||||||
|
SMESHGUI_FilterDlg* myFilterDlg;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIALOGBOX_GROUP_H
|
74
src/SMESHGUI/SMESHGUI_Hypotheses.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_Hypotheses.h
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef SMESHGUI_Hypotheses_HeaderFile
|
||||||
|
#define SMESHGUI_Hypotheses_HeaderFile
|
||||||
|
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qstring.h>
|
||||||
|
#include <qwidget.h>
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_GenericHypothesisCreator
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
class SMESHGUI_GenericHypothesisCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void CreateHypothesis (const bool isAlgo, QWidget* parent) = 0;
|
||||||
|
virtual void EditHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : HypothesisData
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
class HypothesisData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
HypothesisData (const QString& aPluginName,
|
||||||
|
const QString& aServerLibName,
|
||||||
|
const QString& aClientLibName,
|
||||||
|
const QString& aLabel,
|
||||||
|
const QString& anIconId) :
|
||||||
|
PluginName(aPluginName),
|
||||||
|
ServerLibName(aServerLibName),
|
||||||
|
ClientLibName(aClientLibName),
|
||||||
|
Label(aLabel),
|
||||||
|
IconId(anIconId)
|
||||||
|
{};
|
||||||
|
|
||||||
|
QString PluginName;
|
||||||
|
QString ServerLibName;
|
||||||
|
QString ClientLibName;
|
||||||
|
QString Label;
|
||||||
|
QString IconId;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
307
src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_Preferences_SelectionDlg.cxx
|
||||||
|
// Author : Natalia KOPNOVA
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "SMESHGUI_Preferences_SelectionDlg.h"
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
|
||||||
|
#include <qgroupbox.h>
|
||||||
|
#include <qlayout.h>
|
||||||
|
#include <qlabel.h>
|
||||||
|
#include <qlineedit.h>
|
||||||
|
#include <qvalidator.h>
|
||||||
|
#include <qspinbox.h>
|
||||||
|
#include <qpushbutton.h>
|
||||||
|
#include <qpalette.h>
|
||||||
|
#include <qcolordialog.h>
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_LineEdit
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_LineEdit::SMESHGUI_LineEdit(QWidget* parent, const char *name)
|
||||||
|
: QLineEdit(parent, name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESHGUI_LineEdit::SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char *name)
|
||||||
|
: QLineEdit(text, parent, name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SMESHGUI_LineEdit::focusOutEvent(QFocusEvent* e)
|
||||||
|
{
|
||||||
|
const QValidator* aVal = validator();
|
||||||
|
QString aText = text();
|
||||||
|
int aCurPos = cursorPosition();
|
||||||
|
if (aVal && aVal->validate(aText, aCurPos) != QValidator::Acceptable) {
|
||||||
|
QString aValid = aText;
|
||||||
|
aVal->fixup(aValid);
|
||||||
|
if (aText != aValid) {
|
||||||
|
setText(aValid);
|
||||||
|
update();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QLineEdit::focusOutEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_DoubleValidator
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(QObject * parent, const char *name)
|
||||||
|
: QDoubleValidator(parent, name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(double bottom, double top, int decimals,
|
||||||
|
QObject * parent, const char *name)
|
||||||
|
: QDoubleValidator(bottom, top, decimals, parent, name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SMESHGUI_DoubleValidator::fixup(QString& theText) const
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
double aValue = theText.toDouble(&ok);
|
||||||
|
if (ok) {
|
||||||
|
if (aValue < bottom())
|
||||||
|
theText = QString::number(bottom(), 'g', decimals());
|
||||||
|
if (aValue > top())
|
||||||
|
theText = QString::number(top(), 'g', decimals());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : SMESHGUI_Preferences_SelectionDlg()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_Preferences_SelectionDlg::SMESHGUI_Preferences_SelectionDlg( QWidget* parent, const char* name )
|
||||||
|
: QDialog( parent, name, true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
|
||||||
|
{
|
||||||
|
if ( !name ) setName( "SMESHGUI_Preferences_SelectionDlg" );
|
||||||
|
setCaption( tr( "SMESH_PREF_SELECTION" ) );
|
||||||
|
|
||||||
|
QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6);
|
||||||
|
QLabel* aLabel;
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QGroupBox* aSelectBox = new QGroupBox(4, Qt::Horizontal, this, "selection");
|
||||||
|
aSelectBox->setTitle(tr("SMESH_SELECTION"));
|
||||||
|
|
||||||
|
aLabel = new QLabel(aSelectBox, "selection color label");
|
||||||
|
aLabel->setText(tr("SMESH_OUTLINE_COLOR"));
|
||||||
|
myColor[2] = new QPushButton(aSelectBox, "outline color");
|
||||||
|
myColor[2]->setFixedSize(QSize(25, 25));
|
||||||
|
|
||||||
|
aSelectBox->addSpace(0);
|
||||||
|
aSelectBox->addSpace(0);
|
||||||
|
|
||||||
|
aLabel = new QLabel(aSelectBox, "selection color label");
|
||||||
|
aLabel->setText(tr("SMESH_ELEMENTS_COLOR"));
|
||||||
|
myColor[1] = new QPushButton(aSelectBox, "elements color");
|
||||||
|
myColor[1]->setFixedSize(QSize(25, 25));
|
||||||
|
|
||||||
|
aLabel = new QLabel(aSelectBox, "selection width label");
|
||||||
|
aLabel->setText(tr("SMESH_WIDTH"));
|
||||||
|
myWidth[1] = new QSpinBox(0, 5, 1, aSelectBox, "selection width");
|
||||||
|
myWidth[1]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||||
|
myWidth[1]->setButtonSymbols(QSpinBox::PlusMinus);
|
||||||
|
myWidth[1]->setMinimumWidth(50);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QGroupBox* aPreSelectBox = new QGroupBox(1, Qt::Vertical, this, "preselection");
|
||||||
|
aPreSelectBox->setTitle(tr("SMESH_PRESELECTION"));
|
||||||
|
|
||||||
|
aLabel = new QLabel(aPreSelectBox, "preselection color label");
|
||||||
|
aLabel->setText(tr("SMESH_HILIGHT_COLOR"));
|
||||||
|
myColor[0] = new QPushButton(aPreSelectBox, "preselection color");
|
||||||
|
myColor[0]->setFixedSize(QSize(25, 25));
|
||||||
|
|
||||||
|
aLabel = new QLabel(aPreSelectBox, "preselection width label");
|
||||||
|
aLabel->setText(tr("SMESH_WIDTH"));
|
||||||
|
myWidth[0] = new QSpinBox(0, 5, 1, aPreSelectBox, "preselection width");
|
||||||
|
myWidth[0]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||||
|
myWidth[0]->setButtonSymbols(QSpinBox::PlusMinus);
|
||||||
|
myWidth[0]->setMinimumWidth(50);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QGroupBox* aPrecisionBox = new QGroupBox(1, Qt::Vertical, this, "preselection");
|
||||||
|
aPrecisionBox->setTitle(tr("SMESH_PRECISION"));
|
||||||
|
QDoubleValidator* aValidator = new SMESHGUI_DoubleValidator(aPrecisionBox);
|
||||||
|
aValidator->setBottom(0.001);
|
||||||
|
aValidator->setDecimals(6);
|
||||||
|
|
||||||
|
aLabel = new QLabel(aPrecisionBox, "node tol label");
|
||||||
|
aLabel->setText(tr("SMESH_NODES"));
|
||||||
|
myPrecision[0] = new SMESHGUI_LineEdit(aPrecisionBox, "node precision");
|
||||||
|
myPrecision[0]->setValidator(aValidator);
|
||||||
|
|
||||||
|
aLabel = new QLabel(aPrecisionBox, "item tol label");
|
||||||
|
aLabel->setText(tr("SMESH_ELEMENTS"));
|
||||||
|
myPrecision[1] = new SMESHGUI_LineEdit(aPrecisionBox, "item precision");
|
||||||
|
myPrecision[1]->setValidator(aValidator);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
QFrame* aButtons = new QFrame(this, "button box");
|
||||||
|
aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken);
|
||||||
|
QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6);
|
||||||
|
aBtnLayout->setAutoAdd(false);
|
||||||
|
|
||||||
|
QPushButton* aOKBtn = new QPushButton(aButtons, "ok");
|
||||||
|
aOKBtn->setText(tr("SMESH_BUT_OK"));
|
||||||
|
aOKBtn->setAutoDefault(true);
|
||||||
|
aOKBtn->setDefault(true);
|
||||||
|
QPushButton* aCloseBtn = new QPushButton(aButtons, "close");
|
||||||
|
aCloseBtn->setText(tr("SMESH_BUT_CLOSE"));
|
||||||
|
aCloseBtn->setAutoDefault(true);
|
||||||
|
|
||||||
|
aBtnLayout->addWidget(aOKBtn);
|
||||||
|
aBtnLayout->addStretch();
|
||||||
|
aBtnLayout->addWidget(aCloseBtn);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
aMainLayout->addWidget(aSelectBox);
|
||||||
|
aMainLayout->addWidget(aPreSelectBox);
|
||||||
|
aMainLayout->addWidget(aPrecisionBox);
|
||||||
|
aMainLayout->addWidget(aButtons);
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
connect(myColor[i], SIGNAL(clicked()), this, SLOT(onSelectColor()));
|
||||||
|
|
||||||
|
connect(aOKBtn, SIGNAL(clicked()), this, SLOT(accept()));
|
||||||
|
connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(reject()));
|
||||||
|
|
||||||
|
/* Move widget on the botton right corner of main widget */
|
||||||
|
int x, y ;
|
||||||
|
SMESHGUI::GetSMESHGUI()->DefineDlgPosition(this, x, y);
|
||||||
|
this->move(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ~SMESHGUI_Preferences_SelectionDlg()
|
||||||
|
// purpose : Destroys the object and frees any allocated resources
|
||||||
|
//=================================================================================
|
||||||
|
SMESHGUI_Preferences_SelectionDlg::~SMESHGUI_Preferences_SelectionDlg()
|
||||||
|
{
|
||||||
|
// no need to delete child widgets, Qt does it all for us
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : closeEvent()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_Preferences_SelectionDlg::closeEvent( QCloseEvent* e )
|
||||||
|
{
|
||||||
|
reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : onSelectColor()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_Preferences_SelectionDlg::onSelectColor()
|
||||||
|
{
|
||||||
|
QPushButton* aSender = (QPushButton*)sender();
|
||||||
|
QColor aColor = aSender->palette().active().button();
|
||||||
|
aColor = QColorDialog::getColor(aColor, this);
|
||||||
|
if (aColor.isValid()) {
|
||||||
|
QPalette aPal = aSender->palette();
|
||||||
|
aPal.setColor(QColorGroup::Button, aColor);
|
||||||
|
aSender->setPalette(aPal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : SetColor()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_Preferences_SelectionDlg::SetColor(int type, QColor color)
|
||||||
|
{
|
||||||
|
if (type > 0 && type <= 3) {
|
||||||
|
QPalette aPal = myColor[type-1]->palette();
|
||||||
|
aPal.setColor(QColorGroup::Button, color);
|
||||||
|
myColor[type-1]->setPalette(aPal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : GetColor()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
QColor SMESHGUI_Preferences_SelectionDlg::GetColor(int type)
|
||||||
|
{
|
||||||
|
QColor aColor;
|
||||||
|
if (type > 0 && type <= 3)
|
||||||
|
aColor = myColor[type-1]->palette().active().button();
|
||||||
|
return aColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : SetWidth()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_Preferences_SelectionDlg::SetWidth(int type, int value)
|
||||||
|
{
|
||||||
|
if (type > 0 && type <= 2)
|
||||||
|
myWidth[type-1]->setValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : GetWidth()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
int SMESHGUI_Preferences_SelectionDlg::GetWidth(int type)
|
||||||
|
{
|
||||||
|
if (type > 0 && type <= 2)
|
||||||
|
return myWidth[type-1]->value();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : SetPrecision()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void SMESHGUI_Preferences_SelectionDlg::SetPrecision(int type, double value)
|
||||||
|
{
|
||||||
|
if (type > 0 && type <= 2)
|
||||||
|
myPrecision[type-1]->setText(QString::number(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : GetPrecision()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
double SMESHGUI_Preferences_SelectionDlg::GetPrecision(int type)
|
||||||
|
{
|
||||||
|
if (type > 0 && type <= 2)
|
||||||
|
return myPrecision[type-1]->text().toDouble();
|
||||||
|
}
|
97
src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// SMESH SMESHGUI : GUI for SMESH component
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platorm.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_Preferences_SelectionDlg.h
|
||||||
|
// Author : Natalia KOPNOVA
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef SMESHGUI_PREFERENCES_SELECTIONDLG_H
|
||||||
|
#define SMESHGUI_PREFERENCES_SELECTIONDLG_H
|
||||||
|
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qdialog.h>
|
||||||
|
#include <qlineedit.h>
|
||||||
|
#include <qvalidator.h>
|
||||||
|
|
||||||
|
class QPushButton;
|
||||||
|
class QSpinBox;
|
||||||
|
class QColor;
|
||||||
|
|
||||||
|
class SMESHGUI_LineEdit : public QLineEdit
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_LineEdit(QWidget* parent, const char* name = 0);
|
||||||
|
SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char* name = 0);
|
||||||
|
|
||||||
|
~SMESHGUI_LineEdit() {};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void focusOutEvent(QFocusEvent* e);
|
||||||
|
};
|
||||||
|
|
||||||
|
class SMESHGUI_DoubleValidator : public QDoubleValidator
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_DoubleValidator(QObject* parent, const char* name = 0);
|
||||||
|
SMESHGUI_DoubleValidator(double bottom, double top, int decimals,
|
||||||
|
QObject* parent, const char* name = 0);
|
||||||
|
|
||||||
|
~SMESHGUI_DoubleValidator() {};
|
||||||
|
|
||||||
|
void fixup(QString& text) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SMESHGUI_Preferences_SelectionDlg : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SMESHGUI_Preferences_SelectionDlg( QWidget* parent = 0, const char* name = 0 );
|
||||||
|
~SMESHGUI_Preferences_SelectionDlg();
|
||||||
|
|
||||||
|
void SetColor(int type, QColor color);
|
||||||
|
QColor GetColor(int type);
|
||||||
|
void SetWidth(int type, int value);
|
||||||
|
int GetWidth(int type);
|
||||||
|
void SetPrecision(int type, double value);
|
||||||
|
double GetPrecision(int type);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void closeEvent( QCloseEvent* e ) ;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onSelectColor();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPushButton* myColor[3];
|
||||||
|
QSpinBox* myWidth[2];
|
||||||
|
QLineEdit* myPrecision[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SMESHGUI_PREFERENCES_SELECTIONDLG_H
|
187
src/SMESHGUI/SMESHGUI_XmlHandler.cxx
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
// SMESH SMESHGUI : reading of xml file with list of available hypotheses and algorithms
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_XmlHandler.cxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#define INCLUDE_MENUITEM_DEF
|
||||||
|
|
||||||
|
#include "SMESHGUI_XmlHandler.h"
|
||||||
|
|
||||||
|
// QT Include
|
||||||
|
//#include <qaccel.h>
|
||||||
|
#include <qfileinfo.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Constructor
|
||||||
|
*/
|
||||||
|
SMESHGUI_XmlHandler::SMESHGUI_XmlHandler()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Destructor
|
||||||
|
*/
|
||||||
|
SMESHGUI_XmlHandler::~SMESHGUI_XmlHandler()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Starts parsing of document. Does some initialization
|
||||||
|
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
bool SMESHGUI_XmlHandler::startDocument()
|
||||||
|
{
|
||||||
|
myErrorProt = "";
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Does different actions depending on the name of the tag and the
|
||||||
|
state you are in document.
|
||||||
|
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&,
|
||||||
|
const QString& qName,
|
||||||
|
const QXmlAttributes& atts)
|
||||||
|
{
|
||||||
|
if (qName == "meshers")
|
||||||
|
{
|
||||||
|
myHypothesesMap.clear();
|
||||||
|
myAlgorithmsMap.clear();
|
||||||
|
}
|
||||||
|
else if (qName == "meshers-group") // group of hypotheses and algorithms
|
||||||
|
{
|
||||||
|
// if (atts.value("server-lib") != "")
|
||||||
|
{
|
||||||
|
myPluginName = atts.value("name");
|
||||||
|
myServerLib = atts.value("server-lib");
|
||||||
|
myClientLib = atts.value("gui-lib");
|
||||||
|
|
||||||
|
QString aResName = atts.value("resources");
|
||||||
|
if (aResName != "")
|
||||||
|
{
|
||||||
|
MESSAGE("Loading Resources " << aResName);
|
||||||
|
QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
|
||||||
|
QString msg;
|
||||||
|
if (!resMgr->loadResources(aResName, msg))
|
||||||
|
MESSAGE(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (qName == "hypotheses") // group of hypotheses
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (qName == "algorithms") // group of algorithms
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (qName == "hypothesis" || qName == "algorithm") // hypothesis or algorithm
|
||||||
|
{
|
||||||
|
if (atts.value("type") != "")
|
||||||
|
{
|
||||||
|
QString aHypAlType = atts.value("type");
|
||||||
|
QString aLabel = atts.value("label-id");
|
||||||
|
QString anIcon = atts.value("icon-id");
|
||||||
|
HypothesisData* aHypLibNames =
|
||||||
|
new HypothesisData (myPluginName, myServerLib, myClientLib,
|
||||||
|
aLabel, anIcon);
|
||||||
|
|
||||||
|
if (qName == "algorithm")
|
||||||
|
{
|
||||||
|
myAlgorithmsMap[(char*)aHypAlType.latin1()] = aHypLibNames;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
myHypothesesMap[(char*)aHypAlType.latin1()] = aHypLibNames;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// error
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
bool SMESHGUI_XmlHandler::endElement (const QString&, const QString&, const QString&)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
bool SMESHGUI_XmlHandler::characters (const QString& ch)
|
||||||
|
{
|
||||||
|
// we are not interested in whitespaces
|
||||||
|
QString ch_simplified = ch.simplifyWhiteSpace();
|
||||||
|
if ( ch_simplified.isEmpty() )
|
||||||
|
return TRUE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the default error string.
|
||||||
|
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
QString SMESHGUI_XmlHandler::errorString()
|
||||||
|
{
|
||||||
|
return "the document is not in the quote file format";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the error protocol if parsing failed
|
||||||
|
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
QString SMESHGUI_XmlHandler::errorProtocol()
|
||||||
|
{
|
||||||
|
return myErrorProt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns exception
|
||||||
|
|
||||||
|
Reimplemented from QXmlDefaultHandler.
|
||||||
|
*/
|
||||||
|
bool SMESHGUI_XmlHandler::fatalError (const QXmlParseException& exception)
|
||||||
|
{
|
||||||
|
myErrorProt += QString("fatal parsing error: %1 in line %2, column %3\n")
|
||||||
|
.arg(exception.message())
|
||||||
|
.arg(exception.lineNumber())
|
||||||
|
.arg(exception.columnNumber());
|
||||||
|
|
||||||
|
return QXmlDefaultHandler::fatalError( exception );
|
||||||
|
}
|
58
src/SMESHGUI/SMESHGUI_XmlHandler.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// SMESH SMESHGUI : reading of xml file with list of available hypotheses and algorithms
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESHGUI_XmlHandler.cxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
|
||||||
|
#include <qxml.h>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class SMESHGUI_XmlHandler : public QXmlDefaultHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SMESHGUI_XmlHandler();
|
||||||
|
virtual ~SMESHGUI_XmlHandler();
|
||||||
|
|
||||||
|
bool startDocument();
|
||||||
|
bool startElement( const QString& namespaceURI, const QString& localName,
|
||||||
|
const QString& qName, const QXmlAttributes& atts );
|
||||||
|
bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName );
|
||||||
|
bool characters( const QString& ch );
|
||||||
|
|
||||||
|
QString errorString();
|
||||||
|
QString errorProtocol();
|
||||||
|
bool fatalError (const QXmlParseException& exception);
|
||||||
|
|
||||||
|
public:
|
||||||
|
map<string, HypothesisData*> myHypothesesMap;
|
||||||
|
map<string, HypothesisData*> myAlgorithmsMap;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString myErrorProt;
|
||||||
|
QString myPluginName;
|
||||||
|
QString myServerLib;
|
||||||
|
QString myClientLib;
|
||||||
|
};
|
23
src/SMESH_I/SMESHEngine.cxx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
914
src/SMESH_I/SMESH_Filter_i.cxx
Normal file
@ -0,0 +1,914 @@
|
|||||||
|
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Filter_i.cxx
|
||||||
|
// Author : Alexey Petrov, OCC
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
|
||||||
|
#include "SMESH_Filter_i.hxx"
|
||||||
|
|
||||||
|
#include "SMDS_Iterator.hxx"
|
||||||
|
#include "SMDS_MeshElement.hxx"
|
||||||
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
#include "SMDSAbs_ElementType.hxx"
|
||||||
|
#include "SMESH_Gen_i.hxx"
|
||||||
|
#include "SMESHDS_Mesh.hxx"
|
||||||
|
|
||||||
|
#include <gp_Pnt.hxx>
|
||||||
|
#include <gp_Vec.hxx>
|
||||||
|
#include <gp_XYZ.hxx>
|
||||||
|
#include <Precision.hxx>
|
||||||
|
#include <TColgp_SequenceOfXYZ.hxx>
|
||||||
|
#include <TColStd_ListOfInteger.hxx>
|
||||||
|
#include <TColStd_MapOfInteger.hxx>
|
||||||
|
#include <TColStd_ListIteratorOfListOfInteger.hxx>
|
||||||
|
|
||||||
|
/*
|
||||||
|
AUXILIARY METHODS
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline double getAngle( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 )
|
||||||
|
{
|
||||||
|
return gp_Vec( P1 - P2 ).Angle( gp_Vec( P3 - P2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double getArea( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 )
|
||||||
|
{
|
||||||
|
gp_Vec aVec1( P2 - P1 );
|
||||||
|
gp_Vec aVec2( P3 - P1 );
|
||||||
|
return ( aVec1 ^ aVec2 ).Magnitude() * 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double getArea( const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3 )
|
||||||
|
{
|
||||||
|
return getArea( P1.XYZ(), P2.XYZ(), P3.XYZ() );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double getDistance( const gp_XYZ& P1, const gp_XYZ& P2 )
|
||||||
|
{
|
||||||
|
double aDist = gp_Pnt( P1 ).Distance( gp_Pnt( P2 ) );
|
||||||
|
return aDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getNbMultiConnection( SMESHDS_Mesh* theMesh, const int theId )
|
||||||
|
{
|
||||||
|
if ( theMesh == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
const SMDS_MeshElement* anEdge = theMesh->FindElement( theId );
|
||||||
|
if ( anEdge == 0 || anEdge->GetType() != SMDSAbs_Edge || anEdge->NbNodes() != 2 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
TColStd_MapOfInteger aMap;
|
||||||
|
|
||||||
|
int aResult = 0;
|
||||||
|
SMDS_ElemIteratorPtr anIter = anEdge->nodesIterator();
|
||||||
|
if ( anIter != 0 )
|
||||||
|
{
|
||||||
|
while( anIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next();
|
||||||
|
if ( aNode == 0 )
|
||||||
|
return 0;
|
||||||
|
SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator();
|
||||||
|
while( anElemIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* anElem = anElemIter->next();
|
||||||
|
if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge )
|
||||||
|
{
|
||||||
|
int anId = anElem->GetID();
|
||||||
|
|
||||||
|
if ( anIter->more() ) // i.e. first node
|
||||||
|
aMap.Add( anId );
|
||||||
|
else if ( aMap.Contains( anId ) )
|
||||||
|
aResult++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// delete anElemIter;
|
||||||
|
}
|
||||||
|
// delete anIter;
|
||||||
|
}
|
||||||
|
|
||||||
|
return aResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace SMESH;
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTORS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : NumericalFunctor_i
|
||||||
|
Description : Base class for numerical functors
|
||||||
|
*/
|
||||||
|
|
||||||
|
NumericalFunctor_i::NumericalFunctor_i()
|
||||||
|
: SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() )
|
||||||
|
{
|
||||||
|
myMesh = 0;
|
||||||
|
SMESH_Gen_i::GetPOA()->activate_object( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void NumericalFunctor_i::SetMesh( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
SMESH_Mesh_i* anImplPtr =
|
||||||
|
dynamic_cast<SMESH_Mesh_i*>( SMESH_Gen_i::GetServant( theMesh ).in() );
|
||||||
|
myMesh = anImplPtr ? anImplPtr->GetImpl().GetMeshDS() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NumericalFunctor_i::getPoints( const int theId,
|
||||||
|
TColgp_SequenceOfXYZ& theRes ) const
|
||||||
|
{
|
||||||
|
theRes.Clear();
|
||||||
|
|
||||||
|
if ( myMesh == 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Get nodes of the face
|
||||||
|
const SMDS_MeshElement* anElem = myMesh->FindElement( theId );
|
||||||
|
if ( anElem == 0 || anElem->GetType() != GetType() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int nbNodes = anElem->NbNodes();
|
||||||
|
|
||||||
|
SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
|
||||||
|
if ( anIter != 0 )
|
||||||
|
{
|
||||||
|
while( anIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next();
|
||||||
|
if ( aNode != 0 )
|
||||||
|
theRes.Append( gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete anIter;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_MinimumAngleFunct
|
||||||
|
Description : Functor for calculation of minimum angle
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double MinimumAngle_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
double aMin;
|
||||||
|
|
||||||
|
if ( P.Length() == 3 )
|
||||||
|
{
|
||||||
|
double A0 = getAngle( P( 3 ), P( 1 ), P( 2 ) );
|
||||||
|
double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
double A2 = getAngle( P( 2 ), P( 3 ), P( 1 ) );
|
||||||
|
|
||||||
|
aMin = Min( A0, Min( A1, A2 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double A0 = getAngle( P( 4 ), P( 1 ), P( 2 ) );
|
||||||
|
double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
double A2 = getAngle( P( 2 ), P( 3 ), P( 4 ) );
|
||||||
|
double A3 = getAngle( P( 3 ), P( 4 ), P( 1 ) );
|
||||||
|
|
||||||
|
aMin = Min( Min( A0, A1 ), Min( A2, A3 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return aMin * 180 / PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MinimumAngle_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : AspectRatio_i
|
||||||
|
Description : Functor for calculating aspect ratio
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double AspectRatio_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int nbNodes = P.Length();
|
||||||
|
|
||||||
|
// Compute lengths of the sides
|
||||||
|
|
||||||
|
double aLen[ nbNodes ];
|
||||||
|
for ( int i = 0; i < nbNodes - 1; i++ )
|
||||||
|
aLen[ i ] = getDistance( P( i + 1 ), P( i + 2 ) );
|
||||||
|
aLen[ nbNodes - 1 ] = getDistance( P( 1 ), P( nbNodes ) );
|
||||||
|
|
||||||
|
// Compute aspect ratio
|
||||||
|
|
||||||
|
if ( nbNodes == 3 )
|
||||||
|
{
|
||||||
|
double aMaxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
|
||||||
|
double anArea = getArea( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
static double aCoef = sqrt( 3. ) / 4;
|
||||||
|
|
||||||
|
return anArea != 0 ? aCoef * aMaxLen * aMaxLen / anArea : 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double aMaxLen = Max( Max( aLen[ 0 ], aLen[ 1 ] ), Max( aLen[ 2 ], aLen[ 3 ] ) );
|
||||||
|
double aMinLen = Min( Min( aLen[ 0 ], aLen[ 1 ] ), Min( aLen[ 2 ], aLen[ 3 ] ) );
|
||||||
|
|
||||||
|
return aMinLen != 0 ? aMaxLen / aMinLen : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int AspectRatio_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Warping_i
|
||||||
|
Description : Functor for calculating warping
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double Warping_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gp_XYZ G = ( P( 1 ) + P( 2 ) + P( 3 ) + P( 4 ) ) / 4;
|
||||||
|
|
||||||
|
double A1 = ComputeA( P( 1 ), P( 2 ), P( 3 ), G );
|
||||||
|
double A2 = ComputeA( P( 2 ), P( 3 ), P( 4 ), G );
|
||||||
|
double A3 = ComputeA( P( 3 ), P( 4 ), P( 1 ), G );
|
||||||
|
double A4 = ComputeA( P( 4 ), P( 1 ), P( 2 ), G );
|
||||||
|
|
||||||
|
return Max( Max( A1, A2 ), Max( A3, A4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
double Warping_i::ComputeA( const gp_XYZ& thePnt1,
|
||||||
|
const gp_XYZ& thePnt2,
|
||||||
|
const gp_XYZ& thePnt3,
|
||||||
|
const gp_XYZ& theG ) const
|
||||||
|
{
|
||||||
|
double aLen1 = gp_Pnt( thePnt1 ).Distance( gp_Pnt( thePnt2 ) );
|
||||||
|
double aLen2 = gp_Pnt( thePnt2 ).Distance( gp_Pnt( thePnt3 ) );
|
||||||
|
double L = Min( aLen1, aLen2 ) * 0.5;
|
||||||
|
|
||||||
|
gp_XYZ GI = ( thePnt2 - thePnt1 ) / 2. - theG;
|
||||||
|
gp_XYZ GJ = ( thePnt3 - thePnt2 ) / 2. - theG;
|
||||||
|
gp_XYZ N = GI.Crossed( GJ );
|
||||||
|
N.Normalize();
|
||||||
|
|
||||||
|
double H = gp_Vec( thePnt2 - theG ).Dot( gp_Vec( N ) );
|
||||||
|
return asin( fabs( H / L ) ) * 180 / PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Warping_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Taper_i
|
||||||
|
Description : Functor for calculating taper
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double Taper_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Compute taper
|
||||||
|
double J1 = getArea( P( 4 ), P( 1 ), P( 2 ) ) / 2;
|
||||||
|
double J2 = getArea( P( 3 ), P( 1 ), P( 2 ) ) / 2;
|
||||||
|
double J3 = getArea( P( 2 ), P( 3 ), P( 4 ) ) / 2;
|
||||||
|
double J4 = getArea( P( 3 ), P( 4 ), P( 1 ) ) / 2;
|
||||||
|
|
||||||
|
double JA = 0.25 * ( J1 + J2 + J3 + J4 );
|
||||||
|
|
||||||
|
double T1 = fabs( ( J1 - JA ) / JA );
|
||||||
|
double T2 = fabs( ( J2 - JA ) / JA );
|
||||||
|
double T3 = fabs( ( J3 - JA ) / JA );
|
||||||
|
double T4 = fabs( ( J4 - JA ) / JA );
|
||||||
|
|
||||||
|
return Max( Max( T1, T2 ), Max( T3, T4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int Taper_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Skew_i
|
||||||
|
Description : Functor for calculating skew in degrees
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline double skewAngle( const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3 )
|
||||||
|
{
|
||||||
|
gp_XYZ p12 = ( p2 + p1 ) / 2;
|
||||||
|
gp_XYZ p23 = ( p3 + p2 ) / 2;
|
||||||
|
gp_XYZ p31 = ( p3 + p1 ) / 2;
|
||||||
|
|
||||||
|
return gp_Vec( p31 - p2 ).Angle( p12 - p23 );
|
||||||
|
}
|
||||||
|
|
||||||
|
CORBA::Double Skew_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Compute skew
|
||||||
|
static double PI2 = PI / 2;
|
||||||
|
if ( P.Length() == 3 )
|
||||||
|
{
|
||||||
|
double A0 = fabs( PI2 - skewAngle( P( 3 ), P( 1 ), P( 2 ) ) );
|
||||||
|
double A1 = fabs( PI2 - skewAngle( P( 1 ), P( 2 ), P( 3 ) ) );
|
||||||
|
double A2 = fabs( PI2 - skewAngle( P( 2 ), P( 3 ), P( 1 ) ) );
|
||||||
|
|
||||||
|
return Max( A0, Max( A1, A2 ) ) * 180 / PI;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gp_XYZ p12 = ( P( 1 ) + P( 2 ) ) / 2;
|
||||||
|
gp_XYZ p23 = ( P( 2 ) + P( 3 ) ) / 2;
|
||||||
|
gp_XYZ p34 = ( P( 3 ) + P( 4 ) ) / 2;
|
||||||
|
gp_XYZ p41 = ( P( 4 ) + P( 1 ) ) / 2;
|
||||||
|
|
||||||
|
double A = fabs( PI2 - gp_Vec( p34 - p12 ).Angle( p23 - p41 ) );
|
||||||
|
|
||||||
|
return A * 180 / PI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Skew_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Area_i
|
||||||
|
Description : Functor for calculating area
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double Area_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ( P.Length() == 3 )
|
||||||
|
return getArea( P( 1 ), P( 2 ), P( 3 ) );
|
||||||
|
else
|
||||||
|
return getArea( P( 1 ), P( 2 ), P( 3 ) ) + getArea( P( 1 ), P( 3 ), P( 4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int Area_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Face;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Length_i
|
||||||
|
Description : Functor for calculating length off edge
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double Length_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
TColgp_SequenceOfXYZ P;
|
||||||
|
return getPoints( theId, P ) && P.Length() == 2 ? getDistance( P( 1 ), P( 2 ) ) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Length_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Edge;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MultiConnection_i
|
||||||
|
Description : Functor for calculating number of faces conneted to the edge
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Double MultiConnection_i::GetValue( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return getNbMultiConnection( myMesh, theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
int MultiConnection_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Edge;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
PREDICATES
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Predicate_i
|
||||||
|
Description : Base class for all predicates
|
||||||
|
*/
|
||||||
|
Predicate_i::Predicate_i()
|
||||||
|
: SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() )
|
||||||
|
{
|
||||||
|
SMESH_Gen_i::GetPOA()->activate_object( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : FreeBorders_i
|
||||||
|
Description : Predicate for free borders
|
||||||
|
*/
|
||||||
|
|
||||||
|
FreeBorders_i::FreeBorders_i()
|
||||||
|
{
|
||||||
|
myMesh = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FreeBorders_i::SetMesh( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
SMESH_Mesh_i* anImplPtr =
|
||||||
|
dynamic_cast<SMESH_Mesh_i*>( SMESH_Gen_i::GetServant( theMesh ).in() );
|
||||||
|
myMesh = anImplPtr ? anImplPtr->GetImpl().GetMeshDS() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CORBA::Boolean FreeBorders_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return getNbMultiConnection( myMesh, theId ) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FreeBorders_i::GetType() const
|
||||||
|
{
|
||||||
|
return SMDSAbs_Edge;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Comparator_i
|
||||||
|
Description : Base class for comparators
|
||||||
|
*/
|
||||||
|
|
||||||
|
Comparator_i::Comparator_i()
|
||||||
|
{
|
||||||
|
myMargin = 0;
|
||||||
|
myFunctor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Comparator_i::~Comparator_i()
|
||||||
|
{
|
||||||
|
if ( myFunctor != 0 )
|
||||||
|
myFunctor->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comparator_i::SetMesh( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
if ( myFunctor != 0 )
|
||||||
|
myFunctor->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comparator_i::SetMargin( CORBA::Double theValue )
|
||||||
|
{
|
||||||
|
myMargin = theValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comparator_i::SetNumFunctor( NumericalFunctor_ptr theFunct )
|
||||||
|
{
|
||||||
|
if ( myFunctor != 0 )
|
||||||
|
myFunctor->Destroy();
|
||||||
|
|
||||||
|
myFunctor = dynamic_cast<NumericalFunctor_i*>( SMESH_Gen_i::GetServant( theFunct ).in() );
|
||||||
|
|
||||||
|
if ( myFunctor != 0 )
|
||||||
|
myFunctor->Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
int Comparator_i::GetType() const
|
||||||
|
{
|
||||||
|
return myFunctor != 0 ? myFunctor->GetType() : SMDSAbs_All;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LessThan_i
|
||||||
|
Description : Comparator "<"
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Boolean LessThan_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return myFunctor != 0 && myFunctor->GetValue( theId ) < myMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MoreThan_i
|
||||||
|
Description : Comparator ">"
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Boolean MoreThan_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return myFunctor != 0 && myFunctor->GetValue( theId ) > myMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : EqualTo_i
|
||||||
|
Description : Comparator "="
|
||||||
|
*/
|
||||||
|
EqualTo_i::EqualTo_i()
|
||||||
|
{
|
||||||
|
myToler = Precision::Confusion();
|
||||||
|
}
|
||||||
|
|
||||||
|
CORBA::Boolean EqualTo_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return myFunctor != 0 && fabs( myFunctor->GetValue( theId ) - myMargin ) < myToler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EqualTo_i::SetTolerance( CORBA::Double theToler )
|
||||||
|
{
|
||||||
|
myToler = theToler;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalNOT_i
|
||||||
|
Description : Logical NOT predicate
|
||||||
|
*/
|
||||||
|
|
||||||
|
LogicalNOT_i::LogicalNOT_i()
|
||||||
|
{
|
||||||
|
myPredicate = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogicalNOT_i::~LogicalNOT_i()
|
||||||
|
{
|
||||||
|
if ( myPredicate )
|
||||||
|
myPredicate->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
CORBA::Boolean LogicalNOT_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return myPredicate !=0 && !myPredicate->IsSatisfy( theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalNOT_i::SetMesh( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalNOT_i::SetPredicate( Predicate_ptr thePred )
|
||||||
|
{
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->Destroy();
|
||||||
|
|
||||||
|
myPredicate = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePred ).in() );
|
||||||
|
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
int LogicalNOT_i::GetType() const
|
||||||
|
{
|
||||||
|
return myPredicate != 0 ? myPredicate->GetType() : SMDSAbs_All;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalBinary_i
|
||||||
|
Description : Base class for binary logical predicate
|
||||||
|
*/
|
||||||
|
|
||||||
|
LogicalBinary_i::LogicalBinary_i()
|
||||||
|
{
|
||||||
|
myPredicate1 = 0;
|
||||||
|
myPredicate2 = 0;
|
||||||
|
}
|
||||||
|
LogicalBinary_i::~LogicalBinary_i()
|
||||||
|
{
|
||||||
|
if ( myPredicate1 != 0 )
|
||||||
|
myPredicate1->Destroy();
|
||||||
|
|
||||||
|
if ( myPredicate2 != 0 )
|
||||||
|
myPredicate2->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalBinary_i::SetMesh( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
if ( myPredicate1 != 0 )
|
||||||
|
myPredicate1->SetMesh( theMesh );
|
||||||
|
|
||||||
|
if ( myPredicate2 != 0 )
|
||||||
|
myPredicate2->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalBinary_i::SetPredicate1( Predicate_ptr thePredicate )
|
||||||
|
{
|
||||||
|
if ( myPredicate1 != 0 )
|
||||||
|
myPredicate1->Destroy();
|
||||||
|
|
||||||
|
myPredicate1 = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePredicate ).in() );
|
||||||
|
|
||||||
|
if ( myPredicate1 != 0 )
|
||||||
|
myPredicate1->Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogicalBinary_i::SetPredicate2( Predicate_ptr thePredicate )
|
||||||
|
{
|
||||||
|
if ( myPredicate2 != 0 )
|
||||||
|
myPredicate2->Destroy();
|
||||||
|
|
||||||
|
myPredicate2 = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePredicate ).in() );
|
||||||
|
|
||||||
|
if ( myPredicate2 != 0 )
|
||||||
|
myPredicate2->Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
int LogicalBinary_i::GetType() const
|
||||||
|
{
|
||||||
|
if ( myPredicate1 == 0 || myPredicate2 == 0 )
|
||||||
|
return SMDSAbs_All;
|
||||||
|
|
||||||
|
int aType1 = myPredicate1->GetType();
|
||||||
|
int aType2 = myPredicate2->GetType();
|
||||||
|
|
||||||
|
return aType1 == aType2 ? aType1 : SMDSAbs_All;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalAND_i
|
||||||
|
Description : Logical AND
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Boolean LogicalAND_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return myPredicate1 != 0 &&
|
||||||
|
myPredicate2 != 0 &&
|
||||||
|
myPredicate1->IsSatisfy( theId ) && myPredicate2->IsSatisfy( theId );;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalOR_i
|
||||||
|
Description : Logical OR
|
||||||
|
*/
|
||||||
|
|
||||||
|
CORBA::Boolean LogicalOR_i::IsSatisfy( CORBA::Long theId )
|
||||||
|
{
|
||||||
|
return myPredicate1 != 0 &&
|
||||||
|
myPredicate2 != 0 &&
|
||||||
|
myPredicate1->IsSatisfy( theId ) || myPredicate2->IsSatisfy( theId );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FILTER
|
||||||
|
*/
|
||||||
|
|
||||||
|
Filter_i::Filter_i()
|
||||||
|
{
|
||||||
|
myPredicate = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Filter_i::~Filter_i()
|
||||||
|
{
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Filter_i::SetPredicate( Predicate_ptr thePredicate )
|
||||||
|
{
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->Destroy();
|
||||||
|
|
||||||
|
myPredicate = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePredicate ).in() );
|
||||||
|
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Filter_i::SetMesh( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
myPredicate->SetMesh( theMesh );
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESH::long_array* Filter_i::GetElementsId( SMESH_Mesh_ptr theMesh )
|
||||||
|
{
|
||||||
|
|
||||||
|
SetMesh( theMesh );
|
||||||
|
|
||||||
|
SMESH_Mesh_i* anImplPtr =
|
||||||
|
dynamic_cast<SMESH_Mesh_i*>( SMESH_Gen_i::GetServant( theMesh ).in() );
|
||||||
|
|
||||||
|
TColStd_ListOfInteger aList;
|
||||||
|
|
||||||
|
if ( anImplPtr != 0 )
|
||||||
|
{
|
||||||
|
SMESHDS_Mesh* aMesh = anImplPtr->GetImpl().GetMeshDS();
|
||||||
|
|
||||||
|
if ( myPredicate != 0 )
|
||||||
|
{
|
||||||
|
int aType = myPredicate->GetType();
|
||||||
|
|
||||||
|
if ( aType == SMDSAbs_Edge )
|
||||||
|
{
|
||||||
|
SMDS_EdgeIteratorPtr anIter = aMesh->edgesIterator();
|
||||||
|
if ( anIter != 0 )
|
||||||
|
{
|
||||||
|
while( anIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* anElem = anIter->next();
|
||||||
|
if ( myPredicate->IsSatisfy( anElem->GetID() ) )
|
||||||
|
aList.Append( anElem->GetID() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// delete anIter;
|
||||||
|
}
|
||||||
|
else if ( aType == SMDSAbs_Face )
|
||||||
|
{
|
||||||
|
SMDS_FaceIteratorPtr anIter = aMesh->facesIterator();
|
||||||
|
if ( anIter != 0 )
|
||||||
|
{
|
||||||
|
while( anIter->more() )
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* anElem = anIter->next();
|
||||||
|
if ( myPredicate->IsSatisfy( anElem->GetID() ) )
|
||||||
|
aList.Append( anElem->GetID() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// delete anIter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SMESH::long_array_var anArray = new SMESH::long_array;
|
||||||
|
|
||||||
|
anArray->length( aList.Extent() );
|
||||||
|
TColStd_ListIteratorOfListOfInteger anIter( aList );
|
||||||
|
int i = 0;
|
||||||
|
for( ; anIter.More(); anIter.Next() )
|
||||||
|
anArray[ i++ ] = anIter.Value();
|
||||||
|
|
||||||
|
return anArray._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FILTER MANAGER
|
||||||
|
*/
|
||||||
|
|
||||||
|
FilterManager_i::FilterManager_i()
|
||||||
|
: SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() )
|
||||||
|
{
|
||||||
|
SMESH_Gen_i::GetPOA()->activate_object( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
MinimumAngle_ptr FilterManager_i::CreateMinimumAngle()
|
||||||
|
{
|
||||||
|
SMESH::MinimumAngle_i* aServant = new SMESH::MinimumAngle_i();
|
||||||
|
SMESH::MinimumAngle_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AspectRatio_ptr FilterManager_i::CreateAspectRatio()
|
||||||
|
{
|
||||||
|
SMESH::AspectRatio_i* aServant = new SMESH::AspectRatio_i();
|
||||||
|
SMESH::AspectRatio_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Warping_ptr FilterManager_i::CreateWarping()
|
||||||
|
{
|
||||||
|
SMESH::Warping_i* aServant = new SMESH::Warping_i();
|
||||||
|
SMESH::Warping_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Taper_ptr FilterManager_i::CreateTaper()
|
||||||
|
{
|
||||||
|
SMESH::Taper_i* aServant = new SMESH::Taper_i();
|
||||||
|
SMESH::Taper_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Skew_ptr FilterManager_i::CreateSkew()
|
||||||
|
{
|
||||||
|
SMESH::Skew_i* aServant = new SMESH::Skew_i();
|
||||||
|
SMESH::Skew_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Area_ptr FilterManager_i::CreateArea()
|
||||||
|
{
|
||||||
|
SMESH::Area_i* aServant = new SMESH::Area_i();
|
||||||
|
SMESH::Area_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Length_ptr FilterManager_i::CreateLength()
|
||||||
|
{
|
||||||
|
SMESH::Length_i* aServant = new SMESH::Length_i();
|
||||||
|
SMESH::Length_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MultiConnection_ptr FilterManager_i::CreateMultiConnection()
|
||||||
|
{
|
||||||
|
SMESH::MultiConnection_i* aServant = new SMESH::MultiConnection_i();
|
||||||
|
SMESH::MultiConnection_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FreeBorders_ptr FilterManager_i::CreateFreeBorders()
|
||||||
|
{
|
||||||
|
SMESH::FreeBorders_i* aServant = new SMESH::FreeBorders_i();
|
||||||
|
SMESH::FreeBorders_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
LessThan_ptr FilterManager_i::CreateLessThan()
|
||||||
|
{
|
||||||
|
SMESH::LessThan_i* aServant = new SMESH::LessThan_i();
|
||||||
|
SMESH::LessThan_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MoreThan_ptr FilterManager_i::CreateMoreThan()
|
||||||
|
{
|
||||||
|
SMESH::MoreThan_i* aServant = new SMESH::MoreThan_i();
|
||||||
|
SMESH::MoreThan_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
EqualTo_ptr FilterManager_i::CreateEqualTo()
|
||||||
|
{
|
||||||
|
SMESH::EqualTo_i* aServant = new SMESH::EqualTo_i();
|
||||||
|
SMESH::EqualTo_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LogicalNOT_ptr FilterManager_i::CreateLogicalNOT()
|
||||||
|
{
|
||||||
|
SMESH::LogicalNOT_i* aServant = new SMESH::LogicalNOT_i();
|
||||||
|
SMESH::LogicalNOT_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LogicalAND_ptr FilterManager_i::CreateLogicalAND()
|
||||||
|
{
|
||||||
|
SMESH::LogicalAND_i* aServant = new SMESH::LogicalAND_i();
|
||||||
|
SMESH::LogicalAND_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LogicalOR_ptr FilterManager_i::CreateLogicalOR()
|
||||||
|
{
|
||||||
|
SMESH::LogicalOR_i* aServant = new SMESH::LogicalOR_i();
|
||||||
|
SMESH::LogicalOR_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
Filter_ptr FilterManager_i::CreateFilter()
|
||||||
|
{
|
||||||
|
SMESH::Filter_i* aServant = new SMESH::Filter_i();
|
||||||
|
SMESH::Filter_var anObj = aServant->_this();
|
||||||
|
return anObj._retn();
|
||||||
|
}
|
417
src/SMESH_I/SMESH_Filter_i.hxx
Normal file
@ -0,0 +1,417 @@
|
|||||||
|
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Filter_i.hxx
|
||||||
|
// Author : Alexey Petrov, OCC
|
||||||
|
// Module : SMESH
|
||||||
|
|
||||||
|
#ifndef _SMESH_FILTER_I_HXX_
|
||||||
|
#define _SMESH_FILTER_I_HXX_
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Filter)
|
||||||
|
#include "SALOME_GenericObj_i.hh"
|
||||||
|
|
||||||
|
class SMESHDS_Mesh;
|
||||||
|
class gp_Pnt;
|
||||||
|
class gp_XYZ;
|
||||||
|
class TColgp_SequenceOfXYZ;
|
||||||
|
|
||||||
|
namespace SMESH{
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTORS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : NumericalFunctor_i
|
||||||
|
Description : Base class for numerical functors
|
||||||
|
|
||||||
|
PortableServer::POA_ptr thePOA
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class NumericalFunctor_i: public virtual POA_SMESH::NumericalFunctor,
|
||||||
|
public virtual SALOME::GenericObj_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NumericalFunctor_i();
|
||||||
|
void SetMesh( SMESH_Mesh_ptr theMesh );
|
||||||
|
virtual int GetType() const = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool getPoints( const int theId,
|
||||||
|
TColgp_SequenceOfXYZ& theRes ) const;
|
||||||
|
protected:
|
||||||
|
SMESHDS_Mesh* myMesh;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : SMESH_MinimumAngleFunct
|
||||||
|
Description : Functor for calculation of minimum angle
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MinimumAngle_i: public virtual POA_SMESH::MinimumAngle,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : AspectRatio_i
|
||||||
|
Description : Functor for calculating aspect ratio
|
||||||
|
*/
|
||||||
|
|
||||||
|
class AspectRatio_i: public virtual POA_SMESH::AspectRatio,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue(CORBA::Long theElementId);
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Warping_i
|
||||||
|
Description : Functor for calculating warping
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Warping_i: public virtual POA_SMESH::Warping,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue(CORBA::Long theElementId);
|
||||||
|
virtual int GetType() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
double ComputeA( const gp_XYZ&, const gp_XYZ&,
|
||||||
|
const gp_XYZ&, const gp_XYZ& ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Taper_i
|
||||||
|
Description : Functor for calculating taper
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Taper_i: public virtual POA_SMESH::Taper,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Skew_i
|
||||||
|
Description : Functor for calculating skew in degrees
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Skew_i: public virtual POA_SMESH::Skew,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Area_i
|
||||||
|
Description : Functor for calculating area
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Area_i: public virtual POA_SMESH::Area,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Length_i
|
||||||
|
Description : Functor for calculating length of edge
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Length_i: public virtual POA_SMESH::Length,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MultiConnection_i
|
||||||
|
Description : Functor for calculating number of faces conneted to the edge
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MultiConnection_i: public virtual POA_SMESH::MultiConnection,
|
||||||
|
public virtual NumericalFunctor_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Double GetValue( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
PREDICATES
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Predicate_i
|
||||||
|
Description : Base class for all predicates
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Predicate_i: public virtual POA_SMESH::Predicate,
|
||||||
|
public virtual SALOME::GenericObj_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Predicate_i();
|
||||||
|
virtual int GetType() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : FreeBorders_i
|
||||||
|
Description : Predicate for free borders
|
||||||
|
*/
|
||||||
|
|
||||||
|
class FreeBorders_i: public virtual POA_SMESH::FreeBorders,
|
||||||
|
public virtual Predicate_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FreeBorders_i();
|
||||||
|
void SetMesh( SMESH_Mesh_ptr theMesh );
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
|
||||||
|
virtual int GetType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SMESHDS_Mesh* myMesh;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Comparator_i
|
||||||
|
Description : Base class for comparators
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Comparator_i: public virtual POA_SMESH::Comparator,
|
||||||
|
public virtual Predicate_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Comparator_i();
|
||||||
|
virtual ~Comparator_i();
|
||||||
|
|
||||||
|
void SetMesh( SMESH_Mesh_ptr theMesh );
|
||||||
|
void SetMargin( CORBA::Double );
|
||||||
|
void SetNumFunctor( NumericalFunctor_ptr );
|
||||||
|
|
||||||
|
virtual int GetType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CORBA::Double myMargin;
|
||||||
|
NumericalFunctor_i* myFunctor;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LessThan_i
|
||||||
|
Description : Comparator "<"
|
||||||
|
*/
|
||||||
|
|
||||||
|
class LessThan_i: public virtual POA_SMESH::LessThan,
|
||||||
|
public virtual Comparator_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : MoreThan_i
|
||||||
|
Description : Comparator ">"
|
||||||
|
*/
|
||||||
|
class MoreThan_i: public virtual POA_SMESH::MoreThan,
|
||||||
|
public virtual Comparator_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : EqualTo_i
|
||||||
|
Description : Comparator "="
|
||||||
|
*/
|
||||||
|
class EqualTo_i: public virtual POA_SMESH::EqualTo,
|
||||||
|
public virtual Comparator_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EqualTo_i();
|
||||||
|
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
|
||||||
|
|
||||||
|
void SetTolerance( CORBA::Double );
|
||||||
|
|
||||||
|
private:
|
||||||
|
CORBA::Double myToler;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : Logical_i
|
||||||
|
Description : Base class for logical predicate
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Logical_i: public virtual POA_SMESH::Logical,
|
||||||
|
public virtual Predicate_i
|
||||||
|
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalNOT_i
|
||||||
|
Description : Logical NOT predicate
|
||||||
|
*/
|
||||||
|
|
||||||
|
class LogicalNOT_i: public virtual POA_SMESH::LogicalNOT,
|
||||||
|
public virtual Logical_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LogicalNOT_i();
|
||||||
|
virtual ~LogicalNOT_i();
|
||||||
|
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long );
|
||||||
|
|
||||||
|
void SetMesh( SMESH_Mesh_ptr );
|
||||||
|
void SetPredicate( Predicate_ptr );
|
||||||
|
|
||||||
|
virtual int GetType() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Predicate_i* myPredicate;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalBinary_i
|
||||||
|
Description : Base class for binary logical predicate
|
||||||
|
*/
|
||||||
|
|
||||||
|
class LogicalBinary_i: public virtual POA_SMESH::LogicalBinary,
|
||||||
|
public virtual Logical_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LogicalBinary_i();
|
||||||
|
virtual ~LogicalBinary_i();
|
||||||
|
|
||||||
|
void SetMesh( SMESH_Mesh_ptr );
|
||||||
|
|
||||||
|
void SetPredicate1( Predicate_ptr );
|
||||||
|
void SetPredicate2( Predicate_ptr );
|
||||||
|
|
||||||
|
virtual int GetType() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Predicate_i* myPredicate1;
|
||||||
|
Predicate_i* myPredicate2;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalAND_i
|
||||||
|
Description : Logical AND
|
||||||
|
*/
|
||||||
|
|
||||||
|
class LogicalAND_i: public virtual POA_SMESH::LogicalAND,
|
||||||
|
public virtual LogicalBinary_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Class : LogicalOR_i
|
||||||
|
Description : Logical OR
|
||||||
|
*/
|
||||||
|
|
||||||
|
class LogicalOR_i: public virtual POA_SMESH::LogicalOR,
|
||||||
|
public virtual LogicalBinary_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FILTER
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Filter_i: public virtual POA_SMESH::Filter,
|
||||||
|
public virtual SALOME::GenericObj_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Filter_i();
|
||||||
|
virtual ~Filter_i();
|
||||||
|
void SetPredicate(Predicate_ptr );
|
||||||
|
long_array* GetElementsId(SMESH_Mesh_ptr );
|
||||||
|
void SetMesh( SMESH_Mesh_ptr );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Predicate_i* myPredicate;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FILTER MANAGER
|
||||||
|
*/
|
||||||
|
|
||||||
|
class FilterManager_i: public virtual POA_SMESH::FilterManager,
|
||||||
|
public virtual SALOME::GenericObj_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FilterManager_i();
|
||||||
|
MinimumAngle_ptr CreateMinimumAngle();
|
||||||
|
AspectRatio_ptr CreateAspectRatio();
|
||||||
|
Warping_ptr CreateWarping();
|
||||||
|
Taper_ptr CreateTaper();
|
||||||
|
Skew_ptr CreateSkew();
|
||||||
|
Area_ptr CreateArea();
|
||||||
|
Length_ptr CreateLength();
|
||||||
|
MultiConnection_ptr CreateMultiConnection();
|
||||||
|
|
||||||
|
FreeBorders_ptr CreateFreeBorders();
|
||||||
|
|
||||||
|
LessThan_ptr CreateLessThan();
|
||||||
|
MoreThan_ptr CreateMoreThan();
|
||||||
|
EqualTo_ptr CreateEqualTo();
|
||||||
|
|
||||||
|
LogicalNOT_ptr CreateLogicalNOT();
|
||||||
|
LogicalAND_ptr CreateLogicalAND();
|
||||||
|
LogicalOR_ptr CreateLogicalOR();
|
||||||
|
|
||||||
|
Filter_ptr CreateFilter();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
358
src/SMESH_I/SMESH_Group_i.cxx
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Group_i.cxx
|
||||||
|
// Author : Sergey ANIKIN, OCC
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#include "SMESH_Group_i.hxx"
|
||||||
|
#include "SMESH_Mesh_i.hxx"
|
||||||
|
#include "SMESH_Gen_i.hxx"
|
||||||
|
#include <SMESH_Group.hxx>
|
||||||
|
#include <SMESHDS_Group.hxx>
|
||||||
|
#include <SMDSAbs_ElementType.hxx>
|
||||||
|
#include <utilities.h>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID )
|
||||||
|
: SALOME::GenericObj_i( thePOA ),
|
||||||
|
myMeshServant( theMeshServant ),
|
||||||
|
myLocalID( theLocalID )
|
||||||
|
{
|
||||||
|
thePOA->activate_object( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESH_Group_i::~SMESH_Group_i()
|
||||||
|
{
|
||||||
|
MESSAGE("~SMESH_Group_i;" );
|
||||||
|
if ( myMeshServant )
|
||||||
|
myMeshServant->removeGroup(myLocalID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void SMESH_Group_i::SetName( const char* theName )
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
aGroup->SetName(theName);
|
||||||
|
|
||||||
|
// Update group name in a study
|
||||||
|
SALOMEDS::Study_var aStudy = myMeshServant->GetGen()->GetCurrentStudy();
|
||||||
|
if ( !aStudy->_is_nil() ) {
|
||||||
|
SALOMEDS::SObject_var aGroupSO = aStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( _this() ) );
|
||||||
|
if ( !aGroupSO->_is_nil() ) {
|
||||||
|
SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder();
|
||||||
|
aBuilder->SetName( aGroupSO, theName );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("can't set name of a vague group");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
char* SMESH_Group_i::GetName()
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup)
|
||||||
|
return CORBA::string_dup (aGroup->GetName());
|
||||||
|
}
|
||||||
|
MESSAGE("get name of a vague group");
|
||||||
|
return CORBA::string_dup( "NO_NAME" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESH::ElementType SMESH_Group_i::GetType()
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
|
||||||
|
SMESH::ElementType aType;
|
||||||
|
switch (aSMDSType) {
|
||||||
|
case SMDSAbs_Node: aType = SMESH::NODE; break;
|
||||||
|
case SMDSAbs_Edge: aType = SMESH::EDGE; break;
|
||||||
|
case SMDSAbs_Face: aType = SMESH::FACE; break;
|
||||||
|
case SMDSAbs_Volume: aType = SMESH::VOLUME; break;
|
||||||
|
default: aType = SMESH::ALL; break;
|
||||||
|
}
|
||||||
|
return aType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("get type of a vague group");
|
||||||
|
return SMESH::ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
CORBA::Long SMESH_Group_i::Size()
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
int aSize = aGroup->GetGroupDS()->Extent();
|
||||||
|
return aSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("get size of a vague group");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
CORBA::Boolean SMESH_Group_i::IsEmpty()
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
bool isEmpty = aGroup->GetGroupDS()->IsEmpty();
|
||||||
|
return isEmpty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("checking IsEmpty of a vague group");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void SMESH_Group_i::Clear()
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
// a SMDS group forgets its type after clearing, so we must re-set it
|
||||||
|
SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
|
||||||
|
aGroup->GetGroupDS()->Clear();
|
||||||
|
aGroup->GetGroupDS()->SetType(aSMDSType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("attempt to clear a vague group");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
CORBA::Boolean SMESH_Group_i::Contains( CORBA::Long theID )
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
bool res = aGroup->GetGroupDS()->Contains(theID);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("attempt to check contents of a vague group");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs )
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
|
||||||
|
int nbAdd = 0;
|
||||||
|
for (int i = 0; i < theIDs.length(); i++) {
|
||||||
|
int anID = (int) theIDs[i];
|
||||||
|
if (aGroupDS->Add(anID))
|
||||||
|
nbAdd++;
|
||||||
|
}
|
||||||
|
return nbAdd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("attempt to add elements to a vague group");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
CORBA::Long SMESH_Group_i::GetID( CORBA::Long theIndex )
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
int anID = aGroup->GetGroupDS()->GetID(theIndex);
|
||||||
|
return anID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("attempt to iterate on a vague group");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
SMESH::long_array* SMESH_Group_i::GetListOfID()
|
||||||
|
{
|
||||||
|
SMESH::long_array_var aRes = new SMESH::long_array();
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
|
||||||
|
int aSize = aGroupDS->Extent();
|
||||||
|
aRes->length(aSize);
|
||||||
|
for (int i = 0; i < aSize; i++)
|
||||||
|
aRes[i] = aGroupDS->GetID(i+1);
|
||||||
|
return aRes._retn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("get list of IDs of a vague group");
|
||||||
|
return aRes._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
CORBA::Long SMESH_Group_i::Remove( const SMESH::long_array& theIDs )
|
||||||
|
{
|
||||||
|
if ( myMeshServant ) {
|
||||||
|
::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
|
||||||
|
::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
|
||||||
|
if (aGroup) {
|
||||||
|
// a SMDS group forgets its type after clearing, so we must re-set it
|
||||||
|
// if the group becomes empty
|
||||||
|
SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
|
||||||
|
SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
|
||||||
|
int nbDel = 0;
|
||||||
|
for (int i = 0; i < theIDs.length(); i++) {
|
||||||
|
int anID = (int) theIDs[i];
|
||||||
|
if (aGroupDS->Remove(anID))
|
||||||
|
nbDel++;
|
||||||
|
}
|
||||||
|
if (aGroupDS->IsEmpty())
|
||||||
|
aGroupDS->SetType(aSMDSType);
|
||||||
|
return nbDel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MESSAGE("attempt to remove elements from a vague group");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
SMESH::SMESH_Mesh_ptr SMESH_Group_i::GetMesh()
|
||||||
|
{
|
||||||
|
MESSAGE("SMESH_Group_i::GetMesh(): mesh servant = " << myMeshServant );
|
||||||
|
SMESH::SMESH_Mesh_var aMesh;
|
||||||
|
if ( myMeshServant )
|
||||||
|
aMesh = SMESH::SMESH_Mesh::_narrow( myMeshServant->_this() );
|
||||||
|
return aMesh._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
int SMESH_Group_i::GetLocalID()
|
||||||
|
{
|
||||||
|
return myLocalID;
|
||||||
|
}
|
82
src/SMESH_I/SMESH_Group_i.hxx
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : SMESH_Group_i.hxx
|
||||||
|
// Author : Sergey ANIKIN, OCC
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef SMESH_Group_i_HeaderFile
|
||||||
|
#define SMESH_Group_i_HeaderFile
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Group)
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_Mesh)
|
||||||
|
|
||||||
|
#include "SALOME_GenericObj_i.hh"
|
||||||
|
|
||||||
|
class SMESH_Mesh_i;
|
||||||
|
|
||||||
|
class SMESH_Group_i:
|
||||||
|
public virtual POA_SMESH::SMESH_Group,
|
||||||
|
public virtual SALOME::GenericObj_i
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID );
|
||||||
|
virtual ~SMESH_Group_i();
|
||||||
|
|
||||||
|
// CORBA interface implementation
|
||||||
|
void SetName( const char* theName );
|
||||||
|
|
||||||
|
char* GetName();
|
||||||
|
|
||||||
|
SMESH::ElementType GetType();
|
||||||
|
|
||||||
|
CORBA::Long Size();
|
||||||
|
|
||||||
|
CORBA::Boolean IsEmpty();
|
||||||
|
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
CORBA::Boolean Contains( CORBA::Long theID );
|
||||||
|
|
||||||
|
CORBA::Long Add( const SMESH::long_array& theIDs );
|
||||||
|
|
||||||
|
CORBA::Long GetID( CORBA::Long theIndex );
|
||||||
|
|
||||||
|
SMESH::long_array* GetListOfID();
|
||||||
|
|
||||||
|
CORBA::Long Remove( const SMESH::long_array& theIDs );
|
||||||
|
|
||||||
|
SMESH::SMESH_Mesh_ptr GetMesh();
|
||||||
|
|
||||||
|
// Internal C++ interface
|
||||||
|
int GetLocalID();
|
||||||
|
|
||||||
|
SMESH_Mesh_i* GetMeshServant() { return myMeshServant; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
SMESH_Mesh_i* myMeshServant;
|
||||||
|
int myLocalID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
227
src/SMESH_SWIG/SMESH_controls.py
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
# Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# File : SMESH_control.py
|
||||||
|
# Author : Sergey LITONIN
|
||||||
|
# Module : SMESH
|
||||||
|
|
||||||
|
|
||||||
|
import SMESH
|
||||||
|
import SMESH_mechanic
|
||||||
|
|
||||||
|
smesh = SMESH_mechanic.smesh
|
||||||
|
mesh = SMESH_mechanic.mesh
|
||||||
|
salome = SMESH_mechanic.salome
|
||||||
|
|
||||||
|
|
||||||
|
aFilterMgr = smesh.CreateFilterManager()
|
||||||
|
|
||||||
|
# Criterion : AREA > 100
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateArea()
|
||||||
|
aPredicate = aFilterMgr.CreateMoreThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 100 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Area > 100 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.FACE, "Area > 100" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
|
||||||
|
# Criterion : Taper > 3e-15
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateTaper()
|
||||||
|
aPredicate = aFilterMgr.CreateMoreThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 3e-15 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Taper > 3e-15 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.FACE, "Taper > 3e-15" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
|
||||||
|
# Criterion : ASPECT RATIO > 1.3
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateAspectRatio()
|
||||||
|
aPredicate = aFilterMgr.CreateMoreThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 1.3 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Aspect Ratio > 1.3 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.FACE, "Aspect Ratio > 1.3" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
|
||||||
|
# Criterion : MINIMUM ANGLE < 30
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateMinimumAngle()
|
||||||
|
aPredicate = aFilterMgr.CreateLessThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 30 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Minimum Angle < 30 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.FACE, "Minimum Angle < 30" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
# Criterion : Warp > 2e-13
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateWarping()
|
||||||
|
aPredicate = aFilterMgr.CreateMoreThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 2e-13 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Warp > 2e-13 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.FACE, "Warp > 2e-13" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
# Criterion : Skew > 18
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateSkew()
|
||||||
|
aPredicate = aFilterMgr.CreateMoreThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 18 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Skew > 18 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.FACE, "Skew > 18" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
# Criterion : Length > 10
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateLength()
|
||||||
|
aPredicate = aFilterMgr.CreateMoreThan()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 10 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Length > 10 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.EDGE, "Length > 10" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
# Criterion : Borders at multi-connections = 2
|
||||||
|
|
||||||
|
aFunctor = aFilterMgr.CreateMultiConnection()
|
||||||
|
aPredicate = aFilterMgr.CreateEqualTo()
|
||||||
|
aPredicate.SetNumFunctor( aFunctor )
|
||||||
|
aPredicate.SetMargin( 2 )
|
||||||
|
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Borders at multi-connections = 2 Nb = ", len( anIds )
|
||||||
|
#for i in range( len( anIds ) ):
|
||||||
|
#print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.EDGE, "Borders at multi-connections = 2" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
|
||||||
|
salome.sg.updateObjBrowser(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
78
src/SMESH_SWIG/SMESH_freebord.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import salome
|
||||||
|
from geompy import gg
|
||||||
|
import geompy
|
||||||
|
import SMESH
|
||||||
|
|
||||||
|
import StdMeshers
|
||||||
|
|
||||||
|
ShapeTypeCompSolid = 1
|
||||||
|
ShapeTypeSolid = 2
|
||||||
|
ShapeTypeShell = 3
|
||||||
|
ShapeTypeFace = 4
|
||||||
|
ShapeTypeWire = 5
|
||||||
|
ShapeTypeEdge = 6
|
||||||
|
ShapeTypeVertex = 7
|
||||||
|
|
||||||
|
geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
|
||||||
|
smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
|
||||||
|
|
||||||
|
geom.GetCurrentStudy(salome.myStudy._get_StudyId())
|
||||||
|
smesh.SetCurrentStudy(salome.myStudy)
|
||||||
|
|
||||||
|
# Create box without one plane
|
||||||
|
|
||||||
|
box = geompy.MakeBox(0., 0., 0., 10., 20., 30.)
|
||||||
|
subShapeList = geompy.SubShapeAll(box,ShapeTypeFace)
|
||||||
|
|
||||||
|
FaceList = []
|
||||||
|
for i in range( 5 ):
|
||||||
|
FaceList.append( subShapeList[ i ]._get_Name() )
|
||||||
|
|
||||||
|
aBox = geompy.MakeSewing( FaceList, 1. )
|
||||||
|
idbox = geompy.addToStudy( aBox, "box" )
|
||||||
|
|
||||||
|
aBox = salome.IDToObject( idbox )
|
||||||
|
|
||||||
|
# Create mesh
|
||||||
|
|
||||||
|
hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
|
||||||
|
hyp1.SetNumberOfSegments(5)
|
||||||
|
hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
|
||||||
|
hyp2.SetMaxElementArea(20)
|
||||||
|
hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
|
||||||
|
hyp3.SetMaxElementArea(50)
|
||||||
|
|
||||||
|
algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
|
||||||
|
algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
|
||||||
|
|
||||||
|
mesh = smesh.CreateMesh(aBox)
|
||||||
|
mesh.AddHypothesis(aBox,hyp1)
|
||||||
|
mesh.AddHypothesis(aBox,hyp2)
|
||||||
|
mesh.AddHypothesis(aBox,algo1)
|
||||||
|
mesh.AddHypothesis(aBox,algo2)
|
||||||
|
|
||||||
|
smesh.Compute(mesh,aBox)
|
||||||
|
|
||||||
|
smeshgui = salome.ImportComponentGUI("SMESH")
|
||||||
|
smeshgui.Init(salome.myStudyId);
|
||||||
|
smeshgui.SetName( salome.ObjectToID( mesh ), "Mesh_freebord" );
|
||||||
|
|
||||||
|
# Criterion : Free edges
|
||||||
|
aFilterMgr = smesh.CreateFilterManager()
|
||||||
|
aPredicate = aFilterMgr.CreateFreeBorders()
|
||||||
|
aFilter = aFilterMgr.CreateFilter()
|
||||||
|
aFilter.SetPredicate( aPredicate )
|
||||||
|
|
||||||
|
anIds = aFilter.GetElementsId( mesh )
|
||||||
|
|
||||||
|
# print result
|
||||||
|
print "Criterion: Free edges Nb = ", len( anIds )
|
||||||
|
for i in range( len( anIds ) ):
|
||||||
|
print anIds[ i ]
|
||||||
|
|
||||||
|
# create group
|
||||||
|
aGroup = mesh.CreateGroup( SMESH.EDGE, "Free edges" )
|
||||||
|
aGroup.Add( anIds )
|
||||||
|
|
||||||
|
|
||||||
|
salome.sg.updateObjBrowser(1)
|
65
src/SMESH_SWIG/SMESH_test4.py
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
import salome
|
||||||
|
from geompy import gg
|
||||||
|
import geompy
|
||||||
|
import SMESH
|
||||||
|
|
||||||
|
import StdMeshers
|
||||||
|
|
||||||
|
ShapeTypeCompSolid = 1
|
||||||
|
ShapeTypeSolid = 2
|
||||||
|
ShapeTypeShell = 3
|
||||||
|
ShapeTypeFace = 4
|
||||||
|
ShapeTypeWire = 5
|
||||||
|
ShapeTypeEdge = 6
|
||||||
|
ShapeTypeVertex = 7
|
||||||
|
|
||||||
|
geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
|
||||||
|
smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
|
||||||
|
|
||||||
|
geom.GetCurrentStudy(salome.myStudy._get_StudyId())
|
||||||
|
smesh.SetCurrentStudy(salome.myStudy)
|
||||||
|
|
||||||
|
box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
|
||||||
|
idbox = geompy.addToStudy(box,"box")
|
||||||
|
|
||||||
|
subShapeList = geompy.SubShapeAll(box,ShapeTypeFace)
|
||||||
|
face = subShapeList[0]
|
||||||
|
name = geompy.SubShapeName( face._get_Name(), box._get_Name() )
|
||||||
|
idface = geompy.addToStudyInFather(box,face,name)
|
||||||
|
|
||||||
|
box = salome.IDToObject(idbox)
|
||||||
|
face = salome.IDToObject(idface)
|
||||||
|
|
||||||
|
hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
|
||||||
|
hyp1.SetNumberOfSegments(10)
|
||||||
|
hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
|
||||||
|
hyp2.SetMaxElementArea(10)
|
||||||
|
hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
|
||||||
|
hyp3.SetMaxElementArea(100)
|
||||||
|
|
||||||
|
algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
|
||||||
|
algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
|
||||||
|
|
||||||
|
mesh = smesh.CreateMesh(box)
|
||||||
|
mesh.AddHypothesis(box,hyp1)
|
||||||
|
mesh.AddHypothesis(box,hyp2)
|
||||||
|
mesh.AddHypothesis(box,algo1)
|
||||||
|
mesh.AddHypothesis(box,algo2)
|
||||||
|
|
||||||
|
submesh = mesh.GetSubMesh(face, "SubMeshFace")
|
||||||
|
mesh.AddHypothesis(face,hyp1)
|
||||||
|
mesh.AddHypothesis(face,hyp3)
|
||||||
|
mesh.AddHypothesis(face,algo1)
|
||||||
|
mesh.AddHypothesis(face,algo2)
|
||||||
|
|
||||||
|
smesh.Compute(mesh,box)
|
||||||
|
|
||||||
|
faces = submesh.GetElementsByType(SMESH.FACE)
|
||||||
|
if len(faces) > 1:
|
||||||
|
print len(faces), len(faces)/2
|
||||||
|
group1 = mesh.CreateGroup(SMESH.FACE,"Group of faces")
|
||||||
|
group2 = mesh.CreateGroup(SMESH.FACE,"Another group of faces")
|
||||||
|
group1.Add(faces[:int(len(faces)/2)])
|
||||||
|
group2.Add(faces[int(len(faces)/2):])
|
||||||
|
|
||||||
|
salome.sg.updateObjBrowser(1)
|
79
src/SMESH_SWIG/SMESH_test5.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# File : SMESH_test1.py
|
||||||
|
# Module : SMESH
|
||||||
|
|
||||||
|
import salome
|
||||||
|
import SMESH
|
||||||
|
import SALOMEDS
|
||||||
|
import CORBA
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
def SetSObjName(theSObj,theName) :
|
||||||
|
ok, anAttr = theSObj.FindAttribute("AttributeName")
|
||||||
|
if ok:
|
||||||
|
aName = anAttr._narrow(SALOMEDS.AttributeName)
|
||||||
|
#print aName.__dict__
|
||||||
|
aName.SetValue(theName)
|
||||||
|
|
||||||
|
def ConvertMED2UNV(thePath,theFile) :
|
||||||
|
anInitFileName = thePath + theFile
|
||||||
|
aMeshes,aResult = smesh.CreateMeshesFromMED(anInitFileName)
|
||||||
|
print aResult, aMeshes
|
||||||
|
|
||||||
|
for iMesh in range(len(aMeshes)) :
|
||||||
|
aMesh = aMeshes[iMesh]
|
||||||
|
anSObj = salome.ObjectToSObject(aMesh)
|
||||||
|
print anSObj.GetName(),
|
||||||
|
aFileName = anInitFileName
|
||||||
|
aFileName = os.path.basename(aFileName)
|
||||||
|
SetSObjName(anSObj,aFileName)
|
||||||
|
print anSObj.GetName()
|
||||||
|
|
||||||
|
aFileName = thePath + theFile + "." + str(iMesh) + ".unv"
|
||||||
|
aMesh.ExportUNV(aFileName)
|
||||||
|
aMesh = smesh.CreateMeshesFromUNV(aFileName)
|
||||||
|
anSObj = salome.ObjectToSObject(aMesh)
|
||||||
|
print anSObj.GetName(),
|
||||||
|
os.remove(aFileName)
|
||||||
|
aFileName = os.path.basename(aFileName)
|
||||||
|
SetSObjName(anSObj,aFileName)
|
||||||
|
print anSObj.GetName()
|
||||||
|
|
||||||
|
smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
|
||||||
|
smesh.SetCurrentStudy(salome.myStudy)
|
||||||
|
|
||||||
|
aPath = os.getenv('KERNEL_ROOT_DIR') + '/examples/'
|
||||||
|
aListDir = os.listdir(aPath)
|
||||||
|
print aListDir
|
||||||
|
|
||||||
|
for iFile in range(len(aListDir)) :
|
||||||
|
aFileName = aListDir[iFile];
|
||||||
|
aName,anExt = os.path.splitext(aFileName)
|
||||||
|
if anExt == ".med" :
|
||||||
|
aFileName = os.path.basename(aFileName)
|
||||||
|
print aFileName
|
||||||
|
ConvertMED2UNV(aPath,aFileName)
|
||||||
|
#break
|
||||||
|
|
||||||
|
salome.sg.updateObjBrowser(1);
|
150
src/SMESH_SWIG/batchmode_mefisto.py
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
import batchmode_salome
|
||||||
|
import batchmode_geompy
|
||||||
|
import batchmode_smesh
|
||||||
|
|
||||||
|
geom = batchmode_geompy.geom
|
||||||
|
smesh = batchmode_smesh.smesh
|
||||||
|
|
||||||
|
geom.GetCurrentStudy(batchmode_salome.myStudyId)
|
||||||
|
smesh.SetCurrentStudy(batchmode_salome.myStudy)
|
||||||
|
|
||||||
|
ShapeType = batchmode_smesh.ShapeType
|
||||||
|
|
||||||
|
import StdMeshers
|
||||||
|
|
||||||
|
def CreateMesh (theFileName, area, len = None, nbseg = None):
|
||||||
|
|
||||||
|
if not(os.path.isfile(theFileName)) or re.search("\.brep$", theFileName) is None :
|
||||||
|
print "Incorrect file name !"
|
||||||
|
return
|
||||||
|
|
||||||
|
if (len is None) and (nbseg is None):
|
||||||
|
print "Define length or number of segments !"
|
||||||
|
return
|
||||||
|
|
||||||
|
if (len is not None) and (nbseg is not None):
|
||||||
|
print "Only one Hypothesis (from length and number of segments) can be defined !"
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
# ---- Import shape from BREP file and add it to the study
|
||||||
|
shape_mesh = geom.ImportBREP(theFileName)
|
||||||
|
Id_shape = batchmode_geompy.addToStudy( shape_mesh, "shape_mesh")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ---- SMESH
|
||||||
|
|
||||||
|
# ---- create Hypothesis
|
||||||
|
|
||||||
|
print "-------------------------- create Hypothesis"
|
||||||
|
if (len is not None):
|
||||||
|
print "-------------------------- LocalLength"
|
||||||
|
hypLength1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so")
|
||||||
|
hypLength1.SetLength(len)
|
||||||
|
print "Hypothesis type: ", hypLength1.GetName()
|
||||||
|
print "Hypothesis ID: ", hypLength1.GetId()
|
||||||
|
print "Hypothesis Value: ", hypLength1.GetLength()
|
||||||
|
|
||||||
|
if (nbseg is not None):
|
||||||
|
print "-------------------------- NumberOfSegments"
|
||||||
|
hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
|
||||||
|
hypNbSeg1.SetNumberOfSegments(nbseg)
|
||||||
|
print "Hypothesis type: ", hypNbSeg1.GetName()
|
||||||
|
print "Hypothesis ID: ", hypNbSeg1.GetId()
|
||||||
|
print "Hypothesis Value: ", hypNbSeg1.GetNumberOfSegments()
|
||||||
|
|
||||||
|
|
||||||
|
if (area == "LengthFromEdges"):
|
||||||
|
print "-------------------------- LengthFromEdges"
|
||||||
|
hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so")
|
||||||
|
hypLengthFromEdges.SetMode(1)
|
||||||
|
print "Hypothesis type: ", hypLengthFromEdges.GetName()
|
||||||
|
print "Hypothesis ID: ", hypLengthFromEdges.GetId()
|
||||||
|
print "LengthFromEdges Mode: ", hypLengthFromEdges.GetMode()
|
||||||
|
|
||||||
|
else:
|
||||||
|
print "-------------------------- MaxElementArea"
|
||||||
|
hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
|
||||||
|
hypArea1.SetMaxElementArea(area)
|
||||||
|
print "Hypothesis type: ", hypArea1.GetName()
|
||||||
|
print "Hypothesis ID: ", hypArea1.GetId()
|
||||||
|
print "Hypothesis Value: ", hypArea1.GetMaxElementArea()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print "-------------------------- Regular_1D"
|
||||||
|
algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
|
||||||
|
|
||||||
|
listHyp = algoReg.GetCompatibleHypothesis()
|
||||||
|
for hyp in listHyp:
|
||||||
|
print hyp
|
||||||
|
|
||||||
|
print "Algo name: ", algoReg.GetName()
|
||||||
|
print "Algo ID: ", algoReg.GetId()
|
||||||
|
|
||||||
|
print "-------------------------- MEFISTO_2D"
|
||||||
|
algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
|
||||||
|
|
||||||
|
listHyp=algoMef.GetCompatibleHypothesis()
|
||||||
|
for hyp in listHyp:
|
||||||
|
print hyp
|
||||||
|
|
||||||
|
print "Algo name: ", algoMef.GetName()
|
||||||
|
print "Algo ID: ", algoMef.GetId()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ---- add hypothesis to shape
|
||||||
|
|
||||||
|
print "-------------------------- add hypothesis to shape"
|
||||||
|
mesh = smesh.CreateMesh(shape_mesh)
|
||||||
|
|
||||||
|
ret = mesh.AddHypothesis(shape_mesh, algoReg)
|
||||||
|
print "Add Regular_1D algo .... ",
|
||||||
|
print ret
|
||||||
|
|
||||||
|
if (nbseg is not None):
|
||||||
|
ret=mesh.AddHypothesis(shape_mesh, hypNbSeg1)
|
||||||
|
print "Add Number Of Segements algo .... ",
|
||||||
|
print ret
|
||||||
|
|
||||||
|
if (len is not None):
|
||||||
|
ret=mesh.AddHypothesis(shape_mesh,hypLength1)
|
||||||
|
print "Add Local Length algo .... ",
|
||||||
|
print ret
|
||||||
|
|
||||||
|
ret=mesh.AddHypothesis(shape_mesh, algoMef)
|
||||||
|
print "Add MEFISTO_2D algo....",
|
||||||
|
print ret
|
||||||
|
|
||||||
|
if (area == "LengthFromEdges"):
|
||||||
|
ret = mesh.AddHypothesis( shape_mesh, hypLengthFromEdges) # length from edge
|
||||||
|
print "Add Length From Edges algo .... ",
|
||||||
|
print ret
|
||||||
|
else:
|
||||||
|
ret=mesh.AddHypothesis(shape_mesh, hypArea1)
|
||||||
|
print "Add Max Triangle Area algo .... ",
|
||||||
|
print ret
|
||||||
|
|
||||||
|
# ---- compute mesh
|
||||||
|
|
||||||
|
print "-------------------------- compute mesh"
|
||||||
|
ret=smesh.Compute(mesh,shape_mesh)
|
||||||
|
print "Compute Mesh .... ",
|
||||||
|
print ret
|
||||||
|
log=mesh.GetLog(0); # no erase trace
|
||||||
|
#for linelog in log:
|
||||||
|
# print linelog
|
||||||
|
|
||||||
|
print "------------ INFORMATION ABOUT MESH ------------"
|
||||||
|
|
||||||
|
print "Number of nodes: ", mesh.NbNodes()
|
||||||
|
print "Number of edges: ", mesh.NbEdges()
|
||||||
|
print "Number of faces: ", mesh.NbFaces()
|
||||||
|
print "Number of triangles: ", mesh.NbTriangles()
|
||||||
|
|
||||||
|
return mesh
|
81
src/StdMeshers/Makefile.in
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
# SMESH StdMeshers : implementaion of SMESH idl descriptions
|
||||||
|
#
|
||||||
|
# Copyright (C) 2003 CEA
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
# See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# File : Makefile.in
|
||||||
|
# Author : Julia DOROVSKIKH
|
||||||
|
# Module : SMESH
|
||||||
|
# $Header$
|
||||||
|
|
||||||
|
top_srcdir=@top_srcdir@
|
||||||
|
top_builddir=../..
|
||||||
|
srcdir=@srcdir@
|
||||||
|
VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl
|
||||||
|
|
||||||
|
|
||||||
|
@COMMENCE@
|
||||||
|
|
||||||
|
# header files
|
||||||
|
EXPORT_HEADERS = \
|
||||||
|
StdMeshers_LengthFromEdges.hxx \
|
||||||
|
StdMeshers_LocalLength.hxx \
|
||||||
|
StdMeshers_NumberOfSegments.hxx \
|
||||||
|
StdMeshers_MaxElementArea.hxx \
|
||||||
|
StdMeshers_MaxElementVolume.hxx \
|
||||||
|
StdMeshers_NotConformAllowed.hxx \
|
||||||
|
StdMeshers_Regular_1D.hxx \
|
||||||
|
StdMeshers_Quadrangle_2D.hxx \
|
||||||
|
StdMeshers_MEFISTO_2D.hxx \
|
||||||
|
StdMeshers_Hexa_3D.hxx
|
||||||
|
|
||||||
|
EXPORT_PYSCRIPTS =
|
||||||
|
|
||||||
|
# Libraries targets
|
||||||
|
|
||||||
|
LIB = libStdMeshers.la
|
||||||
|
|
||||||
|
LIB_SRC = \
|
||||||
|
StdMeshers_LengthFromEdges.cxx \
|
||||||
|
StdMeshers_LocalLength.cxx \
|
||||||
|
StdMeshers_MaxElementArea.cxx \
|
||||||
|
StdMeshers_MaxElementVolume.cxx \
|
||||||
|
StdMeshers_NumberOfSegments.cxx \
|
||||||
|
StdMeshers_NotConformAllowed.cxx \
|
||||||
|
StdMeshers_Regular_1D.cxx \
|
||||||
|
StdMeshers_Quadrangle_2D.cxx \
|
||||||
|
StdMeshers_MEFISTO_2D.cxx \
|
||||||
|
StdMeshers_Hexa_3D.cxx
|
||||||
|
|
||||||
|
LIB_SERVER_IDL =
|
||||||
|
|
||||||
|
LIB_CLIENT_IDL =
|
||||||
|
|
||||||
|
# Executables targets
|
||||||
|
BIN =
|
||||||
|
BIN_SRC =
|
||||||
|
|
||||||
|
# additionnal information to compil and link file
|
||||||
|
CPPFLAGS+= $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS)
|
||||||
|
CXXFLAGS+= $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome
|
||||||
|
|
||||||
|
LDFLAGS+= -lSMESHimpl -lMEFISTO2D -L${KERNEL_ROOT_DIR}/lib/salome
|
||||||
|
|
||||||
|
@CONCLUDE@
|
1004
src/StdMeshers/StdMeshers_Hexa_3D.cxx
Normal file
140
src/StdMeshers/StdMeshers_Hexa_3D.hxx
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_Hexa_3D.hxx
|
||||||
|
// Moved here from SMESH_Hexa_3D.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_HEXA_3D_HXX_
|
||||||
|
#define _SMESH_HEXA_3D_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_3D_Algo.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
#include "StdMeshers_Quadrangle_2D.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
typedef struct point3Dstruct
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode * node;
|
||||||
|
} Point3DStruct;
|
||||||
|
|
||||||
|
typedef double Pt3[3];
|
||||||
|
|
||||||
|
typedef struct conv2dstruct
|
||||||
|
{
|
||||||
|
double a1; // X = a1*x + b1*y + c1
|
||||||
|
double b1; // Y = a2*x + b2*y + c2
|
||||||
|
double c1; // a1, b1 a2, b2 in {-1,0,1}
|
||||||
|
double a2; // c1, c2 in {0,1}
|
||||||
|
double b2;
|
||||||
|
double c2;
|
||||||
|
int ia; // I = ia*i + ib*j + ic
|
||||||
|
int ib;
|
||||||
|
int ic;
|
||||||
|
int ja; // J = ja*i + jb*j + jc
|
||||||
|
int jb;
|
||||||
|
int jc;
|
||||||
|
} Conv2DStruct;
|
||||||
|
|
||||||
|
typedef struct cubeStruct
|
||||||
|
{
|
||||||
|
TopoDS_Vertex V000;
|
||||||
|
TopoDS_Vertex V001;
|
||||||
|
TopoDS_Vertex V010;
|
||||||
|
TopoDS_Vertex V011;
|
||||||
|
TopoDS_Vertex V100;
|
||||||
|
TopoDS_Vertex V101;
|
||||||
|
TopoDS_Vertex V110;
|
||||||
|
TopoDS_Vertex V111;
|
||||||
|
faceQuadStruct* quad_X0;
|
||||||
|
faceQuadStruct* quad_X1;
|
||||||
|
faceQuadStruct* quad_Y0;
|
||||||
|
faceQuadStruct* quad_Y1;
|
||||||
|
faceQuadStruct* quad_Z0;
|
||||||
|
faceQuadStruct* quad_Z1;
|
||||||
|
Point3DStruct* np; // normalised 3D coordinates
|
||||||
|
} CubeStruct;
|
||||||
|
|
||||||
|
class StdMeshers_Hexa_3D:
|
||||||
|
public SMESH_3D_Algo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_Hexa_3D();
|
||||||
|
|
||||||
|
virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus);
|
||||||
|
|
||||||
|
virtual bool Compute(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
ostream & SaveTo(ostream & save);
|
||||||
|
istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_Hexa_3D & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_Hexa_3D & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TopoDS_Edge
|
||||||
|
EdgeNotInFace(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
const TopoDS_Face& aFace,
|
||||||
|
const TopoDS_Vertex& aVertex,
|
||||||
|
const TopTools_IndexedDataMapOfShapeListOfShape& MS);
|
||||||
|
|
||||||
|
int GetFaceIndex(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
const vector<SMESH_subMesh*>& meshFaces,
|
||||||
|
const TopoDS_Vertex& V0,
|
||||||
|
const TopoDS_Vertex& V1,
|
||||||
|
const TopoDS_Vertex& V2,
|
||||||
|
const TopoDS_Vertex& V3);
|
||||||
|
|
||||||
|
void GetConv2DCoefs(const faceQuadStruct& quad,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
const TopoDS_Vertex& V0,
|
||||||
|
const TopoDS_Vertex& V1,
|
||||||
|
const TopoDS_Vertex& V2,
|
||||||
|
const TopoDS_Vertex& V3,
|
||||||
|
Conv2DStruct& conv);
|
||||||
|
|
||||||
|
void GetPoint(Pt3 p,
|
||||||
|
int i, int j, int k,
|
||||||
|
int nbx, int nby, int nbz,
|
||||||
|
Point3DStruct *np,
|
||||||
|
const SMESHDS_Mesh* meshDS);
|
||||||
|
|
||||||
|
CubeStruct _cube;
|
||||||
|
FaceQuadStruct* _quads[6];
|
||||||
|
int _indX0;
|
||||||
|
int _indX1;
|
||||||
|
int _indY0;
|
||||||
|
int _indY1;
|
||||||
|
int _indZ0;
|
||||||
|
int _indZ1;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
139
src/StdMeshers/StdMeshers_LengthFromEdges.cxx
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_LengthFromEdges.cxx
|
||||||
|
// Moved here from SMESH_LengthFromEdges.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_LengthFromEdges.hxx"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_LengthFromEdges::StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen)
|
||||||
|
: SMESH_Hypothesis(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
_mode =1;
|
||||||
|
_name = "LengthFromEdges";
|
||||||
|
// SCRUTE(_name);
|
||||||
|
// SCRUTE(&_name);
|
||||||
|
_param_algo_dim = 2; // is used by SMESH_MEFISTO_2D
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_LengthFromEdges::~StdMeshers_LengthFromEdges()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_LengthFromEdges::SetMode(int mode)
|
||||||
|
throw (SALOME_Exception)
|
||||||
|
{
|
||||||
|
int oldMode = _mode;
|
||||||
|
if (mode <= 0)
|
||||||
|
throw SALOME_Exception(LOCALIZED("mode must be positive"));
|
||||||
|
_mode = mode;
|
||||||
|
if (oldMode != _mode)
|
||||||
|
NotifySubMeshesHypothesisModification();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
int StdMeshers_LengthFromEdges::GetMode()
|
||||||
|
{
|
||||||
|
return _mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_LengthFromEdges::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
save << this->_mode;
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_LengthFromEdges::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
bool isOK = true;
|
||||||
|
int a;
|
||||||
|
isOK = (load >> a);
|
||||||
|
if (isOK)
|
||||||
|
this->_mode = a;
|
||||||
|
else
|
||||||
|
load.clear(ios::badbit | load.rdstate());
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
||||||
|
|
57
src/StdMeshers/StdMeshers_LengthFromEdges.hxx
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_LengthFromEdges.hxx
|
||||||
|
// Moved here from SMESH_LengthFromEdges.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_LENGTHFROMEDGES_HXX_
|
||||||
|
#define _SMESH_LENGTHFROMEDGES_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_LengthFromEdges:
|
||||||
|
public SMESH_Hypothesis
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_LengthFromEdges();
|
||||||
|
|
||||||
|
void SetMode(int mode)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
int GetMode();
|
||||||
|
|
||||||
|
virtual ostream & SaveTo(ostream & save);
|
||||||
|
virtual istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int _mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
137
src/StdMeshers/StdMeshers_LocalLength.cxx
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_LocalLength.cxx
|
||||||
|
// Moved here from SMESH_LocalLength.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_LocalLength.hxx"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_LocalLength::StdMeshers_LocalLength(int hypId, int studyId,
|
||||||
|
SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
_length = 1.;
|
||||||
|
_name = "LocalLength";
|
||||||
|
// SCRUTE(_name);
|
||||||
|
// SCRUTE(&_name);
|
||||||
|
_param_algo_dim = 1; // is used by SMESH_Regular_1D
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_LocalLength::~StdMeshers_LocalLength()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_LocalLength::SetLength(double length) throw(SALOME_Exception)
|
||||||
|
{
|
||||||
|
double oldLength = _length;
|
||||||
|
if (length <= 0)
|
||||||
|
throw SALOME_Exception(LOCALIZED("length must be positive"));
|
||||||
|
_length = length;
|
||||||
|
if (oldLength != _length)
|
||||||
|
NotifySubMeshesHypothesisModification();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
double StdMeshers_LocalLength::GetLength() const
|
||||||
|
{
|
||||||
|
return _length;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_LocalLength::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
save << this->_length;
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_LocalLength::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
bool isOK = true;
|
||||||
|
double a;
|
||||||
|
isOK = (load >> a);
|
||||||
|
if (isOK)
|
||||||
|
this->_length = a;
|
||||||
|
else
|
||||||
|
load.clear(ios::badbit | load.rdstate());
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >>(istream & load, StdMeshers_LocalLength & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
55
src/StdMeshers/StdMeshers_LocalLength.hxx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_LocalLength.hxx
|
||||||
|
// Moved here from SMESH_LocalLength.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_LOCALLENGTH_HXX_
|
||||||
|
#define _SMESH_LOCALLENGTH_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_LocalLength:public SMESH_Hypothesis
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_LocalLength(int hypId, int studyId, SMESH_Gen * gen);
|
||||||
|
virtual ~ StdMeshers_LocalLength();
|
||||||
|
|
||||||
|
void SetLength(double length) throw(SALOME_Exception);
|
||||||
|
|
||||||
|
double GetLength() const;
|
||||||
|
|
||||||
|
virtual ostream & SaveTo(ostream & save);
|
||||||
|
virtual istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp);
|
||||||
|
friend istream & operator >>(istream & load, StdMeshers_LocalLength & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double _length;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
643
src/StdMeshers/StdMeshers_MEFISTO_2D.cxx
Normal file
@ -0,0 +1,643 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_MEFISTO_2D.cxx
|
||||||
|
// Moved here from SMESH_MEFISTO_2D.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_MEFISTO_2D.hxx"
|
||||||
|
#include "SMESH_Gen.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
|
||||||
|
#include "StdMeshers_MaxElementArea.hxx"
|
||||||
|
#include "StdMeshers_LengthFromEdges.hxx"
|
||||||
|
|
||||||
|
#include "Rn.h"
|
||||||
|
#include "aptrte.h"
|
||||||
|
|
||||||
|
#include "SMDS_MeshElement.hxx"
|
||||||
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
#include "SMDS_EdgePosition.hxx"
|
||||||
|
#include "SMDS_FacePosition.hxx"
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include <TopoDS_Face.hxx>
|
||||||
|
#include <TopoDS_Edge.hxx>
|
||||||
|
#include <TopoDS_Shape.hxx>
|
||||||
|
#include <Geom_Surface.hxx>
|
||||||
|
#include <GeomAdaptor_Curve.hxx>
|
||||||
|
#include <Geom2d_Curve.hxx>
|
||||||
|
#include <gp_Pnt2d.hxx>
|
||||||
|
#include <BRep_Tool.hxx>
|
||||||
|
#include <BRepTools.hxx>
|
||||||
|
#include <BRepTools_WireExplorer.hxx>
|
||||||
|
#include <GCPnts_AbscissaPoint.hxx>
|
||||||
|
#include <GCPnts_UniformAbscissa.hxx>
|
||||||
|
#include <TColStd_ListIteratorOfListOfInteger.hxx>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D(int hypId, int studyId,
|
||||||
|
SMESH_Gen * gen):SMESH_2D_Algo(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D");
|
||||||
|
_name = "MEFISTO_2D";
|
||||||
|
// _shapeType = TopAbs_FACE;
|
||||||
|
_shapeType = (1 << TopAbs_FACE);
|
||||||
|
_compatibleHypothesis.push_back("MaxElementArea");
|
||||||
|
_compatibleHypothesis.push_back("LengthFromEdges");
|
||||||
|
|
||||||
|
_edgeLength = 0;
|
||||||
|
_maxElementArea = 0;
|
||||||
|
_hypMaxElementArea = NULL;
|
||||||
|
_hypLengthFromEdges = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D()
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D");
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool StdMeshers_MEFISTO_2D::CheckHypothesis
|
||||||
|
(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus)
|
||||||
|
{
|
||||||
|
//MESSAGE("StdMeshers_MEFISTO_2D::CheckHypothesis");
|
||||||
|
|
||||||
|
_hypMaxElementArea = NULL;
|
||||||
|
_hypLengthFromEdges = NULL;
|
||||||
|
|
||||||
|
list <const SMESHDS_Hypothesis * >::const_iterator itl;
|
||||||
|
const SMESHDS_Hypothesis *theHyp;
|
||||||
|
|
||||||
|
const list <const SMESHDS_Hypothesis * >&hyps = GetUsedHypothesis(aMesh, aShape);
|
||||||
|
int nbHyp = hyps.size();
|
||||||
|
if (!nbHyp)
|
||||||
|
{
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_MISSING;
|
||||||
|
return false; // can't work with no hypothesis
|
||||||
|
}
|
||||||
|
|
||||||
|
itl = hyps.begin();
|
||||||
|
theHyp = (*itl); // use only the first hypothesis
|
||||||
|
|
||||||
|
string hypName = theHyp->GetName();
|
||||||
|
int hypId = theHyp->GetID();
|
||||||
|
//SCRUTE(hypName);
|
||||||
|
|
||||||
|
bool isOk = false;
|
||||||
|
|
||||||
|
if (hypName == "MaxElementArea")
|
||||||
|
{
|
||||||
|
_hypMaxElementArea = static_cast<const StdMeshers_MaxElementArea *>(theHyp);
|
||||||
|
ASSERT(_hypMaxElementArea);
|
||||||
|
_maxElementArea = _hypMaxElementArea->GetMaxArea();
|
||||||
|
_edgeLength = 0;
|
||||||
|
isOk = true;
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (hypName == "LengthFromEdges")
|
||||||
|
{
|
||||||
|
_hypLengthFromEdges = static_cast<const StdMeshers_LengthFromEdges *>(theHyp);
|
||||||
|
ASSERT(_hypLengthFromEdges);
|
||||||
|
_edgeLength = 0;
|
||||||
|
_maxElementArea = 0;
|
||||||
|
isOk = true;
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE;
|
||||||
|
|
||||||
|
if (isOk)
|
||||||
|
{
|
||||||
|
isOk = false;
|
||||||
|
if (_maxElementArea > 0)
|
||||||
|
{
|
||||||
|
_edgeLength = 2 * sqrt(_maxElementArea); // triangles : minorant
|
||||||
|
isOk = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
isOk = (_hypLengthFromEdges != NULL); // **** check mode
|
||||||
|
if (!isOk)
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_BAD_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//SCRUTE(_edgeLength);
|
||||||
|
//SCRUTE(_maxElementArea);
|
||||||
|
return isOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_MEFISTO_2D::Compute");
|
||||||
|
|
||||||
|
if (_hypLengthFromEdges)
|
||||||
|
_edgeLength = ComputeEdgeElementLength(aMesh, aShape);
|
||||||
|
|
||||||
|
bool isOk = false;
|
||||||
|
const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
|
||||||
|
|
||||||
|
const TopoDS_Face & FF = TopoDS::Face(aShape);
|
||||||
|
bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD);
|
||||||
|
TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
|
||||||
|
|
||||||
|
Z nblf; //nombre de lignes fermees (enveloppe en tete)
|
||||||
|
Z *nudslf = NULL; //numero du dernier sommet de chaque ligne fermee
|
||||||
|
R2 *uvslf = NULL;
|
||||||
|
Z nbpti = 0; //nombre points internes futurs sommets de la triangulation
|
||||||
|
R2 *uvpti = NULL;
|
||||||
|
|
||||||
|
Z nbst;
|
||||||
|
R2 *uvst = NULL;
|
||||||
|
Z nbt;
|
||||||
|
Z *nust = NULL;
|
||||||
|
Z ierr = 0;
|
||||||
|
|
||||||
|
Z nutysu = 1; // 1: il existe un fonction areteideale_()
|
||||||
|
// Z nutysu=0; // 0: on utilise aretmx
|
||||||
|
R aretmx = _edgeLength; // longueur max aretes future triangulation
|
||||||
|
//SCRUTE(aretmx);
|
||||||
|
|
||||||
|
nblf = NumberOfWires(F);
|
||||||
|
//SCRUTE(nblf);
|
||||||
|
|
||||||
|
nudslf = new Z[1 + nblf];
|
||||||
|
nudslf[0] = 0;
|
||||||
|
int iw = 1;
|
||||||
|
int nbpnt = 0;
|
||||||
|
|
||||||
|
const TopoDS_Wire OW1 = BRepTools::OuterWire(F);
|
||||||
|
nbpnt += NumberOfPoints(aMesh, OW1);
|
||||||
|
nudslf[iw++] = nbpnt;
|
||||||
|
//SCRUTE(nbpnt);
|
||||||
|
|
||||||
|
for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Wire & W = TopoDS::Wire(exp.Current());
|
||||||
|
if (!OW1.IsSame(W))
|
||||||
|
{
|
||||||
|
nbpnt += NumberOfPoints(aMesh, W);
|
||||||
|
nudslf[iw++] = nbpnt;
|
||||||
|
//SCRUTE(nbpnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uvslf = new R2[nudslf[nblf]];
|
||||||
|
//SCRUTE(nudslf[nblf]);
|
||||||
|
int m = 0;
|
||||||
|
|
||||||
|
map<int, const SMDS_MeshNode*> mefistoToDS; // correspondence mefisto index--> points IDNodes
|
||||||
|
TopoDS_Wire OW = BRepTools::OuterWire(F);
|
||||||
|
LoadPoints(aMesh, F, OW, uvslf, m, mefistoToDS);
|
||||||
|
//SCRUTE(m);
|
||||||
|
|
||||||
|
for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Wire & W = TopoDS::Wire(exp.Current());
|
||||||
|
if (!OW.IsSame(W))
|
||||||
|
{
|
||||||
|
LoadPoints(aMesh, F, W, uvslf, m, mefistoToDS);
|
||||||
|
//SCRUTE(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SCRUTE(nudslf[nblf]);
|
||||||
|
// for (int i=0; i<=nblf; i++)
|
||||||
|
// {
|
||||||
|
// MESSAGE(" -+- " <<i<< " "<< nudslf[i]);
|
||||||
|
// }
|
||||||
|
// for (int i=0; i<nudslf[nblf]; i++)
|
||||||
|
// {
|
||||||
|
// MESSAGE(" -+- " <<i<< " "<< uvslf[i]);
|
||||||
|
// }
|
||||||
|
// SCRUTE(nutysu);
|
||||||
|
// SCRUTE(aretmx);
|
||||||
|
// SCRUTE(nblf);
|
||||||
|
|
||||||
|
MESSAGE("MEFISTO triangulation ...");
|
||||||
|
uvst = NULL;
|
||||||
|
nust = NULL;
|
||||||
|
aptrte(nutysu, aretmx,
|
||||||
|
nblf, nudslf, uvslf, nbpti, uvpti, nbst, uvst, nbt, nust, ierr);
|
||||||
|
|
||||||
|
if (ierr == 0)
|
||||||
|
{
|
||||||
|
MESSAGE("... End Triangulation Generated Triangle Number " << nbt);
|
||||||
|
MESSAGE(" Node Number " << nbst);
|
||||||
|
//SCRUTE(nbst);
|
||||||
|
//SCRUTE(nbt);
|
||||||
|
StoreResult(aMesh, nbst, uvst, nbt, nust, F,
|
||||||
|
faceIsForward, mefistoToDS);
|
||||||
|
isOk = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MESSAGE("Error in Triangulation");
|
||||||
|
isOk = false;
|
||||||
|
}
|
||||||
|
if (nudslf != NULL)
|
||||||
|
delete[]nudslf;
|
||||||
|
if (uvslf != NULL)
|
||||||
|
delete[]uvslf;
|
||||||
|
if (uvst != NULL)
|
||||||
|
delete[]uvst;
|
||||||
|
if (nust != NULL)
|
||||||
|
delete[]nust;
|
||||||
|
return isOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_MEFISTO_2D::LoadPoints(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Face & FF,
|
||||||
|
const TopoDS_Wire & WW, R2 * uvslf, int &m,
|
||||||
|
map<int, const SMDS_MeshNode*>&mefistoToDS)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_MEFISTO_2D::LoadPoints");
|
||||||
|
|
||||||
|
SMDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
|
||||||
|
double scalex;
|
||||||
|
double scaley;
|
||||||
|
TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
|
||||||
|
ComputeScaleOnFace(aMesh, F, scalex, scaley);
|
||||||
|
|
||||||
|
TopoDS_Wire W = TopoDS::Wire(WW.Oriented(TopAbs_FORWARD));
|
||||||
|
BRepTools_WireExplorer wexp(W, F);
|
||||||
|
for (wexp.Init(W, F); wexp.More(); wexp.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Edge & E = wexp.Current();
|
||||||
|
|
||||||
|
// --- IDNodes of first and last Vertex
|
||||||
|
|
||||||
|
TopoDS_Vertex VFirst, VLast;
|
||||||
|
TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l
|
||||||
|
|
||||||
|
ASSERT(!VFirst.IsNull());
|
||||||
|
SMDS_NodeIteratorPtr lid=
|
||||||
|
aMesh.GetSubMesh(VFirst)->GetSubMeshDS()->GetNodes();
|
||||||
|
const SMDS_MeshNode* idFirst = lid->next();
|
||||||
|
|
||||||
|
ASSERT(!VLast.IsNull());
|
||||||
|
lid=aMesh.GetSubMesh(VLast)->GetSubMeshDS()->GetNodes();
|
||||||
|
const SMDS_MeshNode* idLast = lid->next();
|
||||||
|
|
||||||
|
// --- edge internal IDNodes (relies on good order storage, not checked)
|
||||||
|
|
||||||
|
int nbPoints = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
|
||||||
|
//SCRUTE(nbPoints);
|
||||||
|
|
||||||
|
double f, l;
|
||||||
|
Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
|
||||||
|
|
||||||
|
SMDS_NodeIteratorPtr ite= aMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes();
|
||||||
|
|
||||||
|
bool isForward = (E.Orientation() == TopAbs_FORWARD);
|
||||||
|
map<double, const SMDS_MeshNode*> params;
|
||||||
|
|
||||||
|
while(ite->more())
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode * node = ite->next();
|
||||||
|
const SMDS_EdgePosition* epos =
|
||||||
|
static_cast<const SMDS_EdgePosition*>(node->GetPosition().get());
|
||||||
|
double param = epos->GetUParameter();
|
||||||
|
params[param] = node;
|
||||||
|
}
|
||||||
|
// --- load 2D values into MEFISTO structure,
|
||||||
|
// add IDNodes in mefistoToDS map
|
||||||
|
|
||||||
|
if (E.Orientation() == TopAbs_FORWARD)
|
||||||
|
{
|
||||||
|
gp_Pnt2d p = C2d->Value(f); // first point = Vertex Forward
|
||||||
|
uvslf[m].x = scalex * p.X();
|
||||||
|
uvslf[m].y = scaley * p.Y();
|
||||||
|
mefistoToDS[m + 1] = idFirst;
|
||||||
|
//MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
|
||||||
|
//MESSAGE("__ f "<<f<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
|
||||||
|
m++;
|
||||||
|
map<double, const SMDS_MeshNode*>::iterator itp = params.begin();
|
||||||
|
for (int i = 1; i <= nbPoints; i++) // nbPoints internal
|
||||||
|
{
|
||||||
|
double param = (*itp).first;
|
||||||
|
gp_Pnt2d p = C2d->Value(param);
|
||||||
|
uvslf[m].x = scalex * p.X();
|
||||||
|
uvslf[m].y = scaley * p.Y();
|
||||||
|
mefistoToDS[m + 1] = (*itp).second;
|
||||||
|
// MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
|
||||||
|
// MESSAGE("__ "<<i<<" "<<param<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
|
||||||
|
m++;
|
||||||
|
itp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gp_Pnt2d p = C2d->Value(l); // last point = Vertex Reversed
|
||||||
|
uvslf[m].x = scalex * p.X();
|
||||||
|
uvslf[m].y = scaley * p.Y();
|
||||||
|
mefistoToDS[m + 1] = idLast;
|
||||||
|
// MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
|
||||||
|
// MESSAGE("__ l "<<l<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
|
||||||
|
m++;
|
||||||
|
map<double, const SMDS_MeshNode*>::reverse_iterator itp = params.rbegin();
|
||||||
|
for (int i = nbPoints; i >= 1; i--)
|
||||||
|
{
|
||||||
|
double param = (*itp).first;
|
||||||
|
gp_Pnt2d p = C2d->Value(param);
|
||||||
|
uvslf[m].x = scalex * p.X();
|
||||||
|
uvslf[m].y = scaley * p.Y();
|
||||||
|
mefistoToDS[m + 1] = (*itp).second;
|
||||||
|
// MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
|
||||||
|
// MESSAGE("__ "<<i<<" "<<param<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
|
||||||
|
m++;
|
||||||
|
itp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
// **** a mettre dans SMESH_Algo ou SMESH_2D_Algo
|
||||||
|
|
||||||
|
void StdMeshers_MEFISTO_2D::ComputeScaleOnFace(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Face & aFace, double &scalex, double &scaley)
|
||||||
|
{
|
||||||
|
//MESSAGE("StdMeshers_MEFISTO_2D::ComputeScaleOnFace");
|
||||||
|
TopoDS_Face F = TopoDS::Face(aFace.Oriented(TopAbs_FORWARD));
|
||||||
|
TopoDS_Wire W = BRepTools::OuterWire(F);
|
||||||
|
|
||||||
|
BRepTools_WireExplorer wexp(W, F);
|
||||||
|
|
||||||
|
double xmin = 1.e300; // min & max of face 2D parametric coord.
|
||||||
|
double xmax = -1.e300;
|
||||||
|
double ymin = 1.e300;
|
||||||
|
double ymax = -1.e300;
|
||||||
|
int nbp = 50;
|
||||||
|
scalex = 1;
|
||||||
|
scaley = 1;
|
||||||
|
for (wexp.Init(W, F); wexp.More(); wexp.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Edge & E = wexp.Current();
|
||||||
|
double f, l;
|
||||||
|
Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
|
||||||
|
for (int i = 0; i <= nbp; i++)
|
||||||
|
{
|
||||||
|
double param = f + (double (i) / double (nbp))*(l - f);
|
||||||
|
gp_Pnt2d p = C2d->Value(param);
|
||||||
|
if (p.X() < xmin)
|
||||||
|
xmin = p.X();
|
||||||
|
if (p.X() > xmax)
|
||||||
|
xmax = p.X();
|
||||||
|
if (p.Y() < ymin)
|
||||||
|
ymin = p.Y();
|
||||||
|
if (p.Y() > ymax)
|
||||||
|
ymax = p.Y();
|
||||||
|
// MESSAGE(" "<< f<<" "<<l<<" "<<param<<" "<<xmin<<" "<<xmax<<" "<<ymin<<" "<<ymax);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SCRUTE(xmin);
|
||||||
|
// SCRUTE(xmax);
|
||||||
|
// SCRUTE(ymin);
|
||||||
|
// SCRUTE(ymax);
|
||||||
|
double xmoy = (xmax + xmin) / 2.;
|
||||||
|
double ymoy = (ymax + ymin) / 2.;
|
||||||
|
|
||||||
|
Handle(Geom_Surface) S = BRep_Tool::Surface(F); // 3D surface
|
||||||
|
|
||||||
|
double length_x = 0;
|
||||||
|
double length_y = 0;
|
||||||
|
gp_Pnt PX0 = S->Value(xmin, ymoy);
|
||||||
|
gp_Pnt PY0 = S->Value(xmoy, ymin);
|
||||||
|
for (int i = 1; i <= nbp; i++)
|
||||||
|
{
|
||||||
|
double x = xmin + (double (i) / double (nbp))*(xmax - xmin);
|
||||||
|
gp_Pnt PX = S->Value(x, ymoy);
|
||||||
|
double y = ymin + (double (i) / double (nbp))*(ymax - ymin);
|
||||||
|
gp_Pnt PY = S->Value(xmoy, y);
|
||||||
|
length_x += PX.Distance(PX0);
|
||||||
|
length_y += PY.Distance(PY0);
|
||||||
|
PX0.SetCoord(PX.X(), PX.Y(), PX.Z());
|
||||||
|
PY0.SetCoord(PY.X(), PY.Y(), PY.Z());
|
||||||
|
}
|
||||||
|
// SCRUTE(length_x);
|
||||||
|
// SCRUTE(length_y);
|
||||||
|
scalex = length_x / (xmax - xmin);
|
||||||
|
scaley = length_y / (ymax - ymin);
|
||||||
|
// SCRUTE(scalex);
|
||||||
|
// SCRUTE(scaley);
|
||||||
|
ASSERT(scalex);
|
||||||
|
ASSERT(scaley);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_MEFISTO_2D::StoreResult(SMESH_Mesh & aMesh,
|
||||||
|
Z nbst, R2 * uvst, Z nbt, Z * nust,
|
||||||
|
const TopoDS_Face & F, bool faceIsForward,
|
||||||
|
map<int, const SMDS_MeshNode*>&mefistoToDS)
|
||||||
|
{
|
||||||
|
double scalex;
|
||||||
|
double scaley;
|
||||||
|
ComputeScaleOnFace(aMesh, F, scalex, scaley);
|
||||||
|
|
||||||
|
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
|
||||||
|
Z n, m;
|
||||||
|
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
|
||||||
|
|
||||||
|
for (n = 0; n < nbst; n++)
|
||||||
|
{
|
||||||
|
double u = uvst[n][0] / scalex;
|
||||||
|
double v = uvst[n][1] / scaley;
|
||||||
|
gp_Pnt P = S->Value(u, v);
|
||||||
|
|
||||||
|
if (mefistoToDS.find(n + 1) == mefistoToDS.end())
|
||||||
|
{
|
||||||
|
SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(node, F);
|
||||||
|
|
||||||
|
//MESSAGE(nodeId<<" "<<P.X()<<" "<<P.Y()<<" "<<P.Z());
|
||||||
|
mefistoToDS[n + 1] = node;
|
||||||
|
//MESSAGE(" "<<n<<" "<<mefistoToDS[n+1]);
|
||||||
|
SMDS_FacePosition* fpos =
|
||||||
|
static_cast<SMDS_FacePosition*>(node->GetPosition().get());
|
||||||
|
fpos->SetUParameter(u);
|
||||||
|
fpos->SetVParameter(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
int mt = 0;
|
||||||
|
|
||||||
|
//SCRUTE(faceIsForward);
|
||||||
|
for (n = 1; n <= nbt; n++)
|
||||||
|
{
|
||||||
|
int inode1 = nust[m++];
|
||||||
|
int inode2 = nust[m++];
|
||||||
|
int inode3 = nust[m++];
|
||||||
|
|
||||||
|
const SMDS_MeshNode *n1, *n2, *n3;
|
||||||
|
n1 = mefistoToDS[inode1];
|
||||||
|
n2 = mefistoToDS[inode2];
|
||||||
|
n3 = mefistoToDS[inode3];
|
||||||
|
//MESSAGE("-- "<<inode1<<" "<<inode2<<" "<<inode3<<" ++ "<<nodeId1<<" "<<nodeId2<<" "<<nodeId3);
|
||||||
|
|
||||||
|
// triangle points must be in trigonometric order if face is Forward
|
||||||
|
// else they must be put clockwise
|
||||||
|
|
||||||
|
bool triangleIsWellOriented = faceIsForward;
|
||||||
|
|
||||||
|
SMDS_MeshElement * elt;
|
||||||
|
if (triangleIsWellOriented)
|
||||||
|
elt = meshDS->AddFace(n1, n2, n3);
|
||||||
|
else
|
||||||
|
elt = meshDS->AddFace(n1, n3, n2);
|
||||||
|
|
||||||
|
meshDS->SetMeshElementOnShape(elt, F);
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
double StdMeshers_MEFISTO_2D::ComputeEdgeElementLength(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Shape & aShape)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_MEFISTO_2D::ComputeEdgeElementLength");
|
||||||
|
// **** a mettre dans SMESH_2D_Algo ?
|
||||||
|
|
||||||
|
const TopoDS_Face & FF = TopoDS::Face(aShape);
|
||||||
|
bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD);
|
||||||
|
TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
|
||||||
|
|
||||||
|
double meanElementLength = 100;
|
||||||
|
double wireLength = 0;
|
||||||
|
int wireElementsNumber = 0;
|
||||||
|
for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Wire & W = TopoDS::Wire(exp.Current());
|
||||||
|
for (TopExp_Explorer expe(W, TopAbs_EDGE); expe.More(); expe.Next())
|
||||||
|
{
|
||||||
|
const TopoDS_Edge & E = TopoDS::Edge(expe.Current());
|
||||||
|
int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
|
||||||
|
double length = EdgeLength(E);
|
||||||
|
wireLength += length;
|
||||||
|
wireElementsNumber += nb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wireElementsNumber)
|
||||||
|
meanElementLength = wireLength / wireElementsNumber;
|
||||||
|
//SCRUTE(meanElementLength);
|
||||||
|
return meanElementLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_MEFISTO_2D::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_MEFISTO_2D::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator <<(ostream & save, StdMeshers_MEFISTO_2D & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >>(istream & load, StdMeshers_MEFISTO_2D & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
88
src/StdMeshers/StdMeshers_MEFISTO_2D.hxx
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_MEFISTO_2D.hxx
|
||||||
|
// Moved here from SMESH_MEFISTO_2D.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _StdMeshers_MEFISTO_2D_HXX_
|
||||||
|
#define _StdMeshers_MEFISTO_2D_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_2D_Algo.hxx"
|
||||||
|
#include "StdMeshers_MaxElementArea.hxx"
|
||||||
|
#include "StdMeshers_LengthFromEdges.hxx"
|
||||||
|
#include "Rn.h"
|
||||||
|
|
||||||
|
class SMDS_MeshNode;
|
||||||
|
#include <TopoDS_Face.hxx>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class StdMeshers_MEFISTO_2D:
|
||||||
|
public SMESH_2D_Algo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_MEFISTO_2D(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_MEFISTO_2D();
|
||||||
|
|
||||||
|
virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus);
|
||||||
|
|
||||||
|
virtual bool Compute(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape);
|
||||||
|
|
||||||
|
double ComputeEdgeElementLength(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape);
|
||||||
|
|
||||||
|
void LoadPoints(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Face& F,
|
||||||
|
const TopoDS_Wire& W,
|
||||||
|
R2* uvslf,
|
||||||
|
int& m,
|
||||||
|
map<int,const SMDS_MeshNode*>& mefistoToDS);
|
||||||
|
|
||||||
|
void ComputeScaleOnFace(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Face& aFace,
|
||||||
|
double& scalex,
|
||||||
|
double& scaley);
|
||||||
|
|
||||||
|
void StoreResult (SMESH_Mesh& aMesh,
|
||||||
|
Z nbst, R2* uvst, Z nbt, Z* nust,
|
||||||
|
const TopoDS_Face& F, bool faceIsForward,
|
||||||
|
map<int,const SMDS_MeshNode*>& mefistoToDS);
|
||||||
|
|
||||||
|
ostream & SaveTo(ostream & save);
|
||||||
|
istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_MEFISTO_2D & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_MEFISTO_2D & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double _edgeLength;
|
||||||
|
double _maxElementArea;
|
||||||
|
const StdMeshers_MaxElementArea* _hypMaxElementArea;
|
||||||
|
const StdMeshers_LengthFromEdges* _hypLengthFromEdges;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
139
src/StdMeshers/StdMeshers_MaxElementArea.cxx
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_MaxElementArea.cxx
|
||||||
|
// Moved here from SMESH_MaxElementArea.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_MaxElementArea.hxx"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_MaxElementArea::StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen* gen)
|
||||||
|
: SMESH_Hypothesis(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
_maxArea =1.;
|
||||||
|
_name = "MaxElementArea";
|
||||||
|
// SCRUTE(_name);
|
||||||
|
// SCRUTE(&_name);
|
||||||
|
_param_algo_dim = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_MaxElementArea::~StdMeshers_MaxElementArea()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_MaxElementArea::SetMaxArea(double maxArea)
|
||||||
|
throw (SALOME_Exception)
|
||||||
|
{
|
||||||
|
double oldArea = _maxArea;
|
||||||
|
if (maxArea <= 0)
|
||||||
|
throw SALOME_Exception(LOCALIZED("maxArea must be positive"));
|
||||||
|
_maxArea = maxArea;
|
||||||
|
if (_maxArea != oldArea)
|
||||||
|
NotifySubMeshesHypothesisModification();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
double StdMeshers_MaxElementArea::GetMaxArea() const
|
||||||
|
{
|
||||||
|
return _maxArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_MaxElementArea::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
save << this->_maxArea;
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_MaxElementArea::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
bool isOK = true;
|
||||||
|
double a;
|
||||||
|
isOK = (load >> a);
|
||||||
|
if (isOK)
|
||||||
|
this->_maxArea = a;
|
||||||
|
else
|
||||||
|
load.clear(ios::badbit | load.rdstate());
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator << (ostream & save, StdMeshers_MaxElementArea & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >> (istream & load, StdMeshers_MaxElementArea & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
||||||
|
|
55
src/StdMeshers/StdMeshers_MaxElementArea.hxx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_MaxElementArea.hxx
|
||||||
|
// Moved here from SMESH_MaxElementArea.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_MAXELEMENTAREA_HXX_
|
||||||
|
#define _SMESH_MAXELEMENTAREA_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_MaxElementArea:public SMESH_Hypothesis
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen * gen);
|
||||||
|
virtual ~ StdMeshers_MaxElementArea();
|
||||||
|
|
||||||
|
void SetMaxArea(double maxArea) throw(SALOME_Exception);
|
||||||
|
|
||||||
|
double GetMaxArea() const;
|
||||||
|
|
||||||
|
virtual ostream & SaveTo(ostream & save);
|
||||||
|
virtual istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator <<(ostream & save, StdMeshers_MaxElementArea & hyp);
|
||||||
|
friend istream & operator >>(istream & load, StdMeshers_MaxElementArea & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double _maxArea;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
141
src/StdMeshers/StdMeshers_MaxElementVolume.cxx
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_MaxElementVolume.cxx
|
||||||
|
// Moved here from SMESH_MaxElementVolume.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "StdMeshers_MaxElementVolume.hxx"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_MaxElementVolume::StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen)
|
||||||
|
: SMESH_Hypothesis(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
_maxVolume =1.;
|
||||||
|
_name = "MaxElementVolume";
|
||||||
|
// SCRUTE(_name);
|
||||||
|
SCRUTE(&_name);
|
||||||
|
_param_algo_dim = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume()
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume");
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_MaxElementVolume::SetMaxVolume(double maxVolume)
|
||||||
|
throw (SALOME_Exception)
|
||||||
|
{
|
||||||
|
double oldVolume = _maxVolume;
|
||||||
|
if (maxVolume <= 0)
|
||||||
|
throw SALOME_Exception(LOCALIZED("maxVolume must be positive"));
|
||||||
|
_maxVolume = maxVolume;
|
||||||
|
if (_maxVolume != oldVolume)
|
||||||
|
NotifySubMeshesHypothesisModification();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
double StdMeshers_MaxElementVolume::GetMaxVolume() const
|
||||||
|
{
|
||||||
|
return _maxVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_MaxElementVolume::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
save << this->_maxVolume;
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_MaxElementVolume::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
bool isOK = true;
|
||||||
|
double a;
|
||||||
|
isOK = (load >> a);
|
||||||
|
if (isOK)
|
||||||
|
this->_maxVolume = a;
|
||||||
|
else
|
||||||
|
load.clear(ios::badbit | load.rdstate());
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
||||||
|
|
57
src/StdMeshers/StdMeshers_MaxElementVolume.hxx
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_MaxElementVolume.hxx
|
||||||
|
// Moved here from SMESH_MaxElementVolume.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_MAXELEMENTVOLUME_HXX_
|
||||||
|
#define _SMESH_MAXELEMENTVOLUME_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_MaxElementVolume:
|
||||||
|
public SMESH_Hypothesis
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_MaxElementVolume();
|
||||||
|
|
||||||
|
void SetMaxVolume(double maxVolume)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
double GetMaxVolume() const;
|
||||||
|
|
||||||
|
virtual ostream & SaveTo(ostream & save);
|
||||||
|
virtual istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double _maxVolume;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
98
src/StdMeshers/StdMeshers_NotConformAllowed.cxx
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// SMESH StdMeshers : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_NotConformAllowed.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_NotConformAllowed.hxx"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_NotConformAllowed::StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen)
|
||||||
|
: SMESH_Hypothesis(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
_name = "NotConformAllowed";
|
||||||
|
_param_algo_dim = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_NotConformAllowed::~StdMeshers_NotConformAllowed()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_NotConformAllowed::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
return save << this;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_NotConformAllowed::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
return load >> (*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp)
|
||||||
|
{
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp)
|
||||||
|
{
|
||||||
|
return load;
|
||||||
|
}
|
48
src/StdMeshers/StdMeshers_NotConformAllowed.hxx
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
// SMESH StdMeshers : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_NotConformAllowed.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _StdMeshers_NotConformAllowed_HXX_
|
||||||
|
#define _StdMeshers_NotConformAllowed_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_NotConformAllowed:
|
||||||
|
public SMESH_Hypothesis
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_NotConformAllowed();
|
||||||
|
|
||||||
|
virtual ostream & SaveTo(ostream & save);
|
||||||
|
virtual istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
171
src/StdMeshers/StdMeshers_NumberOfSegments.cxx
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_NumberOfSegments.cxx
|
||||||
|
// Moved here from SMESH_NumberOfSegments.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_NumberOfSegments.hxx"
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_NumberOfSegments::StdMeshers_NumberOfSegments(int hypId, int studyId,
|
||||||
|
SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
_numberOfSegments = 1;
|
||||||
|
_scaleFactor = 1.0;
|
||||||
|
_name = "NumberOfSegments";
|
||||||
|
_param_algo_dim = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_NumberOfSegments::~StdMeshers_NumberOfSegments()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_NumberOfSegments::SetNumberOfSegments(int segmentsNumber)
|
||||||
|
throw(SALOME_Exception)
|
||||||
|
{
|
||||||
|
int oldNumberOfSegments = _numberOfSegments;
|
||||||
|
if (segmentsNumber <= 0)
|
||||||
|
throw
|
||||||
|
SALOME_Exception(LOCALIZED("number of segments must be positive"));
|
||||||
|
_numberOfSegments = segmentsNumber;
|
||||||
|
|
||||||
|
if (oldNumberOfSegments != _numberOfSegments)
|
||||||
|
NotifySubMeshesHypothesisModification();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
int StdMeshers_NumberOfSegments::GetNumberOfSegments() const
|
||||||
|
{
|
||||||
|
return _numberOfSegments;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_NumberOfSegments::SetScaleFactor(double scaleFactor)
|
||||||
|
throw(SALOME_Exception)
|
||||||
|
{
|
||||||
|
if (scaleFactor < 0)
|
||||||
|
throw SALOME_Exception(LOCALIZED("scale factor must be positive"));
|
||||||
|
_scaleFactor = scaleFactor;
|
||||||
|
|
||||||
|
NotifySubMeshesHypothesisModification();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
double StdMeshers_NumberOfSegments::GetScaleFactor() const
|
||||||
|
{
|
||||||
|
return _scaleFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_NumberOfSegments::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
save << this->_numberOfSegments << " " << this->_scaleFactor;
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_NumberOfSegments::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
bool isOK = true;
|
||||||
|
int a;
|
||||||
|
isOK = (load >> a);
|
||||||
|
if (isOK)
|
||||||
|
this->_numberOfSegments = a;
|
||||||
|
else
|
||||||
|
load.clear(ios::badbit | load.rdstate());
|
||||||
|
double b;
|
||||||
|
isOK = (load >> b);
|
||||||
|
if (isOK)
|
||||||
|
this->_scaleFactor = b;
|
||||||
|
else
|
||||||
|
load.clear(ios::badbit | load.rdstate());
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator <<(ostream & save, StdMeshers_NumberOfSegments & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >>(istream & load, StdMeshers_NumberOfSegments & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
63
src/StdMeshers/StdMeshers_NumberOfSegments.hxx
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_NumberOfSegments.hxx
|
||||||
|
// Moved here from SMESH_NumberOfSegments.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_NUMBEROFSEGMENTS_HXX_
|
||||||
|
#define _SMESH_NUMBEROFSEGMENTS_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_Hypothesis.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_NumberOfSegments:
|
||||||
|
public SMESH_Hypothesis
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_NumberOfSegments(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_NumberOfSegments();
|
||||||
|
|
||||||
|
void SetNumberOfSegments(int segmentsNumber)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
int GetNumberOfSegments() const;
|
||||||
|
|
||||||
|
void SetScaleFactor(double scaleFactor)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
double GetScaleFactor() const;
|
||||||
|
|
||||||
|
virtual ostream & SaveTo(ostream & save);
|
||||||
|
virtual istream & LoadFrom(istream & load);
|
||||||
|
friend ostream& operator << (ostream & save, StdMeshers_NumberOfSegments & hyp);
|
||||||
|
friend istream& operator >> (istream & load, StdMeshers_NumberOfSegments & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int _numberOfSegments;
|
||||||
|
double _scaleFactor;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
644
src/StdMeshers/StdMeshers_Quadrangle_2D.cxx
Normal file
@ -0,0 +1,644 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_Quadrangle_2D.cxx
|
||||||
|
// Moved here from SMESH_Quadrangle_2D.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshers_Quadrangle_2D.hxx"
|
||||||
|
#include "SMESH_Gen.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
|
||||||
|
#include "SMDS_MeshElement.hxx"
|
||||||
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
#include "SMDS_EdgePosition.hxx"
|
||||||
|
#include "SMDS_FacePosition.hxx"
|
||||||
|
|
||||||
|
#include <BRep_Tool.hxx>
|
||||||
|
#include <BRepTools.hxx>
|
||||||
|
#include <BRepTools_WireExplorer.hxx>
|
||||||
|
#include <Geom_Surface.hxx>
|
||||||
|
#include <Geom_Curve.hxx>
|
||||||
|
#include <Geom2d_Curve.hxx>
|
||||||
|
#include <Handle_Geom2d_Curve.hxx>
|
||||||
|
#include <Handle_Geom_Curve.hxx>
|
||||||
|
#include <gp_Pnt2d.hxx>
|
||||||
|
#include <TColStd_ListIteratorOfListOfInteger.hxx>
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
#include "Utils_ExceptHandlers.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D(int hypId,
|
||||||
|
int studyId, SMESH_Gen * gen):SMESH_2D_Algo(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D");
|
||||||
|
_name = "Quadrangle_2D";
|
||||||
|
// _shapeType = TopAbs_FACE;
|
||||||
|
_shapeType = (1 << TopAbs_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_Quadrangle_2D::~StdMeshers_Quadrangle_2D()
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_Quadrangle_2D::~StdMeshers_Quadrangle_2D");
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool StdMeshers_Quadrangle_2D::CheckHypothesis
|
||||||
|
(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus)
|
||||||
|
{
|
||||||
|
//MESSAGE("StdMeshers_Quadrangle_2D::CheckHypothesis");
|
||||||
|
|
||||||
|
bool isOk = true;
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_OK;
|
||||||
|
|
||||||
|
// nothing to check
|
||||||
|
|
||||||
|
return isOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool StdMeshers_Quadrangle_2D::Compute(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Shape & aShape)throw(SALOME_Exception)
|
||||||
|
{
|
||||||
|
Unexpect aCatch(SalomeException);
|
||||||
|
//MESSAGE("StdMeshers_Quadrangle_2D::Compute");
|
||||||
|
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
|
||||||
|
|
||||||
|
FaceQuadStruct *quad = CheckAnd2Dcompute(aMesh, aShape);
|
||||||
|
if (!quad)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// --- compute 3D values on points, store points & quadrangles
|
||||||
|
|
||||||
|
int nbdown = quad->nbPts[0];
|
||||||
|
int nbright = quad->nbPts[1];
|
||||||
|
int nbVertices = nbdown * nbright;
|
||||||
|
int nbQuad = (nbdown - 1) * (nbright - 1);
|
||||||
|
//SCRUTE(nbVertices);
|
||||||
|
//SCRUTE(nbQuad);
|
||||||
|
|
||||||
|
// const TopoDS_Face& FF = TopoDS::Face(aShape);
|
||||||
|
// bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD);
|
||||||
|
// TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
|
||||||
|
const TopoDS_Face & F = TopoDS::Face(aShape);
|
||||||
|
bool faceIsForward = (F.Orientation() == TopAbs_FORWARD);
|
||||||
|
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
|
||||||
|
|
||||||
|
for (int i = 1; i < nbdown - 1; i++)
|
||||||
|
for (int j = 1; j < nbright - 1; j++) // internal points
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
double u = quad->uv_grid[ij].u;
|
||||||
|
double v = quad->uv_grid[ij].v;
|
||||||
|
gp_Pnt P = S->Value(u, v);
|
||||||
|
SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnFace(node, F);
|
||||||
|
quad->uv_grid[ij].node = node;
|
||||||
|
// Handle (SMDS_FacePosition) fpos
|
||||||
|
// = new SMDS_FacePosition(theSubMesh->GetId(),i,j); // easier than u,v
|
||||||
|
// node->SetPosition(fpos);
|
||||||
|
SMDS_FacePosition* fpos =
|
||||||
|
dynamic_cast<SMDS_FacePosition*>(node->GetPosition().get());
|
||||||
|
fpos->SetUParameter(i);
|
||||||
|
fpos->SetVParameter(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
// bool isQuadForward = ( faceIsForward == quad->isEdgeForward[0]);
|
||||||
|
for (int i = 0; i < nbdown - 1; i++)
|
||||||
|
for (int j = 0; j < nbright - 1; j++) // faces
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode *a, *b, *c, *d;
|
||||||
|
a = quad->uv_grid[j * nbdown + i].node;
|
||||||
|
b = quad->uv_grid[j * nbdown + i + 1].node;
|
||||||
|
c = quad->uv_grid[(j + 1) * nbdown + i + 1].node;
|
||||||
|
d = quad->uv_grid[(j + 1) * nbdown + i].node;
|
||||||
|
// if (isQuadForward) faceId = meshDS->AddFace(a,b,c,d);
|
||||||
|
// else faceId = meshDS->AddFace(a,d,c,b);
|
||||||
|
SMDS_MeshFace * face = meshDS->AddFace(a, b, c, d);
|
||||||
|
meshDS->SetMeshElementOnShape(face, F);
|
||||||
|
}
|
||||||
|
|
||||||
|
QuadDelete(quad);
|
||||||
|
bool isOk = true;
|
||||||
|
return isOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
FaceQuadStruct *StdMeshers_Quadrangle_2D::CheckAnd2Dcompute(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Shape & aShape)throw(SALOME_Exception)
|
||||||
|
{
|
||||||
|
Unexpect aCatch(SalomeException);
|
||||||
|
//MESSAGE("StdMeshers_Quadrangle_2D::ComputeWithoutStore");
|
||||||
|
|
||||||
|
SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
|
||||||
|
|
||||||
|
// const TopoDS_Face& FF = TopoDS::Face(aShape);
|
||||||
|
// bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD);
|
||||||
|
// TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
|
||||||
|
const TopoDS_Face & F = TopoDS::Face(aShape);
|
||||||
|
bool faceIsForward = (F.Orientation() == TopAbs_FORWARD);
|
||||||
|
|
||||||
|
// verify 1 wire only, with 4 edges, same number of points on opposite edges
|
||||||
|
|
||||||
|
if (NumberOfWires(F) != 1)
|
||||||
|
{
|
||||||
|
MESSAGE("only 1 wire by face (quadrangles)");
|
||||||
|
return 0;
|
||||||
|
//throw SALOME_Exception(LOCALIZED("only 1 wire by face (quadrangles)"));
|
||||||
|
}
|
||||||
|
// const TopoDS_Wire WW = BRepTools::OuterWire(F);
|
||||||
|
// TopoDS_Wire W = TopoDS::Wire(WW.Oriented(TopAbs_FORWARD));
|
||||||
|
const TopoDS_Wire & W = BRepTools::OuterWire(F);
|
||||||
|
BRepTools_WireExplorer wexp(W, F);
|
||||||
|
|
||||||
|
FaceQuadStruct *quad = new FaceQuadStruct;
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
quad->uv_edges[i] = 0;
|
||||||
|
quad->uv_grid = 0;
|
||||||
|
|
||||||
|
int nbEdges = 0;
|
||||||
|
for (wexp.Init(W, F); wexp.More(); wexp.Next())
|
||||||
|
{
|
||||||
|
// const TopoDS_Edge& EE = wexp.Current();
|
||||||
|
// TopoDS_Edge E = TopoDS::Edge(EE.Oriented(TopAbs_FORWARD));
|
||||||
|
const TopoDS_Edge & E = wexp.Current();
|
||||||
|
int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
|
||||||
|
if (nbEdges < 4)
|
||||||
|
{
|
||||||
|
quad->edge[nbEdges] = E;
|
||||||
|
quad->nbPts[nbEdges] = nb + 2; // internal points + 2 extrema
|
||||||
|
}
|
||||||
|
nbEdges++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nbEdges != 4)
|
||||||
|
{
|
||||||
|
MESSAGE("face must have 4 edges /quadrangles");
|
||||||
|
QuadDelete(quad);
|
||||||
|
return 0;
|
||||||
|
//throw SALOME_Exception(LOCALIZED("face must have 4 edges /quadrangles"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quad->nbPts[0] != quad->nbPts[2])
|
||||||
|
{
|
||||||
|
MESSAGE("different point number-opposed edge");
|
||||||
|
QuadDelete(quad);
|
||||||
|
return 0;
|
||||||
|
//throw SALOME_Exception(LOCALIZED("different point number-opposed edge"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quad->nbPts[1] != quad->nbPts[3])
|
||||||
|
{
|
||||||
|
MESSAGE("different point number-opposed edge");
|
||||||
|
QuadDelete(quad);
|
||||||
|
return 0;
|
||||||
|
//throw SALOME_Exception(LOCALIZED("different point number-opposed edge"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// set normalized grid on unit square in parametric domain
|
||||||
|
|
||||||
|
SetNormalizedGrid(aMesh, F, quad);
|
||||||
|
|
||||||
|
return quad;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_Quadrangle_2D::QuadDelete(FaceQuadStruct * quad)
|
||||||
|
{
|
||||||
|
//MESSAGE("StdMeshers_Quadrangle_2D::QuadDelete");
|
||||||
|
if (quad)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (quad->uv_edges[i])
|
||||||
|
delete[]quad->uv_edges[i];
|
||||||
|
quad->edge[i].Nullify();
|
||||||
|
}
|
||||||
|
if (quad->uv_grid)
|
||||||
|
delete[]quad->uv_grid;
|
||||||
|
delete quad;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void StdMeshers_Quadrangle_2D::SetNormalizedGrid(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Shape & aShape, FaceQuadStruct * quad) throw(SALOME_Exception)
|
||||||
|
{
|
||||||
|
Unexpect aCatch(SalomeException);
|
||||||
|
// Algorithme décrit dans "Génération automatique de maillages"
|
||||||
|
// P.L. GEORGE, MASSON, § 6.4.1 p. 84-85
|
||||||
|
// traitement dans le domaine paramétrique 2d u,v
|
||||||
|
// transport - projection sur le carré unité
|
||||||
|
|
||||||
|
const TopoDS_Face & F = TopoDS::Face(aShape);
|
||||||
|
|
||||||
|
// 1 --- find orientation of the 4 edges, by test on extrema
|
||||||
|
|
||||||
|
// max min 0 x1 1
|
||||||
|
// |<----north-2-------^ a3 -------------> a2
|
||||||
|
// | | ^1 1^
|
||||||
|
// west-3 east-1 =right | |
|
||||||
|
// | | ==> | |
|
||||||
|
// y0 | | y1 | |
|
||||||
|
// | | |0 0|
|
||||||
|
// v----south-0--------> a0 -------------> a1
|
||||||
|
// min max 0 x0 1
|
||||||
|
// =down
|
||||||
|
//
|
||||||
|
|
||||||
|
Handle(Geom2d_Curve) c2d[4];
|
||||||
|
gp_Pnt2d pf[4];
|
||||||
|
gp_Pnt2d pl[4];
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
c2d[i] = BRep_Tool::CurveOnSurface(quad->edge[i],
|
||||||
|
F, quad->first[i], quad->last[i]);
|
||||||
|
pf[i] = c2d[i]->Value(quad->first[i]);
|
||||||
|
pl[i] = c2d[i]->Value(quad->last[i]);
|
||||||
|
quad->isEdgeForward[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
double eps2d = 1.e-3; // *** utiliser plutot TopExp::CommonVertex, puis
|
||||||
|
// distances si piece fausse
|
||||||
|
int i = 0;
|
||||||
|
if ((pf[1].Distance(pl[0]) < eps2d) || (pl[1].Distance(pl[0]) < eps2d))
|
||||||
|
{
|
||||||
|
quad->isEdgeForward[0] = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double tmp = quad->first[0];
|
||||||
|
quad->first[0] = quad->last[0];
|
||||||
|
quad->last[0] = tmp;
|
||||||
|
pf[0] = c2d[0]->Value(quad->first[0]);
|
||||||
|
pl[0] = c2d[0]->Value(quad->last[0]);
|
||||||
|
}
|
||||||
|
for (int i = 1; i < 4; i++)
|
||||||
|
{
|
||||||
|
quad->isEdgeForward[i] = (pf[i].Distance(pl[i - 1]) < eps2d);
|
||||||
|
if (!quad->isEdgeForward[i])
|
||||||
|
{
|
||||||
|
double tmp = quad->first[i];
|
||||||
|
quad->first[i] = quad->last[i];
|
||||||
|
quad->last[i] = tmp;
|
||||||
|
pf[i] = c2d[i]->Value(quad->first[i]);
|
||||||
|
pl[i] = c2d[i]->Value(quad->last[i]);
|
||||||
|
//SCRUTE(pf[i].Distance(pl[i-1]));
|
||||||
|
ASSERT(pf[i].Distance(pl[i - 1]) < eps2d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//SCRUTE(pf[0].Distance(pl[3]));
|
||||||
|
ASSERT(pf[0].Distance(pl[3]) < eps2d);
|
||||||
|
|
||||||
|
// for (int i=0; i<4; i++)
|
||||||
|
// {
|
||||||
|
// SCRUTE(quad->isEdgeForward[i]);
|
||||||
|
// MESSAGE(" -first "<<i<<" "<<pf[i].X()<<" "<<pf[i].Y());
|
||||||
|
// MESSAGE(" -last "<<i<<" "<<pl[i].X()<<" "<<pl[i].Y());
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 2 --- load 2d edge points (u,v) with orientation and value on unit square
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
quad->uv_edges[i] = LoadEdgePoints(aMesh, F,
|
||||||
|
quad->edge[i], quad->first[i], quad->last[i]);
|
||||||
|
|
||||||
|
// quad->isEdgeForward[i]);
|
||||||
|
}
|
||||||
|
for (int i = 2; i < 4; i++)
|
||||||
|
{
|
||||||
|
quad->uv_edges[i] = LoadEdgePoints(aMesh, F,
|
||||||
|
quad->edge[i], quad->last[i], quad->first[i]);
|
||||||
|
|
||||||
|
// !quad->isEdgeForward[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3 --- 2D normalized values on unit square [0..1][0..1]
|
||||||
|
|
||||||
|
int nbdown = quad->nbPts[0];
|
||||||
|
int nbright = quad->nbPts[1];
|
||||||
|
quad->uv_grid = new UVPtStruct[nbright * nbdown];
|
||||||
|
|
||||||
|
UVPtStruct *uv_grid = quad->uv_grid;
|
||||||
|
UVPtStruct *uv_e0 = quad->uv_edges[0];
|
||||||
|
UVPtStruct *uv_e1 = quad->uv_edges[1];
|
||||||
|
UVPtStruct *uv_e2 = quad->uv_edges[2];
|
||||||
|
UVPtStruct *uv_e3 = quad->uv_edges[3];
|
||||||
|
gp_Pnt2d a0 = pf[0];
|
||||||
|
gp_Pnt2d a1 = pf[1];
|
||||||
|
gp_Pnt2d a2 = pf[2];
|
||||||
|
gp_Pnt2d a3 = pf[3];
|
||||||
|
|
||||||
|
// nodes Id on edges
|
||||||
|
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 0; i < nbdown; i++)
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
uv_grid[ij].node = uv_e0[i].node;
|
||||||
|
}
|
||||||
|
i = nbdown - 1;
|
||||||
|
for (int j = 0; j < nbright; j++)
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
uv_grid[ij].node = uv_e1[j].node;
|
||||||
|
}
|
||||||
|
j = nbright - 1;
|
||||||
|
for (int i = 0; i < nbdown; i++)
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
uv_grid[ij].node = uv_e2[i].node;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
for (int j = 0; j < nbright; j++)
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
uv_grid[ij].node = uv_e3[j].node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalized 2d values on grid
|
||||||
|
|
||||||
|
for (int i = 0; i < nbdown; i++)
|
||||||
|
for (int j = 0; j < nbright; j++)
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
// --- droite i cste : x = x0 + y(x1-x0)
|
||||||
|
double x0 = uv_e0[i].normParam; // bas - sud
|
||||||
|
double x1 = uv_e2[i].normParam; // haut - nord
|
||||||
|
// --- droite j cste : y = y0 + x(y1-y0)
|
||||||
|
double y0 = uv_e3[j].normParam; // gauche-ouest
|
||||||
|
double y1 = uv_e1[j].normParam; // droite - est
|
||||||
|
// --- intersection : x=x0+(y0+x(y1-y0))(x1-x0)
|
||||||
|
double x = (x0 + y0 * (x1 - x0)) / (1 - (y1 - y0) * (x1 - x0));
|
||||||
|
double y = y0 + x * (y1 - y0);
|
||||||
|
uv_grid[ij].x = x;
|
||||||
|
uv_grid[ij].y = y;
|
||||||
|
//MESSAGE("-xy-01 "<<x0<<" "<<x1<<" "<<y0<<" "<<y1);
|
||||||
|
//MESSAGE("-xy-norm "<<i<<" "<<j<<" "<<x<<" "<<y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4 --- projection on 2d domain (u,v)
|
||||||
|
|
||||||
|
for (int i = 0; i < nbdown; i++)
|
||||||
|
for (int j = 0; j < nbright; j++)
|
||||||
|
{
|
||||||
|
int ij = j * nbdown + i;
|
||||||
|
double x = uv_grid[ij].x;
|
||||||
|
double y = uv_grid[ij].y;
|
||||||
|
double param_0 = uv_e0[0].param + x * (uv_e0[nbdown - 1].param - uv_e0[0].param); // sud
|
||||||
|
double param_2 = uv_e2[0].param + x * (uv_e2[nbdown - 1].param - uv_e2[0].param); // nord
|
||||||
|
double param_1 = uv_e1[0].param + y * (uv_e1[nbright - 1].param - uv_e1[0].param); // est
|
||||||
|
double param_3 = uv_e3[0].param + y * (uv_e3[nbright - 1].param - uv_e3[0].param); // ouest
|
||||||
|
|
||||||
|
//MESSAGE("params "<<param_0<<" "<<param_1<<" "<<param_2<<" "<<param_3);
|
||||||
|
gp_Pnt2d p0 = c2d[0]->Value(param_0);
|
||||||
|
gp_Pnt2d p1 = c2d[1]->Value(param_1);
|
||||||
|
gp_Pnt2d p2 = c2d[2]->Value(param_2);
|
||||||
|
gp_Pnt2d p3 = c2d[3]->Value(param_3);
|
||||||
|
|
||||||
|
double u =
|
||||||
|
(1 - y) * p0.X() + x * p1.X() + y * p2.X() + (1 - x) * p3.X();
|
||||||
|
double v =
|
||||||
|
(1 - y) * p0.Y() + x * p1.Y() + y * p2.Y() + (1 - x) * p3.Y();
|
||||||
|
|
||||||
|
u -= (1 - x) * (1 - y) * a0.X() + x * (1 - y) * a1.X() +
|
||||||
|
x * y * a2.X() + (1 - x) * y * a3.X();
|
||||||
|
v -= (1 - x) * (1 - y) * a0.Y() + x * (1 - y) * a1.Y() +
|
||||||
|
x * y * a2.Y() + (1 - x) * y * a3.Y();
|
||||||
|
|
||||||
|
uv_grid[ij].u = u;
|
||||||
|
uv_grid[ij].v = v;
|
||||||
|
|
||||||
|
//MESSAGE("-uv- "<<i<<" "<<j<<" "<<uv_grid[ij].u<<" "<<uv_grid[ij].v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
UVPtStruct *StdMeshers_Quadrangle_2D::LoadEdgePoints(SMESH_Mesh & aMesh,
|
||||||
|
const TopoDS_Face & F, const TopoDS_Edge & E, double first, double last)
|
||||||
|
// bool isForward)
|
||||||
|
{
|
||||||
|
//MESSAGE("StdMeshers_Quadrangle_2D::LoadEdgePoints");
|
||||||
|
|
||||||
|
SMDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
|
||||||
|
// --- IDNodes of first and last Vertex
|
||||||
|
|
||||||
|
TopoDS_Vertex VFirst, VLast;
|
||||||
|
TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l
|
||||||
|
|
||||||
|
ASSERT(!VFirst.IsNull());
|
||||||
|
SMDS_NodeIteratorPtr lid= aMesh.GetSubMesh(VFirst)->GetSubMeshDS()->GetNodes();
|
||||||
|
const SMDS_MeshNode * idFirst = lid->next();
|
||||||
|
|
||||||
|
ASSERT(!VLast.IsNull());
|
||||||
|
lid=aMesh.GetSubMesh(VLast)->GetSubMeshDS()->GetNodes();
|
||||||
|
const SMDS_MeshNode * idLast = lid->next();
|
||||||
|
|
||||||
|
// --- edge internal IDNodes (relies on good order storage, not checked)
|
||||||
|
|
||||||
|
int nbPoints = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
|
||||||
|
//SCRUTE(nbPoints);
|
||||||
|
UVPtStruct *uvslf = new UVPtStruct[nbPoints + 2];
|
||||||
|
|
||||||
|
double f, l;
|
||||||
|
Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
|
||||||
|
|
||||||
|
map<double, const SMDS_MeshNode *> params;
|
||||||
|
SMDS_NodeIteratorPtr ite= aMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes();
|
||||||
|
|
||||||
|
while(ite->more())
|
||||||
|
{
|
||||||
|
const SMDS_MeshNode * node = ite->next();
|
||||||
|
const SMDS_EdgePosition* epos =
|
||||||
|
static_cast<const SMDS_EdgePosition*>(node->GetPosition().get());
|
||||||
|
double param = epos->GetUParameter();
|
||||||
|
params[param] = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isForward = (((l - f) * (last - first)) > 0);
|
||||||
|
double paramin = 0;
|
||||||
|
double paramax = 0;
|
||||||
|
if (isForward)
|
||||||
|
{
|
||||||
|
paramin = f;
|
||||||
|
paramax = l;
|
||||||
|
gp_Pnt2d p = C2d->Value(f); // first point = Vertex Forward
|
||||||
|
uvslf[0].x = p.X();
|
||||||
|
uvslf[0].y = p.Y();
|
||||||
|
uvslf[0].param = f;
|
||||||
|
uvslf[0].node = idFirst;
|
||||||
|
//MESSAGE("__ f "<<f<<" "<<uvslf[0].x <<" "<<uvslf[0].y);
|
||||||
|
map < double, const SMDS_MeshNode* >::iterator itp = params.begin();
|
||||||
|
for (int i = 1; i <= nbPoints; i++) // nbPoints internal
|
||||||
|
{
|
||||||
|
double param = (*itp).first;
|
||||||
|
gp_Pnt2d p = C2d->Value(param);
|
||||||
|
uvslf[i].x = p.X();
|
||||||
|
uvslf[i].y = p.Y();
|
||||||
|
uvslf[i].param = param;
|
||||||
|
uvslf[i].node = (*itp).second;
|
||||||
|
//MESSAGE("__ "<<i<<" "<<param<<" "<<uvslf[i].x <<" "<<uvslf[i].y);
|
||||||
|
itp++;
|
||||||
|
}
|
||||||
|
p = C2d->Value(l); // last point = Vertex Reversed
|
||||||
|
uvslf[nbPoints + 1].x = p.X();
|
||||||
|
uvslf[nbPoints + 1].y = p.Y();
|
||||||
|
uvslf[nbPoints + 1].param = l;
|
||||||
|
uvslf[nbPoints + 1].node = idLast;
|
||||||
|
//MESSAGE("__ l "<<l<<" "<<uvslf[nbPoints+1].x <<" "<<uvslf[nbPoints+1].y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
paramin = l;
|
||||||
|
paramax = f;
|
||||||
|
gp_Pnt2d p = C2d->Value(l); // first point = Vertex Reversed
|
||||||
|
uvslf[0].x = p.X();
|
||||||
|
uvslf[0].y = p.Y();
|
||||||
|
uvslf[0].param = l;
|
||||||
|
uvslf[0].node = idLast;
|
||||||
|
//MESSAGE("__ l "<<l<<" "<<uvslf[0].x <<" "<<uvslf[0].y);
|
||||||
|
map < double, const SMDS_MeshNode* >::reverse_iterator itp = params.rbegin();
|
||||||
|
for (int j = nbPoints; j >= 1; j--) // nbPoints internal
|
||||||
|
{
|
||||||
|
double param = (*itp).first;
|
||||||
|
int i = nbPoints + 1 - j;
|
||||||
|
gp_Pnt2d p = C2d->Value(param);
|
||||||
|
uvslf[i].x = p.X();
|
||||||
|
uvslf[i].y = p.Y();
|
||||||
|
uvslf[i].param = param;
|
||||||
|
uvslf[i].node = (*itp).second;
|
||||||
|
//MESSAGE("__ "<<i<<" "<<param<<" "<<uvslf[i].x <<" "<<uvslf[i].y);
|
||||||
|
itp++;
|
||||||
|
}
|
||||||
|
p = C2d->Value(f); // last point = Vertex Forward
|
||||||
|
uvslf[nbPoints + 1].x = p.X();
|
||||||
|
uvslf[nbPoints + 1].y = p.Y();
|
||||||
|
uvslf[nbPoints + 1].param = f;
|
||||||
|
uvslf[nbPoints + 1].node = idFirst;
|
||||||
|
//MESSAGE("__ f "<<f<<" "<<uvslf[nbPoints+1].x <<" "<<uvslf[nbPoints+1].y);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(paramin != paramax);
|
||||||
|
for (int i = 0; i < nbPoints + 2; i++)
|
||||||
|
{
|
||||||
|
uvslf[i].normParam = (uvslf[i].param - paramin) / (paramax - paramin);
|
||||||
|
//SCRUTE(uvslf[i].normParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
return uvslf;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_Quadrangle_2D::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_Quadrangle_2D::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator <<(ostream & save, StdMeshers_Quadrangle_2D & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >>(istream & load, StdMeshers_Quadrangle_2D & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
102
src/StdMeshers/StdMeshers_Quadrangle_2D.hxx
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_Quadrangle_2D.hxx
|
||||||
|
// Moved here from SMESH_Quadrangle_2D.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_QUADRANGLE_2D_HXX_
|
||||||
|
#define _SMESH_QUADRANGLE_2D_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_2D_Algo.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
#include "Utils_SALOME_Exception.hxx"
|
||||||
|
|
||||||
|
typedef struct uvPtStruct
|
||||||
|
{
|
||||||
|
double param;
|
||||||
|
double normParam;
|
||||||
|
double u; // original 2d parameter
|
||||||
|
double v;
|
||||||
|
double x; // 2d parameter, normalized [0,1]
|
||||||
|
double y;
|
||||||
|
const SMDS_MeshNode * node;
|
||||||
|
} UVPtStruct;
|
||||||
|
|
||||||
|
typedef struct faceQuadStruct
|
||||||
|
{
|
||||||
|
int nbPts[4];
|
||||||
|
TopoDS_Edge edge[4];
|
||||||
|
double first[4];
|
||||||
|
double last[4];
|
||||||
|
bool isEdgeForward[4];
|
||||||
|
UVPtStruct* uv_edges[4];
|
||||||
|
UVPtStruct* uv_grid;
|
||||||
|
} FaceQuadStruct;
|
||||||
|
|
||||||
|
class StdMeshers_Quadrangle_2D:
|
||||||
|
public SMESH_2D_Algo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_Quadrangle_2D(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_Quadrangle_2D();
|
||||||
|
|
||||||
|
virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus);
|
||||||
|
|
||||||
|
virtual bool Compute(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
FaceQuadStruct* CheckAnd2Dcompute(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
void QuadDelete(FaceQuadStruct* quad);
|
||||||
|
|
||||||
|
ostream & SaveTo(ostream & save);
|
||||||
|
istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_Quadrangle_2D & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_Quadrangle_2D & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void SetNormalizedGrid(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
FaceQuadStruct* quad)
|
||||||
|
throw (SALOME_Exception);
|
||||||
|
|
||||||
|
UVPtStruct* LoadEdgePoints(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Face& F,
|
||||||
|
const TopoDS_Edge& E,
|
||||||
|
double first,
|
||||||
|
double last);
|
||||||
|
// bool isForward);
|
||||||
|
|
||||||
|
// FaceQuadStruct _quadDesc;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
331
src/StdMeshers/StdMeshers_Regular_1D.cxx
Normal file
@ -0,0 +1,331 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_Regular_1D.cxx
|
||||||
|
// Moved here from SMESH_Regular_1D.cxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "StdMeshers_Regular_1D.hxx"
|
||||||
|
#include "SMESH_Gen.hxx"
|
||||||
|
#include "SMESH_Mesh.hxx"
|
||||||
|
|
||||||
|
#include "StdMeshers_LocalLength.hxx"
|
||||||
|
#include "StdMeshers_NumberOfSegments.hxx"
|
||||||
|
|
||||||
|
#include "SMDS_MeshElement.hxx"
|
||||||
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
#include "SMDS_EdgePosition.hxx"
|
||||||
|
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include <TopoDS_Edge.hxx>
|
||||||
|
#include <TopoDS_Shape.hxx>
|
||||||
|
#include <GeomAdaptor_Curve.hxx>
|
||||||
|
#include <BRep_Tool.hxx>
|
||||||
|
#include <GCPnts_AbscissaPoint.hxx>
|
||||||
|
#include <GCPnts_UniformAbscissa.hxx>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_Regular_1D::StdMeshers_Regular_1D(int hypId, int studyId,
|
||||||
|
SMESH_Gen * gen):SMESH_1D_Algo(hypId, studyId, gen)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_Regular_1D::StdMeshers_Regular_1D");
|
||||||
|
_name = "Regular_1D";
|
||||||
|
// _shapeType = TopAbs_EDGE;
|
||||||
|
_shapeType = (1 << TopAbs_EDGE);
|
||||||
|
_compatibleHypothesis.push_back("LocalLength");
|
||||||
|
_compatibleHypothesis.push_back("NumberOfSegments");
|
||||||
|
|
||||||
|
_localLength = 0;
|
||||||
|
_numberOfSegments = 0;
|
||||||
|
_hypLocalLength = NULL;
|
||||||
|
_hypNumberOfSegments = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
StdMeshers_Regular_1D::~StdMeshers_Regular_1D()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool StdMeshers_Regular_1D::CheckHypothesis
|
||||||
|
(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus)
|
||||||
|
{
|
||||||
|
//MESSAGE("StdMeshers_Regular_1D::CheckHypothesis");
|
||||||
|
|
||||||
|
list <const SMESHDS_Hypothesis * >::const_iterator itl;
|
||||||
|
const SMESHDS_Hypothesis *theHyp;
|
||||||
|
|
||||||
|
const list <const SMESHDS_Hypothesis * >&hyps = GetUsedHypothesis(aMesh, aShape);
|
||||||
|
int nbHyp = hyps.size();
|
||||||
|
if (!nbHyp)
|
||||||
|
{
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_MISSING;
|
||||||
|
return false; // can't work with no hypothesis
|
||||||
|
}
|
||||||
|
|
||||||
|
itl = hyps.begin();
|
||||||
|
theHyp = (*itl); // use only the first hypothesis
|
||||||
|
|
||||||
|
string hypName = theHyp->GetName();
|
||||||
|
int hypId = theHyp->GetID();
|
||||||
|
//SCRUTE(hypName);
|
||||||
|
|
||||||
|
bool isOk = false;
|
||||||
|
|
||||||
|
if (hypName == "LocalLength")
|
||||||
|
{
|
||||||
|
_hypLocalLength = dynamic_cast <const StdMeshers_LocalLength * >(theHyp);
|
||||||
|
ASSERT(_hypLocalLength);
|
||||||
|
_localLength = _hypLocalLength->GetLength();
|
||||||
|
_numberOfSegments = 0;
|
||||||
|
isOk = true;
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (hypName == "NumberOfSegments")
|
||||||
|
{
|
||||||
|
_hypNumberOfSegments =
|
||||||
|
dynamic_cast <const StdMeshers_NumberOfSegments * >(theHyp);
|
||||||
|
ASSERT(_hypNumberOfSegments);
|
||||||
|
_numberOfSegments = _hypNumberOfSegments->GetNumberOfSegments();
|
||||||
|
_scaleFactor = _hypNumberOfSegments->GetScaleFactor();
|
||||||
|
_localLength = 0;
|
||||||
|
isOk = true;
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE;
|
||||||
|
|
||||||
|
//SCRUTE(_localLength);
|
||||||
|
//SCRUTE(_numberOfSegments);
|
||||||
|
|
||||||
|
return isOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshers_Regular_1D::Compute");
|
||||||
|
|
||||||
|
SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
|
||||||
|
SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
|
||||||
|
|
||||||
|
const TopoDS_Edge & EE = TopoDS::Edge(aShape);
|
||||||
|
TopoDS_Edge E = TopoDS::Edge(EE.Oriented(TopAbs_FORWARD));
|
||||||
|
|
||||||
|
double f, l;
|
||||||
|
Handle(Geom_Curve) Curve = BRep_Tool::Curve(E, f, l);
|
||||||
|
|
||||||
|
TopoDS_Vertex VFirst, VLast;
|
||||||
|
TopExp::Vertices(E, VFirst, VLast); // Vfirst corresponds to f and Vlast to l
|
||||||
|
|
||||||
|
double length = EdgeLength(E);
|
||||||
|
//SCRUTE(length);
|
||||||
|
|
||||||
|
double eltSize = 1;
|
||||||
|
// if (_localLength > 0) eltSize = _localLength;
|
||||||
|
if (_localLength > 0)
|
||||||
|
{
|
||||||
|
double nbseg = ceil(length / _localLength); // integer sup
|
||||||
|
if (nbseg <= 0)
|
||||||
|
nbseg = 1; // degenerated edge
|
||||||
|
eltSize = length / nbseg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ASSERT(_numberOfSegments > 0);
|
||||||
|
eltSize = length / _numberOfSegments;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(!VFirst.IsNull());
|
||||||
|
SMDS_NodeIteratorPtr lid= aMesh.GetSubMesh(VFirst)->GetSubMeshDS()->GetNodes();
|
||||||
|
const SMDS_MeshNode * idFirst = lid->next();
|
||||||
|
|
||||||
|
ASSERT(!VLast.IsNull());
|
||||||
|
lid=aMesh.GetSubMesh(VLast)->GetSubMeshDS()->GetNodes();
|
||||||
|
const SMDS_MeshNode * idLast = lid->next();
|
||||||
|
|
||||||
|
if (!Curve.IsNull())
|
||||||
|
{
|
||||||
|
GeomAdaptor_Curve C3d(Curve);
|
||||||
|
GCPnts_UniformAbscissa Discret(C3d, eltSize, f, l);
|
||||||
|
int NbPoints = Discret.NbPoints();
|
||||||
|
//MESSAGE("nb points on edge : "<<NbPoints);
|
||||||
|
|
||||||
|
// edge extrema (indexes : 1 & NbPoints) already in SMDS (TopoDS_Vertex)
|
||||||
|
// only internal nodes receive an edge position with param on curve
|
||||||
|
|
||||||
|
const SMDS_MeshNode * idPrev = idFirst;
|
||||||
|
for (int i = 2; i < NbPoints; i++)
|
||||||
|
{
|
||||||
|
double param = Discret.Parameter(i);
|
||||||
|
|
||||||
|
if (_numberOfSegments > 1)
|
||||||
|
{
|
||||||
|
double epsilon = 0.001;
|
||||||
|
if (fabs(_scaleFactor - 1.0) > epsilon)
|
||||||
|
{
|
||||||
|
double alpha =
|
||||||
|
pow(_scaleFactor, 1.0 / (_numberOfSegments - 1));
|
||||||
|
double d =
|
||||||
|
length * (1 - pow(alpha, i - 1)) / (1 - pow(alpha,
|
||||||
|
_numberOfSegments));
|
||||||
|
param = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gp_Pnt P = Curve->Value(param);
|
||||||
|
|
||||||
|
//Add the Node in the DataStructure
|
||||||
|
//MESSAGE("point "<<nodeId<<" "<<P.X()<<" "<<P.Y()<<" "<<P.Z()<<" - "<<i<<" "<<param);
|
||||||
|
SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnEdge(node, E);
|
||||||
|
|
||||||
|
// **** edgePosition associe au point = param.
|
||||||
|
SMDS_EdgePosition* epos =
|
||||||
|
dynamic_cast<SMDS_EdgePosition *>(node->GetPosition().get());
|
||||||
|
epos->SetUParameter(param);
|
||||||
|
|
||||||
|
SMDS_MeshEdge * edge = meshDS->AddEdge(idPrev, node);
|
||||||
|
meshDS->SetMeshElementOnShape(edge, E);
|
||||||
|
idPrev = node;
|
||||||
|
}
|
||||||
|
SMDS_MeshEdge* edge = meshDS->AddEdge(idPrev, idLast);
|
||||||
|
meshDS->SetMeshElementOnShape(edge, E);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// MESSAGE ("Edge Degeneree non traitee --- arret");
|
||||||
|
// ASSERT(0);
|
||||||
|
if (BRep_Tool::Degenerated(E))
|
||||||
|
{
|
||||||
|
// Edge is a degenerated Edge : We put n = 5 points on the edge.
|
||||||
|
int NbPoints = 5;
|
||||||
|
BRep_Tool::Range(E, f, l);
|
||||||
|
double du = (l - f) / (NbPoints - 1);
|
||||||
|
MESSAGE("************* Degenerated edge! *****************");
|
||||||
|
|
||||||
|
TopoDS_Vertex V1, V2;
|
||||||
|
TopExp::Vertices(E, V1, V2);
|
||||||
|
gp_Pnt P = BRep_Tool::Pnt(V1);
|
||||||
|
|
||||||
|
const SMDS_MeshNode * idPrev = idFirst;
|
||||||
|
for (int i = 2; i < NbPoints; i++)
|
||||||
|
{
|
||||||
|
double param = f + (i - 1) * du;
|
||||||
|
SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z());
|
||||||
|
meshDS->SetNodeOnEdge(node, E);
|
||||||
|
|
||||||
|
// Handle (SMDS_EdgePosition) epos
|
||||||
|
// = new SMDS_EdgePosition(theSubMesh->GetId(),param);
|
||||||
|
// node->SetPosition(epos);
|
||||||
|
SMDS_EdgePosition* epos =
|
||||||
|
dynamic_cast<SMDS_EdgePosition*>(node->GetPosition().get());
|
||||||
|
epos->SetUParameter(param);
|
||||||
|
|
||||||
|
SMDS_MeshEdge * edge = meshDS->AddEdge(idPrev, node);
|
||||||
|
meshDS->SetMeshElementOnShape(edge, E);
|
||||||
|
idPrev = node;
|
||||||
|
}
|
||||||
|
SMDS_MeshEdge * edge = meshDS->AddEdge(idPrev, idLast);
|
||||||
|
meshDS->SetMeshElementOnShape(edge, E);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & StdMeshers_Regular_1D::SaveTo(ostream & save)
|
||||||
|
{
|
||||||
|
return save;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & StdMeshers_Regular_1D::LoadFrom(istream & load)
|
||||||
|
{
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
ostream & operator <<(ostream & save, StdMeshers_Regular_1D & hyp)
|
||||||
|
{
|
||||||
|
return hyp.SaveTo( save );
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
istream & operator >>(istream & load, StdMeshers_Regular_1D & hyp)
|
||||||
|
{
|
||||||
|
return hyp.LoadFrom( load );
|
||||||
|
}
|
65
src/StdMeshers/StdMeshers_Regular_1D.hxx
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
// SMESH SMESH : implementaion of SMESH idl descriptions
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshers_Regular_1D.hxx
|
||||||
|
// Moved here from SMESH_Regular_1D.hxx
|
||||||
|
// Author : Paul RASCLE, EDF
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
#ifndef _SMESH_REGULAR_1D_HXX_
|
||||||
|
#define _SMESH_REGULAR_1D_HXX_
|
||||||
|
|
||||||
|
#include "SMESH_1D_Algo.hxx"
|
||||||
|
|
||||||
|
class StdMeshers_LocalLength;
|
||||||
|
class StdMeshers_NumberOfSegments;
|
||||||
|
|
||||||
|
class StdMeshers_Regular_1D:
|
||||||
|
public SMESH_1D_Algo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshers_Regular_1D(int hypId, int studyId, SMESH_Gen* gen);
|
||||||
|
virtual ~StdMeshers_Regular_1D();
|
||||||
|
|
||||||
|
virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape,
|
||||||
|
SMESH_Hypothesis::Hypothesis_Status& aStatus);
|
||||||
|
|
||||||
|
virtual bool Compute(SMESH_Mesh& aMesh,
|
||||||
|
const TopoDS_Shape& aShape);
|
||||||
|
|
||||||
|
ostream & SaveTo(ostream & save);
|
||||||
|
istream & LoadFrom(istream & load);
|
||||||
|
friend ostream & operator << (ostream & save, StdMeshers_Regular_1D & hyp);
|
||||||
|
friend istream & operator >> (istream & load, StdMeshers_Regular_1D & hyp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double _localLength;
|
||||||
|
int _numberOfSegments;
|
||||||
|
double _scaleFactor;
|
||||||
|
const StdMeshers_LocalLength* _hypLocalLength;
|
||||||
|
const StdMeshers_NumberOfSegments* _hypNumberOfSegments;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
78
src/StdMeshersGUI/Makefile.in
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# SMESH StdMeshersGUI : GUI for StdMeshers plugin
|
||||||
|
#
|
||||||
|
# Copyright (C) 2003 CEA
|
||||||
|
#
|
||||||
|
# This library is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this library; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
# See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# File : Makefile.in
|
||||||
|
# Author : Julia DOROVSKIKH
|
||||||
|
# Module : SMESH
|
||||||
|
# $Header$
|
||||||
|
|
||||||
|
top_srcdir=@top_srcdir@
|
||||||
|
top_builddir=../..
|
||||||
|
srcdir=@srcdir@
|
||||||
|
VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:${KERNEL_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome
|
||||||
|
|
||||||
|
|
||||||
|
@COMMENCE@
|
||||||
|
|
||||||
|
# .po files to transform in .qm
|
||||||
|
PO_FILES = \
|
||||||
|
StdMeshers_icons.po \
|
||||||
|
StdMeshers_msg_en.po
|
||||||
|
|
||||||
|
# Libraries targets
|
||||||
|
LIB = libStdMeshersGUI.la
|
||||||
|
LIB_SRC = \
|
||||||
|
StdMeshersGUI.cxx \
|
||||||
|
StdMeshersGUI_LocalLengthDlg.cxx \
|
||||||
|
StdMeshersGUI_NbSegmentsDlg.cxx \
|
||||||
|
StdMeshersGUI_MaxElementAreaDlg.cxx \
|
||||||
|
StdMeshersGUI_MaxElementVolumeDlg.cxx
|
||||||
|
|
||||||
|
LIB_MOC = \
|
||||||
|
StdMeshersGUI_LocalLengthDlg.h \
|
||||||
|
StdMeshersGUI_NbSegmentsDlg.h \
|
||||||
|
StdMeshersGUI_MaxElementAreaDlg.h \
|
||||||
|
StdMeshersGUI_MaxElementVolumeDlg.h
|
||||||
|
|
||||||
|
LIB_CLIENT_IDL = \
|
||||||
|
SALOME_Exception.idl \
|
||||||
|
SMESH_Gen.idl \
|
||||||
|
SMESH_Mesh.idl \
|
||||||
|
SMESH_Group.idl \
|
||||||
|
SMESH_Filter.idl \
|
||||||
|
SMESH_Hypothesis.idl \
|
||||||
|
SMESH_BasicHypothesis.idl \
|
||||||
|
MED.idl
|
||||||
|
|
||||||
|
LIB_SERVER_IDL =
|
||||||
|
|
||||||
|
# additionnal information to compil and link file
|
||||||
|
|
||||||
|
CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) \
|
||||||
|
$(MED2_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome \
|
||||||
|
$(BOOST_CPPFLAGS)
|
||||||
|
CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome
|
||||||
|
#$(OCC_CXXFLAGS)
|
||||||
|
|
||||||
|
LDFLAGS += -lSMESHGUI $(OCC_KERNEL_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome
|
||||||
|
|
||||||
|
@CONCLUDE@
|
225
src/StdMeshersGUI/StdMeshersGUI.cxx
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
// SMESH StdMeshersGUI : GUI for plugged-in meshers
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 CEA
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshersGUI.cxx
|
||||||
|
// Author : Julia DOROVSKIKH
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
|
||||||
|
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
#include "SMESHGUI_Hypotheses.h"
|
||||||
|
|
||||||
|
#include "StdMeshersGUI_LocalLengthDlg.h"
|
||||||
|
#include "StdMeshersGUI_NbSegmentsDlg.h"
|
||||||
|
#include "StdMeshersGUI_MaxElementAreaDlg.h"
|
||||||
|
#include "StdMeshersGUI_MaxElementVolumeDlg.h"
|
||||||
|
|
||||||
|
#include "QAD_Desktop.h"
|
||||||
|
#include "QAD_ResourceMgr.h"
|
||||||
|
|
||||||
|
#include <qobject.h>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*! class HypothesisCreator
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
class StdMeshersGUI_HypothesisCreator : public SMESHGUI_GenericHypothesisCreator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StdMeshersGUI_HypothesisCreator (const QString& aHypType,
|
||||||
|
const QString& aServerLibName,
|
||||||
|
SMESHGUI* aSMESHGUI)
|
||||||
|
: myHypType(aHypType),
|
||||||
|
myServerLibName(aServerLibName),
|
||||||
|
mySMESHGUI(aSMESHGUI) {}
|
||||||
|
|
||||||
|
virtual void CreateHypothesis (const bool isAlgo, QWidget* parent = 0);
|
||||||
|
virtual void EditHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString myHypType;
|
||||||
|
QString myServerLibName;
|
||||||
|
SMESHGUI* mySMESHGUI;
|
||||||
|
};
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*! HypothesisCreator::CreateHypothesis
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
void StdMeshersGUI_HypothesisCreator::CreateHypothesis
|
||||||
|
(bool isAlgo, QWidget* parent)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshersGUI_HypothesisCreator::CreateHypothesis");
|
||||||
|
|
||||||
|
// Get default name for hypothesis/algorithm creation
|
||||||
|
char* sHypType = (char*)myHypType.latin1();
|
||||||
|
HypothesisData* aHypData = mySMESHGUI->GetHypothesisData(sHypType);
|
||||||
|
QString aHypName;
|
||||||
|
if (aHypData)
|
||||||
|
aHypName = aHypData->Label;
|
||||||
|
else
|
||||||
|
aHypName = myHypType;
|
||||||
|
|
||||||
|
// Create hypothesis/algorithm
|
||||||
|
if (isAlgo)
|
||||||
|
{
|
||||||
|
mySMESHGUI->CreateHypothesis(myHypType, aHypName, isAlgo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Show Dialog for hypothesis creation
|
||||||
|
if (myHypType == "LocalLength")
|
||||||
|
StdMeshersGUI_LocalLengthDlg *aDlg = new StdMeshersGUI_LocalLengthDlg(myHypType, parent, "");
|
||||||
|
else if (myHypType == "NumberOfSegments")
|
||||||
|
StdMeshersGUI_NbSegmentsDlg *aDlg = new StdMeshersGUI_NbSegmentsDlg(myHypType, parent, "");
|
||||||
|
else if (myHypType == "MaxElementArea")
|
||||||
|
StdMeshersGUI_MaxElementAreaDlg *aDlg = new StdMeshersGUI_MaxElementAreaDlg(myHypType, parent, "");
|
||||||
|
else if (myHypType == "MaxElementVolume")
|
||||||
|
StdMeshersGUI_MaxElementVolumeDlg *aDlg = new StdMeshersGUI_MaxElementVolumeDlg(myHypType, parent, "");
|
||||||
|
else if (myHypType == "LengthFromEdges")
|
||||||
|
mySMESHGUI->CreateHypothesis(myHypType, aHypName, isAlgo); // without GUI
|
||||||
|
else if (myHypType == "NotConformAllowed")
|
||||||
|
mySMESHGUI->CreateHypothesis(myHypType, aHypName, isAlgo); // without GUI
|
||||||
|
else ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*! HypothesisCreator::EditHypothesis
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
void StdMeshersGUI_HypothesisCreator::EditHypothesis
|
||||||
|
(SMESH::SMESH_Hypothesis_ptr theHyp)
|
||||||
|
{
|
||||||
|
MESSAGE("StdMeshersGUI_HypothesisCreator::EditHypothesis");
|
||||||
|
|
||||||
|
Standard_Boolean res = Standard_True;
|
||||||
|
SALOMEDS::Study::ListOfSObject_var listSOmesh =
|
||||||
|
mySMESHGUI->GetMeshesUsingAlgoOrHypothesis(theHyp);
|
||||||
|
QString Name = theHyp->GetName();
|
||||||
|
if (Name.compare("LocalLength") == 0)
|
||||||
|
{
|
||||||
|
StdMeshers::StdMeshers_LocalLength_var LL =
|
||||||
|
StdMeshers::StdMeshers_LocalLength::_narrow(theHyp);
|
||||||
|
double beforeLength = LL->GetLength() ;
|
||||||
|
double Length = mySMESHGUI->Parameter(res,
|
||||||
|
beforeLength,
|
||||||
|
QObject::tr("SMESH_LOCAL_LENGTH_HYPOTHESIS"),
|
||||||
|
QObject::tr("SMESH_VALUE"),
|
||||||
|
1.0E-5, 1E6, 6);
|
||||||
|
if (res && Length != beforeLength)
|
||||||
|
{
|
||||||
|
LL->SetLength(Length);
|
||||||
|
for (int i=0; i<listSOmesh->length(); i++)
|
||||||
|
{
|
||||||
|
mySMESHGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Name.compare("NumberOfSegments") == 0)
|
||||||
|
{
|
||||||
|
StdMeshers::StdMeshers_NumberOfSegments_var NOS =
|
||||||
|
StdMeshers::StdMeshers_NumberOfSegments::_narrow(theHyp);
|
||||||
|
int beforeNbSeg = NOS->GetNumberOfSegments() ;
|
||||||
|
int NbSeg = mySMESHGUI->Parameter(res,
|
||||||
|
beforeNbSeg,
|
||||||
|
QObject::tr("SMESH_NB_SEGMENTS_HYPOTHESIS"),
|
||||||
|
QObject::tr("SMESH_VALUE"),
|
||||||
|
1, 1000000);
|
||||||
|
if (res && NbSeg != beforeNbSeg)
|
||||||
|
{
|
||||||
|
NOS->SetNumberOfSegments(NbSeg);
|
||||||
|
for (int i=0; i<listSOmesh->length(); i++)
|
||||||
|
{
|
||||||
|
SALOMEDS::SObject_var SO = listSOmesh[i] ;
|
||||||
|
mySMESHGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Name.compare("MaxElementArea") == 0)
|
||||||
|
{
|
||||||
|
StdMeshers::StdMeshers_MaxElementArea_var MEA =
|
||||||
|
StdMeshers::StdMeshers_MaxElementArea::_narrow(theHyp);
|
||||||
|
double beforeMaxArea = MEA->GetMaxElementArea();
|
||||||
|
double MaxArea = mySMESHGUI->Parameter(res,
|
||||||
|
beforeMaxArea,
|
||||||
|
QObject::tr("SMESH_MAX_ELEMENT_AREA_HYPOTHESIS"),
|
||||||
|
QObject::tr("SMESH_VALUE"),
|
||||||
|
1.0E-5, 1E6, 6);
|
||||||
|
if (res && MaxArea != beforeMaxArea)
|
||||||
|
{
|
||||||
|
MEA->SetMaxElementArea(MaxArea);
|
||||||
|
for (int i=0; i<listSOmesh->length(); i++)
|
||||||
|
{
|
||||||
|
mySMESHGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Name.compare("MaxElementVolume") == 0)
|
||||||
|
{
|
||||||
|
StdMeshers::StdMeshers_MaxElementVolume_var MEV =
|
||||||
|
StdMeshers::StdMeshers_MaxElementVolume::_narrow(theHyp);
|
||||||
|
double beforeMaxVolume = MEV->GetMaxElementVolume() ;
|
||||||
|
double MaxVolume = mySMESHGUI->Parameter(res,
|
||||||
|
beforeMaxVolume,
|
||||||
|
QObject::tr("SMESH_MAX_ELEMENT_VOLUME_HYPOTHESIS"),
|
||||||
|
QObject::tr("SMESH_VALUE"),
|
||||||
|
1.0E-5, 1E6, 6);
|
||||||
|
if (res && MaxVolume != beforeMaxVolume)
|
||||||
|
{
|
||||||
|
MEV->SetMaxElementVolume(MaxVolume);
|
||||||
|
for (int i=0; i<listSOmesh->length(); i++)
|
||||||
|
{
|
||||||
|
mySMESHGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// else if (Name.compare("Regular_1D") == 0)
|
||||||
|
// {}
|
||||||
|
// else if (Name.compare("MEFISTO_2D") == 0)
|
||||||
|
// {}
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/*! GetHypothesisCreator
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//=============================================================================
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator
|
||||||
|
(QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI)
|
||||||
|
{
|
||||||
|
return new StdMeshersGUI_HypothesisCreator
|
||||||
|
(aHypType, aServerLibName, aSMESHGUI);
|
||||||
|
}
|
||||||
|
}
|
289
src/StdMeshersGUI/StdMeshersGUI_LocalLengthDlg.cxx
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
// SMESH StdMeshersGUI : GUI for StdMeshers plugin
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
||||||
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
//
|
||||||
|
// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// File : StdMeshersGUI_LocalLengthDlg.cxx
|
||||||
|
// Moved here from SMESHGUI_LocalLengthDlg.cxx
|
||||||
|
// Author : Nicolas REJNERI
|
||||||
|
// Module : SMESH
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#include "StdMeshersGUI_LocalLengthDlg.h"
|
||||||
|
#include "SMESHGUI.h"
|
||||||
|
#include "SMESHGUI_SpinBox.h"
|
||||||
|
|
||||||
|
#include <SALOMEconfig.h>
|
||||||
|
#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
|
||||||
|
|
||||||
|
#include "QAD_Application.h"
|
||||||
|
#include "QAD_Desktop.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include "SALOMEGUI_QtCatchCorbaException.hxx"
|
||||||
|
#include "QAD_MessageBox.h"
|
||||||
|
#include "QAD_WaitCursor.h"
|
||||||
|
|
||||||
|
// QT Includes
|
||||||
|
#include <qgroupbox.h>
|
||||||
|
#include <qlabel.h>
|
||||||
|
#include <qlineedit.h>
|
||||||
|
#include <qpushbutton.h>
|
||||||
|
#include <qlayout.h>
|
||||||
|
#include <qpixmap.h>
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// class : StdMeshersGUI_LocalLengthDlg()
|
||||||
|
// purpose : Constructs a StdMeshersGUI_LocalLengthDlg which is a child of 'parent', with the
|
||||||
|
// name 'name' and widget flags set to 'f'.
|
||||||
|
// The dialog will by default be modeless, unless you set 'modal' to
|
||||||
|
// TRUE to construct a modal dialog.
|
||||||
|
//=================================================================================
|
||||||
|
StdMeshersGUI_LocalLengthDlg::StdMeshersGUI_LocalLengthDlg (const QString& hypType,
|
||||||
|
QWidget* parent,
|
||||||
|
const char* name,
|
||||||
|
bool modal,
|
||||||
|
WFlags fl)
|
||||||
|
: QDialog (parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose),
|
||||||
|
myHypType(hypType)
|
||||||
|
{
|
||||||
|
QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_DLG_LOCAL_LENGTH")));
|
||||||
|
|
||||||
|
if ( !name )
|
||||||
|
setName( "StdMeshersGUI_LocalLengthDlg" );
|
||||||
|
setCaption( tr( "SMESH_LOCAL_LENGTH_TITLE" ) );
|
||||||
|
setSizeGripEnabled( TRUE );
|
||||||
|
QGridLayout* StdMeshersGUI_LocalLengthDlgLayout = new QGridLayout( this );
|
||||||
|
StdMeshersGUI_LocalLengthDlgLayout->setSpacing( 6 );
|
||||||
|
StdMeshersGUI_LocalLengthDlgLayout->setMargin( 11 );
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
iconLabel = new QLabel( this );
|
||||||
|
iconLabel->setPixmap( image0 );
|
||||||
|
iconLabel->setScaledContents( false );
|
||||||
|
iconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
|
||||||
|
typeLabel = new QLabel( this );
|
||||||
|
typeLabel->setText( tr( "SMESH_LOCAL_LENGTH_HYPOTHESIS" ) );
|
||||||
|
StdMeshersGUI_LocalLengthDlgLayout->addWidget( iconLabel, 0, 0 );
|
||||||
|
StdMeshersGUI_LocalLengthDlgLayout->addWidget( typeLabel, 0, 1 );
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
GroupC1 = new QGroupBox( this, "GroupC1" );
|
||||||
|
GroupC1->setTitle( tr( "SMESH_ARGUMENTS" ) );
|
||||||
|
GroupC1->setColumnLayout(0, Qt::Vertical );
|
||||||
|
GroupC1->layout()->setSpacing( 0 );
|
||||||
|
GroupC1->layout()->setMargin( 0 );
|
||||||
|
QGridLayout* GroupC1Layout = new QGridLayout( GroupC1->layout() );
|
||||||
|
GroupC1Layout->setAlignment( Qt::AlignTop );
|
||||||
|
GroupC1Layout->setSpacing( 6 );
|
||||||
|
GroupC1Layout->setMargin( 11 );
|
||||||
|
|
||||||
|
TextLabel_NameHypothesis = new QLabel( GroupC1, "TextLabel_NameHypothesis" );
|
||||||
|
TextLabel_NameHypothesis->setText( tr( "SMESH_NAME" ) );
|
||||||
|
GroupC1Layout->addWidget( TextLabel_NameHypothesis, 0, 0 );
|
||||||
|
|
||||||
|
LineEdit_NameHypothesis = new QLineEdit( GroupC1, "LineEdit_NameHypothesis" );
|
||||||
|
GroupC1Layout->addWidget( LineEdit_NameHypothesis, 0, 1 );
|
||||||
|
|
||||||
|
TextLabel_Length = new QLabel(GroupC1 , "TextLabel_Length" );
|
||||||
|
TextLabel_Length->setText( tr( "SMESH_LENGTH" ) );
|
||||||
|
GroupC1Layout->addWidget( TextLabel_Length, 1, 0 );
|
||||||
|
|
||||||
|
SpinBox_Length = new SMESHGUI_SpinBox( GroupC1, "SpinBox_Length" );
|
||||||
|
GroupC1Layout->addWidget( SpinBox_Length, 1, 1 );
|
||||||
|
|
||||||
|
StdMeshersGUI_LocalLengthDlgLayout->addMultiCellWidget(GroupC1 , 1, 1, 0, 1 );
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
GroupButtons = new QGroupBox( this, "GroupButtons" );
|
||||||
|
GroupButtons->setColumnLayout(0, Qt::Vertical );
|
||||||
|
GroupButtons->layout()->setSpacing( 0 );
|
||||||
|
GroupButtons->layout()->setMargin( 0 );
|
||||||
|
QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
|
||||||
|
GroupButtonsLayout->setAlignment( Qt::AlignTop );
|
||||||
|
GroupButtonsLayout->setSpacing( 6 );
|
||||||
|
GroupButtonsLayout->setMargin( 11 );
|
||||||
|
buttonOk = new QPushButton( GroupButtons, "buttonOk" );
|
||||||
|
buttonOk->setText( tr( "SMESH_BUT_OK" ) );
|
||||||
|
buttonOk->setAutoDefault( TRUE );
|
||||||
|
buttonOk->setDefault( TRUE );
|
||||||
|
GroupButtonsLayout->addWidget( buttonOk, 0, 0 );
|
||||||
|
buttonApply = new QPushButton( GroupButtons, "buttonApply" );
|
||||||
|
buttonApply->setText( tr( "SMESH_BUT_APPLY" ) );
|
||||||
|
buttonApply->setAutoDefault( TRUE );
|
||||||
|
GroupButtonsLayout->addWidget( buttonApply, 0, 1 );
|
||||||
|
QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
|
||||||
|
GroupButtonsLayout->addItem( spacer, 0, 2 );
|
||||||
|
buttonCancel = new QPushButton( GroupButtons, "buttonCancel" );
|
||||||
|
buttonCancel->setText( tr( "SMESH_BUT_CLOSE" ) );
|
||||||
|
buttonCancel->setAutoDefault( TRUE );
|
||||||
|
GroupButtonsLayout->addWidget( buttonCancel, 0, 3 );
|
||||||
|
StdMeshersGUI_LocalLengthDlgLayout->addMultiCellWidget( GroupButtons, 2, 2, 0, 1 );
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
Init() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ~StdMeshersGUI_LocalLengthDlg()
|
||||||
|
// purpose : Destroys the object and frees any allocated resources
|
||||||
|
//=================================================================================
|
||||||
|
StdMeshersGUI_LocalLengthDlg::~StdMeshersGUI_LocalLengthDlg()
|
||||||
|
{
|
||||||
|
// no need to delete child widgets, Qt does it all for us
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : Init()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::Init()
|
||||||
|
{
|
||||||
|
/* min, max, step and decimals for spin boxes */
|
||||||
|
SpinBox_Length->RangeStepAndValidator( 0.001, 999.999, 1.0, 3 ) ;
|
||||||
|
SpinBox_Length->SetValue( 1.0 ) ;
|
||||||
|
|
||||||
|
mySMESHGUI = SMESHGUI::GetSMESHGUI() ;
|
||||||
|
|
||||||
|
char* sHypType = (char*)myHypType.latin1();
|
||||||
|
HypothesisData* aHypData = mySMESHGUI->GetHypothesisData(sHypType);
|
||||||
|
LineEdit_NameHypothesis->setText( aHypData ? aHypData->Label : "" );
|
||||||
|
|
||||||
|
mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ;
|
||||||
|
|
||||||
|
/* signals and slots connections */
|
||||||
|
connect( buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()) );
|
||||||
|
connect( buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()) ) ;
|
||||||
|
connect( buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()) );
|
||||||
|
|
||||||
|
connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ;
|
||||||
|
connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ;
|
||||||
|
|
||||||
|
/* Move widget on the botton right corner of main widget */
|
||||||
|
int x, y ;
|
||||||
|
mySMESHGUI->DefineDlgPosition( this, x, y ) ;
|
||||||
|
this->move( x, y ) ;
|
||||||
|
this->show() ; /* displays Dialog */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ClickOnOk()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::ClickOnOk()
|
||||||
|
{
|
||||||
|
if ( this->ClickOnApply() )
|
||||||
|
this->ClickOnCancel() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ClickOnApply()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
bool StdMeshersGUI_LocalLengthDlg::ClickOnApply()
|
||||||
|
{
|
||||||
|
QString myHypName = LineEdit_NameHypothesis->text().stripWhiteSpace();
|
||||||
|
if ( myHypName.isEmpty() ) {
|
||||||
|
QAD_MessageBox::warn1( this, tr( "SMESH_WRN_WARNING" ), tr( "SMESH_WRN_EMPTY_NAME" ), tr( "SMESH_BUT_OK" ) );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
double myLength = SpinBox_Length->GetValue();
|
||||||
|
|
||||||
|
QAD_WaitCursor wc;
|
||||||
|
try {
|
||||||
|
SMESH::SMESH_Hypothesis_var Hyp = SMESH::SMESH_Hypothesis::_narrow
|
||||||
|
(mySMESHGUI->CreateHypothesis(myHypType,
|
||||||
|
myHypName,
|
||||||
|
false)); // isAlgorithm
|
||||||
|
StdMeshers::StdMeshers_LocalLength_var LL =
|
||||||
|
StdMeshers::StdMeshers_LocalLength::_narrow(Hyp);
|
||||||
|
if (!LL->_is_nil())
|
||||||
|
LL->SetLength(myLength);
|
||||||
|
}
|
||||||
|
catch (const SALOME::SALOME_Exception& S_ex) {
|
||||||
|
wc.stop();
|
||||||
|
QtCatchCorbaException(S_ex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ClickOnCancel()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::ClickOnCancel()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : DeactivateActiveDialog()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::DeactivateActiveDialog()
|
||||||
|
{
|
||||||
|
iconLabel->setEnabled(false) ;
|
||||||
|
typeLabel->setEnabled(false) ;
|
||||||
|
GroupC1->setEnabled(false) ;
|
||||||
|
GroupButtons->setEnabled(false) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : ActivateThisDialog()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::ActivateThisDialog()
|
||||||
|
{
|
||||||
|
mySMESHGUI->EmitSignalDeactivateDialog() ;
|
||||||
|
iconLabel->setEnabled(true) ;
|
||||||
|
typeLabel->setEnabled(true) ;
|
||||||
|
GroupC1->setEnabled(true) ;
|
||||||
|
GroupButtons->setEnabled(true) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : enterEvent()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::enterEvent(QEvent* e)
|
||||||
|
{
|
||||||
|
ActivateThisDialog() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=================================================================================
|
||||||
|
// function : closeEvent()
|
||||||
|
// purpose :
|
||||||
|
//=================================================================================
|
||||||
|
void StdMeshersGUI_LocalLengthDlg::closeEvent( QCloseEvent* e )
|
||||||
|
{
|
||||||
|
mySMESHGUI->ResetState();
|
||||||
|
QDialog::closeEvent( e );
|
||||||
|
}
|