1 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
20 #ifndef _SMESH_CONTROLSDEF_HXX_
21 #define _SMESH_CONTROLSDEF_HXX_
26 #include <boost/shared_ptr.hpp>
28 #include <Geom_Surface.hxx>
29 #include <TColStd_SequenceOfInteger.hxx>
30 #include <TColStd_MapOfInteger.hxx>
31 #include <TCollection_AsciiString.hxx>
33 #include "SMDSAbs_ElementType.hxx"
34 #include "SMDS_MeshNode.hxx"
36 #include "SMESH_Controls.hxx"
38 class SMDS_MeshElement;
44 class SMESHDS_SubMesh;
53 class TSequenceOfXYZ: public std::vector<gp_XYZ>
56 typedef std::vector<gp_XYZ> TSuperClass;
60 TSequenceOfXYZ(size_type n):
64 TSequenceOfXYZ(size_type n, const value_type& t):
68 TSequenceOfXYZ(const TSequenceOfXYZ& theSequenceOfXYZ):
69 TSuperClass(theSequenceOfXYZ)
72 template <class InputIterator>
73 TSequenceOfXYZ(InputIterator theBegin, InputIterator theEnd):
74 TSuperClass(theBegin,theEnd)
77 TSequenceOfXYZ& operator=(const TSequenceOfXYZ& theSequenceOfXYZ){
78 TSuperClass::operator=(theSequenceOfXYZ);
82 reference operator()(size_type n){
83 return TSuperClass::operator[](n-1);
86 const_reference operator()(size_type n) const{
87 return TSuperClass::operator[](n-1);
91 reference operator[](size_type n);
93 const_reference operator[](size_type n) const;
100 virtual void SetMesh( const SMDS_Mesh* theMesh ) = 0;
101 virtual SMDSAbs_ElementType GetType() const = 0;
104 class NumericalFunctor: public virtual Functor{
107 virtual void SetMesh( const SMDS_Mesh* theMesh );
108 virtual double GetValue( long theElementId );
109 virtual double GetValue(const TSequenceOfXYZ& thePoints) { return -1.0;};
110 virtual SMDSAbs_ElementType GetType() const = 0;
111 virtual double GetBadRate( double Value, int nbNodes ) const = 0;
112 long GetPrecision() const;
113 void SetPrecision( const long thePrecision );
115 bool GetPoints(const int theId,
116 TSequenceOfXYZ& theRes) const;
117 static bool GetPoints(const SMDS_MeshElement* theElem,
118 TSequenceOfXYZ& theRes);
120 const SMDS_Mesh* myMesh;
126 Class : SMESH_MinimumAngle
127 Description : Functor for calculation of minimum angle
129 class MinimumAngle: public virtual NumericalFunctor{
131 virtual double GetValue( const TSequenceOfXYZ& thePoints );
132 virtual double GetBadRate( double Value, int nbNodes ) const;
133 virtual SMDSAbs_ElementType GetType() const;
139 Description : Functor for calculating aspect ratio
141 class AspectRatio: public virtual NumericalFunctor{
143 virtual double GetValue( const TSequenceOfXYZ& thePoints );
144 virtual double GetBadRate( double Value, int nbNodes ) const;
145 virtual SMDSAbs_ElementType GetType() const;
150 Class : AspectRatio3D
151 Description : Functor for calculating aspect ratio of 3D elems.
153 class AspectRatio3D: public virtual NumericalFunctor{
155 virtual double GetValue( const TSequenceOfXYZ& thePoints );
156 virtual double GetBadRate( double Value, int nbNodes ) const;
157 virtual SMDSAbs_ElementType GetType() const;
163 Description : Functor for calculating warping
165 class Warping: public virtual NumericalFunctor{
167 virtual double GetValue( const TSequenceOfXYZ& thePoints );
168 virtual double GetBadRate( double Value, int nbNodes ) const;
169 virtual SMDSAbs_ElementType GetType() const;
172 double ComputeA( const gp_XYZ&, const gp_XYZ&, const gp_XYZ&, const gp_XYZ& ) const;
178 Description : Functor for calculating taper
180 class Taper: public virtual NumericalFunctor{
182 virtual double GetValue( const TSequenceOfXYZ& thePoints );
183 virtual double GetBadRate( double Value, int nbNodes ) const;
184 virtual SMDSAbs_ElementType GetType() const;
190 Description : Functor for calculating skew in degrees
192 class Skew: public virtual NumericalFunctor{
194 virtual double GetValue( const TSequenceOfXYZ& thePoints );
195 virtual double GetBadRate( double Value, int nbNodes ) const;
196 virtual SMDSAbs_ElementType GetType() const;
202 Description : Functor for calculating area
204 class Area: public virtual NumericalFunctor{
206 virtual double GetValue( const TSequenceOfXYZ& thePoints );
207 virtual double GetBadRate( double Value, int nbNodes ) const;
208 virtual SMDSAbs_ElementType GetType() const;
214 Description : Functor for calculating length of edge
216 class Length: public virtual NumericalFunctor{
218 virtual double GetValue( const TSequenceOfXYZ& thePoints );
219 virtual double GetBadRate( double Value, int nbNodes ) const;
220 virtual SMDSAbs_ElementType GetType() const;
225 Description : Functor for calculating length of edge
227 class Length2D: public virtual NumericalFunctor{
229 virtual double GetValue( long theElementId );
230 virtual double GetBadRate( double Value, int nbNodes ) const;
231 virtual SMDSAbs_ElementType GetType() const;
235 Value(double theLength, long thePntId1, long thePntId2);
236 bool operator<(const Value& x) const;
238 typedef std::set<Value> TValues;
239 void GetValues(TValues& theValues);
242 typedef boost::shared_ptr<Length2D> Length2DPtr;
245 Class : MultiConnection
246 Description : Functor for calculating number of faces conneted to the edge
248 class MultiConnection: public virtual NumericalFunctor{
250 virtual double GetValue( long theElementId );
251 virtual double GetValue( const TSequenceOfXYZ& thePoints );
252 virtual double GetBadRate( double Value, int nbNodes ) const;
253 virtual SMDSAbs_ElementType GetType() const;
257 Class : MultiConnection2D
258 Description : Functor for calculating number of faces conneted to the edge
260 class MultiConnection2D: public virtual NumericalFunctor{
262 virtual double GetValue( long theElementId );
263 virtual double GetValue( const TSequenceOfXYZ& thePoints );
264 virtual double GetBadRate( double Value, int nbNodes ) const;
265 virtual SMDSAbs_ElementType GetType() const;
268 Value(long thePntId1, long thePntId2);
269 bool operator<(const Value& x) const;
271 typedef std::map<Value,int> MValues;
273 void GetValues(MValues& theValues);
275 typedef boost::shared_ptr<MultiConnection2D> MultiConnection2DPtr;
281 Description : Base class for all predicates
283 class Predicate: public virtual Functor{
285 virtual bool IsSatisfy( long theElementId ) = 0;
286 virtual SMDSAbs_ElementType GetType() const = 0;
293 Description : Predicate for free borders
295 class FreeBorders: public virtual Predicate{
298 virtual void SetMesh( const SMDS_Mesh* theMesh );
299 virtual bool IsSatisfy( long theElementId );
300 virtual SMDSAbs_ElementType GetType() const;
303 const SMDS_Mesh* myMesh;
308 Class : BadOrientedVolume
309 Description : Predicate bad oriented volumes
311 class BadOrientedVolume: public virtual Predicate{
314 virtual void SetMesh( const SMDS_Mesh* theMesh );
315 virtual bool IsSatisfy( long theElementId );
316 virtual SMDSAbs_ElementType GetType() const;
319 const SMDS_Mesh* myMesh;
325 Description : Predicate for free Edges
327 class FreeEdges: public virtual Predicate{
330 virtual void SetMesh( const SMDS_Mesh* theMesh );
331 virtual bool IsSatisfy( long theElementId );
332 virtual SMDSAbs_ElementType GetType() const;
333 static bool IsFreeEdge( const SMDS_MeshNode** theNodes, const int theFaceId );
334 typedef long TElemId;
338 Border(long theElemId, long thePntId1, long thePntId2);
339 bool operator<(const Border& x) const;
341 typedef std::set<Border> TBorders;
342 void GetBoreders(TBorders& theBorders);
345 const SMDS_Mesh* myMesh;
347 typedef boost::shared_ptr<FreeEdges> FreeEdgesPtr;
352 Description : Predicate for Range of Ids.
353 Range may be specified with two ways.
354 1. Using AddToRange method
355 2. With SetRangeStr method. Parameter of this method is a string
356 like as "1,2,3,50-60,63,67,70-"
358 class RangeOfIds: public virtual Predicate
362 virtual void SetMesh( const SMDS_Mesh* theMesh );
363 virtual bool IsSatisfy( long theNodeId );
364 virtual SMDSAbs_ElementType GetType() const;
365 virtual void SetType( SMDSAbs_ElementType theType );
367 bool AddToRange( long theEntityId );
368 void GetRangeStr( TCollection_AsciiString& );
369 bool SetRangeStr( const TCollection_AsciiString& );
372 const SMDS_Mesh* myMesh;
374 TColStd_SequenceOfInteger myMin;
375 TColStd_SequenceOfInteger myMax;
376 TColStd_MapOfInteger myIds;
378 SMDSAbs_ElementType myType;
381 typedef boost::shared_ptr<RangeOfIds> RangeOfIdsPtr;
386 Description : Base class for comparators
388 class Comparator: public virtual Predicate{
391 virtual ~Comparator();
392 virtual void SetMesh( const SMDS_Mesh* theMesh );
393 virtual void SetMargin(double theValue);
394 virtual void SetNumFunctor(NumericalFunctorPtr theFunct);
395 virtual bool IsSatisfy( long theElementId ) = 0;
396 virtual SMDSAbs_ElementType GetType() const;
401 NumericalFunctorPtr myFunctor;
403 typedef boost::shared_ptr<Comparator> ComparatorPtr;
408 Description : Comparator "<"
410 class LessThan: public virtual Comparator{
412 virtual bool IsSatisfy( long theElementId );
418 Description : Comparator ">"
420 class MoreThan: public virtual Comparator{
422 virtual bool IsSatisfy( long theElementId );
428 Description : Comparator "="
430 class EqualTo: public virtual Comparator{
433 virtual bool IsSatisfy( long theElementId );
434 virtual void SetTolerance( double theTol );
435 virtual double GetTolerance();
440 typedef boost::shared_ptr<EqualTo> EqualToPtr;
445 Description : Logical NOT predicate
447 class LogicalNOT: public virtual Predicate{
450 virtual ~LogicalNOT();
451 virtual bool IsSatisfy( long theElementId );
452 virtual void SetMesh( const SMDS_Mesh* theMesh );
453 virtual void SetPredicate(PredicatePtr thePred);
454 virtual SMDSAbs_ElementType GetType() const;
457 PredicatePtr myPredicate;
459 typedef boost::shared_ptr<LogicalNOT> LogicalNOTPtr;
463 Class : LogicalBinary
464 Description : Base class for binary logical predicate
466 class LogicalBinary: public virtual Predicate{
469 virtual ~LogicalBinary();
470 virtual void SetMesh( const SMDS_Mesh* theMesh );
471 virtual void SetPredicate1(PredicatePtr thePred);
472 virtual void SetPredicate2(PredicatePtr thePred);
473 virtual SMDSAbs_ElementType GetType() const;
476 PredicatePtr myPredicate1;
477 PredicatePtr myPredicate2;
479 typedef boost::shared_ptr<LogicalBinary> LogicalBinaryPtr;
484 Description : Logical AND
486 class LogicalAND: public virtual LogicalBinary{
488 virtual bool IsSatisfy( long theElementId );
494 Description : Logical OR
496 class LogicalOR: public virtual LogicalBinary{
498 virtual bool IsSatisfy( long theElementId );
504 Description : Predicate for manifold part of mesh
506 class ManifoldPart: public virtual Predicate{
509 /* internal class for algorithm uses */
513 Link( SMDS_MeshNode* theNode1,
514 SMDS_MeshNode* theNode2 );
517 bool IsEqual( const ManifoldPart::Link& theLink ) const;
518 bool operator<(const ManifoldPart::Link& x) const;
520 SMDS_MeshNode* myNode1;
521 SMDS_MeshNode* myNode2;
524 bool IsEqual( const ManifoldPart::Link& theLink1,
525 const ManifoldPart::Link& theLink2 );
527 typedef std::set<ManifoldPart::Link> TMapOfLink;
528 typedef std::vector<SMDS_MeshFace*> TVectorOfFacePtr;
529 typedef std::vector<ManifoldPart::Link> TVectorOfLink;
530 typedef std::map<SMDS_MeshFace*,int> TDataMapFacePtrInt;
531 typedef std::map<ManifoldPart::Link,SMDS_MeshFace*> TDataMapOfLinkFacePtr;
535 virtual void SetMesh( const SMDS_Mesh* theMesh );
536 // inoke when all parameters already set
537 virtual bool IsSatisfy( long theElementId );
538 virtual SMDSAbs_ElementType GetType() const;
540 void SetAngleTolerance( const double theAngToler );
541 double GetAngleTolerance() const;
542 void SetIsOnlyManifold( const bool theIsOnly );
543 void SetStartElem( const long theStartElemId );
547 bool findConnected( const TDataMapFacePtrInt& theAllFacePtrInt,
548 SMDS_MeshFace* theStartFace,
549 TMapOfLink& theNonManifold,
550 TColStd_MapOfInteger& theResFaces );
551 bool isInPlane( const SMDS_MeshFace* theFace1,
552 const SMDS_MeshFace* theFace2 );
553 void expandBoundary( TMapOfLink& theMapOfBoundary,
554 TVectorOfLink& theSeqOfBoundary,
555 TDataMapOfLinkFacePtr& theDMapLinkFacePtr,
556 TMapOfLink& theNonManifold,
557 SMDS_MeshFace* theNextFace ) const;
559 void getFacesByLink( const Link& theLink,
560 TVectorOfFacePtr& theFaces ) const;
563 const SMDS_Mesh* myMesh;
564 TColStd_MapOfInteger myMapIds;
565 TColStd_MapOfInteger myMapBadGeomIds;
566 TVectorOfFacePtr myAllFacePtr;
567 TDataMapFacePtrInt myAllFacePtrIntDMap;
569 bool myIsOnlyManifold;
573 typedef boost::shared_ptr<ManifoldPart> ManifoldPartPtr;
577 Class : ElementsOnSurface
578 Description : Predicate elements that lying on indicated surface
581 class ElementsOnSurface : public virtual Predicate {
584 ~ElementsOnSurface();
585 virtual void SetMesh( const SMDS_Mesh* theMesh );
586 virtual bool IsSatisfy( long theElementId );
587 virtual SMDSAbs_ElementType GetType() const;
589 void SetTolerance( const double theToler );
590 double GetTolerance() const;
591 void SetSurface( const TopoDS_Shape& theShape,
592 const SMDSAbs_ElementType theType );
596 void process( const SMDS_MeshElement* theElem );
597 bool isOnSurface( const SMDS_MeshNode* theNode ) const;
600 const SMDS_Mesh* myMesh;
601 TColStd_MapOfInteger myIds;
602 SMDSAbs_ElementType myType;
603 Handle(Geom_Surface) mySurf;
607 typedef boost::shared_ptr<ElementsOnSurface> ElementsOnSurfacePtr;
617 virtual void SetPredicate(PredicatePtr thePred);
619 typedef std::vector<long> TIdSequence;
623 GetElementsId( const SMDS_Mesh* theMesh,
624 TIdSequence& theSequence );
628 GetElementsId( const SMDS_Mesh* theMesh,
629 PredicatePtr thePredicate,
630 TIdSequence& theSequence );
633 PredicatePtr myPredicate;