InfoScripting.cc 23.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 37 38 39 40 41 42
/*===========================================================================*\
 *                                                                           *
 *                              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/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision: 83 $                                                         *
 *   $Author: moebius $                                                      *
 *   $Date: 2009-02-27 17:31:45 +0100 (Fr, 27. Feb 2009) $                   *
 *                                                                           *
\*===========================================================================*/

Jan Möbius's avatar
 
Jan Möbius committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56
#include "InfoPlugin.hh"

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


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

/** \brief set the descriptions for scripting slots
 * 
 */
void InfoPlugin::setDescriptions(){

Jan Möbius's avatar
Jan Möbius committed
57 58
  emit setSlotDescription("vertexCount(int)",tr("get total number of vertices for a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
59

Jan Möbius's avatar
Jan Möbius committed
60 61
  emit setSlotDescription("edgeCount(int)",tr("get total number of edges for a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
62

Jan Möbius's avatar
Jan Möbius committed
63 64
  emit setSlotDescription("faceCount(int)",tr("get total number of faces for a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
65

Jan Möbius's avatar
Jan Möbius committed
66 67
  emit setSlotDescription("boundaryCount(int)",tr("get number of boundaries for a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
68

Jan Möbius's avatar
Jan Möbius committed
69 70
  emit setSlotDescription("componentCount(int)",tr("get number of components for a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
71

Jan Möbius's avatar
Jan Möbius committed
72 73
  emit setSlotDescription("genus(int)",tr("get the genus of a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
74

Jan Möbius's avatar
Jan Möbius committed
75 76
  emit setSlotDescription("cog(int)",tr("get the center of gravity for a given object"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
77

Jan Möbius's avatar
Jan Möbius committed
78 79
  emit setSlotDescription("boundingBoxMin(int)",tr("get minimum point of the axis-aligned bounding box"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
80

Jan Möbius's avatar
Jan Möbius committed
81 82
  emit setSlotDescription("boundingBoxMax(int)",tr("get maximum point of the axis-aligned bounding box"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
83

Jan Möbius's avatar
Jan Möbius committed
84 85
  emit setSlotDescription("boundingBoxSize(int)",tr("get the size of the axis-aligned bounding box"),
                          QStringList(tr("objectID")), QStringList(tr("id of an object")));
Jan Möbius's avatar
 
Jan Möbius committed
86 87


Jan Möbius's avatar
Jan Möbius committed
88 89 90
  emit setSlotDescription("edgeLength(int,int)",tr("Get the length of an edge"),
                          QString(tr("ObjectId,EdgeHandle")).split(","),
                          QString(tr("id of the object, handle of an edge")).split(","));
Jan Möbius's avatar
 
Jan Möbius committed
91

Jan Möbius's avatar
Jan Möbius committed
92 93 94
  emit setSlotDescription("faceArea(int,int)",tr("Get the area of a face"),
                          QString(tr("ObjectId,FaceHandle")).split(","),
                          QString(tr("id of the object, handle of a face")).split(","));
Jan Möbius's avatar
 
Jan Möbius committed
95

Jan Möbius's avatar
Jan Möbius committed
96 97 98
  emit setSlotDescription("aspectRatio(int,int)",tr("Get the aspect ratio of a face"),
                          QString(tr("ObjectId,FaceHandle")).split(","),
                          QString(tr("id of the object, handle of a face")).split(","));
Jan Möbius's avatar
 
Jan Möbius committed
99

Jan Möbius's avatar
Jan Möbius committed
100 101 102
  emit setSlotDescription("vertexValence(int,int)",tr("Get the valence of a vertex"),
                          QString(tr("ObjectId,VertexHandle")).split(","),
                          QString(tr("id of the object, handle of a vertex")).split(","));
Jan Möbius's avatar
 
Jan Möbius committed
103

Jan Möbius's avatar
Jan Möbius committed
104 105
  emit setSlotDescription("minEdgeLength(int)",tr("Get the minimal edge length of an object"),
                          QStringList(tr("ObjectId")), QStringList(tr("id of the object")));
106

Jan Möbius's avatar
Jan Möbius committed
107 108
  emit setSlotDescription("maxEdgeLength(int)",tr("Get the maximal edge length of an object"),
                          QStringList(tr("ObjectId")), QStringList(tr("id of the object")));
109

Jan Möbius's avatar
Jan Möbius committed
110 111
  emit setSlotDescription("meanEdgeLength(int)",tr("Get the mean edge length of an object"),
                          QStringList(tr("ObjectId")), QStringList(tr("id of the object")));
112

Jan Möbius's avatar
 
Jan Möbius committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
}


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

/** \brief get total number of vertices for a given object
 * 
 * @param _id object id
 * @return number of vertices or -1 if an error occured
 */
int InfoPlugin::vertexCount(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
131
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
132 133 134 135 136 137 138
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
139
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
140 141 142 143 144 145 146 147 148
      return -1;
    }

    return mesh->n_vertices();

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
149
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
      return -1;
    }

    return mesh->n_vertices();
  }
}


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

/** \brief get total number of edges for a given object
 * 
 * @param _id object id
 * @return number of edges or -1 if an error occured
 */
int InfoPlugin::edgeCount(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
173
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
174 175 176 177 178 179 180
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
181
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
182 183 184 185 186 187 188 189 190
      return -1;
    }

    return mesh->n_edges();

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
191
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
      return -1;
    }

    return mesh->n_edges();
  }
}


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

/** \brief get total number of faces for a given object
 * 
 * @param _id object id
 * @return number of faces or -1 if an error occured
 */
int InfoPlugin::faceCount(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
215
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
216 217 218 219 220 221 222
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
223
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
224 225 226 227 228 229 230 231 232
      return -1;
    }

    return mesh->n_faces();

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
233
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
      return -1;
    }

    return mesh->n_faces();
  }
}


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

/** \brief get the number of boundaries for a given object
 * 
 * @param _id object id
 * @return number of boundaries or -1 if an error occured
 */
int InfoPlugin::boundaryCount(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
257
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
258 259 260 261 262 263 264
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
265
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
266 267 268 269 270 271 272 273 274
      return -1;
    }

    return MeshInfo::boundaryCount(mesh);

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
275
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
      return -1;
    }

    return MeshInfo::boundaryCount(mesh);
  }
}


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

/** \brief get the number of components for a given object
 * 
 * @param _id object id
 * @return number of components or -1 if an error occured
 */
int InfoPlugin::componentCount(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
299
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
300 301 302 303 304 305 306
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
307
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
308 309 310 311 312 313 314 315 316
      return -1;
    }

    return MeshInfo::componentCount(mesh);

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
317
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
      return -1;
    }

    return MeshInfo::componentCount(mesh);
  }
}


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

/** \brief get the genus of the given object
 * 
 * @param _id id of an object
 * @return the genus
 */
int InfoPlugin::genus(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
341
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
342 343 344 345 346 347 348
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
349
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
350 351 352 353 354 355 356 357 358
      return -1;
    }
///TODO this formula only works for closed objects: fix it
    return (1 - (mesh->n_vertices() - mesh->n_edges() + mesh->n_faces() ) / 2);

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
359
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
      return -1;
    }

    return (1 - (mesh->n_vertices() - mesh->n_edges() + mesh->n_faces() ) / 2);
  }
}


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

