KiCad PCB EDA Suite
dlg_select_3dmodel.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2016 Mario Luzeiro <mrluzeiro@ua.pt>
5  * Copyright (C) 2016 Cirilo Bernardo <cirilo.bernardo@gmail.com>
6  * Copyright (C) 2017-2020 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 
27 #include <set>
28 #include "dlg_select_3dmodel.h"
29 #include "project.h"
30 #include "3d_cache/3d_info.h"
31 #include "3d_cache/3d_cache.h"
32 #include "3d_cache_dialogs.h"
35 #include <filename_resolver.h>
36 #include <pcbnew/class_module.h>
37 
38 #include <wx/filedlg.h>
39 
40 #include <kiplatform/ui.h>
41 
42 
43 DLG_SELECT_3DMODEL::DLG_SELECT_3DMODEL( wxWindow* aParent, S3D_CACHE* aCacheManager,
44  MODULE_3D_SETTINGS* aModelItem, wxString& prevModelSelectDir, int& prevModelWildcard ) :
45  DLG_SELECT_3D_MODELE_BASE( aParent ),
46  m_model( aModelItem ), m_cache( aCacheManager ), m_previousDir( prevModelSelectDir ),
47  m_previousFilterIndex( prevModelWildcard )
48 {
49  if( NULL != m_cache )
51  else
52  m_resolver = NULL;
53 
54  // set to NULL to avoid segfaults when m_FileTree is instantiated
55  // and wxGenericDirCtrl events are posted
57 
60  m_cache );
61  m_modelViewer->SetMinSize( wxSize( 300, -1 ) );
62  m_Sizer3Dviewer->Add( m_modelViewer, 1, wxEXPAND, 5 );
63 
64  // create the filter list
65  if( NULL != m_cache )
66  {
67  std::list< wxString > const* fl = m_cache->GetFileFilters();
68  std::list< wxString >::const_iterator sL = fl->begin();
69 
70  // The files filter string build from list of loaded plugins:
71  wxString filter;
72 
73  // The files filter extensions only build from list of loaded plugins:
74  wxString ext_list;
75 
76  while( sL != fl->end() )
77  {
78  if( !filter.IsEmpty() )
79  filter.Append( "|" );
80 
81  filter.Append( *sL );
82 
83  if( !ext_list.IsEmpty() )
84  ext_list.Append( ";" );
85 
86  wxString ext = sL->AfterLast( '|' );
87 
88  if( ext.Len() > 3 ) // Skip *.*
89  ext_list.Append( ext );
90 
91  ++sL;
92  }
93 
94  if( !filter.empty() )
95  {
96  if( !ext_list.empty() )
97  {
98  wxString full_filter;
99  full_filter.Printf( _( "All supported files (%s)" ), ext_list );
100  full_filter << '|' << ext_list << '|' << filter;
101  m_FileTree->SetFilter( full_filter );
102  }
103  else
104  m_FileTree->SetFilter( filter );
105  }
106  else
107  m_FileTree->SetFilter( wxFileSelectorDefaultWildcardStr );
108 
109  if( prevModelWildcard >= 0 && prevModelWildcard < (int)fl->size() )
110  m_FileTree->SetFilterIndex( prevModelWildcard );
111  else
112  {
113  prevModelWildcard = 0;
114  m_FileTree->SetFilterIndex( 0 );
115  }
116  }
117  else
118  {
119  m_FileTree->SetFilter( wxFileSelectorDefaultWildcardStr );
120  prevModelWildcard = 0;
121  m_FileTree->SetFilterIndex( 0 );
122  }
123 
124  // Fix the filter box on the file selector widget so that it always shows the start of the filter
125  // string in the combobox. Otherwise it will only show the end of the string, which is empty for
126  // all but the all supported filters option.
127  wxChoice* filterBox = m_FileTree->GetFilterListCtrl();
129 
130  m_FileTree->SetPath( m_previousDir );
132 
133  m_modelViewer->Refresh();
134  m_modelViewer->SetFocus();
135 
137 }
138 
139 
141 {
142  if( !m_model || !m_FileTree )
143  return true;
144 
145  m_model->m_Scale.x = 1.0;
146  m_model->m_Scale.y = 1.0;
147  m_model->m_Scale.z = 1.0;
148 
149  m_model->m_Rotation.x = 0.0;
150  m_model->m_Rotation.y = 0.0;
151  m_model->m_Rotation.z = 0.0;
152 
154  m_model->m_Filename.clear();
155 
156  wxString name = m_FileTree->GetFilePath();
157 
158  if( name.empty() )
159  return true;
160 
161  m_previousDir = m_FileTree->GetPath();
162  m_previousFilterIndex = m_FileTree->GetFilterIndex();
163 
164  // file selection mode: retrieve the filename and specify a
165  // path relative to one of the config paths
166  wxFileName fname = m_FileTree->GetFilePath();
167  fname.Normalize();
168  m_model->m_Filename = m_resolver->ShortenPath( fname.GetFullPath() );
169 
170  return true;
171 }
172 
173 
174 void DLG_SELECT_3DMODEL::OnSelectionChanged( wxCommandEvent& event )
175 {
176  if( m_modelViewer )
177  m_modelViewer->Set3DModel( m_FileTree->GetFilePath() );
178 }
179 
180 
181 void DLG_SELECT_3DMODEL::OnFileActivated( wxCommandEvent& event )
182 {
183  if( m_modelViewer )
184  m_modelViewer->Set3DModel( m_FileTree->GetFilePath() );
185 
186  SetEscapeId( wxID_OK );
187  Close();
188 }
189 
190 
191 void DLG_SELECT_3DMODEL::SetRootDir( wxCommandEvent& event )
192 {
193  if( m_FileTree && m_dirChoices->GetSelection() > 0 )
194  m_FileTree->SetPath( m_dirChoices->GetString( m_dirChoices->GetSelection() ) );
195 }
196 
197 
198 void DLG_SELECT_3DMODEL::Cfg3DPaths( wxCommandEvent& event )
199 {
200  if( S3D::Configure3DPaths( this, m_resolver ) )
202 }
203 
204 
206 {
207  if( !m_FileTree || !m_resolver || !m_dirChoices )
208  return;
209 
210  std::list< SEARCH_PATH > const* md = m_resolver->GetPaths();
211  std::list< SEARCH_PATH >::const_iterator sL = md->begin();
212  std::set< wxString > cl;
213  wxString prjDir;
214 
215  // extract the current project dir
216  if( sL != md->end() )
217  {
218  prjDir = sL->m_pathexp;
219  ++sL;
220  }
221 
222  while( sL != md->end() )
223  {
224  if( !sL->m_pathexp.empty() && sL->m_pathexp.compare( prjDir ) )
225  cl.insert( sL->m_pathexp );
226 
227  ++sL;
228  }
229 
230  if( !cl.empty() )
231  {
232  unsigned int choice = 0;
233  m_dirChoices->Clear();
234  m_dirChoices->Append( "" ); //Insert a blank string at the beginning to allow selection
235 
236  if( !prjDir.empty() )
237  {
238  m_dirChoices->Append( prjDir );
239 
240  if( prjDir == m_FileTree->GetPath() )
241  choice = 1;
242  }
243 
244  std::set< wxString >::const_iterator sI = cl.begin();
245 
246  while( sI != cl.end() )
247  {
248  if( *sI == m_FileTree->GetPath() )
249  choice = m_dirChoices->GetCount();
250 
251  m_dirChoices->Append( *sI );
252  ++sI;
253  }
254 
255  m_dirChoices->SetSelection( choice );
256  }
257 
258  return;
259 }
bool TransferDataFromWindow() override
C3D_MODEL_VIEWER * m_modelViewer
std::list< wxString > const * GetFileFilters() const
Function GetFileFilters returns the list of file filters retrieved from the plugins; this will contai...
Definition: 3d_cache.cpp:632
void SetRootDir(wxCommandEvent &event) override
void FinishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
provides an extensible class to resolve 3D model paths.
const std::list< SEARCH_PATH > * GetPaths(void)
Function GetPaths returns a pointer to the internal path list; the items in:load.
S3D_CACHE.
Definition: 3d_cache.h:54
Class C3D_MODEL_VIEWER Implement a canvas based on a wxGLCanvas.
defines the basic data associated with a single 3D model.
VECTOR3D m_Offset
3D model offset (mm)
Definition: class_module.h:95
#define NULL
Implements a model viewer canvas.
wxString ShortenPath(const wxString &aFullPathName)
Function ShortenPath produces a relative path based on the existing search directories or returns the...
void Set3DModel(const S3DMODEL &a3DModel)
Set3DModel - Set this model to be displayed.
void OnFileActivated(wxCommandEvent &event) override
Declaration of the cogl_att_list class.
void EllipsizeChoiceBox(wxChoice *aChoice)
Configure a wxChoice control to ellipsize the shown text in the button with the ellipses placed at th...
Definition: gtk/ui.cpp:76
wxString m_Filename
The 3D shape filename in 3D library.
Definition: class_module.h:97
static const int * GetAttributesList(ANTIALIASING_MODE aAntiAliasingMode)
Get a list of attributes to pass to wxGLCanvas.
bool Configure3DPaths(wxWindow *aParent, FILENAME_RESOLVER *aResolver)
const char * name
Definition: DXF_plotter.cpp:59
VECTOR3D m_Rotation
3D model rotation (degrees)
Definition: class_module.h:94
#define _(s)
Definition: 3d_actions.cpp:33
DLG_SELECT_3DMODEL(wxWindow *aParent, S3D_CACHE *aCacheManager, MODULE_3D_SETTINGS *aModelItem, wxString &prevModelSelectDir, int &prevModelWildcard)
creates a dialog to select 3D model files
FILENAME_RESOLVER * GetResolver() noexcept
Definition: 3d_cache.cpp:626
FILENAME_RESOLVER * m_resolver
defines the display data cache manager for 3D models
void Cfg3DPaths(wxCommandEvent &event) override
VECTOR3D m_Scale
3D model scaling factor (dimensionless)
Definition: class_module.h:93
MODULE_3D_SETTINGS * m_model
void OnSelectionChanged(wxCommandEvent &event) override
Class DLG_SELECT_3D_MODELE_BASE.