InfoPlugin.cc 16.8 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 72 73 74 75 76

#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 ==========================================================

/// initialize the plugin
void InfoPlugin::pluginsInitialized() {

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

Jan Möbius's avatar
 
Jan Möbius committed
78 79 80 81 82 83 84
  // Initialize hit point
  hit_point_ = ACG::Vec3d(0.0, 0.0, 0.0);
}

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

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

  QLocale locale;

Jan Möbius's avatar
 
Jan Möbius committed
89 90 91
  if (info_ == 0){
    info_ = new InfoDialog();
  }
Jan Möbius's avatar
Jan Möbius committed
92

Jan Möbius's avatar
 
Jan Möbius committed
93 94
  int closest_v_idx = getClosestVertex(_mesh, _face);
  int closest_e_idx = getClosestEdge(_mesh, _face);
Jan Möbius's avatar
Jan Möbius committed
95

Dirk Wilden's avatar
Dirk Wilden committed
96 97 98 99 100
  QString name;

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
  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
144

Jan Möbius's avatar
 
Jan Möbius committed
145 146 147 148 149 150 151 152 153 154 155 156 157
  //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
158 159


Jan Möbius's avatar
 
Jan Möbius committed
160 161 162
    //check valence + edge length
    int valence = 0;
    typename MeshT::VertexVertexIter vv_it;
Jan Möbius's avatar
Jan Möbius committed
163

Jan Möbius's avatar
 
Jan Möbius committed
164 165
    for (vv_it=_mesh->vv_iter( v_it ); vv_it; ++vv_it){
      valence++;
Jan Möbius's avatar
Jan Möbius committed
166

Jan Möbius's avatar
 
Jan Möbius committed
167 168 169 170 171 172 173 174 175 176 177 178
      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
179

Dirk Wilden's avatar
Dirk Wilden committed
180 181 182 183 184 185 186 187 188 189
  
  //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
190 191 192 193 194 195 196 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

  //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
248
      typename MeshT::Normal n2 = _mesh->normal(ff_it);
Jan Möbius's avatar
 
Jan Möbius committed
249 250 251 252 253 254 255 256 257 258

      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
259 260 261
  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
262

Dirk Wilden's avatar
Dirk Wilden committed
263 264 265
  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
266

Dirk Wilden's avatar
Dirk Wilden committed
267 268 269
  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') );
Jan Möbius's avatar
 
Jan Möbius committed
270 271 272

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

Dirk Wilden's avatar
Dirk Wilden committed
273
  //adjacent vertex handles
Jan Möbius's avatar
 
Jan Möbius committed
274
  typename MeshT::FaceVertexIter fv_it = _mesh->fv_iter(fh);
Dirk Wilden's avatar
Dirk Wilden committed
275 276 277 278
  QString adjacentVertices;

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

Dirk Wilden's avatar
Dirk Wilden committed
282
  while( fv_it ){
Dirk Wilden's avatar
Dirk Wilden committed
283
    adjacentVertices += "; " + QString::number( fv_it.handle().idx() );
Dirk Wilden's avatar
Dirk Wilden committed
284 285
    ++fv_it;
  }
Jan Möbius's avatar
 
Jan Möbius committed
286

Dirk Wilden's avatar
Dirk Wilden committed
287
  info_->adjVertexHandles->setText( adjacentVertices );
Jan Möbius's avatar
 
Jan Möbius committed
288 289 290 291 292

  //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
293

Jan Möbius's avatar
 
Jan Möbius committed
294 295
  //Bounding Box Size
  ACG::Vec3d diff = max-min;
Jan Möbius's avatar
Jan Möbius committed
296

Dirk Wilden's avatar
Dirk Wilden committed
297 298 299 300 301 302 303 304 305 306 307
  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
308

Jan Möbius's avatar
Jan Möbius committed
309
  //COG
Jan Möbius's avatar
 
Jan Möbius committed
310 311
  ACG::Vec3d cog = MeshInfo::cog(*_mesh);

Dirk Wilden's avatar
Dirk Wilden committed
312 313 314
  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
315 316

  //face-normal
Dirk Wilden's avatar
Dirk Wilden committed
317 318 319
  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
320

Dirk Wilden's avatar
Dirk Wilden committed
321 322 323 324
  //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
325 326


Dirk Wilden's avatar
Dirk Wilden committed
327 328 329 330 331
  //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
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347

  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
348

Jan Möbius's avatar
 
Jan Möbius committed
349
    typename MeshT::FaceVertexIter fv_it;
Jan Möbius's avatar
Jan Möbius committed
350

Jan Möbius's avatar
 
Jan Möbius committed
351 352 353
    int closest_v_idx = 0;
    double dist = DBL_MAX;
    double temp_dist = 0.0;
Jan Möbius's avatar
Jan Möbius committed
354

Jan Möbius's avatar
 
Jan Möbius committed
355 356
    ACG::Vec3d vTemp = ACG::Vec3d(0.0, 0.0, 0.0);
    typename MeshT::Point p;
Jan Möbius's avatar
Jan Möbius committed
357

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

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

Dirk Wilden's avatar
Dirk Wilden committed
362 363 364
      // 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
365

Dirk Wilden's avatar
Dirk Wilden committed
366 367 368 369
      if (temp_dist < dist) {
          dist = temp_dist;
          closest_v_idx = fv_it.handle().idx();
      }
Jan Möbius's avatar
 
Jan Möbius committed
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384

    }
    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