/** \brief get the center of gravity 
 * 
 * @param _id id of an object
 * @return the center of gravity
 */
Vector InfoPlugin::cog(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return Vector();

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
383
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
384 385 386 387 388 389 390
    return Vector();
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
391
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
392 393 394 395 396 397 398 399 400
      return Vector();
    }

    return MeshInfo::cog(*mesh);

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
401
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
      return Vector();
    }

    return MeshInfo::cog(*mesh);
  }
}


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

/** \brief get minimum point of the (axis aligned) bounding box
 * 
 * @param _id id of an object
 * @return minimum point of the bounding box
 */
Vector InfoPlugin::boundingBoxMin(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return Vector();

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
425
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
426 427 428 429 430 431 432
    return Vector();
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
433
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
434 435 436 437 438 439 440 441 442 443 444 445 446
      return Vector();
    }

    ACG::Vec3d min;
    ACG::Vec3d max;
    MeshInfo::getBoundingBox(*mesh, min, max);

    return min;

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
447
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
      return Vector();
    }

    ACG::Vec3d min;
    ACG::Vec3d max;
    MeshInfo::getBoundingBox(*mesh, min, max);

    return min;
  }
}


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

/** \brief get maximum point of the (axis aligned) bounding box
 * 
 * @param _id id of an object
 * @return maximum point of the bounding box
 */
Vector InfoPlugin::boundingBoxMax(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return Vector();

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
475
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
476 477 478 479 480 481 482
    return Vector();
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
483
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
484 485 486 487 488 489 490 491 492 493 494 495 496
      return Vector();
    }

    ACG::Vec3d min;
    ACG::Vec3d max;
    MeshInfo::getBoundingBox(*mesh, min, max);

    return max;

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
497
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
      return Vector();
    }

    ACG::Vec3d min;
    ACG::Vec3d max;
    MeshInfo::getBoundingBox(*mesh, min, max);

    return max;
  }
}


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

