50 #ifdef ENABLE_OPENVOLUMEMESH_SUPPORT
52 #define OVM_PROPERTY_VISUALIZER_CC
54 #ifdef ENABLE_OPENVOLUMEMESH_POLYHEDRAL_SUPPORT
57 #ifdef ENABLE_OPENVOLUMEMESH_HEXAHEDRAL_SUPPORT
60 #ifdef ENABLE_OPENVOLUMEMESH_TETRAHEDRAL_SUPPORT
64 #include "OVMPropertyVisualizer.hh"
66 #include <ACG/Utils/Histogram.hh>
68 template <
typename MeshT>
69 template <
typename InnerType>
70 QString OVMPropertyVisualizer<MeshT>::getPropertyText_(
unsigned int index)
72 if (PropertyVisualizer::propertyInfo.isCellProp())
77 else if (PropertyVisualizer::propertyInfo.isFaceProp())
82 else if (PropertyVisualizer::propertyInfo.isHalffaceProp())
87 else if (PropertyVisualizer::propertyInfo.isEdgeProp())
92 else if (PropertyVisualizer::propertyInfo.isHalfedgeProp())
104 template <
typename MeshT>
105 void OVMPropertyVisualizer<MeshT>::setPropertyFromText(
unsigned int index, QString text)
107 if (propertyInfo.isCellProp())
108 setCellPropertyFromText(index, text);
109 else if (propertyInfo.isFaceProp())
110 setFacePropertyFromText(index, text);
111 else if (propertyInfo.isHalffaceProp())
112 setHalffacePropertyFromText(index, text);
113 else if (propertyInfo.isEdgeProp())
114 setEdgePropertyFromText(index, text);
115 else if (propertyInfo.isHalfedgeProp())
116 setHalfedgePropertyFromText(index, text);
118 setVertexPropertyFromText(index, text);
121 template <
typename MeshT>
122 int OVMPropertyVisualizer<MeshT>::getEntityCount()
124 if (propertyInfo.isCellProp())
125 return mesh->n_cells();
126 if (propertyInfo.isFaceProp())
127 return mesh->n_faces();
128 if (propertyInfo.isHalffaceProp())
129 return mesh->n_halffaces();
130 else if (propertyInfo.isEdgeProp())
131 return mesh->n_edges();
132 else if (propertyInfo.isHalfedgeProp())
133 return mesh->n_halfedges();
135 return mesh->n_vertices();
138 template <
typename MeshT>
139 QString OVMPropertyVisualizer<MeshT>::getHeader()
143 QString header = QObject::tr(
"1");
144 header.append(QObject::tr(
", %1").arg(getEntityCount()));
145 header.append(QObject::tr(
", %1").arg(propertyInfo.entityType()));
146 header.append(
", ").append(propertyInfo.friendlyTypeName());
147 header.append(
", ").append(propertyInfo.propName().c_str());
151 template <
typename MeshT>
152 unsigned int OVMPropertyVisualizer<MeshT>::getClosestPrimitiveId(
unsigned int _face,
ACG::Vec3d& _hitPoint)
154 if (propertyInfo.isHalffaceProp())
155 return getClosestHalffaceId(_face, _hitPoint);
157 return getClosestHalfedgeId(_face, _hitPoint);
160 template <
typename MeshT>
161 unsigned int OVMPropertyVisualizer<MeshT>::getClosestHalffaceId(
unsigned int _face,
ACG::Vec3d& _hitPoint)
173 if ((direction | normal) < 0)
179 template <
typename MeshT>
180 unsigned int OVMPropertyVisualizer<MeshT>::getClosestHalfedgeId(
unsigned int _face,
ACG::Vec3d& _hitPoint)
182 unsigned int halfface = getClosestHalffaceId(_face, _hitPoint);
186 const std::vector<OpenVolumeMesh::HalfEdgeHandle> & halfedges = face.halfedges();
188 double min_distance = DBL_MAX;
191 for (std::vector<OpenVolumeMesh::HalfEdgeHandle>::const_iterator he_it = halfedges.begin(); he_it != halfedges.end(); ++he_it)
194 ACG::Vec3d v1 = mesh->vertex(edge.from_vertex());
195 ACG::Vec3d v2 = mesh->vertex(edge.to_vertex());
197 double distance = (p-_hitPoint).length();
198 if (distance < min_distance)
200 min_distance = distance;
201 closestHalfEdgeHandle = *he_it;
206 return closestHalfEdgeHandle.idx();
210 template <
typename MeshT>
211 void OVMPropertyVisualizer<MeshT>::visualize(
bool _setDrawMode, QWidget* _widget)
220 if (propertyInfo.isCellProp())
221 visualizeCellProp(_setDrawMode);
222 else if (propertyInfo.isFaceProp())
223 visualizeFaceProp(_setDrawMode);
224 else if (propertyInfo.isHalffaceProp())
225 visualizeHalffaceProp(_setDrawMode);
226 else if (propertyInfo.isEdgeProp())
227 visualizeEdgeProp(_setDrawMode);
228 else if (propertyInfo.isHalfedgeProp())
229 visualizeHalfedgeProp(_setDrawMode);
230 else if (propertyInfo.isVertexProp())
231 visualizeVertexProp(_setDrawMode);
239 template <
typename MeshT>
240 void OVMPropertyVisualizer<MeshT>::visualizeFaceProp(
bool )
242 emit log(
LOGERR,
"Visualizing FaceProp not implemented");
245 template <
typename MeshT>
246 void OVMPropertyVisualizer<MeshT>::visualizeEdgeProp(
bool )
248 emit log(
LOGERR,
"Visualizing EdgeProp not implemented");
251 template <
typename MeshT>
252 void OVMPropertyVisualizer<MeshT>::visualizeHalfedgeProp(
bool )
254 emit log(
LOGERR,
"Visualizing HalfedgeProp not implemented");
257 template <
typename MeshT>
258 void OVMPropertyVisualizer<MeshT>::visualizeVertexProp(
bool )
260 emit log(
LOGERR,
"Visualizing VertexProp not implemented");
263 template <
typename MeshT>
264 void OVMPropertyVisualizer<MeshT>::visualizeCellProp(
bool )
266 emit log(
LOGERR,
"Visualizing CellProp not implemented");
269 template <
typename MeshT>
270 void OVMPropertyVisualizer<MeshT>::visualizeHalffaceProp(
bool )
272 emit log(
LOGERR,
"Visualizing HalffaceProp not implemented");
275 template<
typename MeshT>
276 template<
typename PropType>
277 inline void OVMPropertyVisualizer<MeshT>::duplicateProperty_stage1() {
278 std::string newPropertyName;
279 for (
int i = 1;; ++i) {
280 std::ostringstream oss;
281 oss << propertyInfo.propName() <<
" Copy " << i;
282 newPropertyName = oss.str();
284 if (propertyInfo.isCellProp())
286 if(!mesh->template cell_property_exists<PropType>(newPropertyName))
break;
288 else if (propertyInfo.isFaceProp())
290 if(!mesh->template face_property_exists<PropType>(newPropertyName))
break;
292 else if (propertyInfo.isHalffaceProp())
294 if(!mesh->template halfface_property_exists<PropType>(newPropertyName))
break;
296 else if (propertyInfo.isEdgeProp())
298 if(!mesh->template edge_property_exists<PropType>(newPropertyName))
break;
300 else if (propertyInfo.isHalfedgeProp())
302 if(!mesh->template halfedge_property_exists<PropType>(newPropertyName))
break;
304 else if (propertyInfo.isVertexProp())
306 if(!mesh->template vertex_property_exists<PropType>(newPropertyName))
break;
310 if (propertyInfo.isCellProp())
314 mesh->set_persistent(newProp,
true);
315 std::for_each(mesh->cells_begin(), mesh->cells_end(), CopyProperty<OpenVolumeMesh::CellPropertyT<PropType> >(newProp, prop, mesh));
317 else if (propertyInfo.isFaceProp())
321 mesh->set_persistent(newProp,
true);
322 std::for_each(mesh->faces_begin(), mesh->faces_end(), CopyProperty<OpenVolumeMesh::FacePropertyT<PropType> >(newProp, prop, mesh));
324 else if (propertyInfo.isHalffaceProp())
328 mesh->set_persistent(newProp,
true);
329 std::for_each(mesh->halffaces_begin(), mesh->halffaces_end(), CopyProperty<OpenVolumeMesh::HalfFacePropertyT<PropType> >(newProp, prop, mesh));
331 else if (propertyInfo.isEdgeProp())
335 mesh->set_persistent(newProp,
true);
336 std::for_each(mesh->edges_begin(), mesh->edges_end(), CopyProperty<OpenVolumeMesh::EdgePropertyT<PropType> >(newProp, prop, mesh));
338 else if (propertyInfo.isHalfedgeProp())
342 mesh->set_persistent(newProp,
true);
343 std::for_each(mesh->halfedges_begin(), mesh->halfedges_end(), CopyProperty<OpenVolumeMesh::HalfEdgePropertyT<PropType> >(newProp, prop, mesh));
345 else if (propertyInfo.isVertexProp())
349 mesh->set_persistent(newProp,
true);
350 std::for_each(mesh->vertices_begin(), mesh->vertices_end(), CopyProperty<OpenVolumeMesh::VertexPropertyT<PropType> >(newProp, prop, mesh));
354 template <
typename MeshT>
355 void OVMPropertyVisualizer<MeshT>::clear()
360 if (propertyInfo.isCellProp())
361 object->
colors().clear_cell_colors();
362 else if (propertyInfo.isFaceProp())
363 object->
colors().clear_face_colors();
364 else if (propertyInfo.isHalffaceProp())
365 object->
colors().clear_halfface_colors();
366 else if (propertyInfo.isEdgeProp())
367 object->
colors().clear_edge_colors();
368 else if (propertyInfo.isHalfedgeProp())
369 object->
colors().clear_halfedge_colors();
370 else if (propertyInfo.isVertexProp())
371 object->
colors().clear_vertex_colors();
373 object->setObjectDrawMode(drawModes.cellsFlatShaded);
376 template <
typename MeshT>
377 void OVMPropertyVisualizer<MeshT>::setCellPropertyFromText(
unsigned int , QString )
379 emit log(
LOGERR,
"Setting CellProp not implemented for this property type");
382 template <
typename MeshT>
383 void OVMPropertyVisualizer<MeshT>::setFacePropertyFromText(
unsigned int , QString )
385 emit log(
LOGERR,
"Setting FaceProp not implemented for this property type");
388 template <
typename MeshT>
389 void OVMPropertyVisualizer<MeshT>::setHalffacePropertyFromText(
unsigned int , QString )
391 emit log(
LOGERR,
"Setting HalffaceProp not implemented for this property type");
394 template <
typename MeshT>
395 void OVMPropertyVisualizer<MeshT>::setEdgePropertyFromText(
unsigned int , QString )
397 emit log(
LOGERR,
"Setting EdgeProp not implemented for this property type");
400 template <
typename MeshT>
401 void OVMPropertyVisualizer<MeshT>::setHalfedgePropertyFromText(
unsigned int , QString )
403 emit log(
LOGERR,
"Setting HalfedgeProp not implemented for this property type");
406 template <
typename MeshT>
407 void OVMPropertyVisualizer<MeshT>::setVertexPropertyFromText(
unsigned int , QString )
409 emit log(
LOGERR,
"Setting VertexProp not implemented for this property type");
412 template<
typename MeshT>
413 template<
typename Type>
415 using PV = OVMPropertyVisualizer<MeshT>;
416 const std::string &prop_name = PV::propertyInfo.propName();
418 switch (PropertyVisualizer::propertyInfo.entityType()) {
419 case PropertyInfo::EF_CELL:
420 this->showHistogramT<Type>(
422 PV::mesh->template request_cell_property<Type>(prop_name));
424 case PropertyInfo::EF_FACE:
425 this->showHistogramT<Type>(
427 PV::mesh->template request_face_property<Type>(prop_name));
429 case PropertyInfo::EF_HALFFACE:
430 this->showHistogramT<Type>(
432 PV::mesh->template request_halfface_property<Type>(prop_name));
434 case PropertyInfo::EF_EDGE:
435 this->showHistogramT<Type>(
437 PV::mesh->template request_edge_property<Type>(prop_name));
439 case PropertyInfo::EF_HALFEDGE:
440 this->showHistogramT<Type>(
442 PV::mesh->template request_halfedge_property<Type>(prop_name));
444 case PropertyInfo::EF_VERTEX:
445 this->showHistogramT<Type>(
447 PV::mesh->template request_vertex_property<Type>(prop_name));
449 case PropertyInfo::EF_ANY:
bool getObject(int _identifier, BSplineCurveObject *&_object)
Property classes for the different entity types.
const ColorAttrib & colors() const
return a pointer to the mesh
void viewingDirection(const ACG::Vec3d &_dir, const ACG::Vec3d &_up, int _viewer)
Set the viewing direction.