Salome HOME
bos #20256: [CEA 18523] Porting SMESH to int 64 bits
[plugins/blsurfplugin.git] / src / GUI / BLSURFPluginGUI_HypothesisCreator.h
1 // Copyright (C) 2007-2021  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    : BLSURFPluginGUI_HypothesisCreator.h
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 BLSURFPLUGINGUI_HypothesisCreator_H
28 #define BLSURFPLUGINGUI_HypothesisCreator_H
29
30 // akl: avoid compilation warning on Linux : "_POSIX_C_SOURCE" and "_XOPEN_SOURCE" are redefined
31 #ifdef _POSIX_C_SOURCE
32 #undef _POSIX_C_SOURCE
33 #endif
34
35 #ifdef _XOPEN_SOURCE
36 #undef _XOPEN_SOURCE
37 #endif
38
39 #ifdef WIN32
40   #if defined BLSURFPLUGIN_GUI_EXPORTS || defined BLSURFPluginGUI_EXPORTS
41     #define BLSURFPLUGIN_GUI_EXPORT __declspec( dllexport )
42   #else
43     #define BLSURFPLUGIN_GUI_EXPORT __declspec( dllimport )
44   #endif
45 #else
46   #define BLSURFPLUGIN_GUI_EXPORT
47 #endif
48
49 #ifdef WIN32
50 // E.A. : On windows with python 2.6, there is a conflict
51 // E.A. : between pymath.h and Standard_math.h which define
52 // E.A. : some same symbols : acosh, asinh, ...
53 #include <Standard_math.hxx>
54 #include <pymath.h>
55 #endif
56
57 #include <Python.h>
58
59 #include <QItemDelegate>
60
61 #include <SMESHGUI_Hypotheses.h>
62 #include "StdMeshersGUI_ObjectReferenceParamWdg.h"
63 #include <SALOMEconfig.h>
64 #include <cstring>
65 #include <map>
66 #include <set>
67 #include <vector>
68 #include <TopAbs_ShapeEnum.hxx>
69 #include <GeomSelectionTools.h>
70 #include <GEOM_Client.hxx>
71 #include CORBA_SERVER_HEADER(BLSURFPlugin_Algorithm)
72
73 class QGroupBox;
74 class QComboBox;
75 class QCheckBox;
76 class QLineEdit;
77 class QRadioButton;
78 class QTableWidget;
79 class QTreeWidget;
80 class QModelIndex;
81 class QSpinBox;
82 class QDoubleSpinBox;
83 class QMenu;
84 class QAction;
85 class QTreeWidgetItem;
86 class QTableWidgetItem;
87 class QObject;
88 class QSplitter;
89 class QGridLayout;
90 class QVBoxLayout;
91 class QSpacerItem;
92
93 class SMESHGUI_SpinBox;
94 class SMESH_NumberFilter;
95 class LightApp_SelectionMgr;
96 class BLSURFPluginGUI_StdWidget;
97 class BLSURFPluginGUI_AdvWidget;
98 class StdMeshersGUI_SubShapeSelectorWdg;
99 // class DlgBlSurfHyp_Enforced;
100
101 // Name
102 typedef std::string TEnfName;
103 // Entry
104 typedef std::string TEntry;
105 // List of entries
106 typedef std::set<TEntry> TEntryList;
107 // Enforced vertex = 3 coordinates
108 typedef std::vector<double> TEnfVertexCoords;
109 // List of enforced vertices
110 typedef std::set< TEnfVertexCoords > TEnfVertexCoordsList;
111 // Enforced vertex
112 struct TEnfVertex{
113   TEnfName name;
114   TEntry geomEntry;
115   TEnfVertexCoords coords;
116   TEnfName grpName;
117 };
118 // Attractor
119 struct TAttractor{
120   std::string attEntry;
121   double      startSize;
122   double      infDist;
123   double      constDist;
124   TAttractor( const char* theAttEntry, double theStartSize, double theInfDist, double theConstDist)
125     : attEntry( theAttEntry ),
126       startSize( theStartSize ),
127       infDist( theInfDist ),
128       constDist( theConstDist )
129   {}
130   void SetToDelete() { startSize = -1; }
131   bool IsToDelete() const { return startSize < 0; }
132 };
133 typedef std::vector< TAttractor > TAttractorVec;
134
135 struct CompareEnfVertices
136 {
137   bool operator () (const TEnfVertex* e1, const TEnfVertex* e2) const {
138     if (e1 && e2) {
139       if (e1->coords.size() && e2->coords.size())
140         return (e1->coords < e2->coords);
141       else
142         return (e1->geomEntry < e2->geomEntry);
143     }
144     return false;
145   }
146 };
147
148 // List of enforced vertices
149 typedef std::set< TEnfVertex*, CompareEnfVertices > TEnfVertexList;
150
151 // Map Face Entry / List of enforced vertices
152 typedef std::map< TEntry, TEnfVertexList > TFaceEntryEnfVertexListMap;
153
154 // Map Face Entry / InternalEnforcedVertices
155 typedef std::map< TEntry, bool > TFaceEntryInternalVerticesMap;
156
157 // PreCad Face and Edge periodicity
158 typedef std::vector<std::string> TPreCadPeriodicity;
159 typedef std::vector< TPreCadPeriodicity > TPreCadPeriodicityVector;
160
161 typedef struct
162 {
163   int     myTopology, myVerbosity;
164   int     myPhysicalMesh, myGeometricMesh;
165   double  myPhySize, myMinSize, myMaxSize;
166   bool    myPhySizeRel, myMinSizeRel, myMaxSizeRel;
167   bool    myUseMinSize, myUseMaxSize, myUseGradation, myUseVolumeGradation;
168   double  myGradation, myVolumeGradation, myAngleMesh, myChordalError;
169   bool    myAnisotropic, myOptimiseTinyEdges, myRemoveTinyEdges, myForceBadElementRemoval, myCorrectSurfaceIntersection;
170   double  myAnisotropicRatio, myTinyEdgeLength, myTinyEdgeOptimisLength, myBadElementAspectRatio, myCorrectSurfaceIntersectionMaxCost;
171   bool    myOptimizeMesh, myQuadraticMesh;
172   bool    mySmpsurface,mySmpedge,mySmppoint,myEnforcedVertex,myInternalEnforcedVerticesAllFaces;
173   int     myElementType;
174   bool    myUseSurfaceProximity;
175   int     myNbSurfaceProximityLayers;
176   double  mySurfaceProximityRatio;
177   bool    myUseVolumeProximity;
178   int     myNbVolumeProximityLayers;
179   double  myVolumeProximityRatio;
180   // bool    myPreCADMergeEdges, myPreCADProcess3DTopology, myPreCADDiscardInput;
181 //   bool    myGMFFileMode;
182   std::string myGMFFileName, myInternalEnforcedVerticesAllFacesGroup;
183   TEnfVertexList enfVertexList;
184   TFaceEntryEnfVertexListMap faceEntryEnfVertexListMap;
185   /* TODO GROUPS
186   TGroupNameEnfVertexListMap groupNameEnfVertexListMap;
187   */
188   TPreCadPeriodicityVector preCadPeriodicityVector;
189   QStringList hyperpatches, hyperEntries;
190   QString myName;
191 } BlsurfHypothesisData;
192
193
194 /*!
195  * \brief Class for creation of MG-CADSurf hypotheses
196 */
197 class BLSURFPLUGIN_GUI_EXPORT BLSURFPluginGUI_HypothesisCreator : public SMESHGUI_GenericHypothesisCreator
198 {
199   Q_OBJECT
200
201 public:
202   BLSURFPluginGUI_HypothesisCreator( const QString& );
203   virtual ~BLSURFPluginGUI_HypothesisCreator();
204
205   virtual bool        checkParams(QString& msg) const;
206   virtual QString     helpPage() const;
207
208 protected:
209   virtual QFrame*     buildFrame    ();
210   virtual void        retrieveParams() const;
211   virtual QString     storeParams   () const;
212
213   virtual QString     caption() const;
214   virtual QPixmap     icon() const;
215   virtual QString     type() const;
216
217 protected slots:
218   void                onStateChange();
219   // Advanced tab
220   void                onAddOption();
221   void                onChangeOptionName( int, int );
222   // Sizemap tab
223   void                onMapGeomContentModified();
224   void                onSmpItemClicked( QTreeWidgetItem *, int );
225   void                onTabChanged(int);
226   void                onAttractorClicked(int);
227   void                onConstSizeClicked(int);
228   void                onAddMap();
229   void                onRemoveMap();
230   void                onModifyMap();
231   void                onSetSizeMap(QTreeWidgetItem *, int);
232   // Enforced vertices tab
233   QTreeWidgetItem*    addEnforcedFace(std::string theFaceEntry, std::string theFaceName);
234   void                addEnforcedVertex(double x=0, double y=0, double z=0, 
235                                         std::string vertexName = "",
236                                         std::string geomEntry = "",
237                                         std::string groupName = "");
238   void                onAddEnforcedVertices();
239   void                onRemoveEnforcedVertex();
240   void                synchronizeCoords();
241   void                updateEnforcedVertexValues(QTreeWidgetItem* , int );
242   void                onSelectEnforcedVertex();
243   void                clearEnforcedVertexWidgets();
244   void                onInternalVerticesClicked(int);
245   // Periodicity tab
246   void                onPeriodicityByVerticesChecked(bool);
247   void                onAddPeriodicity();
248   void                onRemovePeriodicity();
249   void                onPeriodicityTreeClicked(QTreeWidgetItem*, int);
250   void                onPeriodicityContentModified();
251   // HyperPatch tab
252   void                onHyPatchFaceSelection(bool);
253   void                onHyPatchGroupSelection(bool);
254   void                onHyPatchSelectionChanged();
255   void                onHyPatchAdd();
256   void                onHyPatchRemove();
257
258 private:
259   bool                readParamsFromHypo( BlsurfHypothesisData& ) const;
260   QString             readParamsFromWidgets( BlsurfHypothesisData& ) const;
261   bool                storeParamsToHypo( const BlsurfHypothesisData& ) const;
262   bool                sizeMapsValidation();
263   bool                sizeMapValidationFromRow(int,bool displayError = true);
264   bool                sizeMapValidationFromEntry(QString,bool displayError = true);
265   GeomSelectionTools* getGeomSelectionTool() const;
266   GEOM::GEOM_Gen_var  getGeomEngine();
267   bool                insertElement( GEOM::GEOM_Object_var, bool modify = false );
268   bool                insertAttractor(GEOM::GEOM_Object_var, GEOM::GEOM_Object_var, bool modify = false);
269   int                 findRowFromEntry(QString entry);
270   CORBA::Object_var   entryToObject(QString entry);
271   static LightApp_SelectionMgr* selectionMgr();
272   void                avoidSimultaneousSelection(ListOfWidgets &myCustomWidgets) const;
273   void                AddPreCadSequenceToVector(BlsurfHypothesisData& h_data, BLSURFPlugin::TPeriodicityList_var preCadFacePeriodicityVector, bool onFace) const;
274   void                addHyPatchToTable(const QString& tags, const QString& entries);
275   bool                hasGeom() const;
276
277 private:
278   
279   QTabWidget*             myTabWidget;
280   QWidget*                myStdGroup;
281   BLSURFPluginGUI_StdWidget* myStdWidget;
282   QLineEdit*              myName;
283
284   QWidget*                myAdvGroup;
285   BLSURFPluginGUI_AdvWidget* myAdvWidget;
286
287   // Sizemap widgets
288   QWidget                 *mySmpGroup;
289   QTreeWidget             *mySizeMapTable;
290   QPushButton             *addMapButton;
291   QPushButton             *removeMapButton;
292   QPushButton             *modifyMapButton;
293   QTabWidget              *smpTab; 
294   QWidget                 *myAttractorGroup;
295   QWidget                 *mySmpStdGroup;
296   QCheckBox               *myAttractorCheck;
297   QCheckBox               *myConstSizeCheck;
298   QGroupBox               *myDistanceGroup;
299 //   QGroupBox               *myParamsGroup;
300 //   QWidget                 *myParamsGroup;
301   SMESHGUI_SpinBox        *myAttSizeSpin;
302   SMESHGUI_SpinBox        *myAttDistSpin;
303   SMESHGUI_SpinBox        *myAttDistSpin2;
304   SMESHGUI_SpinBox        *mySmpSizeSpin;
305   QLabel                  *myAttDistLabel;
306   QLabel                  *myAttDistLabel2;
307   QLabel                  *myAttSizeLabel;
308   // Selection widgets for size maps
309   StdMeshersGUI_ObjectReferenceParamWdg *myGeomSelWdg1;
310   StdMeshersGUI_ObjectReferenceParamWdg *myGeomSelWdg2;
311   StdMeshersGUI_ObjectReferenceParamWdg *myAttSelWdg;
312   StdMeshersGUI_ObjectReferenceParamWdg *myDistSelWdg;
313   GEOM::GEOM_Object_var                  mySMapObject;
314   GEOM::GEOM_Object_var                  myAttObject;
315   GEOM::GEOM_Object_var                  myDistObject;
316   
317   
318   
319   
320   QWidget*            myEnfGroup;
321   StdMeshersGUI_ObjectReferenceParamWdg *myEnfFaceWdg;
322   GEOM::GEOM_Object_var myEnfFace;
323   StdMeshersGUI_ObjectReferenceParamWdg *myEnfVertexWdg;
324   GEOM::GEOM_Object_var myEnfVertex;
325
326   QTreeWidget*        myEnforcedTreeWidget;
327   SMESHGUI_SpinBox*   myXCoord;
328   SMESHGUI_SpinBox*   myYCoord;
329   SMESHGUI_SpinBox*   myZCoord;
330
331   QLineEdit*          myGroupName;
332
333   QPushButton*        addVertexButton;
334   QPushButton*        removeVertexButton;
335
336   QCheckBox           *myInternalEnforcedVerticesAllFaces;
337   QLineEdit           *myInternalEnforcedVerticesAllFacesGroup;
338
339   // map =  entry , size map
340   QMap<QString, QString>          mySMPMap;           // Map <face entry, size>
341   QMap<QString, TAttractorVec >   myATTMap;           // Map <face entry, att. entry, etc>
342   QMap<QString, TopAbs_ShapeEnum> mySMPShapeTypeMap;
343   GeomSelectionTools*             GeomToolSelected;
344   LightApp_SelectionMgr*          aSel;
345
346   // Periodicity
347   QWidget*      myPeriodicityGroup;
348   QSplitter*    myPeriodicitySplitter;
349   QTreeWidget*  myPeriodicityTreeWidget;
350   QWidget*      myPeriodicityRightWidget;
351   QGridLayout*  myPeriodicityRightGridLayout;
352   QGroupBox*    myPeriodicityGroupBox1;
353   QGroupBox*    myPeriodicityGroupBox2;
354   QGridLayout* aPeriodicityLayout1;
355   QGridLayout*  myPeriodicityGroupBox1Layout;
356   QGridLayout*  myPeriodicityGroupBox2Layout;
357   QRadioButton* myPeriodicityOnFaceRadioButton;
358   QRadioButton* myPeriodicityOnEdgeRadioButton;
359   QLabel*       myPeriodicityMainSourceLabel;
360   QLabel*       myPeriodicityMainTargetLabel;
361   QLabel*       myPeriodicitySourceLabel;
362   QLabel*       myPeriodicityTargetLabel;
363   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicitySourceFaceWdg;
364   GEOM::GEOM_Object_var myPeriodicityFace;
365   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityTargetFaceWdg;
366   GEOM::GEOM_Object_var myPeriodicityEdge;
367   QLabel*       myPeriodicityP1SourceLabel;
368   QLabel*       myPeriodicityP2SourceLabel;
369   QLabel*       myPeriodicityP3SourceLabel;
370   QLabel*       myPeriodicityP1TargetLabel;
371   QLabel*       myPeriodicityP2TargetLabel;
372   QLabel*       myPeriodicityP3TargetLabel;
373   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityP1SourceWdg;
374   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityP2SourceWdg;
375   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityP3SourceWdg;
376   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityP1TargetWdg;
377   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityP2TargetWdg;
378   StdMeshersGUI_ObjectReferenceParamWdg* myPeriodicityP3TargetWdg;
379   ListOfWidgets myPeriodicitySelectionWidgets;
380   QPushButton*  myPeriodicityAddButton;
381   QPushButton*  myPeriodicityRemoveButton;
382   QSpacerItem*  myPeriodicityVerticalSpacer;
383
384   QTableWidget*                      myHyPatchTable;
385   StdMeshersGUI_SubShapeSelectorWdg* myHyPatchFaceSelector;
386   QLineEdit*                         myHyPatchTagsLE;
387   QPushButton*                       myHyPatchFaceSelBtn;
388   QPushButton*                       myHyPatchGroupSelBtn;
389
390   BLSURFPlugin::string_array_var myOptions, myPreCADOptions, myCustomOptions;
391
392   PyObject *          main_mod;
393   PyObject *          main_dict;
394 };
395
396
397 class EnforcedTreeWidgetDelegate : public QItemDelegate
398 {
399     Q_OBJECT
400
401 public:
402   EnforcedTreeWidgetDelegate(QObject *parent = 0);
403
404   QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem & option,
405                         const QModelIndex &index) const;
406
407   void setEditorData(QWidget *editor, const QModelIndex &index) const;
408   void setModelData(QWidget *editor, QAbstractItemModel *model,
409                     const QModelIndex &index) const;
410
411   void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
412                     const QModelIndex &index) const;
413
414   bool vertexExists(QAbstractItemModel *model, const QModelIndex &index, QString value) const;
415 };
416
417 #endif // BLSURFPLUGINGUI_HypothesisCreator_H