Developer Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PolyLinePlugin.hh
1 /*===========================================================================*\
2  * *
3  * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40 \*===========================================================================*/
41 
42 //=============================================================================
43 //
44 // CLASS PolyLinePlugin
45 //
46 // Author: David Bommes <bommes@cs.rwth-aachen.de>
47 //
48 // Version: $Revision: 1$
49 // Date: $Author$
50 // $Date: 03-10-2007$
51 //
52 //
53 //=============================================================================
54 
55 #ifndef POLYLINEPLUGIN_HH
56 #define POLYLINEPLUGIN_HH
57 
58 #define CGAL_NO_AUTOLINK_MPFR
59 #define CGAL_NO_AUTOLINK_GMP
60 
61 //== INCLUDES =================================================================
62 
63 #include <QObject>
64 #include <QMenuBar>
65 #include <QTimer>
66 
83 
84 #include "PolyLineToolbarWidget.hh"
85 
86 #include <ObjectTypes/Plane/QtPlaneSelect.hh>
87 
88 #include <ACG/Scenegraph/GlutPrimitiveNode.hh>
89 
90 #include <ObjectTypes/PolyLine/PolyLineCircleData.hh>
91 #include <ObjectTypes/PolyLine/PolyLineBezierSplineData.hh>
92 
93 #define CREATE_CUT_POLYLINE "Create Polyline"
94 #define CREATE_CUT_POLYLINES "Create Polylines"
95 
96 //== CLASS DEFINITION =========================================================
97 
98 
101 class PolyLinePlugin: public QObject,
110  KeyInterface,
113  Q_OBJECT
114  Q_INTERFACES(BaseInterface)
115  Q_INTERFACES(MouseInterface)
116  Q_INTERFACES(PickingInterface)
117  Q_INTERFACES(ToolboxInterface)
118  Q_INTERFACES(LoggingInterface)
119  Q_INTERFACES(LoadSaveInterface)
120  Q_INTERFACES(ToolbarInterface)
121  Q_INTERFACES(StatusbarInterface)
122  Q_INTERFACES(KeyInterface)
123  Q_INTERFACES(ScriptInterface)
124  Q_INTERFACES(ContextMenuInterface)
125 
126 #if QT_VERSION >= 0x050000
127  Q_PLUGIN_METADATA(IID "org.OpenFlipper.Plugins.Plugin-PolyLine")
128 #endif
129 
130 signals:
131 
132  // BaseInterface
133  void updateView();
134  void updatedObject(int _identifier, const UpdateType& _type);
135  void nodeVisibilityChanged(int _id);
136 
137  // PickingInterface
138  void addPickMode( const std::string& _mode );
139  void addHiddenPickMode( const std::string& _mode );
140  void setPickModeToolbar (const std::string& _mode, QToolBar * _toolbar);
141  void setPickModeMouseTracking(const std::string& _mode , bool _mouseTracking);
142 
143  // LoggingInterface
144  void log(Logtype _type, QString _message);
145  void log(QString _message);
146 
147  // ToolbarInterface
148  void addToolbar(QToolBar* _toolbar);
149  void getToolBar( QString _name, QToolBar*& _toolbar);
150 
151  // ScriptInterface
152  void scriptInfo( QString _functionName );
153 
154  // ToolboxInterface
155  void addToolbox( QString _name , QWidget* _widget, QIcon* _icon);
156 
157  void deleteObject( int _id );
158  void addEmptyObject( DataType _type, int& _id);
159 
160  void registerKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description, bool _multiUse = false);
161  void showStatusMessage(QString _message, int _timeout = 0);
162  void clearStatusMessage();
163 
164  //ContextMenuInterface
165  void addContextMenuItem(QAction* _action ,DataType _objectType , ContextMenuType _type );
166 
167 private slots :
168  // BaseInterface
169  void initializePlugin();
170 
171  void slotEditModeChanged();
172 
173  void slotMouseEvent( QMouseEvent* _event );
174  void slotKeyEvent(QKeyEvent* _event);
175 
176  void slotPickModeChanged( const std::string& _mode);
177 
178  void pluginsInitialized();
179 
180  bool pick_triangle_mesh( QPoint mPos,
181  TriMeshObject*& _mesh_object_, TriMesh::FaceHandle& _fh, TriMesh::VertexHandle& _vh, ACG::Vec3d& _hitPoint);
182 
183  void slotUpdateContextMenu(int objectId);
184 public slots :
185 
186  void slotEnablePickMode(QString _name);
187 
188 public :
189 
191  enum EditMode { PL_NONE =0,
192  PL_INSERT=1,
193  PL_INSERTCIRCLE,
194  PL_INSERTSPLINE,
195  PL_DELETE,
196  PL_MOVE,
197  PL_SPLIT,
198  PL_MERGE,
199  PL_SMART_MOVE,
200  PL_COPY_PASTE };
201 
203  PolyLinePlugin();
204 
207 
209  QString name(){ return (QString("PolyLine")); };
210 
212  QString description() { return (QString("Handling of PolyLines (Insertion/Deletion/Modeling/...")); };
213 
214 public slots:
215 
216 #ifdef EXTENDED_POLY_LINE
217  void slot_resample_on_edges();
218 #endif
219 
220 private slots:
221 
222  void slot_subdivide();
223  void slot_subdivide_percent(bool _checked);
224  void slot_decimate();
225  void slot_decimate_percent(bool _checked);
226 
227  void slot_smooth();
228  void slot_smooth( PolyLineObject*& _pol);
229  void slot_project();
230  void slot_project( PolyLineObject*& _pol);
231  void slot_smooth_project();
232  void slot_smooth_project( PolyLineObject*& _pol);
233 
234  void slot_smart_move_timer();
235 
236  void slot_setCirclePointNum(int i);
237  void slot_setSplinePointNum(int i);
238 
239  virtual void slotObjectUpdated( int _identifier, const UpdateType &_type );
240 
241  void slot_duplicate();
242  void slot_instanciate();
243  void finishSpline();
244 private :
245 
246  EditMode mode();
247 
248  // mouse events
249  void me_insert ( QMouseEvent* _event );
250  void me_insertCircle( QMouseEvent* _event );
251  void me_insertSpline( QMouseEvent* _event );
252  void me_delete ( QMouseEvent* _event );
253  void me_move ( QMouseEvent* _event );
254  void me_split ( QMouseEvent* _event );
255  void me_merge ( QMouseEvent* _event );
256  void me_smart_move ( QMouseEvent* _event );
257 
258  //===========================================================================
261  //===========================================================================
262 
263  private :
264 
267 
270  //===========================================================================
273  //===========================================================================
274 
275  private :
276  QAction* polyLineAction_;
277  QActionGroup* toolBarActions_;
278 
279  QToolBar* toolbar_;
280 
281  private slots:
282 
284  void slotSetPolyLineMode(QAction* _action);
285 
288  //===========================================================================
291  //===========================================================================
292 
293  private :
294  QToolBar* pickToolbar_;
295  QActionGroup* pickToolBarActions_;
296 
297  QAction* insertAction_;
300  QAction* deleteAction_;
301  QAction* moveAction_;
303  QAction* mergeAction_;
304  QAction* splitAction_;
305  QAction* cutAction_;
307 
308  private slots:
309 
311  void slotPickToolbarAction(QAction* _action);
312 
315  //===========================================================================
318  //===========================================================================
319 
320  private:
321 
323  template< class MeshT > std::vector< ACG::Vec3d >
324  getIntersectionPoints ( MeshT* _mesh, uint _fh, ACG::Vec3d _planeNormal ,
325  ACG::Vec3d _planePoint, bool& _closed );
326 
328  template< class MeshT > std::vector< std::vector< ACG::Vec3d > >
329  getMultipleIntersectionPoints( MeshT* _mesh, ACG::Vec3d _planeNormal , ACG::Vec3d _planePoint );
330 
332  template< class MeshT >
333  typename MeshT::EdgeHandle
334  getCuttedEdge(MeshT& _mesh, ACG::Vec3d& _planeNormal, ACG::Vec3d& _planePoint);
335 
338 public slots:
339 
340  QString version() { return QString("1.02"); };
341 
342  //============================================
343 
345  int generatePolyLineFromCut( int _objectId, Vector _planePoint, Vector _planeNormal, int _polyLineId = -1 );
346 
348  IdList generatePolyLinesFromCut( int _objectId, Vector _planePoint, Vector _planeNormal );
349 
350 private slots:
351 
353  void slotScissorButton();
354 
356  void slotScissorLinesButton();
357 
360 
361 private:
362  int cur_insert_id_;
363  PolyLineObject *cur_polyline_obj_;
364 
365  int cur_move_id_;
366  PolyLine::Point* move_point_ref_;
367  PolyLine::Point* create_point_ref_;
368  PolyLine::Point move_point_orig_;
369 
378  ACG::Vec3d moveCircle_LastHitNor_;
379  bool moveCircle_IsLocked;
380  bool moveCircle_IsFloating;
381 
382  QAction* copyPaste_Action_;
383  int copyPaste_ObjectId_;
384  int copyPaste_ActionType_;
385  int copyPaste_NewObjectId_;
386  std::vector<ACG::Vec3d> copyPaste_RelativePoints_;
387  QPoint copyPaste_LastMouse;
388 
389  /*
390  * \brief Handles the mouse event during a copy paste event
391  *
392  * Determines wether duplicate or instanciate is happening and performs the
393  * action, ending the mode.
394  */
395  void me_copyPasteMouse(QMouseEvent* _event);
396 
409  bool createCircle_getPointOnMesh(TriMeshObject* _triMeshObject,
410  ACG::Vec3d _center,
411  ACG::Vec3d _pOnPlane,
412  ACG::Vec3d _n,
413  ACG::Vec3d* _pOut);
414 
426  ACG::Vec3d _hit_Point,
427  ACG::Vec3d* _pOut = 0,
428  double* _r = 0,
429  ACG::Vec3d* _onPlane = 0);
430 
441 
442 public slots:
443  /* \brief Creates the UI elements for the poly line(asserting it has circle data)
444  *
445  */
446  void createCircle_createUI(int _polyLineObjectID);
447 
448  /* \brief Creates the UI elements for the poly line(asserting it has spline data)
449  *
450  */
451  void createSpline_createUI(int _polyLineObjectID);
452 
453 private:
460  void updatePolyEllipse(PolyLineObject* _lineObject, unsigned int _pointCount);
461 
466  void updateHandles(PolyLineObject* _lineObject);
467 
474  void updatePolyBezierSpline(PolyLineObject* _lineObject, unsigned int _pointsPerSegment);
475 
481 
490 
495 
502 
503  int cur_merge_id_;
504 
505  QTimer* smart_move_timer_;
506 
507  PolyLineObject* cur_smart_move_obj_;
508 
511 
512 };
513 
514 #if defined(INCLUDE_TEMPLATES) && !defined(POLYLINEPLUGIN_CC)
515 #define POLYLINEPLUGIN_TEMPLATES
516 #include "PolyLinePluginT.cc"
517 #endif
518 
519 #endif //MOVEPLUGIN_HH
Add a toolbox to OpenFlipper.
std::vector< int > IdList
Standard Type for id Lists used for scripting.
Definition: DataTypes.hh:192
Control OpenFlippers status bar.
Interface class for receiving mouse events.
int createSpline_CurrSelIndex_
The index of the currently created spline.
QtPlaneSelect * planeSelect_
Plane selection tool.
void slotScissorButton()
Scissor Button was hit.
int moveBezSpline_SelSubIndex_
The index of the control or handle being moved.
ACG::Vec3d getPointOnMesh(PolyLineBezierSplineData *_SplineData, ACG::Vec3d _point, ACG::Vec3d *_nor=0)
Returns the nearest point on the mesh or if none could be found the input.
QActionGroup * pickToolBarActions_
Called by pick Toolbar.
QAction * cutMultipleAction_
Called by pick Toolbar.
Interface for all plugins which want to Load or Save files and create Objects.
Interface for all Plugins which provide scriptable Functions.
std::vector< ACG::Vec3d > getIntersectionPoints(MeshT *_mesh, uint _fh, ACG::Vec3d _planeNormal, ACG::Vec3d _planePoint, bool &_closed)
get the points from the closest connected intersection between mesh and plane
std::vector< std::vector< ACG::Vec3d > > getMultipleIntersectionPoints(MeshT *_mesh, ACG::Vec3d _planeNormal, ACG::Vec3d _planePoint)
get all points from the intersection between mesh and plane
Plugins can add its own toolbox to the main widget's toolbox area by using this interface.
QAction * mergeAction_
Called by pick Toolbar.
Interface class for creating custom context menus.
Type for a MeshObject containing a triangle mesh.
Definition: TriangleMesh.hh:73
QString description()
Description of the Plugin.
Interface for all Plugins which do logging to the logging window of the framework.
QAction * splitAction_
Called by pick Toolbar.
int createSpline_LastSelIndex_
Use this one to mark the last index to update the number of points.
Update type class.
Definition: UpdateType.hh:70
QAction * insertCircleAction_
Called by pick Toolbar.
int generatePolyLineFromCut(int _objectId, Vector _planePoint, Vector _planeNormal, int _polyLineId=-1)
Generates a polyLine of a plane intersection.
void slotPickToolbarAction(QAction *_action)
Called by pick Toolbar.
void updatePolyBezierHandles(PolyLineObject *_lineObject, ACG::SceneGraph::LineNode *_line)
Updates all the handles on the PolyBezier.
Keyboard Event Interface.
Definition: KeyInterface.hh:76
IdList generatePolyLinesFromCut(int _objectId, Vector _planePoint, Vector _planeNormal)
Generates a polyLine of a plane intersection.
ACG::Vec3d createCircle_getHit(PolyLineCircleData *_circleData, ACG::Vec3d _hit_point)
Returns point on mesh or point on the normal plane.
QAction * polyLineAction_
Called by Toolbar to enable pick mode.
QString name()
Name of the Plugin.
int createCircle_CurrSelIndex_
The object which is being modified(created, dragged)
bool createCircle_getPointOnMesh(TriMeshObject *_triMeshObject, ACG::Vec3d _center, ACG::Vec3d _pOnPlane, ACG::Vec3d _n, ACG::Vec3d *_pOut)
Calculates a point on the mesh.
QToolBar * toolbar_
Called by Toolbar to enable pick mode.
bool createCircle_getHitInfo(PolyLineCircleData *_circleData, ACG::Vec3d _hit_Point, ACG::Vec3d *_pOut=0, double *_r=0, ACG::Vec3d *_onPlane=0)
Calculates common info.
Interface class from which all plugins have to be created.
~PolyLinePlugin()
default destructor
Logtype
Log types for Message Window.
PolyLineToolbarWidget * tool_
Widget for Toolbox.
QActionGroup * toolBarActions_
Called by Toolbar to enable pick mode.
void slotTriggerCutPlaneSelect()
Generate PolyLine after the cutPlane has been drawn.
QAction * insertAction_
Called by pick Toolbar.
EditMode
Edit Mode of PolyLinePlugin.
QAction * smartMoveAction_
Called by pick Toolbar.
Predefined datatypes.
Definition: DataTypes.hh:96
QAction * cutAction_
Called by pick Toolbar.
void updatePolyBezierSpline(PolyLineObject *_lineObject, unsigned int _pointsPerSegment)
Generates points for the spline, updates handles.
void slotScissorLinesButton()
Scissor Button for multiple polylines was hit.
PolyLinePlugin()
default constructor
ACG::SceneGraph::GlutPrimitiveNode * moveCircle_SelNode_
The handle which is being dragged.
QAction * moveAction_
Called by pick Toolbar.
QAction * deleteAction_
Called by pick Toolbar.
MeshT::EdgeHandle getCuttedEdge(MeshT &_mesh, ACG::Vec3d &_planeNormal, ACG::Vec3d &_planePoint)
get an edge of the mesh that is cut by the plane
QToolBar * pickToolbar_
Called by pick Toolbar.
int moveBezSpline_SelIndex_
The object which is being moved.
int createCircle_LastSelIndex_
Use this one to mark the last index to update the number of points.
void updateHandles(PolyLineObject *_lineObject)
Updates the center, forward and side handle of the Poly ellipse.
ACG::SceneGraph::GlutPrimitiveNode * moveBezSpline_SelNode_
The handle which is being dragged.
ACG::Vec3d moveCircle_LastHitPos_
The last valid hit on the mesh.
Allow access to picking functions.
QAction * insertSplineAction_
Called by pick Toolbar.
void updatePolyEllipse(PolyLineObject *_lineObject, unsigned int _pointCount)
Generates points for the ellipse.
void slotSetPolyLineMode(QAction *_action)
Called by Toolbar to enable pick mode.