Implemented new 3D file selector with preview

This commit is contained in:
Cirilo Bernardo 2016-01-25 15:55:36 +11:00
parent ff07ad3f05
commit 3eca3fe75d
13 changed files with 329 additions and 229 deletions

View File

@ -28,7 +28,7 @@
#include "plugins/3dapi/ifsg_api.h"
#include "3d_cache_dialogs.h"
#include "dlg_3d_pathconfig.h"
#include "dialog_select_3dmodel.h"
#include "dlg_select_3dmodel.h"
bool S3D::Select3DModel( wxWindow* aParent, S3D_CACHE* aCache,
@ -37,33 +37,11 @@ bool S3D::Select3DModel( wxWindow* aParent, S3D_CACHE* aCache,
if( NULL == aModel )
return false;
// set the default values to ensure reasonable settings
// even if the user cancels the operation
aModel->scale.x = 1.0;
aModel->scale.y = 1.0;
aModel->scale.z = 1.0;
aModel->rotation.x = 0.0;
aModel->rotation.y = 0.0;
aModel->rotation.z = 0.0;
aModel->offset = aModel->rotation;
aModel->filename.empty();
DLG_SEL_3DMODEL* dm = new DLG_SEL_3DMODEL( aParent, aCache,
DLG_SELECT_3DMODEL* dm = new DLG_SELECT_3DMODEL( aParent, aCache, aModel,
prevModelSelectDir, prevModelWildcard );
if( wxID_OK == dm->ShowModal() )
{
// retrieve the data entry for the 3D model
dm->GetModelData( aModel );
// remember the previous settings
prevModelWildcard = dm->GetFilterIndex();
wxFileName name( dm->GetPath() );
name.Normalize();
prevModelSelectDir = name.GetPath();
delete dm;
return true;
}

View File

@ -1,99 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* 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 2
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <iostream>
#include "3d_cache.h"
#include "dialog_select_3dmodel.h"
#include "panel_prev_model.h"
static S3D_CACHE* mm = NULL;
static wxFileDialog* fm = NULL;
static wxWindow* mkPreviewPanel( wxWindow* aParent )
{
PANEL_PREV_3D* pp = new PANEL_PREV_3D( aParent, true );
pp->SetModelManager( mm );
pp->SetFileSelectorDlg( fm );
// ensure reasonable defaults when the dialog starts
S3D_INFO mdat;
mdat.scale.x = 1.0;
mdat.scale.y = 1.0;
mdat.scale.z = 1.0;
pp->SetModelData( &mdat );
return (wxWindow*)pp;
}
DLG_SEL_3DMODEL::DLG_SEL_3DMODEL( wxWindow* aParent, S3D_CACHE* aManager,
const wxString& aDefaultDir, int aFilterIndex )
: wxFileDialog( aParent, _( "Select a 3D Model" ), aDefaultDir )
{
m_manager = aManager;
mm = aManager;
fm = this;
long ws = GetWindowStyleFlag();
ws |= wxFD_FILE_MUST_EXIST;
SetWindowStyleFlag( ws );
SetExtraControlCreator( mkPreviewPanel );
if( NULL != m_manager )
{
std::list< wxString > const* fl = m_manager->GetFileFilters();
std::list< wxString >::const_iterator sL = fl->begin();
std::list< wxString >::const_iterator eL = fl->end();
wxString filter;
while( sL != eL )
{
filter.Append( *sL );
++sL;
if( sL != eL )
filter.Append( wxT( "|" ) );
}
if( !filter.empty() )
SetWildcard( filter );
if( aFilterIndex >= 0 && aFilterIndex < (int)fl->size() )
SetFilterIndex( aFilterIndex );
}
return;
}
void DLG_SEL_3DMODEL::GetModelData( S3D_INFO* aModel )
{
PANEL_PREV_3D* pp = (PANEL_PREV_3D*)GetExtraControl();
if( pp )
pp->GetModelData( aModel );
return;
}

View File

@ -22,6 +22,7 @@
*/
#include <wx/msgdlg.h>
#include "3d_cache/dialogs/dlg_3d_pathconfig.h"
#include "3d_cache/3d_filename_resolver.h"

View File

@ -9,7 +9,7 @@
///////////////////////////////////////////////////////////////////////////
DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
@ -79,6 +79,7 @@ DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID i
this->SetSizer( bSizer1 );
this->Layout();
bSizer1->Fit( this );
this->Centre( wxBOTH );

View File

@ -26,7 +26,7 @@
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Frame" expanded="1">
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
@ -44,15 +44,14 @@
<property name="minimum_size"></property>
<property name="name">DLG_3D_PATH_CONFIG_BASE</property>
<property name="pos"></property>
<property name="size">593,300</property>
<property name="style">wxDEFAULT_FRAME_STYLE</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="size"></property>
<property name="style">wxDEFAULT_DIALOG_STYLE</property>
<property name="subclass"></property>
<property name="title">3D Search Path Configuration</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<property name="xrc_skip_sizer">1</property>
<property name="window_style"></property>
<event name="OnActivate"></event>
<event name="OnActivateApp"></event>
<event name="OnAuiFindManager"></event>
@ -68,6 +67,7 @@
<event name="OnHibernate"></event>
<event name="OnIconize"></event>
<event name="OnIdle"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>

View File

@ -11,9 +11,6 @@
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
class DIALOG_SHIM;
#include "dialog_shim.h"
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
@ -22,7 +19,7 @@ class DIALOG_SHIM;
#include <wx/gdicmn.h>
#include <wx/sizer.h>
#include <wx/button.h>
#include <wx/frame.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
@ -30,7 +27,7 @@ class DIALOG_SHIM;
///////////////////////////////////////////////////////////////////////////////
/// Class DLG_3D_PATH_CONFIG_BASE
///////////////////////////////////////////////////////////////////////////////
class DLG_3D_PATH_CONFIG_BASE : public DIALOG_SHIM
class DLG_3D_PATH_CONFIG_BASE : public wxDialog
{
private:
@ -52,8 +49,7 @@ class DLG_3D_PATH_CONFIG_BASE : public DIALOG_SHIM
public:
DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("3D Search Path Configuration"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 593,300 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("3D Search Path Configuration"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
~DLG_3D_PATH_CONFIG_BASE();
};

View File

@ -0,0 +1,212 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* 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 2
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "dlg_select_3dmodel.h"
#include "project.h"
#include "3d_cache/3d_info.h"
#include "3d_cache/3d_cache.h"
#include "3d_cache/dialogs/panel_prev_model.h"
#define ID_FILE_TREE 1000
wxBEGIN_EVENT_TABLE( DLG_SELECT_3DMODEL, wxDialog )
EVT_DIRCTRL_SELECTIONCHANGED( ID_FILE_TREE, DLG_SELECT_3DMODEL::OnSelectionChanged )
EVT_DIRCTRL_FILEACTIVATED( ID_FILE_TREE, DLG_SELECT_3DMODEL::OnFileActivated )
wxEND_EVENT_TABLE()
DLG_SELECT_3DMODEL::DLG_SELECT_3DMODEL( wxWindow* aParent, S3D_CACHE* aCacheManager,
S3D_INFO* aModelItem, wxString& prevModelSelectDir, int& prevModelWildcard ) :
wxDialog( aParent, wxID_ANY, _( "Select 3D Model" ), wxDefaultPosition,
wxSize( 500,200 ), wxCAPTION | wxRESIZE_BORDER | wxCLOSE_BOX
| wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxSYSTEM_MENU ),
m_model( aModelItem ), m_cache( aCacheManager ), m_previousDir( prevModelSelectDir ),
m_previousFilterIndex( prevModelWildcard )
{
this->SetSizeHints( wxSize( 500,200 ), wxDefaultSize );
if( NULL != m_cache )
m_resolver = m_cache->GetResolver();
else
m_resolver = NULL;
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxVERTICAL );
// set to NULL to avoid segfaults when m_FileTree is instantiated
// and wxGenericDirCtrl events are posted
m_preview = NULL;
m_FileTree = new wxGenericDirCtrl( this, ID_FILE_TREE, wxEmptyString, wxDefaultPosition,
wxSize( 500,300 ), wxDIRCTRL_3D_INTERNAL | wxDIRCTRL_EDIT_LABELS
| wxDIRCTRL_SELECT_FIRST | wxDIRCTRL_SHOW_FILTERS|wxSUNKEN_BORDER, wxEmptyString, 0 );
m_FileTree->ShowHidden( false );
m_FileTree->SetMinSize( wxSize( 500,150 ) );
m_FileTree->SetLabel( wxT( "3D_MODEL_SELECTOR" ) );
if( prevModelSelectDir.empty() )
{
if( NULL != m_resolver )
{
const std::list< S3D_ALIAS >* ap = m_resolver->GetPaths();
if( !ap->empty() )
{
prevModelSelectDir = ap->front().m_pathexp;
m_FileTree->SetPath( prevModelSelectDir );
m_FileTree->GetPath();
}
}
}
else
{
m_FileTree->SetPath( prevModelSelectDir );
m_FileTree->GetPath();
}
bSizer2->Add( m_FileTree, 1, wxEXPAND | wxALL, 5 );
bSizer1->Add( bSizer2, 1, wxEXPAND, 5 );
// m_preview must me instantiated after m_FileTree or else it will not
// function as desired due to the constructor depending on the existence
// of m_FileTree to determine the previewer's configuration
wxBoxSizer* previewSizer;
previewSizer = new wxBoxSizer( wxVERTICAL );
m_preview = new PANEL_PREV_3D( this, m_cache );
previewSizer->Add( m_preview, 1, wxEXPAND | wxALL, 5 );
bSizer1->Add( previewSizer, 2, wxEXPAND, 5 );
// create the filter list
if( NULL != m_cache )
{
std::list< wxString > const* fl = m_cache->GetFileFilters();
std::list< wxString >::const_iterator sL = fl->begin();
std::list< wxString >::const_iterator eL = fl->end();
wxString filter;
while( sL != eL )
{
filter.Append( *sL );
++sL;
if( sL != eL )
filter.Append( wxT( "|" ) );
}
if( !filter.empty() )
m_FileTree->SetFilter( filter );
else
m_FileTree->SetFilter( wxT( "*.*" ) );
if( prevModelWildcard >= 0 && prevModelWildcard < (int)fl->size() )
m_FileTree->SetFilterIndex( prevModelWildcard );
else
{
prevModelWildcard = 0;
m_FileTree->SetFilterIndex( 0 );
}
}
else
{
m_FileTree->SetFilter( wxT( "*.*" ) );
prevModelWildcard = 0;
m_FileTree->SetFilterIndex( 0 );
}
wxButton* btn_OK = new wxButton( this, wxID_OK, _T( "OK" ) );
wxButton* btn_Cancel = new wxButton( this, wxID_CANCEL, _T( "Cancel" ) );
wxSizer* hSizer1 = new wxBoxSizer( wxHORIZONTAL );
hSizer1->Add( btn_OK, 0, wxALL | wxALIGN_RIGHT, 5 );
hSizer1->Add( btn_Cancel, 0, wxALL | wxALIGN_RIGHT, 5 );
bSizer1->Add( hSizer1, 0 );
this->SetSizerAndFit( bSizer1 );
this->Layout();
this->Centre( wxBOTH );
}
bool DLG_SELECT_3DMODEL::TransferDataFromWindow()
{
if( NULL == m_model || NULL == m_FileTree )
return true;
m_model->scale.x = 1.0;
m_model->scale.y = 1.0;
m_model->scale.z = 1.0;
m_model->rotation.x = 0.0;
m_model->rotation.y = 0.0;
m_model->rotation.z = 0.0;
m_model->offset = m_model->rotation;
m_model->filename.empty();
wxString fname = m_FileTree->GetFilePath();
if( fname.empty() )
return true;
m_previousDir = m_FileTree->GetPath();
m_previousFilterIndex = m_FileTree->GetFilterIndex();
m_preview->GetModelData( m_model );
return true;
}
void DLG_SELECT_3DMODEL::OnSelectionChanged( wxTreeEvent& event )
{
if( NULL != m_preview )
m_preview->UpdateModelName( m_FileTree->GetFilePath() );
event.Skip();
return;
}
void DLG_SELECT_3DMODEL::OnFileActivated( wxTreeEvent& event )
{
if( NULL != m_preview )
m_preview->UpdateModelName( m_FileTree->GetFilePath() );
event.Skip();
SetEscapeId( wxID_OK );
Close();
return;
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* Copyright (C) 2016 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -22,30 +22,47 @@
*/
/**
* @file dialog_select_3dmodel.h
* @file dlg_select_3dmodel.h
* creates a dialog to select 3D model files
*/
#ifndef DIALOG_SELECT_3DMODEL_H
#define DIALOG_SELECT_3DMODEL_H
#ifndef DLG_SELECT_3DMODEL_H
#define DLG_SELECT_3DMODEL_H
#include <wx/wx.h>
#include <wx/filedlg.h>
#include <wx/dirctrl.h>
#include <wx/sizer.h>
#include <wx/frame.h>
class S3D_CACHE;
struct S3D_INFO;
class S3D_CACHE;
class S3D_FILENAME_RESOLVER;
class PANEL_PREV_3D;
//class wxGenericDirCtrl;
class DLG_SEL_3DMODEL : public wxFileDialog
class DLG_SELECT_3DMODEL : public wxDialog
{
private:
S3D_CACHE* m_manager;
S3D_INFO* m_model; // data for the selected model
S3D_CACHE* m_cache; // cache manager
S3D_FILENAME_RESOLVER* m_resolver; // 3D filename resolver
wxString& m_previousDir;
int& m_previousFilterIndex;
wxGenericDirCtrl* m_FileTree;
PANEL_PREV_3D* m_preview;
public:
DLG_SEL_3DMODEL( wxWindow* aParent, S3D_CACHE* aManager,
const wxString& aDefaultDir, int aFilterIndex );
DLG_SELECT_3DMODEL( wxWindow* aParent, S3D_CACHE* aCacheManager, S3D_INFO* aModelItem,
wxString& prevModelSelectDir, int& prevModelWildcard );
// Retrieve model data
void GetModelData( S3D_INFO* aModel );
bool TransferDataFromWindow();
void OnSelectionChanged( wxTreeEvent& event );
void OnFileActivated( wxTreeEvent& event );
wxDECLARE_EVENT_TABLE();
};
#endif // DIALOG_SELECT_3DMODEL_H
#endif // DLG_SELECT_3DMODEL_H

View File

@ -31,13 +31,15 @@
#include <wx/choice.h>
#include <wx/filename.h>
#include <wx/glcanvas.h>
#include <wx/dirctrl.h>
#include <glm/gtx/transform.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include "project.h"
#include "3d_cache.h"
#include "3d_info.h"
#include "3d_filename_resolver.h"
#include "plugins/3dapi/ifsg_api.h"
#include "panel_prev_model.h"
#include "dialog_select_3dmodel.h"
#include "3d_cache_dialogs.h"
@ -107,11 +109,14 @@ wxBEGIN_EVENT_TABLE( PANEL_PREV_3D, wxPanel)
wxEND_EVENT_TABLE()
PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, bool hasFileSelector ) :
wxPanel( aParent, -1 )
PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, S3D_CACHE* aCacheManager ) :
wxPanel( aParent, -1 ), m_ModelManager( aCacheManager )
{
m_ModelManager = NULL;
m_FileDlg = NULL;
if( NULL != m_ModelManager )
m_resolver = m_ModelManager->GetResolver();
else
m_resolver = NULL;
canvas = NULL;
model = NULL;
xscale = NULL;
@ -130,19 +135,19 @@ PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, bool hasFileSelector ) :
wxBoxSizer* hboxDirChoice = NULL;
dirChoices = NULL;
if( hasFileSelector )
m_FileTree = NULL;
if( NULL != aParent )
m_FileTree = (wxGenericDirCtrl*)
aParent->FindWindowByLabel( wxT( "3D_MODEL_SELECTOR" ), aParent );
if( NULL != m_FileTree )
{
hboxDirChoice = new wxBoxSizer( wxHORIZONTAL );
dirChoices = new wxChoice( this, ID_SET_DIR, wxDefaultPosition,
wxSize( 320, 20 ) );
dirChoices->SetMinSize( wxSize( 320, 12 ) );
#ifdef _WIN32
// Note: On Win32 the native selector box will truncate text
// if the text is too long.
dirChoices->SetMinSize( wxSize( 450, -1 ) );
#endif
wxStaticText* stDirChoice = new wxStaticText( this, -1, _( "Paths:" ) );
wxButton* usePath = new wxButton( this, ID_SET_DIR, _( "Change" ) );
wxButton* cfgPaths = new wxButton( this, ID_CFG_PATHS, _( "Configure Paths" ) );
@ -298,18 +303,23 @@ PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, bool hasFileSelector ) :
mainBox->Add( vbox, 1, wxEXPAND | wxALL, 5 );
if( hasFileSelector )
if( NULL != m_FileTree )
{
// NOTE: if/when the FIle Selector preview is implemented
// NOTE: if/when the File Selector preview is implemented
// we may need to hide the orientation boxes to ensure the
// users have sufficient display area for the browser.
// hbox->Hide( vboxOrient, true );
// XXX -
// NOTE: for now we always suppress the preview and model orientation
// panels while in the file selector
mainBox->Hide( vbox, true );
//mainBox->Hide( vbox, true );
hbox->Hide( vboxOrient, true );
vboxPrev->Hide( hbBT, true );
vboxPrev->Hide( hbBB, true );
}
updateDirChoiceList();
SetSizerAndFit( mainBox );
Centre();
@ -332,45 +342,32 @@ PANEL_PREV_3D::~PANEL_PREV_3D()
}
void PANEL_PREV_3D::SetModelManager( S3D_CACHE* aModelManager )
{
m_ModelManager = aModelManager;
updateDirChoiceList();
return;
}
void PANEL_PREV_3D::SetFileSelectorDlg( wxFileDialog* aFileDlg )
{
m_FileDlg = aFileDlg;
updateDirChoiceList();
return;
}
void PANEL_PREV_3D::updateDirChoiceList( void )
{
if( NULL == m_FileDlg || NULL == m_ModelManager || NULL == dirChoices )
if( NULL == m_FileTree || NULL == m_ModelManager || NULL == dirChoices )
return;
std::list< S3D_ALIAS > const* md = m_ModelManager->GetResolver()->GetPaths();
std::list< S3D_ALIAS >::const_iterator sL = md->begin();
std::list< S3D_ALIAS >::const_iterator eL = md->end();
std::vector< wxString > cl;
while( sL != eL )
if( NULL != m_resolver )
{
if( !sL->m_pathexp.empty() && !sL->m_duplicate )
cl.push_back( sL->m_pathexp );
std::list< S3D_ALIAS > const* md = m_resolver->GetPaths();
std::list< S3D_ALIAS >::const_iterator sL = md->begin();
std::list< S3D_ALIAS >::const_iterator eL = md->end();
std::vector< wxString > cl;
++sL;
}
while( sL != eL )
{
if( !sL->m_pathexp.empty() && !sL->m_duplicate )
cl.push_back( sL->m_pathexp );
if( !cl.empty() )
{
dirChoices->Clear();
dirChoices->Append( (int)cl.size(), &cl[0] );
dirChoices->Select( 0 );
++sL;
}
if( !cl.empty() )
{
dirChoices->Clear();
dirChoices->Append( (int)cl.size(), &cl[0] );
dirChoices->Select( 0 );
}
}
return;
@ -379,10 +376,10 @@ void PANEL_PREV_3D::updateDirChoiceList( void )
void PANEL_PREV_3D::SetRootDir( wxCommandEvent& event )
{
if( !m_FileDlg )
if( !m_FileTree )
return;
m_FileDlg->SetDirectory( dirChoices->GetString( dirChoices->GetSelection() ) );
m_FileTree->SetPath( dirChoices->GetString( dirChoices->GetSelection() ) );
return;
}
@ -390,13 +387,8 @@ void PANEL_PREV_3D::SetRootDir( wxCommandEvent& event )
void PANEL_PREV_3D::Cfg3DPaths( wxCommandEvent& event )
{
if( !m_FileDlg || !m_ModelManager )
return;
if( S3D::Configure3DPaths( this, m_ModelManager->GetResolver() ) )
if( S3D::Configure3DPaths( this, m_resolver ) )
updateDirChoiceList();
return;
}
@ -414,9 +406,9 @@ void PANEL_PREV_3D::View3DUpdate( wxCommandEvent& event )
std::cout << "Update 3D View\n";
// update the model filename if appropriate
if( NULL != m_FileDlg )
if( NULL != m_FileTree )
{
wxString modelName = m_FileDlg->GetCurrentlySelectedFilename();
wxString modelName = m_FileTree->GetFilePath();
UpdateModelName( modelName );
}
@ -482,7 +474,7 @@ void PANEL_PREV_3D::GetModelData( S3D_INFO* aModel )
// panel is not embedded in a file selector dialog. This conditional
// execution should be removed once the cross-platform issues are
// fixed.
if( NULL == m_FileDlg )
if( NULL == m_FileTree )
{
SGPOINT scale;
SGPOINT rotation;
@ -496,14 +488,14 @@ void PANEL_PREV_3D::GetModelData( S3D_INFO* aModel )
}
// return if we are not in file selection mode
if( NULL == m_FileDlg )
if( NULL == m_FileTree )
return;
// file selection mode: retrieve the filename and specify a
// path relative to one of the config paths
wxFileName fname = m_FileDlg->GetPath();
wxFileName fname = m_FileTree->GetFilePath();
fname.Normalize();
aModel->filename = m_ModelManager->GetResolver()->ShortenPath( fname.GetFullPath() );
aModel->filename = m_resolver->ShortenPath( fname.GetFullPath() );
return;
}
@ -523,7 +515,6 @@ void PANEL_PREV_3D::SetModelData( S3D_INFO const* aModel )
yoff->SetValue( wxString::FromDouble( aModel->offset.y ) );
zoff->SetValue( wxString::FromDouble( aModel->offset.z ) );
modelInfo = *aModel;
UpdateModelName( aModel->filename );
return;
@ -534,6 +525,8 @@ void PANEL_PREV_3D::UpdateModelName( wxString const& aModelName )
{
bool newModel = false;
modelInfo.filename = aModelName;
// if the model name is a directory simply clear the current model
if( aModelName.empty() || wxFileName::DirExists( aModelName ) )
{
@ -543,11 +536,7 @@ void PANEL_PREV_3D::UpdateModelName( wxString const& aModelName )
else
{
wxString newModelFile;
if( m_ModelManager )
newModelFile = m_ModelManager->GetResolver()->ResolvePath( aModelName );
else if( wxFileName::FileExists( aModelName ) )
newModelFile = aModelName;
newModelFile = m_resolver->ResolvePath( aModelName );
if( newModelFile.empty() )
{
@ -592,7 +581,10 @@ void PANEL_PREV_3D::UpdateModelName( wxString const& aModelName )
return;
}
model = m_ModelManager->GetModel( modelInfo.filename );
if( NULL != m_ModelManager )
model = m_ModelManager->GetModel( modelInfo.filename );
else
model = NULL;
if( NULL == model )
{
@ -685,7 +677,10 @@ void PANEL_PREV_3D::updateOrientation( wxCommandEvent &event )
canvas->Clear3DModel();
model = m_ModelManager->GetModel( modelInfo.filename );
if( NULL != m_ModelManager )
model = m_ModelManager->GetModel( modelInfo.filename );
else
model = NULL;
if( model )
{

View File

@ -40,17 +40,17 @@
#include "plugins/3dapi/c3dmodel.h"
#include "3d_cache/3d_info.h"
class S3D_CACHE;
class S3D_CACHE;
class S3D_FILENAME_RESOLVER;
class C3D_MODEL_VIEWER;
class wxGenericDirCtrl;
class PANEL_PREV_3D : public wxPanel
{
public:
PANEL_PREV_3D( wxWindow* aParent, bool hasFileSelector = false );
PANEL_PREV_3D( wxWindow* aParent, S3D_CACHE* aCacheManager );
~PANEL_PREV_3D();
void SetModelManager( S3D_CACHE* aModelManager );
void SetFileSelectorDlg( wxFileDialog* aFileDlg );
void SetRootDir( wxCommandEvent& event );
void Cfg3DPaths( wxCommandEvent& event );
// 3D views
@ -72,7 +72,8 @@ public:
private:
wxString currentModelFile;
S3D_CACHE* m_ModelManager;
wxFileDialog* m_FileDlg;
S3D_FILENAME_RESOLVER* m_resolver;
wxGenericDirCtrl* m_FileTree;
wxChoice* dirChoices;
wxTextCtrl* xscale;
wxTextCtrl* yscale;

View File

@ -56,7 +56,7 @@ set(3D-VIEWER_SRCS
${DIR_DLG}/3d_cache_dialogs.cpp
${DIR_DLG}/dlg_3d_pathconfig_base.cpp
${DIR_DLG}/dlg_3d_pathconfig.cpp
${DIR_DLG}/dialog_select_3dmodel.cpp
${DIR_DLG}/dlg_select_3dmodel.cpp
${DIR_DLG}/panel_prev_model.cpp
3d_model_viewer/c3d_model_viewer.cpp
3d_rendering/3d_render_ogl_legacy/c_ogl_3dmodel.cpp

View File

@ -70,8 +70,7 @@ DIALOG_MODULE_BOARD_EDITOR::DIALOG_MODULE_BOARD_EDITOR( PCB_EDIT_FRAME* aParent
icon.CopyFromBitmap( KiBitmap( icon_modedit_xpm ) );
SetIcon( icon );
m_PreviewPane = new PANEL_PREV_3D( m_Panel3D, false );
m_PreviewPane->SetModelManager( Prj().Get3DCacheManager() );
m_PreviewPane = new PANEL_PREV_3D( m_Panel3D, aParent->Prj().Get3DCacheManager() );
bLowerSizer3D->Add( m_PreviewPane, 1, wxEXPAND, 5 );
InitModeditProperties();

View File

@ -70,8 +70,7 @@ DIALOG_MODULE_MODULE_EDITOR::DIALOG_MODULE_MODULE_EDITOR( FOOTPRINT_EDIT_FRAME*
icon.CopyFromBitmap( KiBitmap( icon_modedit_xpm ) );
SetIcon( icon );
m_PreviewPane = new PANEL_PREV_3D( m_Panel3D, false );
m_PreviewPane->SetModelManager( Prj().Get3DCacheManager() );
m_PreviewPane = new PANEL_PREV_3D( m_Panel3D, aParent->Prj().Get3DCacheManager() );
bLowerSizer3D->Add( m_PreviewPane, 1, wxEXPAND, 5 );
m_FootprintNameCtrl->SetValidator( FILE_NAME_CHAR_VALIDATOR() );