MeshRepairPlugin.hh 11.7 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/*===========================================================================*\
*                                                                            *
*                              OpenFlipper                                   *
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
*                           www.openflipper.org                              *
*                                                                            *
*--------------------------------------------------------------------------- *
*  This file is part of OpenFlipper.                                         *
*                                                                            *
*  OpenFlipper is free software: you can redistribute it and/or modify       *
*  it under the terms of the GNU Lesser General Public License as            *
*  published by the Free Software Foundation, either version 3 of            *
*  the License, or (at your option) any later version with the               *
*  following exceptions:                                                     *
*                                                                            *
*  If other files instantiate templates or use macros                        *
*  or inline functions from this file, or you compile this file and          *
*  link it with other files to produce an executable, this file does         *
*  not by itself cause the resulting executable to be covered by the         *
*  GNU Lesser General Public License. This exception does not however        *
*  invalidate any other reasons why the executable file might be             *
*  covered by the GNU Lesser General Public License.                         *
*                                                                            *
*  OpenFlipper is distributed in the hope that it will be useful,            *
*  but WITHOUT ANY WARRANTY; without even the implied warranty of            *
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
*  GNU Lesser General Public License for more details.                       *
*                                                                            *
*  You should have received a copy of the GNU LesserGeneral Public           *
*  License along with OpenFlipper. If not,                                   *
*  see <http://www.gnu.org/licenses/>.                                       *
*                                                                            *
\*===========================================================================*/

/*===========================================================================*\
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
\*===========================================================================*/

#ifndef MESHREPAIRPLUGIN_HH
#define MESHREPAIRPLUGIN_HH

#include <QObject>
#include <QMenuBar>

#include <OpenFlipper/BasePlugin/BaseInterface.hh>
#include <OpenFlipper/BasePlugin/LoggingInterface.hh>
#include <OpenFlipper/BasePlugin/ToolboxInterface.hh>
#include <OpenFlipper/BasePlugin/BackupInterface.hh>
53 54
#include <OpenFlipper/BasePlugin/ScriptInterface.hh>
#include <OpenFlipper/BasePlugin/RPCInterface.hh>
Jan Möbius's avatar
 
Jan Möbius committed
55 56 57 58 59 60
#include <OpenFlipper/common/Types.hh>
#include <ObjectTypes/PolyMesh/PolyMesh.hh>
#include <ObjectTypes/TriangleMesh/TriangleMesh.hh>

#include "MeshRepairToolbar.hh"

61
class MeshRepairPlugin : public QObject, BaseInterface , ToolboxInterface, BackupInterface, LoggingInterface, ScriptInterface, RPCInterface
Jan Möbius's avatar
 
