InfoPlugin.cc 19.3 KB
Newer Older
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
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 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/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
Jan Möbius's avatar
Jan Möbius committed
37
 *   $Revision$                                                       *
38 39 40 41 42
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/

Jan Möbius's avatar
 
Jan Möbius committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
//=============================================================================
//
//  CLASS InfoPlugin - IMPLEMENTATION
//
//=============================================================================


//== INCLUDES =================================================================

#include <QtGui>

#include "InfoPlugin.hh"

#include <iostream>
#include <ACG/GL/GLState.hh>
#include <QStringList>
Jan Möbius's avatar
Jan Möbius committed
59
#include <QLocale>
Jan Möbius's avatar
 
Jan Möbius committed
60 61 62 63 64 65 66 67 68 69 70 71

#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
#include <MeshTools/MeshInfoT.hh>
#include <OpenFlipper/common/BaseObject.hh>
#include <ACG/Geometry/Algorithms.hh>

#include <Math_Tools/Math_Tools.hh>

#include <float.h>

//== IMPLEMENTATION ==========================================================

72 73 74 75
void InfoPlugin::initializePlugin() {
  infoBar_ = new InfoBar();
}

Jan Möbius's avatar
 
Jan Möbius committed
76 77 78 79 80
/// initialize the plugin
void InfoPlugin::pluginsInitialized() {

  //set the slot descriptions
  setDescriptions();
Jan Möbius's avatar
Jan Möbius committed
81

Dirk Wilden's avatar
Dirk Wilden committed
82 83 84
  emit addWidgetToStatusbar(infoBar_);
  infoBar_->hideCounts();
  
Jan Möbius's avatar
 
Jan Möbius committed
85 86 87 88 89 90 91
  // Initialize hit point
  hit_point_ = ACG::Vec3d(0.0, 0.0, 0.0);
}

//-----------------------------------------------------------------------------