385

Jan Möbius's avatar
 
Jan Möbius committed
386 387 388
    typename MeshT::ConstFaceHalfedgeIter fh_it;
    typename MeshT::VertexHandle v1, v2;
    typename MeshT::Point p1, p2;
Jan Möbius's avatar
Jan Möbius committed
389

Jan Möbius's avatar
 
Jan Möbius committed
390 391 392 393
    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
394

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

Dirk Wilden's avatar
Dirk Wilden committed
397 398
      v1 = _mesh->from_vertex_handle(fh_it);
      v2 = _mesh->to_vertex_handle(fh_it);
Jan Möbius's avatar
Jan Möbius committed
399

Dirk Wilden's avatar
Dirk Wilden committed
400 401
      p1 = _mesh->point(v1);
      p2 = _mesh->point(v2);
Jan Möbius's avatar
Jan Möbius committed
402

Dirk Wilden's avatar
Dirk Wilden committed
403 404
      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
405

Dirk Wilden's avatar
Dirk Wilden committed
406 407 408 409
      e = vp2 - vp1;
      e.normalize();
      g = click - vp1;
      x = g | e;
Jan Möbius's avatar
Jan Möbius committed
410

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

Dirk Wilden's avatar
Dirk Wilden committed
413 414 415 416
      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
417
    }
Jan Möbius's avatar
Jan Möbius committed
418

Jan Möbius's avatar
 
Jan Möbius committed
419
    return closest_e_handle;
Jan Möbius's avatar
Jan Möbius committed
420 421
}

Jan Möbius's avatar
 
Jan Möbius committed
422 423
//----------------------------------------------------------------------------------------------

Jan Möbius's avatar
Jan Möbius committed
424
void
Jan Möbius's avatar
 
Jan Möbius committed
425
InfoPlugin::
Jan Möbius's avatar
Jan Möbius committed
426
  slotMouseEventIdentify( QMouseEvent* _event ) {
Jan Möbius's avatar
 
Jan Möbius committed
427 428 429 430
  if (_event->type() == QEvent::MouseButtonPress)
  {
    unsigned int   node_idx, target_idx;
    ACG::Vec3d     hit_point;
Jan Möbius's avatar
Jan Möbius committed
431

Jan Möbius's avatar
 
Jan Möbius committed
432 433 434 435
    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
436

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

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

Dirk Wilden's avatar
Dirk Wilden committed
441 442
         // 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
443 444

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

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

Jan Möbius's avatar
 
Jan Möbius committed
450 451 452 453 454 455 456
      } else return;
    }
  }
}

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

457 458 459 460 461 462
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());

463 464
  min = FLT_MAX;
  max = FLT_MIN;
465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
  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
487
    emit log(LOGERR, tr("Unable to get object"));
488 489 490 491 492 493 494
    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
495
      emit log(LOGERR,tr("Unable to get mesh"));
496 497 498 499 500 501 502 503 504 505
      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
506
      emit log(LOGERR,tr("Unable to get mesh"));
507 508 509 510 511 512 513 514 515 516 517 518 519 520
      return false;
    }

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

  return false;
}

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



Jan Möbius's avatar
 
Jan Möbius committed
521 522
Q_EXPORT_PLUGIN2( InfoPlugin , InfoPlugin );

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