kicad/thirdparty/3dxware_sdk/inc/SpaceMouse/CNavlibImpl.hpp

310 lines
11 KiB
C++
Raw Normal View History

#ifndef CNavlibImpl_HPP_INCLUDED
#define CNavlibImpl_HPP_INCLUDED
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (c) 2018-2021 3Dconnexion.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file CNavlibImpl.hpp
* @brief INavlib implementation.
*/
#include <SpaceMouse/CNavlibInterface.hpp>
#include <SpaceMouse/IAccessors.hpp>
#include <SpaceMouse/INavlib.hpp>
// stdlib
#include <map>
#include <memory>
#include <string>
#include <vector>
// navlib
#include <navlib/navlib.h>
#include <navlib/navlib_error.h>
namespace TDx {
namespace SpaceMouse {
namespace Navigation3D {
/// <summary>
/// Implementation for creating a shared pointer.
/// </summary>
class CNavlibImpl : public INavlib,
#if defined(_MSC_VER) && _MSC_VER < 1800
public IAccessors,
#else
private IAccessors,
#endif
public std::enable_shared_from_this<CNavlibImpl> {
typedef CNavlibImpl this_type;
friend std::shared_ptr<IAccessors>
std::static_pointer_cast<IAccessors, CNavlibImpl>(const std::shared_ptr<CNavlibImpl> &) NOEXCEPT;
/// <summary>
/// Make the constructors private to force creation of a shared pointer.
/// </summary>
CNavlibImpl(){};
CNavlibImpl(IAccessors *iclient) : m_iclient(iclient) {
}
public:
/// <summary>
/// Creates a new instance of the CNavlibImpl class.
/// </summary>
/// <param name="iclient">pointer to the instance implementing the IAccessors interface.</param>
/// <param name="multiThreaded">true to use multi-threading, false for single-threaded.</param>
/// <param name="rowMajor">true for row-major ordered matrices, false for column-major.</param>
/// <returns>
/// A <see cref="std::shared_ptr{CNavlibImpl}"/> to the new CNavlibImpl instance.
/// </returns>
static std::shared_ptr<CNavlibImpl>
CreateInstance(IAccessors *iclient, bool multiThreaded = false, bool rowMajor = false) {
return CreateInstance(iclient, multiThreaded,
rowMajor ? navlib::row_major_order : navlib::none);
}
/// <summary>
/// Creates a new instance of the CNavlibImpl class.
/// </summary>
/// <param name="iclient">pointer to the instance implementing the IAccessors interface.</param>
/// <param name="multiThreaded">true to use multi-threading, false for single-threaded.</param>
/// <param name="options">A combination of the <see cref="navlib::nlOptions_t"/> values.</param>
/// <returns>
/// A <see cref="std::shared_ptr{CNavlibImpl}"/> to the new CNavlibImpl instance.
/// </returns>
static std::shared_ptr<CNavlibImpl> CreateInstance(IAccessors *iclient, bool multiThreaded,
navlib::nlOptions_t options) {
if (iclient == nullptr) {
throw std::logic_error("The accessor interface is null");
}
// So that std::make_shared<> can be used with the private constructor.
struct make_shared_enabler : public this_type {
make_shared_enabler(IAccessors *iclient) : this_type(iclient) {
}
};
std::shared_ptr<CNavlibImpl> result = std::make_shared<make_shared_enabler>(iclient);
#if 1
result->m_pNavlib = std::unique_ptr<CNavlibInterface>(
new CNavlibInterface(std::static_pointer_cast<IAccessors>(result), multiThreaded, options));
#endif
return result;
}
/// <summary>
/// Clean up the resources
/// </summary>
virtual ~CNavlibImpl() {
}
// INavlib implementation
/// <summary>
/// Close the connection to the 3D navigation library.
/// </summary>
void Close() override {
m_pNavlib->Close();
}
/// <summary>
/// Opens a connection to the 3D navigation library.
/// </summary>
void Open() override {
m_pNavlib->Open();
}
/// <summary>
/// Opens a connection to the 3D navigation library
/// </summary>
/// <param name="profileName">The name of the 3Dconnexion profile to use.</param>
/// <exception cref="std::system_error">The connection to the library is already open.</exception>
/// <exception cref="std::system_error">Cannot create a connection to the library.</exception>
/// <exception cref="std::invalid_argument">The name of the profile is empty.</exception>
void Open(std::string profileName) override {
m_pNavlib->Open(std::move(profileName));
}
/// <summary>
/// Writes the value of a property to the navlib.
/// </summary>
/// <param name="propertyName">The <see cref="navlib::property_t"/> name of the navlib property to
/// write.</param>
/// <param name="value">The <see cref="navlib::value"/> to write.</param>
/// <returns>0 =no error, otherwise a value from <see cref="navlib::make_result_code"/>.</returns>
/// <exception cref="std::system_error">No connection to the navlib / 3D Mouse.</exception>
long Write(const std::string &propertyName, const navlib::value &value) override {
return m_pNavlib->Write(propertyName, value);
}
/// <summary>
/// Reads the value of a navlib property.
/// </summary>
/// <param name="propertyName">The <see cref="navlib::property_t"/> name of the navlib property to
/// read.</param>
/// <param name="value">The <see cref="navlib::value"/> to read.</param>
/// <returns>0 =no error, otherwise a value from <see cref="navlib::make_result_code"/>.</returns>
/// <exception cref="std::system_error">No connection to the navlib / 3D Mouse.</exception>
long Read(const std::string &propertyName, navlib::value &value) const override {
return m_pNavlib->Read(propertyName, value);
}
/// <summary>
/// Reads the value of a navlib string property.
/// </summary>
/// <param name="propertyName">The <see cref="navlib::property_t"/> name of the navlib property to
/// read.</param>
/// <param name="string">The <see cref="std::string"/> value of the property.</param>
/// <returns>0 =no error, otherwise a value from <see cref="navlib::make_result_code"/>.</returns>
/// <exception cref="std::system_error">No connection to the navlib.</exception>
long Read(const std::string &propertyName, std::string &string) const override {
return m_pNavlib->Read(propertyName, string);
}
private:
// IEvents overrides
long SetActiveCommand(std::string commandId) override {
return m_iclient->SetActiveCommand(commandId);
}
long SetSettingsChanged(long change) override {
return m_iclient->SetSettingsChanged(change);
}
long SetKeyPress(long vkey) override {
return m_iclient->SetKeyPress(vkey);
}
long SetKeyRelease(long vkey) override {
return m_iclient->SetKeyRelease(vkey);
}
// IHit overrides
long GetHitLookAt(navlib::point_t &position) const override {
return m_iclient->GetHitLookAt(position);
}
long SetHitAperture(double aperture) override {
return m_iclient->SetHitAperture(aperture);
}
long SetHitDirection(const navlib::vector_t &direction) override {
return m_iclient->SetHitDirection(direction);
}
long SetHitLookFrom(const navlib::point_t &eye) override {
return m_iclient->SetHitLookFrom(eye);
}
long SetHitSelectionOnly(bool onlySelection) override {
return m_iclient->SetHitSelectionOnly(onlySelection);
}
// IModel overrides
long GetModelExtents(navlib::box_t &extents) const override {
return m_iclient->GetModelExtents(extents);
}
long GetSelectionExtents(navlib::box_t &extents) const override {
return m_iclient->GetSelectionExtents(extents);
}
long GetSelectionTransform(navlib::matrix_t &transform) const override {
return m_iclient->GetSelectionTransform(transform);
}
long GetIsSelectionEmpty(navlib::bool_t &empty) const override {
return m_iclient->GetIsSelectionEmpty(empty);
}
long SetSelectionTransform(const navlib::matrix_t &matrix) override {
return m_iclient->SetSelectionTransform(matrix);
}
// IPivot overrides
long GetPivotPosition(navlib::point_t &position) const override {
return m_iclient->GetPivotPosition(position);
}
long IsUserPivot(navlib::bool_t &userPivot) const override {
return m_iclient->IsUserPivot(userPivot);
}
long SetPivotPosition(const navlib::point_t &position) override {
return m_iclient->SetPivotPosition(position);
}
long GetPivotVisible(navlib::bool_t &visible) const override {
return m_iclient->GetPivotVisible(visible);
}
long SetPivotVisible(bool visible) override {
return m_iclient->SetPivotVisible(visible);
}
// ISpace3D overrides
long GetCoordinateSystem(navlib::matrix_t &matrix) const override {
return m_iclient->GetCoordinateSystem(matrix);
}
long GetFrontView(navlib::matrix_t &matrix) const override {
return m_iclient->GetFrontView(matrix);
}
// IState overrides
long SetTransaction(long transaction) override {
return m_iclient->SetTransaction(transaction);
}
long SetMotionFlag(bool motion) override {
return m_iclient->SetMotionFlag(motion);
}
// IView overrides
long GetCameraMatrix(navlib::matrix_t &matrix) const override {
return m_iclient->GetCameraMatrix(matrix);
}
long GetCameraTarget(navlib::point_t &point) const override {
return m_iclient->GetCameraTarget(point);
}
long GetPointerPosition(navlib::point_t &position) const override {
return m_iclient->GetPointerPosition(position);
}
long GetViewConstructionPlane(navlib::plane_t &plane) const override {
return m_iclient->GetViewConstructionPlane(plane);
}
long GetViewExtents(navlib::box_t &extents) const override {
return m_iclient->GetViewExtents(extents);
}
long GetViewFOV(double &fov) const override {
return m_iclient->GetViewFOV(fov);
}
long GetViewFrustum(navlib::frustum_t &frustum) const override {
return m_iclient->GetViewFrustum(frustum);
}
long GetIsViewPerspective(navlib::bool_t &perspective) const override {
return m_iclient->GetIsViewPerspective(perspective);
}
long GetIsViewRotatable(navlib::bool_t &isRotatable) const override {
return m_iclient->GetIsViewRotatable(isRotatable);
}
long SetCameraMatrix(const navlib::matrix_t &matrix) override {
return m_iclient->SetCameraMatrix(matrix);
}
long SetCameraTarget(const navlib::point_t &target) override {
return m_iclient->SetCameraTarget(target);
}
long SetPointerPosition(const navlib::point_t &position) override {
return m_iclient->SetPointerPosition(position);
}
long SetViewExtents(const navlib::box_t &extents) override {
return m_iclient->SetViewExtents(extents);
}
long SetViewFOV(double fov) override {
return m_iclient->SetViewFOV(fov);
}
long SetViewFrustum(const navlib::frustum_t &frustum) override {
return m_iclient->SetViewFrustum(frustum);
}
private:
IAccessors *m_iclient;
std::unique_ptr<CNavlibInterface> m_pNavlib;
};
} // namespace Navigation3D
} // namespace SpaceMouse
} // namespace TDx
#endif // CNavlibImpl_HPP_INCLUDED