Developer Documentation
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
QString name()
Name of the Plugin.
Interface class for creating custom context menus.
Interface class for receiving mouse events.
Predefined datatypes.
Definition: DataTypes.hh:96
QAction * deleteAction_
Called by pick Toolbar.
QAction * splitAction_
Called by pick Toolbar.
int createSpline_CurrSelIndex_
The index of the currently created spline.
Logtype
Log types for Message Window.
Type for a MeshObject containing a triangle mesh.
Definition: TriangleMesh.hh:73
ACG::SceneGraph::GlutPrimitiveNode * moveBezSpline_SelNode_
The handle which is being dragged.
Control OpenFlippers status bar.
PolyLinePlugin()
default constructor
Keyboard Event Interface.
Definition: KeyInterface.hh:76
int createCircle_LastSelIndex_
Use this one to mark the last index to update the number of points.
QAction * insertAction_
Called by pick Toolbar.
int createCircle_CurrSelIndex_
The object which is being modified(created, dragged)
QString description()
Description of the Plugin.
ACG::Vec3d moveCircle_LastHitPos_
The last valid hit on the mesh.
void updatePolyBezierHandles(PolyLineObject *_lineObject, ACG::SceneGraph::LineNode *_line)
Updates all the handles on the PolyBezier.
void updatePolyBezierSpline(PolyLineObject *_lineObject, unsigned int _pointsPerSegment)
Generates points for the spline, updates handles.
QToolBar * toolbar_
Called by Toolbar to enable pick mode.
int moveBezSpline_SelIndex_
The object which is being moved.
Interface for all Plugins which provide scriptable Functions.
Interface class from which all plugins have to be created.
Update type class.
Definition: UpdateType.hh:70
Plugins can add its own toolbox to the main widget&#39;s toolbox area by using this interface.
EditMode
Edit Mode of PolyLinePlugin.
Interface for all Plugins which do logging to the logging window of the framework.
void slotScissorButton()
Scissor Button was hit.
void updateHandles(PolyLineObject *_lineObject)
Updates the center, forward and side handle of the Poly ellipse.
void updatePolyEllipse(PolyLineObject *_lineObject, unsigned int _pointCount)
Generates points for the ellipse.
ACG::SceneGraph::GlutPrimitiveNode * moveCircle_SelNode_
The handle which is being dragged.
QAction * smartMoveAction_
Called by pick Toolbar.
QActionGroup * toolBarActions_
Called by Toolbar to enable pick mode.
void slotTriggerCutPlaneSelect()
Generate PolyLine after the cutPlane has been drawn.
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
void slotScissorLinesButton()
Scissor Button for multiple polylines was hit.
QActionGroup * pickToolBarActions_
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
std::vector< int > IdList
Standard Type for id Lists used for scripting.
Definition: DataTypes.hh:192
ACG::Vec3d createCircle_getHit(PolyLineCircleData *_circleData, ACG::Vec3d _hit_point)
Returns point on mesh or point on the normal plane.
bool createCircle_getHitInfo(PolyLineCircleData *_circleData, ACG::Vec3d _hit_Point, ACG::Vec3d *_pOut=0, double *_r=0, ACG::Vec3d *_onPlane=0)
Calculates common info.
QAction * cutAction_
Called by pick Toolbar.
QToolBar * pickToolbar_
Called by pick Toolbar.
QtPlaneSelect * planeSelect_
Plane selection tool.
PolyLineToolbarWidget * tool_
Widget for Toolbox.
Interface for all plugins which want to Load or Save files and create Objects.
void slotSetPolyLineMode(QAction *_action)
Called by Toolbar to enable pick mode.
QAction * mergeAction_
Called by pick Toolbar.
int moveBezSpline_SelSubIndex_
The index of the control or handle being moved.
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
QAction * insertCircleAction_
Called by pick Toolbar.
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.
IdList generatePolyLinesFromCut(int _objectId, Vector _planePoint, Vector _planeNormal)
Generates a polyLine of a plane intersection.
QAction * moveAction_
Called by pick Toolbar.
QAction * insertSplineAction_
Called by pick Toolbar.
int createSpline_LastSelIndex_
Use this one to mark the last index to update the number of points.
bool createCircle_getPointOnMesh(TriMeshObject *_triMeshObject, ACG::Vec3d _center, ACG::Vec3d _pOnPlane, ACG::Vec3d _n, ACG::Vec3d *_pOut)
Calculates a point on the mesh.
QAction * cutMultipleAction_
Called by pick Toolbar.
int generatePolyLineFromCut(int _objectId, Vector _planePoint, Vector _planeNormal, int _polyLineId=-1)
Generates a polyLine of a plane intersection.
QAction * polyLineAction_
Called by Toolbar to enable pick mode.
void slotPickToolbarAction(QAction *_action)
Called by pick Toolbar.
Add a toolbox to OpenFlipper.
~PolyLinePlugin()
default destructor
Allow access to picking functions.