44 #define OVM_PROPERTY_MODEL_CC 46 template <
typename MeshT>
55 bCombine.setText(tr(
"Combine"));
57 connect(&bCombine, SIGNAL(clicked()),
58 this, SLOT(slotCombine()));
59 widgets->layout()->addWidget(&bCombine);
61 widgets->layout()->addWidget(&mLoadSaveWidget);
63 connect(mLoadSaveWidget.save_property , SIGNAL(clicked()),
64 this, SLOT(slotSaveProperty()));
66 connect(mLoadSaveWidget.load_property , SIGNAL(clicked()),
67 this, SLOT(slotLoadProperty()));
69 widgets->layout()->addWidget(&mPickWidget);
70 connect(mPickWidget.pickButton, SIGNAL(clicked()),
71 this, SLOT(slotPickProperty()));
73 QString iconPath = OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator();
74 mPickWidget.pickButton->setIcon( QIcon(iconPath +
"color-picker.png") );
79 initializeSupportedPropertyTypes();
82 #undef INITIALIZE_PROPTYPES 84 template <
typename MeshT>
89 if (selectedIndices.size() == 2)
91 if (
combinable(propertyVisualizers[selectedIndices[0].row()], propertyVisualizers[selectedIndices[1].row()]))
95 mCombineProperty1 = &propertyVisualizers[selectedIndices[0].row()]->getPropertyInfo();
96 mCombineProperty2 = &propertyVisualizers[selectedIndices[1].row()]->getPropertyInfo();
106 if (selectedIndices.size() == 1)
112 if (mPickWidget.pickButton->isChecked())
118 template <
typename MeshT>
131 template <
typename MeshT>
134 if ( mPickWidget.pickButton->isChecked() ){
147 template <
typename MeshT>
150 pickModeActive = (_mode == PROP_VIS);
154 lastPickMode = _mode;
157 mPickWidget.pickButton->setChecked(pickModeActive);
166 template <
typename MeshT>
169 if (!pickModeActive)
return;
170 if (currentlySelectedIndices.size() < 1)
return;
172 if (_event->type() == QEvent::MouseButtonPress)
199 if (object->
id() == objectID_)
204 mPickWidget.pickedHandle->setText(tr(
"%1").arg(entityId));
212 template <
typename MeshT>
215 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) 216 QStringList headerParts = header.split(tr(
", "), QString::SkipEmptyParts );
218 QStringList headerParts = header.split(tr(
", "), Qt::SkipEmptyParts );
221 int headerVersion = headerParts[0].toUInt();
222 if (headerVersion == 1)
224 n = headerParts[1].toUInt();
225 unsigned int nExpected = 0;
227 PropertyInfo::ENTITY_FILTER filter = (PropertyInfo::ENTITY_FILTER)headerParts[2].toInt();
230 case PropertyInfo::EF_CELL:
231 nExpected = mesh_->n_cells();
233 case PropertyInfo::EF_FACE:
234 nExpected = mesh_->n_faces();
236 case PropertyInfo::EF_HALFFACE:
237 nExpected = mesh_->n_halffaces();
239 case PropertyInfo::EF_EDGE:
240 nExpected = mesh_->n_edges();
242 case PropertyInfo::EF_HALFEDGE:
243 nExpected = mesh_->n_halfedges();
245 case PropertyInfo::EF_VERTEX:
246 nExpected = mesh_->n_vertices();
255 std::cerr <<
"unexpected number of entities" << std::endl;
259 QString friendlyName = headerParts[3];
263 std::cerr <<
"unsupported property type " << friendlyName.toStdString() << std::endl;
270 QString propName = QInputDialog::getText(0,
"Property Name",
"Please enter name.",QLineEdit::Normal,headerParts[4]);
271 if (propName ==
"")
return false;
273 bool replace =
false;
280 propName = QInputDialog::getText(0,
"New Property Name",
"Please enter new name.");
281 else if (msgBox->cancel)
283 else if (msgBox->replace)
302 std::cerr <<
"unsupported header format" << std::endl;
308 template<
typename MeshT>
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 (*)");
322 template<
typename MeshT>
330 filter = tr(
"Vertex Property (*.vprop)");
332 filter = tr(
"HalfEdge Property (*.hprop)");
334 filter = tr(
"Edge Property (*.eprop)");
336 filter = tr(
"Face Property (*.fprop)");
338 filter += tr(
";; All Files (*)");
353 template<
typename MeshT>
367 template<
typename MeshT>
375 template<
typename MeshT>
378 for (QModelIndexList::const_iterator it = currentlySelectedIndices.begin(), it_end = currentlySelectedIndices.end();
379 it != it_end; ++it) {
397 template<
typename MeshT>
405 return (isVectorType(typeInfo1) && isVectorType(typeInfo2)) && (propInfo1.entityType() == propInfo2.entityType());
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)
414 for (
typename MeshT::Properties::const_iterator pit = props_first; pit != props_last; ++pit) {
422 template<
typename MeshT>
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);
445 template<
typename MeshT>
449 TypeInfoWrapperSet::const_iterator propIt = supportedPropertyTypes.find(bp_type);
450 return propIt != supportedPropertyTypes.end();
463 template<
typename MeshT>
466 for (TypeInfoWrapperSet::const_iterator it = supportedPropertyTypes.begin();
467 it != supportedPropertyTypes.end();
470 if (friendlyName.toStdString().compare(it->getName()) == 0)
484 template<
typename MeshT>
487 for (
unsigned int i = 0; i < propertyVisualizers.size(); ++i)
489 const PropertyInfo& propInfo = propertyVisualizers[i]->getPropertyInfo();
504 template<
typename MeshT>
508 TypeInfoWrapperSet::const_iterator propIt = supportedPropertyTypes.find(bp_type);
509 if (propIt != supportedPropertyTypes.end())
513 std::cerr <<
"error" << std::endl;
526 template<
typename MeshT>
530 for (TypeInfoWrapperSet::const_iterator it = supportedPropertyTypes.begin();
531 it != supportedPropertyTypes.end();
534 if ((friendlyName.toStdString().compare(it->getName()) == 0) && isEntityType(*it, filter))
537 throw std::exception();
540 template<
typename MeshT>
543 return isBoolType(propInfo.typeinfo());
546 template<
typename MeshT>
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;
557 template<
typename MeshT>
560 return isIntType(propInfo.typeinfo());
563 template<
typename MeshT>
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;
574 template<
typename MeshT>
577 return isDoubleType(propInfo.typeinfo());
580 template<
typename MeshT>
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;
591 template<
typename MeshT>
594 return isUnsignedIntType(propInfo.typeinfo());
597 template<
typename MeshT>
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;
608 template<
typename MeshT>
611 return isVec3dType(propInfo.typeinfo());
614 template<
typename MeshT>
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;
625 template<
typename MeshT>
628 return isVec3dOVMType(propInfo.typeinfo());
631 template<
typename MeshT>
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;
642 template<
typename MeshT>
645 return isVec3fType(propInfo.typeinfo());
648 template<
typename MeshT>
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;
659 template<
typename MeshT>
662 return isVec3fType(propInfo) || isVec3dType(propInfo) ;
665 template<
typename MeshT>
668 return isVec3fType(typeInfo) || isVec3dType(typeInfo);
671 template<
typename MeshT>
674 return isVec3dOVMType(propInfo) ;
677 template<
typename MeshT>
680 return isVec3dOVMType(typeInfo);
683 template<
typename MeshT>
686 return isMatrix3x3Type(propInfo.typeinfo());
689 template<
typename MeshT>
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;
700 template<
typename MeshT>
704 if (entity_type & PropertyInfo::EF_CELL)
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);
714 if (entity_type & PropertyInfo::EF_FACE)
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);
724 if (entity_type & PropertyInfo::EF_HALFFACE)
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);
734 if (entity_type & PropertyInfo::EF_EDGE)
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);
744 if (entity_type & PropertyInfo::EF_HALFEDGE)
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);
754 if (entity_type & PropertyInfo::EF_VERTEX)
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);
778 template<
typename MeshT>
782 if (isBoolType(propInfo))
784 else if (isIntType(propInfo))
786 else if (isUnsignedIntType(propInfo))
788 else if (isDoubleType(propInfo))
790 else if (isVectorType(propInfo))
792 else if (isVectorOVMType(propInfo))
794 else if (isMatrix3x3Type(propInfo))
809 template<
typename MeshT>
813 QString dtype = friendlyTypeName;
814 std::string pname = propName.toStdString();
818 if ( filter == PropertyInfo::EF_VERTEX )
820 if ( (dtype == tr(
"Vec3d")) || (dtype == tr(
"Vec3f")) )
823 mesh->set_persistent(prop,
true);
825 else if ( dtype == tr(
"double") )
828 mesh->set_persistent(prop,
true);
830 else if ( dtype == tr(
"unsigned int") )
833 mesh->set_persistent(prop,
true);
835 else if ( dtype == tr(
"int") )
838 mesh->set_persistent(prop,
true);
840 else if ( dtype == tr(
"bool") )
843 mesh->set_persistent(prop,
true);
846 else if ( filter == PropertyInfo::EF_EDGE )
848 if ( (dtype == tr(
"Vec3d")) || (dtype == tr(
"Vec3f")) )
851 mesh->set_persistent(prop,
true);
853 else if ( dtype == tr(
"double") )
856 mesh->set_persistent(prop,
true);
858 else if ( dtype == tr(
"unsgined int") )
861 mesh->set_persistent(prop,
true);
863 else if ( dtype == tr(
"int") )
866 mesh->set_persistent(prop,
true);
868 else if ( dtype == tr(
"bool") )
871 mesh->set_persistent(prop,
true);
874 else if ( filter == PropertyInfo::EF_FACE )
876 if ( (dtype == tr(
"Vec3d")) || (dtype == tr(
"Vec3f")) )
879 mesh->set_persistent(prop,
true);
881 else if ( dtype == tr(
"double") )
884 mesh->set_persistent(prop,
true);
886 else if ( dtype == tr(
"unsigned int") )
889 mesh->set_persistent(prop,
true);
891 else if ( dtype == tr(
"int") )
894 mesh->set_persistent(prop,
true);
896 else if ( dtype == tr(
"bool") )
899 mesh->set_persistent(prop,
true);
902 else if ( filter == PropertyInfo::EF_HALFEDGE )
904 if ( (dtype == tr(
"Vec3d")) || (dtype == tr(
"Vec3f")) )
907 mesh->set_persistent(prop,
true);
909 else if ( dtype == tr(
"double") )
912 mesh->set_persistent(prop,
true);
914 else if ( dtype == tr(
"unsigned int") )
917 mesh->set_persistent(prop,
true);
919 else if ( dtype == tr(
"int") )
922 mesh->set_persistent(prop,
true);
924 else if ( dtype == tr(
"bool") )
927 mesh->set_persistent(prop,
true);
930 else if ( filter == PropertyInfo::EF_HALFFACE )
932 if ( (dtype == tr(
"Vec3d")) || (dtype == tr(
"Vec3f")) )
935 mesh->set_persistent(prop,
true);
937 else if ( dtype == tr(
"double") )
940 mesh->set_persistent(prop,
true);
942 else if ( dtype == tr(
"unsigned int") )
945 mesh->set_persistent(prop,
true);
947 else if ( dtype == tr(
"int") )
950 mesh->set_persistent(prop,
true);
952 else if ( dtype == tr(
"bool") )
955 mesh->set_persistent(prop,
true);
958 else if ( filter == PropertyInfo::EF_CELL )
960 if ( (dtype == tr(
"Vec3d")) || (dtype == tr(
"Vec3f")) )
963 mesh->set_persistent(prop,
true);
965 else if ( dtype == tr(
"double") )
968 mesh->set_persistent(prop,
true);
970 else if ( dtype == tr(
"unsigned int") )
973 mesh->set_persistent(prop,
true);
975 else if ( dtype == tr(
"int") )
978 mesh->set_persistent(prop,
true);
980 else if ( dtype == tr(
"bool") )
983 mesh->set_persistent(prop,
true);
989 template <
typename MeshT>
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); \ 1003 INSERT_PROPTYPES(Cell)
1004 INSERT_PROPTYPES(Face)
1005 INSERT_PROPTYPES(HalfFace)
1006 INSERT_PROPTYPES(Edge)
1007 INSERT_PROPTYPES(HalfEdge)
1008 INSERT_PROPTYPES(Vertex)
1010 #undef INSERT_PROPTYPES 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)
virtual void pickProperty()
Toggle picking on and off.
Wraps the information of a type.
picks faces (should be implemented for all nodes)
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.
PickTarget
What target to use for picking.
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.
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)
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.
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)
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.