pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/gui/building/BuildingMaker.hh

313 lines
12 KiB
C++

/*
* Copyright (C) 2012 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.
*
*/
#ifndef _GAZEBO_GUI_BUILDING_BUILDINGMAKER_HH_
#define _GAZEBO_GUI_BUILDING_BUILDINGMAKER_HH_
#include <string>
#include <vector>
#include <memory>
#include <ignition/math/Pose3.hh>
#include <ignition/math/Vector3.hh>
#include "gazebo/common/KeyEvent.hh"
#include "gazebo/common/MouseEvent.hh"
#include "gazebo/gui/qt.h"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace gui
{
class BuildingModelManip;
class EditorItem;
// Forward declare provate data.
class BuildingMakerPrivate;
/// \addtogroup gazebo_gui
/// \{
/// \brief Create and manage 3D visuals of a building.
class GZ_GUI_VISIBLE BuildingMaker
{
/// \brief Constructor
public: BuildingMaker();
/// \brief Destructor
public: ~BuildingMaker();
/// \brief QT callback when entering or leaving building edit mode
/// \param[in] _checked True if the menu item is checked
public: void OnEdit(bool _checked);
/// \brief Set the name of this building model.
/// \param[in] _modelName Name of the model to set to.
public: void SetModelName(const std::string &_modelName);
/// \brief Finish the model and create the entity on the gzserver.
public: void FinishModel();
/// \brief Add a building part to the model.
/// \param[in] _type Type of the building part.
/// \param[in] _size Size of the building part.
/// \param[in] _pos Position of the building part in pixel coordinates.
/// \param[in] _angle Yaw rotation of the building part in degrees.
/// \return Name of the 3D building part that has been added.
public: std::string AddPart(const std::string &_type,
const QVector3D &_size, const QVector3D &_pos, double _angle);
/// \brief Add a wall to the model.
/// \param[in] _size Size of the wall.
/// \param[in] _pos Position of the wall in pixel coordinates.
/// \param[in] _angle Yaw rotation of the wall in degrees.
/// \return Name of the 3D wall that has been added.
public: std::string AddWall(const QVector3D &_size, const QVector3D &_pos,
double _angle);
/// \brief Add a window to the model.
/// \param[in] _size Size of the window.
/// \param[in] _pos Position of the window in pixel coordinates.
/// \param[in] _angle Yaw rotation of the window in degrees.
/// \return Name of the 3D window that has been added.
public: std::string AddWindow(const QVector3D &_size,
const QVector3D &_pos, double _angle);
/// \brief Add a door to the model.
/// \param[in] _size Size of the door.
/// \param[in] _pos Position of the door in pixel coordinates.
/// \param[in] _angle Yaw rotation of the door in degrees.
/// \return Name of the 3D door that has been added.
public: std::string AddDoor(const QVector3D &_size, const QVector3D &_pos,
double _angle);
/// \brief Add a staircase to the model.
/// \param[in] _size Size of the staircase.
/// \param[in] _pos Position of the staircase in pixel coordinates.
/// \param[in] _angle Yaw rotation of the staircase in degrees.
/// \param[in] _steps Number of steps in the staircase.
/// \return Name of the 3D staircase that has been added.
public: std::string AddStairs(const QVector3D &_size,
const QVector3D &_pos, double _angle, int _steps);
/// \brief Add a floor to the model.
/// \param[in] _size Size of the floor.
/// \param[in] _pos Position of the floor in pixel coordinates.
/// \param[in] _angle Yaw rotation of the floor in radians.
/// \return Name of the 3D floor that has been added.
public: std::string AddFloor(const QVector3D &_size,
const QVector3D &_pos, double _angle);
/// \brief Remove a building part from the model.
/// \param[in] _partName Name of the building part to remove
public: void RemovePart(const std::string &_partName);
/// \brief Remove a wall from the model.
/// \param[in] _partName Name of the wall to remove
public: void RemoveWall(const std::string &_wallName);
/// \brief Connect the 2D editor item Qt signals to the 3D building part.
/// \param[in] _partName Name of the 3D building part
/// \param[in] _item 2D editor item.
public: void ConnectItem(const std::string &_partName,
const EditorItem *_item);
/// \brief Attach a building part to another, this is currently used for
/// making holes in walls and floors.
/// This function doesn't check if the parts exist.
/// \param[in] _child Name of the child building part
/// \param[in] _parent Name of the parent building part.
public: void AttachManip(const std::string &_child,
const std::string &_parent);
/// \brief Detach a child building part from its parent.
/// \param[in] _child Name of the child building part.
public: void DetachFromParent(const std::string &_child);
/// \brief Detach all child building parts from the given manip.
/// \param[in] _parent Name of the building part.
public: void DetachAllChildren(const std::string &_parent);
/// \brief Whether the given manip is attached to another manip or not.
/// \param[in] _child Name of manip.
/// \return True if manip has a parent.
public: bool IsAttached(const std::string &_child) const;
/// \brief Detach all child building parts from the given manip.
/// \param[in] _manip Name of the building part.
public: BuildingModelManip *ManipByName(const std::string &_name);
/// \brief Helper method to convert size from editor coordinate system
/// to Gazebo coordinate system.
/// \param[in] _width Width in pixels.
/// \param[in] _depth Depth in pixels.
/// \param[in] _height Height in pixels.
/// \return Size in metric units.
public: static ignition::math::Vector3d ConvertSize(
const double _width, const double _depth, const double _height);
/// \brief Helper method to convert pose from editor coordinate system
/// to Gazebo coordinate system.
/// \param[in] _x X position in pixels.
/// \param[in] _y Y position in pixels.
/// \param[in] _y Z position in pixels.
/// \param[in] _roll Roll rotation in degrees.
/// \param[in] _pitch Pitch rotation in degrees.
/// \param[in] _yaw Yaw rotation in degrees.
/// \return Pose with position in metric units and rotation in radians.
public: static ignition::math::Pose3d ConvertPose(const double _x,
const double _y, const double _z, const double _roll,
const double _pitch, const double _yaw);
/// \param[in] _value Convert a value from pixels to metric units
/// \param[in] _value Value in pixels.
/// \return Value in metric units.
public: static double Convert(double _value);
/// \brief Convert an angle from editor unit to Gazebo unit
/// \param[in] _angle Angle in degrees.
/// \return Angle in radians.
public: static double ConvertAngle(double _angle);
/// \brief Reset the building maker and the SDF.
public: void Reset();
/// \brief Generate the SDF from building part visuals.
public: void GenerateSDF();
/// \brief Set save state upon a change to the building.
public: void BuildingChanged();
/// \brief Get the last generated SDF as string.
/// \return String representation of the building's SDF.
public: std::string ModelSDF() const;
/// \brief Publish a factory message to spawn the new building.
private: void CreateTheEntity();
/// \brief Internal init function.
private: bool Init();
/// \brief Create an empty model.
/// \return Name of the model created.
private: std::string CreateModel();
/// \brief Generate SDF with CSG support (to be supported).
private: void GenerateSDFWithCSG();
/// \brief Get a template SDF string of a simple model.
/// \return A string containing a simple model.
private: std::string TemplateSDFString() const;
/// \brief Internal helper function for QPointF comparison used by the
/// surface subsivision algorithm.
private: static bool PointCompareY(const QPointF &_a, const QPointF &_b);
/// \brief Internal helper function for QRectF comparison used by the
/// surface subsivision algorithm.
private: static bool RectCompareX(const QRectF &_a, const QRectF &_b);
/// \brief Internal helper function for QRectF comparison used by the
/// surface subsivision algorithm.
private: static bool RectCompareY(const QRectF &_a, const QRectF &_b);
/// \brief Subdivide a rectangular surface with holes into multiple
/// smaller rectangles.
/// \param[in] _surface Parent rectangular surface.
/// \param[in] _holes A list of rectangular holes on the surface.
/// \param[in] _subdivisions The resulting smaller rectangles representing
/// the surface with holes.
private: void SubdivideRectSurface(const QRectF &_surface,
const std::vector<QRectF> &_holes, std::vector<QRectF> &_subdivisions);
/// \brief Helper function to manage writing files to disk.
private: void SaveModelFiles();
/// \brief Callback for saving the model.
/// \return True if the user chose to save, false if the user cancelled.
private: bool OnSave();
/// \brief Callback for selecting a folder and saving the model.
/// \return True if the user chose to save, false if the user cancelled.
private: bool OnSaveAs();
/// \brief Callback for when the name is changed through the Palette.
/// \param[in] _modelName The newly entered building name.
private: void OnNameChanged(const std::string &_modelName);
/// \brief Callback for newing the model.
private: void OnNew();
/// \brief Callback received when exiting the editor mode.
private: void OnExit();
/// \brief Callback received when a level on a building model is to
/// be changed.
/// \param[in] _level The level that is currently being edited.
private: void OnChangeLevel(int _level);
/// \brief Cancel material modes.
private: void StopMaterialModes();
/// \brief Reset currently hovered visual to the properties it had before
/// being hovered.
private: void ResetHoverVis();
/// \brief Callback received when a color has been selected on the
/// palette.
/// \param[in] _color Selected color.
private: void OnColorSelected(QColor _color);
/// \brief Callback received when a texture has been selected on the
/// palette.
/// \param[in] _texture Selected texture.
private: void OnTextureSelected(QString _texture);
/// \brief Mouse event filter callback when mouse is moved.
/// \param[in] _event The mouse event.
/// \return True if the event was handled
private: bool On3dMouseMove(const common::MouseEvent &_event);
/// \brief Mouse event filter callback when mouse is pressed.
/// \param[in] _event The mouse event.
/// \return True if the event was handled
private: bool On3dMousePress(const common::MouseEvent &_event);
/// \brief Mouse event filter callback when mouse is released.
/// \param[in] _event The mouse event.
/// \return True if the event was handled
private: bool On3dMouseRelease(const common::MouseEvent &_event);
/// \brief Key event filter callback when key is pressed.
/// \param[in] _event The key event.
/// \return True if the event was handled
private: bool On3dKeyPress(const common::KeyEvent &_event);
/// \brief Conversion scale used by the Convert helper functions.
public: static const double conversionScale;
/// \internal
/// \brief Pointer to private data.
private: std::unique_ptr<BuildingMakerPrivate> dataPtr;
};
/// \}
}
}
#endif