template< class MeshT >
Dirk Wilden's avatar
Dirk Wilden committed
92
void InfoPlugin::printMeshInfo( MeshT* _mesh , int _id, unsigned int _face, ACG::Vec3d& _hitPoint ) {
Jan Möbius's avatar
Jan Möbius committed
93 94 95

  QLocale locale;

Jan Möbius's avatar
 
Jan Möbius committed
96 97 98
  if (info_ == 0){
    info_ = new InfoDialog();
  }
Jan Möbius's avatar
Jan Möbius committed
99

Jan Möbius's avatar
 
Jan Möbius committed
100 101
  int closest_v_idx = getClosestVertex(_mesh, _face);
  int closest_e_idx = getClosestEdge(_mesh, _face);
Jan Möbius's avatar
Jan Möbius committed
102

Dirk Wilden's avatar
Dirk Wilden committed
103 104 105 106 107
  QString name;

  // name
  BaseObject* obj = 0;
  if ( PluginFunctions::getObject(_id, obj) )
Dirk Wilden's avatar
Dirk Wilden committed
108
    info_->generalBox->setTitle( tr("General object information for %1").arg( obj->name() ) );
Dirk Wilden's avatar
Dirk Wilden committed
109

Jan Möbius's avatar
 
Jan Möbius committed
110
  // ID
Dirk Wilden's avatar
Dirk Wilden committed
111
  info_->id->setText( locale.toString(_id) );
Jan Möbius's avatar
 
Jan Möbius committed
112
  // Vertices
Dirk Wilden's avatar
Dirk Wilden committed
113
  info_->vertices->setText( locale.toString( _mesh->n_vertices() ) );
Jan Möbius's avatar
 
Jan Möbius committed
114
  // Faces
Dirk Wilden's avatar
Dirk Wilden committed
115
  info_->faces->setText( locale.toString( _mesh->n_faces() ) );
Jan Möbius's avatar
 
Jan Möbius committed
116
  // Edges
Dirk Wilden's avatar
Dirk Wilden committed
117
  info_->edges->setText( locale.toString( _mesh->n_edges() ) );
Jan Möbius's avatar
 
Jan Möbius committed
118
  // Closest Vertex
Dirk Wilden's avatar
Dirk Wilden committed
119
  info_->vertexHandle->setText( locale.toString( closest_v_idx ) );
Jan Möbius's avatar
 
Jan Möbius committed
120
  // Closest Edge
Dirk Wilden's avatar
Dirk Wilden committed
121
  info_->edgeHandle->setText( locale.toString( closest_e_idx ) );
Jan Möbius's avatar
Jan Möbius committed
122
  // Picked Vertex
Dirk Wilden's avatar
Dirk Wilden committed
123
  info_->faceHandle->setText( locale.toString( _face ) );
Jan Möbius's avatar
 
Jan Möbius committed
124
  // Components
Dirk Wilden's avatar
Dirk Wilden committed
125
  info_->components->setText( locale.toString(MeshInfo::componentCount(_mesh)));
Jan Möbius's avatar
 
Jan Möbius committed
126
  // Boundaries
Dirk Wilden's avatar
Dirk Wilden committed
127
  info_->boundaries->setText( locale.toString(MeshInfo::boundaryCount(_mesh)) );
Jan Möbius's avatar
 
Jan Möbius committed
128
  // Genus
129
  int genus = (2 - _mesh->n_vertices() + _mesh->n_edges() - _mesh->n_faces()) / 2;
Dirk Wilden's avatar
Dirk Wilden committed
130
  info_->genus->setText( QString::number(genus) );
Jan Möbius's avatar
 
Jan Möbius committed
131 132 133 134

  // Coordinates
  typename MeshT::VertexIter v_it;
  typename MeshT::VertexIter v_end = _mesh->vertices_end();
Jan Möbius's avatar
Jan Möbius committed
135

Jan Möbius's avatar
 
Jan Möbius committed
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
  float maxX = FLT_MIN;
  float minX = FLT_MAX;
  float sumX = 0.0;
  float maxY = FLT_MIN;
  float minY = FLT_MAX;
  float sumY = 0.0;
  float maxZ = FLT_MIN;
  float minZ = FLT_MAX;
  float sumZ = 0.0;
  int minV = 999;
  int maxV = 0;
  int sumV = 0;
  float maxE = FLT_MIN;
  float minE = FLT_MAX;
  float sumE = 0.0;
Jan Möbius's avatar
Jan Möbius committed
151

Jan Möbius's avatar
 
Jan Möbius committed
152 153 154 155 156 157 158 159 160 161 162 163 164
  //iterate over all vertices
  for (v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it){
    typename MeshT::Point p = _mesh->point( v_it.handle() );
    if (p[0] < minX) minX = p[0];
    if (p[0] > maxX) maxX = p[0];
    sumX += p[0];
    if (p[1] < minY) minY = p[1];
    if (p[1] > maxY) maxY = p[1];
    sumY += p[1];
    if (p[2] < minZ) minZ = p[2];
    if (p[2] > maxZ) maxZ = p[2];
    sumZ += p[2];

Jan Möbius's avatar
Jan Möbius committed
165 166


Jan Möbius's avatar
 
Jan Möbius committed
167 168 169
    //check valence + edge length
    int valence = 0;
    typename MeshT::VertexVertexIter vv_it;
Jan Möbius's avatar
Jan Möbius committed
170

Jan Möbius's avatar
 
Jan Möbius committed
171 172
    for (vv_it=_mesh->vv_iter( v_it ); vv_it; ++vv_it){
      valence++;
Jan Möbius's avatar
Jan Möbius committed
173

Jan Möbius's avatar
 
Jan Möbius committed
174 175 176 177 178 179 180 181 182 183 184 185
      typename MeshT::Point p2 = _mesh->point( vv_it.handle() );
      typename MeshT::Scalar len = (p2 - p).norm();

      if (len < minE) minE = len;
      if (len > maxE) maxE = len;
      sumE += len;
    }

    if (valence < minV) minV = valence;
    if (valence > maxV) maxV = valence;
    sumV += valence;
  }
Jan Möbius's avatar
Jan Möbius committed
186

Dirk Wilden's avatar
Dirk Wilden committed
187 188 189 190 191 192 193 194 195 196
  
  //valence
  info_->valenceMin->setText( QString::number(minV) );
  info_->valenceMean->setText( QString::number( sumV / (float)_mesh->n_vertices(),'f' ) );
  info_->valenceMax->setText( QString::number(maxV) );

  //edge length
  info_->edgeMin->setText( QString::number(minE,'f') );
  info_->edgeMean->setText( QString::number( sumE / (_mesh->n_edges()*2),'f' )  );
  info_->edgeMax->setText( QString::number(maxE,'f') );
Jan Möbius's avatar
 
Jan Möbius committed
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254

  //get aspect ratio

  typename MeshT::FaceIter f_it;
  typename MeshT::FaceIter f_end = _mesh->faces_end();

  float maxA = FLT_MIN;
  float minA = FLT_MAX;
  float sumA = 0.0;
  float maxI = FLT_MIN;
  float minI = FLT_MAX;
  float sumI = 0.0;
  float maxD = FLT_MIN;
  float minD = FLT_MAX;
  float sumD = 0.0;

  //iterate over all faces
  for (f_it = _mesh->faces_begin(); f_it != f_end; ++f_it){
    typename MeshT::ConstFaceVertexIter cfv_it = _mesh->cfv_iter(f_it);

    typename MeshT::Point v0 = _mesh->point( cfv_it.handle() );
    ++cfv_it;
    typename MeshT::Point v1 = _mesh->point( cfv_it.handle() );
    ++cfv_it;
    typename MeshT::Point v2 = _mesh->point( cfv_it.handle() );

    float aspect = ACG::Geometry::aspectRatio(v0, v1, v2);

    if (aspect < minA) minA = aspect;
    if (aspect > maxA) maxA = aspect;
    sumA += aspect;

    //inner triangle angles

    double angle = OpenMesh::rad_to_deg(acos(OpenMesh::sane_aarg( MathTools::sane_normalized(v2 - v0) | MathTools::sane_normalized(v1 - v0) )));

    if (angle < minI) minI = angle;
    if (angle > maxI) maxI = angle;
    sumI += angle;

    angle = OpenMesh::rad_to_deg(acos(OpenMesh::sane_aarg( MathTools::sane_normalized(v2 - v1) | MathTools::sane_normalized(v0 - v1) )));

    if (angle < minI) minI = angle;
    if (angle > maxI) maxI = angle;
    sumI += angle;

    angle = OpenMesh::rad_to_deg(acos(OpenMesh::sane_aarg( MathTools::sane_normalized(v1 - v2) | MathTools::sane_normalized(v0 - v2) )));

    if (angle < minI) minI = angle;
    if (angle > maxI) maxI = angle;
    sumI += angle;

    //compute dihedral angles
    typename MeshT::FaceFaceIter ff_it;
    typename MeshT::Normal n1 = _mesh->normal(f_it);

    for (ff_it = _mesh->ff_iter(f_it); ff_it; ++ff_it){

Jan Möbius's avatar
Jan Möbius committed
255
      typename MeshT::Normal n2 = _mesh->normal(ff_it);
Jan Möbius's avatar
 
Jan Möbius committed
256 257 258 259 260 261 262 263 264 265

      angle = OpenMesh::rad_to_deg(acos(OpenMesh::sane_aarg( MathTools::sane_normalized(n1) | MathTools::sane_normalized(n2) )));

      if (angle < minD) minD = angle;
      if (angle > maxD) maxD = angle;
      sumD += angle;

    }
  }

Dirk Wilden's avatar
Dirk Wilden committed
266 267 268
  info_->aspectMin->setText( QString::number(minA,'f') );
  info_->aspectMean->setText( QString::number( sumA / _mesh->n_faces(),'f' ) );
  info_->aspectMax->setText( QString::number(maxA,'f') );
Jan Möbius's avatar
 
Jan Möbius committed
269

Dirk Wilden's avatar
Dirk Wilden committed
270 271 272
  info_->angleMin->setText( QString::number(minI,'f') );
  info_->angleMean->setText( "-" );
  info_->angleMax->setText( QString::number(maxI,'f')  );
Jan Möbius's avatar
 
Jan Möbius committed
273

274 275 276 277 278 279 280 281 282 283 284
  
  // Only one face or no face -> don't output angles 
  if ( _mesh->n_faces() > 1 ) {
    info_->dihedralMin->setText( QString::number(minD,'f') );
    info_->dihedralMean->setText( QString::number( sumD / (_mesh->n_faces()*3),'f' ) );
    info_->dihedralMax->setText( QString::number(maxD,'f') );
  } else {
    info_->dihedralMin->setText( "-" );
    info_->dihedralMean->setText( "-" );
    info_->dihedralMax->setText( "-" );
  }
Jan Möbius's avatar
 
Jan Möbius committed
285 286 287

  typename MeshT::FaceHandle fh = _mesh->face_handle(_face);

Dirk Wilden's avatar
Dirk Wilden committed
288
  //adjacent vertex handles
Jan Möbius's avatar
 
Jan Möbius committed
289
  typename MeshT::FaceVertexIter fv_it = _mesh->fv_iter(fh);
Dirk Wilden's avatar
Dirk Wilden committed
290 291 292 293
  QString adjacentVertices;

  if ( fv_it ){
    adjacentVertices = QString::number( fv_it.handle().idx() );
Jan Möbius's avatar
 
Jan Möbius committed
294 295 296
    ++fv_it;
  }

Dirk Wilden's avatar
Dirk Wilden committed
297
  while( fv_it ){
Dirk Wilden's avatar
Dirk Wilden committed
298
    adjacentVertices += "; " + QString::number( fv_it.handle().idx() );
Dirk Wilden's avatar
Dirk Wilden committed
299 300
    ++fv_it;
  }
Jan Möbius's avatar
 
Jan Möbius committed
301

Dirk Wilden's avatar
Dirk Wilden committed
302
  info_->adjVertexHandles->setText( adjacentVertices );
Jan Möbius's avatar
 
Jan Möbius committed
303 304 305 306 307

  //Calculate Bounding Box(min,max,cog)
  ACG::Vec3d min;
  ACG::Vec3d max;
  MeshInfo::getBoundingBox(*_mesh, min, max);
Jan Möbius's avatar
Jan Möbius committed
308

Jan Möbius's avatar
 
Jan Möbius committed
309 310
  //Bounding Box Size
  ACG::Vec3d diff = max-min;
Jan Möbius's avatar
Jan Möbius committed
311

Dirk Wilden's avatar
Dirk Wilden committed
312 313 314 315 316 317 318 319 320 321 322
  info_->bbMinX->setText( QString::number(min[0],'f') );
  info_->bbMinY->setText( QString::number(min[1],'f') );
  info_->bbMinZ->setText( QString::number(min[2],'f') );

  info_->bbMaxX->setText( QString::number(max[0],'f') );
  info_->bbMaxY->setText( QString::number(max[1],'f') );
  info_->bbMaxZ->setText( QString::number(max[2],'f') );

  info_->bbSizeX->setText( QString::number(diff[0],'f') );
  info_->bbSizeY->setText( QString::number(diff[1],'f') );
  info_->bbSizeZ->setText( QString::number(diff[2],'f') );
Jan Möbius's avatar
 
Jan Möbius committed
323

Jan Möbius's avatar
Jan Möbius committed
324
  //COG
Jan Möbius's avatar
 
Jan Möbius committed
325 326
  ACG::Vec3d cog = MeshInfo::cog(*_mesh);

Dirk Wilden's avatar
Dirk Wilden committed
327 328 329
  info_->cogX->setText( QString::number(cog[0],'f') );
  info_->cogY->setText( QString::number(cog[1],'f') );
  info_->cogZ->setText( QString::number(cog[2],'f') );
Jan Möbius's avatar
 
Jan Möbius committed
330 331

  //face-normal
Dirk Wilden's avatar
Dirk Wilden committed
332 333 334
  info_->normalX->setText( QString::number( _mesh->normal(fh)[0],'f' ) );
  info_->normalY->setText( QString::number( _mesh->normal(fh)[1],'f' ) );
  info_->normalZ->setText( QString::number( _mesh->normal(fh)[2],'f' ) );
Jan Möbius's avatar
Jan Möbius committed
335

Dirk Wilden's avatar
Dirk Wilden committed
336 337 338 339
  //hitpoint
  info_->pointX->setText( QString::number( _hitPoint[0],'f' ) );
  info_->pointY->setText( QString::number( _hitPoint[1],'f' ) );
  info_->pointZ->setText( QString::number( _hitPoint[2],'f' ) );
Jan Möbius's avatar
 
Jan Möbius committed
340 341


Dirk Wilden's avatar
Dirk Wilden committed
342 343 344 345 346
  //closest vertex
  info_->vertexX->setText( QString::number( _mesh->point( _mesh->vertex_handle(closest_v_idx) )[0],'f' ) );
  info_->vertexY->setText( QString::number( _mesh->point( _mesh->vertex_handle(closest_v_idx) )[1],'f' ) );
  info_->vertexZ->setText( QString::number( _mesh->point( _mesh->vertex_handle(closest_v_idx) )[2],'f' ) );

Jan Möbius's avatar
 
Jan Möbius committed
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362

  info_->setWindowFlags(info_->windowFlags() | Qt::WindowStaysOnTopHint);

  info_->show();
}

