Commit 0dfe7085 authored by Martin Heistermann's avatar Martin Heistermann

mat3x3 vis: implementation start

parent d08962e7
......@@ -45,6 +45,7 @@
#include <OpenMesh/Core/Utils/Property.hh>
#include <ACG/Math/VectorT.hh>
#include <ACG/Math/Matrix3x3T.hh>
#include <iostream>
......@@ -64,6 +65,8 @@ const PropertyNameListModel::TypeInfoWrapper PropertyNameListModel::proptype_Vec
PropertyNameListModel::TypeInfoWrapper(typeid(OpenMesh::PropertyT<ACG::Vec2d>), "Vec2d");
const PropertyNameListModel::TypeInfoWrapper PropertyNameListModel::proptype_Vec2f =
PropertyNameListModel::TypeInfoWrapper(typeid(OpenMesh::PropertyT<ACG::Vec2f>), "Vec2f");
const PropertyNameListModel::TypeInfoWrapper PropertyNameListModel::proptype_Matrix3x3d =
PropertyNameListModel::TypeInfoWrapper(typeid(OpenMesh::PropertyT<ACG::Matrix3x3d>), "Matrix3x3d");
#ifdef ENABLE_SKELETON_SUPPORT
#include <ObjectTypes/Skeleton/BaseSkin.hh>
......
......@@ -66,7 +66,7 @@ class PropertyNameListModel: public QAbstractListModel {
class TypeInfoWrapper {
public:
TypeInfoWrapper(const std::type_info & ti, const char *friendlyName) : ti(&ti), friendlyName(friendlyName) {}
TypeInfoWrapper(const std::type_info & ti) : ti(&ti),friendlyName("") {}
explicit TypeInfoWrapper(const std::type_info & ti) : ti(&ti),friendlyName("") {}
operator const std::type_info *() const { return ti; }
operator const std::type_info &() const { return *ti; }
......@@ -215,6 +215,7 @@ class PropertyNameListModel: public QAbstractListModel {
static const TypeInfoWrapper proptype_Vec3f;
static const TypeInfoWrapper proptype_Vec2d;
static const TypeInfoWrapper proptype_Vec2f;
static const TypeInfoWrapper proptype_Matrix3x3d;
static const TypeInfoWrapper proptype_SkinWeights;
private:
......
......@@ -48,6 +48,7 @@
#include "OVMPropertyVisualizerBoolean.hh"
#include "OVMPropertyVisualizerDouble.hh"
#include "OVMPropertyVisualizerInteger.hh"
#include "OVMPropertyVisualizerMatrix3x3.hh"
#include "OVMPropertyVisualizerVector.hh"
#include "OVMPropertyVisualizerVectorFieldDifference.hh"
......@@ -104,6 +105,8 @@ public:
static bool isVec3fType(const TypeInfoWrapper& typeInfo);
static bool isVectorType(const PropertyInfo& propInfo);
static bool isVectorType(const TypeInfoWrapper& typeInfo);
static bool isMatrix3x3Type(const PropertyInfo& propInfo);
static bool isMatrix3x3Type(const TypeInfoWrapper& typeInfo);
#define DECLARE_PROPTYPES(primitive) \
static const TypeInfoWrapper proptype_##primitive##_bool; \
......@@ -111,7 +114,8 @@ public:
static const TypeInfoWrapper proptype_##primitive##_uint; \
static const TypeInfoWrapper proptype_##primitive##_double; \
static const TypeInfoWrapper proptype_##primitive##_Vec3d; \
static const TypeInfoWrapper proptype_##primitive##_Vec3f;
static const TypeInfoWrapper proptype_##primitive##_Vec3f; \
static const TypeInfoWrapper proptype_##primitive##_Matrix3x3d;
DECLARE_PROPTYPES(Cell)
DECLARE_PROPTYPES(Face)
......@@ -206,7 +210,9 @@ template <typename T> const TypeInfoWrapper OVMPropertyModel<T>::proptype_##prim
template <typename T> const TypeInfoWrapper OVMPropertyModel<T>::proptype_##primitive##_Vec3d \
= TypeInfoWrapper(typeid(OpenVolumeMesh::primitive##PropertyT<ACG::Vec3d>), "Vec3d"); \
template <typename T> const TypeInfoWrapper OVMPropertyModel<T>::proptype_##primitive##_Vec3f \
= TypeInfoWrapper(typeid(OpenVolumeMesh::primitive##PropertyT<ACG::Vec3f>), "Vec3f");
= TypeInfoWrapper(typeid(OpenVolumeMesh::primitive##PropertyT<ACG::Vec3f>), "Vec3f"); \
template <typename T> const TypeInfoWrapper OVMPropertyModel<T>::proptype_##primitive##_Matrix3x3d \
= TypeInfoWrapper(typeid(OpenVolumeMesh::primitive##PropertyT<ACG::Matrix3x3d>), "Matrix3x3d");
INITIALIZE_PROPTYPES(Cell)
INITIALIZE_PROPTYPES(Face)
......
......@@ -646,6 +646,23 @@ bool OVMPropertyModel<MeshT>::isVectorType(const TypeInfoWrapper& typeInfo)
return isVec3fType(typeInfo) || isVec3dType(typeInfo);
}
template<typename MeshT>
bool OVMPropertyModel<MeshT>::isMatrix3x3Type(const PropertyInfo& propInfo)
{
return isMatrix3x3Type(propInfo.typeinfo());
}
template<typename MeshT>
bool OVMPropertyModel<MeshT>::isMatrix3x3Type(const TypeInfoWrapper& typeInfo)
{
return typeInfo == proptype_Cell_Matrix3x3d ||
typeInfo == proptype_Face_Matrix3x3d ||
typeInfo == proptype_HalfFace_Matrix3x3d ||
typeInfo == proptype_Edge_Matrix3x3d ||
typeInfo == proptype_HalfEdge_Matrix3x3d ||
typeInfo == proptype_Vertex_Matrix3x3d;
}
template<typename MeshT>
bool OVMPropertyModel<MeshT>::isEntityType(const TypeInfoWrapper& typeInfo, PropertyInfo::ENTITY_FILTER entity_type) const
{
......@@ -732,6 +749,8 @@ void OVMPropertyModel<MeshT>::addPropertyVisualizer(OpenVolumeMesh::BaseProperty
propertyVisualizers.push_back(new OVMPropertyVisualizerDouble<MeshT>(mesh, objectID_, propInfo));
else if (isVectorType(propInfo))
propertyVisualizers.push_back(new OVMPropertyVisualizerVector<MeshT>(mesh, objectID_, propInfo));
else if (isMatrix3x3Type(propInfo))
propertyVisualizers.push_back(new OVMPropertyVisualizerMatrix3x3<MeshT>(mesh, objectID_, propInfo));
connectLogs(propertyVisualizers.back());
}
......@@ -936,6 +955,7 @@ supportedPropertyTypes.insert(proptype_##primitive##_uint); \
supportedPropertyTypes.insert(proptype_##primitive##_double); \
supportedPropertyTypes.insert(proptype_##primitive##_Vec3d); \
supportedPropertyTypes.insert(proptype_##primitive##_Vec3f); \
supportedPropertyTypes.insert(proptype_##primitive##_Matrix3x3d); \
INSERT_PROPTYPES(Cell)
INSERT_PROPTYPES(Face)
......
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (c) 2001-2015, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
\*===========================================================================*/
#pragma once
#include "OVMPropertyVisualizer.hh"
#include <ACG/Scenegraph/LineNode.hh>
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
#include <OpenVolumeMesh/Core/BaseEntities.hh>
#include <OpenVolumeMesh/Core/BaseProperty.hh>
#include "Widgets/Matrix3x3Widget.hh"
#include <iostream>
template <typename MeshT>
class OVMPropertyVisualizerMatrix3x3: public OVMPropertyVisualizer<MeshT>{
public:
OVMPropertyVisualizerMatrix3x3(MeshT* _mesh, int objectID, PropertyInfo _propertyInfo);
virtual ~OVMPropertyVisualizerMatrix3x3(){ clear(); }
void clear() override;
protected:
void duplicateProperty() override;
void visualizeFaceProp(bool _setDrawMode = true) override;
void visualizeEdgeProp(bool _setDrawMode = true) override;
void visualizeHalfedgeProp(bool _setDrawMode = true) override;
void visualizeVertexProp(bool _setDrawMode = true) override;
void visualizeCellProp(bool _setDrawMode = true) override;
void visualizeHalffaceProp(bool _setDrawMode = true) override;
QString getPropertyText(unsigned int index) override;
ACG::SceneGraph::LineNode* lineNode;
};
#if defined(INCLUDE_TEMPLATES) && !defined(OVM_PROPERTY_VISUALIZER_MAT3X3_CC)
#include "OVMPropertyVisualizerMatrix3x3T.cc"
#endif
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (c) 2001-2015, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
\*===========================================================================*/
#define OVM_PROPERTY_VISUALIZER_MAT3X3_CC
#include <ACG/Utils/ColorConversion.hh>
#include "OVMPropertyVisualizerMatrix3x3.hh"
template <typename MeshT>
OVMPropertyVisualizerMatrix3x3<MeshT>::OVMPropertyVisualizerMatrix3x3(MeshT* _mesh, int objectID, PropertyInfo _propertyInfo)
: OVMPropertyVisualizer<MeshT>(_mesh, objectID, _propertyInfo)
{
if (PropertyVisualizer::widget) delete PropertyVisualizer::widget;
Matrix3x3Widget* w = new Matrix3x3Widget();
PropertyVisualizer::widget = w;
BaseObjectData *bod;
PluginFunctions::getObject(objectID, bod);
lineNode = new ACG::SceneGraph::LineNode(ACG::SceneGraph::LineNode::LineSegmentsMode, bod->baseNode());
this->connect(w->lineWidth, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
[this](double value) {lineNode->set_line_width(value);});
}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::clear()
{
lineNode->clear();
OVMPropertyVisualizer<MeshT>::clear();
}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::duplicateProperty()
{
OVMPropertyVisualizer<MeshT>::template duplicateProperty_stage1<ACG::Matrix3x3d>();
}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::visualizeCellProp(bool _setDrawMode)
{
}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::visualizeFaceProp(bool _setDrawMode)
{}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::visualizeHalffaceProp(bool _setDrawMode)
{}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::visualizeEdgeProp(bool _setDrawMode)
{
}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::visualizeHalfedgeProp(bool _setDrawMode)
{
}
template <typename MeshT>
void OVMPropertyVisualizerMatrix3x3<MeshT>::visualizeVertexProp(bool _setDrawMode)
{}
template <typename MeshT>
QString OVMPropertyVisualizerMatrix3x3<MeshT>::getPropertyText(unsigned int index)
{
return OVMPropertyVisualizer<MeshT>::template getPropertyText_<ACG::Matrix3x3d>(index);
}
......@@ -42,6 +42,7 @@
#include "PropertyVisualizer.hh"
#include "ACG/Math/Matrix3x3T.hh"
/*! \brief Visualizes the property
*
......@@ -107,6 +108,14 @@ QString PropertyVisualizer::toStr(OpenMesh::Vec2f v)
return QObject::tr("∥(%1, %2)∥ = %3").arg(v[0]).arg(v[1]).arg(v.norm());
}
QString PropertyVisualizer::toStr(const ACG::Matrix3x3d &v)
{
return QString("(%1, %2, %3); (%4, %5, %6); (%7, %8, %9) ")
.arg(v(0, 0)).arg(v(0, 1)).arg(v(0, 2))
.arg(v(1, 0)).arg(v(1, 1)).arg(v(1, 2))
.arg(v(2, 0)).arg(v(2, 1)).arg(v(2, 2));
}
#ifdef ENABLE_SKELETON_SUPPORT
QString PropertyVisualizer::toStr(BaseSkin::SkinWeights sw)
{
......
......@@ -161,6 +161,7 @@ public:
static QString toStr(OpenMesh::Vec3d v);
static QString toStr(OpenMesh::Vec2d v);
static QString toStr(OpenMesh::Vec2f v);
static QString toStr(const ACG::Matrix3x3d &v);
#ifdef ENABLE_SKELETON_SUPPORT
static QString toStr(BaseSkin::SkinWeights sw);
#endif
......
......@@ -48,7 +48,7 @@ class BooleanWidget : public QWidget, public Ui::BooleanWidget
Q_OBJECT
public:
explicit BooleanWidget(QWidget * parent = 0);
explicit BooleanWidget(QWidget * parent = nullptr);
signals:
void widgetShown();
......
......@@ -51,7 +51,7 @@ class DoubleWidget : public QWidget, public Ui::DoubleWidget
Q_OBJECT
public:
explicit DoubleWidget(QWidget * parent = 0);
explicit DoubleWidget(QWidget * parent = nullptr);
/**
* @brief Builds a color coder according to UI settings
......
......@@ -53,7 +53,7 @@ class IntegerWidget : public QWidget, public Ui::IntegerWidget
Q_OBJECT
public:
explicit IntegerWidget(QWidget * parent = 0);
explicit IntegerWidget(QWidget * parent = nullptr);
/**
* @brief Builds a color coder according to UI settings
......
......@@ -47,7 +47,7 @@ class LoadSaveWidget : public QWidget, public Ui::LoadSaveWidget
Q_OBJECT
public:
explicit LoadSaveWidget(QWidget * parent = 0);
explicit LoadSaveWidget(QWidget * parent = nullptr);
signals:
void widgetShown();
......
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (c) 2001-2015, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
\*===========================================================================*/
#include "Matrix3x3Widget.hh"
#include "ACG/Utils/ColorCoder.hh"
#include "ACG/Utils/LinearTwoColorCoder.hh"
#include <ACG/Utils/ColorConversion.hh>
Matrix3x3Widget::Matrix3x3Widget(QWidget * parent)
: QWidget(parent)
{
setupUi(this);
}
void Matrix3x3Widget::showEvent ( QShowEvent* /*event*/ ) {
emit widgetShown();
}
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (c) 2001-2015, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
\*===========================================================================*/
#pragma once
#include "ui_Matrix3x3Widget.h"
#include "ACG/Utils/IColorCoder.hh"
#include <ACG/Utils/SmartPointer.hh>
class Matrix3x3Widget : public QWidget, public Ui::Mat3x3Widget
{
Q_OBJECT
public:
explicit Matrix3x3Widget(QWidget * parent = nullptr);
signals:
void widgetShown();
protected:
void showEvent ( QShowEvent* /*event*/ );
};
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Mat3x3Widget</class>
<widget class="QWidget" name="Mat3x3Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>352</width>
<height>270</height>
</rect>
</property>
<property name="windowTitle">
<string>Property Visualization</string>
</property>
<property name="toolTip">
<string>Vectors are normalized and then transformed to the [0,1] range</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="paramVector">
<property name="title">
<string>3x3 Matrix Parameters</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="vector_edgeColors_widget" native="true">
<property name="enabled">
<bool>false</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_15">
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QDoubleSpinBox" name="vectors_edges_alpha">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="prefix">
<string>α = </string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.400000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string></string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="vectors_edges_beta">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="prefix">
<string>β = </string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.600000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Visualize columns as:</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QRadioButton" name="as_crosses">
<property name="text">
<string>Crosses</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">vector_buttonGroup</string>
</attribute>
</widget>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="as_boxes">
<property name="text">
<string>Boxes</string>
</property>
<attribute name="buttonGroup">
<string notr="true">vector_buttonGroup</string>
</attribute>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="vector_strokes_widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_11">
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="normalize">
<property name="text">
<string>Normalize</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="lineWidth">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>50.000000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lineWidthLabel">
<property name="text">
<string>Line width</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="scale">
<property name="text">
<string>Scale with factor</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="scaleBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="decimals">
<number>7</number>
</property>
<property name="maximum">
<double>1000.000000000000000</double>
</property>
<property name="value">
<double>0.200000000000000</double>
</property>