43#include <wx/mstream.h>
58 PutProfileHint(
"KiCAD Datasheet Editor" );
64 std::error_code m_errCode;
65 EnableNavigation(
false, m_errCode );
66 if( m_errCode.value() != 0 )
68 wxLogTrace( wxT(
"KI_TRACE_NAVLIB" ),
69 wxT(
"Error occured when calling EnableNavigation. Error code: %d" ),
97 EnableNavigation(
true );
100 PutFrameTimingSource( TimingSource::SpaceMouse );
109 wxLogTrace(
m_logTrace, wxT(
"NL_PL_EDITOR_PLUGIN_IMPL::SetFocus %d" ), aFocus );
110 NAV_3D::Write( navlib::focus_k, aFocus );
114using CATEGORY_STORE = std::map<std::string, TDx::CCommandTreeNode*, std::less<>>;
127 using TDx::SpaceMouse::CCategory;
129 auto parent_iter = aCategoryStore.begin();
130 std::string::size_type pos = aCategoryPath.find_last_of(
'.' );
132 if( pos != std::string::npos )
134 std::string parentPath = aCategoryPath.substr( 0, pos );
136 if( !aCategoryStore.contains( parentPath ) )
139 parent_iter = aCategoryStore.find( parentPath );
143 std::string
name = aCategoryPath.substr( pos + 1 );
144 auto categoryNode = std::make_unique<CCategory>( aCategoryPath.c_str(),
name.c_str() );
146 aCategoryStore.try_emplace( aCategoryStore.end(), aCategoryPath, categoryNode.get() );
148 parent_iter->second->push_back( std::move( categoryNode ) );
162 if( !aCategoryStore.contains( aCategoryPath ) )
171 wxLogTrace(
m_logTrace, wxT(
"NL_PL_EDITOR_PLUGIN_IMPL::exportCommandsAndImages" ) );
175 if( actions.empty() )
178 using TDx::SpaceMouse::CCommand;
179 using TDx::SpaceMouse::CCommandSet;
182 CCommandSet commandSet(
"PL_EDITOR",
"Drawing Sheet Editor" );
185 NAV_3D::PutActiveCommands( commandSet.GetId() );
188 CATEGORY_STORE categoryStore{ CATEGORY_STORE::value_type(
".", &commandSet ) };
190 std::vector<TDx::CImage> vImages;
192 for(
const auto action : actions )
194 std::string label = action->GetMenuLabel().ToStdString();
199 std::string
name = action->GetName();
203 if(
name.rfind(
"3DViewer.", 0 ) == 0 )
206 std::string strCategory = action->GetToolName();
207 std::string description = action->GetDescription().ToStdString();
210 CATEGORY_STORE::iterator iter = categoryStore.find( strCategory );
213 wxMemoryOutputStream imageStream;
215 if( action->GetIcon() != BITMAPS::INVALID_BITMAP )
217 wxImage
image =
KiBitmap( action->GetIcon() ).ConvertToImage();
218 image.SaveFile( imageStream, wxBitmapType::wxBITMAP_TYPE_PNG );
221 if( imageStream.GetSize() )
223 const wxStreamBuffer* streamBuffer = imageStream.GetOutputStreamBuffer();
224 TDx::CImage tdxImage = TDx::CImage::FromData(
"", 0,
name.c_str() );
225 tdxImage.AssignImage(
226 std::string( std::bit_cast<const char*>( streamBuffer->GetBufferStart() ),
227 streamBuffer->GetBufferSize() ),
231 vImages.push_back( std::move( tdxImage ) );
235 wxLogTrace(
m_logTrace, wxT(
"Inserting command: %s, description: %s, in category: %s" ),
236 name, description, iter->first );
238 iter->second->push_back(
239 CCommand( std::move(
name ), std::move( label ), std::move( description ) ) );
242 NAV_3D::AddCommandSet( commandSet );
243 NAV_3D::AddImages( vImages );
250 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
262 matrix = { { { x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0,
m_viewPosition.
x,
m_viewPosition.
y, 0,
271 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
275 position.
x = mouse_pointer.
x;
276 position.y = mouse_pointer.
y;
286 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
293 extents.min_x = -box.
GetWidth() / 2.0;
296 extents.max_x = box.
GetWidth() / 2.0;
314 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
317 VECTOR2D viewPos( matrix.m4x4[3][0], matrix.m4x4[3][1] );
323 result = navlib::make_result_code( navlib::navlib_errc::error );
339 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
344 result = navlib::make_result_code( navlib::navlib_errc::error );
353 result = navlib::make_result_code( navlib::navlib_errc::error );
361 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
367 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
374 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
384 extents.min_x =
static_cast<double>( box.
GetOrigin().
x );
385 extents.min_y =
static_cast<double>( box.
GetOrigin().
y );
386 extents.min_z = -half_depth;
387 extents.max_x =
static_cast<double>( box.
GetEnd().
x );
388 extents.max_y =
static_cast<double>( box.
GetEnd().
y );
389 extents.max_z = half_depth;
398 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
405 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
426 if( commandId.empty() )
431 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
438 if( parent ==
nullptr || !parent->IsEnabled() )
440 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
446 if( tool_manager ==
nullptr )
448 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
452 const auto action : actions )
454 if( action ==
nullptr )
459 if( commandId == action->GetName() )
467 if( aCond ==
nullptr )
469 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
507 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
513 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
519 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
525 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
531 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
537 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
543 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
549 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
555 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
561 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
567 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
573 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
579 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
585 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
591 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
597 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
const ACTION_CONDITIONS * GetCondition(const TOOL_ACTION &aAction) const
Get the conditions to use for a specific tool action.
static std::list< TOOL_ACTION * > & GetActionList()
Return list of TOOL_ACTIONs.
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr size_type GetWidth() const
constexpr size_type GetHeight() const
constexpr const Vec & GetOrigin() const
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
void ForceRefresh()
Force a redraw.
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
double GetMaxDepth() const
double GetMinDepth() const
double GetWorldScale() const
Get the world scale.
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
const VECTOR2D & GetCenter() const
Return the center point of this VIEW (in world space coordinates).
virtual void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 })
Set the scaling factor, zooming around a given anchor point.
bool IsMirroredX() const
Return true if view is flipped across the X axis.
bool IsMirroredY() const
Return true if view is flipped across the Y axis.
const BOX2D & GetBoundary() const
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
long SetViewExtents(const navlib::box_t &aExtents) override
long GetPivotPosition(navlib::point_t &aPosition) const override
long GetViewFOV(double &aFov) const override
virtual ~NL_PL_EDITOR_PLUGIN_IMPL()
EDA_DRAW_PANEL_GAL * m_viewport2D
long SetCameraTarget(const navlib::point_t &aPosition) override
long SetPivotPosition(const navlib::point_t &aPosition) override
long GetCameraMatrix(navlib::matrix_t &aMatrix) const override
long GetViewFrustum(navlib::frustum_t &aFrustum) const override
long SetHitDirection(const navlib::vector_t &aDirection) override
long SetHitLookFrom(const navlib::point_t &aPosition) override
long SetHitSelectionOnly(bool aSelectionOnly) override
long SetPivotVisible(bool aVisible) override
void SetCanvas(EDA_DRAW_PANEL_GAL *aViewport)
Sets the viewport controlled by the SpaceMouse.
long SetActiveCommand(std::string aCommandId) override
long SetCameraMatrix(const navlib::matrix_t &aMatrix) override
long SetSelectionTransform(const navlib::matrix_t &aMatrix) override
long GetViewExtents(navlib::box_t &aExtents) const override
long SetSettingsChanged(long aChangeNumber) override
long SetHitAperture(double aAperture) override
long GetHitLookAt(navlib::point_t &aPosition) const override
long GetPointerPosition(navlib::point_t &aPosition) const override
void exportCommandsAndImages()
Export the invocable actions and images to the 3Dconnexion UI.
void SetFocus(bool aFocus)
Set the connection to the 3Dconnexion driver to the focus state so that 3DMouse data is routed here.
long SetViewFrustum(const navlib::frustum_t &aFrustum) override
long GetIsSelectionEmpty(navlib::bool_t &aEmpty) const override
long GetIsViewRotatable(navlib::bool_t &isRotatable) const override
long GetFrontView(navlib::matrix_t &aMatrix) const override
long SetViewFOV(double aFov) override
long SetMotionFlag(bool aValue) override
long GetSelectionTransform(navlib::matrix_t &aTransform) const override
long IsUserPivot(navlib::bool_t &aUserPivot) const override
long GetModelExtents(navlib::box_t &aExtents) const override
long GetCoordinateSystem(navlib::matrix_t &aMatrix) const override
long GetPivotVisible(navlib::bool_t &aVisible) const override
long SetTransaction(long aValue) override
long GetSelectionExtents(navlib::box_t &aExtents) const override
NL_PL_EDITOR_PLUGIN_IMPL()
Initializes a new instance of the NL_PL_EDITOR_PLUGIN_IMPL.
long GetIsViewPerspective(navlib::bool_t &aPerspective) const override
The main window used in the drawing sheet editor.
static bool empty(const wxTextEntryBase *aCtrl)
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
bool equals(glm::mat< L, C, T, Q > const &aFirst, glm::mat< L, C, T, Q > const &aSecond, T aEpsilon=static_cast< T >(FLT_EPSILON *10))
Template to compare two glm::mat<T> values for equality within a required epsilon.
std::map< std::string, TDx::CCommandTreeNode * > CATEGORY_STORE
static void try_add_category(const std::string &aCategoryPath, CATEGORY_STORE &aCategoryStore)
add_category wrapper.
static void try_add_category(const std::string &aCategoryPath, CATEGORY_STORE &aCategoryStore)
add_category wrapper.
static void add_category(const std::string &aCategoryPath, CATEGORY_STORE &aCategoryStore)
Add a category to the store.
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
SELECTION_CONDITION enableCondition
Returns true if the UI control should be enabled.
WX_VIEW_CONTROLS class definition.