KiCad PCB EDA Suite
panel_prev_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 <mrluzeiro@ua.pt>
5  * Copyright (C) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com>
6  * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
7  * Copyright (C) 2015-2018 KiCad Developers, see AUTHORS.txt for contributors.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, you may find one here:
21  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22  * or you may search the http://www.gnu.org website for the version 2 license,
23  * or you may write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25  */
26 
33 #include <cstdlib>
34 #include <limits.h>
35 #include <bitmaps.h>
36 
37 #include <wx/valnum.h>
38 #include <wx/tglbtn.h>
39 
40 #include "project.h"
41 #include "panel_prev_model.h"
42 #include <class_board.h>
43 
44 
45 PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, S3D_CACHE* aCacheManager,
46  MODULE* aModuleCopy,
47  COLORS_DESIGN_SETTINGS *aColors,
48  std::vector<MODULE_3D_SETTINGS> *aParentInfoList ) :
49  PANEL_PREV_3D_BASE( aParent, wxID_ANY )
50 {
51  initPanel();
52 
53  // Initialize the color settings to draw the board and the footprint
54  if( aColors )
55  m_dummyBoard->SetColorsSettings( aColors );
56  else
57  {
58  static COLORS_DESIGN_SETTINGS defaultColors( FRAME_PCB_DISPLAY3D );
59  m_dummyBoard->SetColorsSettings( &defaultColors );
60  }
61 
62  if( NULL != aCacheManager )
63  m_resolver = aCacheManager->GetResolver();
64 
65  m_parentInfoList = aParentInfoList;
66 
67  m_dummyBoard->Add( (MODULE*)aModuleCopy );
68  m_copyModule = aModuleCopy;
69 
70  // Set 3d viewer configuration for preview
72 
73  // Create the 3D canvas
74  m_previewPane = new EDA_3D_CANVAS( this,
78  aCacheManager );
79 
80  m_SizerPanelView->Add( m_previewPane, 1, wxEXPAND );
81 
82  m_previewPane->Connect( wxEVT_ENTER_WINDOW,
83  wxMouseEventHandler( PANEL_PREV_3D::onEnterPreviewCanvas ),
84  NULL, this );
85 }
86 
87 
89 {
90  m_previewPane->Disconnect( wxEVT_ENTER_WINDOW,
91  wxMouseEventHandler( PANEL_PREV_3D::onEnterPreviewCanvas ),
92  NULL, this );
93 
94  delete m_settings3Dviewer;
95  delete m_dummyBoard;
96  delete m_previewPane;
97 }
98 
99 
101 {
102  m_resolver = NULL;
103  currentModelFile.clear();
104  m_dummyBoard = new BOARD();
106 
107  // Set the bitmap of 3D view buttons:
108  m_bpvTop->SetBitmap( KiBitmap( axis3d_top_xpm ) );
109  m_bpvFront->SetBitmap( KiBitmap( axis3d_front_xpm ) );
110  m_bpvBack->SetBitmap( KiBitmap( axis3d_back_xpm ) );
111  m_bpvLeft->SetBitmap( KiBitmap( axis3d_left_xpm ) );
112  m_bpvRight->SetBitmap( KiBitmap( axis3d_right_xpm ) );
113  m_bpvBottom->SetBitmap( KiBitmap( axis3d_bottom_xpm ) );
114  m_bpvISO->SetBitmap( KiBitmap( ortho_xpm ) );
115  m_bpUpdate->SetBitmap( KiBitmap( reload_xpm ) );
116 
117  // Set the min and max values of spin buttons (mandatory on Linux)
118  // They are not used, so they are set to min and max 32 bits int values
119  // (the min and max values supported by a wxSpinButton)
120  // It avoids blocking the up or down arrows when reaching this limit after
121  // a few clicks.
122  wxSpinButton* spinButtonList[] =
123  {
127  };
128 
129  for( int ii = 0; ii < 9; ii++ )
130  {
131  spinButtonList[ii]->SetRange( INT_MIN, INT_MAX );
132  }
133 
134  wxString units;
135 
136  switch( g_UserUnit )
137  {
138  case INCHES:
139  units = _( "inches" );
140  break;
141  case MILLIMETRES:
142  units = _( "mm" );
143  break;
144  default:
145  break;
146  }
147 
148  if( !units.IsEmpty() )
149  {
150  units = wxString::Format( _( "Offset (%s)" ), units );
151  m_staticTextOffset->SetLabel( units );
152  }
153 }
154 
155 
156 
157 
164 static void checkRotation( double& aRotation )
165 {
166  if( aRotation > MAX_ROTATION )
167  {
168  int n = aRotation / MAX_ROTATION;
169  aRotation -= MAX_ROTATION * n;
170  }
171  else if( aRotation < -MAX_ROTATION )
172  {
173  int n = -aRotation / MAX_ROTATION;
174  aRotation += MAX_ROTATION * n;
175  }
176 }
177 
178 
179 static bool validateFloatTextCtrl( wxTextCtrl* aTextCtrl )
180 {
181  if( aTextCtrl == NULL )
182  return false;
183 
184  if( aTextCtrl->GetLineLength(0) == 0 ) // This will skip the got and event with empty field
185  return false;
186 
187  if( aTextCtrl->GetLineLength(0) == 1 )
188  {
189  if( (aTextCtrl->GetLineText(0).compare( "." ) == 0) ||
190  (aTextCtrl->GetLineText(0).compare( "," ) == 0) )
191  return false;
192  }
193 
194  return true;
195 }
196 
197 
198 static void incrementTextCtrl( wxTextCtrl* aTextCtrl, double aInc, double aMinval, double aMaxval )
199 {
200  if( !validateFloatTextCtrl( aTextCtrl ) )
201  return;
202 
203  double curr_value = 0;
204 
205  aTextCtrl->GetValue().ToDouble( &curr_value );
206  curr_value += aInc;
207 
208  if( curr_value > aMaxval )
209  curr_value = aMaxval;
210 
211  if( curr_value < aMinval )
212  curr_value = aMinval;
213 
214  aTextCtrl->SetValue( wxString::Format( "%.4f", curr_value ) );
215 }
216 
217 
218 void PANEL_PREV_3D::SetModelDataIdx( int idx, bool aReloadPreviewModule )
219 {
220  wxASSERT( m_parentInfoList != NULL );
221 
222  if( m_parentInfoList && (idx >= 0) )
223  {
224  wxASSERT( (unsigned int)idx < (*m_parentInfoList).size() );
225 
226  if( (unsigned int)idx < (*m_parentInfoList).size() )
227  {
228  m_currentSelectedIdx = -1; // In case that we receive events on the
229  // next updates, it will set first an
230  // invalid selection
231 
232  const MODULE_3D_SETTINGS *aModel = (const MODULE_3D_SETTINGS *)&((*m_parentInfoList)[idx]);
233 
234  xscale->SetValue( wxString::Format( "%.4f", aModel->m_Scale.x ) );
235  yscale->SetValue( wxString::Format( "%.4f", aModel->m_Scale.y ) );
236  zscale->SetValue( wxString::Format( "%.4f", aModel->m_Scale.z ) );
237 
238  xrot->SetValue( wxString::Format( "%.2f", aModel->m_Rotation.x ) );
239  yrot->SetValue( wxString::Format( "%.2f", aModel->m_Rotation.y ) );
240  zrot->SetValue( wxString::Format( "%.2f", aModel->m_Rotation.z ) );
241 
242  // Convert from internal units (mm) to user units
243 
244  double scaler = 1;
245 
246  switch( g_UserUnit )
247  {
248  case MILLIMETRES:
249  scaler = 1.0f;
250  break;
251  case INCHES:
252  scaler = 25.4f;
253  break;
254  default:
255  wxASSERT( 0 );
256  }
257 
258  xoff->SetValue( wxString::Format( "%.4f", aModel->m_Offset.x / scaler ) );
259  yoff->SetValue( wxString::Format( "%.4f", aModel->m_Offset.y / scaler ) );
260  zoff->SetValue( wxString::Format( "%.4f", aModel->m_Offset.z / scaler ) );
261 
262  UpdateModelName( aModel->m_Filename );
263 
264  if( aReloadPreviewModule && m_previewPane )
265  {
267 
270  }
271 
272  m_currentSelectedIdx = idx;
273  }
274  }
275 
276  if( m_previewPane )
277  {
278  m_previewPane->SetFocus();
279  }
280 
281  return;
282 }
283 
284 
285 void PANEL_PREV_3D::ResetModelData( bool aReloadPreviewModule )
286 {
288 
289  xscale->SetValue( wxString::FromDouble( 1.0 ) );
290  yscale->SetValue( wxString::FromDouble( 1.0 ) );
291  zscale->SetValue( wxString::FromDouble( 1.0 ) );
292 
293  xrot->SetValue( wxString::FromDouble( 0.0 ) );
294  yrot->SetValue( wxString::FromDouble( 0.0 ) );
295  zrot->SetValue( wxString::FromDouble( 0.0 ) );
296 
297  xoff->SetValue( wxString::FromDouble( 0.0 ) );
298  yoff->SetValue( wxString::FromDouble( 0.0 ) );
299  zoff->SetValue( wxString::FromDouble( 0.0 ) );
300 
301  // This will update the model on the preview board with the current list of 3d shapes
302  if( aReloadPreviewModule )
303  {
305 
306  if( m_previewPane )
307  {
310  }
311  }
312 
313  if( m_previewPane )
314  m_previewPane->SetFocus();
315 }
316 
317 
318 void PANEL_PREV_3D::UpdateModelName( wxString const& aModelName )
319 {
320  bool newModel = false;
321 
322  m_modelInfo.m_Filename = aModelName;
323 
324  // if the model name is a directory simply clear the current model
325  if( aModelName.empty() || wxFileName::DirExists( aModelName ) )
326  {
327  currentModelFile.clear();
328  m_modelInfo.m_Filename.clear();
329  }
330  else
331  {
332  wxString newModelFile;
333 
334  if( m_resolver )
335  newModelFile = m_resolver->ResolvePath( aModelName );
336 
337  if( !newModelFile.empty() && newModelFile.Cmp( currentModelFile ) )
338  newModel = true;
339 
340  currentModelFile = newModelFile;
341  }
342 
343  if( currentModelFile.empty() || newModel )
344  {
346 
347  if( m_previewPane )
348  {
350  m_previewPane->Refresh();
351  }
352 
353  if( currentModelFile.empty() )
354  return;
355  }
356  else
357  {
358  if( m_previewPane )
359  m_previewPane->Refresh();
360  }
361 
362  if( m_previewPane )
363  m_previewPane->SetFocus();
364 
365  return;
366 }
367 
368 
369 void PANEL_PREV_3D::updateOrientation( wxCommandEvent &event )
370 {
371  wxTextCtrl *textCtrl = (wxTextCtrl *)event.GetEventObject();
372 
373  if( textCtrl == NULL )
374  return;
375 
376  if( textCtrl->GetLineLength(0) == 0 ) // This will skip the got and event with empty field
377  return;
378 
379  if( textCtrl->GetLineLength(0) == 1 )
380  if( (textCtrl->GetLineText(0).compare( "." ) == 0) ||
381  (textCtrl->GetLineText(0).compare( "," ) == 0) )
382  return;
383 
384  SGPOINT scale;
385  SGPOINT rotation;
386  SGPOINT offset;
387 
388  getOrientationVars( scale, rotation, offset );
389 
390  m_modelInfo.m_Scale.x = scale.x;
391  m_modelInfo.m_Scale.y = scale.y;
392  m_modelInfo.m_Scale.z = scale.z;
393  m_modelInfo.m_Offset.x = offset.x;
394  m_modelInfo.m_Offset.y = offset.y;
395  m_modelInfo.m_Offset.z = offset.z;
396  m_modelInfo.m_Rotation.x = rotation.x;
397  m_modelInfo.m_Rotation.y = rotation.y;
398  m_modelInfo.m_Rotation.z = rotation.z;
399 
400  if( m_currentSelectedIdx >= 0 )
401  {
402  // This will update the parent list with the new data
403  (*m_parentInfoList)[m_currentSelectedIdx] = m_modelInfo;
404 
405  // It will update the copy model in the preview board
407 
408  // Since the OpenGL render does not need to be reloaded to update the
409  // shapes position, we just request to redraw again the canvas
410  if( m_previewPane )
411  m_previewPane->Refresh();
412  }
413 }
414 
415 
416 void PANEL_PREV_3D::onIncrementRot( wxSpinEvent& event )
417 {
418  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
419 
420  wxTextCtrl * textCtrl = xrot;
421 
422  if( spinCtrl == m_spinYrot )
423  textCtrl = yrot;
424  else if( spinCtrl == m_spinZrot )
425  textCtrl = zrot;
426 
428 }
429 
430 
431 void PANEL_PREV_3D::onDecrementRot( wxSpinEvent& event )
432 {
433  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
434 
435  wxTextCtrl * textCtrl = xrot;
436 
437  if( spinCtrl == m_spinYrot )
438  textCtrl = yrot;
439  else if( spinCtrl == m_spinZrot )
440  textCtrl = zrot;
441 
443 }
444 
445 
446 void PANEL_PREV_3D::onIncrementScale( wxSpinEvent& event )
447 {
448  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
449 
450  wxTextCtrl * textCtrl = xscale;
451 
452  if( spinCtrl == m_spinYscale )
453  textCtrl = yscale;
454  else if( spinCtrl == m_spinZscale )
455  textCtrl = zscale;
456 
458 }
459 
460 
461 void PANEL_PREV_3D::onDecrementScale( wxSpinEvent& event )
462 {
463  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
464 
465  wxTextCtrl * textCtrl = xscale;
466 
467  if( spinCtrl == m_spinYscale )
468  textCtrl = yscale;
469  else if( spinCtrl == m_spinZscale )
470  textCtrl = zscale;
471 
473 }
474 
475 
476 void PANEL_PREV_3D::onIncrementOffset( wxSpinEvent& event )
477 {
478  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
479 
480  wxTextCtrl * textCtrl = xoff;
481 
482  if( spinCtrl == m_spinYoffset )
483  textCtrl = yoff;
484  else if( spinCtrl == m_spinZoffset )
485  textCtrl = zoff;
486 
487  double step = OFFSET_INCREMENT_MM;
488 
489  if( g_UserUnit == INCHES )
490  step = OFFSET_INCREMENT_MIL/1000.0;
491 
492  incrementTextCtrl( textCtrl, step, -MAX_OFFSET, MAX_OFFSET );
493 }
494 
495 
496 void PANEL_PREV_3D::onDecrementOffset( wxSpinEvent& event )
497 {
498  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
499 
500  wxTextCtrl * textCtrl = xoff;
501 
502  if( spinCtrl == m_spinYoffset )
503  textCtrl = yoff;
504  else if( spinCtrl == m_spinZoffset )
505  textCtrl = zoff;
506 
507  double step = OFFSET_INCREMENT_MM;
508 
509  if( g_UserUnit == INCHES )
510  step = OFFSET_INCREMENT_MIL/1000.0;
511 
512  incrementTextCtrl( textCtrl, -step, -MAX_OFFSET, MAX_OFFSET );
513 }
514 
515 
516 void PANEL_PREV_3D::onMouseWheelScale( wxMouseEvent& event )
517 {
518  wxTextCtrl* textCtrl = (wxTextCtrl*) event.GetEventObject();
519 
520  double step = SCALE_INCREMENT;
521 
522  if( event.ShiftDown( ) )
523  step = SCALE_INCREMENT_FINE;
524 
525  if( event.GetWheelRotation() >= 0 )
526  step = -step;
527 
528  incrementTextCtrl( textCtrl, step, 1/MAX_SCALE, MAX_SCALE );
529 }
530 
531 
532 void PANEL_PREV_3D::onMouseWheelRot( wxMouseEvent& event )
533 {
534  wxTextCtrl* textCtrl = (wxTextCtrl*) event.GetEventObject();
535 
536  wxKeyboardState kbdState;
537 
538  double step = ROTATION_INCREMENT_WHEEL;
539 
540  if( event.ShiftDown( ) )
542 
543  if( event.GetWheelRotation() >= 0 )
544  step = -step;
545 
546  incrementTextCtrl( textCtrl, step, -MAX_ROTATION, MAX_ROTATION );
547 }
548 
549 
550 void PANEL_PREV_3D::onMouseWheelOffset( wxMouseEvent& event )
551 {
552  wxTextCtrl* textCtrl = (wxTextCtrl*) event.GetEventObject();
553 
554  double step = OFFSET_INCREMENT_MM;
555 
556  if( event.ShiftDown( ) )
558 
559  if( g_UserUnit == INCHES )
560  {
561  step = OFFSET_INCREMENT_MIL/1000.0;
562  if( event.ShiftDown( ) )
563  step = OFFSET_INCREMENT_MIL_FINE/1000.0;
564  }
565 
566  if( event.GetWheelRotation() >= 0 )
567  step = -step;
568 
569  incrementTextCtrl( textCtrl, step, -MAX_OFFSET, MAX_OFFSET );
570 }
571 
572 
573 void PANEL_PREV_3D::getOrientationVars( SGPOINT& aScale, SGPOINT& aRotation, SGPOINT& aOffset )
574 {
575  if( NULL == xscale || NULL == yscale || NULL == zscale
576  || NULL == xrot || NULL == yrot || NULL == zrot
577  || NULL == xoff || NULL == yoff || NULL == zoff )
578  {
579  return;
580  }
581 
582  xscale->GetValue().ToDouble( &aScale.x );
583  yscale->GetValue().ToDouble( &aScale.y );
584  zscale->GetValue().ToDouble( &aScale.z );
585 
586  xrot->GetValue().ToDouble( &aRotation.x );
587  yrot->GetValue().ToDouble( &aRotation.y );
588  zrot->GetValue().ToDouble( &aRotation.z );
589 
590  checkRotation( aRotation.x );
591  checkRotation( aRotation.y );
592  checkRotation( aRotation.z );
593 
594  xoff->GetValue().ToDouble( &aOffset.x );
595  yoff->GetValue().ToDouble( &aOffset.y );
596  zoff->GetValue().ToDouble( &aOffset.z );
597 
598  // Convert from user units to internal units (mm)
599 
600  double scaler = 1.0f;
601 
602  switch( g_UserUnit )
603  {
604  case MILLIMETRES:
605  scaler = 1.0f;
606  break;
607  case INCHES:
608  scaler = 25.4f;
609  break;
610  default:
611  wxASSERT( 0 );
612  }
613 
614  aOffset.x *= scaler;
615  aOffset.y *= scaler;
616  aOffset.z *= scaler;
617 
618  return;
619 }
620 
621 
622 bool PANEL_PREV_3D::ValidateWithMessage( wxString& aErrorMessage )
623 {
624  bool invalidScale = false;
625 
626  for( unsigned int idx = 0; idx < m_parentInfoList->size(); ++idx )
627  {
628  wxString msg;
629  bool addError = false;
630  MODULE_3D_SETTINGS& s3dshape = (*m_parentInfoList)[idx];
631 
632  SGPOINT scale;
633  scale.x = s3dshape.m_Scale.x;
634  scale.y = s3dshape.m_Scale.y;
635  scale.z = s3dshape.m_Scale.z;
636 
637  if( 1/MAX_SCALE > scale.x || MAX_SCALE < scale.x )
638  {
639  invalidScale = true;
640  addError = true;
641  msg += _( "Invalid X scale" );
642  }
643 
644  if( 1/MAX_SCALE > scale.y || MAX_SCALE < scale.y )
645  {
646  invalidScale = true;
647  addError = true;
648 
649  if( !msg.IsEmpty() )
650  msg += "\n";
651 
652  msg += _( "Invalid Y scale" );
653  }
654 
655  if( 1/MAX_SCALE > scale.z || MAX_SCALE < scale.z )
656  {
657  invalidScale = true;
658  addError = true;
659 
660  if( !msg.IsEmpty() )
661  msg += "\n";
662 
663  msg += _( "Invalid Z scale" );
664  }
665 
666  if( addError )
667  {
668  msg.Prepend( s3dshape.m_Filename + "\n" );
669 
670  if( !aErrorMessage.IsEmpty() )
671  aErrorMessage += "\n\n";
672 
673  aErrorMessage += msg;
674  }
675  }
676 
677  if( !aErrorMessage.IsEmpty() )
678  {
679  aErrorMessage += "\n\n";
680  aErrorMessage += wxString::Format( "Min value = %.4f and max value = %.4f",
681  1/MAX_SCALE, MAX_SCALE );
682  }
683 
684  return invalidScale == false;
685 }
686 
687 
689 {
690  auto draw3D = &m_copyModule->Models();
691  draw3D->clear();
692  draw3D->insert( draw3D->end(), m_parentInfoList->begin(), m_parentInfoList->end() );
693 }
wxBitmapButton * m_bpvTop
void SetColorsSettings(COLORS_DESIGN_SETTINGS *aColorsSettings)
Function SetColorsSettings.
Definition: class_board.h:569
wxBitmapButton * m_bpvBottom
void ResetModelData(bool aReloadPreviewModule=false)
ResetModelData - Clear the values and reload the preview board.
std::vector< MODULE_3D_SETTINGS > * m_parentInfoList
A pointer to the parent MODULE_3D_SETTINGS list that we will use to copy to the preview module...
wxSpinButton * m_spinZoffset
Class PANEL_PREV_3D_BASE.
MODULE * m_copyModule
A pointer to a new copy of the original module.
#define OFFSET_INCREMENT_MM_FINE
CINFO3D_VISU * m_settings3Dviewer
The settings that will be used for this 3D viewer canvas.
static const int * GetAttributesList(bool aUseAntiAliasing)
Get a list of attributes to pass to wxGLCanvas.
void onDecrementRot(wxSpinEvent &event) override
double x
Definition: sg_base.h:70
wxSpinButton * m_spinYoffset
void onMouseWheelScale(wxMouseEvent &event) override
wxBitmapButton * m_bpvBack
#define OFFSET_INCREMENT_MM
void onIncrementOffset(wxSpinEvent &event) override
#define SCALE_INCREMENT_FINE
wxBitmapButton * m_bpvLeft
Class BOARD to handle a board.
void getOrientationVars(SGPOINT &aScale, SGPOINT &aRotation, SGPOINT &aOffset)
getOrientationVars - gets the transformation from entries and validate it
void onMouseWheelOffset(wxMouseEvent &event) override
wxBitmapButton * m_bpUpdate
bool ValidateWithMessage(wxString &aErrorMessage)
verify X,Y and Z scale factors are acceptable (> 0.001 and < 1000.0)
static void incrementTextCtrl(wxTextCtrl *aTextCtrl, double aInc, double aMinval, double aMaxval)
Class EDA_3D_CANVAS Implement a canvas based on a wxGLCanvas.
Definition: eda_3d_canvas.h:53
void onDecrementScale(wxSpinEvent &event) override
wxBoxSizer * m_SizerPanelView
double y
Definition: sg_base.h:71
void Request_refresh(bool aRedrawImmediately=true)
Request_refresh - Schedule a refresh update of the canvas.
void ReloadRequest(BOARD *aBoard=NULL, S3D_CACHE *aCachePointer=NULL)
#define ROTATION_INCREMENT
int m_currentSelectedIdx
The current selected index of the MODULE_3D_SETTINGS list.
VECTOR3D m_Offset
3D model offset (mm)
Definition: class_module.h:101
wxBitmapButton * m_bpvRight
static bool validateFloatTextCtrl(wxTextCtrl *aTextCtrl)
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Function KiBitmap constructs a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:78
wxStaticText * m_staticTextOffset
void updateListOnModelCopy()
updateListOnModelCopy - copy the current shape list to the copy of module that is on the preview dumm...
wxSpinButton * m_spinZrot
void SetModelDataIdx(int idx, bool aReloadPreviewModule=false)
SetModelDataIdx - This will set the index of the INFO list that was set on the parent.
Defines a panel which is to be added to a wxFileDialog via SetExtraControl(); The panel shows a previ...
#define SCALE_INCREMENT
S3D_FILENAME_RESOLVER * m_resolver
Used to get the full path name.
wxSpinButton * m_spinXoffset
Definition: common.h:145
void onEnterPreviewCanvas(wxMouseEvent &event)
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_INSERT) override
Adds an item to the container.
EDA_3D_CANVAS * m_previewPane
The 3D canvas.
Class CINFO3D_VISU Helper class to handle information needed to display 3D board. ...
Definition: cinfo3d_visu.h:70
wxSpinButton * m_spinYrot
void onIncrementRot(wxSpinEvent &event) override
Declaration of the cogl_att_list class.
wxSpinButton * m_spinXrot
wxBitmapButton * m_bpvFront
wxSpinButton * m_spinZscale
wxSpinButton * m_spinXscale
S3D_FILENAME_RESOLVER * GetResolver(void)
Definition: 3d_cache.cpp:739
void onDecrementOffset(wxSpinEvent &event) override
wxString m_Filename
The 3D shape filename in 3D library.
Definition: class_module.h:102
void onMouseWheelRot(wxMouseEvent &event) override
EDA_UNITS_T g_UserUnit
Global variables definitions.
Definition: common.cpp:57
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:177
const int scale
#define OFFSET_INCREMENT_MIL_FINE
#define OFFSET_INCREMENT_MIL
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
VECTOR3D m_Rotation
3D model rotation (degrees)
Definition: class_module.h:100
void updateOrientation(wxCommandEvent &event) override
updateOrientation - it will receive the events from editing the fields
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
wxString ResolvePath(const wxString &aFileName)
Function ResolvePath determines the full path of the given file name.
void onIncrementScale(wxSpinEvent &event) override
wxBitmapButton * m_bpvISO
double z
Definition: sg_base.h:72
PANEL_PREV_3D(wxWindow *aParent, S3D_CACHE *aCacheManager, MODULE *aModuleCopy, COLORS_DESIGN_SETTINGS *aColors, std::vector< MODULE_3D_SETTINGS > *aParentInfoList=NULL)
VECTOR3D m_Scale
3D model scaling factor (dimensionless)
Definition: class_module.h:99
Class COLORS_DESIGN_SETTINGS is a list of color settings for designs in Pcbnew.
#define ROTATION_INCREMENT_WHEEL_FINE
#define ROTATION_INCREMENT_WHEEL
#define MAX_OFFSET
#define MAX_ROTATION
BOARD * m_dummyBoard
A dummy board used to store the copy moduled.
wxString currentModelFile
Used to check if the model file was changed.
static void checkRotation(double &aRotation)
checkRotation Ensure -MAX_ROTATION <= rotation <= MAX_ROTATION aRotation will be normalized between -...
void UpdateModelName(wxString const &aModel)
wxSpinButton * m_spinYscale
MODULE_3D_SETTINGS m_modelInfo
Current MODULE_3D_SETTINGS that is being edited.