CameraFreenect2: added pipelineName parameter

This commit is contained in:
matlabbe
2017-10-11 12:50:57 -04:00
parent 8b3cff9f4c
commit f6315e48d0
6 changed files with 231 additions and 97 deletions

View File

@@ -263,7 +263,8 @@ public:
float maxDepth = 12.0f, float maxDepth = 12.0f,
bool bilateralFiltering = true, bool bilateralFiltering = true,
bool edgeAwareFiltering = true, bool edgeAwareFiltering = true,
bool noiseFiltering = true); bool noiseFiltering = true,
const std::string & pipelineName = "");
virtual ~CameraFreenect2(); virtual ~CameraFreenect2();
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = ""); virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
@@ -287,6 +288,7 @@ private:
bool bilateralFiltering_; bool bilateralFiltering_;
bool edgeAwareFiltering_; bool edgeAwareFiltering_;
bool noiseFiltering_; bool noiseFiltering_;
std::string pipelineName_;
#endif #endif
}; };

View File

@@ -1343,7 +1343,8 @@ CameraFreenect2::CameraFreenect2(
float maxDepth, float maxDepth,
bool bilateralFiltering, bool bilateralFiltering,
bool edgeAwareFiltering, bool edgeAwareFiltering,
bool noiseFiltering) : bool noiseFiltering,
const std::string & pipelineName) :
Camera(imageRate, localTransform) Camera(imageRate, localTransform)
#ifdef RTABMAP_FREENECT2 #ifdef RTABMAP_FREENECT2
, ,
@@ -1357,7 +1358,8 @@ CameraFreenect2::CameraFreenect2(
maxKinect2Depth_(maxDepth), maxKinect2Depth_(maxDepth),
bilateralFiltering_(bilateralFiltering), bilateralFiltering_(bilateralFiltering),
edgeAwareFiltering_(edgeAwareFiltering), edgeAwareFiltering_(edgeAwareFiltering),
noiseFiltering_(noiseFiltering) noiseFiltering_(noiseFiltering),
pipelineName_(pipelineName)
#endif #endif
{ {
#ifdef RTABMAP_FREENECT2 #ifdef RTABMAP_FREENECT2
@@ -1410,6 +1412,72 @@ CameraFreenect2::~CameraFreenect2()
#endif #endif
} }
libfreenect2::PacketPipeline *createPacketPipelineByName(const std::string & name)
{
std::string availablePipelines;
#if defined(LIBFREENECT2_WITH_OPENGL_SUPPORT)
availablePipelines += "gl ";
if (name == "gl")
{
UINFO("Using 'gl' pipeline.");
return new libfreenect2::OpenGLPacketPipeline();
}
#endif
#if defined(LIBFREENECT2_WITH_CUDA_SUPPORT)
availablePipelines += "cuda cudakde ";
if (name == "cuda")
{
UINFO("Using 'cuda' pipeline.");
return new libfreenect2::CudaPacketPipeline();
}
if (name == "cudakde")
{
UINFO("Using 'cudakde' pipeline.");
return new libfreenect2::CudaKdePacketPipeline();
}
#endif
#if defined(LIBFREENECT2_WITH_OPENCL_SUPPORT)
availablePipelines += "cl clkde ";
if (name == "cl")
{
UINFO("Using 'cl' pipeline.");
return new libfreenect2::OpenCLPacketPipeline();
}
if (name == "clkde")
{
UINFO("Using 'clkde' pipeline.");
return new libfreenect2::OpenCLKdePacketPipeline();
}
#endif
availablePipelines += "cpu";
if (name == "cpu")
{
UINFO("Using 'cpu' pipeline.");
return new libfreenect2::CpuPacketPipeline();
}
if (!name.empty())
{
UERROR("'%s' pipeline is not available. Available pipelines are: \"%s\". Default one is used instead (first one in the list).",
name.c_str(), availablePipelines.c_str());
}
// create default pipeline
#if defined(LIBFREENECT2_WITH_OPENGL_SUPPORT)
UINFO("Using 'gl' pipeline.");
return new libfreenect2::OpenGLPacketPipeline();
#elif defined(LIBFREENECT2_WITH_CUDA_SUPPORT)
UINFO("Using 'cuda' pipeline.");
return new libfreenect2::CudaPacketPipeline();
#elif defined(LIBFREENECT2_WITH_OPENCL_SUPPORT)
UINFO("Using 'cl' pipeline.");
return new libfreenect2::OpenCLPacketPipeline();
#else
UINFO("Using 'cpu' pipeline.");
return new libfreenect2::CpuPacketPipeline();
#endif
}
bool CameraFreenect2::init(const std::string & calibrationFolder, const std::string & cameraName) bool CameraFreenect2::init(const std::string & calibrationFolder, const std::string & cameraName)
{ {
#ifdef RTABMAP_FREENECT2 #ifdef RTABMAP_FREENECT2
@@ -1426,20 +1494,7 @@ bool CameraFreenect2::init(const std::string & calibrationFolder, const std::str
reg_ = 0; reg_ = 0;
} }
libfreenect2::PacketPipeline * pipeline; libfreenect2::PacketPipeline * pipeline = createPacketPipelineByName(pipelineName_);
#ifdef LIBFREENECT2_WITH_CUDA_SUPPORT
pipeline = new libfreenect2::CudaPacketPipeline();
#else
#ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT
pipeline = new libfreenect2::OpenGLPacketPipeline();
#else
#ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT
pipeline = new libfreenect2::OpenCLPacketPipeline();
#else
pipeline = new libfreenect2::CpuPacketPipeline();
#endif
#endif
#endif
if(deviceId_ <= 0) if(deviceId_ <= 0)
{ {

View File

@@ -2820,15 +2820,13 @@ void Rtabmap::setWorkingDirectory(std::string path)
ULOGGER_DEBUG("Comparing new working directory path \"%s\" with \"%s\"", path.c_str(), _wDir.c_str()); ULOGGER_DEBUG("Comparing new working directory path \"%s\" with \"%s\"", path.c_str(), _wDir.c_str());
if(path.compare(_wDir) != 0) if(path.compare(_wDir) != 0)
{ {
if (_foutFloat || _foutInt)
{
UWARN("Working directory has been changed from \"%s\" with \"%s\", new log files will be created.",
path.c_str(), _wDir.c_str());
}
_wDir = path; _wDir = path;
if(_memory) setupLogFiles();
{
this->resetMemory();
}
else
{
setupLogFiles();
}
} }
} }
else if(path.empty()) else if(path.empty())

View File

@@ -3821,15 +3821,6 @@ void MainWindow::applyPrefSettings(const rtabmap::ParametersMap & parameters, bo
if(_state != kIdle && parametersModified.size()) if(_state != kIdle && parametersModified.size())
{ {
if(parametersModified.erase(Parameters::kRtabmapWorkingDirectory()) &&
_state != kMonitoring &&
_state != kMonitoringPaused)
{
QMessageBox::information(this, tr("Working memory changed"),
tr("The working directory can't be changed while the "
"detector is running (state=%1). This will be "
"applied when the detector will stop.").arg(_state));
}
if(postParamEvent) if(postParamEvent)
{ {
this->post(new ParamEvent(parametersModified)); this->post(new ParamEvent(parametersModified));

View File

@@ -520,6 +520,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
connect(_ui->checkBox_freenect2BilateralFiltering, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel())); connect(_ui->checkBox_freenect2BilateralFiltering, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->checkBox_freenect2EdgeAwareFiltering, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel())); connect(_ui->checkBox_freenect2EdgeAwareFiltering, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->checkBox_freenect2NoiseFiltering, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel())); connect(_ui->checkBox_freenect2NoiseFiltering, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->lineEdit_freenect2Pipeline, SIGNAL(textChanged(const QString &)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->comboBox_realsensePresetRGB, SIGNAL(currentIndexChanged(int)), this, SLOT(makeObsoleteSourcePanel())); connect(_ui->comboBox_realsensePresetRGB, SIGNAL(currentIndexChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->comboBox_realsensePresetDepth, SIGNAL(currentIndexChanged(int)), this, SLOT(makeObsoleteSourcePanel())); connect(_ui->comboBox_realsensePresetDepth, SIGNAL(currentIndexChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->checkbox_realsenseOdom, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel())); connect(_ui->checkbox_realsenseOdom, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
@@ -1516,6 +1517,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
_ui->checkBox_freenect2BilateralFiltering->setChecked(true); _ui->checkBox_freenect2BilateralFiltering->setChecked(true);
_ui->checkBox_freenect2EdgeAwareFiltering->setChecked(true); _ui->checkBox_freenect2EdgeAwareFiltering->setChecked(true);
_ui->checkBox_freenect2NoiseFiltering->setChecked(true); _ui->checkBox_freenect2NoiseFiltering->setChecked(true);
_ui->lineEdit_freenect2Pipeline->setText("");
_ui->comboBox_realsensePresetRGB->setCurrentIndex(0); _ui->comboBox_realsensePresetRGB->setCurrentIndex(0);
_ui->comboBox_realsensePresetDepth->setCurrentIndex(2); _ui->comboBox_realsensePresetDepth->setCurrentIndex(2);
_ui->checkbox_realsenseOdom->setChecked(false); _ui->checkbox_realsenseOdom->setChecked(false);
@@ -1888,6 +1890,7 @@ void PreferencesDialog::readCameraSettings(const QString & filePath)
_ui->checkBox_freenect2BilateralFiltering->setChecked(settings.value("bilateralFiltering", _ui->checkBox_freenect2BilateralFiltering->isChecked()).toBool()); _ui->checkBox_freenect2BilateralFiltering->setChecked(settings.value("bilateralFiltering", _ui->checkBox_freenect2BilateralFiltering->isChecked()).toBool());
_ui->checkBox_freenect2EdgeAwareFiltering->setChecked(settings.value("edgeAwareFiltering", _ui->checkBox_freenect2EdgeAwareFiltering->isChecked()).toBool()); _ui->checkBox_freenect2EdgeAwareFiltering->setChecked(settings.value("edgeAwareFiltering", _ui->checkBox_freenect2EdgeAwareFiltering->isChecked()).toBool());
_ui->checkBox_freenect2NoiseFiltering->setChecked(settings.value("noiseFiltering", _ui->checkBox_freenect2NoiseFiltering->isChecked()).toBool()); _ui->checkBox_freenect2NoiseFiltering->setChecked(settings.value("noiseFiltering", _ui->checkBox_freenect2NoiseFiltering->isChecked()).toBool());
_ui->lineEdit_freenect2Pipeline->setText(settings.value("pipeline", _ui->lineEdit_freenect2Pipeline->text()).toString());
settings.endGroup(); // Freenect2 settings.endGroup(); // Freenect2
settings.beginGroup("RealSense"); settings.beginGroup("RealSense");
@@ -2279,6 +2282,7 @@ void PreferencesDialog::writeCameraSettings(const QString & filePath) const
settings.setValue("bilateralFiltering", _ui->checkBox_freenect2BilateralFiltering->isChecked()); settings.setValue("bilateralFiltering", _ui->checkBox_freenect2BilateralFiltering->isChecked());
settings.setValue("edgeAwareFiltering", _ui->checkBox_freenect2EdgeAwareFiltering->isChecked()); settings.setValue("edgeAwareFiltering", _ui->checkBox_freenect2EdgeAwareFiltering->isChecked());
settings.setValue("noiseFiltering", _ui->checkBox_freenect2NoiseFiltering->isChecked()); settings.setValue("noiseFiltering", _ui->checkBox_freenect2NoiseFiltering->isChecked());
settings.setValue("pipeline", _ui->lineEdit_freenect2Pipeline->text());
settings.endGroup(); // Freenect2 settings.endGroup(); // Freenect2
settings.beginGroup("RealSense"); settings.beginGroup("RealSense");
@@ -4740,7 +4744,8 @@ Camera * PreferencesDialog::createCamera(bool useRawImages, bool useColor)
_ui->doubleSpinBox_freenect2MaxDepth->value(), _ui->doubleSpinBox_freenect2MaxDepth->value(),
_ui->checkBox_freenect2BilateralFiltering->isChecked(), _ui->checkBox_freenect2BilateralFiltering->isChecked(),
_ui->checkBox_freenect2EdgeAwareFiltering->isChecked(), _ui->checkBox_freenect2EdgeAwareFiltering->isChecked(),
_ui->checkBox_freenect2NoiseFiltering->isChecked()); _ui->checkBox_freenect2NoiseFiltering->isChecked(),
_ui->lineEdit_freenect2Pipeline->text().toStdString());
} }
else if (driver == kSrcRealSense) else if (driver == kSrcRealSense)
{ {

View File

@@ -63,16 +63,25 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>-317</y>
<width>673</width> <width>677</width>
<height>2749</height> <height>2682</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_16"> <layout class="QVBoxLayout" name="verticalLayout_16">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>
@@ -86,7 +95,7 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>12</number> <number>5</number>
</property> </property>
<widget class="QWidget" name="page_22"> <widget class="QWidget" name="page_22">
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1"> <layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
@@ -2741,7 +2750,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
<item> <item>
<widget class="QStackedWidget" name="stackedWidget_src"> <widget class="QStackedWidget" name="stackedWidget_src">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="page_41"> <widget class="QWidget" name="page_41">
<layout class="QVBoxLayout" name="verticalLayout_64"> <layout class="QVBoxLayout" name="verticalLayout_64">
@@ -2851,7 +2860,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
<item> <item>
<widget class="QStackedWidget" name="stackedWidget_rgbd"> <widget class="QStackedWidget" name="stackedWidget_rgbd">
<property name="currentIndex"> <property name="currentIndex">
<number>7</number> <number>5</number>
</property> </property>
<widget class="QWidget" name="page_32"> <widget class="QWidget" name="page_32">
<layout class="QVBoxLayout" name="verticalLayout_63"> <layout class="QVBoxLayout" name="verticalLayout_63">
@@ -3150,10 +3159,10 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
<string>Freenect2</string> <string>Freenect2</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_56" columnstretch="0,1"> <layout class="QGridLayout" name="gridLayout_56" columnstretch="0,1">
<item row="0" column="1"> <item row="4" column="1">
<widget class="QLabel" name="label_230"> <widget class="QLabel" name="label_269">
<property name="text"> <property name="text">
<string>Format.</string> <string>Depth edge aware filtering.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -3163,18 +3172,15 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="2" column="0">
<spacer name="verticalSpacer_32"> <widget class="QDoubleSpinBox" name="doubleSpinBox_freenect2MaxDepth">
<property name="orientation"> <property name="maximum">
<enum>Qt::Vertical</enum> <double>65.000000000000000</double>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="value">
<size> <double>12.000000000000000</double>
<width>20</width>
<height>0</height>
</size>
</property> </property>
</spacer> </widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QComboBox" name="comboBox_freenect2Format"> <widget class="QComboBox" name="comboBox_freenect2Format">
@@ -3208,6 +3214,16 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</item> </item>
</widget> </widget>
</item> </item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBox_freenect2BilateralFiltering">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_268"> <widget class="QLabel" name="label_268">
<property name="text"> <property name="text">
@@ -3221,6 +3237,16 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkBox_freenect2EdgeAwareFiltering">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_266"> <widget class="QLabel" name="label_266">
<property name="text"> <property name="text">
@@ -3234,10 +3260,10 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_269"> <widget class="QLabel" name="label_230">
<property name="text"> <property name="text">
<string>Depth edge aware filtering.</string> <string>Format.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -3247,33 +3273,42 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="7" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_freenect2MaxDepth"> <spacer name="verticalSpacer_32">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_freenect2MinDepth">
<property name="maximum"> <property name="maximum">
<double>65.000000000000000</double> <double>64.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property> </property>
<property name="value"> <property name="value">
<double>12.000000000000000</double> <double>0.300000000000000</double>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="5" column="1">
<widget class="QCheckBox" name="checkBox_freenect2BilateralFiltering"> <widget class="QLabel" name="label_270">
<property name="text"> <property name="text">
<string/> <string>Depth noise filtering.</string>
</property> </property>
<property name="checked"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> <property name="textInteractionFlags">
</item> <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
<item row="4" column="0">
<widget class="QCheckBox" name="checkBox_freenect2EdgeAwareFiltering">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
@@ -3290,19 +3325,6 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_freenect2MinDepth">
<property name="maximum">
<double>64.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.300000000000000</double>
</property>
</widget>
</item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QCheckBox" name="checkBox_freenect2NoiseFiltering"> <widget class="QCheckBox" name="checkBox_freenect2NoiseFiltering">
<property name="text"> <property name="text">
@@ -3313,10 +3335,10 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="6" column="1">
<widget class="QLabel" name="label_270"> <widget class="QLabel" name="label_434">
<property name="text"> <property name="text">
<string>Depth noise filtering.</string> <string>Pipeline, any one of &quot;gl cl clkde cuda cudakde cpu&quot;. If empty, default one is used. Depending on how libfreenect2 was built, the selected pipeline may not be available.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -3326,6 +3348,13 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0">
<widget class="QLineEdit" name="lineEdit_freenect2Pipeline">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@@ -4561,7 +4590,16 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
<string>Directory of images (optional settings)</string> <string>Directory of images (optional settings)</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_93"> <layout class="QVBoxLayout" name="verticalLayout_93">
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>
@@ -12710,7 +12748,16 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</property> </property>
<widget class="QWidget" name="page_54"> <widget class="QWidget" name="page_54">
<layout class="QVBoxLayout" name="verticalLayout_85"> <layout class="QVBoxLayout" name="verticalLayout_85">
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>
@@ -12850,7 +12897,16 @@ Lower the ratio -&gt; higher the precision. 0 means disabled, matching the neare
</widget> </widget>
<widget class="QWidget" name="page_55"> <widget class="QWidget" name="page_55">
<layout class="QVBoxLayout" name="verticalLayout_86"> <layout class="QVBoxLayout" name="verticalLayout_86">
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>
@@ -13008,7 +13064,16 @@ Lower the ratio -&gt; higher the precision. 0 means disabled, matching the neare
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>
@@ -13088,7 +13153,16 @@ Lower the ratio -&gt; higher the precision. 0 means disabled, matching the neare
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>
@@ -13200,7 +13274,16 @@ Lower the ratio -&gt; higher the precision. 0 means disabled, matching the neare
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="margin"> <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> <number>0</number>
</property> </property>
<item> <item>