From 3add66f2196c5b8e04e69d87c9f6a28e9a9a2eb2 Mon Sep 17 00:00:00 2001 From: skl Date: Thu, 27 Aug 2009 07:26:22 +0000 Subject: [PATCH] Integration improvements 0020310 and 0020431. --- .../gui/SMESH/images/hypo_fixedpnt_dlg.png | Bin 0 -> 24062 bytes .../gui/SMESH/images/hypo_radquad_dlg.png | Bin 0 -> 37524 bytes doc/salome/gui/SMESH/images/mesh_fixedpnt.png | Bin 0 -> 14279 bytes .../gui/SMESH/images/mesh_radquad_01.png | Bin 0 -> 20203 bytes .../gui/SMESH/images/mesh_radquad_02.png | Bin 0 -> 12970 bytes .../gui/SMESH/input/1d_meshing_hypo.doc | 33 + .../gui/SMESH/input/basic_meshing_algos.doc | 6 +- .../input/radial_quadrangle_1D2D_algo.doc | 28 + idl/SMESH_BasicHypothesis.idl | 75 ++ resources/StdMeshers.xml | 25 +- src/SMESHGUI/SMESHGUI_Hypotheses.cxx | 2 + src/SMESH_SWIG/smeshDC.py | 137 +++ src/StdMeshers/Makefile.am | 12 +- src/StdMeshers/StdMeshers_FixedPoints1D.cxx | 243 ++++ src/StdMeshers/StdMeshers_FixedPoints1D.hxx | 90 ++ .../StdMeshers_LayerDistribution2D.cxx | 61 + .../StdMeshers_LayerDistribution2D.hxx | 55 + .../StdMeshers_NumberOfLayers2D.cxx | 63 + .../StdMeshers_NumberOfLayers2D.hxx | 54 + src/StdMeshers/StdMeshers_Penta_3D.cxx | 310 ++--- .../StdMeshers_RadialQuadrangle_1D2D.cxx | 1088 +++++++++++++++++ .../StdMeshers_RadialQuadrangle_1D2D.hxx | 69 ++ src/StdMeshers/StdMeshers_Regular_1D.cxx | 112 +- src/StdMeshers/StdMeshers_Regular_1D.hxx | 6 +- src/StdMeshersGUI/Makefile.am | 6 +- .../StdMeshersGUI_FixedPointsParamWdg.cxx | 374 ++++++ .../StdMeshersGUI_FixedPointsParamWdg.h | 93 ++ .../StdMeshersGUI_StdHypothesisCreator.cxx | 199 ++- src/StdMeshersGUI/StdMeshers_images.ts | 4 + src/StdMeshersGUI/StdMeshers_msg_en.ts | 28 +- src/StdMeshers_I/Makefile.am | 10 +- .../StdMeshers_FixedPoints1D_i.cxx | 290 +++++ .../StdMeshers_FixedPoints1D_i.hxx | 87 ++ .../StdMeshers_LayerDistribution2D_i.cxx | 95 ++ .../StdMeshers_LayerDistribution2D_i.hxx | 64 + .../StdMeshers_NumberOfLayers2D_i.cxx | 94 ++ .../StdMeshers_NumberOfLayers2D_i.hxx | 62 + .../StdMeshers_RadialQuadrangle_1D2D_i.cxx | 71 ++ .../StdMeshers_RadialQuadrangle_1D2D_i.hxx | 57 + src/StdMeshers_I/StdMeshers_i.cxx | 12 + 40 files changed, 3784 insertions(+), 231 deletions(-) create mode 100755 doc/salome/gui/SMESH/images/hypo_fixedpnt_dlg.png create mode 100755 doc/salome/gui/SMESH/images/hypo_radquad_dlg.png create mode 100755 doc/salome/gui/SMESH/images/mesh_fixedpnt.png create mode 100755 doc/salome/gui/SMESH/images/mesh_radquad_01.png create mode 100755 doc/salome/gui/SMESH/images/mesh_radquad_02.png create mode 100644 doc/salome/gui/SMESH/input/radial_quadrangle_1D2D_algo.doc create mode 100644 src/StdMeshers/StdMeshers_FixedPoints1D.cxx create mode 100644 src/StdMeshers/StdMeshers_FixedPoints1D.hxx create mode 100644 src/StdMeshers/StdMeshers_LayerDistribution2D.cxx create mode 100644 src/StdMeshers/StdMeshers_LayerDistribution2D.hxx create mode 100644 src/StdMeshers/StdMeshers_NumberOfLayers2D.cxx create mode 100644 src/StdMeshers/StdMeshers_NumberOfLayers2D.hxx create mode 100644 src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx create mode 100644 src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.hxx create mode 100644 src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx create mode 100644 src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h create mode 100644 src/StdMeshers_I/StdMeshers_FixedPoints1D_i.cxx create mode 100644 src/StdMeshers_I/StdMeshers_FixedPoints1D_i.hxx create mode 100644 src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.cxx create mode 100644 src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.hxx create mode 100644 src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.cxx create mode 100644 src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.hxx create mode 100644 src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.cxx create mode 100644 src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.hxx diff --git a/doc/salome/gui/SMESH/images/hypo_fixedpnt_dlg.png b/doc/salome/gui/SMESH/images/hypo_fixedpnt_dlg.png new file mode 100755 index 0000000000000000000000000000000000000000..74276bd96a762e40421c93fa0237e56900ac8526 GIT binary patch literal 24062 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
5#J#Xb$ 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 SQgw_02s~Z=T-G@yGywob?!%4% literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/mesh_fixedpnt.png b/doc/salome/gui/SMESH/images/mesh_fixedpnt.png new file mode 100755 index 0000000000000000000000000000000000000000..5d044ab6388f7f2ffb7cd622778fbc249f56f9dc GIT binary patch literal 14279 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/mesh_radquad_01.png b/doc/salome/gui/SMESH/images/mesh_radquad_01.png new file mode 100755 index 0000000000000000000000000000000000000000..dfd8eb5a7b947a8487ab740ccf8f8b86313c92f7 GIT binary patch literal 20203 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 a4x&G}E4fb8ebfiQpOM~0-70P8nEwylY?W95 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc b/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc index 38c0055df..c61d388a5 100644 --- a/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc +++ b/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc @@ -11,6 +11,7 @@
  • \ref number_of_segments_anchor "Number of segments"
  • \ref start_and_end_length_anchor "Start and end length"
  • \ref automatic_length_anchor "Automatic Length"
  • +
  • \ref fixed_points_1d_anchor "Fixed points 1D"

  • @@ -193,4 +194,36 @@ minimum and maximum value of this parameter. \image html image147.gif "Example of a very rough mesh. Automatic Length works for 0." \image html image148.gif "Example of a very fine mesh. Automatic Length works for 1." + +
    +\anchor fixed_points_1d_anchor +

    Fixed points 1D hypothesis

    + +Fixed points 1D hypothesis allows to split edges into segments +using set of fixed points given by normalized parameters on edge and +set of numbers of segments for splitting each sub-segment between +fixed points. Optionally it is possible to set flag +Same Nb. Segments for all intervals and +only one value for mentioned number of segments. + +The direction of the splitting is defined by the orientation of the +underlying geometrical edge. "Reverse Edges" list box allows to +specify the edges for which the splitting should be made in the +direction opposing to their orientation. This list box is enabled only +if the geometry object is selected for the meshing. In this case the +user can select edges to be reversed either directly picking them in +the 3D viewer or by selecting the edges or groups of edges in the +Object browser. + +Using of this hypothesis for quadrangle face where main mesh is +created using Quadrangle(Mapping) and NumberOfSegments +hypothesises. Creation hypothesis FixedPoint_1D for submesh on +one edge: + +\image html hypo_fixedpnt_dlg.png + +Resulting 2D mesh: + +\image html mesh_fixedpnt.png + */ diff --git a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc index 1fd311d84..7549a121e 100644 --- a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc +++ b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc @@ -25,6 +25,8 @@ shape of a mesh. are split into triangular elements.
  • Quadrangle meshing algorithm (Mapping) - Faces are split into quadrangular elements.
  • +
  • Radial quadrangle 1D2D algorithm - Faces (circles or part of circles) +are split into triangular and quadrangle elements.
  • \image html image123.gif "Example of a triangular 2D mesh" @@ -54,6 +56,8 @@ There is also a number of more specific algorithms:
  • \subpage radial_prism_algo_page "for meshing geometrical objects with cavities"
  • \subpage segments_around_vertex_algo_page "for defining the local size of elements around a certain node"
  • \subpage prism_3d_algo_page "for meshing prismatic shapes"
  • +
  • \subpage radial_quadrangle_1D2D_algo_page "for meshing special 2d +faces (circles and part of circles)"
  • \ref constructing_meshes_page "Constructing meshes" page describes in @@ -62,4 +66,4 @@ detail how to apply meshing algorithms.
    See Also a sample TUI Script of a \ref tui_defining_meshing_algos "Define Meshing Algorithm" operation. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/SMESH/input/radial_quadrangle_1D2D_algo.doc b/doc/salome/gui/SMESH/input/radial_quadrangle_1D2D_algo.doc new file mode 100644 index 000000000..4436e092b --- /dev/null +++ b/doc/salome/gui/SMESH/input/radial_quadrangle_1D2D_algo.doc @@ -0,0 +1,28 @@ +/*! + +\page radial_quadrangle_1D2D_algo_page Radial Quadrangle 1D2D + +\n This algorithm applies to the meshing of a 2D shapes. +Required conditions: Face must be a full circle or part of circle +(i.e. number of edges <= 3 and one of them must be a circle curve). +The resulting mesh consists of triangles (near center point) and +quadrangles. + +This algorithm also requires the information concerning the number and +distribution of mesh layers alond a radius of circle. Distribution of +layers can be set with any of 1D Hypotheses. + +Creation hypothesis: + +\image html hypo_radquad_dlg.png + +Resulting 3D mesh for the cylinder with RadialQuadrangle_1D2D +hypothesis for top and bottom faces: + +\image html mesh_radquad_01.png + +Resulting 2D mesh for the part of circle: + +\image html mesh_radquad_02.png + +*/ diff --git a/idl/SMESH_BasicHypothesis.idl b/idl/SMESH_BasicHypothesis.idl index 37db80292..59b3a8a2c 100644 --- a/idl/SMESH_BasicHypothesis.idl +++ b/idl/SMESH_BasicHypothesis.idl @@ -385,6 +385,54 @@ module StdMeshers }; + /*! + * StdMeshers_FixedPoints1D: interface of "Fixed points 1D" hypothesis + */ + interface StdMeshers_FixedPoints1D : SMESH::SMESH_Hypothesis + { + /*! + * Sets some points on edge using parameter on curve from 0 to 1 + * (additionally it is neecessary to check orientation of edges and + * create list of reversed edges if it is needed) and sets numbers + * of segments between given points (default values are equals 1) + */ + void SetPoints(in SMESH::double_array listParams) + raises (SALOME::SALOME_Exception); + void SetNbSegments(in SMESH::long_array listNbSeg) + raises (SALOME::SALOME_Exception); + + /*! + * Returns list of point's parameters + */ + SMESH::double_array GetPoints(); + + /*! + * Returns list of numbers of segments + */ + SMESH::long_array GetNbSegments(); + + /*! + * Set list of edges to reverse + */ + void SetReversedEdges( in SMESH::long_array list ); + + /*! + * Returns list of edges to reverse + */ + SMESH::long_array GetReversedEdges(); + + /*! + * Set entry of the main object + */ + void SetObjectEntry( in string entry ); + + /*! + * Get the entry of the main object + */ + string GetObjectEntry(); + }; + + /*! * StdMeshers_MaxElementVolume: interface of "Max. Hexahedron or Tetrahedron Volume" hypothesis */ @@ -498,6 +546,26 @@ module StdMeshers }; + /*! + * StdMeshers_NumberOfLayers2D: interface of "Nb. Layers" hypothesis. + * This hypothesis is used by "Radial quadrangle" algorithm. + * It specifies number of segments between the internal + * and the external surfaces. + */ + interface StdMeshers_NumberOfLayers2D : StdMeshers_NumberOfLayers + { + }; + + /*! + * StdMeshers_LayerDistribution2D: interface of "Distribution of Layers" hypothesis. + * This hypothesis is used by "Radial quadrangle" algorithm. + * It specifies 1D hypothesis defining distribution of segments between the internal + * and the external surfaces. + */ + interface StdMeshers_LayerDistribution2D : StdMeshers_LayerDistribution + { + }; + /*! * interface of "ProjectionSource1D" hypothesis. * This hypothesis specifies a meshed edge to take a mesh pattern from @@ -800,6 +868,13 @@ module StdMeshers { }; + /*! + * StdMeshers_RadialQuadrangle_1D2D: interface of "Radial quadrangle" algorithm + */ + interface StdMeshers_RadialQuadrangle_1D2D : SMESH::SMESH_2D_Algo + { + }; + }; #endif diff --git a/resources/StdMeshers.xml b/resources/StdMeshers.xml index ce7f248f1..d6083f4b0 100644 --- a/resources/StdMeshers.xml +++ b/resources/StdMeshers.xml @@ -54,6 +54,11 @@ icon-id="mesh_hypo_length.png" dim="1"/> + + + + + + + + diff --git a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx index 487f8c975..bc0002d3e 100644 --- a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx +++ b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx @@ -505,6 +505,8 @@ QString SMESHGUI_GenericHypothesisCreator::helpPage() const aHelpFileName = "a1d_meshing_hypo_page.html#max_length_anchor"; else if ( aHypType == "Arithmetic1D") aHelpFileName = "a1d_meshing_hypo_page.html#arithmetic_1d_anchor"; + else if ( aHypType == "FixedPointsc1D") + aHelpFileName = "a1d_meshing_hypo_page.html#fixed_points_1d_anchor"; else if ( aHypType == "MaxElementArea") aHelpFileName = "a2d_meshing_hypo_page.html#max_element_area_anchor"; else if ( aHypType == "MaxElementVolume") diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index 05bbe9d05..689e76f49 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -3741,6 +3741,45 @@ class Mesh_Segment(Mesh_Algorithm): return True return False + + ## Defines "FixedPoints1D" hypothesis to cut an edge using parameter + # on curve from 0 to 1 (additionally it is neecessary to check + # orientation of edges and create list of reversed edges if it is + # needed) and sets numbers of segments between given points (default + # values are equals 1 + # @param points defines the list of parameters on curve + # @param nbSegs defines the list of numbers of segments + # @param reversedEdges is a list of edges to mesh using reversed orientation + # @param UseExisting if ==true - searches for an existing hypothesis created with + # the same parameters, else (default) - creates a new one + # @return an instance of StdMeshers_Arithmetic1D hypothesis + # @ingroup l3_hypos_1dhyps + def FixedPoints1D(self, points, nbSegs=[1], reversedEdges=[], UseExisting=0): + if not isinstance(reversedEdges,list): #old version script, before adding reversedEdges + reversedEdges, UseExisting = [], reversedEdges + entry = self.MainShapeEntry() + hyp = self.Hypothesis("FixedPoints1D", [points, nbSegs, reversedEdges, entry], + UseExisting=UseExisting, + CompareMethod=self.CompareArithmetic1D) + hyp.SetPoints(points) + hyp.SetNbSegments(nbSegs) + hyp.SetReversedEdges(reversedEdges) + hyp.SetObjectEntry(entry) + return hyp + + ## Private method + ## Check if the given "FixedPoints1D" hypothesis has the same parameters + ## as the given arguments + def CompareFixedPoints1D(self, hyp, args): + if hyp.GetPoints() == args[0]: + if hyp.GetNbSegments() == args[1]: + if hyp.GetReversedEdges() == args[2]: + if not args[2] or hyp.GetObjectEntry() == args[3]: + return True + return False + + + ## Defines "StartEndLength" hypothesis to cut an edge in several segments with increasing geometric length # @param start defines the length of the first segment # @param end defines the length of the last segment @@ -4804,6 +4843,104 @@ class Mesh_RadialPrism3D(Mesh_Algorithm): hyp.SetFineness( fineness ) return hyp +# Public class: Mesh_RadialQuadrangle1D2D +# ------------------------------- + +## Defines a Radial Quadrangle 1D2D algorithm +# @ingroup l2_algos_radialq +# +class Mesh_RadialQuadrangle1D2D(Mesh_Algorithm): + + ## Private constructor. + def __init__(self, mesh, geom=0): + Mesh_Algorithm.__init__(self) + self.Create(mesh, geom, "RadialQuadrangle_1D2D") + + self.distribHyp = self.Hypothesis("LayerDistribution2D", UseExisting=0) + self.nbLayers = None + + ## Return 2D hypothesis holding the 1D one + def Get2DHypothesis(self): + return self.distribHyp + + ## Private method creating a 1D hypothesis and storing it in the LayerDistribution + # hypothesis. Returns the created hypothesis + def OwnHypothesis(self, hypType, args=[], so="libStdMeshersEngine.so"): + #print "OwnHypothesis",hypType + if not self.nbLayers is None: + self.mesh.GetMesh().RemoveHypothesis( self.geom, self.nbLayers ) + self.mesh.GetMesh().AddHypothesis( self.geom, self.distribHyp ) + study = self.mesh.smeshpyD.GetCurrentStudy() # prevents publishing own 1D hypothesis + hyp = self.mesh.smeshpyD.CreateHypothesis(hypType, so) + self.mesh.smeshpyD.SetCurrentStudy( study ) # enables publishing + self.distribHyp.SetLayerDistribution( hyp ) + return hyp + + ## Defines "NumberOfLayers2D" hypothesis, specifying the number of layers + # @param n number of layers + # @param UseExisting if ==true - searches for the existing hypothesis created with + # the same parameters, else (default) - creates a new one + def NumberOfLayers2D(self, n, UseExisting=0): + self.mesh.GetMesh().RemoveHypothesis( self.geom, self.distribHyp ) + self.nbLayers = self.Hypothesis("NumberOfLayers2D", [n], UseExisting=UseExisting, + CompareMethod=self.CompareNumberOfLayers) + self.nbLayers.SetNumberOfLayers( n ) + return self.nbLayers + + ## Checks if the given "NumberOfLayers" hypothesis has the same parameters as the given arguments + def CompareNumberOfLayers(self, hyp, args): + return IsEqual(hyp.GetNumberOfLayers(), args[0]) + + ## Defines "LocalLength" hypothesis, specifying the segment length + # @param l the length of segments + # @param p the precision of rounding + def LocalLength(self, l, p=1e-07): + hyp = self.OwnHypothesis("LocalLength", [l,p]) + hyp.SetLength(l) + hyp.SetPrecision(p) + return hyp + + ## Defines "NumberOfSegments" hypothesis, specifying the number of layers + # @param n the number of layers + # @param s the scale factor (optional) + def NumberOfSegments(self, n, s=[]): + if s == []: + hyp = self.OwnHypothesis("NumberOfSegments", [n]) + else: + hyp = self.OwnHypothesis("NumberOfSegments", [n,s]) + hyp.SetDistrType( 1 ) + hyp.SetScaleFactor(s) + hyp.SetNumberOfSegments(n) + return hyp + + ## Defines "Arithmetic1D" hypothesis, specifying the distribution of segments + # with a length that changes in arithmetic progression + # @param start the length of the first segment + # @param end the length of the last segment + def Arithmetic1D(self, start, end ): + hyp = self.OwnHypothesis("Arithmetic1D", [start, end]) + hyp.SetLength(start, 1) + hyp.SetLength(end , 0) + return hyp + + ## Defines "StartEndLength" hypothesis, specifying distribution of segments + # as geometric length increasing + # @param start for the length of the first segment + # @param end for the length of the last segment + def StartEndLength(self, start, end): + hyp = self.OwnHypothesis("StartEndLength", [start, end]) + hyp.SetLength(start, 1) + hyp.SetLength(end , 0) + return hyp + + ## Defines "AutomaticLength" hypothesis, specifying the number of segments + # @param fineness defines the quality of the mesh within the range [0-1] + def AutomaticLength(self, fineness=0): + hyp = self.OwnHypothesis("AutomaticLength") + hyp.SetFineness( fineness ) + return hyp + + # Private class: Mesh_UseExisting # ------------------------------- class Mesh_UseExisting(Mesh_Algorithm): diff --git a/src/StdMeshers/Makefile.am b/src/StdMeshers/Makefile.am index c0e9c5374..c10d17e66 100644 --- a/src/StdMeshers/Makefile.am +++ b/src/StdMeshers/Makefile.am @@ -32,6 +32,7 @@ salomeinclude_HEADERS = \ StdMeshers_LocalLength.hxx \ StdMeshers_StartEndLength.hxx \ StdMeshers_Arithmetic1D.hxx \ + StdMeshers_FixedPoints1D.hxx \ StdMeshers_NumberOfSegments.hxx \ StdMeshers_Deflection1D.hxx \ StdMeshers_Propagation.hxx \ @@ -49,6 +50,7 @@ salomeinclude_HEADERS = \ StdMeshers_QuadranglePreference.hxx \ StdMeshers_QuadraticMesh.hxx \ StdMeshers_NumberOfLayers.hxx \ + StdMeshers_NumberOfLayers2D.hxx \ StdMeshers_Prism_3D.hxx \ StdMeshers_ProjectionSource1D.hxx \ StdMeshers_ProjectionSource2D.hxx \ @@ -59,6 +61,7 @@ salomeinclude_HEADERS = \ StdMeshers_RadialPrism_3D.hxx \ StdMeshers_ProjectionUtils.hxx \ StdMeshers_LayerDistribution.hxx \ + StdMeshers_LayerDistribution2D.hxx \ StdMeshers_SegmentAroundVertex_0D.hxx \ StdMeshers_SegmentLengthAroundVertex.hxx \ StdMeshers_FaceSide.hxx \ @@ -69,7 +72,8 @@ salomeinclude_HEADERS = \ StdMeshers_TrianglePreference.hxx \ StdMeshers_CompositeHexa_3D.hxx \ StdMeshers_MaxLength.hxx \ - StdMeshers_QuadrangleParams.hxx + StdMeshers_QuadrangleParams.hxx \ + StdMeshers_RadialQuadrangle_1D2D.hxx # Libraries targets @@ -79,6 +83,7 @@ dist_libStdMeshers_la_SOURCES = \ StdMeshers_LocalLength.cxx \ StdMeshers_StartEndLength.cxx \ StdMeshers_Arithmetic1D.cxx \ + StdMeshers_FixedPoints1D.cxx \ StdMeshers_NumberOfSegments.cxx \ StdMeshers_Deflection1D.cxx \ StdMeshers_Propagation.cxx \ @@ -96,6 +101,7 @@ dist_libStdMeshers_la_SOURCES = \ StdMeshers_QuadranglePreference.cxx \ StdMeshers_QuadraticMesh.cxx \ StdMeshers_NumberOfLayers.cxx \ + StdMeshers_NumberOfLayers2D.cxx \ StdMeshers_Prism_3D.cxx \ StdMeshers_ProjectionSource1D.cxx \ StdMeshers_ProjectionSource2D.cxx \ @@ -106,6 +112,7 @@ dist_libStdMeshers_la_SOURCES = \ StdMeshers_RadialPrism_3D.cxx \ StdMeshers_ProjectionUtils.cxx \ StdMeshers_LayerDistribution.cxx \ + StdMeshers_LayerDistribution2D.cxx \ StdMeshers_SegmentAroundVertex_0D.cxx \ StdMeshers_SegmentLengthAroundVertex.cxx \ StdMeshers_FaceSide.cxx \ @@ -115,7 +122,8 @@ dist_libStdMeshers_la_SOURCES = \ StdMeshers_TrianglePreference.cxx \ StdMeshers_CompositeHexa_3D.cxx \ StdMeshers_MaxLength.cxx \ - StdMeshers_QuadrangleParams.cxx + StdMeshers_QuadrangleParams.cxx \ + StdMeshers_RadialQuadrangle_1D2D.cxx # additionnal information to compil and link file diff --git a/src/StdMeshers/StdMeshers_FixedPoints1D.cxx b/src/StdMeshers/StdMeshers_FixedPoints1D.cxx new file mode 100644 index 000000000..cd163c09b --- /dev/null +++ b/src/StdMeshers/StdMeshers_FixedPoints1D.cxx @@ -0,0 +1,243 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : implementaion of SMESH idl descriptions +// File : StdMeshers_FixedPoints1D.cxx +// Author : Damien COQUERET, OCC +// Module : SMESH +// +#include "StdMeshers_FixedPoints1D.hxx" + +#include "SMESH_Algo.hxx" +#include "SMESH_Mesh.hxx" + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +using namespace std; + +//============================================================================= +/*! + * + */ +//============================================================================= + +StdMeshers_FixedPoints1D::StdMeshers_FixedPoints1D(int hypId, int studyId, + SMESH_Gen * gen) + :SMESH_Hypothesis(hypId, studyId, gen) +{ + _name = "FixedPoints1D"; + _param_algo_dim = 1; + _nbsegs.reserve( 1 ); + _nbsegs.push_back( 1 ); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +StdMeshers_FixedPoints1D::~StdMeshers_FixedPoints1D() +{ +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void StdMeshers_FixedPoints1D::SetPoints(std::vector& listParams) + throw(SALOME_Exception) +{ + _params = listParams; + NotifySubMeshesHypothesisModification(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void StdMeshers_FixedPoints1D::SetNbSegments(std::vector& listNbSeg) + throw(SALOME_Exception) +{ + _nbsegs = listNbSeg; + NotifySubMeshesHypothesisModification(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void StdMeshers_FixedPoints1D::SetReversedEdges( std::vector& ids ) +{ + if ( ids != _edgeIDs ) { + _edgeIDs = ids; + + NotifySubMeshesHypothesisModification(); + } +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +ostream & StdMeshers_FixedPoints1D::SaveTo(ostream & save) +{ + int listSize = _params.size(); + save << listSize; + if ( listSize > 0 ) { + for ( int i = 0; i < listSize; i++) save << " " << _params[i]; + } + + listSize = _nbsegs.size(); + save << listSize; + if ( listSize > 0 ) { + for ( int i = 0; i < listSize; i++) save << " " << _nbsegs[i]; + } + + listSize = _edgeIDs.size(); + save << listSize; + if ( listSize > 0 ) { + for ( int i = 0; i < listSize; i++) + save << " " << _edgeIDs[i]; + } + + save << " " << _objEntry; + + return save; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +istream & StdMeshers_FixedPoints1D::LoadFrom(istream & load) +{ + bool isOK = true; + int intVal; + double dblVal; + + isOK = (load >> intVal); + if (isOK && intVal > 0) { + _params.reserve( intVal ); + for (int i = 0; i < _params.capacity() && isOK; i++) { + isOK = (load >> dblVal); + if ( isOK ) _params.push_back( dblVal ); + } + } + + isOK = (load >> intVal); + if (isOK && intVal > 0) { + _nbsegs.reserve( intVal ); + for (int i = 0; i < _nbsegs.capacity() && isOK; i++) { + isOK = (load >> intVal); + if ( isOK ) _nbsegs.push_back( intVal ); + } + } + + isOK = (load >> intVal); + if (isOK && intVal > 0) { + _edgeIDs.reserve( intVal ); + for (int i = 0; i < _edgeIDs.capacity() && isOK; i++) { + isOK = (load >> intVal); + if ( isOK ) _edgeIDs.push_back( intVal ); + } + } + + isOK = (load >> _objEntry); + + return load; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +ostream & operator <<(ostream & save, StdMeshers_FixedPoints1D & hyp) +{ + return hyp.SaveTo( save ); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +istream & operator >>(istream & load, StdMeshers_FixedPoints1D & hyp) +{ + return hyp.LoadFrom( load ); +} + +//================================================================================ +/*! + * \brief Initialize start and end length by the mesh built on the geometry + * \param theMesh - the built mesh + * \param theShape - the geometry of interest + * \retval bool - true if parameter values have been successfully defined + */ +//================================================================================ + +bool StdMeshers_FixedPoints1D::SetParametersByMesh(const SMESH_Mesh* theMesh, + const TopoDS_Shape& theShape) +{ + if ( !theMesh || theShape.IsNull() ) + return false; + + _nbsegs.reserve( 1 ); + _nbsegs.push_back( 1 ); + return true; +} + +//================================================================================ +/*! + * \brief Initialize my parameter values by default parameters. + * \retval bool - true if parameter values have been successfully defined + */ +//================================================================================ + +bool StdMeshers_FixedPoints1D::SetParametersByDefaults(const TDefaults& dflts, + const SMESH_Mesh* /*mesh*/) +{ + _nbsegs.reserve( 1 ); + _nbsegs.push_back( 1 ); + return true; +} + diff --git a/src/StdMeshers/StdMeshers_FixedPoints1D.hxx b/src/StdMeshers/StdMeshers_FixedPoints1D.hxx new file mode 100644 index 000000000..b5126e1c3 --- /dev/null +++ b/src/StdMeshers/StdMeshers_FixedPoints1D.hxx @@ -0,0 +1,90 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : implementaion of SMESH idl descriptions +// File : StdMeshers_FixedPoints1D.hxx +// Author : Damien COQUERET, OCC +// Module : SMESH +// +#ifndef _SMESH_FIXEDPOINTS1D_HXX_ +#define _SMESH_FIXEDPOINTS1D_HXX_ + + + +#include "SMESH_StdMeshers.hxx" + +#include "SMESH_Hypothesis.hxx" +#include "Utils_SALOME_Exception.hxx" + +#include + +class STDMESHERS_EXPORT StdMeshers_FixedPoints1D: + public SMESH_Hypothesis +{ +public: + StdMeshers_FixedPoints1D(int hypId, int studyId, SMESH_Gen* gen); + virtual ~StdMeshers_FixedPoints1D(); + + void SetPoints(std::vector& listParams) + throw(SALOME_Exception); + + void SetNbSegments(std::vector& listNbSeg) + throw(SALOME_Exception); + + const std::vector& GetPoints() const { return _params; } + + const std::vector& GetNbSegments() const { return _nbsegs; } + + void SetReversedEdges( std::vector& ids); + + void SetObjectEntry( const char* entry ) { _objEntry = entry; } + + const char* GetObjectEntry() { return _objEntry.c_str(); } + + const std::vector& GetReversedEdges() const { return _edgeIDs; } + + virtual std::ostream & SaveTo(std::ostream & save); + virtual std::istream & LoadFrom(std::istream & load); + friend std::ostream& operator << (std::ostream & save, StdMeshers_FixedPoints1D & hyp); + friend std::istream& operator >> (std::istream & load, StdMeshers_FixedPoints1D & hyp); + + /*! + * \brief Initialize start and end length by the mesh built on the geometry + * \param theMesh - the built mesh + * \param theShape - the geometry of interest + * \retval bool - true if parameter values have been successfully defined + */ + virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape); + + /*! + * \brief Initialize my parameter values by default parameters. + * \retval bool - true if parameter values have been successfully defined + */ + virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0); + +protected: + std::vector _params; + std::vector _nbsegs; + std::vector _edgeIDs; + std::string _objEntry; +}; + +#endif diff --git a/src/StdMeshers/StdMeshers_LayerDistribution2D.cxx b/src/StdMeshers/StdMeshers_LayerDistribution2D.cxx new file mode 100644 index 000000000..23d039bee --- /dev/null +++ b/src/StdMeshers/StdMeshers_LayerDistribution2D.cxx @@ -0,0 +1,61 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : idl implementation based on 'SMESH' unit's classes +// File : StdMeshers_LayerDistribution2D.cxx +// Author : Edward AGAPOV +// Module : SMESH +// +#include "StdMeshers_LayerDistribution2D.hxx" + +#include "utilities.h" + + +//============================================================================= +/*! + * StdMeshers_LayerDistribution2D::StdMeshers_LayerDistribution2D + * + * Constructor + */ +//============================================================================= + +StdMeshers_LayerDistribution2D::StdMeshers_LayerDistribution2D(int hypId, + int studyId, + SMESH_Gen * gen) + : StdMeshers_LayerDistribution(hypId, studyId, gen) +{ + _name = "LayerDistribution2D"; // used by RadialQuadrangle_1D2D + _param_algo_dim = 2; // 2D + myHyp = 0; +} + +//============================================================================= +/*! + * StdMeshers_LayerDistribution2D::~StdMeshers_LayerDistribution2D + * + * Destructor + */ +//============================================================================= + +StdMeshers_LayerDistribution2D::~StdMeshers_LayerDistribution2D() +{ + MESSAGE( "StdMeshers_LayerDistribution2D::~StdMeshers_LayerDistribution2D" ); +} diff --git a/src/StdMeshers/StdMeshers_LayerDistribution2D.hxx b/src/StdMeshers/StdMeshers_LayerDistribution2D.hxx new file mode 100644 index 000000000..d06b6ead2 --- /dev/null +++ b/src/StdMeshers/StdMeshers_LayerDistribution2D.hxx @@ -0,0 +1,55 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_LayerDistribution2D.hxx +// Author : Edward AGAPOV +// Module : SMESH +// +#ifndef _SMESH_LayerDistribution2D_HXX_ +#define _SMESH_LayerDistribution2D_HXX_ + +#include "StdMeshers_LayerDistribution.hxx" + + +// ========================================================= +// ========================================================= +/*! + * This hypothesis is used by "Radial quadrangle" algorithm. + * It specifies 1D hypothesis defining distribution of segments + * between the internal and the external surfaces. + */ +// ========================================================= +// ========================================================= + +class STDMESHERS_EXPORT StdMeshers_LayerDistribution2D + :public StdMeshers_LayerDistribution +{ +public: + // Constructor + StdMeshers_LayerDistribution2D(int hypId, int studyId, SMESH_Gen* gen); + // Destructor + virtual ~StdMeshers_LayerDistribution2D(); + +}; + +#endif + diff --git a/src/StdMeshers/StdMeshers_NumberOfLayers2D.cxx b/src/StdMeshers/StdMeshers_NumberOfLayers2D.cxx new file mode 100644 index 000000000..af2f04dab --- /dev/null +++ b/src/StdMeshers/StdMeshers_NumberOfLayers2D.cxx @@ -0,0 +1,63 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : idl implementation based on 'SMESH' unit's classes +// File : StdMeshers_NumberOfLayers2D.cxx +// Author : Edward AGAPOV +// Module : SMESH +// + +#include "StdMeshers_NumberOfLayers2D.hxx" + +#include "utilities.h" + + +//============================================================================= +/*! + * StdMeshers_NumberOfLayers2D::StdMeshers_NumberOfLayers2D + * + * Constructor + */ +//============================================================================= + +StdMeshers_NumberOfLayers2D::StdMeshers_NumberOfLayers2D(int hypId, + int studyId, + SMESH_Gen * gen) + : StdMeshers_NumberOfLayers(hypId, studyId, gen) +{ + _name = "NumberOfLayers2D"; // used by RadialQuadrangle_1D2D + _param_algo_dim = 2; // 2D + _nbLayers = 1; +} + +//============================================================================= +/*! + * StdMeshers_NumberOfLayers2D::~StdMeshers_NumberOfLayers2D + * + * Destructor + */ +//============================================================================= + +StdMeshers_NumberOfLayers2D::~StdMeshers_NumberOfLayers2D() +{ + MESSAGE( "StdMeshers_NumberOfLayers2D::~StdMeshers_NumberOfLayers2D" ); +} + diff --git a/src/StdMeshers/StdMeshers_NumberOfLayers2D.hxx b/src/StdMeshers/StdMeshers_NumberOfLayers2D.hxx new file mode 100644 index 000000000..42690f0e5 --- /dev/null +++ b/src/StdMeshers/StdMeshers_NumberOfLayers2D.hxx @@ -0,0 +1,54 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_NumberOfLayers2D.hxx +// Author : Edward AGAPOV +// Module : SMESH +// +#ifndef _SMESH_NumberOfLayers2D_HXX_ +#define _SMESH_NumberOfLayers2D_HXX_ + +#include "StdMeshers_NumberOfLayers.hxx" + + +// ========================================================= +// ========================================================= +/*! + * This hypothesis is used by "Radial quadrangle" algorithm. + * It specifies number of segments between the internal + * and the external surfaces. + */ +// ========================================================= +// ========================================================= + +class STDMESHERS_EXPORT StdMeshers_NumberOfLayers2D + : public StdMeshers_NumberOfLayers +{ +public: + // Constructor + StdMeshers_NumberOfLayers2D(int hypId, int studyId, SMESH_Gen* gen); + // Destructor + virtual ~StdMeshers_NumberOfLayers2D(); +}; + +#endif + diff --git a/src/StdMeshers/StdMeshers_Penta_3D.cxx b/src/StdMeshers/StdMeshers_Penta_3D.cxx index e17b5f22b..06d801333 100644 --- a/src/StdMeshers/StdMeshers_Penta_3D.cxx +++ b/src/StdMeshers/StdMeshers_Penta_3D.cxx @@ -91,7 +91,7 @@ StdMeshers_Penta_3D::~StdMeshers_Penta_3D() //purpose : //======================================================================= bool StdMeshers_Penta_3D::Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape) + const TopoDS_Shape& aShape) { MESSAGE("StdMeshers_Penta_3D::Compute()"); // @@ -424,7 +424,7 @@ void StdMeshers_Penta_3D::MakeNodes() ShapeSupportID(bIsUpperLayer, aBNSSID, aSSID); if (!myErrorStatus->IsOK()) { MESSAGE("StdMeshers_Penta_3D::MakeNodes() "); - return; + return; } // aTN.SetShapeSupportID(aSSID); @@ -432,13 +432,13 @@ void StdMeshers_Penta_3D::MakeNodes() aTN.SetBaseNodeID(iBNID); // if (aSSID!=SMESH_Block::ID_NONE){ - // try to find the node - const TopoDS_Shape& aS=myBlock.Shape((int)aSSID); - FindNodeOnShape(aS, aCoords, i, aTN); + // try to find the node + const TopoDS_Shape& aS=myBlock.Shape((int)aSSID); + FindNodeOnShape(aS, aCoords, i, aTN); } else{ - // create node and get it id - CreateNode (bIsUpperLayer, aCoords, aTN); + // create node and get it id + CreateNode (bIsUpperLayer, aCoords, aTN); // if ( bIsUpperLayer ) { const SMDS_MeshNode* n = aTN.Node(); @@ -471,7 +471,7 @@ void StdMeshers_Penta_3D::MakeNodes() } if (!myErrorStatus->IsOK()) { MESSAGE("StdMeshers_Penta_3D::MakeNodes() "); - return; + return; } // myTNodes[ij]=aTN; @@ -485,20 +485,20 @@ void StdMeshers_Penta_3D::MakeNodes() for (i=0; iGetID(); - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - printf("*** j:%d BNID#%d iSSID:%d ID:%d { %lf %lf %lf }, { %lf %lf %lf }\n", - j, iBNID, iSSID, aID, aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aX, aY, aZ); + ij=i*myJSize+j; + const StdMeshers_TNode& aTN=myTNodes[ij]; + //const StdMeshers_TNode& aTN=aTNodes[ij]; + const gp_XYZ& aXYZ=aTN.NormCoord(); + iSSID=aTN.ShapeSupportID(); + iBNID=aTN.BaseNodeID(); + // + const SMDS_MeshNode* aNode=aTN.Node(); + aID=aNode->GetID(); + aX=aNode->X(); + aY=aNode->Y(); + aZ=aNode->Z(); + printf("*** j:%d BNID#%d iSSID:%d ID:%d { %lf %lf %lf }, { %lf %lf %lf }\n", + j, iBNID, iSSID, aID, aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aX, aY, aZ); } } } @@ -513,9 +513,9 @@ void StdMeshers_Penta_3D::MakeNodes() //======================================================================= void StdMeshers_Penta_3D::FindNodeOnShape(const TopoDS_Shape& aS, - const gp_XYZ& aParams, + const gp_XYZ& aParams, const int z, - StdMeshers_TNode& aTN) + StdMeshers_TNode& aTN) { double aX, aY, aZ, aD, aTol2, minD; gp_Pnt aP1, aP2; @@ -675,8 +675,8 @@ void StdMeshers_Penta_3D::MakeVolumeMesh() const StdMeshers_TNode& aTN = myTNodes[ij]; aSSID=aTN.ShapeSupportID(); if (aSSID==SMESH_Block::ID_NONE) { - SMDS_MeshNode* aNode = (SMDS_MeshNode*)aTN.Node(); - meshDS->SetNodeInVolume(aNode, shapeID); + SMDS_MeshNode* aNode = (SMDS_MeshNode*)aTN.Node(); + meshDS->SetNodeInVolume(aNode, shapeID); } } } @@ -714,7 +714,7 @@ void StdMeshers_Penta_3D::MakeVolumeMesh() aJ[k] = GetIndexOnLayer(aID0); if (!myErrorStatus->IsOK()) { MESSAGE("StdMeshers_Penta_3D::MakeVolumeMesh"); - return; + return; } // ++k; @@ -725,15 +725,15 @@ void StdMeshers_Penta_3D::MakeVolumeMesh() i1=i; i2=i+1; for(j=0; jIsOK()) { MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() "); - return; + return; } // ij = aLevel*myJSize + aJ; @@ -939,8 +939,8 @@ void StdMeshers_Penta_3D::MakeConnectingMap() //purpose : //======================================================================= void StdMeshers_Penta_3D::CreateNode(const bool bIsUpperLayer, - const gp_XYZ& aParams, - StdMeshers_TNode& aTN) + const gp_XYZ& aParams, + StdMeshers_TNode& aTN) { double aX, aY, aZ; // @@ -996,8 +996,8 @@ void StdMeshers_Penta_3D::CreateNode(const bool bIsUpperLayer, //purpose : //======================================================================= void StdMeshers_Penta_3D::ShapeSupportID(const bool bIsUpperLayer, - const SMESH_Block::TShapeID aBNSSID, - SMESH_Block::TShapeID& aSSID) + const SMESH_Block::TShapeID aBNSSID, + SMESH_Block::TShapeID& aSSID) { switch (aBNSSID) { case SMESH_Block::ID_V000: @@ -1068,25 +1068,25 @@ void StdMeshers_Penta_3D::MakeBlock() const SMDS_MeshElement * pElement = itf->next(); aElementType = pElement->GetType(); if (aElementType==SMDSAbs_Face) { - iNbNodes = pElement->NbNodes(); - if ( iNbNodes==3 || (pElement->IsQuadratic() && iNbNodes==6) ) { - aFTr = aF; - ++iCnt; - if (iCnt>1) { - // \begin{E.A.} - // The current algorithm fails if there is more that one - // face wich contains triangles ... - // In that case, replace return by break to try another - // method (coded in "if (iCnt != 1) { ... }") - // + iNbNodes = pElement->NbNodes(); + if ( iNbNodes==3 || (pElement->IsQuadratic() && iNbNodes==6) ) { + aFTr = aF; + ++iCnt; + if (iCnt>1) { + // \begin{E.A.} + // The current algorithm fails if there is more that one + // face wich contains triangles ... + // In that case, replace return by break to try another + // method (coded in "if (iCnt != 1) { ... }") + // // MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - // myErrorStatus=5; // more than one face has triangulation - // return; - break; - // \end{E.A.} - } - break; // next face - } + // myErrorStatus=5; // more than one face has triangulation + // return; + break; + // \end{E.A.} + } + break; // next face + } } } } @@ -1155,85 +1155,85 @@ void StdMeshers_Penta_3D::MakeBlock() int has_only_quad_f6 = 1; // for (i=1; i<=iNbF; ++i) { - int ok = 1; - const TopoDS_Shape& aF = aM(i); - SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aF); - SMESHDS_SubMesh *aSM = aSubMesh->GetSubMeshDS(); - SMDS_ElemIteratorPtr itf = aSM->GetElements(); - while(itf->more()) { - const SMDS_MeshElement * pElement = itf->next(); - aElementType = pElement->GetType(); - if (aElementType==SMDSAbs_Face) { - iNbNodes = pElement->NbNodes(); - if ( iNbNodes!=4 ) { - ok = 0; - break ; - } - } - } - if (i==1) has_only_quad_f1 = ok ; - if (i==2) has_only_quad_f2 = ok ; - if (i==3) has_only_quad_f3 = ok ; - if (i==4) has_only_quad_f4 = ok ; - if (i==5) has_only_quad_f5 = ok ; - if (i==6) has_only_quad_f6 = ok ; + int ok = 1; + const TopoDS_Shape& aF = aM(i); + SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aF); + SMESHDS_SubMesh *aSM = aSubMesh->GetSubMeshDS(); + SMDS_ElemIteratorPtr itf = aSM->GetElements(); + while(itf->more()) { + const SMDS_MeshElement * pElement = itf->next(); + aElementType = pElement->GetType(); + if (aElementType==SMDSAbs_Face) { + iNbNodes = pElement->NbNodes(); + if ( iNbNodes!=4 ) { + ok = 0; + break ; + } + } + } + if (i==1) has_only_quad_f1 = ok ; + if (i==2) has_only_quad_f2 = ok ; + if (i==3) has_only_quad_f3 = ok ; + if (i==4) has_only_quad_f4 = ok ; + if (i==5) has_only_quad_f5 = ok ; + if (i==6) has_only_quad_f6 = ok ; } // TopTools_IndexedMapOfShape aE; TopExp::MapShapes(myShape, TopAbs_EDGE, aE); int iNbE = aE.Extent(); if (iNbE == 12) { - // - int nb_e01 = pMesh->GetSubMeshContaining(aE(1))->GetSubMeshDS()->NbElements(); - int nb_e02 = pMesh->GetSubMeshContaining(aE(2))->GetSubMeshDS()->NbElements(); - int nb_e03 = pMesh->GetSubMeshContaining(aE(3))->GetSubMeshDS()->NbElements(); - int nb_e04 = pMesh->GetSubMeshContaining(aE(4))->GetSubMeshDS()->NbElements(); - int nb_e05 = pMesh->GetSubMeshContaining(aE(5))->GetSubMeshDS()->NbElements(); - int nb_e06 = pMesh->GetSubMeshContaining(aE(6))->GetSubMeshDS()->NbElements(); - int nb_e07 = pMesh->GetSubMeshContaining(aE(7))->GetSubMeshDS()->NbElements(); - int nb_e08 = pMesh->GetSubMeshContaining(aE(8))->GetSubMeshDS()->NbElements(); - int nb_e09 = pMesh->GetSubMeshContaining(aE(9))->GetSubMeshDS()->NbElements(); - int nb_e10 = pMesh->GetSubMeshContaining(aE(10))->GetSubMeshDS()->NbElements(); - int nb_e11 = pMesh->GetSubMeshContaining(aE(11))->GetSubMeshDS()->NbElements(); - int nb_e12 = pMesh->GetSubMeshContaining(aE(12))->GetSubMeshDS()->NbElements(); - // - int nb_ok = 0 ; - // - if ( (nb_e01==nb_e03) && (nb_e03==nb_e05) && (nb_e05==nb_e07) ) { - if ( has_only_quad_f1 && has_only_quad_f2 && has_only_quad_f3 && has_only_quad_f4 ) { - if ( (nb_e09==nb_e10) && (nb_e08==nb_e06) && (nb_e11==nb_e12) && (nb_e04==nb_e02) ) { - if (nb_f5==nb_f6) { - nb_ok += 1; - aFTr = aM(5); - } - } - } - } - if ( (nb_e02==nb_e04) && (nb_e04==nb_e06) && (nb_e06==nb_e08) ) { - if ( has_only_quad_f1 && has_only_quad_f2 && has_only_quad_f5 && has_only_quad_f6 ) { - if ( (nb_e01==nb_e03) && (nb_e10==nb_e12) && (nb_e05==nb_e07) && (nb_e09==nb_e11) ) { - if (nb_f3==nb_f4) { - nb_ok += 1; - aFTr = aM(3); - } - } - } - } - if ( (nb_e09==nb_e10) && (nb_e10==nb_e11) && (nb_e11==nb_e12) ) { - if ( has_only_quad_f3 && has_only_quad_f4 && has_only_quad_f5 && has_only_quad_f6 ) { - if ( (nb_e01==nb_e05) && (nb_e02==nb_e06) && (nb_e03==nb_e07) && (nb_e04==nb_e08) ) { - if (nb_f1==nb_f2) { - nb_ok += 1; - aFTr = aM(1); - } - } - } - } - // - if ( nb_ok == 1 ) { - isOK = 1; - } - // + // + int nb_e01 = pMesh->GetSubMeshContaining(aE(1))->GetSubMeshDS()->NbElements(); + int nb_e02 = pMesh->GetSubMeshContaining(aE(2))->GetSubMeshDS()->NbElements(); + int nb_e03 = pMesh->GetSubMeshContaining(aE(3))->GetSubMeshDS()->NbElements(); + int nb_e04 = pMesh->GetSubMeshContaining(aE(4))->GetSubMeshDS()->NbElements(); + int nb_e05 = pMesh->GetSubMeshContaining(aE(5))->GetSubMeshDS()->NbElements(); + int nb_e06 = pMesh->GetSubMeshContaining(aE(6))->GetSubMeshDS()->NbElements(); + int nb_e07 = pMesh->GetSubMeshContaining(aE(7))->GetSubMeshDS()->NbElements(); + int nb_e08 = pMesh->GetSubMeshContaining(aE(8))->GetSubMeshDS()->NbElements(); + int nb_e09 = pMesh->GetSubMeshContaining(aE(9))->GetSubMeshDS()->NbElements(); + int nb_e10 = pMesh->GetSubMeshContaining(aE(10))->GetSubMeshDS()->NbElements(); + int nb_e11 = pMesh->GetSubMeshContaining(aE(11))->GetSubMeshDS()->NbElements(); + int nb_e12 = pMesh->GetSubMeshContaining(aE(12))->GetSubMeshDS()->NbElements(); + // + int nb_ok = 0 ; + // + if ( (nb_e01==nb_e03) && (nb_e03==nb_e05) && (nb_e05==nb_e07) ) { + if ( has_only_quad_f1 && has_only_quad_f2 && has_only_quad_f3 && has_only_quad_f4 ) { + if ( (nb_e09==nb_e10) && (nb_e08==nb_e06) && (nb_e11==nb_e12) && (nb_e04==nb_e02) ) { + if (nb_f5==nb_f6) { + nb_ok += 1; + aFTr = aM(5); + } + } + } + } + if ( (nb_e02==nb_e04) && (nb_e04==nb_e06) && (nb_e06==nb_e08) ) { + if ( has_only_quad_f1 && has_only_quad_f2 && has_only_quad_f5 && has_only_quad_f6 ) { + if ( (nb_e01==nb_e03) && (nb_e10==nb_e12) && (nb_e05==nb_e07) && (nb_e09==nb_e11) ) { + if (nb_f3==nb_f4) { + nb_ok += 1; + aFTr = aM(3); + } + } + } + } + if ( (nb_e09==nb_e10) && (nb_e10==nb_e11) && (nb_e11==nb_e12) ) { + if ( has_only_quad_f3 && has_only_quad_f4 && has_only_quad_f5 && has_only_quad_f6 ) { + if ( (nb_e01==nb_e05) && (nb_e02==nb_e06) && (nb_e03==nb_e07) && (nb_e04==nb_e08) ) { + if (nb_f1==nb_f2) { + nb_ok += 1; + aFTr = aM(1); + } + } + } + } + // + if ( nb_ok == 1 ) { + isOK = 1; + } + // } } if (!isOK) { @@ -1286,11 +1286,11 @@ void StdMeshers_Penta_3D::MakeBlock() const TopoDS_Edge& aE=TopoDS::Edge(aEx); TopExp::Vertices(aE, aV[0], aV[1]); for (i=0; i<2; ++i) { - if (!aV[i].IsSame(aV000)) { - aV001=aV[i]; - bFound=!bFound; - break; - } + if (!aV[i].IsSame(aV000)) { + aV001=aV[i]; + bFound=!bFound; + break; + } } } } @@ -1703,8 +1703,8 @@ void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell) //purpose : //======================================================================= void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theV000, - const TopoDS_Vertex& theV001) + const TopoDS_Vertex& theV000, + const TopoDS_Vertex& theV001) { myErrorStatus=0; // @@ -1725,7 +1725,7 @@ void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell, //purpose : //======================================================================= void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, - gp_XYZ& theXYZ) + gp_XYZ& theXYZ) { ComputeParameters(thePnt, myShell, theXYZ); } @@ -1735,7 +1735,7 @@ void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, //purpose : //======================================================================= void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, - const TopoDS_Shape& theShape, + const TopoDS_Shape& theShape, gp_XYZ& theXYZ) { myErrorStatus=0; @@ -1785,7 +1785,7 @@ void StdMeshers_SMESHBlock::ComputeParameters(const double& theU, //purpose : //======================================================================= void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams, - gp_Pnt& aP3D) + gp_Pnt& aP3D) { TopoDS_Shape aS; // @@ -1797,8 +1797,8 @@ void StdMeshers_SMESHBlock::ComputeParameters(const double& theU, //purpose : //======================================================================= void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams, - const TopoDS_Shape& theShape, - gp_Pnt& aP3D) + const TopoDS_Shape& theShape, + gp_Pnt& aP3D) { myErrorStatus = 0; // @@ -1889,8 +1889,8 @@ const TopoDS_Shape& StdMeshers_SMESHBlock::Shape(const int theID) //purpose : //======================================================================= bool StdMeshers_Penta_3D::Evaluate(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - MapShapeNbElems& aResMap) + const TopoDS_Shape& aShape, + MapShapeNbElems& aResMap) { MESSAGE("StdMeshers_Penta_3D::Evaluate()"); @@ -1904,6 +1904,10 @@ bool StdMeshers_Penta_3D::Evaluate(SMESH_Mesh& aMesh, SMESH_subMesh *aSubMesh = aMesh.GetSubMesh(exp.Current()); meshFaces.push_back(aSubMesh); MapShapeNbElemsItr anIt = aResMap.find(meshFaces[i]); + if( anIt == aResMap.end() ) { + NumBase = 0; + break; + } std::vector aVec = (*anIt).second; int nbtri = Max(aVec[SMDSEntity_Triangle],aVec[SMDSEntity_Quad_Triangle]); int nbqua = Max(aVec[SMDSEntity_Quadrangle],aVec[SMDSEntity_Quad_Quadrangle]); @@ -1912,7 +1916,15 @@ bool StdMeshers_Penta_3D::Evaluate(SMESH_Mesh& aMesh, } } - if(NumBase==0) return false; + if(NumBase==0) { + std::vector aResVec(SMDSEntity_Last); + for(int i=SMDSEntity_Node; imyName = COMPERR_ALGO_FAILED; + myErrorStatus->myComment = "Submesh can not be evaluated"; + return false; + } // find number of 1d elems for base face int nb1d = 0; @@ -1934,8 +1946,8 @@ bool StdMeshers_Penta_3D::Evaluate(SMESH_Mesh& aMesh, bool IsOpposite = true; for(TopExp_Explorer exp(aFaces.Value(i), TopAbs_EDGE); exp.More(); exp.Next()) { if( Edges1.Contains(exp.Current()) ) { - IsOpposite = false; - break; + IsOpposite = false; + break; } } if(IsOpposite) { diff --git a/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx b/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx new file mode 100644 index 000000000..95423e861 --- /dev/null +++ b/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx @@ -0,0 +1,1088 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH : implementaion of SMESH idl descriptions +// File : StdMeshers_RadialQuadrangle_1D2D.cxx +// Module : SMESH +// Created : Fri Oct 20 11:37:07 2006 +// Author : Edward AGAPOV (eap) +// +#include "StdMeshers_RadialQuadrangle_1D2D.hxx" + +//#include "StdMeshers_ProjectionUtils.hxx" +#include "StdMeshers_NumberOfLayers.hxx" +#include "StdMeshers_LayerDistribution.hxx" +//#include "StdMeshers_Prism_3D.hxx" +#include "StdMeshers_Regular_1D.hxx" + +#include "SMDS_MeshNode.hxx" +#include "SMESHDS_SubMesh.hxx" +#include "SMESH_Gen.hxx" +#include "SMESH_Mesh.hxx" +#include "SMESH_MesherHelper.hxx" +#include "SMESH_subMesh.hxx" +#include "SMESH_subMeshEventListener.hxx" + +#include "utilities.h" + +#include +#include +//#include +#include +#include +#include +//#include +//#include +//#include +//#include +//#include + + +#include +#include +#include +#include +#include +#include + + +using namespace std; + +#define RETURN_BAD_RESULT(msg) { MESSAGE(")-: Error: " << msg); return false; } +#define gpXYZ(n) gp_XYZ(n->X(),n->Y(),n->Z()) + +//typedef StdMeshers_ProjectionUtils TAssocTool; + + +//======================================================================= +//function : StdMeshers_RadialQuadrangle_1D2D +//purpose : +//======================================================================= + +StdMeshers_RadialQuadrangle_1D2D::StdMeshers_RadialQuadrangle_1D2D(int hypId, + int studyId, + SMESH_Gen* gen) + :SMESH_2D_Algo(hypId, studyId, gen) +{ + _name = "RadialQuadrangle_1D2D"; + _shapeType = (1 << TopAbs_FACE); // 1 bit per shape type + + _compatibleHypothesis.push_back("LayerDistribution2D"); + _compatibleHypothesis.push_back("NumberOfLayers2D"); + myNbLayerHypo = 0; + myDistributionHypo = 0; + _requireDescretBoundary = false; +} + + +//================================================================================ +/*! + * \brief Destructor + */ +//================================================================================ + +StdMeshers_RadialQuadrangle_1D2D::~StdMeshers_RadialQuadrangle_1D2D() +{} + + +//======================================================================= +//function : CheckHypothesis +//purpose : +//======================================================================= + +bool StdMeshers_RadialQuadrangle_1D2D::CheckHypothesis + (SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + SMESH_Hypothesis::Hypothesis_Status& aStatus) +{ + // check aShape + myNbLayerHypo = 0; + myDistributionHypo = 0; + + list ::const_iterator itl; + + const list &hyps = GetUsedHypothesis(aMesh, aShape); + if ( hyps.size() == 0 ) { + aStatus = SMESH_Hypothesis::HYP_MISSING; + return false; // can't work with no hypothesis + } + + if ( hyps.size() > 1 ) { + aStatus = SMESH_Hypothesis::HYP_ALREADY_EXIST; + return false; + } + + const SMESHDS_Hypothesis *theHyp = hyps.front(); + + string hypName = theHyp->GetName(); + + if (hypName == "NumberOfLayers2D") { + myNbLayerHypo = static_cast(theHyp); + aStatus = SMESH_Hypothesis::HYP_OK; + return true; + } + if (hypName == "LayerDistribution2D") { + myDistributionHypo = static_cast(theHyp); + aStatus = SMESH_Hypothesis::HYP_OK; + return true; + } + aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE; + return true; +} + + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape) +{ + TopExp_Explorer exp; + SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); + + myHelper = new SMESH_MesherHelper( aMesh ); + myHelper->IsQuadraticSubMesh( aShape ); + + myLayerPositions.clear(); + + TopoDS_Edge E1,E2,E3; + Handle(Geom_Curve) C1,C2,C3; + double f1,l1,f2,l2,f3,l3; + int nbe = 0; + for ( exp.Init( aShape, TopAbs_EDGE ); exp.More(); exp.Next() ) { + nbe++; + TopoDS_Edge E = TopoDS::Edge( exp.Current() ); + if(nbe==1) { + E1 = E; + C1 = BRep_Tool::Curve(E,f1,l1); + } + else if(nbe==2) { + E2 = E; + C2 = BRep_Tool::Curve(E,f2,l2); + } + else if(nbe==3) { + E3 = E; + C3 = BRep_Tool::Curve(E,f3,l3); + } + } + + if(nbe>3) + return error(COMPERR_BAD_SHAPE); + + gp_Pnt P0,P1; + // points for rotation + TColgp_SequenceOfPnt Points; + // angles for rotation + TColStd_SequenceOfReal Angles; + // Nodes1 and Nodes2 - nodes along radiuses + // CNodes - nodes on circle edge + std::vector< const SMDS_MeshNode* > Nodes1, Nodes2, CNodes; + SMDS_MeshNode * NC; + // parameters edge nodes on face + TColgp_SequenceOfPnt2d Pnts2d1, Pnts2d2; + gp_Pnt2d PC; + + int faceID = meshDS->ShapeToIndex(aShape); + TopoDS_Face F = TopoDS::Face(aShape); + Handle(Geom_Surface) S = BRep_Tool::Surface(F); + + //cout<<"RadialQuadrangle_1D2D::Compute nbe = "<Compute( aMesh, CircEdge, false, MeshDim_1D ); + if( !ok ) return false; + std::map< double, const SMDS_MeshNode* > theNodes; + GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); + + CNodes.clear(); + std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); + const SMDS_MeshNode* NF = (*itn).second; + CNodes.push_back( (*itn).second ); + double fang = (*itn).first; + itn++; + for(; itn != theNodes.end(); itn++ ) { + CNodes.push_back( (*itn).second ); + double ang = (*itn).first - fang; + if( ang>PI ) ang = ang - 2*PI; + if( ang<-PI ) ang = ang + 2*PI; + Angles.Append( ang ); + } + P1 = gp_Pnt( NF->X(), NF->Y(), NF->Z() ); + P0 = aCirc->Location(); + + myLayerPositions.clear(); + computeLayerPositions(P0,P1); + + exp.Init( CircEdge, TopAbs_VERTEX ); + TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() ); + gp_Pnt2d p2dV = BRep_Tool::Parameters( V1, TopoDS::Face(aShape) ); + + NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); + GeomAPI_ProjectPointOnSurf PPS(P0,S); + double U0,V0; + PPS.Parameters(1,U0,V0); + meshDS->SetNodeOnFace(NC, faceID, U0, V0); + PC = gp_Pnt2d(U0,V0); + + gp_Vec aVec(P0,P1); + gp_Vec2d aVec2d(PC,p2dV); + Nodes1.resize( myLayerPositions.size()+1 ); + Nodes2.resize( myLayerPositions.size()+1 ); + int i = 0; + for(; iAddNode(P.X(), P.Y(), P.Z()); + Nodes1[i] = node; + Nodes2[i] = node; + double U = PC.X() + aVec2d.X()*myLayerPositions[i]; + double V = PC.Y() + aVec2d.Y()*myLayerPositions[i]; + meshDS->SetNodeOnFace( node, faceID, U, V ); + Pnts2d1.Append(gp_Pnt2d(U,V)); + Pnts2d2.Append(gp_Pnt2d(U,V)); + } + Nodes1[Nodes1.size()-1] = NF; + Nodes2[Nodes1.size()-1] = NF; + } + else if(nbe==2) { + // one curve must be a half of circle and other curve must be + // a segment of line + Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + while( !tc.IsNull() ) { + C1 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + } + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + while( !tc.IsNull() ) { + C2 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + } + + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast(C2); + CircEdge = E1; + LinEdge1 = E2; + double fp = f1; + double lp = l1; + if( aCirc.IsNull() ) { + aCirc = Handle(Geom_Circle)::DownCast(C2); + CircEdge = E2; + LinEdge1 = E1; + fp = f2; + lp = l2; + aLine = Handle(Geom_Line)::DownCast(C3); + } + if( aCirc.IsNull() ) { + // not circle + return error(COMPERR_BAD_SHAPE); + } + if( fabs(fabs(lp-fp)-PI) > Precision::Confusion() ) { + // not half of circle + return error(COMPERR_BAD_SHAPE); + } + if( aLine.IsNull() ) { + // other curve not line + return error(COMPERR_BAD_SHAPE); + } + SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1); + if( sm1 ) { + SMESHDS_SubMesh* sdssm1 = sm1->GetSubMeshDS(); + if( sdssm1 ) { + if( sm1->GetSubMeshDS()->NbNodes()>0 ) { + SMESH_subMesh* sm = aMesh.GetSubMesh(F); + SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); + smError.reset(new SMESH_ComputeError(COMPERR_ALGO_FAILED, + "Invalid set of hypothesises",this)); + return false; + } + } + } + + bool ok = _gen->Compute( aMesh, CircEdge, false, MeshDim_1D ); + if( !ok ) return false; + std::map< double, const SMDS_MeshNode* > theNodes; + GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); + + CNodes.clear(); + std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); + const SMDS_MeshNode* NF = (*itn).second; + CNodes.push_back( (*itn).second ); + double fang = (*itn).first; + itn++; + const SMDS_MeshNode* NL; + int nbn = 1; + for(; itn != theNodes.end(); itn++ ) { + nbn++; + if( nbn == theNodes.size() ) + NL = (*itn).second; + CNodes.push_back( (*itn).second ); + double ang = (*itn).first - fang; + if( ang>PI ) ang = ang - 2*PI; + if( ang<-PI ) ang = ang + 2*PI; + Angles.Append( ang ); + } + P1 = gp_Pnt( NF->X(), NF->Y(), NF->Z() ); + gp_Pnt P2( NL->X(), NL->Y(), NL->Z() ); + P0 = aCirc->Location(); + + myLayerPositions.clear(); + computeLayerPositions(P0,P1); + + gp_Vec aVec(P0,P1); + int edgeID = meshDS->ShapeToIndex(LinEdge1); + // check orientation + Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge1,fp,lp); + gp_Pnt Ptmp; + Crv->D0(fp,Ptmp); + bool ori = true; + if( P1.Distance(Ptmp) > Precision::Confusion() ) + ori = false; + // get UV points for edge + gp_Pnt2d PF,PL; + BRep_Tool::UVPoints( LinEdge1, TopoDS::Face(aShape), PF, PL ); + PC = gp_Pnt2d( (PF.X()+PL.X())/2, (PF.Y()+PL.Y())/2 ); + gp_Vec2d V2d; + if(ori) V2d = gp_Vec2d(PC,PF); + else V2d = gp_Vec2d(PC,PL); + // add nodes on edge + double cp = (fp+lp)/2; + double dp2 = (lp-fp)/2; + NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); + meshDS->SetNodeOnEdge(NC, edgeID, cp); + Nodes1.resize( myLayerPositions.size()+1 ); + Nodes2.resize( myLayerPositions.size()+1 ); + int i = 0; + for(; iAddNode(P.X(), P.Y(), P.Z()); + Nodes1[i] = node; + double param; + if(ori) + param = fp + dp2*(1-myLayerPositions[i]); + else + param = cp + dp2*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + P = gp_Pnt( P0.X() - aVec.X()*myLayerPositions[i], + P0.Y() - aVec.Y()*myLayerPositions[i], + P0.Z() - aVec.Z()*myLayerPositions[i] ); + node = meshDS->AddNode(P.X(), P.Y(), P.Z()); + Nodes2[i] = node; + if(!ori) + param = fp + dp2*(1-myLayerPositions[i]); + else + param = cp + dp2*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + // parameters on face + gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], + PC.Y() + V2d.Y()*myLayerPositions[i] ); + Pnts2d1.Append(P2d); + P2d = gp_Pnt2d( PC.X() - V2d.X()*myLayerPositions[i], + PC.Y() - V2d.Y()*myLayerPositions[i] ); + Pnts2d2.Append(P2d); + } + Nodes1[ myLayerPositions.size() ] = NF; + Nodes2[ myLayerPositions.size() ] = NL; + // create 1D elements on edge + std::vector< const SMDS_MeshNode* > tmpNodes; + tmpNodes.resize(2*Nodes1.size()+1); + for(i=0; iAddEdge( tmpNodes[i-1], tmpNodes[i] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + } + } + else { // nbe==3 + // one curve must be a part of circle and other curves must be + // segments of line + Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + while( !tc.IsNull() ) { + C1 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + } + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + while( !tc.IsNull() ) { + C2 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + } + tc = Handle(Geom_TrimmedCurve)::DownCast(C3); + while( !tc.IsNull() ) { + C3 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C3); + } + + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); + Handle(Geom_Line) aLine1 = Handle(Geom_Line)::DownCast(C2); + Handle(Geom_Line) aLine2 = Handle(Geom_Line)::DownCast(C3); + CircEdge = E1; + LinEdge1 = E2; + LinEdge2 = E3; + double fp = f1; + double lp = l1; + if( aCirc.IsNull() ) { + aCirc = Handle(Geom_Circle)::DownCast(C2); + CircEdge = E2; + LinEdge1 = E3; + LinEdge2 = E1; + fp = f2; + lp = l2; + aLine1 = Handle(Geom_Line)::DownCast(C3); + aLine2 = Handle(Geom_Line)::DownCast(C1); + if( aCirc.IsNull() ) { + aCirc = Handle(Geom_Circle)::DownCast(C3); + CircEdge = E3; + LinEdge1 = E1; + LinEdge2 = E2; + fp = f3; + lp = l3; + aLine1 = Handle(Geom_Line)::DownCast(C1); + aLine2 = Handle(Geom_Line)::DownCast(C2); + } + } + if( aCirc.IsNull() ) { + // not circle + return error(COMPERR_BAD_SHAPE); + } + if( aLine1.IsNull() || aLine2.IsNull() ) { + // other curve not line + return error(COMPERR_BAD_SHAPE); + } + SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1); + SMESH_subMesh* sm2 = aMesh.GetSubMesh(LinEdge2); + if( sm1 && sm2 ) { + SMESHDS_SubMesh* sdssm1 = sm1->GetSubMeshDS(); + SMESHDS_SubMesh* sdssm2 = sm2->GetSubMeshDS(); + if( sdssm1 && sdssm2 ) { + if( sm1->GetSubMeshDS()->NbNodes()>0 || sm2->GetSubMeshDS()->NbNodes()>0 ) { + SMESH_subMesh* sm = aMesh.GetSubMesh(F); + SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); + smError.reset(new SMESH_ComputeError(COMPERR_ALGO_FAILED, + "Invalid set of hypothesises",this)); + return false; + } + } + } + + bool ok = _gen->Compute( aMesh, CircEdge, false, MeshDim_1D ); + if( !ok ) return false; + std::map< double, const SMDS_MeshNode* > theNodes; + GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); + + CNodes.clear(); + std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); + const SMDS_MeshNode* NF = (*itn).second; + CNodes.push_back( (*itn).second ); + double fang = (*itn).first; + itn++; + const SMDS_MeshNode* NL; + int nbn = 1; + for(; itn != theNodes.end(); itn++ ) { + nbn++; + if( nbn == theNodes.size() ) + NL = (*itn).second; + CNodes.push_back( (*itn).second ); + double ang = (*itn).first - fang; + if( ang>PI ) ang = ang - 2*PI; + if( ang<-PI ) ang = ang + 2*PI; + Angles.Append( ang ); + } + P1 = gp_Pnt( NF->X(), NF->Y(), NF->Z() ); + gp_Pnt P2( NL->X(), NL->Y(), NL->Z() ); + P0 = aCirc->Location(); + + myLayerPositions.clear(); + computeLayerPositions(P0,P1); + + exp.Init( LinEdge1, TopAbs_VERTEX ); + TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() ); + exp.Next(); + TopoDS_Vertex V2 = TopoDS::Vertex( exp.Current() ); + gp_Pnt PE1 = BRep_Tool::Pnt(V1); + gp_Pnt PE2 = BRep_Tool::Pnt(V2); + if( ( P1.Distance(PE1) > Precision::Confusion() ) && + ( P1.Distance(PE2) > Precision::Confusion() ) ) { + TopoDS_Edge E = LinEdge1; + LinEdge1 = LinEdge2; + LinEdge2 = E; + } + TopoDS_Vertex VC; + if( ( P1.Distance(PE1) > Precision::Confusion() ) && + ( P2.Distance(PE1) > Precision::Confusion() ) ) { + VC = V1; + } + else VC = V2; + int vertID = meshDS->ShapeToIndex(VC); + // LinEdge1 + int edgeID = meshDS->ShapeToIndex(LinEdge1); + gp_Vec aVec(P0,P1); + // check orientation + Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge1,fp,lp); + gp_Pnt Ptmp; + Crv->D0(fp,Ptmp); + bool ori = false; + if( P1.Distance(Ptmp) > Precision::Confusion() ) + ori = true; + // get UV points for edge + gp_Pnt2d PF,PL; + BRep_Tool::UVPoints( LinEdge1, TopoDS::Face(aShape), PF, PL ); + gp_Vec2d V2d; + if(ori) { + V2d = gp_Vec2d(PF,PL); + PC = PF; + } + else { + V2d = gp_Vec2d(PL,PF); + PC = PL; + } + NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); + meshDS->SetNodeOnVertex(NC, vertID); + double dp = lp-fp; + Nodes1.resize( myLayerPositions.size()+1 ); + int i = 0; + for(; iAddNode(P.X(), P.Y(), P.Z()); + Nodes1[i] = node; + double param; + if(!ori) + param = fp + dp*(1-myLayerPositions[i]); + else + param = fp + dp*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + // parameters on face + gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], + PC.Y() + V2d.Y()*myLayerPositions[i] ); + Pnts2d1.Append(P2d); + } + Nodes1[ myLayerPositions.size() ] = NF; + // create 1D elements on edge + SMDS_MeshEdge* ME = myHelper->AddEdge( NC, Nodes1[0] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + for(i=1; iAddEdge( Nodes1[i-1], Nodes1[i] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + } + // LinEdge2 + edgeID = meshDS->ShapeToIndex(LinEdge1); + aVec = gp_Vec(P0,P2); + // check orientation + Crv = BRep_Tool::Curve(LinEdge2,fp,lp); + Crv->D0(fp,Ptmp); + ori = false; + if( P2.Distance(Ptmp) > Precision::Confusion() ) + ori = true; + // get UV points for edge + BRep_Tool::UVPoints( LinEdge2, TopoDS::Face(aShape), PF, PL ); + if(ori) { + V2d = gp_Vec2d(PF,PL); + PC = PF; + } + else { + V2d = gp_Vec2d(PL,PF); + PC = PL; + } + dp = lp-fp; + Nodes2.resize( myLayerPositions.size()+1 ); + for(i=0; iAddNode(P.X(), P.Y(), P.Z()); + Nodes2[i] = node; + double param; + if(!ori) + param = fp + dp*(1-myLayerPositions[i]); + else + param = fp + dp*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + // parameters on face + gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], + PC.Y() + V2d.Y()*myLayerPositions[i] ); + Pnts2d2.Append(P2d); + } + Nodes2[ myLayerPositions.size() ] = NL; + // create 1D elements on edge + ME = myHelper->AddEdge( NC, Nodes2[0] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + for(i=1; iAddEdge( Nodes2[i-1], Nodes2[i] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + } + } + + // create nodes and mesh elements on face + // find axis of rotation + gp_Pnt P2 = gp_Pnt( CNodes[1]->X(), CNodes[1]->Y(), CNodes[1]->Z() ); + gp_Vec Vec1(P0,P1); + gp_Vec Vec2(P0,P2); + gp_Vec Axis = Vec1.Crossed(Vec2); + // create elements + int i = 1; + //cout<<"Angles.Length() = "<GetLayerDistribution() ) + return error( "Invalid LayerDistribution hypothesis"); + myUsedHyps.clear(); + myUsedHyps.push_back( hyp->GetLayerDistribution() ); + + TopoDS_Edge edge = BRepBuilderAPI_MakeEdge( pIn, pOut ); + SMESH_Hypothesis::Hypothesis_Status aStatus; + if ( !StdMeshers_Regular_1D::CheckHypothesis( aMesh, edge, aStatus )) + return error( "StdMeshers_Regular_1D::CheckHypothesis() failed " + "with LayerDistribution hypothesis"); + + BRepAdaptor_Curve C3D(edge); + double f = C3D.FirstParameter(), l = C3D.LastParameter(); + list< double > params; + if ( !StdMeshers_Regular_1D::computeInternalParameters( aMesh, C3D, len, f, l, params, false )) + return error("StdMeshers_Regular_1D failed to compute layers distribution"); + + positions.clear(); + positions.reserve( params.size() ); + for (list::iterator itU = params.begin(); itU != params.end(); itU++) + positions.push_back( *itU / len ); + return true; + } +protected: + // ----------------------------------------------------------------------------- + TNodeDistributor( int hypId, int studyId, SMESH_Gen* gen) + : StdMeshers_Regular_1D( hypId, studyId, gen) + { + } + // ----------------------------------------------------------------------------- + virtual const list & + GetUsedHypothesis(SMESH_Mesh &, const TopoDS_Shape &, const bool) + { + return myUsedHyps; + } + // ----------------------------------------------------------------------------- +}; + +//================================================================================ +/*! + * \brief Compute positions of nodes between the internal and the external surfaces + * \retval bool - is a success + */ +//================================================================================ + +bool StdMeshers_RadialQuadrangle_1D2D::computeLayerPositions(const gp_Pnt& pIn, + const gp_Pnt& pOut) +{ + if ( myNbLayerHypo ) + { + int nbSegments = myNbLayerHypo->GetNumberOfLayers(); + myLayerPositions.resize( nbSegments - 1 ); + for ( int z = 1; z < nbSegments; ++z ) + myLayerPositions[ z - 1 ] = double( z )/ double( nbSegments ); + return true; + } + if ( myDistributionHypo ) { + SMESH_Mesh * mesh = myHelper->GetMesh(); + if ( !TNodeDistributor::GetDistributor(*mesh)->Compute( myLayerPositions, pIn, pOut, + *mesh, myDistributionHypo )) + { + error( TNodeDistributor::GetDistributor(*mesh)->GetComputeError() ); + return false; + } + } + RETURN_BAD_RESULT("Bad hypothesis"); +} + + +//======================================================================= +//function : Evaluate +//purpose : +//======================================================================= + +bool StdMeshers_RadialQuadrangle_1D2D::Evaluate(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + MapShapeNbElems& aResMap) +{ + if( aShape.ShapeType() != TopAbs_FACE ) { + return false; + } + SMESH_subMesh * smf = aMesh.GetSubMesh(aShape); + MapShapeNbElemsItr anIt = aResMap.find(smf); + if( anIt != aResMap.end() ) { + return false; + } + + myLayerPositions.clear(); + gp_Pnt P0(0,0,0); + gp_Pnt P1(100,0,0); + computeLayerPositions(P0,P1); + + TopoDS_Edge E1,E2,E3; + Handle(Geom_Curve) C1,C2,C3; + double f1,l1,f2,l2,f3,l3; + int nbe = 0; + TopExp_Explorer exp; + for ( exp.Init( aShape, TopAbs_EDGE ); exp.More(); exp.Next() ) { + nbe++; + TopoDS_Edge E = TopoDS::Edge( exp.Current() ); + if(nbe==1) { + E1 = E; + C1 = BRep_Tool::Curve(E,f1,l1); + } + else if(nbe==2) { + E2 = E; + C2 = BRep_Tool::Curve(E,f2,l2); + } + else if(nbe==3) { + E3 = E; + C3 = BRep_Tool::Curve(E,f3,l3); + } + } + + TopoDS_Edge CircEdge, LinEdge1, LinEdge2; + int nb0d=0, nb2d_tria=0, nb2d_quad=0; + bool isQuadratic = false; + if(nbe==1) { + // C1 must be a circle + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); + if( !aCirc.IsNull() ) { + bool ok = _gen->Evaluate( aMesh, CircEdge, aResMap ); + if(ok) { + SMESH_subMesh * sm = aMesh.GetSubMesh(CircEdge); + MapShapeNbElemsItr anIt = aResMap.find(sm); + std::vector aVec = (*anIt).second; + isQuadratic = aVec[SMDSEntity_Quad_Edge]>aVec[SMDSEntity_Edge]; + if(isQuadratic) { + // main nodes + nb0d = (aVec[SMDSEntity_Node]+1) * myLayerPositions.size(); + // radial medium nodes + nb0d += (aVec[SMDSEntity_Node]+1) * (myLayerPositions.size()+1); + // other medium nodes + nb0d += (aVec[SMDSEntity_Node]+1) * myLayerPositions.size(); + } + else { + nb0d = (aVec[SMDSEntity_Node]+1) * myLayerPositions.size(); + } + nb2d_tria = aVec[SMDSEntity_Node] + 1; + nb2d_quad = nb0d; + } + } + } + else if(nbe==2) { + // one curve must be a half of circle and other curve must be + // a segment of line + Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + while( !tc.IsNull() ) { + C1 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + } + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + while( !tc.IsNull() ) { + C2 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + } + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast(C2); + CircEdge = E1; + LinEdge1 = E2; + double fp = f1; + double lp = l1; + if( aCirc.IsNull() ) { + aCirc = Handle(Geom_Circle)::DownCast(C2); + CircEdge = E2; + LinEdge1 = E1; + fp = f2; + lp = l2; + aLine = Handle(Geom_Line)::DownCast(C3); + } + bool ok = !aCirc.IsNull() && !aLine.IsNull(); + if( fabs(fabs(lp-fp)-PI) > Precision::Confusion() ) { + // not half of circle + ok = false; + } + SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1); + MapShapeNbElemsItr anIt = aResMap.find(sm1); + if( anIt!=aResMap.end() ) { + ok = false; + } + if(ok) { + ok = _gen->Evaluate( aMesh, CircEdge, aResMap ); + } + if(ok) { + SMESH_subMesh * sm = aMesh.GetSubMesh(CircEdge); + MapShapeNbElemsItr anIt = aResMap.find(sm); + std::vector aVec = (*anIt).second; + isQuadratic = aVec[SMDSEntity_Quad_Edge]>aVec[SMDSEntity_Edge]; + if(isQuadratic) { + // main nodes + nb0d = aVec[SMDSEntity_Node] * myLayerPositions.size(); + // radial medium nodes + nb0d += aVec[SMDSEntity_Node] * (myLayerPositions.size()+1); + // other medium nodes + nb0d += (aVec[SMDSEntity_Node]+1) * myLayerPositions.size(); + } + else { + nb0d = aVec[SMDSEntity_Node] * myLayerPositions.size(); + } + nb2d_tria = aVec[SMDSEntity_Node] + 1; + nb2d_quad = nb2d_tria * myLayerPositions.size(); + // add evaluation for edges + std::vector aResVec(SMDSEntity_Last); + for(int i=SMDSEntity_Node; iBasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C1); + } + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + while( !tc.IsNull() ) { + C2 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C2); + } + tc = Handle(Geom_TrimmedCurve)::DownCast(C3); + while( !tc.IsNull() ) { + C3 = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C3); + } + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); + Handle(Geom_Line) aLine1 = Handle(Geom_Line)::DownCast(C2); + Handle(Geom_Line) aLine2 = Handle(Geom_Line)::DownCast(C3); + CircEdge = E1; + LinEdge1 = E2; + LinEdge2 = E3; + double fp = f1; + double lp = l1; + if( aCirc.IsNull() ) { + aCirc = Handle(Geom_Circle)::DownCast(C2); + CircEdge = E2; + LinEdge1 = E3; + LinEdge2 = E1; + fp = f2; + lp = l2; + aLine1 = Handle(Geom_Line)::DownCast(C3); + aLine2 = Handle(Geom_Line)::DownCast(C1); + if( aCirc.IsNull() ) { + aCirc = Handle(Geom_Circle)::DownCast(C3); + CircEdge = E3; + LinEdge1 = E1; + LinEdge2 = E2; + fp = f3; + lp = l3; + aLine1 = Handle(Geom_Line)::DownCast(C1); + aLine2 = Handle(Geom_Line)::DownCast(C2); + } + } + bool ok = !aCirc.IsNull() && !aLine1.IsNull() && !aLine1.IsNull(); + SMESH_subMesh* sm = aMesh.GetSubMesh(LinEdge1); + MapShapeNbElemsItr anIt = aResMap.find(sm); + if( anIt!=aResMap.end() ) { + ok = false; + } + sm = aMesh.GetSubMesh(LinEdge2); + anIt = aResMap.find(sm); + if( anIt!=aResMap.end() ) { + ok = false; + } + if(ok) { + ok = _gen->Evaluate( aMesh, CircEdge, aResMap ); + } + if(ok) { + SMESH_subMesh * sm = aMesh.GetSubMesh(CircEdge); + MapShapeNbElemsItr anIt = aResMap.find(sm); + std::vector aVec = (*anIt).second; + isQuadratic = aVec[SMDSEntity_Quad_Edge]>aVec[SMDSEntity_Edge]; + if(isQuadratic) { + // main nodes + nb0d = aVec[SMDSEntity_Node] * myLayerPositions.size(); + // radial medium nodes + nb0d += aVec[SMDSEntity_Node] * (myLayerPositions.size()+1); + // other medium nodes + nb0d += (aVec[SMDSEntity_Node]+1) * myLayerPositions.size(); + } + else { + nb0d = aVec[SMDSEntity_Node] * myLayerPositions.size(); + } + nb2d_tria = aVec[SMDSEntity_Node] + 1; + nb2d_quad = nb2d_tria * myLayerPositions.size(); + // add evaluation for edges + std::vector aResVec(SMDSEntity_Last); + for(int i=SMDSEntity_Node; i aResVec(SMDSEntity_Last); + for(int i=SMDSEntity_Node; i +//#include + +class StdMeshers_NumberOfLayers; +class StdMeshers_LayerDistribution; +class SMESH_MesherHelper; +class gp_Pnt; + +class STDMESHERS_EXPORT StdMeshers_RadialQuadrangle_1D2D: public SMESH_2D_Algo +{ +public: + StdMeshers_RadialQuadrangle_1D2D(int hypId, int studyId, SMESH_Gen* gen); + virtual ~StdMeshers_RadialQuadrangle_1D2D(); + + 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); + + virtual bool Evaluate(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, + MapShapeNbElems& aResMap); + +protected: + + bool computeLayerPositions(const gp_Pnt& pIn, + const gp_Pnt& pOut); + + + const StdMeshers_NumberOfLayers* myNbLayerHypo; + const StdMeshers_LayerDistribution* myDistributionHypo; + SMESH_MesherHelper* myHelper; + std::vector< double > myLayerPositions; +}; + +#endif diff --git a/src/StdMeshers/StdMeshers_Regular_1D.cxx b/src/StdMeshers/StdMeshers_Regular_1D.cxx index 2d1852b35..8e50b059b 100644 --- a/src/StdMeshers/StdMeshers_Regular_1D.cxx +++ b/src/StdMeshers/StdMeshers_Regular_1D.cxx @@ -73,22 +73,24 @@ using namespace std; //============================================================================= StdMeshers_Regular_1D::StdMeshers_Regular_1D(int hypId, int studyId, - SMESH_Gen * gen):SMESH_1D_Algo(hypId, studyId, gen) + SMESH_Gen * gen):SMESH_1D_Algo(hypId, studyId, gen) { - MESSAGE("StdMeshers_Regular_1D::StdMeshers_Regular_1D"); - _name = "Regular_1D"; - _shapeType = (1 << TopAbs_EDGE); + MESSAGE("StdMeshers_Regular_1D::StdMeshers_Regular_1D"); + _name = "Regular_1D"; + _shapeType = (1 << TopAbs_EDGE); + _fpHyp = 0; - _compatibleHypothesis.push_back("LocalLength"); - _compatibleHypothesis.push_back("MaxLength"); - _compatibleHypothesis.push_back("NumberOfSegments"); - _compatibleHypothesis.push_back("StartEndLength"); - _compatibleHypothesis.push_back("Deflection1D"); - _compatibleHypothesis.push_back("Arithmetic1D"); - _compatibleHypothesis.push_back("AutomaticLength"); + _compatibleHypothesis.push_back("LocalLength"); + _compatibleHypothesis.push_back("MaxLength"); + _compatibleHypothesis.push_back("NumberOfSegments"); + _compatibleHypothesis.push_back("StartEndLength"); + _compatibleHypothesis.push_back("Deflection1D"); + _compatibleHypothesis.push_back("Arithmetic1D"); + _compatibleHypothesis.push_back("FixedPoints1D"); + _compatibleHypothesis.push_back("AutomaticLength"); - _compatibleHypothesis.push_back("QuadraticMesh"); // auxiliary !!! - _compatibleHypothesis.push_back("Propagation"); // auxiliary !!! + _compatibleHypothesis.push_back("QuadraticMesh"); // auxiliary !!! + _compatibleHypothesis.push_back("Propagation"); // auxiliary !!! } //============================================================================= @@ -218,6 +220,16 @@ bool StdMeshers_Regular_1D::CheckHypothesis aStatus = SMESH_Hypothesis::HYP_OK; } + else if (hypName == "FixedPoints1D") { + _fpHyp = dynamic_cast (theHyp); + ASSERT(_fpHyp); + _hypType = FIXED_POINTS_1D; + + _revEdgesIDs = _fpHyp->GetReversedEdges(); + + aStatus = SMESH_Hypothesis::HYP_OK; + } + else if (hypName == "StartEndLength") { const StdMeshers_StartEndLength * hyp = @@ -773,6 +785,62 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, return true; } + case FIXED_POINTS_1D: { + const std::vector& aPnts = _fpHyp->GetPoints(); + const std::vector& nbsegs = _fpHyp->GetNbSegments(); + int i = 0; + TColStd_SequenceOfReal Params; + for(; i0.9999 ) continue; + int j=1; + bool IsExist = false; + for(; j<=Params.Length(); j++) { + if( fabs(aPnts[i]-Params.Value(j)) < 1e-4 ) { + IsExist = true; + break; + } + if( aPnts[i] _vvalue[1]; diff --git a/src/StdMeshersGUI/Makefile.am b/src/StdMeshersGUI/Makefile.am index 7415bc74b..fbc244b0f 100644 --- a/src/StdMeshersGUI/Makefile.am +++ b/src/StdMeshersGUI/Makefile.am @@ -36,7 +36,7 @@ salomeinclude_HEADERS = \ StdMeshersGUI_NbSegmentsCreator.h \ StdMeshersGUI_ObjectReferenceParamWdg.h \ StdMeshersGUI_LayerDistributionParamWdg.h \ - StdMeshersGUI_EdgeDirectionParamWdg.h \ + StdMeshersGUI_FixedPointsParamWdg.h \ StdMeshersGUI_SubShapeSelectorWdg.h # Libraries targets @@ -49,7 +49,7 @@ dist_libStdMeshersGUI_la_SOURCES = \ StdMeshersGUI_NbSegmentsCreator.cxx \ StdMeshersGUI_ObjectReferenceParamWdg.cxx \ StdMeshersGUI_LayerDistributionParamWdg.cxx \ - StdMeshersGUI_EdgeDirectionParamWdg.cxx \ + StdMeshersGUI_FixedPointsParamWdg.cxx \ StdMeshersGUI_SubShapeSelectorWdg.cxx MOC_FILES = \ @@ -59,7 +59,7 @@ MOC_FILES = \ StdMeshersGUI_NbSegmentsCreator_moc.cxx \ StdMeshersGUI_ObjectReferenceParamWdg_moc.cxx \ StdMeshersGUI_LayerDistributionParamWdg_moc.cxx \ - StdMeshersGUI_EdgeDirectionParamWdg_moc.cxx \ + StdMeshersGUI_FixedPointsParamWdg_moc.cxx \ StdMeshersGUI_SubShapeSelectorWdg_moc.cxx nodist_libStdMeshersGUI_la_SOURCES= \ diff --git a/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx new file mode 100644 index 000000000..51685c370 --- /dev/null +++ b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx @@ -0,0 +1,374 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// File : StdMeshersGUI_FixedPointsParamWdg.cxx +// Author : Open CASCADE S.A.S. +// SMESH includes +// +#include "StdMeshersGUI_FixedPointsParamWdg.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SPACING 6 +#define MARGIN 0 +#define SAME_TEXT "-/-" + +/* + * function : Tree Widget Item Delegate + * purpose : Custom item delegate + */ + +class StdMeshersGUI_FixedPointsParamWdg::LineDelegate : public QItemDelegate +{ +public: + LineDelegate( QTreeWidget* ); + ~LineDelegate() {} + + QWidget* createEditor( QWidget*, const QStyleOptionViewItem&, const QModelIndex& ) const; + void setModelData( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index ) const; + +private: + QTreeWidget* myTreeWidget; +}; + +StdMeshersGUI_FixedPointsParamWdg::LineDelegate::LineDelegate( QTreeWidget* parent ) + : QItemDelegate( parent ), + myTreeWidget( parent ) +{ +} + +QWidget* StdMeshersGUI_FixedPointsParamWdg::LineDelegate::createEditor( QWidget* parent, + const QStyleOptionViewItem& option, + const QModelIndex& index ) const +{ + QWidget* w = 0; + if ( (index.column() == 1 ) ) { + QSpinBox* sb = new QSpinBox( parent ); + sb->setFrame( false ); + sb->setRange( 1, 999); + w = sb; + } + + return w; +} + +void StdMeshersGUI_FixedPointsParamWdg::LineDelegate::setModelData( QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index ) const +{ + model->setData( index, qobject_cast( editor )->value(), Qt::EditRole ); + model->setData( index, qobject_cast( editor )->value(), Qt::UserRole ); +} + +//================================================================================ +/*! + * Constructor + */ +//================================================================================ + +StdMeshersGUI_FixedPointsParamWdg +::StdMeshersGUI_FixedPointsParamWdg( QWidget * parent ): + QWidget( parent ) +{ + QGridLayout* edgesLayout = new QGridLayout( this ); + edgesLayout->setMargin( MARGIN ); + edgesLayout->setSpacing( SPACING ); + + myListWidget = new QListWidget( this ); + myTreeWidget = new QTreeWidget( this ); + mySpinBox = new QDoubleSpinBox( this ); + myAddButton = new QPushButton( tr( "SMESH_BUT_ADD" ), this ); + myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this ); + mySameValues = new QCheckBox( tr("SMESH_SAME_NB_SEGMENTS"), this); + + myListWidget->setSelectionMode( QListWidget::ExtendedSelection ); + + myTreeWidget->setColumnCount(2); + myTreeWidget->setHeaderLabels( QStringList() << tr( "SMESH_RANGE" ) << tr( "SMESH_NB_SEGMENTS" ) ); + myTreeWidget->setColumnWidth( 1, 40 ); + myTreeWidget->setColumnWidth( 2, 30 ); + myTreeWidget->setItemDelegate( new LineDelegate( myTreeWidget ) ); + + edgesLayout->addWidget(myListWidget, 0, 0, 4, 1); + edgesLayout->addWidget(mySpinBox, 0, 1); + edgesLayout->addWidget(myAddButton, 1, 1); + edgesLayout->addWidget(myRemoveButton, 2, 1); + edgesLayout->addWidget(myTreeWidget, 0, 2, 4, 1); + edgesLayout->addWidget(mySameValues, 4, 0, 1, 3); + edgesLayout->setRowStretch( 3, 5 ); + edgesLayout->setColumnStretch(0, 1); + edgesLayout->setColumnStretch(1, 0); + edgesLayout->setColumnStretch(2, 2); + + myListWidget->setMinimumWidth( 80 ); + myTreeWidget->setMinimumWidth( 200 ); + + mySpinBox->setRange( 0, 1 ); + mySpinBox->setSingleStep( 0.1 ); + + connect( myAddButton, SIGNAL(clicked()), SLOT(onAdd())); + connect( myRemoveButton, SIGNAL(clicked()), SLOT(onRemove())); + connect( mySameValues, SIGNAL(stateChanged(int)), SLOT(onCheckBoxChanged())); + myListWidget->installEventFilter( this ); + + clear(); +} + +//================================================================================ +/*! + * Destructor + */ +//================================================================================ + +StdMeshersGUI_FixedPointsParamWdg::~StdMeshersGUI_FixedPointsParamWdg() +{ +} + +//================================================================================ +/*! + * Event filter + */ +//================================================================================ +bool StdMeshersGUI_FixedPointsParamWdg::eventFilter( QObject* o, QEvent* e ) +{ + if ( o == myListWidget && e->type() == QEvent::KeyPress ) { + QKeyEvent* ke = (QKeyEvent*)e; + if ( ke->key() == Qt::Key_Delete ) + removePoints(); + } + return QWidget::eventFilter( o, e ); +} + +//================================================================================ +/*! + * Clear widget + */ +//================================================================================ +void StdMeshersGUI_FixedPointsParamWdg::clear() +{ + myTreeWidget->clear(); + myListWidget->clear(); + myTreeWidget->addTopLevelItem( newTreeItem( 0, 1 ) ); + mySpinBox->setValue( 0. ); + onCheckBoxChanged(); +} + +//================================================================================= +// function : onAdd() +// purpose : Called when Add Button Clicked +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::onAdd() +{ + addPoint( mySpinBox->value() ); +} + +//================================================================================= +// function : onRemove() +// purpose : Called when Remove Button Clicked +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::onRemove() +{ + removePoints(); +} + +//================================================================================= +// function : newTreeItem() +// purpose : Called to create TreeItem +//================================================================================= + +QTreeWidgetItem* StdMeshersGUI_FixedPointsParamWdg::newTreeItem( double v1, double v2 ) +{ + QTreeWidgetItem* anItem = new QTreeWidgetItem(); + anItem->setText( 0, treeItemText( v1, v2 ) ); + anItem->setText( 1, QString::number( 1 ) ); + anItem->setData( 1, Qt::UserRole, 1 ); + return anItem; +} + +//================================================================================= +// function : newListItem() +// purpose : Called to create ListItem +//================================================================================= + +QListWidgetItem* StdMeshersGUI_FixedPointsParamWdg::newListItem( double v ) +{ + QListWidgetItem* anItem = new QListWidgetItem( QString::number( v ) ); + anItem->setData( Qt::UserRole, v ); + return anItem; +} + +//================================================================================= +// function : itemText() +// purpose : Called to convert Values to Text +//================================================================================= + +QString StdMeshersGUI_FixedPointsParamWdg::treeItemText( double v1, double v2 ) +{ + return QString( "%1 - %2" ).arg( v1 ).arg( v2 ); +} + +//================================================================================= +// function : addPoint() +// purpose : Called to Add new Point +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::addPoint( double v) +{ + if ( v > 0 && v < 1) { + bool toInsert = true; + int idx = myTreeWidget->topLevelItemCount()-1; + for ( int i = 0 ; i < myListWidget->count(); i++ ) { + double lv = point( i ); + if ( lv == v ) { toInsert = false; break; } + else if ( lv > v ) { + idx = i; break; + } + } + if ( toInsert ) { + double v1 = idx == 0 ? 0 : point( idx-1 ); + double v2 = idx == myTreeWidget->topLevelItemCount()-1 ? 1 : point( idx ); + myTreeWidget->insertTopLevelItem( idx, newTreeItem( v1, v ) ); + myTreeWidget->topLevelItem( idx+1 )->setText( 0, treeItemText( v, v2 ) ); + myListWidget->insertItem( idx, newListItem( v ) ); + onCheckBoxChanged(); + } + } +} + +//================================================================================= +// function : removePoints() +// purpose : Called to remove selected points +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::removePoints() +{ + QList selItems = myListWidget->selectedItems(); + QListWidgetItem* item; + foreach ( item, selItems ) { + int idx = myListWidget->row( item ); + delete myTreeWidget->topLevelItem( idx ); + delete item; + myTreeWidget->topLevelItem( idx )->setText( 0, treeItemText( idx == 0 ? 0 : point( idx-1 ), + idx > myListWidget->count()-1 ? 1 : point( idx ) ) ); + } + onCheckBoxChanged(); +} + +double StdMeshersGUI_FixedPointsParamWdg::point( int idx ) const +{ + return idx >= 0 && idx < myListWidget->count() ? myListWidget->item( idx )->data( Qt::UserRole ).toDouble() : 0.; +} + +void StdMeshersGUI_FixedPointsParamWdg::setNbSegments( int idx, int val ) +{ + if ( idx >= 0 && idx < myTreeWidget->topLevelItemCount() ) { + myTreeWidget->topLevelItem( idx )->setData( 1, Qt::UserRole, val ); + myTreeWidget->topLevelItem( idx )->setText( 1, idx > 0 && mySameValues->isChecked() ? QString( SAME_TEXT ) : QString::number( val ) ); + } +} + +int StdMeshersGUI_FixedPointsParamWdg::nbSegments( int idx ) const +{ + return idx >= 0 && idx < myTreeWidget->topLevelItemCount() ? myTreeWidget->topLevelItem( idx )->data( 1, Qt::UserRole ).toInt() : 1; +} + +//================================================================================= +// function : onCheckBoxChanged() +// purpose : Called when Check Box Clicked +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::onCheckBoxChanged() +{ + for ( int i = 0; i < myTreeWidget->topLevelItemCount(); i++ ) { + QTreeWidgetItem* anItem = myTreeWidget->topLevelItem(i); + setNbSegments( i, nbSegments( i ) ); + anItem->setFlags( mySameValues->isChecked() && i > 0 ? anItem->flags() & ~Qt::ItemIsEditable : anItem->flags() | Qt::ItemIsEditable ); + } +} + +//================================================================================= +// function : GetListOfPoints +// purpose : Called to get the list of Edges IDs +//================================================================================= +SMESH::double_array_var StdMeshersGUI_FixedPointsParamWdg::GetListOfPoints() +{ + SMESH::double_array_var anArray = new SMESH::double_array; + int size = myListWidget->count(); + anArray->length( size ); + for (int i = 0; i < size; i++) { + anArray[i] = point(i); + // printf ("Point %f \n", anArray[i]); + } + return anArray; +} + +//================================================================================= +// function : SetListOfPoints +// purpose : Called to set the list of Points +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::SetListOfPoints( SMESH::double_array_var thePoints) +{ + clear(); + for ( int i = 0; i < thePoints->length(); i++ ) { + addPoint( thePoints[ i ] ); + // printf ("Add Point %f \n", thePoints[ i ]); + } +} + +//================================================================================= +// function : GetListOfSegments +// purpose : Called to get the list Number of Segments +//================================================================================= +SMESH::long_array_var StdMeshersGUI_FixedPointsParamWdg::GetListOfSegments() +{ + SMESH::long_array_var anArray = new SMESH::long_array; + int size = mySameValues->isChecked() ? 1 : myTreeWidget->topLevelItemCount(); + anArray->length( size ); + for (int i = 0; i < size; i++) { + anArray[i] = nbSegments( i ); + // printf ("Segments %d \n", anArray[i] ); + } + return anArray; +} + +//================================================================================= +// function : SetListOfPoints +// purpose : Called to set the list of Points +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::SetListOfSegments( SMESH::long_array_var theSegments) +{ + if ( myListWidget->count() > 0 && theSegments->length() == 1) + mySameValues->setChecked(true); + for ( int i = 0; i < theSegments->length(); i++ ) { + setNbSegments( i, theSegments[i] ); + // printf ("\nadd Segment = %d\n", theSegments[i]); + } +} diff --git a/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h new file mode 100644 index 000000000..b96806de4 --- /dev/null +++ b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h @@ -0,0 +1,93 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// File : StdMeshersGUI_FixedPointsParamWdg.h +// Author : Open CASCADE S.A.S. (dmv) +// +#ifndef STDMESHERSGUI_FIXEDPOINTSPARAMWGD_H +#define STDMESHERSGUI_FIXEDPOINTSPARAMWGD_H + +// SMESH includes +#include +#include "SMESH_StdMeshersGUI.hxx" + +// Qt includes +#include +#include + +class SMESHGUI; +class QPushButton; +class QLineEdit; +class QCheckBox; +class QDoubleSpinBox; +class QListWidget; +class QListWidgetItem; +class QTreeWidget; +class QTreeWidgetItem; + +class STDMESHERSGUI_EXPORT StdMeshersGUI_FixedPointsParamWdg : public QWidget +{ + Q_OBJECT + + class LineDelegate; + +public: + StdMeshersGUI_FixedPointsParamWdg( QWidget* parent = 0 ); + ~StdMeshersGUI_FixedPointsParamWdg(); + + bool eventFilter( QObject*, QEvent* ); + + SMESH::double_array_var GetListOfPoints(); + void SetListOfPoints( SMESH::double_array_var ); + + SMESH::long_array_var GetListOfSegments(); + void SetListOfSegments( SMESH::long_array_var ); + + QString GetValue() const { return myParamValue; } + +private slots: + void onAdd(); + void onRemove(); + void onCheckBoxChanged(); + +private: + void clear(); + void addPoint( double ); + void removePoints(); + double point( int ) const; + void setNbSegments( int, int ); + int nbSegments( int ) const; + + static QTreeWidgetItem* newTreeItem( double v1, double v2 ); + static QListWidgetItem* newListItem( double v1 ); + static QString treeItemText( double v1, double v2 ); + +private: + QListWidget* myListWidget; + QTreeWidget* myTreeWidget; + QDoubleSpinBox* mySpinBox; + QPushButton* myAddButton; + QPushButton* myRemoveButton; + QCheckBox* mySameValues; + QString myParamValue; +}; + +#endif // STDMESHERSGUI_FIXEDPOINTSPARAMWGD_H diff --git a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx index 43563ea45..35231586d 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx @@ -33,8 +33,8 @@ #include #include "StdMeshersGUI_ObjectReferenceParamWdg.h" #include "StdMeshersGUI_LayerDistributionParamWdg.h" -//#include "StdMeshersGUI_EdgeDirectionParamWdg.h" #include "StdMeshersGUI_SubShapeSelectorWdg.h" +#include "StdMeshersGUI_FixedPointsParamWdg.h" #include // SALOME GUI includes @@ -200,9 +200,9 @@ namespace { QHBoxLayout* aHBoxL = new QHBoxLayout(this); if ( !leftLabel.isEmpty() ) { - QLabel* aLeftLabel = new QLabel( this ); - aLeftLabel->setText( leftLabel ); - aHBoxL->addWidget( aLeftLabel ); + QLabel* aLeftLabel = new QLabel( this ); + aLeftLabel->setText( leftLabel ); + aHBoxL->addWidget( aLeftLabel ); } _slider = new QSlider( Qt::Horizontal, this ); @@ -211,9 +211,9 @@ namespace { aHBoxL->addWidget( _slider ); if ( !rightLabel.isEmpty() ) { - QLabel* aRightLabel = new QLabel( this ); - aRightLabel->setText( rightLabel ); - aHBoxL->addWidget( aRightLabel ); + QLabel* aRightLabel = new QLabel( this ); + aRightLabel->setText( rightLabel ); + aHBoxL->addWidget( aRightLabel ); } setLayout( aHBoxL ); @@ -378,7 +378,7 @@ bool StdMeshersGUI_StdHypothesisCreator::checkParams( QString& msg ) const if ( ok ) deactivateObjRefParamWdg( customWidgets() ); } - else if ( hypType() == "LayerDistribution" ) + else if ( hypType() == "LayerDistribution" || hypType() == "LayerDistribution2D" ) { StdMeshersGUI_LayerDistributionParamWdg* w = widget< StdMeshersGUI_LayerDistributionParamWdg >( 0 ); @@ -412,7 +412,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const if( hypType()=="LocalLength" ) { StdMeshers::StdMeshers_LocalLength_var h = - StdMeshers::StdMeshers_LocalLength::_narrow( hypothesis() ); + StdMeshers::StdMeshers_LocalLength::_narrow( hypothesis() ); h->SetLength( params[0].myValue.toDouble() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); @@ -422,7 +422,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="MaxLength" ) { StdMeshers::StdMeshers_MaxLength_var h = - StdMeshers::StdMeshers_MaxLength::_narrow( hypothesis() ); + StdMeshers::StdMeshers_MaxLength::_narrow( hypothesis() ); h->SetLength( params[0].myValue.toDouble() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); @@ -436,7 +436,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="SegmentLengthAroundVertex" ) { StdMeshers::StdMeshers_SegmentLengthAroundVertex_var h = - StdMeshers::StdMeshers_SegmentLengthAroundVertex::_narrow( hypothesis() ); + StdMeshers::StdMeshers_SegmentLengthAroundVertex::_narrow( hypothesis() ); h->SetLength( params[0].myValue.toDouble() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); @@ -444,10 +444,8 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="Arithmetic1D" ) { StdMeshers::StdMeshers_Arithmetic1D_var h = - StdMeshers::StdMeshers_Arithmetic1D::_narrow( hypothesis() ); + StdMeshers::StdMeshers_Arithmetic1D::_narrow( hypothesis() ); - //StdMeshersGUI_EdgeDirectionParamWdg* w = - // widget< StdMeshersGUI_EdgeDirectionParamWdg >( 2 ); StdMeshersGUI_SubShapeSelectorWdg* w = widget< StdMeshersGUI_SubShapeSelectorWdg >( 2 ); @@ -456,22 +454,44 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const h->SetEndLength( params[1].myValue.toDouble() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); if (w) { - h->SetReversedEdges( w->GetListOfIDs() ); - const char * entry = w->GetMainShapeEntry(); - h->SetObjectEntry( entry ); + h->SetReversedEdges( w->GetListOfIDs() ); + const char * entry = w->GetMainShapeEntry(); + h->SetObjectEntry( entry ); + } + } + else if( hypType()=="FixedPoints1D" ) + { + StdMeshers::StdMeshers_FixedPoints1D_var h = + StdMeshers::StdMeshers_FixedPoints1D::_narrow( hypothesis() ); + + StdMeshersGUI_FixedPointsParamWdg* w1 = + widget< StdMeshersGUI_FixedPointsParamWdg >( 0 ); + + StdMeshersGUI_SubShapeSelectorWdg* w2 = + widget< StdMeshersGUI_SubShapeSelectorWdg >( 1 ); + + if (w1) { + h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetPoints( w1->GetListOfPoints() ); + h->SetNbSegments( w1->GetListOfSegments() ); + } + if (w2) { + h->SetReversedEdges( w2->GetListOfIDs() ); + const char * entry = w2->GetMainShapeEntry(); + h->SetObjectEntry( entry ); } } else if( hypType()=="MaxElementArea" ) { StdMeshers::StdMeshers_MaxElementArea_var h = - StdMeshers::StdMeshers_MaxElementArea::_narrow( hypothesis() ); + StdMeshers::StdMeshers_MaxElementArea::_narrow( hypothesis() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); h->SetMaxElementArea( params[0].myValue.toDouble() ); } else if( hypType()=="MaxElementVolume" ) { StdMeshers::StdMeshers_MaxElementVolume_var h = - StdMeshers::StdMeshers_MaxElementVolume::_narrow( hypothesis() ); + StdMeshers::StdMeshers_MaxElementVolume::_narrow( hypothesis() ); h->SetMaxElementVolume( params[0].myValue.toDouble() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); @@ -479,7 +499,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="StartEndLength" ) { StdMeshers::StdMeshers_StartEndLength_var h = - StdMeshers::StdMeshers_StartEndLength::_narrow( hypothesis() ); + StdMeshers::StdMeshers_StartEndLength::_narrow( hypothesis() ); StdMeshersGUI_SubShapeSelectorWdg* w = widget< StdMeshersGUI_SubShapeSelectorWdg >( 2 ); @@ -489,28 +509,28 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const h->SetEndLength( params[1].myValue.toDouble() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); if (w) { - h->SetReversedEdges( w->GetListOfIDs() ); - h->SetObjectEntry( w->GetMainShapeEntry() ); + h->SetReversedEdges( w->GetListOfIDs() ); + h->SetObjectEntry( w->GetMainShapeEntry() ); } } else if( hypType()=="Deflection1D" ) { StdMeshers::StdMeshers_Deflection1D_var h = - StdMeshers::StdMeshers_Deflection1D::_narrow( hypothesis() ); + StdMeshers::StdMeshers_Deflection1D::_narrow( hypothesis() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); h->SetDeflection( params[0].myValue.toDouble() ); } else if( hypType()=="AutomaticLength" ) { StdMeshers::StdMeshers_AutomaticLength_var h = - StdMeshers::StdMeshers_AutomaticLength::_narrow( hypothesis() ); + StdMeshers::StdMeshers_AutomaticLength::_narrow( hypothesis() ); h->SetFineness( params[0].myValue.toDouble() ); } else if( hypType()=="NumberOfLayers" ) { StdMeshers::StdMeshers_NumberOfLayers_var h = - StdMeshers::StdMeshers_NumberOfLayers::_narrow( hypothesis() ); + StdMeshers::StdMeshers_NumberOfLayers::_narrow( hypothesis() ); h->SetNumberOfLayers( params[0].myValue.toInt() ); h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); @@ -518,7 +538,26 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="LayerDistribution" ) { StdMeshers::StdMeshers_LayerDistribution_var h = - StdMeshers::StdMeshers_LayerDistribution::_narrow( hypothesis() ); + StdMeshers::StdMeshers_LayerDistribution::_narrow( hypothesis() ); + StdMeshersGUI_LayerDistributionParamWdg* w = + widget< StdMeshersGUI_LayerDistributionParamWdg >( 0 ); + + h->SetLayerDistribution( w->GetHypothesis() ); + h->SetParameters(w->GetHypothesis()->GetParameters()); + w->GetHypothesis()->ClearParameters(); + } + else if( hypType()=="NumberOfLayers2D" ) + { + StdMeshers::StdMeshers_NumberOfLayers2D_var h = + StdMeshers::StdMeshers_NumberOfLayers2D::_narrow( hypothesis() ); + + h->SetNumberOfLayers( params[0].myValue.toInt() ); + h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + } + else if( hypType()=="LayerDistribution2D" ) + { + StdMeshers::StdMeshers_LayerDistribution2D_var h = + StdMeshers::StdMeshers_LayerDistribution2D::_narrow( hypothesis() ); StdMeshersGUI_LayerDistributionParamWdg* w = widget< StdMeshersGUI_LayerDistributionParamWdg >( 0 ); @@ -529,7 +568,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="ProjectionSource1D" ) { StdMeshers::StdMeshers_ProjectionSource1D_var h = - StdMeshers::StdMeshers_ProjectionSource1D::_narrow( hypothesis() ); + StdMeshers::StdMeshers_ProjectionSource1D::_narrow( hypothesis() ); h->SetSourceEdge ( geomFromWdg ( getWidgetForParam( 0 ))); h->SetSourceMesh ( meshFromWdg ( getWidgetForParam( 1 ))); @@ -539,7 +578,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="ProjectionSource2D" ) { StdMeshers::StdMeshers_ProjectionSource2D_var h = - StdMeshers::StdMeshers_ProjectionSource2D::_narrow( hypothesis() ); + StdMeshers::StdMeshers_ProjectionSource2D::_narrow( hypothesis() ); h->SetSourceFace ( geomFromWdg ( getWidgetForParam( 0 ))); h->SetSourceMesh ( meshFromWdg ( getWidgetForParam( 1 ))); @@ -551,7 +590,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="ProjectionSource3D" ) { StdMeshers::StdMeshers_ProjectionSource3D_var h = - StdMeshers::StdMeshers_ProjectionSource3D::_narrow( hypothesis() ); + StdMeshers::StdMeshers_ProjectionSource3D::_narrow( hypothesis() ); h->SetSource3DShape ( geomFromWdg ( getWidgetForParam( 0 ))); h->SetSourceMesh ( meshFromWdg ( getWidgetForParam( 1 ))); @@ -563,15 +602,15 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const else if( hypType()=="QuadrangleParams" ) { StdMeshers::StdMeshers_QuadrangleParams_var h = - StdMeshers::StdMeshers_QuadrangleParams::_narrow( hypothesis() ); + StdMeshers::StdMeshers_QuadrangleParams::_narrow( hypothesis() ); StdMeshersGUI_SubShapeSelectorWdg* w = widget< StdMeshersGUI_SubShapeSelectorWdg >( 0 ); if (w) { - if( w->GetListOfIDs()->length()>0 ) { - h->SetTriaVertex( w->GetListOfIDs()[0] ); - } - const char * entry = w->GetMainShapeEntry(); - h->SetObjectEntry( entry ); + if( w->GetListOfIDs()->length()>0 ) { + h->SetTriaVertex( w->GetListOfIDs()[0] ); + } + const char * entry = w->GetMainShapeEntry(); + h->SetObjectEntry( entry ); } } } @@ -692,11 +731,9 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const customWidgets()->append (0); - item.myName = tr( "SMESH_REVERCE_EDGES" ); + item.myName = tr( "SMESH_REVERSED_EDGES" ); p.append( item ); - //StdMeshersGUI_EdgeDirectionParamWdg* aDirectionWidget = - // new StdMeshersGUI_EdgeDirectionParamWdg(); StdMeshersGUI_SubShapeSelectorWdg* aDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg(); QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); @@ -707,6 +744,40 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const aDirectionWidget->showPreview( true ); customWidgets()->append ( aDirectionWidget ); } + + + else if( hypType()=="FixedPoints1D" ) + { + StdMeshers::StdMeshers_FixedPoints1D_var h = + StdMeshers::StdMeshers_FixedPoints1D::_narrow( hyp ); + + item.myName = tr( "SMESH_FIXED_POINTS" ); + p.append( item ); + + StdMeshersGUI_FixedPointsParamWdg* aFixedPointsWidget = + new StdMeshersGUI_FixedPointsParamWdg(); + + if ( !isCreation() ) { + aFixedPointsWidget->SetListOfPoints( h->GetPoints() ); + aFixedPointsWidget->SetListOfSegments( h->GetNbSegments() ); + } + customWidgets()->append( aFixedPointsWidget ); + + item.myName = tr( "SMESH_REVERSED_EDGES" ); + p.append( item ); + + StdMeshersGUI_SubShapeSelectorWdg* aDirectionWidget = + new StdMeshersGUI_SubShapeSelectorWdg(); + QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); + if ( anEntry == "" ) + anEntry = h->GetObjectEntry(); + aDirectionWidget->SetMainShapeEntry( anEntry ); + aDirectionWidget->SetListOfIDs( h->GetReversedEdges() ); + aDirectionWidget->showPreview( true ); + customWidgets()->append ( aDirectionWidget ); + } + + else if( hypType()=="MaxElementArea" ) { StdMeshers::StdMeshers_MaxElementArea_var h = @@ -746,11 +817,9 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const p.append( item ); customWidgets()->append(0); - item.myName = tr( "SMESH_REVERCE_EDGES" ); + item.myName = tr( "SMESH_REVERSED_EDGES" ); p.append( item ); - //StdMeshersGUI_EdgeDirectionParamWdg* aDirectionWidget = - // new StdMeshersGUI_EdgeDirectionParamWdg(); StdMeshersGUI_SubShapeSelectorWdg* aDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg(); QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); @@ -793,10 +862,35 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const item.myValue = (int) h->GetNumberOfLayers(); p.append( item ); } - else if( hypType()=="LayerDistribution" ) - { - StdMeshers::StdMeshers_LayerDistribution_var h = + else if( hypType()=="LayerDistribution" ) { + StdMeshers::StdMeshers_LayerDistribution_var h = StdMeshers::StdMeshers_LayerDistribution::_narrow( hyp ); + + item.myName = tr( "SMESH_LAYERS_DISTRIBUTION" ); p.append( item ); + + //Set into not published hypo last variables + QStringList aLastVarsList; + for(int i = 0;ilength();i++) + aLastVarsList.append(QString(aParameters[i].in())); + + if(!aLastVarsList.isEmpty()) + h->GetLayerDistribution()->SetLastParameters(SMESHGUI::JoinObjectParameters(aLastVarsList)); + + customWidgets()->append + ( new StdMeshersGUI_LayerDistributionParamWdg( h->GetLayerDistribution(), hypName(), dlg())); + } + else if( hypType()=="NumberOfLayers2D" ) { + StdMeshers::StdMeshers_NumberOfLayers2D_var h = + StdMeshers::StdMeshers_NumberOfLayers2D::_narrow( hyp ); + + item.myName = tr( "SMESH_NUMBER_OF_LAYERS" ); + if(!initVariableName(aParameters,item,0)) + item.myValue = (int) h->GetNumberOfLayers(); + p.append( item ); + } + else if( hypType()=="LayerDistribution2D" ) { + StdMeshers::StdMeshers_LayerDistribution2D_var h = + StdMeshers::StdMeshers_LayerDistribution2D::_narrow( hyp ); item.myName = tr( "SMESH_LAYERS_DISTRIBUTION" ); p.append( item ); @@ -1015,12 +1109,15 @@ QString StdMeshersGUI_StdHypothesisCreator::hypTypeName( const QString& t ) cons types.insert( "StartEndLength", "START_END_LENGTH" ); types.insert( "Deflection1D", "DEFLECTION1D" ); types.insert( "Arithmetic1D", "ARITHMETIC_1D" ); + types.insert( "FixedPoints1D", "FIXED_POINTS_1D" ); types.insert( "AutomaticLength", "AUTOMATIC_LENGTH" ); types.insert( "ProjectionSource1D", "PROJECTION_SOURCE_1D" ); types.insert( "ProjectionSource2D", "PROJECTION_SOURCE_2D" ); types.insert( "ProjectionSource3D", "PROJECTION_SOURCE_3D" ); types.insert( "NumberOfLayers", "NUMBER_OF_LAYERS" ); types.insert( "LayerDistribution", "LAYER_DISTRIBUTION" ); + types.insert( "NumberOfLayers2D", "NUMBER_OF_LAYERS" ); + types.insert( "LayerDistribution2D", "LAYER_DISTRIBUTION" ); types.insert( "SegmentLengthAroundVertex", "SEGMENT_LENGTH_AROUND_VERTEX" ); types.insert( "MaxLength", "MAX_LENGTH" ); types.insert( "QuadrangleParams", "QUADRANGLE_PARAMS" ); @@ -1096,13 +1193,6 @@ bool StdMeshersGUI_StdHypothesisCreator::getParamFromCustomWidget( StdParam & pa param.myValue = w->GetValue(); return true; } - //if ( widget->inherits( "StdMeshersGUI_EdgeDirectionParamWdg" )) - //{ - // const StdMeshersGUI_EdgeDirectionParamWdg * w = - // static_cast( widget ); - // param.myValue = w->GetValue(); - // return true; - //} if ( widget->inherits( "StdMeshersGUI_SubShapeSelectorWdg" )) { const StdMeshersGUI_SubShapeSelectorWdg * w = @@ -1110,6 +1200,13 @@ bool StdMeshersGUI_StdHypothesisCreator::getParamFromCustomWidget( StdParam & pa param.myValue = w->GetValue(); return true; } + if ( widget->inherits( "StdMeshersGUI_FixedPointsParamWdg" )) + { + const StdMeshersGUI_FixedPointsParamWdg * w = + static_cast( widget ); + param.myValue = w->GetValue(); + return true; + } return false; } diff --git a/src/StdMeshersGUI/StdMeshers_images.ts b/src/StdMeshersGUI/StdMeshers_images.ts index cb63c4f18..7dc80991b 100644 --- a/src/StdMeshersGUI/StdMeshers_images.ts +++ b/src/StdMeshersGUI/StdMeshers_images.ts @@ -29,6 +29,10 @@ ICON_DLG_ARITHMETIC_1D mesh_hypo_length.png + + ICON_DLG_FIXED_POINTS_1D + mesh_hypo_length.png + ICON_DLG_AUTOMATIC_LENGTH mesh_hypo_length.png diff --git a/src/StdMeshersGUI/StdMeshers_msg_en.ts b/src/StdMeshersGUI/StdMeshers_msg_en.ts index e49d525e8..caabb7f54 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_en.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_en.ts @@ -149,6 +149,14 @@ SMESH_LOCAL_LENGTH_TITLE Hypothesis Construction + + SMESH_FIXED_POINTS_1D_HYPOTHESIS + Fixed points 1D + + + SMESH_FIXED_POINTS_1D_TITLE + Hypothesis Construction + SMESH_MAX_LENGTH_HYPOTHESIS Max Length @@ -246,8 +254,24 @@ Remove row - SMESH_REVERCE_EDGES - Reverce Edges + SMESH_REVERSED_EDGES + Reversed Edges + + + SMESH_FIXED_POINTS + Fixed Points + + + SMESH_RANGE + Range + + + SMESH_NB_SEGMENTS + Nb. Segments + + + SMESH_SAME_NB_SEGMENTS + Same Nb. Segments for All Intervals SMESH_BASE_VERTEX diff --git a/src/StdMeshers_I/Makefile.am b/src/StdMeshers_I/Makefile.am index 94ed920c8..d1068d1d6 100644 --- a/src/StdMeshers_I/Makefile.am +++ b/src/StdMeshers_I/Makefile.am @@ -32,6 +32,7 @@ salomeinclude_HEADERS = \ StdMeshers_LocalLength_i.hxx \ StdMeshers_StartEndLength_i.hxx \ StdMeshers_Arithmetic1D_i.hxx \ + StdMeshers_FixedPoints1D_i.hxx \ StdMeshers_NumberOfSegments_i.hxx \ StdMeshers_Deflection1D_i.hxx \ StdMeshers_Propagation_i.hxx \ @@ -47,6 +48,7 @@ salomeinclude_HEADERS = \ StdMeshers_QuadranglePreference_i.hxx \ StdMeshers_QuadraticMesh_i.hxx \ StdMeshers_NumberOfLayers_i.hxx \ + StdMeshers_NumberOfLayers2D_i.hxx \ StdMeshers_Prism_3D_i.hxx \ StdMeshers_ProjectionSource1D_i.hxx \ StdMeshers_ProjectionSource2D_i.hxx \ @@ -54,6 +56,7 @@ salomeinclude_HEADERS = \ StdMeshers_Projection_1D_2D_3D_i.hxx \ StdMeshers_ObjRefUlils.hxx \ StdMeshers_LayerDistribution_i.hxx \ + StdMeshers_LayerDistribution2D_i.hxx \ StdMeshers_CompositeSegment_1D_i.hxx \ StdMeshers_SegmentAroundVertex_0D_i.hxx \ StdMeshers_SegmentLengthAroundVertex_i.hxx \ @@ -61,6 +64,7 @@ salomeinclude_HEADERS = \ StdMeshers_TrianglePreference_i.hxx \ StdMeshers_MaxLength_i.hxx \ StdMeshers_QuadrangleParams_i.hxx \ + StdMeshers_RadialQuadrangle_1D2D_i.hxx \ SMESH_StdMeshers_I.hxx # Libraries targets @@ -71,6 +75,7 @@ dist_libStdMeshersEngine_la_SOURCES = \ StdMeshers_LocalLength_i.cxx \ StdMeshers_StartEndLength_i.cxx \ StdMeshers_Arithmetic1D_i.cxx \ + StdMeshers_FixedPoints1D_i.cxx \ StdMeshers_NumberOfSegments_i.cxx \ StdMeshers_Deflection1D_i.cxx \ StdMeshers_Propagation_i.cxx \ @@ -86,6 +91,7 @@ dist_libStdMeshersEngine_la_SOURCES = \ StdMeshers_QuadranglePreference_i.cxx \ StdMeshers_QuadraticMesh_i.cxx \ StdMeshers_NumberOfLayers_i.cxx \ + StdMeshers_NumberOfLayers2D_i.cxx \ StdMeshers_Prism_3D_i.cxx \ StdMeshers_ProjectionSource1D_i.cxx \ StdMeshers_ProjectionSource2D_i.cxx \ @@ -93,13 +99,15 @@ dist_libStdMeshersEngine_la_SOURCES = \ StdMeshers_Projection_1D_2D_3D_i.cxx \ StdMeshers_ObjRefUlils.cxx \ StdMeshers_LayerDistribution_i.cxx \ + StdMeshers_LayerDistribution2D_i.cxx \ StdMeshers_CompositeSegment_1D_i.cxx \ StdMeshers_SegmentAroundVertex_0D_i.cxx \ StdMeshers_SegmentLengthAroundVertex_i.cxx \ StdMeshers_UseExisting_1D2D_i.cxx \ StdMeshers_TrianglePreference_i.cxx \ StdMeshers_MaxLength_i.cxx \ - StdMeshers_QuadrangleParams_i.cxx + StdMeshers_QuadrangleParams_i.cxx \ + StdMeshers_RadialQuadrangle_1D2D_i.cxx # additionnal information to compil and link file libStdMeshersEngine_la_CPPFLAGS = \ diff --git a/src/StdMeshers_I/StdMeshers_FixedPoints1D_i.cxx b/src/StdMeshers_I/StdMeshers_FixedPoints1D_i.cxx new file mode 100644 index 000000000..e4ff4ac79 --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_FixedPoints1D_i.cxx @@ -0,0 +1,290 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_FixedPoints1D_i.cxx +// Author : Damien COQUERET, OCC +// Module : SMESH +// $Header$ +// +#include "StdMeshers_FixedPoints1D_i.hxx" +#include "SMESH_Gen_i.hxx" +#include "SMESH_Gen.hxx" +#include "SMESH_PythonDump.hxx" + +#include "Utils_CorbaException.hxx" +#include "utilities.h" + +#include + +using namespace std; + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::StdMeshers_FixedPoints1D_i + * + * Constructor + */ +//============================================================================= + +StdMeshers_FixedPoints1D_i::StdMeshers_FixedPoints1D_i( PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl ) + : SALOME::GenericObj_i( thePOA ), + SMESH_Hypothesis_i( thePOA ) +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::StdMeshers_FixedPoints1D_i" ); + myBaseImpl = new ::StdMeshers_FixedPoints1D(theGenImpl->GetANewId(), + theStudyId, + theGenImpl); +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::~StdMeshers_FixedPoints1D_i + * + * Destructor + */ +//============================================================================= + +StdMeshers_FixedPoints1D_i::~StdMeshers_FixedPoints1D_i() +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::~StdMeshers_FixedPoints1D_i" ); +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::SetNbSegments + */ +//============================================================================= + +void StdMeshers_FixedPoints1D_i::SetNbSegments(const SMESH::long_array& listNbSeg) + throw ( SALOME::SALOME_Exception ) +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::SetNbSegments" ); + ASSERT( myBaseImpl ); + try { + std::vector nbsegs( listNbSeg.length() ); + CORBA::Long iEnd = listNbSeg.length(); + for ( CORBA::Long i = 0; i < iEnd; i++ ) + nbsegs[ i ] = listNbSeg[ i ]; + this->GetImpl()->SetNbSegments( nbsegs ); + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), + SALOME::BAD_PARAM ); + } + + // Update Python script + SMESH::TPythonDump() << _this() << ".SetNbSegments( " << listNbSeg << " )"; +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::SetPoints + */ +//============================================================================= + +void StdMeshers_FixedPoints1D_i::SetPoints(const SMESH::double_array& listParams) + throw ( SALOME::SALOME_Exception ) +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::SetPoints" ); + ASSERT( myBaseImpl ); + try { + std::vector params( listParams.length() ); + CORBA::Long iEnd = listParams.length(); + for ( CORBA::Long i = 0; i < iEnd; i++ ) + params[ i ] = listParams[ i ]; + this->GetImpl()->SetPoints( params ); + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), + SALOME::BAD_PARAM ); + } + + // Update Python script + SMESH::TPythonDump() << _this() << ".SetPoints( " << listParams << " )"; +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::GetPoints + * + * Get list of point's parameters + */ +//============================================================================= + +SMESH::double_array* StdMeshers_FixedPoints1D_i::GetPoints() +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::GetPoints" ); + ASSERT( myBaseImpl ); + SMESH::double_array_var anArray = new SMESH::double_array; + std::vector params = this->GetImpl()->GetPoints(); + anArray->length( params.size() ); + for ( CORBA::Long i = 0; i < params.size(); i++) + anArray [ i ] = params [ i ]; + + return anArray._retn(); +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::GetNbSegments + * + * Get list of point's parameters + */ +//============================================================================= + +SMESH::long_array* StdMeshers_FixedPoints1D_i::GetNbSegments() +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::GetNbSegments" ); + ASSERT( myBaseImpl ); + SMESH::long_array_var anArray = new SMESH::long_array; + std::vector nbsegs = this->GetImpl()->GetNbSegments(); + anArray->length( nbsegs.size() ); + for ( CORBA::Long i = 0; i < nbsegs.size(); i++) + anArray [ i ] = nbsegs [ i ]; + + return anArray._retn(); +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::SetReversedEdges + * + * Set edges to reverse + */ +//============================================================================= + +void StdMeshers_FixedPoints1D_i::SetReversedEdges( const SMESH::long_array& theIds ) +{ + ASSERT( myBaseImpl ); + try { + std::vector ids( theIds.length() ); + CORBA::Long iEnd = theIds.length(); + for ( CORBA::Long i = 0; i < iEnd; i++ ) + ids[ i ] = theIds[ i ]; + + this->GetImpl()->SetReversedEdges( ids ); + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), + SALOME::BAD_PARAM ); + } + + // Update Python script + SMESH::TPythonDump() << _this() << ".SetReversedEdges( " << theIds << " )"; +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::SetObjectEntry + * + * Set the Entry for the Main Object + */ +//============================================================================= + +void StdMeshers_FixedPoints1D_i::SetObjectEntry( const char* theEntry ) +{ + ASSERT( myBaseImpl ); + string entry(theEntry); // actually needed as theEntry is spoiled by moment of dumping + try { + this->GetImpl()->SetObjectEntry( entry.c_str() ); + // Update Python script + SMESH::TPythonDump() << _this() << ".SetObjectEntry( \"" << entry.c_str() << "\" )"; + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(),SALOME::BAD_PARAM ); + } +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::GetObjectEntry + * + * Set the Entry for the Main Object + */ +//============================================================================= + +char* StdMeshers_FixedPoints1D_i::GetObjectEntry() +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::SetObjectEntry" ); + ASSERT( myBaseImpl ); + const char* entry; + try { + entry = this->GetImpl()->GetObjectEntry(); + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), + SALOME::BAD_PARAM ); + } + return CORBA::string_dup( entry ); +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::GetReversedEdges + * + * Get reversed edges + */ +//============================================================================= + +SMESH::long_array* StdMeshers_FixedPoints1D_i::GetReversedEdges() +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::GetReversedEdges" ); + ASSERT( myBaseImpl ); + SMESH::long_array_var anArray = new SMESH::long_array; + std::vector ids = this->GetImpl()->GetReversedEdges(); + anArray->length( ids.size() ); + for ( CORBA::Long i = 0; i < ids.size(); i++) + anArray [ i ] = ids [ i ]; + + return anArray._retn(); +} + +//============================================================================= +/*! + * StdMeshers_FixedPoints1D_i::GetImpl + * + * Get implementation + */ +//============================================================================= + +::StdMeshers_FixedPoints1D* StdMeshers_FixedPoints1D_i::GetImpl() +{ + MESSAGE( "StdMeshers_FixedPoints1D_i::GetImpl" ); + return ( ::StdMeshers_FixedPoints1D* )myBaseImpl; +} + +//================================================================================ +/*! + * \brief Verify whether hypothesis supports given entity type + * \param type - dimension (see SMESH::Dimension enumeration) + * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise + * + * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) + */ +//================================================================================ +CORBA::Boolean StdMeshers_FixedPoints1D_i::IsDimSupported( SMESH::Dimension type ) +{ + return type == SMESH::DIM_1D; +} + diff --git a/src/StdMeshers_I/StdMeshers_FixedPoints1D_i.hxx b/src/StdMeshers_I/StdMeshers_FixedPoints1D_i.hxx new file mode 100644 index 000000000..22bfd0b34 --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_FixedPoints1D_i.hxx @@ -0,0 +1,87 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_FixedPoints1D_i.hxx +// Author : Damien COQUERET, OCC +// Module : SMESH +// +#ifndef _SMESH_FIXEDPOINTS1D_I_HXX_ +#define _SMESH_FIXEDPOINTS1D_I_HXX_ + +#include "SMESH_StdMeshers_I.hxx" + +#include +#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) + +#include "SMESH_Hypothesis_i.hxx" +#include "StdMeshers_FixedPoints1D.hxx" + +// ====================================================== +// Fixed points 1D hypothesis +// ====================================================== +class STDMESHERS_I_EXPORT StdMeshers_FixedPoints1D_i: + public virtual POA_StdMeshers::StdMeshers_FixedPoints1D, + public virtual SMESH_Hypothesis_i +{ +public: + // Constructor + StdMeshers_FixedPoints1D_i( PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl ); + // Destructor + virtual ~StdMeshers_FixedPoints1D_i(); + + // Sets some points on edge using parameter on curve from 0 to 1 + // (additionally it is neecessary to check orientation of edges and + // create list of reversed edges if it is needed) and sets numbers + // of segments between given points (default values are equals 1) + void SetPoints(const SMESH::double_array& listParams) + throw ( SALOME::SALOME_Exception ); + void SetNbSegments(const SMESH::long_array& listNbSeg) + throw ( SALOME::SALOME_Exception ); + + // Returns list of point's parameters + SMESH::double_array* GetPoints(); + + // Returns list of numbers of segments + SMESH::long_array* GetNbSegments(); + + //Set Reversed Edges + void SetReversedEdges( const SMESH::long_array& theIDs); + + //Get Reversed Edges + SMESH::long_array* GetReversedEdges(); + + //Set the Entry of the Object + void SetObjectEntry( const char* theEntry); + + //Get Object Entry + char* GetObjectEntry(); + + // Get implementation + ::StdMeshers_FixedPoints1D* GetImpl(); + + // Verify whether hypothesis supports given entity type + CORBA::Boolean IsDimSupported( SMESH::Dimension type ); +}; + +#endif diff --git a/src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.cxx b/src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.cxx new file mode 100644 index 000000000..7ad41bb93 --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.cxx @@ -0,0 +1,95 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes +// File : StdMeshers_LayerDistribution2D_i.cxx +// Author : Edward AGAPOV +// Module : SMESH +// $Header$ +// +#include "StdMeshers_LayerDistribution2D_i.hxx" + +#include "utilities.h" + +//using namespace std; + +//============================================================================= +/*! + * StdMeshers_LayerDistribution2D_i::StdMeshers_LayerDistribution2D_i + * + * Constructor + */ +//============================================================================= + +StdMeshers_LayerDistribution2D_i::StdMeshers_LayerDistribution2D_i + (PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl ) +: StdMeshers_LayerDistribution_i(thePOA,theStudyId,theGenImpl), + SMESH_Hypothesis_i( thePOA ) +{ + MESSAGE( "StdMeshers_LayerDistribution2D_i::StdMeshers_LayerDistribution2D_i" ); + myBaseImpl = new ::StdMeshers_LayerDistribution2D(theGenImpl->GetANewId(), + theStudyId, + theGenImpl); +} + +//============================================================================= +/*! + * StdMeshers_LayerDistribution2D_i::~StdMeshers_LayerDistribution2D_i + * + * Destructor + */ +//============================================================================= + +StdMeshers_LayerDistribution2D_i::~StdMeshers_LayerDistribution2D_i() +{ + MESSAGE("StdMeshers_LayerDistribution2D_i::~StdMeshers_LayerDistribution2D_i"); +} + +//============================================================================= +/*! + * StdMeshers_LayerDistribution2D_i::GetImpl + * + * Get implementation + */ +//============================================================================= + +::StdMeshers_LayerDistribution2D* StdMeshers_LayerDistribution2D_i::GetImpl() +{ + return ( ::StdMeshers_LayerDistribution2D* )myBaseImpl; +} + +//================================================================================ +/*! + * \brief Verify whether hypothesis supports given entity type + * \param type - dimension (see SMESH::Dimension enumeration) + * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise + * + * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) + */ +//================================================================================ +CORBA::Boolean StdMeshers_LayerDistribution2D_i::IsDimSupported( SMESH::Dimension type ) +{ + return type == SMESH::DIM_2D; +} + + diff --git a/src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.hxx b/src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.hxx new file mode 100644 index 000000000..d9e413d21 --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_LayerDistribution2D_i.hxx @@ -0,0 +1,64 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_LayerDistribution2D_i.hxx +// Author : Edward AGAPOV +// Module : SMESH +// $Header$ +// +#ifndef _SMESH_LayerDistribution2D_I_HXX_ +#define _SMESH_LayerDistribution2D_I_HXX_ + +#include "StdMeshers_LayerDistribution_i.hxx" +#include "StdMeshers_LayerDistribution2D.hxx" + + +// ========================================================= +/*! + * This hypothesis is used by "Radial quadrangle" algorithm. + * It specifies 1D hypothesis defining distribution of segments + * between the internal and the external surfaces. + */ +// ========================================================= + +class StdMeshers_LayerDistribution2D_i: + public virtual POA_StdMeshers::StdMeshers_LayerDistribution2D, + public virtual StdMeshers_LayerDistribution_i +{ +public: + // Constructor + StdMeshers_LayerDistribution2D_i(PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl ); + // Destructor + virtual ~StdMeshers_LayerDistribution2D_i(); + + // Get implementation + ::StdMeshers_LayerDistribution2D* GetImpl(); + + // Verify whether hypothesis supports given entity type + CORBA::Boolean IsDimSupported( SMESH::Dimension type ); + +}; + +#endif + diff --git a/src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.cxx b/src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.cxx new file mode 100644 index 000000000..2dabe905d --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.cxx @@ -0,0 +1,94 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes +// File : StdMeshers_NumberOfLayers2D_i.cxx +// Author : Edward AGAPOV +// Module : SMESH +// $Header$ +// +#include "StdMeshers_NumberOfLayers2D_i.hxx" + +#include "utilities.h" + +//using namespace std; + +//============================================================================= +/*! + * StdMeshers_NumberOfLayers2D_i::StdMeshers_NumberOfLayers2D_i + * + * Constructor + */ +//============================================================================= + +StdMeshers_NumberOfLayers2D_i::StdMeshers_NumberOfLayers2D_i + (PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl) +: StdMeshers_NumberOfLayers_i(thePOA,theStudyId,theGenImpl), + SMESH_Hypothesis_i( thePOA ) +{ + MESSAGE("StdMeshers_NumberOfLayers2D_i::StdMeshers_NumberOfLayers2D_i"); + myBaseImpl = new ::StdMeshers_NumberOfLayers2D(theGenImpl->GetANewId(), + theStudyId, + theGenImpl); +} + +//============================================================================= +/*! + * StdMeshers_NumberOfLayers2D_i::~StdMeshers_NumberOfLayers2D_i + * + * Destructor + */ +//============================================================================= + +StdMeshers_NumberOfLayers2D_i::~StdMeshers_NumberOfLayers2D_i() +{ + MESSAGE( "StdMeshers_NumberOfLayers2D_i::~StdMeshers_NumberOfLayers2D_i" ); +} + +//============================================================================= +/*! + * StdMeshers_NumberOfLayers2D_i::GetImpl + * + * Get implementation + */ +//============================================================================= + +::StdMeshers_NumberOfLayers2D* StdMeshers_NumberOfLayers2D_i::GetImpl() +{ + return ( ::StdMeshers_NumberOfLayers2D* )myBaseImpl; +} + +//================================================================================ +/*! + * \brief Verify whether hypothesis supports given entity type + * \param type - dimension (see SMESH::Dimension enumeration) + * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise + * + * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) + */ +//================================================================================ +CORBA::Boolean StdMeshers_NumberOfLayers2D_i::IsDimSupported( SMESH::Dimension type ) +{ + return type == SMESH::DIM_2D; +} + diff --git a/src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.hxx b/src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.hxx new file mode 100644 index 000000000..898f9dd68 --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_NumberOfLayers2D_i.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_NumberOfLayers2D_i.hxx +// Author : Edward AGAPOV +// Module : SMESH +// $Header$ +// +#ifndef _SMESH_NumberOfLayers2D_I_HXX_ +#define _SMESH_NumberOfLayers2D_I_HXX_ + +#include "StdMeshers_NumberOfLayers2D.hxx" +#include "StdMeshers_NumberOfLayers_i.hxx" + +// ========================================================= +/*! + * This hypothesis is used by "Radial quadrangle" algorithm. + * It specifies number of segments between the internal + * and the external surfaces. + */ +// ========================================================= + +class StdMeshers_NumberOfLayers2D_i: + public virtual POA_StdMeshers::StdMeshers_NumberOfLayers2D, + public virtual StdMeshers_NumberOfLayers_i +{ +public: + // Constructor + StdMeshers_NumberOfLayers2D_i( PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl ); + // Destructor + virtual ~StdMeshers_NumberOfLayers2D_i(); + + // Get implementation + ::StdMeshers_NumberOfLayers2D* GetImpl(); + + // Verify whether hypothesis supports given entity type + CORBA::Boolean IsDimSupported( SMESH::Dimension type ); +}; + +#endif + diff --git a/src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.cxx b/src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.cxx new file mode 100644 index 000000000..d588453dc --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.cxx @@ -0,0 +1,71 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_RadialQuadrangle_1D2D_i.cxx +// Author : Paul RASCLE, EDF +// Module : SMESH +// +#include "StdMeshers_RadialQuadrangle_1D2D_i.hxx" +#include "SMESH_Gen.hxx" + +#include "Utils_CorbaException.hxx" +#include "utilities.h" + +using namespace std; + + +//============================================================================= +/*! + * StdMeshers_RadialQuadrangle_1D2D_i::StdMeshers_RadialQuadrangle_1D2D_i + */ +//============================================================================= + +StdMeshers_RadialQuadrangle_1D2D_i::StdMeshers_RadialQuadrangle_1D2D_i + (PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl) + : SALOME::GenericObj_i( thePOA ), + SMESH_Hypothesis_i( thePOA ), + SMESH_Algo_i( thePOA ), + SMESH_2D_Algo_i( thePOA ) +{ + MESSAGE( "StdMeshers_RadialQuadrangle_1D2D_i::StdMeshers_RadialQuadrangle_1D2D_i" ); + myBaseImpl = new ::StdMeshers_RadialQuadrangle_1D2D(theGenImpl->GetANewId(), + theStudyId, + theGenImpl ); +} + +//----------------------------------------------------------------------------- + +StdMeshers_RadialQuadrangle_1D2D_i::~StdMeshers_RadialQuadrangle_1D2D_i() +{ + MESSAGE( "StdMeshers_RadialQuadrangle_1D2D_i::~StdMeshers_RadialQuadrangle_1D2D_i" ); +} + +//----------------------------------------------------------------------------- + +::StdMeshers_RadialQuadrangle_1D2D* StdMeshers_RadialQuadrangle_1D2D_i::GetImpl() +{ + MESSAGE( "StdMeshers_RadialQuadrangle_1D2D_i::GetImpl" ); + return ( ::StdMeshers_RadialQuadrangle_1D2D* )myBaseImpl; +} + diff --git a/src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.hxx b/src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.hxx new file mode 100644 index 000000000..41f3cd865 --- /dev/null +++ b/src/StdMeshers_I/StdMeshers_RadialQuadrangle_1D2D_i.hxx @@ -0,0 +1,57 @@ +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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.com +// +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// File : StdMeshers_RadialQuadrangle_1D2D_i.hxx +// Author : Paul RASCLE, EDF +// Module : SMESH +// $Header$ +// +#ifndef _SMESH_RadialQuadrangle_1D2D_I_HXX_ +#define _SMESH_RadialQuadrangle_1D2D_I_HXX_ + +#include +#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) + +#include "SMESH_2D_Algo_i.hxx" +#include "StdMeshers_RadialQuadrangle_1D2D.hxx" + +class SMESH_Gen; + +class StdMeshers_RadialQuadrangle_1D2D_i: + public virtual POA_StdMeshers::StdMeshers_RadialQuadrangle_1D2D, + public virtual SMESH_2D_Algo_i +{ +public: + // Constructor + StdMeshers_RadialQuadrangle_1D2D_i( PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl ); + + // Destructor + virtual ~StdMeshers_RadialQuadrangle_1D2D_i(); + + // Get implementation + ::StdMeshers_RadialQuadrangle_1D2D* GetImpl(); +}; + + +#endif diff --git a/src/StdMeshers_I/StdMeshers_i.cxx b/src/StdMeshers_I/StdMeshers_i.cxx index c17dfa98b..952bc8a8d 100644 --- a/src/StdMeshers_I/StdMeshers_i.cxx +++ b/src/StdMeshers_I/StdMeshers_i.cxx @@ -34,6 +34,7 @@ #include "StdMeshers_AutomaticLength_i.hxx" #include "StdMeshers_StartEndLength_i.hxx" #include "StdMeshers_Arithmetic1D_i.hxx" +#include "StdMeshers_FixedPoints1D_i.hxx" #include "StdMeshers_NumberOfSegments_i.hxx" #include "StdMeshers_Deflection1D_i.hxx" #include "StdMeshers_Propagation_i.hxx" @@ -49,6 +50,8 @@ #include "StdMeshers_ProjectionSource1D_i.hxx" #include "StdMeshers_NumberOfLayers_i.hxx" #include "StdMeshers_LayerDistribution_i.hxx" +#include "StdMeshers_NumberOfLayers2D_i.hxx" +#include "StdMeshers_LayerDistribution2D_i.hxx" #include "StdMeshers_SegmentLengthAroundVertex_i.hxx" #include "StdMeshers_MaxLength_i.hxx" #include "StdMeshers_QuadrangleParams_i.hxx" @@ -62,6 +65,7 @@ #include "StdMeshers_SegmentAroundVertex_0D_i.hxx" #include "StdMeshers_CompositeSegment_1D_i.hxx" #include "StdMeshers_UseExisting_1D2D_i.hxx" +#include "StdMeshers_RadialQuadrangle_1D2D_i.hxx" template class StdHypothesisCreator_i:public HypothesisCreator_i @@ -106,6 +110,8 @@ STDMESHERS_I_EXPORT aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "Deflection1D") == 0) aCreator = new StdHypothesisCreator_i; + else if (strcmp(aHypName, "FixedPoints1D") == 0) + aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "Arithmetic1D") == 0) aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "AutomaticLength") == 0) @@ -126,6 +132,10 @@ STDMESHERS_I_EXPORT aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "LayerDistribution") == 0) aCreator = new StdHypothesisCreator_i; + else if (strcmp(aHypName, "NumberOfLayers2D") == 0) + aCreator = new StdHypothesisCreator_i; + else if (strcmp(aHypName, "LayerDistribution2D") == 0) + aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "SegmentLengthAroundVertex") == 0) aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "QuadrangleParams") == 0) @@ -158,6 +168,8 @@ STDMESHERS_I_EXPORT aCreator = new StdHypothesisCreator_i; else if (strcmp(aHypName, "UseExisting_2D") == 0) aCreator = new StdHypothesisCreator_i; + else if (strcmp(aHypName, "RadialQuadrangle_1D2D") == 0) + aCreator = new StdHypothesisCreator_i; else ; return aCreator;