43#include <wx/mstream.h>
58 PutProfileHint(
"KiCAD Gerbview" );
64 std::error_code m_errCode;
65 EnableNavigation(
false, m_errCode );
67 if( m_errCode.value() != 0 )
69 wxLogTrace( wxT(
"KI_TRACE_NAVLIB" ),
70 wxT(
"Error occured when calling EnableNavigation. Error code: %d" ),
94 EnableNavigation(
true );
97 PutFrameTimingSource( TimingSource::SpaceMouse );
106 wxLogTrace(
m_logTrace, wxT(
"NL_GERBVIEW_PLUGIN_IMPL::SetFocus %d" ), aFocus );
107 NAV_3D::Write( navlib::focus_k, aFocus );
111using CATEGORY_STORE = std::map<std::string, TDx::CCommandTreeNode*, std::less<>>;
124 using TDx::SpaceMouse::CCategory;
126 auto parent_iter = aCategoryStore.begin();
127 std::string::size_type pos = aCategoryPath.find_last_of(
'.' );
129 if( pos != std::string::npos )
131 std::string parentPath = aCategoryPath.substr( 0, pos );
133 if( !aCategoryStore.contains( parentPath ) )
136 parent_iter = aCategoryStore.find( parentPath );
140 std::string
name = aCategoryPath.substr( pos + 1 );
141 auto categoryNode = std::make_unique<CCategory>( aCategoryPath.c_str(),
name.c_str() );
143 aCategoryStore.try_emplace( aCategoryStore.end(), aCategoryPath, categoryNode.get() );
145 if( parent_iter != aCategoryStore.end() )
146 parent_iter->second->push_back( std::move( categoryNode ) );
160 if( !aCategoryStore.contains( aCategoryPath ) )
167 wxLogTrace(
m_logTrace, wxT(
"NL_GERBVIEW_PLUGIN_IMPL::exportCommandsAndImages" ) );
171 if( actions.empty() )
174 using TDx::SpaceMouse::CCommand;
175 using TDx::SpaceMouse::CCommandSet;
178 CCommandSet commandSet(
"GERBER_EDITOR",
"Gerber Viewer" );
181 NAV_3D::PutActiveCommands( commandSet.GetId() );
184 CATEGORY_STORE categoryStore{ CATEGORY_STORE::value_type(
".", &commandSet ) };
186 std::vector<TDx::CImage> vImages;
188 for(
const auto action : actions )
190 std::string label = action->GetMenuLabel().ToStdString();
195 std::string
name = action->GetName();
199 if(
name.rfind(
"3DViewer.", 0 ) == 0 )
202 std::string strCategory = action->GetToolName();
203 std::string description = action->GetDescription().ToStdString();
206 CATEGORY_STORE::iterator iter = categoryStore.find( strCategory );
209 wxMemoryOutputStream imageStream;
211 if( action->GetIcon() != BITMAPS::INVALID_BITMAP )
213 wxImage
image =
KiBitmap( action->GetIcon() ).ConvertToImage();
214 image.SaveFile( imageStream, wxBitmapType::wxBITMAP_TYPE_PNG );
217 if( imageStream.GetSize() )
219 const wxStreamBuffer* streamBuffer = imageStream.GetOutputStreamBuffer();
220 TDx::CImage tdxImage = TDx::CImage::FromData(
"", 0,
name.c_str() );
221 tdxImage.AssignImage(
222 std::string( std::bit_cast<const char*>( streamBuffer->GetBufferStart() ),
223 streamBuffer->GetBufferSize() ),
227 vImages.push_back( std::move( tdxImage ) );
231 if( iter != categoryStore.end() )
233 wxLogTrace(
m_logTrace, wxT(
"Inserting command: %s, description: %s, in category: %s" ),
234 name, description, iter->first );
236 iter->second->push_back( CCommand(
name, label, description ) );
240 NAV_3D::AddCommandSet( commandSet );
241 NAV_3D::AddImages( vImages );
248 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
260 matrix = { { { x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0,
m_viewPosition.
x,
m_viewPosition.
y, 0, 1 } } };
268 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
272 position.
x = mouse_pointer.
x;
273 position.y = mouse_pointer.
y;
283 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
290 extents.min_x = -box.
GetWidth() / 2.0;
293 extents.max_x = box.
GetWidth() / 2.0;
311 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
314 VECTOR2D viewPos( matrix.m4x4[3][0], matrix.m4x4[3][1] );
319 result = navlib::make_result_code( navlib::navlib_errc::error );
335 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
340 result = navlib::make_result_code( navlib::navlib_errc::error );
349 result = navlib::make_result_code( navlib::navlib_errc::error );
357 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
363 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
370 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
380 extents.min_x =
static_cast<double>( box.
GetOrigin().
x );
381 extents.min_y =
static_cast<double>( box.
GetOrigin().
y );
382 extents.min_z = -half_depth;
383 extents.max_x =
static_cast<double>( box.
GetEnd().
x );
384 extents.max_y =
static_cast<double>( box.
GetEnd().
y );
385 extents.max_z = half_depth;
394 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
401 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
422 if( commandId.empty() )
426 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
432 if( !parent || !parent->IsEnabled() )
433 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
440 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
447 if( commandId == action->GetName() )
455 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
492 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
498 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
504 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
510 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
516 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
522 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
528 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
534 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
540 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
546 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
552 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
558 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
564 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
570 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
576 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
582 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 GetCoordinateSystem(navlib::matrix_t &aMatrix) const override
long GetHitLookAt(navlib::point_t &aPosition) const override
long SetSettingsChanged(long aChangeNumber) override
long GetIsViewPerspective(navlib::bool_t &aPerspective) const override
virtual ~NL_GERBVIEW_PLUGIN_IMPL()
long SetCameraMatrix(const navlib::matrix_t &aMatrix) override
long GetPivotPosition(navlib::point_t &aPosition) const override
long GetViewFOV(double &aFov) const override
long SetPivotVisible(bool aVisible) override
long SetSelectionTransform(const navlib::matrix_t &aMatrix) override
long GetViewFrustum(navlib::frustum_t &aFrustum) const override
long SetTransaction(long aValue) override
long GetIsViewRotatable(navlib::bool_t &isRotatable) const override
long SetHitLookFrom(const navlib::point_t &aPosition) override
long GetIsSelectionEmpty(navlib::bool_t &aEmpty) const override
long SetMotionFlag(bool aValue) override
long GetCameraMatrix(navlib::matrix_t &aMatrix) const override
long SetViewExtents(const navlib::box_t &aExtents) override
long SetCameraTarget(const navlib::point_t &aPosition) override
long GetFrontView(navlib::matrix_t &aMatrix) const override
long SetHitSelectionOnly(bool aSelectionOnly) override
long GetSelectionExtents(navlib::box_t &aExtents) const override
long SetHitDirection(const navlib::vector_t &aDirection) override
long SetViewFOV(double aFov) override
NL_GERBVIEW_PLUGIN_IMPL()
Initializes a new instance of the NL_GERBVIEW_PLUGIN_IMPL.
long GetPointerPosition(navlib::point_t &aPosition) const override
long SetPivotPosition(const navlib::point_t &aPosition) override
void exportCommandsAndImages()
Export the invocable actions and images to the 3Dconnexion UI.
void SetCanvas(EDA_DRAW_PANEL_GAL *aViewport)
Sets the viewport controlled by the SpaceMouse.
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 SetActiveCommand(std::string aCommandId) override
long SetHitAperture(double aAperture) override
long GetViewExtents(navlib::box_t &aExtents) const override
long IsUserPivot(navlib::bool_t &aUserPivot) const override
long GetPivotVisible(navlib::bool_t &aVisible) const override
long GetModelExtents(navlib::box_t &aExtents) const override
long GetSelectionTransform(navlib::matrix_t &aTransform) const override
EDA_DRAW_PANEL_GAL * m_viewport2D
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 add_category(const std::string &aCategoryPath, CATEGORY_STORE &aCategoryStore)
Add a category to the store.
Declaration of the NL_GERBVIEW_PLUGIN_IMPL class.
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.