44#include <wx/mstream.h>
59 PutProfileHint(
"KiCAD Datasheet Editor" );
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_PL_EDITOR_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 ) )
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 );
212 wxCHECK2( iter != categoryStore.end(),
continue );
215 wxMemoryOutputStream imageStream;
219 wxImage
image =
KiBitmap( action->GetIcon() ).ConvertToImage();
220 image.SaveFile( imageStream, wxBitmapType::wxBITMAP_TYPE_PNG );
223 if( imageStream.GetSize() )
225 const wxStreamBuffer* streamBuffer = imageStream.GetOutputStreamBuffer();
226 TDx::CImage tdxImage = TDx::CImage::FromData(
"", 0,
name.c_str() );
227 tdxImage.AssignImage(
228 std::string( std::bit_cast<const char*>( streamBuffer->GetBufferStart() ),
229 streamBuffer->GetBufferSize() ),
233 vImages.push_back( std::move( tdxImage ) );
237 wxLogTrace(
m_logTrace, wxT(
"Inserting command: %s, description: %s, in category: %s" ),
238 name, description, iter->first );
240 iter->second->push_back( CCommand( std::move(
name ), std::move( label ),
241 std::move( description ) ) );
244 NAV_3D::AddCommandSet( commandSet );
245 NAV_3D::AddImages( vImages );
252 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
256 double x =
m_view->IsMirroredX() ? -1 : 1;
257 double y =
m_view->IsMirroredY() ? 1 : -1;
264 matrix = { { { x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0,
m_viewPosition.x,
m_viewPosition.y, 0,
273 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
277 position.x = mouse_pointer.
x;
278 position.y = mouse_pointer.
y;
288 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
295 extents.min_x = -box.
GetWidth() / 2.0;
298 extents.max_x = box.
GetWidth() / 2.0;
316 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
319 VECTOR2D viewPos( matrix.m4x4[3][0], matrix.m4x4[3][1] );
325 result = navlib::make_result_code( navlib::navlib_errc::error );
329 m_view->SetCenter( viewPos );
341 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
346 result = navlib::make_result_code( navlib::navlib_errc::error );
355 result = navlib::make_result_code( navlib::navlib_errc::error );
363 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
369 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
376 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
381 double half_depth = 0.1 /
m_viewport2D->GetGAL()->GetWorldScale();
386 extents.min_x =
static_cast<double>( box.
GetOrigin().x );
387 extents.min_y =
static_cast<double>( box.
GetOrigin().y );
388 extents.min_z = -half_depth;
389 extents.max_x =
static_cast<double>( box.
GetEnd().x );
390 extents.max_y =
static_cast<double>( box.
GetEnd().y );
391 extents.max_z = half_depth;
400 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
407 matrix = { { { 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1 } } };
428 if( commandId.empty() )
432 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
438 if( !parent || !parent->IsEnabled() )
439 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
446 return navlib::make_result_code( navlib::navlib_errc::invalid_operation );
450 if( action ==
nullptr )
453 if( commandId == action->GetName() )
460 if( aCond ==
nullptr )
461 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::invalid_operation );
510 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
516 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
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::invalid_operation );
558 return navlib::make_result_code( navlib::navlib_errc::no_data_available );
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 );
588 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
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.
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
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 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.
wxString result
Test unit parsing edge cases and error handling.
VECTOR2< double > VECTOR2D
WX_VIEW_CONTROLS class definition.