pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/gui/model/LinkConfig.cc

152 lines
4.7 KiB
C++

/*
* Copyright (C) 2015 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include "gazebo/msgs/msgs.hh"
#include "gazebo/gui/ConfigWidget.hh"
#include "gazebo/gui/model/LinkConfig.hh"
using namespace gazebo;
using namespace gui;
/////////////////////////////////////////////////
LinkConfig::LinkConfig()
{
this->setObjectName("LinkConfig");
// Message
msgs::Link linkMsg;
// ConfigWidget
this->configWidget = new ConfigWidget;
configWidget->Load(&linkMsg);
// set default values
// TODO: auto-fill them with SDF defaults
this->configWidget->SetDoubleWidgetValue("inertial::mass", 1.0);
this->configWidget->SetDoubleWidgetValue("inertial::ixx", 1.0);
this->configWidget->SetDoubleWidgetValue("inertial::iyy", 1.0);
this->configWidget->SetDoubleWidgetValue("inertial::izz", 1.0);
this->configWidget->SetBoolWidgetValue("gravity", true);
this->configWidget->SetBoolWidgetValue("self_collide", false);
this->configWidget->SetBoolWidgetValue("kinematic", false);
this->configWidget->SetWidgetVisible("id", false);
this->configWidget->SetWidgetVisible("name", false);
this->configWidget->SetWidgetVisible("canonical", false);
this->configWidget->SetWidgetVisible("enabled", false);
this->configWidget->SetWidgetReadOnly("id", true);
this->configWidget->SetWidgetReadOnly("name", true);
this->configWidget->SetWidgetReadOnly("canonical", true);
this->configWidget->SetWidgetReadOnly("enabled", true);
// Scroll area
QScrollArea *scrollArea = new QScrollArea;
scrollArea->setWidget(this->configWidget);
scrollArea->setWidgetResizable(true);
// Layout
QVBoxLayout *generalLayout = new QVBoxLayout;
generalLayout->addWidget(scrollArea);
this->setLayout(generalLayout);
// Connections
connect(this->configWidget, SIGNAL(PoseValueChanged(const QString &,
const ignition::math::Pose3d &)), this,
SLOT(OnPoseChanged(const QString &, const ignition::math::Pose3d &)));
}
/////////////////////////////////////////////////
LinkConfig::~LinkConfig()
{
}
/////////////////////////////////////////////////
void LinkConfig::Init()
{
// Keep original data in case user cancels
this->originalDataMsg.CopyFrom(*this->GetData());
}
/////////////////////////////////////////////////
void LinkConfig::Update(ConstLinkPtr _linkMsg)
{
this->configWidget->UpdateFromMsg(_linkMsg.get());
}
/////////////////////////////////////////////////
void LinkConfig::SetPose(const ignition::math::Pose3d &_pose)
{
this->configWidget->SetPoseWidgetValue("pose", _pose);
}
/////////////////////////////////////////////////
void LinkConfig::SetMass(const double _mass)
{
this->configWidget->SetDoubleWidgetValue("inertial::mass", _mass);
}
/////////////////////////////////////////////////
void LinkConfig::SetInertiaMatrix(const double _ixx, const double _iyy,
const double _izz, const double _ixy, const double _ixz, const double _iyz)
{
this->configWidget->SetDoubleWidgetValue("inertial::ixx", _ixx);
this->configWidget->SetDoubleWidgetValue("inertial::iyy", _iyy);
this->configWidget->SetDoubleWidgetValue("inertial::izz", _izz);
this->configWidget->SetDoubleWidgetValue("inertial::ixy", _ixy);
this->configWidget->SetDoubleWidgetValue("inertial::ixz", _ixz);
this->configWidget->SetDoubleWidgetValue("inertial::iyz", _iyz);
}
/////////////////////////////////////////////////
void LinkConfig::SetInertialPose(const ignition::math::Pose3d &_pose)
{
this->configWidget->SetPoseWidgetValue("inertial::pose", _pose);
}
/////////////////////////////////////////////////
msgs::Link *LinkConfig::GetData() const
{
return dynamic_cast<msgs::Link *>(this->configWidget->Msg());
}
/////////////////////////////////////////////////
void LinkConfig::OnPoseChanged(const QString &/*_name*/,
const ignition::math::Pose3d &/*_pose*/)
{
emit Applied();
}
/////////////////////////////////////////////////
void LinkConfig::RestoreOriginalData()
{
msgs::LinkPtr linkPtr;
linkPtr.reset(new msgs::Link);
linkPtr->CopyFrom(this->originalDataMsg);
// Update default widgets
this->configWidget->blockSignals(true);
this->Update(linkPtr);
this->configWidget->blockSignals(false);
}
/////////////////////////////////////////////////
const ConfigWidget *LinkConfig::LinkConfigWidget() const
{
return this->configWidget;
}