//----------------------------------------------------------------------------------------------

/** \brief Find closest vertex to selection
 *
 * @param _mesh Refernce to the mesh
 * @param _face_idx Index of the face that has been clicked on
 */

template <class MeshT>
int InfoPlugin::getClosestVertex(MeshT* _mesh, int _face_idx) {
Jan Möbius's avatar
Jan Möbius committed
363

Jan Möbius's avatar
 
Jan Möbius committed
364
    typename MeshT::FaceVertexIter fv_it;
Jan Möbius's avatar
Jan Möbius committed
365

Jan Möbius's avatar
 
Jan Möbius committed
366 367 368
    int closest_v_idx = 0;
    double dist = DBL_MAX;
    double temp_dist = 0.0;
Jan Möbius's avatar
Jan Möbius committed
369

Jan Möbius's avatar
 
Jan Möbius committed
370 371
    ACG::Vec3d vTemp = ACG::Vec3d(0.0, 0.0, 0.0);
    typename MeshT::Point p;
Jan Möbius's avatar
Jan Möbius committed
372

Jan Möbius's avatar
 
Jan Möbius committed
373
    for (fv_it = _mesh->fv_iter(_mesh->face_handle(_face_idx)); fv_it; ++fv_it){
Jan Möbius's avatar
Jan Möbius committed
374

Dirk Wilden's avatar
Dirk Wilden committed
375
      p = _mesh->point( fv_it.handle() );
Jan Möbius's avatar
Jan Möbius committed
376

Dirk Wilden's avatar
Dirk Wilden committed
377 378 379
      // Find closest vertex to selection
      vTemp = ACG::Vec3d(p[0], p[1], p[2]);
      temp_dist = (vTemp - hit_point_).length();
Jan Möbius's avatar
 
Jan Möbius committed
380

Dirk Wilden's avatar
Dirk Wilden committed
381 382 383 384
      if (temp_dist < dist) {
          dist = temp_dist;
          closest_v_idx = fv_it.handle().idx();
      }
Jan Möbius's avatar
 
Jan Möbius committed
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399

    }
    return closest_v_idx;
}