/** \brief get the size of the (axis aligned) bounding box
 * 
 * @param _id id of an object
 * @return size of the bounding box
 */
Vector InfoPlugin::boundingBoxSize(int _id)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return Vector();

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
525
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
526 527 528 529 530 531 532
    return Vector();
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
533
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
534 535 536 537 538 539 540 541 542 543 544 545 546
      return Vector();
    }

    ACG::Vec3d min;
    ACG::Vec3d max;
    MeshInfo::getBoundingBox(*mesh, min, max);

    return (max - min);

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
547
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
      return Vector();
    }

    ACG::Vec3d min;
    ACG::Vec3d max;
    MeshInfo::getBoundingBox(*mesh, min, max);

    return (max - min);
  }
}


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

/** \brief get the length of an edge
 * 
 * @param _id id of an object
 * @param _edgeHandle edge handle
 * @return edge length or -1 if an error occured
 */
double InfoPlugin::edgeLength(int _id, int _edgeHandle)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1.0;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
576
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
577 578 579 580 581 582 583
    return -1.0;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
584
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
585 586 587 588 589 590
      return -1.0;
    }

    TriMesh::EdgeHandle eh( _edgeHandle );

    if ( !eh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
591
      emit log(LOGERR,tr("Unable to get edge handle"));
Jan Möbius's avatar
 
Jan Möbius committed
592 593 594 595 596 597 598 599 600 601 602 603 604
      return -1.0;
    }

    TriMesh::HalfedgeHandle hh = mesh->halfedge_handle( eh, 0 );
    TriMesh::Point p0 = mesh->point( mesh->from_vertex_handle(hh) );
    TriMesh::Point p1 = mesh->point( mesh->to_vertex_handle(hh) );

    return (p0 - p1).norm();

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
605
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
606 607 608 609 610 611
      return -1.0;
    }

    PolyMesh::EdgeHandle eh( _edgeHandle );

    if ( !eh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
612
      emit log(LOGERR,tr("Unable to get edge handle"));
Jan Möbius's avatar
 
Jan Möbius committed
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
      return -1.0;
    }

    PolyMesh::HalfedgeHandle hh = mesh->halfedge_handle( eh, 0 );
    PolyMesh::Point p0 = mesh->point( mesh->from_vertex_handle(hh) );
    PolyMesh::Point p1 = mesh->point( mesh->to_vertex_handle(hh) );

    return (p0 - p1).norm();
  }
}


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

/** \brief get the area of a face
 * 
 * @param _id id of an object
 * @param _faceHandle face handle
 * @return face area or -1 if an error occured
 */
double InfoPlugin::faceArea(int _id, int _faceHandle)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1.0;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
641
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
642 643 644 645 646 647 648
    return -1.0;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
649
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
650 651 652 653 654 655
      return -1.0;
    }

    TriMesh::FaceHandle fh( _faceHandle );

    if ( !fh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
656
      emit log(LOGERR,tr("Unable to get face handle"));
Jan Möbius's avatar
 
Jan Möbius committed
657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
      return -1.0;
    }

    TriMesh::FaceVertexIter fv_it = mesh->fv_iter(fh);

    TriMesh::Point v0 = mesh->point( fv_it.handle() );
    ++fv_it;
    TriMesh::Point v1 = mesh->point( fv_it.handle() );
    ++fv_it;
    TriMesh::Point v2 = mesh->point( fv_it.handle() );

    return ACG::Geometry::triangleArea( v0, v1, v2 );

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
674
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
675 676 677 678 679 680
      return -1.0;
    }

    PolyMesh::FaceHandle fh( _faceHandle );

    if ( !fh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
681
      emit log(LOGERR,tr("Unable to get face handle"));
Jan Möbius's avatar
 
Jan Möbius committed
682 683 684 685 686 687 688 689 690 691 692
      return -1.0;
    }

    PolyMesh::FaceVertexIter fv_it;

    std::vector< PolyMesh::Point > vertices;

    for (fv_it = mesh->fv_iter(fh); fv_it; ++fv_it)
      vertices.push_back( mesh->point( fv_it.handle() ) );

///TODO implement polygonArea
Jan Möbius's avatar
Jan Möbius committed
693
  emit log(LOGERR,tr("Not implemented yet"));
Jan Möbius's avatar
 
Jan Möbius committed
694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
  return -1.0;
