KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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 The 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>
29#include "project.h"
30#include "3d_cache/3d_info.h"
31#include "3d_cache/3d_cache.h"
35#include <filename_resolver.h>
36#include <pcbnew/footprint.h>
37#include <wx_filename.h>
38
39#include <wx/filedlg.h>
40
41#include <kiplatform/ui.h>
42
43
45 FP_3DMODEL* aModelItem, wxString& prevModelSelectDir,
46 int& prevModelWildcard ) :
48 m_model( aModelItem ),
49 m_cache( aCacheManager ),
50 m_resolver( aCacheManager ? aCacheManager->GetResolver() : nullptr ),
51 m_previousDir( prevModelSelectDir ),
52 m_modelViewer( nullptr )
53{
55 m_pane3Dviewer, OGL_ATT_LIST::GetAttributesList( ANTIALIASING_MODE::AA_8X ), 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( FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS );
168 m_model->m_Filename = m_resolver->ShortenPath( fname.GetFullPath() );
169
170 return true;
171}
172
173
174void DIALOG_SELECT_3DMODEL::OnSelectionChanged( wxCommandEvent& event )
175{
176 if( m_modelViewer )
177 m_modelViewer->Set3DModel( m_FileTree->GetFilePath() );
178}
179
180
181void 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
190void DIALOG_SELECT_3DMODEL::SetRootDir( wxCommandEvent& event )
191{
192 if( m_FileTree && m_dirChoices->GetSelection() > 0 )
193 {
194 m_FileTree->SetPath( m_dirChoices->GetString( m_dirChoices->GetSelection() ) );
195 m_FileTree->UnselectAll(); // Ensure no unwanted selection
196 }
197}
198
199
200void DIALOG_SELECT_3DMODEL::Cfg3DPaths( wxCommandEvent& event )
201{
202 DIALOG_CONFIGURE_PATHS dlg( this );
203
204 if( dlg.ShowQuasiModal() == wxID_OK )
206}
207
208
210{
211 if( !m_FileTree || !m_resolver || !m_dirChoices )
212 return;
213
214 std::list< SEARCH_PATH > const* md = m_resolver->GetPaths();
215 std::list< SEARCH_PATH >::const_iterator sL = md->begin();
216 std::set< wxString > cl;
217 wxString prjDir;
218
219 // extract the current project dir
220 if( sL != md->end() )
221 {
222 prjDir = sL->m_Pathexp;
223 ++sL;
224 }
225
226 while( sL != md->end() )
227 {
228 if( !sL->m_Pathexp.empty() && sL->m_Pathexp.compare( prjDir ) )
229 cl.insert( sL->m_Pathexp );
230
231 ++sL;
232 }
233
234 if( !cl.empty() )
235 {
236 unsigned int choice = 0;
237 m_dirChoices->Clear();
238 m_dirChoices->Append( "" ); //Insert a blank string at the beginning to allow selection
239
240 if( !prjDir.empty() )
241 {
242 m_dirChoices->Append( prjDir );
243
244 if( prjDir == m_FileTree->GetPath() )
245 choice = 1;
246 }
247
248 std::set< wxString >::const_iterator sI = cl.begin();
249
250 while( sI != cl.end() )
251 {
252 if( *sI == m_FileTree->GetPath() )
253 choice = m_dirChoices->GetCount();
254
255 m_dirChoices->Append( *sI );
256 ++sI;
257 }
258
259 m_dirChoices->SetSelection( choice );
260 }
261
262 return;
263}
defines the basic data associated with a single 3D model.
const char * name
Definition: DXF_plotter.cpp:59
void OnSelectionChanged(wxCommandEvent &event) override
DIALOG_SELECT_3DMODEL(wxWindow *aParent, S3D_CACHE *aCacheManager, FP_3DMODEL *aModelItem, wxString &prevModelSelectDir, int &prevModelWildcard)
void SetRootDir(wxCommandEvent &event) override
FILENAME_RESOLVER * m_resolver
EDA_3D_MODEL_VIEWER * m_modelViewer
void OnFileActivated(wxCommandEvent &event) override
void Cfg3DPaths(wxCommandEvent &event) override
bool TransferDataFromWindow() override
Class DIALOG_SELECT_3D_MODEL_BASE.
int ShowQuasiModal()
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
Implement a canvas based on a wxGLCanvas.
void Set3DModel(const S3DMODEL &a3DModel)
Set this model to be displayed.
const std::list< SEARCH_PATH > * GetPaths() const
Return a pointer to the internal path list; the items in:load.
wxString ShortenPath(const wxString &aFullPathName)
Produce a relative path based on the existing search directories or returns the same path if the path...
VECTOR3D m_Offset
3D model offset (mm)
Definition: footprint.h:105
VECTOR3D m_Rotation
3D model rotation (degrees)
Definition: footprint.h:104
VECTOR3D m_Scale
3D model scaling factor (dimensionless)
Definition: footprint.h:103
wxString m_Filename
The 3D shape filename in 3D library.
Definition: footprint.h:107
static const wxGLAttributes GetAttributesList(ANTIALIASING_MODE aAntiAliasingMode, bool aAlpha=false)
Get a list of attributes to pass to wxGLCanvas.
Cache for storing the 3D shapes.
Definition: 3d_cache.h:55
std::list< wxString > const * GetFileFilters() const
Return the list of file filters retrieved from the plugins.
Definition: 3d_cache.cpp:518
T y
Definition: vector3.h:64
T z
Definition: vector3.h:65
T x
Definition: vector3.h:63
#define _(s)
Implements a model viewer canvas.
void EllipsizeChoiceBox(wxChoice *aChoice)
Configure a wxChoice control to ellipsize the shown text in the button with the ellipses placed at th...
Definition: wxgtk/ui.cpp:211
Declaration of the cogl_att_list class.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().
Definition: wx_filename.h:39