//-------------------------------------------------------------------------------------------

/** \brief Find closest edge to selection
 *
 * @param _mesh Reference to the mesh
 * @param _face_idx Index of the face that has been clicked on
 */

template <class MeshT>
int InfoPlugin::getClosestEdge(MeshT* _mesh, int _face_idx) {
Jan Möbius's avatar
Jan Möbius committed
400

Jan Möbius's avatar
 
Jan Möbius committed
401 402 403
    typename MeshT::ConstFaceHalfedgeIter fh_it;
    typename MeshT::VertexHandle v1, v2;
    typename MeshT::Point p1, p2;
Jan Möbius's avatar
Jan Möbius committed
404

Jan Möbius's avatar
 
Jan Möbius committed
405 406 407 408
    ACG::Vec3d vp1, vp2, click, e, g, h;
    double x, temp_dist, dist = DBL_MAX;
    int closest_e_handle = 0;
    click = ACG::Vec3d(hit_point_[0], hit_point_[1], hit_point_[2]);
Jan Möbius's avatar
Jan Möbius committed
409

Jan Möbius's avatar
 
Jan Möbius committed
410
    for (fh_it = _mesh->fh_iter(_mesh->face_handle(_face_idx)); fh_it; ++fh_it){
Jan Möbius's avatar
Jan Möbius committed
411

Dirk Wilden's avatar
Dirk Wilden committed
412 413
      v1 = _mesh->from_vertex_handle(fh_it);
      v2 = _mesh->to_vertex_handle(fh_it);
Jan Möbius's avatar
Jan Möbius committed
414

Dirk Wilden's avatar
Dirk Wilden committed
415 416
      p1 = _mesh->point(v1);
      p2 = _mesh->point(v2);
Jan Möbius's avatar
Jan Möbius committed
417

Dirk Wilden's avatar
Dirk Wilden committed
418 419
      vp1 = ACG::Vec3d(p1[0], p1[1], p1[2]);
      vp2 = ACG::Vec3d(p2[0], p2[1], p2[2]);
Jan Möbius's avatar
Jan Möbius committed
420

Dirk Wilden's avatar
Dirk Wilden committed
421 422 423 424
      e = vp2 - vp1;
      e.normalize();
      g = click - vp1;
      x = g | e;
Jan Möbius's avatar
Jan Möbius committed
425

Dirk Wilden's avatar
Dirk Wilden committed
426
      temp_dist = (click - (vp1 + x * e)).length();
Jan Möbius's avatar
Jan Möbius committed
427

Dirk Wilden's avatar
Dirk Wilden committed
428 429 430 431
      if (temp_dist < dist) {
          dist = temp_dist;
          closest_e_handle = _mesh->edge_handle(fh_it.handle()).idx();
      }
Jan Möbius's avatar
 
Jan Möbius committed
432
    }
Jan Möbius's avatar
Jan Möbius committed
433

Jan Möbius's avatar
 
Jan Möbius committed
434
    return closest_e_handle;
Jan Möbius's avatar
Jan Möbius committed
435 436
}