//     return ACG::Geometry::polygonArea( vertices );
  }
}


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

/** \brief get the aspect ratio of a face
 * 
 * @param _id id of an object
 * @param _faceHandle face handle
 * @return aspect ratio or -1 if an error occured
 */
double InfoPlugin::aspectRatio(int _id, int _faceHandle)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1.0;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
716
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
717 718 719 720 721 722 723
    return -1.0;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
724
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
725 726 727 728 729 730
      return -1.0;
    }

    TriMesh::FaceHandle fh( _faceHandle );

    if ( !fh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
731
      emit log(LOGERR,tr("Unable to get face handle"));
Jan Möbius's avatar
 
Jan Möbius committed
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
      return -1.0;
    }

    TriMesh::FaceVertexIter fv_it = mesh->fv_iter(fh);

    TriMesh::Point v0 = mesh->point( fv_it.handle() );
    ++fv_it;
    TriMesh::Point v1 = mesh->point( fv_it.handle() );
    ++fv_it;
    TriMesh::Point v2 = mesh->point( fv_it.handle() );

    return ACG::Geometry::aspectRatio( v0, v1, v2 );

  } else {

Jan Möbius's avatar
Jan Möbius committed
747
    emit log(LOGERR,tr("Aspect ratio can only be calculated for triangle meshes"));
Jan Möbius's avatar
 
Jan Möbius committed
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
    return -1.0;
  }
}


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

/** \brief get vertex valence
 * 
 * @param _id id of an object
 * @param _vertexHandle vertex handle
 * @return vertex valence or -1 if an error occured
 */
int InfoPlugin::vertexValence  (int _id, int _vertexHandle)
{

  BaseObjectData* object;
  if ( ! PluginFunctions::getObject(_id,object) )
    return -1;

  if ( object == 0){
Jan Möbius's avatar
Jan Möbius committed
769
    emit log(LOGERR, tr("Unable to get object"));
Jan Möbius's avatar
 
Jan Möbius committed
770 771 772 773 774 775 776
    return -1;
  }

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
777
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
778 779 780 781 782 783
      return -1;
    }

    TriMesh::VertexHandle vh( _vertexHandle );

    if ( !vh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
784
      emit log(LOGERR,tr("Unable to get vertex handle"));
Jan Möbius's avatar
 
Jan Möbius committed
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800
      return -1;
    }

    //check valence
    int valence = 0;
    TriMesh::VertexVertexIter vv_it;
  
    for (vv_it=mesh->vv_iter( vh ); vv_it; ++vv_it)
      valence++;

    return valence;

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

    if ( mesh == 0 ) {
Jan Möbius's avatar
Jan Möbius committed
801
      emit log(LOGERR, tr("Unable to get mesh"));
Jan Möbius's avatar
 
Jan Möbius committed
802 803 804 805 806 807
      return -1;
    }

    PolyMesh::VertexHandle vh( _vertexHandle );

    if ( !vh.is_valid() ) {
Jan Möbius's avatar
Jan Möbius committed
808
      emit log(LOGERR,tr("Unable to get vertex handle"));
Jan Möbius's avatar
 
Jan Möbius committed
809 810 811 812 813 814 815 816 817 818 819 820 821 822
      return -1;
    }

    //check valence
    int valence = 0;
    PolyMesh::VertexVertexIter vv_it;
  
    for (vv_it=mesh->vv_iter( vh ); vv_it; ++vv_it)
      valence++;

    return valence;
  }
}

823 824 825 826 827 828 829 830 831 832
//------------------------------------------------------------------------------

/** \brief get minimal edge length for a given object
 * 
 * @param _id object id
 * @return minimal edge length or -1 if an error occured
 */
double InfoPlugin::minEdgeLength(int _id)
{
  double min, max, mean;
Jan Möbius's avatar
 
Jan Möbius committed
833

834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
  if (getEdgeLengths (_id, min, max, mean))
    return min;
  else
    return -1;
}

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

/** \brief get maximal edge length for a given object
 * 
 * @param _id object id
 * @return maximal edge length or -1 if an error occured
 */
double InfoPlugin::maxEdgeLength(int _id)
{
  double min, max, mean;

  if (getEdgeLengths (_id, min, max, mean))
    return max;
  else
    return -1;
}

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

/** \brief get the mean edge length for a given object
 * 
 * @param _id object id
 * @return mean edge length or -1 if an error occured
 */
double InfoPlugin::meanEdgeLength(int _id)
{
  double min, max, mean;

  if (getEdgeLengths (_id, min, max, mean))
    return mean;
  else
    return -1;
}