Version: 8.3.0
BLSURFPlugin_Hypothesis.hxx
Go to the documentation of this file.
1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 
20 // ---
21 // File : BLSURFPlugin_Hypothesis.hxx
22 // Authors : Francis KLOSS (OCC) & Patrick LAUG (INRIA) & Lioka RAZAFINDRAZAKA (CEA)
23 // & Aurelien ALLEAUME (DISTENE)
24 // Size maps developement: Nicolas GEIMER (OCC) & Gilles DAVID (EURIWARE)
25 // ---
26 //
27 #ifndef _BLSURFPlugin_Hypothesis_HXX_
28 #define _BLSURFPlugin_Hypothesis_HXX_
29 
30 #include "SMESH_Hypothesis.hxx"
31 #include <vector>
32 #include <map>
33 #include <set>
34 #include <stdexcept>
35 #include <string>
36 #include <cstring>
37 #include <sstream>
38 #include <utilities.h>
40 
41 // Parameters for work of MG-CADSurf
42 
44 {
45 public:
46  BLSURFPlugin_Hypothesis(int hypId, int studyId, SMESH_Gen * gen, bool hasgeom);
47 
48  enum Topology {
53  };
54 
55  enum PhysicalMesh {
59  };
60 
65  };
66 
67  static const char* GetHypType(bool hasgeom)
68  { return hasgeom ? "MG-CADSurf Parameters" : "MG-CADSurf Parameters_NOGEOM"; }
69 
70  TopoDS_Shape entryToShape(std::string entry);
71 
72  void SetPhysicalMesh(PhysicalMesh thePhysicalMesh);
74 
75  void SetGeometricMesh(GeometricMesh theGeometricMesh);
77 
78  void SetPhySize(double thePhySize, bool isRelative = false);
79  double GetPhySize() const { return _phySize; }
80  bool IsPhySizeRel() const { return _phySizeRel; }
81 
82  void SetMinSize(double theMinSize, bool isRelative = false);
83  double GetMinSize() const { return _minSize; }
84  bool IsMinSizeRel() const { return _minSizeRel; }
85 
86  void SetMaxSize(double theMaxSize, bool isRelative = false);
87  double GetMaxSize() const { return _maxSize; }
88  bool IsMaxSizeRel() const { return _maxSizeRel; }
89 
90  void SetUseGradation(bool toUse);
91  bool GetUseGradation() const { return _useGradation; }
92  void SetGradation(double theGradation);
93  double GetGradation() const { return _gradation; }
94 
95  void SetUseVolumeGradation(bool toUse);
96  bool GetUseVolumeGradation() const { return _useVolumeGradation; }
97  void SetVolumeGradation(double theGradation);
98  double GetVolumeGradation() const { return _volumeGradation; }
99 
100  void SetQuadAllowed(bool theVal);
101  bool GetQuadAllowed() const { return _quadAllowed; }
102 
103  void SetAngleMesh(double theAngle);
104  double GetAngleMesh() const { return _angleMesh; }
105 
106  void SetChordalError(double theDistance);
107  double GetChordalError() const { return _chordalError; }
108 
109  void SetAnisotropic(bool theVal);
110  bool GetAnisotropic() const { return _anisotropic; }
111 
112  void SetAnisotropicRatio(double theVal);
113  double GetAnisotropicRatio() const { return _anisotropicRatio; }
114 
115  void SetRemoveTinyEdges(bool theVal);
116  bool GetRemoveTinyEdges() const { return _removeTinyEdges; }
117 
118  void SetTinyEdgeLength(double theVal);
119  double GetTinyEdgeLength() const { return _tinyEdgeLength; }
120 
121  void SetOptimiseTinyEdges(bool theVal);
122  bool GetOptimiseTinyEdges() const { return _optimiseTinyEdges; }
123 
124  void SetTinyEdgeOptimisationLength(double theVal);
126 
127  void SetCorrectSurfaceIntersection(bool theVal);
129 
130  void SetCorrectSurfaceIntersectionMaxCost(double theVal);
132 
133  void SetBadElementRemoval(bool theVal);
134  bool GetBadElementRemoval() const { return _badElementRemoval; }
135 
136  void SetBadElementAspectRatio(double theVal);
138 
139  void SetOptimizeMesh(bool theVal);
140  bool GetOptimizeMesh() const { return _optimizeMesh; }
141 
142  void SetQuadraticMesh(bool theVal);
143  bool GetQuadraticMesh() const { return _quadraticMesh; }
144 
145  void SetTopology(Topology theTopology);
146  Topology GetTopology() const { return _topology; }
147 
148  void SetVerbosity(int theVal);
149  int GetVerbosity() const { return _verb; }
150 
151  void ClearEntry(const std::string& entry, const char * attEntry = 0);
152  void ClearSizeMaps();
153 
154  void SetEnforceCadEdgesSize( bool toEnforce );
155  bool GetEnforceCadEdgesSize();
156 
157  void SetJacobianRectificationRespectGeometry( bool allowRectification );
159 
160  void SetUseDeprecatedPatchMesher( bool useDeprecatedPatchMesher );
162 
163  void SetJacobianRectification( bool allowRectification );
165 
166  void SetMaxNumberOfPointsPerPatch( int nb ) throw (std::invalid_argument);
168 
169  void SetMaxNumberOfThreads( int nb ) throw (std::invalid_argument);
170  int GetMaxNumberOfThreads();
171 
172  void SetRespectGeometry( bool toRespect );
173  bool GetRespectGeometry();
174 
175  void SetTinyEdgesAvoidSurfaceIntersections( bool toAvoidIntersection );
177 
178  void SetClosedGeometry( bool isClosed );
179  bool GetClosedGeometry();
180 
181  void SetDebug( bool isDebug );
182  bool GetDebug();
183 
184  void SetPeriodicTolerance( double tol ) throw (std::invalid_argument);
185  double GetPeriodicTolerance();
186 
187  void SetRequiredEntities( const std::string& howToTreat ) throw (std::invalid_argument);
188  std::string GetRequiredEntities();
189 
190  void SetSewingTolerance( double tol ) throw (std::invalid_argument);
191  double GetSewingTolerance();
192 
193  void SetTags( const std::string& howToTreat ) throw (std::invalid_argument);
194  std::string GetTags();
195 
196  // Hyper-patches
197  typedef std::set< int > THyperPatchTags;
198  typedef std::vector< THyperPatchTags > THyperPatchList;
199 
200  void SetHyperPatches(const THyperPatchList& hpl);
202  static int GetHyperPatchTag( int faceTag, const BLSURFPlugin_Hypothesis* hyp, int* iPatch=0 );
203 
204  void SetPreCADMergeEdges(bool theVal);
205  bool GetPreCADMergeEdges() const { return _preCADMergeEdges; }
206 
207  void SetPreCADRemoveDuplicateCADFaces(bool theVal);
209 
210  void SetPreCADProcess3DTopology(bool theVal);
212 
213  void SetPreCADDiscardInput(bool theVal);
215 
216  static bool HasPreCADOptions(const BLSURFPlugin_Hypothesis* hyp);
217 
218  typedef std::map<std::string,std::string> TSizeMap;
219 
220  void SetSizeMapEntry(const std::string& entry,const std::string& sizeMap );
221  std::string GetSizeMapEntry(const std::string& entry);
222  const TSizeMap& _GetSizeMapEntries() const { return _sizeMap; }
227 
228 
229  void SetAttractorEntry(const std::string& entry,const std::string& attractor );
230  std::string GetAttractorEntry(const std::string& entry);
231  const TSizeMap& _GetAttractorEntries() const { return _attractors; };
236 
237 
238 /*
239  void SetCustomSizeMapEntry(const std::string& entry,const std::string& sizeMap );
240  std::string GetCustomSizeMapEntry(const std::string& entry);
241  void UnsetCustomSizeMap(const std::string& entry);
242  const TSizeMap& GetCustomSizeMapEntries() const { return _customSizeMap; }
243  */
244 
245  typedef std::multimap< std::string, BLSURFPlugin_Attractor* > TAttractorMap;
246  typedef std::map< std::string, std::vector<double> > TParamsMap; //TODO à finir
247 
248  void SetClassAttractorEntry(const std::string& entry, const std::string& att_entry, double StartSize, double EndSize, double ActionRadius, double ConstantRadius);
249  std::string GetClassAttractorEntry(const std::string& entry);
255 
259  // Name
260  typedef std::string TEnfName;
261  // Entry
262  typedef std::string TEntry;
263  // List of entries
264  typedef std::set<TEntry> TEntryList;
265  // Group name
266  typedef std::string TEnfGroupName;
267  // Coordinates
268  typedef std::vector<double> TEnfVertexCoords;
269  typedef std::set< TEnfVertexCoords > TEnfVertexCoordsList;
270 
271  // Enforced vertex
272  struct TEnfVertex {
278  TopoDS_Vertex vertex;
279  };
280 
282  {
283  bool operator () (const TEnfVertex* e1, const TEnfVertex* e2) const {
284  if (e1 && e2) {
285  if (e1->coords.size() && e2->coords.size())
286  return (e1->coords < e2->coords);
287  else
288  return (e1->geomEntry < e2->geomEntry);
289  }
290  return false;
291  }
292  };
293 
294  // PreCad Face and Edge periodicity
298  std::vector<std::string> theSourceVerticesEntries;
299  std::vector<std::string> theTargetVerticesEntries;
300  };
301 
302  // Edge periodicity
309  };
310 
311  // Vertex periodicity
317  };
318 
319  typedef std::pair< TEntry, TEntry > TFacesPeriodicity;
320 
321  // List of enforced vertices
322  typedef std::set< TEnfVertex*, CompareEnfVertices > TEnfVertexList;
323 
324  // Map Face Entry / List of enforced vertices
325  typedef std::map< TEntry, TEnfVertexList > TFaceEntryEnfVertexListMap;
326 
327  // List of Face Entry with internal enforced vertices activated
328  typedef std::set< TEntry > TFaceEntryInternalVerticesList;
329 
330  // Map Face Entry / List of coords
331  typedef std::map< TEntry, TEnfVertexCoordsList > TFaceEntryCoordsListMap;
332 
333  // Map Face Entry / List of Vertex entry
334  typedef std::map< TEntry, TEntryList > TFaceEntryEnfVertexEntryListMap;
335 
336  // Map Coords / Enforced vertex
337  typedef std::map< TEnfVertexCoords, TEnfVertex* > TCoordsEnfVertexMap;
338 
339  // Map Vertex entry / Enforced vertex
340  typedef std::map< TEntry, TEnfVertex* > TEnfVertexEntryEnfVertexMap;
341 
342  typedef std::map< TEnfGroupName, std::set<int> > TGroupNameNodeIDMap;
343  /* TODO GROUPS
344  // Map Group Name / List of enforced vertices
345  typedef std::map< TEnfGroupName , TEnfVertexList > TGroupNameEnfVertexListMap;
346  */
347 
348  // Vector of pairs of entries
349  typedef std::vector< TPreCadPeriodicity > TPreCadPeriodicityVector;
350  typedef std::vector< TFacesPeriodicity > TFacesPeriodicityVector;
351  typedef std::vector< TEdgePeriodicity > TEdgesPeriodicityVector;
352  typedef std::vector< TVertexPeriodicity > TVerticesPeriodicityVector;
353 
354 
355  bool SetEnforcedVertex(TEntry theFaceEntry, TEnfName theVertexName, TEntry theVertexEntry, TEnfGroupName theGroupName,
356  double x = 0.0, double y = 0.0, double z = 0.0);
357  TEnfVertexList GetEnfVertexList(const TEntry& theFaceEntry) throw (std::invalid_argument);
358  TEnfVertexCoordsList GetEnfVertexCoordsList(const TEntry& theFaceEntry) throw (std::invalid_argument);
359  TEntryList GetEnfVertexEntryList (const TEntry& theFaceEntry) throw (std::invalid_argument);
360  TEnfVertex* GetEnfVertex(TEnfVertexCoords coords) throw (std::invalid_argument);
361  TEnfVertex* GetEnfVertex(const TEntry& theEnfVertexEntry) throw (std::invalid_argument);
362  void AddEnfVertexNodeID(TEnfGroupName theGroupName,int theNodeID);
363  std::set<int> GetEnfVertexNodeIDs(TEnfGroupName theGroupName) throw (std::invalid_argument);
364  void RemoveEnfVertexNodeID(TEnfGroupName theGroupName,int theNodeID) throw (std::invalid_argument);
365 
366  bool ClearEnforcedVertex(const TEntry& theFaceEntry, double x = 0.0, double y = 0.0, double z = 0.0, const TEntry& theVertexEntry="") throw (std::invalid_argument);
367  bool ClearEnforcedVertices(const TEntry& theFaceEntry) throw (std::invalid_argument);
368 
370 
373 
376 
379 
380 // TODO GROUPS
381 // const TEnfVertexGroupNameMap _GetEnforcedVertexGroupNameMap() const { return _enfVertexGroupNameMap; }
382 
383 
389 
392 
395 
399  void SetInternalEnforcedVertexAllFaces(bool toEnforceInternalVertices);
405 
406 // Enable internal enforced vertices on specific face if requested by user
407 // static TFaceEntryInternalVerticesList GetDefaultFaceEntryInternalVerticesMap() { return TFaceEntryInternalVerticesList(); }
408 // const TFaceEntryInternalVerticesList _GetAllInternalEnforcedVerticesByFace() const { return _faceEntryInternalVerticesList; }
409 // static TFaceEntryInternalVerticesList GetAllInternalEnforcedVerticesByFace(const BLSURFPlugin_Hypothesis* hyp);
410 // void SetInternalEnforcedVertex(TEntry theFaceEntry, bool toEnforceInternalVertices, TEnfGroupName theGroupName);
411 // bool GetInternalEnforcedVertex(const TEntry& theFaceEntry);
412 
415  static double GetDefaultPhySize(double diagonal, double bbSegmentation);
416  static double GetDefaultPhySize() { return undefinedDouble(); }
417  static bool GetDefaultPhySizeRel() { return false; }
418  static double GetDefaultMinSize(double diagonal);
419  static double GetDefaultMinSize() { return undefinedDouble(); }
420  static bool GetDefaultMinSizeRel() { return false; }
421  static double GetDefaultMaxSize(double diagonal);
422  static double GetDefaultMaxSize() { return undefinedDouble(); }
423  static bool GetDefaultMaxSizeRel() { return false; }
424  static bool GetDefaultUseGradation() { return true; }
425  static double GetDefaultGradation() { return 1.3; }
426  static bool GetDefaultUseVolumeGradation() { return false; }
427  static double GetDefaultVolumeGradation() { return 2; }
428  static bool GetDefaultQuadAllowed() { return false; }
429  static double GetDefaultAngleMesh() { return 8.0; }
430 
431  static double GetDefaultChordalError(double diagonal);
432  static double GetDefaultChordalError() { return undefinedDouble(); }
433  static bool GetDefaultAnisotropic() { return false; }
434  static double GetDefaultAnisotropicRatio() { return 0.0; }
435  static bool GetDefaultRemoveTinyEdges() { return false; }
436  static double GetDefaultTinyEdgeLength(double diagonal);
437  static double GetDefaultTinyEdgeLength() { return undefinedDouble(); }
438  static bool GetDefaultOptimiseTinyEdges() { return false; }
439  static double GetDefaultTinyEdgeOptimisationLength(double diagonal);
441  static bool GetDefaultCorrectSurfaceIntersection() { return true; }
442  static double GetDefaultCorrectSurfaceIntersectionMaxCost() { return 15.; }
443  static bool GetDefaultBadElementRemoval() { return false; }
444  static double GetDefaultBadElementAspectRatio() {return 1000.0; }
445  static bool GetDefaultOptimizeMesh() { return true; }
446  static bool GetDefaultQuadraticMesh() { return false; }
447 
448  static int GetDefaultVerbosity() { return 3; }
449  static Topology GetDefaultTopology() { return FromCAD; }
450  // PreCAD
451  static bool GetDefaultPreCADMergeEdges() { return false; }
452  static bool GetDefaultPreCADRemoveDuplicateCADFaces() { return false; }
453  static bool GetDefaultPreCADProcess3DTopology() { return false; }
454  static bool GetDefaultPreCADDiscardInput() { return false; }
455 
456  static TSizeMap GetDefaultSizeMap() { return TSizeMap();}
458 
466 
467  static bool GetDefaultInternalEnforcedVertex() { return false; }
468 
469  /* TODO GROUPS
470  static TGroupNameEnfVertexListMap GetDefaultGroupNameEnfVertexListMap() { return TGroupNameEnfVertexListMap(); }
471  static TEnfVertexGroupNameMap GetDefaultEnfVertexGroupNameMap() { return TEnfVertexGroupNameMap(); }
472  */
473 
474 // const TPreCadPeriodicityEntriesVector _GetPreCadFacesPeriodicityEntries() const { return _preCadFacesPeriodicityEntriesVector; }
475 
479 
483 
487 
491 
495 
497 
498  void AddPreCadFacesPeriodicity(TEntry theFace1Entry, TEntry theFace2Entry,
499  std::vector<std::string> &theSourceVerticesEntries, std::vector<std::string> &theTargetVerticesEntries);
500  void AddPreCadEdgesPeriodicity(TEntry theEdge1Entry, TEntry theEdge2Entry,
501  std::vector<std::string> &theSourceVerticesEntries, std::vector<std::string> &theTargetVerticesEntries);
502 
503  static double undefinedDouble() { return -1.0; }
504 
505  typedef std::map< std::string, std::string > TOptionValues;
506  typedef std::set< std::string > TOptionNames;
507 
508  void SetOptionValue(const std::string& optionName,
509  const std::string& optionValue) throw (std::invalid_argument);
510  void SetPreCADOptionValue(const std::string& optionName,
511  const std::string& optionValue) throw (std::invalid_argument);
512  std::string GetOptionValue(const std::string& optionName, bool* isDefault=0) const throw (std::invalid_argument);
513  std::string GetPreCADOptionValue(const std::string& optionName, bool* isDefault=0) const throw (std::invalid_argument);
514  void ClearOption(const std::string& optionName);
515  void ClearPreCADOption(const std::string& optionName);
519 
520  void AddOption(const std::string& optionName, const std::string& optionValue);
521  void AddPreCADOption(const std::string& optionName, const std::string& optionValue);
522  std::string GetOption(const std::string& optionName) const;
523  std::string GetPreCADOption(const std::string& optionName) const;
524 
525  static bool ToBool(const std::string& str, bool* isOk=0) throw (std::invalid_argument);
526  static double ToDbl(const std::string& str, bool* isOk=0) throw (std::invalid_argument);
527  static int ToInt(const std::string& str, bool* isOk=0) throw (std::invalid_argument);
528 
532 // void SetGMFFile(const std::string& theFileName, bool isBinary);
533  void SetGMFFile(const std::string& theFileName);
534  std::string GetGMFFile() const { return _GMFFileName; }
535  static std::string GetDefaultGMFFile() { return "";}
536 // bool GetGMFFileMode() const { return _GMFFileMode; }
537 
538  // Persistence
539  virtual std::ostream & SaveTo(std::ostream & save);
540  virtual std::istream & LoadFrom(std::istream & load);
541  friend std::ostream & operator <<(std::ostream & save, BLSURFPlugin_Hypothesis & hyp);
542  friend std::istream & operator >>(std::istream & load, BLSURFPlugin_Hypothesis & hyp);
543 
550  virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape);
551 
556  virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0);
557 
558 
559 private:
562  double _phySize;
567  double _gradation;
571  double _angleMesh;
585  int _verb;
587 
593 
596  TOptionNames _doubleOptions, _charOptions, _boolOptions; // to find a type of option
598 
604 
607  // maps to get "manual" enf vertex (through their coordinates)
610  // maps to get "geom" enf vertex (through their geom entries)
614 
615 // Enable internal enforced vertices on specific face if requested by user
616 // TFaceEntryInternalVerticesList _faceEntryInternalVerticesList;
619 
622 
626 
628 
629  // Called by SaveTo to store content of _preCadFacesPeriodicityVector and _preCadEdgesPeriodicityVector
630  void SavePreCADPeriodicity(std::ostream & save, const char* shapeType);
631 
632  // Called by LoadFrom to fill _preCadFacesPeriodicityVector and _preCadEdgesPeriodicityVector
633  void LoadPreCADPeriodicity(std::istream & load, const char* shapeType);
634 
635  // Called by LoadFrom to fill _facesPeriodicityVector
636  void LoadFacesPeriodicity(std::istream & load);
637 
638  // Called by LoadFrom to fill _edgesPeriodicityVector
639  void LoadEdgesPeriodicity(std::istream & load);
640 
641  // Called by LoadFrom to fill _verticesPeriodicityVector
642  void LoadVerticesPeriodicity(std::istream & load);
643 
644  // Called by SaveTo to store content of _facesPeriodicityVector
645  void SaveFacesPeriodicity(std::ostream & save);
646 
647  // Called by SaveTo to store content of _edgesPeriodicityVector
648  void SaveEdgesPeriodicity(std::ostream & save);
649 
650  // Called by SaveTo to store content of _verticesPeriodicityVector
651  void SaveVerticesPeriodicity(std::ostream & save);
652 
653  std::string _GMFFileName;
654 // bool _GMFFileMode;
655 
656 // TSizeMap _customSizeMap;
657 };
658 
659 #endif