Jan Möbius's avatar
 
Jan Möbius committed
437 438
//----------------------------------------------------------------------------------------------

Jan Möbius's avatar
Jan Möbius committed
439
void
Jan Möbius's avatar
 
Jan Möbius committed
440
InfoPlugin::
Jan Möbius's avatar
Jan Möbius committed
441
  slotMouseEventIdentify( QMouseEvent* _event ) {
Jan Möbius's avatar
 
Jan Möbius committed
442 443 444 445
  if (_event->type() == QEvent::MouseButtonPress)
  {
    unsigned int   node_idx, target_idx;
    ACG::Vec3d     hit_point;
Jan Möbius's avatar
Jan Möbius committed
446

Jan Möbius's avatar
 
Jan Möbius committed
447 448 449 450
    if (PluginFunctions::scenegraphPick(ACG::SceneGraph::PICK_FACE, _event->pos(),node_idx, target_idx, &hit_point)) {
      BaseObjectData* object;

//     BaseObject* obj = dynamic_cast< BaseObject* > (object);
Jan Möbius's avatar
Jan Möbius committed
451

Jan Möbius's avatar
 
Jan Möbius committed
452
      if ( PluginFunctions::getPickedObject(node_idx, object) ) {
Jan Möbius's avatar
Jan Möbius committed
453

Jan Möbius's avatar
 
Jan Möbius committed
454
         emit log( LOGINFO , object->getObjectinfo() );
Jan Möbius's avatar
Jan Möbius committed
455

Dirk Wilden's avatar
Dirk Wilden committed
456 457
         // Set hit point
         hit_point_ = ACG::Vec3d(hit_point[0], hit_point[1], hit_point[2]);
Jan Möbius's avatar
Jan Möbius committed
458 459

         if ( object->picked(node_idx) && object->dataType(DATA_TRIANGLE_MESH) )
Dirk Wilden's avatar
Dirk Wilden committed
460
            printMeshInfo( PluginFunctions::triMesh(object) , object->id(), target_idx, hit_point_ );
Jan Möbius's avatar
Jan Möbius committed
461 462

         if ( object->picked(node_idx) && object->dataType(DATA_POLY_MESH) )
Dirk Wilden's avatar
Dirk Wilden committed
463
            printMeshInfo( PluginFunctions::polyMesh(object) , object->id(), target_idx, hit_point_ );
Jan Möbius's avatar
Jan Möbius committed
464

Jan Möbius's avatar
 
Jan Möbius committed
465 466 467 468 469 470 471
      } else return;
    }
  }
}

