KiCad PCB EDA Suite
dialog_select_3d_model.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 <[email protected]>
5  * Copyright (C) 2016 Cirilo Bernardo <[email protected]>
6  * Copyright (C) 2017-2021 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 "dialog_select_3d_model.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/footprint.h>
37 
38 #include <wx/filedlg.h>
39 
40 #include <kiplatform/ui.h>
41 
42 
43 DIALOG_SELECT_3DMODEL::DIALOG_SELECT_3DMODEL( wxWindow* aParent, S3D_CACHE* aCacheManager,
44  FP_3DMODEL* aModelItem, wxString& prevModelSelectDir,
45  int& prevModelWildcard ) :
46  DIALOG_SELECT_3D_MODEL_BASE( aParent ),
47  m_model( aModelItem ),
48  m_cache( aCacheManager ),
49  m_resolver( aCacheManager ? aCacheManager->GetResolver() : nullptr ),
50  m_previousDir( prevModelSelectDir ),
51  m_modelViewer( nullptr )
52 {
55  m_cache );
56  m_modelViewer->SetMinSize( wxSize( 400, -1 ) );
57  m_Sizer3Dviewer->Add( m_modelViewer, 1, wxEXPAND|wxRIGHT, 5 );
58 
59  // create the filter list
60  if( NULL != m_cache )
61  {
62  std::list< wxString > const* fl = m_cache->GetFileFilters();
63  std::list< wxString >::const_iterator sL = fl->begin();
64 
65  // The files filter string build from list of loaded plugins:
66  wxString filter;
67 
68  // The files filter extensions only build from list of loaded plugins:
69  wxString ext_list;
70 
71  while( sL != fl->end() )
72  {
73  if( !filter.IsEmpty() )
74  filter.Append( "|" );
75 
76  filter.Append( *sL );
77 
78  if( !ext_list.IsEmpty() )
79  ext_list.Append( ";" );
80 
81  wxString ext = sL->AfterLast( '|' );
82 
83  if( ext.Len() > 3 ) // Skip *.*
84  ext_list.Append( ext );
85 
86  ++sL;
87  }
88 
89  if( !filter.empty() )
90  {
91  if( !ext_list.empty() )
92  {
93  wxString full_filter;
94  full_filter.Printf( _( "All supported files (%s)" ), ext_list );
95  full_filter << '|' << ext_list << '|' << filter;
96  m_FileTree->SetFilter( full_filter );
97  }
98  else
99  {
100  m_FileTree->SetFilter( filter );
101  }
102  }
103  else
104  {
105  m_FileTree->SetFilter( wxFileSelectorDefaultWildcardStr );
106  }
107 
108  if( prevModelWildcard >= 0 && prevModelWildcard < (int)fl->size() )
109  {
110  m_FileTree->SetFilterIndex( prevModelWildcard );
111  }
112  else
113  {
114  prevModelWildcard = 0;
115  m_FileTree->SetFilterIndex( 0 );
116  }
117  }
118  else
119  {
120  m_FileTree->SetFilter( wxFileSelectorDefaultWildcardStr );
121  prevModelWildcard = 0;
122  m_FileTree->SetFilterIndex( 0 );
123  }
124 
125  // Fix the filter box on the file selector widget so that it always shows the start of
126  // the filter string in the combobox. Otherwise it will only show the end of the string,
127  // which is empty for all but the all supported filters option.
128  wxChoice* filterBox = m_FileTree->GetFilterListCtrl();
130 
131  m_FileTree->SetPath( m_previousDir );
133 
134  m_modelViewer->Refresh();
135  m_modelViewer->SetFocus();
136 
138 }
139 
140 
142 {
143  if( !m_model || !m_FileTree )
144  return true;
145 
146  m_model->m_Scale.x = 1.0;
147  m_model->m_Scale.y = 1.0;
148  m_model->m_Scale.z = 1.0;
149 
150  m_model->m_Rotation.x = 0.0;
151  m_model->m_Rotation.y = 0.0;
152  m_model->m_Rotation.z = 0.0;
153 
155  m_model->m_Filename.clear();
156 
157  wxString name = m_FileTree->GetFilePath();
158 
159  if( name.empty() )
160  return true;
161 
162  m_previousDir = m_FileTree->GetPath();
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 DIALOG_SELECT_3DMODEL::OnSelectionChanged( wxCommandEvent& event )
175 {
176  if( m_modelViewer )
177  m_modelViewer->Set3DModel( m_FileTree->GetFilePath() );
178 }
179 
180 
181 void DIALOG_SELECT_3DMODEL::OnFileActivated( wxCommandEvent& event )
182 {
183  if( m_modelViewer )
184  m_modelViewer->Set3DModel( m_FileTree->GetFilePath() );
185 
186  EmulateButtonClickIfPresent( wxID_OK );
187 }
188 
189 
190 void DIALOG_SELECT_3DMODEL::SetRootDir( wxCommandEvent& event )
191 {
192  if( m_FileTree && m_dirChoices->GetSelection() > 0 )
193  m_FileTree->SetPath( m_dirChoices->GetString( m_dirChoices->GetSelection() ) );
194 }
195 
196 
197 void DIALOG_SELECT_3DMODEL::Cfg3DPaths( wxCommandEvent& event )
198 {
199  if( S3D::Configure3DPaths( this, m_resolver ) )
201 }
202 
203 
205 {
206  if( !m_FileTree || !m_resolver || !m_dirChoices )
207  return;
208 
209  std::list< SEARCH_PATH > const* md = m_resolver->GetPaths();
210  std::list< SEARCH_PATH >::const_iterator sL = md->begin();
211  std::set< wxString > cl;
212  wxString prjDir;
213 
214  // extract the current project dir
215  if( sL != md->end() )
216  {
217  prjDir = sL->m_Pathexp;
218  ++sL;
219  }
220 
221  while( sL != md->end() )
222  {
223  if( !sL->m_Pathexp.empty() && sL->m_Pathexp.compare( prjDir ) )
224  cl.insert( sL->m_Pathexp );
225 
226  ++sL;
227  }
228 
229  if( !cl.empty() )
230  {
231  unsigned int choice = 0;
232  m_dirChoices->Clear();
233  m_dirChoices->Append( "" ); //Insert a blank string at the beginning to allow selection
234 
235  if( !prjDir.empty() )
236  {
237  m_dirChoices->Append( prjDir );
238 
239  if( prjDir == m_FileTree->GetPath() )
240  choice = 1;
241  }
242 
243  std::set< wxString >::const_iterator sI = cl.begin();
244 
245  while( sI != cl.end() )
246  {
247  if( *sI == m_FileTree->GetPath() )
248  choice = m_dirChoices->GetCount();
249 
250  m_dirChoices->Append( *sI );
251  ++sI;
252  }
253 
254  m_dirChoices->SetSelection( choice );
255  }
256 
257  return;
258 }
Class DIALOG_SELECT_3D_MODEL_BASE.
void OnFileActivated(wxCommandEvent &event) override
std::list< wxString > const * GetFileFilters() const
Return the list of file filters retrieved from the plugins.
Definition: 3d_cache.cpp:611
Implement a canvas based on a wxGLCanvas.
Declaration of the cogl_att_list class.
Cache for storing the 3D shapes.
Definition: 3d_cache.h:52
defines the basic data associated with a single 3D model.
void SetRootDir(wxCommandEvent &event) override
static const int * GetAttributesList(ANTIALIASING_MODE aAntiAliasingMode)
Get a list of attributes to pass to wxGLCanvas.
VECTOR3D m_Offset
3D model offset (mm)
Definition: footprint.h:95
bool TransferDataFromWindow() override
wxString ShortenPath(const wxString &aFullPathName)
Produce a relative path based on the existing search directories or returns the same path if the path...
void OnSelectionChanged(wxCommandEvent &event) override
VECTOR3D m_Scale
3D model scaling factor (dimensionless)
Definition: footprint.h:93
const std::list< SEARCH_PATH > * GetPaths() const
Return a pointer to the internal path list; the items in:load.
FILENAME_RESOLVER * m_resolver
#define _(s)
EDA_3D_MODEL_VIEWER * m_modelViewer
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:91
wxString m_Filename
The 3D shape filename in 3D library.
Definition: footprint.h:97
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
bool Configure3DPaths(wxWindow *aParent, FILENAME_RESOLVER *aResolver)
VECTOR3D m_Rotation
3D model rotation (degrees)
Definition: footprint.h:94
const char * name
Definition: DXF_plotter.cpp:56
void Cfg3DPaths(wxCommandEvent &event) override
void Set3DModel(const S3DMODEL &a3DModel)
Set this model to be displayed.
DIALOG_SELECT_3DMODEL(wxWindow *aParent, S3D_CACHE *aCacheManager, FP_3DMODEL *aModelItem, wxString &prevModelSelectDir, int &prevModelWildcard)