Merge branch '3d_mouse_in_footprint_properties' into 'master'
ADDED: Support for 3D Mouse in Footprint Properties 3D Model tab Closes #14002 See merge request kicad/code/kicad!1961
This commit is contained in:
commit
4b90408255
|
@ -1,6 +1,8 @@
|
||||||
add_library(3d-viewer_navlib STATIC
|
add_library(3d-viewer_navlib STATIC
|
||||||
"nl_3d_viewer_plugin.cpp"
|
"nl_3d_viewer_plugin.cpp"
|
||||||
"nl_3d_viewer_plugin_impl.cpp"
|
"nl_3d_viewer_plugin_impl.cpp"
|
||||||
|
"nl_footprint_properties_plugin.cpp"
|
||||||
|
"nl_footprint_properties_plugin_impl.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 3d-viewer_navlib depends on make_lexer outputs in common
|
# 3d-viewer_navlib depends on make_lexer outputs in common
|
||||||
|
|
|
@ -25,20 +25,17 @@
|
||||||
|
|
||||||
|
|
||||||
NL_3D_VIEWER_PLUGIN::NL_3D_VIEWER_PLUGIN( EDA_3D_CANVAS* aViewport )
|
NL_3D_VIEWER_PLUGIN::NL_3D_VIEWER_PLUGIN( EDA_3D_CANVAS* aViewport )
|
||||||
: m_impl( nullptr )
|
|
||||||
{
|
{
|
||||||
if( ADVANCED_CFG::GetCfg().m_Use3DConnexionDriver
|
if( ADVANCED_CFG::GetCfg().m_Use3DConnexionDriver
|
||||||
&& KIPLATFORM::DRIVERS::Valid3DConnexionDriverVersion() )
|
&& KIPLATFORM::DRIVERS::Valid3DConnexionDriverVersion() )
|
||||||
{
|
{
|
||||||
m_impl = new NL_3D_VIEWER_PLUGIN_IMPL( aViewport );
|
m_impl = std::make_unique<NL_3D_VIEWER_PLUGIN_IMPL>( aViewport, "KiCAD 3D" );
|
||||||
|
m_impl->Connect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NL_3D_VIEWER_PLUGIN::~NL_3D_VIEWER_PLUGIN()
|
NL_3D_VIEWER_PLUGIN::~NL_3D_VIEWER_PLUGIN() = default;
|
||||||
{
|
|
||||||
delete m_impl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void NL_3D_VIEWER_PLUGIN::SetFocus( bool focus )
|
void NL_3D_VIEWER_PLUGIN::SetFocus( bool focus )
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#ifndef NL_3D_VIEWER_PLUGIN_H_
|
#ifndef NL_3D_VIEWER_PLUGIN_H_
|
||||||
#define NL_3D_VIEWER_PLUGIN_H_
|
#define NL_3D_VIEWER_PLUGIN_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
// Forward declarations.
|
// Forward declarations.
|
||||||
class EDA_3D_CANVAS;
|
class EDA_3D_CANVAS;
|
||||||
class NL_3D_VIEWER_PLUGIN_IMPL;
|
class NL_3D_VIEWER_PLUGIN_IMPL;
|
||||||
|
@ -54,7 +56,7 @@ public:
|
||||||
void SetFocus( bool aFocus = true );
|
void SetFocus( bool aFocus = true );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NL_3D_VIEWER_PLUGIN_IMPL* m_impl;
|
std::unique_ptr<NL_3D_VIEWER_PLUGIN_IMPL> m_impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NL_3D_VIEWER_PLUGIN_H_
|
#endif // NL_3D_VIEWER_PLUGIN_H_
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2021 3Dconnexion
|
* Copyright (C) 2024 3Dconnexion
|
||||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* 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
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -27,6 +27,7 @@
|
||||||
// KiCAD includes
|
// KiCAD includes
|
||||||
#include <tool/action_manager.h>
|
#include <tool/action_manager.h>
|
||||||
#include <tool/tool_manager.h>
|
#include <tool/tool_manager.h>
|
||||||
|
#include <tool/tools_holder.h>
|
||||||
|
|
||||||
// stdlib
|
// stdlib
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -72,7 +73,7 @@ bool equals( glm::mat<L, C, T, Q> const& aFirst, glm::mat<L, C, T, Q> const& aSe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NL_3D_VIEWER_PLUGIN_IMPL::NL_3D_VIEWER_PLUGIN_IMPL( EDA_3D_CANVAS* aCanvas ) :
|
NL_3D_VIEWER_PLUGIN_IMPL::NL_3D_VIEWER_PLUGIN_IMPL( EDA_3D_CANVAS* aCanvas, const std::string& aProfileHint ) :
|
||||||
NAV_3D( false, false ),
|
NAV_3D( false, false ),
|
||||||
m_canvas( aCanvas ),
|
m_canvas( aCanvas ),
|
||||||
m_capIsMoving( false ),
|
m_capIsMoving( false ),
|
||||||
|
@ -80,12 +81,7 @@ NL_3D_VIEWER_PLUGIN_IMPL::NL_3D_VIEWER_PLUGIN_IMPL( EDA_3D_CANVAS* aCanvas ) :
|
||||||
{
|
{
|
||||||
m_camera = dynamic_cast<TRACK_BALL*>( m_canvas->GetCamera() );
|
m_camera = dynamic_cast<TRACK_BALL*>( m_canvas->GetCamera() );
|
||||||
|
|
||||||
PutProfileHint( "KiCAD 3D" );
|
PutProfileHint( aProfileHint );
|
||||||
|
|
||||||
EnableNavigation( true );
|
|
||||||
PutFrameTimingSource( TimingSource::SpaceMouse );
|
|
||||||
|
|
||||||
exportCommandsAndImages();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,8 +97,19 @@ void NL_3D_VIEWER_PLUGIN_IMPL::SetFocus( bool aFocus )
|
||||||
NAV_3D::Write( navlib::focus_k, aFocus );
|
NAV_3D::Write( navlib::focus_k, aFocus );
|
||||||
}
|
}
|
||||||
|
|
||||||
// temporary store for the categories
|
|
||||||
typedef std::map<std::string, TDx::CCommandTreeNode*> CATEGORY_STORE;
|
EDA_3D_CANVAS* NL_3D_VIEWER_PLUGIN_IMPL::GetCanvas() const
|
||||||
|
{
|
||||||
|
return m_canvas;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void NL_3D_VIEWER_PLUGIN_IMPL::Connect()
|
||||||
|
{
|
||||||
|
EnableNavigation(true);
|
||||||
|
PutFrameTimingSource(TimingSource::SpaceMouse);
|
||||||
|
exportCommandsAndImages();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a category to the store.
|
* Add a category to the store.
|
||||||
|
@ -571,7 +578,7 @@ long NL_3D_VIEWER_PLUGIN_IMPL::SetActiveCommand( std::string commandId )
|
||||||
|
|
||||||
if( parent->IsEnabled() )
|
if( parent->IsEnabled() )
|
||||||
{
|
{
|
||||||
TOOL_MANAGER* tool_manager = static_cast<PCB_BASE_FRAME*>( parent )->GetToolManager();
|
TOOL_MANAGER* tool_manager = dynamic_cast<TOOLS_HOLDER*>( parent )->GetToolManager();
|
||||||
|
|
||||||
if( tool_manager == nullptr )
|
if( tool_manager == nullptr )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2021 3Dconnexion
|
* Copyright (C) 2024 3Dconnexion
|
||||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* 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
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -42,6 +42,11 @@
|
||||||
class EDA_3D_CANVAS;
|
class EDA_3D_CANVAS;
|
||||||
class TRACK_BALL;
|
class TRACK_BALL;
|
||||||
|
|
||||||
|
// temporary store for the categories
|
||||||
|
typedef std::map<std::string, TDx::CCommandTreeNode*> CATEGORY_STORE;
|
||||||
|
|
||||||
|
CATEGORY_STORE::iterator add_category( std::string aCategoryPath, CATEGORY_STORE& aCategoryStore );
|
||||||
|
|
||||||
// Convenience typedef.
|
// Convenience typedef.
|
||||||
typedef TDx::SpaceMouse::Navigation3D::CNavigation3D NAV_3D;
|
typedef TDx::SpaceMouse::Navigation3D::CNavigation3D NAV_3D;
|
||||||
|
|
||||||
|
@ -56,8 +61,9 @@ public:
|
||||||
* Initializes a new instance of the NL_3DVIEWER_PLUGIN.
|
* Initializes a new instance of the NL_3DVIEWER_PLUGIN.
|
||||||
*
|
*
|
||||||
* @param aCanvas is the viewport to be navigated.
|
* @param aCanvas is the viewport to be navigated.
|
||||||
|
* @param aProfileHint tells the 3DConnexion UI which profile to use.
|
||||||
*/
|
*/
|
||||||
NL_3D_VIEWER_PLUGIN_IMPL( EDA_3D_CANVAS* aCanvas );
|
NL_3D_VIEWER_PLUGIN_IMPL( EDA_3D_CANVAS* aCanvas, const std::string& aProfileHint );
|
||||||
|
|
||||||
virtual ~NL_3D_VIEWER_PLUGIN_IMPL();
|
virtual ~NL_3D_VIEWER_PLUGIN_IMPL();
|
||||||
|
|
||||||
|
@ -69,11 +75,21 @@ public:
|
||||||
*/
|
*/
|
||||||
void SetFocus( bool aFocus = true );
|
void SetFocus( bool aFocus = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the m_canvas pointer.
|
||||||
|
*/
|
||||||
|
EDA_3D_CANVAS* GetCanvas() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect plugin implementation to the driver.
|
||||||
|
*/
|
||||||
|
void Connect();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Export the invocable actions and images to the 3Dconnexion UI.
|
* Export the invocable actions and images to the 3Dconnexion UI.
|
||||||
*/
|
*/
|
||||||
void exportCommandsAndImages();
|
virtual void exportCommandsAndImages();
|
||||||
|
|
||||||
long GetCameraMatrix( navlib::matrix_t& aMatrix ) const override;
|
long GetCameraMatrix( navlib::matrix_t& aMatrix ) const override;
|
||||||
long GetPointerPosition( navlib::point_t& aPosition ) const override;
|
long GetPointerPosition( navlib::point_t& aPosition ) const override;
|
||||||
|
@ -111,6 +127,7 @@ private:
|
||||||
long GetCoordinateSystem( navlib::matrix_t& aMatrix ) const override;
|
long GetCoordinateSystem( navlib::matrix_t& aMatrix ) const override;
|
||||||
long GetIsViewRotatable( navlib::bool_t& isRotatable ) const override;
|
long GetIsViewRotatable( navlib::bool_t& isRotatable ) const override;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EDA_3D_CANVAS* m_canvas;
|
EDA_3D_CANVAS* m_canvas;
|
||||||
TRACK_BALL* m_camera;
|
TRACK_BALL* m_camera;
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 3Dconnexion
|
||||||
|
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nl_footprint_properties_plugin.h"
|
||||||
|
#include "nl_footprint_properties_plugin_impl.h"
|
||||||
|
#include <advanced_config.h>
|
||||||
|
#include <kiplatform/drivers.h>
|
||||||
|
|
||||||
|
|
||||||
|
NL_FOOTPRINT_PROPERTIES_PLUGIN::NL_FOOTPRINT_PROPERTIES_PLUGIN( EDA_3D_CANVAS* aViewport )
|
||||||
|
{
|
||||||
|
if( ADVANCED_CFG::GetCfg().m_Use3DConnexionDriver
|
||||||
|
&& KIPLATFORM::DRIVERS::Valid3DConnexionDriverVersion() )
|
||||||
|
{
|
||||||
|
m_impl = std::make_unique<NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL>( aViewport );
|
||||||
|
m_impl->Connect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NL_FOOTPRINT_PROPERTIES_PLUGIN::~NL_FOOTPRINT_PROPERTIES_PLUGIN() = default;
|
||||||
|
|
||||||
|
|
||||||
|
void NL_FOOTPRINT_PROPERTIES_PLUGIN::SetFocus( bool focus )
|
||||||
|
{
|
||||||
|
if( m_impl )
|
||||||
|
m_impl->SetFocus( focus );
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 3Dconnexion
|
||||||
|
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* 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 nl_footprint_properties_plugin.h
|
||||||
|
* @brief declaration of the nl_footprint_properties_plugin class
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL_FOOTPRINT_PROPERTIES_PLUGIN_H_
|
||||||
|
#define NL_FOOTPRINT_PROPERTIES_PLUGIN_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
// Forward declarations.
|
||||||
|
class EDA_3D_CANVAS;
|
||||||
|
class NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class that implements the public interface to the SpaceMouse plug-in.
|
||||||
|
*/
|
||||||
|
class NL_FOOTPRINT_PROPERTIES_PLUGIN
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Initializes a new instance of the NL_FOOTPRINT_PROPERTIES_PLUGIN.
|
||||||
|
*
|
||||||
|
* @param aViewport is the viewport to be navigated.
|
||||||
|
*/
|
||||||
|
NL_FOOTPRINT_PROPERTIES_PLUGIN( EDA_3D_CANVAS* aViewport );
|
||||||
|
|
||||||
|
virtual ~NL_FOOTPRINT_PROPERTIES_PLUGIN();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the connection to the 3Dconnexion driver to the focus state so that
|
||||||
|
* 3DMouse data is routed here.
|
||||||
|
*
|
||||||
|
* @param aFocus is true to set the connection active.
|
||||||
|
*/
|
||||||
|
void SetFocus( bool aFocus = true );
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL> m_impl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // NL_FOOTPRINT_PROPERTIES_PLUGIN_H_
|
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 3Dconnexion
|
||||||
|
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nl_footprint_properties_plugin_impl.h"
|
||||||
|
#include <3d-viewer/3d_canvas/eda_3d_canvas.h>
|
||||||
|
|
||||||
|
// KiCAD includes
|
||||||
|
#include <tool/action_manager.h>
|
||||||
|
#include <tool/tool_manager.h>
|
||||||
|
#include <tool/tools_holder.h>
|
||||||
|
|
||||||
|
#include <wx/mstream.h>
|
||||||
|
|
||||||
|
#define BOUNDING_BOX_SCALE_FACTOR 1.3f
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to enable the NL_FOOTPRINT_PROPERTIES_PLUGIN debug tracing.
|
||||||
|
*
|
||||||
|
* Use "KI_TRACE_NL_FOOTPRINT_PROPERTIES_PLUGIN" to enable.
|
||||||
|
*
|
||||||
|
* @ingroup trace_env_vars
|
||||||
|
*/
|
||||||
|
const wxChar* NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL::m_logTrace =
|
||||||
|
wxT( "KI_TRACE_NL_FOOTPRINT_PROPERTIES_PLUGIN" );
|
||||||
|
|
||||||
|
|
||||||
|
NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL::NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL(EDA_3D_CANVAS* aCanvas) :
|
||||||
|
NL_3D_VIEWER_PLUGIN_IMPL(aCanvas, "KiCAD Footprint Properties")
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
long NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL::GetModelExtents( navlib::box_t& extents ) const
|
||||||
|
{
|
||||||
|
SFVEC3F min = NL_3D_VIEWER_PLUGIN_IMPL::GetCanvas()->GetBoardAdapter().GetBBox().Min();
|
||||||
|
SFVEC3F max = NL_3D_VIEWER_PLUGIN_IMPL::GetCanvas()->GetBoardAdapter().GetBBox().Max();
|
||||||
|
|
||||||
|
SFVEC3F diff = ( BOUNDING_BOX_SCALE_FACTOR - 1.f ) / 2.f * ( max - min );
|
||||||
|
|
||||||
|
min -= diff;
|
||||||
|
max += diff;
|
||||||
|
|
||||||
|
extents = { min.x, min.y, min.z, max.x, max.y, max.z };
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL::exportCommandsAndImages()
|
||||||
|
{
|
||||||
|
std::list<TOOL_ACTION*> actions = ACTION_MANAGER::GetActionList();
|
||||||
|
|
||||||
|
if( actions.size() == 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using TDx::SpaceMouse::CCommand;
|
||||||
|
using TDx::SpaceMouse::CCommandSet;
|
||||||
|
|
||||||
|
// The root action set node
|
||||||
|
CCommandSet commandSet( "EDA_3D_CANVAS", "3D Viewer" );
|
||||||
|
|
||||||
|
// Activate the command set
|
||||||
|
NAV_3D::PutActiveCommands( commandSet.GetId() );
|
||||||
|
|
||||||
|
// temporary store for the categories
|
||||||
|
CATEGORY_STORE categoryStore;
|
||||||
|
|
||||||
|
std::vector<TDx::CImage> vImages;
|
||||||
|
|
||||||
|
// add the action set to the category_store
|
||||||
|
categoryStore.insert( categoryStore.end(), CATEGORY_STORE::value_type( ".", &commandSet ) );
|
||||||
|
|
||||||
|
std::list<TOOL_ACTION*>::const_iterator it;
|
||||||
|
|
||||||
|
for( it = actions.begin(); it != actions.end(); ++it )
|
||||||
|
{
|
||||||
|
const TOOL_ACTION* action = *it;
|
||||||
|
std::string label = action->GetMenuLabel().ToStdString();
|
||||||
|
|
||||||
|
if( label.empty() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string name = action->GetName();
|
||||||
|
|
||||||
|
// Do no export commands for the pcbnew app.
|
||||||
|
if( name.rfind( "pcbnew.", 0 ) == 0 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exclude commands which can't be used in the footprint properties.
|
||||||
|
if( name.rfind( "3DViewer.Control.pivotCenter", 0 ) == 0
|
||||||
|
|| name.rfind( "3DViewer.Control.material", 0 ) == 0
|
||||||
|
|| name.rfind( "3DViewer.Control.attribute", 0 ) == 0
|
||||||
|
|| name.rfind( "3DViewer.Control.show", 0 ) == 0 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string strCategory = action->GetToolName();
|
||||||
|
CATEGORY_STORE::iterator iter = categoryStore.find( strCategory );
|
||||||
|
|
||||||
|
if( iter == categoryStore.end() )
|
||||||
|
{
|
||||||
|
iter = add_category( std::move( strCategory ), categoryStore );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string description = action->GetDescription().ToStdString();
|
||||||
|
|
||||||
|
// Arbitrary 8-bit data stream
|
||||||
|
wxMemoryOutputStream imageStream;
|
||||||
|
|
||||||
|
if( action->GetIcon() != BITMAPS::INVALID_BITMAP )
|
||||||
|
{
|
||||||
|
wxImage image = KiBitmap( action->GetIcon() ).ConvertToImage();
|
||||||
|
image.SaveFile( imageStream, wxBitmapType::wxBITMAP_TYPE_PNG );
|
||||||
|
image.Destroy();
|
||||||
|
|
||||||
|
if( imageStream.GetSize() )
|
||||||
|
{
|
||||||
|
wxStreamBuffer* streamBuffer = imageStream.GetOutputStreamBuffer();
|
||||||
|
TDx::CImage tdxImage = TDx::CImage::FromData( "", 0, name.c_str() );
|
||||||
|
tdxImage.AssignImage( std::string( reinterpret_cast<const char*>(
|
||||||
|
streamBuffer->GetBufferStart() ),
|
||||||
|
streamBuffer->GetBufferSize() ),
|
||||||
|
0 );
|
||||||
|
|
||||||
|
wxLogTrace( m_logTrace, wxT( "Adding image for : %s" ), name );
|
||||||
|
vImages.push_back( std::move( tdxImage ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLogTrace( m_logTrace, wxT( "Inserting command: %s, description: %s, in category: %s" ),
|
||||||
|
name, description, iter->first );
|
||||||
|
|
||||||
|
iter->second->push_back(
|
||||||
|
CCommand( std::move( name ), std::move( label ), std::move( description ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
NAV_3D::AddCommandSet( commandSet );
|
||||||
|
NAV_3D::AddImages( vImages );
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 3Dconnexion
|
||||||
|
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* 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 nl_footprint_properties_plugin_impl.h
|
||||||
|
* @brief declaration of the nl_footprint_properties_plugin_impl class
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL_H_
|
||||||
|
#define NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL_H_
|
||||||
|
|
||||||
|
#include "nl_3d_viewer_plugin_impl.h"
|
||||||
|
// TDxWare SDK.
|
||||||
|
#include <SpaceMouse/CNavigation3D.hpp>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class that adjusts NL_3D_VIEWER_PLUGIN_IMPL implementation for 3D Model preview in footprint properties dialog.
|
||||||
|
*/
|
||||||
|
class NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL : public NL_3D_VIEWER_PLUGIN_IMPL
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Initializes a new instance of the NL_FOOTPRINT_PROPERTIES_PLUGIN.
|
||||||
|
*
|
||||||
|
* @param aCanvas is the viewport to be navigated.
|
||||||
|
*/
|
||||||
|
NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL( EDA_3D_CANVAS* aCanvas );
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Get Footprint 3D Model extents.
|
||||||
|
*
|
||||||
|
* @param extents is the box around the 3D model.
|
||||||
|
*/
|
||||||
|
long GetModelExtents( navlib::box_t& extents ) const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export the invocable actions and images to the 3Dconnexion UI.
|
||||||
|
*/
|
||||||
|
void exportCommandsAndImages() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Trace mask used to enable or disable the trace output of this class.
|
||||||
|
* The debug output can be turned on by setting the WXTRACE environment variable to
|
||||||
|
* "KI_TRACE_NL_FOOTPRINT_PROPERTIES_PLUGIN". See the wxWidgets documentation on wxLogTrace for
|
||||||
|
* more information.
|
||||||
|
*/
|
||||||
|
static const wxChar* m_logTrace;
|
||||||
|
};
|
||||||
|
#endif // NL_FOOTPRINT_PROPERTIES_PLUGIN_IMPL_H_
|
|
@ -45,6 +45,8 @@
|
||||||
#include <eda_3d_viewer_settings.h>
|
#include <eda_3d_viewer_settings.h>
|
||||||
#include <board_design_settings.h>
|
#include <board_design_settings.h>
|
||||||
|
|
||||||
|
#include <3d_navlib/nl_footprint_properties_plugin.h>
|
||||||
|
|
||||||
PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAME* aFrame,
|
PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAME* aFrame,
|
||||||
FOOTPRINT* aFootprint,
|
FOOTPRINT* aFootprint,
|
||||||
std::vector<FP_3DMODEL>* aParentModelList ) :
|
std::vector<FP_3DMODEL>* aParentModelList ) :
|
||||||
|
@ -127,6 +129,9 @@ PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAM
|
||||||
m_boardAdapter, m_currentCamera,
|
m_boardAdapter, m_currentCamera,
|
||||||
PROJECT_PCB::Get3DCacheManager( &aFrame->Prj() ) );
|
PROJECT_PCB::Get3DCacheManager( &aFrame->Prj() ) );
|
||||||
|
|
||||||
|
m_spaceMouse = new NL_FOOTPRINT_PROPERTIES_PLUGIN( m_previewPane );
|
||||||
|
m_spaceMouse->SetFocus( true );
|
||||||
|
|
||||||
m_boardAdapter.SetBoard( m_dummyBoard );
|
m_boardAdapter.SetBoard( m_dummyBoard );
|
||||||
m_boardAdapter.m_IsBoardView = false;
|
m_boardAdapter.m_IsBoardView = false;
|
||||||
m_boardAdapter.m_IsPreviewer = true; // Force display 3D models, regardless the 3D viewer options
|
m_boardAdapter.m_IsPreviewer = true; // Force display 3D models, regardless the 3D viewer options
|
||||||
|
@ -163,6 +168,8 @@ PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAM
|
||||||
aFrame->Connect( EDA_EVT_UNITS_CHANGED,
|
aFrame->Connect( EDA_EVT_UNITS_CHANGED,
|
||||||
wxCommandEventHandler( PANEL_PREVIEW_3D_MODEL::onUnitsChanged ),
|
wxCommandEventHandler( PANEL_PREVIEW_3D_MODEL::onUnitsChanged ),
|
||||||
nullptr, this );
|
nullptr, this );
|
||||||
|
|
||||||
|
Bind( wxCUSTOM_PANEL_SHOWN_EVENT, &PANEL_PREVIEW_3D_MODEL::onPanelShownEvent, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,6 +179,7 @@ PANEL_PREVIEW_3D_MODEL::~PANEL_PREVIEW_3D_MODEL()
|
||||||
if( m_boardAdapter.m_Cfg )
|
if( m_boardAdapter.m_Cfg )
|
||||||
m_boardAdapter.m_Cfg->m_Render = m_initialRender;
|
m_boardAdapter.m_Cfg->m_Render = m_initialRender;
|
||||||
|
|
||||||
|
delete m_spaceMouse;
|
||||||
delete m_dummyBoard;
|
delete m_dummyBoard;
|
||||||
delete m_previewPane;
|
delete m_previewPane;
|
||||||
}
|
}
|
||||||
|
@ -610,6 +618,17 @@ void PANEL_PREVIEW_3D_MODEL::onUnitsChanged( wxCommandEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PANEL_PREVIEW_3D_MODEL::onPanelShownEvent( wxCommandEvent& aEvent )
|
||||||
|
{
|
||||||
|
if( m_spaceMouse != nullptr )
|
||||||
|
{
|
||||||
|
m_spaceMouse->SetFocus( static_cast<bool>( aEvent.GetInt() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
aEvent.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PANEL_PREVIEW_3D_MODEL::UpdateDummyFootprint( bool aReloadRequired )
|
void PANEL_PREVIEW_3D_MODEL::UpdateDummyFootprint( bool aReloadRequired )
|
||||||
{
|
{
|
||||||
m_dummyFootprint->Models().clear();
|
m_dummyFootprint->Models().clear();
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <3d_canvas/eda_3d_canvas.h>
|
#include <3d_canvas/eda_3d_canvas.h>
|
||||||
#include <3d_viewer_id.h>
|
#include <3d_viewer_id.h>
|
||||||
#include <3d_rendering/track_ball.h>
|
#include <3d_rendering/track_ball.h>
|
||||||
|
#include <wx/event.h>
|
||||||
|
|
||||||
// Define min and max parameter values
|
// Define min and max parameter values
|
||||||
#define MAX_SCALE 10000.0
|
#define MAX_SCALE 10000.0
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
#define OFFSET_INCREMENT_MIL 25.0
|
#define OFFSET_INCREMENT_MIL 25.0
|
||||||
#define OFFSET_INCREMENT_MIL_FINE 5.0
|
#define OFFSET_INCREMENT_MIL_FINE 5.0
|
||||||
|
|
||||||
|
wxDECLARE_EVENT( wxCUSTOM_PANEL_SHOWN_EVENT, wxCommandEvent );
|
||||||
|
|
||||||
// Declared classes to create pointers
|
// Declared classes to create pointers
|
||||||
class WX_INFOBAR;
|
class WX_INFOBAR;
|
||||||
|
@ -60,6 +62,7 @@ class FILENAME_RESOLVER;
|
||||||
class BOARD;
|
class BOARD;
|
||||||
class BOARD_ADAPTER;
|
class BOARD_ADAPTER;
|
||||||
class FOOTPRINT;
|
class FOOTPRINT;
|
||||||
|
class NL_FOOTPRINT_PROPERTIES_PLUGIN;
|
||||||
|
|
||||||
class PANEL_PREVIEW_3D_MODEL: public EDA_3D_BOARD_HOLDER, public TOOLS_HOLDER, public PANEL_PREVIEW_3D_MODEL_BASE
|
class PANEL_PREVIEW_3D_MODEL: public EDA_3D_BOARD_HOLDER, public TOOLS_HOLDER, public PANEL_PREVIEW_3D_MODEL_BASE
|
||||||
{
|
{
|
||||||
|
@ -139,6 +142,7 @@ private:
|
||||||
void doIncrementOffset( wxSpinEvent& aEvent, double aSign );
|
void doIncrementOffset( wxSpinEvent& aEvent, double aSign );
|
||||||
|
|
||||||
void onUnitsChanged( wxCommandEvent& aEvent );
|
void onUnitsChanged( wxCommandEvent& aEvent );
|
||||||
|
void onPanelShownEvent( wxCommandEvent& aEvent );
|
||||||
|
|
||||||
wxString formatScaleValue( double aValue );
|
wxString formatScaleValue( double aValue );
|
||||||
wxString formatRotationValue( double aValue );
|
wxString formatRotationValue( double aValue );
|
||||||
|
@ -211,6 +215,8 @@ private:
|
||||||
bool m_bodyStyleShowAll; /// true if the board body is show
|
bool m_bodyStyleShowAll; /// true if the board body is show
|
||||||
/// The 3d viewer Render initial settings (must be saved and restored)
|
/// The 3d viewer Render initial settings (must be saved and restored)
|
||||||
EDA_3D_VIEWER_SETTINGS::RENDER_SETTINGS m_initialRender;
|
EDA_3D_VIEWER_SETTINGS::RENDER_SETTINGS m_initialRender;
|
||||||
|
|
||||||
|
NL_FOOTPRINT_PROPERTIES_PLUGIN* m_spaceMouse;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PANEL_PREVIEW_3D_MODEL_H
|
#endif // PANEL_PREVIEW_3D_MODEL_H
|
||||||
|
|
|
@ -54,6 +54,8 @@ enum MODELS_TABLE_COLUMNS
|
||||||
COL_SHOWN = 2
|
COL_SHOWN = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wxDEFINE_EVENT( wxCUSTOM_PANEL_SHOWN_EVENT, wxCommandEvent );
|
||||||
|
|
||||||
PANEL_FP_PROPERTIES_3D_MODEL::PANEL_FP_PROPERTIES_3D_MODEL( PCB_BASE_EDIT_FRAME* aFrame,
|
PANEL_FP_PROPERTIES_3D_MODEL::PANEL_FP_PROPERTIES_3D_MODEL( PCB_BASE_EDIT_FRAME* aFrame,
|
||||||
FOOTPRINT* aFootprint,
|
FOOTPRINT* aFootprint,
|
||||||
DIALOG_SHIM* aDialogParent,
|
DIALOG_SHIM* aDialogParent,
|
||||||
|
@ -117,6 +119,10 @@ PANEL_FP_PROPERTIES_3D_MODEL::PANEL_FP_PROPERTIES_3D_MODEL( PCB_BASE_EDIT_FRAME*
|
||||||
m_button3DShapeAdd->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
|
m_button3DShapeAdd->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
|
||||||
m_button3DShapeBrowse->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
|
m_button3DShapeBrowse->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
|
||||||
m_button3DShapeRemove->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
|
m_button3DShapeRemove->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
|
||||||
|
|
||||||
|
Bind( wxEVT_SHOW, &PANEL_FP_PROPERTIES_3D_MODEL::onShowEvent, this );
|
||||||
|
m_parentDialog->Bind( wxEVT_ACTIVATE, &PANEL_FP_PROPERTIES_3D_MODEL::onDialogActivateEvent,
|
||||||
|
this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,6 +131,9 @@ PANEL_FP_PROPERTIES_3D_MODEL::~PANEL_FP_PROPERTIES_3D_MODEL()
|
||||||
// Delete the GRID_TRICKS.
|
// Delete the GRID_TRICKS.
|
||||||
m_modelsGrid->PopEventHandler( true );
|
m_modelsGrid->PopEventHandler( true );
|
||||||
|
|
||||||
|
// Unbind OnShowEvent to prevent unnecessary event handling.
|
||||||
|
Unbind( wxEVT_SHOW, &PANEL_FP_PROPERTIES_3D_MODEL::onShowEvent, this );
|
||||||
|
|
||||||
// free the memory used by all models, otherwise models which were
|
// free the memory used by all models, otherwise models which were
|
||||||
// browsed but not used would consume memory
|
// browsed but not used would consume memory
|
||||||
PROJECT_PCB::Get3DCacheManager( &m_frame->Prj() )->FlushCache( false );
|
PROJECT_PCB::Get3DCacheManager( &m_frame->Prj() )->FlushCache( false );
|
||||||
|
@ -139,6 +148,7 @@ bool PANEL_FP_PROPERTIES_3D_MODEL::TransferDataToWindow()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PANEL_FP_PROPERTIES_3D_MODEL::TransferDataFromWindow()
|
bool PANEL_FP_PROPERTIES_3D_MODEL::TransferDataFromWindow()
|
||||||
{
|
{
|
||||||
// Only commit changes in the editor, not the models
|
// Only commit changes in the editor, not the models
|
||||||
|
@ -510,3 +520,27 @@ void PANEL_FP_PROPERTIES_3D_MODEL::OnUpdateUI( wxUpdateUIEvent& event )
|
||||||
{
|
{
|
||||||
m_button3DShapeRemove->Enable( m_modelsGrid->GetNumberRows() > 0 );
|
m_button3DShapeRemove->Enable( m_modelsGrid->GetNumberRows() > 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PANEL_FP_PROPERTIES_3D_MODEL::onShowEvent( wxShowEvent& aEvent )
|
||||||
|
{
|
||||||
|
postCustomPanelShownEventWithPredicate( static_cast<int>( aEvent.IsShown() ) );
|
||||||
|
aEvent.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PANEL_FP_PROPERTIES_3D_MODEL::onDialogActivateEvent( wxActivateEvent& aEvent )
|
||||||
|
{
|
||||||
|
postCustomPanelShownEventWithPredicate( aEvent.GetActive()
|
||||||
|
&& m_previewPane->IsShownOnScreen() );
|
||||||
|
aEvent.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PANEL_FP_PROPERTIES_3D_MODEL::postCustomPanelShownEventWithPredicate( bool predicate )
|
||||||
|
{
|
||||||
|
wxCommandEvent event( wxCUSTOM_PANEL_SHOWN_EVENT );
|
||||||
|
event.SetEventObject( m_previewPane );
|
||||||
|
event.SetInt( static_cast<int>( predicate ) );
|
||||||
|
m_previewPane->ProcessWindowEvent( event );
|
||||||
|
}
|
||||||
|
|
|
@ -86,6 +86,13 @@ private:
|
||||||
|
|
||||||
void select3DModel( int aModelIdx );
|
void select3DModel( int aModelIdx );
|
||||||
|
|
||||||
|
virtual void onDialogActivateEvent( wxActivateEvent& aEvent );
|
||||||
|
virtual void onShowEvent( wxShowEvent& aEvent );
|
||||||
|
|
||||||
|
// Wrapper on creating and posting custom event
|
||||||
|
void postCustomPanelShownEventWithPredicate( bool predicate );
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DIALOG_SHIM* m_parentDialog;
|
DIALOG_SHIM* m_parentDialog;
|
||||||
PCB_BASE_EDIT_FRAME* m_frame;
|
PCB_BASE_EDIT_FRAME* m_frame;
|
||||||
|
|
Loading…
Reference in New Issue