//------------------------------------------------------------------------------

472 473 474 475 476 477
template< class MeshT >
void InfoPlugin::getEdgeLengths(MeshT* _mesh, double &min, double &max, double &mean)
{
  typename MeshT::ConstEdgeIter e_it(_mesh->edges_sbegin()),
                                e_end(_mesh->edges_end());

478 479
  min = FLT_MAX;
  max = FLT_MIN;
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
  mean = 0.0;
  for (; e_it!=e_end; ++e_it)
  {
    typename MeshT::Scalar len = (_mesh->point(_mesh->to_vertex_handle(_mesh->halfedge_handle(e_it, 0))) -
                                  _mesh->point(_mesh->to_vertex_handle(_mesh->halfedge_handle(e_it, 1)))).norm ();
    if (len < min) min = len;
    if (len > max) max = len;
    mean += len;
  }

  mean /= _mesh->n_edges();
}

//------------------------------------------------------------------------------

bool InfoPlugin::getEdgeLengths(int _id, double &min, double &max, double &mean)
{
  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return false;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
502
    emit log(LOGERR, tr("Unable to get object"));
503 504 505 506 507 508 509
    return false;
  }

  if ( object->dataType(DATA_TRIANGLE_MESH) ) {
    TriMesh* mesh = PluginFunctions::triMesh(object);

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
510
      emit log(LOGERR,tr("Unable to get mesh"));
511 512 513 514 515 516 517 518 519 520
      return false;
    }

    getEdgeLengths (mesh, min, max, mean);
    return true;

  } else {
    PolyMesh* mesh = PluginFunctions::polyMesh(object);

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
521
      emit log(LOGERR,tr("Unable to get mesh"));
522 523 524 525 526 527 528 529 530 531 532 533
      return false;
    }

    getEdgeLengths (mesh, min, max, mean);
    return true;
  }

  return false;
}