Jan Möbius committed
62 63 64 65 66 67
{
    Q_OBJECT
    Q_INTERFACES(BaseInterface)
    Q_INTERFACES(ToolboxInterface)
    Q_INTERFACES(BackupInterface)
    Q_INTERFACES(LoggingInterface)
68 69
    Q_INTERFACES(ScriptInterface)
    Q_INTERFACES(RPCInterface)
Jan Möbius's avatar
 
Jan Möbius committed
70

Matthias Möller's avatar
Matthias Möller committed
71 72 73 74
#if QT_VERSION >= 0x050000
  Q_PLUGIN_METADATA(IID "org.OpenFlipper.Plugins.Plugin-MeshRepair")
#endif

Jan Möbius's avatar
 
Jan Möbius committed
75 76 77 78 79
signals:

    void updateView();

    // Base Interface
80
    void updatedObject(int _identifier, const UpdateType& _type);
81 82
    void setSlotDescription(QString     _slotName,   QString     _slotDescription,
                            QStringList _parameters, QStringList _descriptions);
Jan Möbius's avatar
 
Jan Möbius committed
83

84
    // Logging interface
Jan Möbius's avatar
 
Jan Möbius committed
85 86 87 88 89 90 91
    void log(Logtype _type, QString _message);
    void log(QString _message);

    // ToolboxInterface
    void addToolbox( QString _name  , QWidget* _widget, QIcon* _icon );

    // Backup Interface
Dirk Wilden's avatar
Dirk Wilden committed
92
    void createBackup( int _objectid, QString _name, UpdateType _type = UPDATE_ALL);
Jan Möbius's avatar
 
Jan Möbius committed
93

94 95 96 97 98 99 100
    // RPC Interface
    void pluginExists( QString _pluginName , bool& _exists  ) ;
    void functionExists( QString _pluginName , QString _functionName , bool& _exists  );

    // ScriptInterface
    void scriptInfo( QString _functionName );

Jan Möbius's avatar
 
Jan Möbius committed
101 102 103
private slots:

    void initializePlugin();
104
    void pluginsInitialized();
Jan Möbius's avatar
 
Jan Möbius committed
105 106 107

public :

Jan Möbius's avatar
Jan Möbius committed
108 109
    MeshRepairPlugin();

Jan Möbius's avatar
 
Jan Möbius committed
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    ~MeshRepairPlugin() {};

    QString name() {
        return (QString("Mesh Repair"));
    };
    QString description( ) {
        return (QString("Functionality to repair meshes"));
    };

private :

    /// Widget for Toolbox
    MeshRepairToolbarWidget* tool_;
    QIcon* toolIcon_;

private slots:

    /// Button slot
    void slotRemoveSelectedVal3Vertices();

    /// Button slot
    void slotRemoveSelectedEdges();

    /// Button slot
134
    void slotDetectSkinnyTriangleByAngle();
Jan Möbius's avatar
 
Jan Möbius committed
135 136

    /// Button slot
137
    void slotRemoveSkinnyTriangleByAngle();
Jan Möbius's avatar
 
Jan Möbius committed
138 139 140 141 142 143 144

    /// Button slot
    void slotDetectFoldover();

    /// Button slot
    void slotDetectTriangleAspect();

145 146 147
    /// Button slot
    void slotFlipOrientation();

Jan Möbius's avatar
Jan Möbius committed
148 149 150
    /// Button slot
    void slotFixMesh();

151 152 153 154 155 156
    /// Button slot
    void slotUpdateVertexNormals();

    /// Button slot
    void slotUpdateFaceNormals();

157 158 159
    /// Button slot
    void slotUpdateHalfedgeNormals();

160 161 162 163
    /// Button slot
    void slotUpdateNormals();

    /// Button Slot
164
    void slotDetectEdgesLonger();
165

166 167
    /// Button Slot
    void slotDetectEdgesShorter();
168

169 170
    /// Button slot
    void slotDetectFlatValence3Vertices();
171

172 173 174
    /// Button slot
    void slotSnapBoundary();

Matthias Möller's avatar
Matthias Möller committed
175
    /// Button slot
176 177 178 179 180 181 182
    void slotFixNonManifoldVertices();


    //===========================================================================
    /** @name Scripting functions
    * @{ */
    //===========================================================================
Matthias Möller's avatar
Matthias Möller committed
183

184
public slots:
Jan Möbius's avatar
 
Jan Möbius committed
185

Jan Möbius's avatar
Jan Möbius committed
186 187 188 189 190 191 192 193 194
    // ==================================================
    // Vertex operations
    // ==================================================

    /** \brief Detect valence 3 vertices with faces that lie in the plane of their adjacent triangles
     *
     */
    void detectFlatValence3Vertices(int _objectId, double _angle);

195 196 197
    /// Remove all selected valence 3 vertices
    void removeSelectedVal3Vertices(int _objectId);

Jan Möbius's avatar
Jan Möbius committed
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
    // ==================================================
    // Edge operations
    // ==================================================

    /** \brief Selects all edges of an object which are shorter than the given length
     *
     * @param _objectId Id of the object
     * @param _length   maximal edge length to select
     */
    void selectEdgesShorterThan(int _objectId,double _length);

    /** \brief Selects all edges of an object which are larger than the given length
     *
     * @param _objectId Id of the object
     * @param _length   Minimal edge length to select
     */
    void selectEdgesLongerThan(int _objectId,double _length);

    /** \brief Removes all selected edges
     *
     * @param _objectId Id of the object
     */
Jan Möbius's avatar
 
Jan Möbius committed
220 221
    void removeSelectedEdges(int _objectId);

Jan Möbius's avatar
Jan Möbius committed
222 223 224 225 226 227
    /** \brief  Detect/Remove edges where neighboring faces form angle > _angle degrees
     *
     * @param _objectId Id of the object
     * @param _angle    minimal angle to detect
     * @param _remove   Detect them or also remove them?
     */
228
    void detectSkinnyTriangleByAngle(int _objectId, double _angle, bool _remove);
229

Jan Möbius's avatar
Jan Möbius committed
230 231 232 233 234
    /** \brief Detect folded-over configurations by the dihedral angle
     *
     * @param _objectId Id of the object
     * @param _angle    Minimal dihedral angle that will be selected
     */
235
    void detectFoldover(int _objectId, float _angle);
236

Jan Möbius's avatar
Jan Möbius committed
237

Jan Möbius's avatar
Jan Möbius committed
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
    // ==================================================
    // Face operations
    // ==================================================

    /** \brief Detect triangles with aspect ratio greater than _aspect and select them
     *
     * @param _objectId Id of the object
     * @param _aspect   Minimal aspect ratio to select
     */
    void detectTriangleAspect(int _objectId, float _aspect);

    /** \brief Flips the normals of all selected faces by changing the vertex order
     *
     * @param _objectId Id of the object
     */
    void flipOrientation(int _objectId);
254

255 256 257 258
    // ==================================================
    // Normal recomputations
    // ==================================================

259 260 261 262
    /** \brief  Recomputes the face normals of an object
     *
     * @param _objectId Id of the object
     */
263 264
    void updateFaceNormals(int _objectId);

265 266 267 268
    /** \brief Recomputes the halfedge normals of an object
     *
     * @param _objectId Id of the object
     */
269 270
    void updateHalfedgeNormals(int _objectId);

271 272 273 274
    /** \brief Recomputes the vertex normals of an object
     *
     * @param _objectId Id of the object
     */
275 276
    void updateVertexNormals(int _objectId);

277 278 279 280
    /** \brief  Recomputes the face and vertex normals of an object
     *
     * @param _objectId Id of the object
     */
281 282 283 284 285 286
    void updateNormals(int _objectId);

    // ==================================================
    // General
    // ==================================================

Jan Möbius's avatar
Jan Möbius committed
287 288 289 290 291 292 293 294 295
    /** \brief Snaps selected vertices at boundaries
     *
     * Snaps selected boundary vertices together if they are closer than the given
     * distance. No new vertices will be introduced on either edge, so they are just
     * snapped to existing ones.
     *
     * @param _objectId Id of the object
     * @param _eps      Distance of vertices to snap
     */
296 297
    void snapBoundary(int _objectId, double _eps);

298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
    /** \brief remove non-manifold vertices by duplicating them
     *
     * @param _objectId Id of the mesh to fix
     */
    void fixNonManifoldVertices(int _objectId);

    /** \brief Fix a mesh
     *
     * Degenerated faces will be removed and all vertices which are closer than the given distance
     * will be collapsed. Non-manifold configurations at vertices will be removed and all faces of
     * each component will be updated to have the same orientation.
     *
     * @param _objectId Id of the object to fix
     * @param _epsilon  Snapping distance
     */
    void fixMesh(int _objectId, double _epsilon);

    /** @} */
Matthias Möller's avatar
Matthias Möller committed
316

Jan Möbius's avatar
 
Jan Möbius committed
317 318 319 320 321 322 323 324 325 326
private:
    /** \brief select edges based on length
    *
    * Selects edges if they are larger or shorter than a given length,
    * @param _objectId Id of the object to select
    * @param _length Length
    * @param _larger true : select larger edges, false select smaller edges
    */
    void selectionEdgeLength(int _objectId, double _length, bool _larger);

327 328
    /** \brief flip orientation of selected faces.
     *
329 330 331
     * flips the orientation of selected faces or if nothing is selected, the whole mesh is flipped
     * for correct topology, some vertices may be duplicated
     *
332 333 334
     * @param _mesh target mesh
     *
     */
335
    template<typename MeshT>
336
    void flipOrientation(MeshT& _mesh);
337 338


Jan Möbius's avatar
 
Jan Möbius committed
339
public slots:
Jan Möbius's avatar
Jan Möbius committed
340
    QString version() { return QString("1.3"); };
Jan Möbius's avatar
 
Jan Möbius committed
341 342
};

343 344 345 346 347
#if defined(INCLUDE_TEMPLATES) && !defined(MESHREPAIRPLUGINT_CC)
#define MESHREPAIRPLUGIN_TEMPLATES
#include "MeshRepairPluginT.cc"
#endif

Jan Möbius's avatar
 
Jan Möbius committed
348
#endif //MESHREPAIRPLUGIN_HH