44#include <wx/mstream.h>
59 PutProfileHint(
"KiCAD Gerbview" );
67 std::error_code errCode;
68 EnableNavigation(
false, errCode );
70 if( errCode.value() != 0 )
72 wxLogTrace( wxT(
"KI_TRACE_NAVLIB" ),
73 wxT(
"Error occured when calling EnableNavigation. Error code: %d" ),
98 EnableNavigation(
true );
99 PutFrameTimingSource( TimingSource::SpaceMouse );
108 wxLogTrace(
m_logTrace, wxT(
"NL_GERBVIEW_PLUGIN_IMPL::SetFocus %d" ), aFocus );
109 NAV_3D::Write( navlib::focus_k, aFocus );
113using CATEGORY_STORE = std::map<std::string, TDx::CCommandTreeNode*, std::less<>>;
126 using TDx::SpaceMouse::CCategory;
128 auto parent_iter = aCategoryStore.begin();
129 std::string::size_type pos = aCategoryPath.find_last_of(
'.' );
131 if( pos != std::string::npos )
133 std::string parentPath = aCategoryPath.substr( 0, pos );
135 if( !aCategoryStore.contains( parentPath ) )
138 parent_iter = aCategoryStore.find( parentPath );
142 std::string
name = aCategoryPath.substr( pos + 1 );
143 auto categoryNode = std::make_unique<CCategory>( aCategoryPath.c_str(),
name.c_str() );
145 aCategoryStore.try_emplace( aCategoryStore.end(), aCategoryPath, categoryNode.get() );
147 if( parent_iter != aCategoryStore.end() )
148 parent_iter->second->push_back( std::move( categoryNode ) );
162 if( !aCategoryStore.contains( aCategoryPath ) )
169 wxLogTrace(
m_logTrace, wxT(
"NL_GERBVIEW_PLUGIN_IMPL::exportCommandsAndImages" ) );
173 if( actions.empty() )
176 using TDx::SpaceMouse::CCommand;
177 using TDx::SpaceMouse::CCommandSet;
180 CCommandSet commandSet(
"GERBER_EDITOR",
"Gerber Viewer" );
183 NAV_3D::PutActiveCommands( commandSet.GetId() );
186 CATEGORY_STORE categoryStore{ CATEGORY_STORE::value_type(
".", &commandSet ) };
188 std::vector<TDx::CImage> vImages;
190 for(
const auto action : actions )
192 std::string label = action->GetMenuLabel().ToStdString();
197 std::string
name = action->GetName();
201 if(
name.rfind(
"3DViewer.", 0 ) == 0 )
204 std::string strCategory = action->GetToolName();
205 std::string description = action->GetDescription().ToStdString();
208 CATEGORY_STORE::iterator iter = categoryStore.find( strCategory );
211 wxMemoryOutputStream imageStream;
215 wxImage
image =
KiBitmap( action->GetIcon() ).ConvertToImage();
216 image.SaveFile( imageStream, wxBitmapType::wxBITMAP_TYPE_PNG );
219 if( imageStream.GetSize() )
221 const wxStreamBuffer* streamBuffer = imageStream.GetOutputStreamBuffer();
222 TDx::CImage tdxImage = TDx::CImage::FromData(
"", 0,
name.c_str() );
223 tdxImage.AssignImage(
224 std::string( std::bit_cast<const char*>( streamBuffer->GetBufferStart() ),
225 streamBuffer->GetBufferSize() ),
229 vImages.push_back( std::move( tdxImage ) );
233 if( iter != categoryStore.end() )
235 wxLogTrace(
m_logTrace, wxT(
"Inserting command: %s, description: %s, in category: %s" ),
236 name, description, iter->first );
238 iter->second->push_back( CCommand(
name, label, description ) );
242 NAV_3D::AddCommandSet( commandSet );
243 NAV_3D::AddImages( vImages );
250 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
254 double x =
m_view->IsMirroredX() ? -1 : 1;
255 double y =
m_view->IsMirroredY() ? 1 : -1;
262 matrix = { { { x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0,
m_viewPosition.x,
m_viewPosition.y, 0, 1 } } };
270 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
274 position.x = mouse_pointer.
x;
275 position.y = mouse_pointer.
y;
285 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
292 extents.min_x = -box.
GetWidth() / 2.0;
295 extents.max_x = box.
GetWidth() / 2.0;
313 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
316 VECTOR2D viewPos( matrix.m4x4[3][0], matrix.m4x4[3][1] );
321 result = navlib::make_result_code( navlib::navlib_errc::error );
325 m_view->SetCenter( viewPos );
337 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
342 result = navlib::make_result_code( navlib::navlib_errc::error );
351 result = navlib::make_result_code( navlib::navlib_errc::error );
359 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
365 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
372 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
377 double half_depth = 0.1 /
m_viewport2D->GetGAL()->GetWorldScale();
382 extents.min_x =
static_cast<double>( box.
GetOrigin().x );
383 extents.min_y =
static_cast<double>( box.
GetOrigin().y );
384 extents.min_z = -half_depth;
385 extents.max_x =
static_cast<double>( box.
GetEnd().x );
386 extents.max_y =
static_cast<double>( box.
GetEnd().y );
387 extents.max_z = half_depth;
396 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
403 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
424 if( commandId.empty() )
428 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
434 if( !parent || !parent->IsEnabled() )
435 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
442 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
449 if( commandId == action->GetName() )
457 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
494 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
500 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
506 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
512 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
518 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
524 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
530 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
536 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
542 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
548 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
554 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
560 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
566 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
572 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
578 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
584 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
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
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 SafeNavlibInit(const std::function< void()> &aInitFunc)
Attempt to run the given function, recovering from both C++ exceptions and abort() calls triggered by...
Safe initialization wrapper for the 3Dconnexion navlib SDK.
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.
wxString result
Test unit parsing edge cases and error handling.
VECTOR2< double > VECTOR2D
WX_VIEW_CONTROLS class definition.