Developer Documentation
OVMPropertyModelT_impl.hh
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41 
42 
43 
44 #define OVM_PROPERTY_MODEL_CC
45 
46 template <typename MeshT>
47 OVMPropertyModel<MeshT>::OVMPropertyModel(MeshT* mesh, int objectID, QObject *parent)
48  : OVMPropertyModelSubclass(parent),
49  mesh_(mesh),
50  objectID_(objectID),
51  mCombineProperty1(0),
52  mCombineProperty2(0)
53 {
55  bCombine.setText(tr("Combine"));
56  bCombine.hide();
57  connect(&bCombine, SIGNAL(clicked()),
58  this, SLOT(slotCombine()));
59  widgets->layout()->addWidget(&bCombine);
60 
61  widgets->layout()->addWidget(&mLoadSaveWidget);
62 
63  connect(mLoadSaveWidget.save_property , SIGNAL(clicked()),
64  this, SLOT(slotSaveProperty()));
65 
66  connect(mLoadSaveWidget.load_property , SIGNAL(clicked()),
67  this, SLOT(slotLoadProperty()));
68 
69  widgets->layout()->addWidget(&mPickWidget);
70  connect(mPickWidget.pickButton, SIGNAL(clicked()),
71  this, SLOT(slotPickProperty()));
72  mPickWidget.hide();
73  QString iconPath = OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator();
74  mPickWidget.pickButton->setIcon( QIcon(iconPath + "color-picker.png") );
75 
76  lastPickMode = PluginFunctions::pickMode();
77  lastActionMode = PluginFunctions::actionMode();
78 
79  initializeSupportedPropertyTypes();
80 }
81 
82 #undef INITIALIZE_PROPTYPES
83 
84 template <typename MeshT>
85 void OVMPropertyModel<MeshT>::updateWidget(const QModelIndexList& selectedIndices)
86 {
88 
89  if (selectedIndices.size() == 2)
90  {
91  if (combinable(propertyVisualizers[selectedIndices[0].row()], propertyVisualizers[selectedIndices[1].row()]))
92  {
93 
94  bCombine.show();
95  mCombineProperty1 = &propertyVisualizers[selectedIndices[0].row()]->getPropertyInfo();
96  mCombineProperty2 = &propertyVisualizers[selectedIndices[1].row()]->getPropertyInfo();
97  }
98  else
99  bCombine.hide();
100  }
101  else
102  {
103  bCombine.hide();
104  }
105 
106  if (selectedIndices.size() == 1)
107  mPickWidget.show();
108  else
109  {
110  mPickWidget.hide();
111  //reset Picking, just if picking was enabled
112  if (mPickWidget.pickButton->isChecked())
113  resetPicking();
114  }
115 
116 }
117 
118 template <typename MeshT>
120 {
121  PluginFunctions::pickMode(lastPickMode);
122  PluginFunctions::actionMode(lastActionMode);
123 }
124 
125 
131 template <typename MeshT>
133 {
134  if ( mPickWidget.pickButton->isChecked() ){
135 
136  lastPickMode = PluginFunctions::pickMode();
137  lastActionMode = PluginFunctions::actionMode();
138 
139  PluginFunctions::pickMode(PROP_VIS);
140  PluginFunctions::actionMode(Viewer::PickingMode);
141 
142  } else {
143  resetPicking();
144  }
145 }
146 
147 template <typename MeshT>
148 void OVMPropertyModel<MeshT>::pickModeChanged(const std::string& _mode)
149 {
150  pickModeActive = (_mode == PROP_VIS);
151 
152  if (!pickModeActive)
153  {
154  lastPickMode = _mode;
155  }
156 
157  mPickWidget.pickButton->setChecked(pickModeActive);
158 }
159 
166 template <typename MeshT>
167 void OVMPropertyModel<MeshT>::mouseEvent(QMouseEvent* _event)
168 {
169  if (!pickModeActive) return;
170  if (currentlySelectedIndices.size() < 1) return;
171 
172  if (_event->type() == QEvent::MouseButtonPress)
173  {
174  size_t node_idx;
175  ACG::Vec3d hit_point;
176 
177 
178  OVMPropertyVisualizer<MeshT>* viz = dynamic_cast<OVMPropertyVisualizer<MeshT>*>(propertyVisualizers[currentlySelectedIndices.first().row()]);
179  size_t entityId = 0;
180 
181  ACG::SceneGraph::PickTarget pickTarget;
182  if (viz->getPropertyInfo().isCellProp())
183  pickTarget = ACG::SceneGraph::PICK_CELL;
184  if (viz->getPropertyInfo().isFaceProp())
185  pickTarget = ACG::SceneGraph::PICK_FACE;
186  if (viz->getPropertyInfo().isHalffaceProp())
187  pickTarget = ACG::SceneGraph::PICK_FACE;
188  if (viz->getPropertyInfo().isEdgeProp())
189  pickTarget = ACG::SceneGraph::PICK_EDGE;
190  if (viz->getPropertyInfo().isHalfedgeProp())
191  pickTarget = ACG::SceneGraph::PICK_FACE;
192  if (viz->getPropertyInfo().isVertexProp())
193  pickTarget = ACG::SceneGraph::PICK_VERTEX;
194 
195  if (PluginFunctions::scenegraphPick(pickTarget, _event->pos(),node_idx, entityId, &hit_point)) {
196  BaseObjectData* object;
197  PluginFunctions::getPickedObject(node_idx, object);
198 
199  if (object->id() == objectID_)
200  {
201  if (viz->getPropertyInfo().isHalfedgeProp() || viz->getPropertyInfo().isHalffaceProp()) //cant be picked directly
202  entityId = viz->getClosestPrimitiveId(entityId, hit_point);
203 
204  mPickWidget.pickedHandle->setText(tr("%1").arg(entityId));
205  mPickWidget.pickedValue->setText(viz->getPropertyText(entityId));
206  }
207  }
208 
209  }
210 }
211 
212 template <typename MeshT>
213 bool OVMPropertyModel<MeshT>::parseHeader(QString header, PropertyVisualizer*& propVis, unsigned int& n)
214 {
215 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
216  QStringList headerParts = header.split(tr(", "), QString::SkipEmptyParts );
217 #else
218  QStringList headerParts = header.split(tr(", "), Qt::SkipEmptyParts );
219 #endif
220 
221  int headerVersion = headerParts[0].toUInt();
222  if (headerVersion == 1)
223  {
224  n = headerParts[1].toUInt();
225  unsigned int nExpected = 0;
226 
227  PropertyInfo::ENTITY_FILTER filter = (PropertyInfo::ENTITY_FILTER)headerParts[2].toInt();
228  switch (filter)
229  {
230  case PropertyInfo::EF_CELL:
231  nExpected = mesh_->n_cells();
232  break;
233  case PropertyInfo::EF_FACE:
234  nExpected = mesh_->n_faces();
235  break;
236  case PropertyInfo::EF_HALFFACE:
237  nExpected = mesh_->n_halffaces();
238  break;
239  case PropertyInfo::EF_EDGE:
240  nExpected = mesh_->n_edges();
241  break;
242  case PropertyInfo::EF_HALFEDGE:
243  nExpected = mesh_->n_halfedges();
244  break;
245  case PropertyInfo::EF_VERTEX:
246  nExpected = mesh_->n_vertices();
247  break;
248  default:
249  nExpected = -1;
250  break;
251  }
252 
253  if (n != nExpected)
254  {
255  std::cerr << "unexpected number of entities" << std::endl;
256  return false;
257  }
258 
259  QString friendlyName = headerParts[3];
260 
261  if (!isSupported(friendlyName))
262  {
263  std::cerr << "unsupported property type " << friendlyName.toStdString() << std::endl;
264  return false;
265  }
266 
267 
268  TypeInfoWrapper typeInfo = getSupportedTypeInfoWrapper(friendlyName, filter);
269 
270  QString propName = QInputDialog::getText(0, "Property Name", "Please enter name.",QLineEdit::Normal,headerParts[4]);
271  if (propName == "") return false;
272 
273  bool replace = false;
274  if (!(isPropertyFree(propName, filter, typeInfo) || replace))
275  {
276  NewNameMessageBox* msgBox = new NewNameMessageBox(propName);
277  msgBox->exec();
278 
279  if (msgBox->rename)
280  propName = QInputDialog::getText(0, "New Property Name", "Please enter new name.");
281  else if (msgBox->cancel)
282  return false;
283  else if (msgBox->replace)
284  replace = true;
285 
286  delete msgBox;
287  }
288 
289  if (!replace)
290  {
291  addProperty(propName, friendlyName, filter);
293  }
294 
295  propVis = getPropertyVisualizer(propName, filter, typeInfo);
296 
297  return true;
298 
299  }
300  else
301  {
302  std::cerr << "unsupported header format" << std::endl;
303  return false;
304  }
305 }
306 
307 
308 template<typename MeshT>
310 {
311  QString filter;
312  filter = tr("Vertex Property (*.vprop)");
313  filter += tr(";; HalfEdge Property (*.hprop)");
314  filter += tr(";; Edge Property (*.eprop)");
315  filter += tr(";; Halfface Property (*.hfprop)");
316  filter += tr(";; Face Property (*.fprop)");
317  filter += tr(";; Cell Property (*.cprop)");
318  filter += tr(";; All Files (*)");
319  return filter;
320 }
321 
322 template<typename MeshT>
324 {
325  PropertyVisualizer* propViz = propertyVisualizers[propId];
326 
327  QString filter;
328 
329  if (propViz->getPropertyInfo().isVertexProp())
330  filter = tr("Vertex Property (*.vprop)");
331  else if (propViz->getPropertyInfo().isHalfedgeProp())
332  filter = tr("HalfEdge Property (*.hprop)");
333  else if (propViz->getPropertyInfo().isEdgeProp())
334  filter = tr("Edge Property (*.eprop)");
335  else if (propViz->getPropertyInfo().isFaceProp())
336  filter = tr("Face Property (*.fprop)");
337 
338  filter += tr(";; All Files (*)");
339 
340  return filter;
341 }
342 
343 
353 template<typename MeshT>
354 bool OVMPropertyModel<MeshT>::isPropertyFree(QString propName, PropertyInfo::ENTITY_FILTER filter, TypeInfoWrapper typeInfo)
355 {
356  return getPropertyVisualizer(propName, filter, typeInfo) == 0;
357 }
358 
367 template<typename MeshT>
369 {
370  beginResetModel();
371  propertyVisualizers.push_back(new OVMPropertyVisualizerVectorFieldDifference<MeshT>(mesh_, objectID_, *mCombineProperty1, *mCombineProperty2));
372  endResetModel();
373 }
374 
375 template<typename MeshT>
377 {
378  for (QModelIndexList::const_iterator it = currentlySelectedIndices.begin(), it_end = currentlySelectedIndices.end();
379  it != it_end; ++it) {
381  }
382 }
383 
397 template<typename MeshT>
398 bool OVMPropertyModel<MeshT>::combinable(PropertyVisualizer* propertyVisualizer1, PropertyVisualizer* propertyVisualizer2) const
399 {
400  const PropertyInfo& propInfo1 = propertyVisualizer1->getPropertyInfo();
401  const PropertyInfo& propInfo2 = propertyVisualizer2->getPropertyInfo();
402  TypeInfoWrapper typeInfo1 = propInfo1.typeinfo();
403  TypeInfoWrapper typeInfo2 = propInfo2.typeinfo();
404 
405  return (isVectorType(typeInfo1) && isVectorType(typeInfo2)) && (propInfo1.entityType() == propInfo2.entityType());
406 }
407 
408 template<typename MeshT>
410  typename MeshT::Properties::const_iterator props_first,
411  typename MeshT::Properties::const_iterator props_last,
412  PropertyInfo::ENTITY_FILTER filter)
413 {
414  for (typename MeshT::Properties::const_iterator pit = props_first; pit != props_last; ++pit) {
415  OpenVolumeMesh::BaseProperty*const baseProp = *pit;
416  if (baseProp && isSupported(baseProp) && isNew(baseProp, filter))
417  addPropertyVisualizer(baseProp, mesh, filter);
418  }
419 }
420 
421 
422 template<typename MeshT>
424 {
425  beginResetModel();
426  if (mesh_) {
427  gatherProperties(mesh_, mesh_->face_props_begin(), mesh_->face_props_end(), PropertyInfo::EF_FACE);
428  gatherProperties(mesh_, mesh_->edge_props_begin(), mesh_->edge_props_end(), PropertyInfo::EF_EDGE);
429  gatherProperties(mesh_, mesh_->halfedge_props_begin(), mesh_->halfedge_props_end(), PropertyInfo::EF_HALFEDGE);
430  gatherProperties(mesh_, mesh_->vertex_props_begin(), mesh_->vertex_props_end(), PropertyInfo::EF_VERTEX);
431  gatherProperties(mesh_, mesh_->halfface_props_begin(), mesh_->halfface_props_end(), PropertyInfo::EF_HALFFACE);
432  gatherProperties(mesh_, mesh_->cell_props_begin(), mesh_->cell_props_end(), PropertyInfo::EF_CELL);
433  }
434  endResetModel();
435 }
436 
437 
445 template<typename MeshT>
447 {
448  TypeInfoWrapper bp_type = typeid(*baseProp);
449  TypeInfoWrapperSet::const_iterator propIt = supportedPropertyTypes.find(bp_type);
450  return propIt != supportedPropertyTypes.end();
451 }
452 
463 template<typename MeshT>
464 bool OVMPropertyModel<MeshT>::isSupported(QString friendlyName) const
465 {
466  for (TypeInfoWrapperSet::const_iterator it = supportedPropertyTypes.begin();
467  it != supportedPropertyTypes.end();
468  ++it )
469  {
470  if (friendlyName.toStdString().compare(it->getName()) == 0)
471  return true;
472  }
473  return false;
474 }
475 
484 template<typename MeshT>
485 bool OVMPropertyModel<MeshT>::isNew(OpenVolumeMesh::BaseProperty* const baseProp, PropertyInfo::ENTITY_FILTER filter) const
486 {
487  for (unsigned int i = 0; i < propertyVisualizers.size(); ++i)
488  {
489  const PropertyInfo& propInfo = propertyVisualizers[i]->getPropertyInfo();
490  if (propInfo == PropertyInfo(baseProp->name(), getSupportedTypeInfoWrapper(baseProp) , filter))
491  return false;
492  }
493  return true;
494 }
495 
496 
504 template<typename MeshT>
506 {
507  TypeInfoWrapper bp_type = typeid(*baseProp);
508  TypeInfoWrapperSet::const_iterator propIt = supportedPropertyTypes.find(bp_type);
509  if (propIt != supportedPropertyTypes.end())
510  return *propIt;
511  else
512  {
513  std::cerr << "error" << std::endl;
514  return *propIt;
515  }
516 }
517 
526 template<typename MeshT>
527 TypeInfoWrapper OVMPropertyModel<MeshT>::getSupportedTypeInfoWrapper(QString friendlyName, PropertyInfo::ENTITY_FILTER filter) const
528 {
529 
530  for (TypeInfoWrapperSet::const_iterator it = supportedPropertyTypes.begin();
531  it != supportedPropertyTypes.end();
532  ++it )
533  {
534  if ((friendlyName.toStdString().compare(it->getName()) == 0) && isEntityType(*it, filter))
535  return *it;
536  }
537  throw std::exception();
538 }
539 
540 template<typename MeshT>
542 {
543  return isBoolType(propInfo.typeinfo());
544 }
545 
546 template<typename MeshT>
548 {
549  return typeInfo == proptype_Cell_bool ||
550  typeInfo == proptype_Face_bool ||
551  typeInfo == proptype_HalfFace_bool ||
552  typeInfo == proptype_Edge_bool ||
553  typeInfo == proptype_HalfEdge_bool ||
554  typeInfo == proptype_Vertex_bool;
555 }
556 
557 template<typename MeshT>
559 {
560  return isIntType(propInfo.typeinfo());
561 }
562 
563 template<typename MeshT>
565 {
566  return typeInfo == proptype_Cell_int ||
567  typeInfo == proptype_Face_int ||
568  typeInfo == proptype_HalfFace_int ||
569  typeInfo == proptype_Edge_int ||
570  typeInfo == proptype_HalfEdge_int ||
571  typeInfo == proptype_Vertex_int;
572 }
573 
574 template<typename MeshT>
576 {
577  return isDoubleType(propInfo.typeinfo());
578 }
579 
580 template<typename MeshT>
582 {
583  return typeInfo == proptype_Cell_double ||
584  typeInfo == proptype_Face_double ||
585  typeInfo == proptype_HalfFace_double ||
586  typeInfo == proptype_Edge_double ||
587  typeInfo == proptype_HalfEdge_double ||
588  typeInfo == proptype_Vertex_double;
589 }
590 
591 template<typename MeshT>
593 {
594  return isUnsignedIntType(propInfo.typeinfo());
595 }
596 
597 template<typename MeshT>
599 {
600  return typeInfo == proptype_Cell_uint ||
601  typeInfo == proptype_Face_uint ||
602  typeInfo == proptype_HalfFace_uint ||
603  typeInfo == proptype_Edge_uint ||
604  typeInfo == proptype_HalfEdge_uint ||
605  typeInfo == proptype_Vertex_uint;
606 }
607 
608 template<typename MeshT>
610 {
611  return isVec3dType(propInfo.typeinfo());
612 }
613 
614 template<typename MeshT>
616 {
617  return typeInfo == proptype_Cell_Vec3d ||
618  typeInfo == proptype_Face_Vec3d ||
619  typeInfo == proptype_HalfFace_Vec3d ||
620  typeInfo == proptype_Edge_Vec3d ||
621  typeInfo == proptype_HalfEdge_Vec3d ||
622  typeInfo == proptype_Vertex_Vec3d;
623 }
624 
625 template<typename MeshT>
627 {
628  return isVec3dOVMType(propInfo.typeinfo());
629 }
630 
631 template<typename MeshT>
633 {
634  return typeInfo == proptype_Cell_Vec3dOVM ||
635  typeInfo == proptype_Face_Vec3dOVM ||
636  typeInfo == proptype_HalfFace_Vec3dOVM ||
637  typeInfo == proptype_Edge_Vec3dOVM ||
638  typeInfo == proptype_HalfEdge_Vec3dOVM ||
639  typeInfo == proptype_Vertex_Vec3dOVM;
640 }
641 
642 template<typename MeshT>
644 {
645  return isVec3fType(propInfo.typeinfo());
646 }
647 
648 template<typename MeshT>
650 {
651  return typeInfo == proptype_Cell_Vec3f ||
652  typeInfo == proptype_Face_Vec3f ||
653  typeInfo == proptype_HalfFace_Vec3f ||
654  typeInfo == proptype_Edge_Vec3f ||
655  typeInfo == proptype_HalfEdge_Vec3f ||
656  typeInfo == proptype_Vertex_Vec3f;
657 }
658 
659 template<typename MeshT>
661 {
662  return isVec3fType(propInfo) || isVec3dType(propInfo) ;
663 }
664 
665 template<typename MeshT>
667 {
668  return isVec3fType(typeInfo) || isVec3dType(typeInfo);
669 }
670 
671 template<typename MeshT>
673 {
674  return isVec3dOVMType(propInfo) ;
675 }
676 
677 template<typename MeshT>
679 {
680  return isVec3dOVMType(typeInfo);
681 }
682 
683 template<typename MeshT>
685 {
686  return isMatrix3x3Type(propInfo.typeinfo());
687 }
688 
689 template<typename MeshT>
691 {
692  return typeInfo == proptype_Cell_Matrix3x3d ||
693  typeInfo == proptype_Face_Matrix3x3d ||
694  typeInfo == proptype_HalfFace_Matrix3x3d ||
695  typeInfo == proptype_Edge_Matrix3x3d ||
696  typeInfo == proptype_HalfEdge_Matrix3x3d ||
697  typeInfo == proptype_Vertex_Matrix3x3d;
698 }
699 
700 template<typename MeshT>
701 bool OVMPropertyModel<MeshT>::isEntityType(const TypeInfoWrapper& typeInfo, PropertyInfo::ENTITY_FILTER entity_type) const
702 {
703  bool result = false;
704  if (entity_type & PropertyInfo::EF_CELL)
705  {
706  result |= (typeInfo == proptype_Cell_bool)
707  || (typeInfo == proptype_Cell_int)
708  || (typeInfo == proptype_Cell_double)
709  || (typeInfo == proptype_Cell_uint)
710  || (typeInfo == proptype_Cell_Vec3d)
711  || (typeInfo == proptype_Cell_Vec3dOVM)
712  || (typeInfo == proptype_Cell_Vec3f);
713  }
714  if (entity_type & PropertyInfo::EF_FACE)
715  {
716  result |= (typeInfo == proptype_Face_bool)
717  || (typeInfo == proptype_Face_int)
718  || (typeInfo == proptype_Face_double)
719  || (typeInfo == proptype_Face_uint)
720  || (typeInfo == proptype_Face_Vec3d)
721  || (typeInfo == proptype_Face_Vec3dOVM)
722  || (typeInfo == proptype_Face_Vec3f);
723  }
724  if (entity_type & PropertyInfo::EF_HALFFACE)
725  {
726  result |= (typeInfo == proptype_HalfFace_bool)
727  || (typeInfo == proptype_HalfFace_int)
728  || (typeInfo == proptype_HalfFace_double)
729  || (typeInfo == proptype_HalfFace_uint)
730  || (typeInfo == proptype_HalfFace_Vec3d)
731  || (typeInfo == proptype_HalfFace_Vec3dOVM)
732  || (typeInfo == proptype_HalfFace_Vec3f);
733  }
734  if (entity_type & PropertyInfo::EF_EDGE)
735  {
736  result |= (typeInfo == proptype_Edge_bool)
737  || (typeInfo == proptype_Edge_int)
738  || (typeInfo == proptype_Edge_double)
739  || (typeInfo == proptype_Edge_uint)
740  || (typeInfo == proptype_Edge_Vec3d)
741  || (typeInfo == proptype_Edge_Vec3dOVM)
742  || (typeInfo == proptype_Edge_Vec3f);
743  }
744  if (entity_type & PropertyInfo::EF_HALFEDGE)
745  {
746  result |= (typeInfo == proptype_HalfEdge_bool)
747  || (typeInfo == proptype_HalfEdge_int)
748  || (typeInfo == proptype_HalfEdge_double)
749  || (typeInfo == proptype_HalfEdge_uint)
750  || (typeInfo == proptype_HalfEdge_Vec3d)
751  || (typeInfo == proptype_HalfEdge_Vec3dOVM)
752  || (typeInfo == proptype_HalfEdge_Vec3f);
753  }
754  if (entity_type & PropertyInfo::EF_VERTEX)
755  {
756  result |= (typeInfo == proptype_Vertex_bool)
757  || (typeInfo == proptype_Vertex_int)
758  || (typeInfo == proptype_Vertex_double)
759  || (typeInfo == proptype_Vertex_uint)
760  || (typeInfo == proptype_Vertex_Vec3d)
761  || (typeInfo == proptype_Vertex_Vec3dOVM)
762  || (typeInfo == proptype_Vertex_Vec3f);
763  }
764  return result;
765 }
766 
767 
778 template<typename MeshT>
779 void OVMPropertyModel<MeshT>::addPropertyVisualizer(OpenVolumeMesh::BaseProperty* const baseProp, MeshT* mesh, PropertyInfo::ENTITY_FILTER filter)
780 {
781  PropertyInfo propInfo = PropertyInfo(baseProp->name(), getSupportedTypeInfoWrapper(baseProp) , filter);
782  if (isBoolType(propInfo))
783  propertyVisualizers.push_back(new OVMPropertyVisualizerBoolean<MeshT>(mesh, objectID_, propInfo));
784  else if (isIntType(propInfo))
785  propertyVisualizers.push_back(new OVMPropertyVisualizerInteger<MeshT, int>(mesh, objectID_, propInfo, false));
786  else if (isUnsignedIntType(propInfo))
787  propertyVisualizers.push_back(new OVMPropertyVisualizerInteger<MeshT, unsigned int>(mesh, objectID_, propInfo, true));
788  else if (isDoubleType(propInfo))
789  propertyVisualizers.push_back(new OVMPropertyVisualizerDouble<MeshT>(mesh, objectID_, propInfo));
790  else if (isVectorType(propInfo))
791  propertyVisualizers.push_back(new OVMPropertyVisualizerVector<MeshT, ACG::Vec3d>(mesh, objectID_, propInfo));
792  else if (isVectorOVMType(propInfo))
793  propertyVisualizers.push_back(new OVMPropertyVisualizerVector<MeshT, OpenVolumeMesh::Vec3d>(mesh, objectID_, propInfo));
794  else if (isMatrix3x3Type(propInfo))
795  propertyVisualizers.push_back(new OVMPropertyVisualizerMatrix3x3<MeshT>(mesh, objectID_, propInfo));
796  connectLogs(propertyVisualizers.back());
797 }
798 
809 template<typename MeshT>
810 void OVMPropertyModel<MeshT>::addProperty(QString propName, QString friendlyTypeName, PropertyInfo::ENTITY_FILTER filter)
811 {
812 
813  QString dtype = friendlyTypeName;
814  std::string pname = propName.toStdString();
815 
816  MeshT* mesh = mesh_;
817 
818  if ( filter == PropertyInfo::EF_VERTEX )
819  {
820  if ( (dtype == tr("Vec3d")) || (dtype == tr("Vec3f")) )
821  {
822  OpenVolumeMesh::VertexPropertyT< ACG::Vec3d > prop = mesh->template request_vertex_property< ACG::Vec3d >(pname);
823  mesh->set_persistent(prop, true);
824  }
825  else if ( dtype == tr("double") )
826  {
827  OpenVolumeMesh::VertexPropertyT< double > prop = mesh->template request_vertex_property< double >(pname);
828  mesh->set_persistent(prop, true);
829  }
830  else if ( dtype == tr("unsigned int") )
831  {
832  OpenVolumeMesh::VertexPropertyT< unsigned int > prop = mesh->template request_vertex_property< unsigned int >(pname);
833  mesh->set_persistent(prop, true);
834  }
835  else if ( dtype == tr("int") )
836  {
837  OpenVolumeMesh::VertexPropertyT< int > prop = mesh->template request_vertex_property< int >(pname);
838  mesh->set_persistent(prop, true);
839  }
840  else if ( dtype == tr("bool") )
841  {
842  OpenVolumeMesh::VertexPropertyT< bool > prop = mesh->template request_vertex_property< bool >(pname);
843  mesh->set_persistent(prop, true);
844  }
845  }
846  else if ( filter == PropertyInfo::EF_EDGE )
847  {
848  if ( (dtype == tr("Vec3d")) || (dtype == tr("Vec3f")) )
849  {
850  OpenVolumeMesh::EdgePropertyT< ACG::Vec3d > prop = mesh->template request_edge_property< ACG::Vec3d >(pname);
851  mesh->set_persistent(prop, true);
852  }
853  else if ( dtype == tr("double") )
854  {
855  OpenVolumeMesh::EdgePropertyT< double > prop = mesh->template request_edge_property< double >(pname);
856  mesh->set_persistent(prop, true);
857  }
858  else if ( dtype == tr("unsgined int") )
859  {
860  OpenVolumeMesh::EdgePropertyT< unsigned int > prop = mesh->template request_edge_property< unsigned int >(pname);
861  mesh->set_persistent(prop, true);
862  }
863  else if ( dtype == tr("int") )
864  {
865  OpenVolumeMesh::EdgePropertyT< int > prop = mesh->template request_edge_property< int >(pname);
866  mesh->set_persistent(prop, true);
867  }
868  else if ( dtype == tr("bool") )
869  {
870  OpenVolumeMesh::EdgePropertyT< bool > prop = mesh->template request_edge_property< bool >(pname);
871  mesh->set_persistent(prop, true);
872  }
873  }
874  else if ( filter == PropertyInfo::EF_FACE )
875  {
876  if ( (dtype == tr("Vec3d")) || (dtype == tr("Vec3f")) )
877  {
878  OpenVolumeMesh::FacePropertyT< ACG::Vec3d > prop = mesh->template request_face_property< ACG::Vec3d >(pname);
879  mesh->set_persistent(prop, true);
880  }
881  else if ( dtype == tr("double") )
882  {
883  OpenVolumeMesh::FacePropertyT< double > prop = mesh->template request_face_property< double >(pname);
884  mesh->set_persistent(prop, true);
885  }
886  else if ( dtype == tr("unsigned int") )
887  {
888  OpenVolumeMesh::FacePropertyT< unsigned int > prop = mesh->template request_face_property< unsigned int >(pname);
889  mesh->set_persistent(prop, true);
890  }
891  else if ( dtype == tr("int") )
892  {
893  OpenVolumeMesh::FacePropertyT< int > prop = mesh->template request_face_property< int >(pname);
894  mesh->set_persistent(prop, true);
895  }
896  else if ( dtype == tr("bool") )
897  {
898  OpenVolumeMesh::FacePropertyT< bool > prop = mesh->template request_face_property< bool >(pname);
899  mesh->set_persistent(prop, true);
900  }
901  }
902  else if ( filter == PropertyInfo::EF_HALFEDGE )
903  {
904  if ( (dtype == tr("Vec3d")) || (dtype == tr("Vec3f")) )
905  {
906  OpenVolumeMesh::HalfEdgePropertyT< ACG::Vec3d > prop = mesh->template request_halfedge_property< ACG::Vec3d >(pname);
907  mesh->set_persistent(prop, true);
908  }
909  else if ( dtype == tr("double") )
910  {
911  OpenVolumeMesh::HalfEdgePropertyT< double > prop = mesh->template request_halfedge_property< double >(pname);
912  mesh->set_persistent(prop, true);
913  }
914  else if ( dtype == tr("unsigned int") )
915  {
916  OpenVolumeMesh::HalfEdgePropertyT< unsigned int > prop = mesh->template request_halfedge_property< unsigned int >(pname);
917  mesh->set_persistent(prop, true);
918  }
919  else if ( dtype == tr("int") )
920  {
921  OpenVolumeMesh::HalfEdgePropertyT< int > prop = mesh->template request_halfedge_property< int >(pname);
922  mesh->set_persistent(prop, true);
923  }
924  else if ( dtype == tr("bool") )
925  {
926  OpenVolumeMesh::HalfEdgePropertyT< bool > prop = mesh->template request_halfedge_property< bool >(pname);
927  mesh->set_persistent(prop, true);
928  }
929  }
930  else if ( filter == PropertyInfo::EF_HALFFACE )
931  {
932  if ( (dtype == tr("Vec3d")) || (dtype == tr("Vec3f")) )
933  {
934  OpenVolumeMesh::HalfFacePropertyT< ACG::Vec3d > prop = mesh->template request_halfface_property< ACG::Vec3d >(pname);
935  mesh->set_persistent(prop, true);
936  }
937  else if ( dtype == tr("double") )
938  {
939  OpenVolumeMesh::HalfFacePropertyT< double > prop = mesh->template request_halfface_property< double >(pname);
940  mesh->set_persistent(prop, true);
941  }
942  else if ( dtype == tr("unsigned int") )
943  {
944  OpenVolumeMesh::HalfFacePropertyT< unsigned int > prop = mesh->template request_halfface_property< unsigned int >(pname);
945  mesh->set_persistent(prop, true);
946  }
947  else if ( dtype == tr("int") )
948  {
949  OpenVolumeMesh::HalfFacePropertyT< int > prop = mesh->template request_halfface_property< int >(pname);
950  mesh->set_persistent(prop, true);
951  }
952  else if ( dtype == tr("bool") )
953  {
954  OpenVolumeMesh::HalfFacePropertyT< bool > prop = mesh->template request_halfface_property< bool >(pname);
955  mesh->set_persistent(prop, true);
956  }
957  }
958  else if ( filter == PropertyInfo::EF_CELL )
959  {
960  if ( (dtype == tr("Vec3d")) || (dtype == tr("Vec3f")) )
961  {
962  OpenVolumeMesh::CellPropertyT< ACG::Vec3d > prop = mesh->template request_cell_property< ACG::Vec3d >(pname);
963  mesh->set_persistent(prop, true);
964  }
965  else if ( dtype == tr("double") )
966  {
967  OpenVolumeMesh::CellPropertyT< double > prop = mesh->template request_cell_property< double >(pname);
968  mesh->set_persistent(prop, true);
969  }
970  else if ( dtype == tr("unsigned int") )
971  {
972  OpenVolumeMesh::CellPropertyT< unsigned int > prop = mesh->template request_cell_property< unsigned int >(pname);
973  mesh->set_persistent(prop, true);
974  }
975  else if ( dtype == tr("int") )
976  {
977  OpenVolumeMesh::CellPropertyT< int > prop = mesh->template request_cell_property< int >(pname);
978  mesh->set_persistent(prop, true);
979  }
980  else if ( dtype == tr("bool") )
981  {
982  OpenVolumeMesh::CellPropertyT< bool > prop = mesh->template request_cell_property< bool >(pname);
983  mesh->set_persistent(prop, true);
984  }
985  }
986 
987 }
988 
989 template <typename MeshT>
991 {
992 
993 #define INSERT_PROPTYPES(primitive) \
994 supportedPropertyTypes.insert(proptype_##primitive##_bool); \
995 supportedPropertyTypes.insert(proptype_##primitive##_int); \
996 supportedPropertyTypes.insert(proptype_##primitive##_uint); \
997 supportedPropertyTypes.insert(proptype_##primitive##_double); \
998 supportedPropertyTypes.insert(proptype_##primitive##_Vec3d); \
999 supportedPropertyTypes.insert(proptype_##primitive##_Vec3dOVM); \
1000 supportedPropertyTypes.insert(proptype_##primitive##_Vec3f); \
1001 supportedPropertyTypes.insert(proptype_##primitive##_Matrix3x3d); \
1002 
1003  INSERT_PROPTYPES(Cell)
1004  INSERT_PROPTYPES(Face)
1005  INSERT_PROPTYPES(HalfFace)
1006  INSERT_PROPTYPES(Edge)
1007  INSERT_PROPTYPES(HalfEdge)
1008  INSERT_PROPTYPES(Vertex)
1009 
1010 #undef INSERT_PROPTYPES
1011 
1012 
1013 
1014 }
1015 
bool scenegraphPick(ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, size_t &_nodeIdx, size_t &_targetIdx, ACG::Vec3d *_hitPointPtr=0)
Execute picking operation on scenegraph.
picks edges (may not be implemented for all nodes)
Definition: PickTarget.hh:80
virtual void pickProperty()
Toggle picking on and off.
Wraps the information of a type.
Definition: Utils.hh:73
picks faces (should be implemented for all nodes)
Definition: PickTarget.hh:78
virtual void mouseEvent(QMouseEvent *_event)
Handles mouse events for picking.
virtual void updateWidget(const QModelIndexList &selectedIndices)
Updates the widget.
void addProperty(QString propName, QString friendlyTypeName, PropertyInfo::ENTITY_FILTER filter)
Adds a new property to the mesh.
TypeInfoWrapper getSupportedTypeInfoWrapper(OpenVolumeMesh::BaseProperty *const baseProp) const
Returns the TypeInfoWrapper for the property if it is supported.
bool isPropertyFree(QString propName, PropertyInfo::ENTITY_FILTER filter, TypeInfoWrapper typeInfo)
Checks if a property name is still available for an entity type and a property type.
void connectLogs(PropertyVisualizer *propViz) override
Connects the PropertyVisualizer log signals with the log slot.
int id() const
Definition: BaseObject.cc:190
PickTarget
What target to use for picking.
Definition: PickTarget.hh:73
virtual void pickModeChanged(const std::string &_mode)
Handles changing of pick mode.
void saveProperty(unsigned int propId)
Saves property.
virtual void saveProperty()
Saves the currently slected properties.
Asks the user how to proceed after a name clash.
Definition: Utils.hh:170
Viewer::ActionMode actionMode()
Get the current Action mode.
bool isSupported(OpenVolumeMesh::BaseProperty *const baseProp) const
Checks if visualizing this property is supported.
void addPropertyVisualizer(OpenVolumeMesh::BaseProperty *const baseProp, MeshT *mesh, PropertyInfo::ENTITY_FILTER filter)
Adds a new PropertyVisualizer.
picks verices (may not be implemented for all nodes)
Definition: PickTarget.hh:82
unsigned int getClosestPrimitiveId(unsigned int _face, ACG::Vec3d &_hitPoint)
Returns the ID of the closest primitive.
const PropertyInfo & getPropertyInfo() const
Returns the PropertyInfo.
Cellection of information about a property.
Definition: Utils.hh:109
virtual QString getLoadFilenameFilter()
Returns the filename filter for loading.
void resetPicking()
Disables picking.
const std::string pickMode()
Get the current Picking mode.
This class vizualizes a property.
PropertyVisualizer * getPropertyVisualizer(QString propName, PropertyInfo::ENTITY_FILTER filter, TypeInfoWrapper typeInfo)
Returns a PropertyVisualizer.
void gatherProperties()
Searches for all properties and creates the visualizers.
virtual void combine()
Combines two properties.
virtual void updateWidget(const QModelIndexList &selectedIndices) override
Updates the widget.
picks faces (may not be implemented for all nodes)
Definition: PickTarget.hh:76
virtual bool parseHeader(QString header, PropertyVisualizer *&propVis, unsigned int &n)
Parses the property file header.
virtual QString getSaveFilenameFilter(unsigned int propId)
Returns the filename filter for saving.
bool getPickedObject(const size_t _node_idx, BaseObjectData *&_object)
Get the picked mesh.
bool combinable(PropertyVisualizer *propertyVisualizer1, PropertyVisualizer *propertyVisualizer2) const
Checks if two properties are combinable.
virtual QString getPropertyText(unsigned int index)=0
Returns the value of a property in text form.
bool isNew(OpenVolumeMesh::BaseProperty *const baseProp, PropertyInfo::ENTITY_FILTER filter) const
Checks if we already created a PropertyVisualizer for this property.