//------------------------------------------------------------------------------

534
void InfoPlugin::slotObjectUpdated( int _identifier , const UpdateType _type){
Jan Möbius's avatar
Jan Möbius committed
535

Dirk Wilden's avatar
Dirk Wilden committed
536
  if ( (PluginFunctions::objectCount() == 1) || (PluginFunctions::targetCount() == 1) ){
537

538 539 540 541 542 543
    // This block is only interesting for topology changes
    if ( ! _type.contains(UPDATE_TOPOLOGY) ) {
      return;
    }
      
    if ( !infoBar_ ) {
544
      return;    
545
    }
546

Dirk Wilden's avatar
Dirk Wilden committed
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
    bool found = false;
    
    PluginFunctions::IteratorRestriction restriction;
    
    if ( PluginFunctions::targetCount() == 1 )
      restriction = PluginFunctions::TARGET_OBJECTS;
    else
      restriction = PluginFunctions::ALL_OBJECTS;
    
    
    for ( PluginFunctions::ObjectIterator o_it(restriction,DataType( DATA_TRIANGLE_MESH | DATA_POLY_MESH )) ;
      o_it != PluginFunctions::objectsEnd(); ++o_it)   {
      
      if (o_it->dataType(DATA_TRIANGLE_MESH)){
        
        TriMesh* mesh = PluginFunctions::triMesh(*o_it);
      
        infoBar_->vertices->setText( QLocale::system().toString( mesh->n_vertices() ) );
        infoBar_->edges->setText( QLocale::system().toString( mesh->n_edges() ) );
        infoBar_->faces->setText( QLocale::system().toString( mesh->n_faces() ) );
      }
      
      if (o_it->dataType(DATA_POLY_MESH)){
570

Dirk Wilden's avatar
Dirk Wilden committed
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
        PolyMesh* mesh = PluginFunctions::polyMesh(*o_it);
      
        infoBar_->vertices->setText( QLocale::system().toString( mesh->n_vertices() ) );
        infoBar_->edges->setText( QLocale::system().toString( mesh->n_edges() ) );
        infoBar_->faces->setText( QLocale::system().toString( mesh->n_faces() ) );
    
      }
      found = true;
    }
    
    if (found) 
      infoBar_->showCounts();
    else
      infoBar_->hideCounts();
  } else {
    if ( PluginFunctions::targetCount() > 0 )
      infoBar_->showTargetCount( PluginFunctions::targetCount() );
    else
      infoBar_->hideCounts();
  }
}
592

Dirk Wilden's avatar
Dirk Wilden committed
593 594 595
//------------------------------------------------------------------------------

void InfoPlugin::slotObjectSelectionChanged( int _identifier ){
596
  slotObjectUpdated( _identifier , UPDATE_ALL );
Dirk Wilden's avatar
Dirk Wilden committed
597
}
598

Dirk Wilden's avatar
Dirk Wilden committed
599 600 601 602 603 604
//------------------------------------------------------------------------------

void InfoPlugin::slotAllCleared(){
  infoBar_->hideCounts();
}

Jan Möbius's avatar
 
Jan Möbius committed
605 606
Q_EXPORT_PLUGIN2( InfoPlugin , InfoPlugin );

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