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-2017 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, wxMouseEventHandler(
84  }
85 
86 
88 {
89  m_previewPane->Disconnect( wxEVT_ENTER_WINDOW,
90  wxMouseEventHandler( PANEL_PREV_3D::onEnterPreviewCanvas ), NULL, this );
91 
92  delete m_settings3Dviewer;
93  delete m_dummyBoard;
94  delete m_previewPane;
95 }
96 
97 
99 {
100  m_resolver = NULL;
101  currentModelFile.clear();
102  m_dummyBoard = new BOARD();
104 
105  // Set the bitmap of 3D view buttons:
106  m_bpvTop->SetBitmap( KiBitmap( axis3d_top_xpm ) );
107  m_bpvFront->SetBitmap( KiBitmap( axis3d_front_xpm ) );
108  m_bpvBack->SetBitmap( KiBitmap( axis3d_back_xpm ) );
109  m_bpvLeft->SetBitmap( KiBitmap( axis3d_left_xpm ) );
110  m_bpvRight->SetBitmap( KiBitmap( axis3d_right_xpm ) );
111  m_bpvBottom->SetBitmap( KiBitmap( axis3d_bottom_xpm ) );
112  m_bpvISO->SetBitmap( KiBitmap( ortho_xpm ) );
113  m_bpUpdate->SetBitmap( KiBitmap( reload_xpm ) );
114 
115  // Set the min and max values of spin buttons (mandatory on Linux)
116  // They are not used, so they are set to min and max 32 bits int values
117  // (the min and max values supported by a wxSpinButton)
118  // It avoids blocking the up or down arrows when reaching this limit after
119  // a few clicks.
120  wxSpinButton* spinButtonList[] =
121  {
125  };
126 
127  for( int ii = 0; ii < 9; ii++ )
128  {
129  spinButtonList[ii]->SetRange( INT_MIN, INT_MAX );
130  }
131 
132  wxString units;
133 
134  switch( g_UserUnit )
135  {
136  case INCHES:
137  units = _( "inches" );
138  break;
139  case MILLIMETRES:
140  units = _( "mm" );
141  break;
142  default:
143  break;
144  }
145 
146  if( !units.IsEmpty() )
147  {
148  units = wxString::Format( _( "Offset (%s)" ), units );
149  vbOffset->GetStaticBox()->SetLabel( units );
150  }
151 }
152 
153 
154 
155 
162 static void checkRotation( double& aRotation )
163 {
164  if( aRotation > MAX_ROTATION )
165  {
166  int n = aRotation / MAX_ROTATION;
167  aRotation -= MAX_ROTATION * n;
168  }
169  else if( aRotation < -MAX_ROTATION )
170  {
171  int n = -aRotation / MAX_ROTATION;
172  aRotation += MAX_ROTATION * n;
173  }
174 }
175 
176 static bool validateFloatTextCtrl( wxTextCtrl* aTextCtrl )
177  {
178  if( aTextCtrl == NULL )
179  return false;
180 
181  if( aTextCtrl->GetLineLength(0) == 0 ) // This will skip the got and event with empty field
182  return false;
183 
184  if( aTextCtrl->GetLineLength(0) == 1 )
185  {
186  if( (aTextCtrl->GetLineText(0).compare( "." ) == 0) ||
187  (aTextCtrl->GetLineText(0).compare( "," ) == 0) )
188  return false;
189  }
190 
191  return true;
192 }
193 
194 
195 static void incrementTextCtrl( wxTextCtrl* aTextCtrl, double aInc, double aMinval, double aMaxval )
196 {
197  if( !validateFloatTextCtrl( aTextCtrl ) )
198  return;
199 
200  double curr_value = 0;
201 
202  aTextCtrl->GetValue().ToDouble( &curr_value );
203  curr_value += aInc;
204 
205  if( curr_value > aMaxval )
206  curr_value = aMaxval;
207 
208  if( curr_value < aMinval )
209  curr_value = aMinval;
210 
211  aTextCtrl->SetValue( wxString::Format( "%.4f", curr_value ) );
212 }
213 
214 
215 void PANEL_PREV_3D::SetModelDataIdx( int idx, bool aReloadPreviewModule )
216 {
217  wxASSERT( m_parentInfoList != NULL );
218 
219  if( m_parentInfoList && (idx >= 0) )
220  {
221  wxASSERT( (unsigned int)idx < (*m_parentInfoList).size() );
222 
223  if( (unsigned int)idx < (*m_parentInfoList).size() )
224  {
225  m_currentSelectedIdx = -1; // In case that we receive events on the
226  // next updates, it will set first an
227  // invalid selection
228 
229  const MODULE_3D_SETTINGS *aModel = (const MODULE_3D_SETTINGS *)&((*m_parentInfoList)[idx]);
230 
231  xscale->SetValue( wxString::Format( "%.4f", aModel->m_Scale.x ) );
232  yscale->SetValue( wxString::Format( "%.4f", aModel->m_Scale.y ) );
233  zscale->SetValue( wxString::Format( "%.4f", aModel->m_Scale.z ) );
234 
235  xrot->SetValue( wxString::Format( "%.2f", aModel->m_Rotation.x ) );
236  yrot->SetValue( wxString::Format( "%.2f", aModel->m_Rotation.y ) );
237  zrot->SetValue( wxString::Format( "%.2f", aModel->m_Rotation.z ) );
238 
239  // Convert from internal units (mm) to user units
240 
241  double scaler = 1;
242 
243  switch( g_UserUnit )
244  {
245  case MILLIMETRES:
246  scaler = 1.0f;
247  break;
248  case INCHES:
249  scaler = 25.4f;
250  break;
251  default:
252  wxASSERT( 0 );
253  }
254 
255  xoff->SetValue( wxString::Format( "%.4f", aModel->m_Offset.x / scaler ) );
256  yoff->SetValue( wxString::Format( "%.4f", aModel->m_Offset.y / scaler ) );
257  zoff->SetValue( wxString::Format( "%.4f", aModel->m_Offset.z / scaler ) );
258 
259  UpdateModelName( aModel->m_Filename );
260 
261  if( aReloadPreviewModule && m_previewPane )
262  {
264 
267  }
268 
269  m_currentSelectedIdx = idx;
270  }
271  }
272 
273  if( m_previewPane )
274  {
275  m_previewPane->SetFocus();
276  }
277 
278  return;
279 }
280 
281 
282 void PANEL_PREV_3D::ResetModelData( bool aReloadPreviewModule )
283 {
285 
286  xscale->SetValue( wxString::FromDouble( 1.0 ) );
287  yscale->SetValue( wxString::FromDouble( 1.0 ) );
288  zscale->SetValue( wxString::FromDouble( 1.0 ) );
289 
290  xrot->SetValue( wxString::FromDouble( 0.0 ) );
291  yrot->SetValue( wxString::FromDouble( 0.0 ) );
292  zrot->SetValue( wxString::FromDouble( 0.0 ) );
293 
294  xoff->SetValue( wxString::FromDouble( 0.0 ) );
295  yoff->SetValue( wxString::FromDouble( 0.0 ) );
296  zoff->SetValue( wxString::FromDouble( 0.0 ) );
297 
298  // This will update the model on the preview board with the current list of 3d shapes
299  if( aReloadPreviewModule )
300  {
302 
303  if( m_previewPane )
304  {
307  }
308  }
309 
310  if( m_previewPane )
311  m_previewPane->SetFocus();
312 }
313 
314 
315 void PANEL_PREV_3D::UpdateModelName( wxString const& aModelName )
316 {
317  bool newModel = false;
318 
319  m_modelInfo.m_Filename = aModelName;
320 
321  // if the model name is a directory simply clear the current model
322  if( aModelName.empty() || wxFileName::DirExists( aModelName ) )
323  {
324  currentModelFile.clear();
325  m_modelInfo.m_Filename.clear();
326  }
327  else
328  {
329  wxString newModelFile;
330 
331  if( m_resolver )
332  newModelFile = m_resolver->ResolvePath( aModelName );
333 
334  if( !newModelFile.empty() && newModelFile.Cmp( currentModelFile ) )
335  newModel = true;
336 
337  currentModelFile = newModelFile;
338  }
339 
340  if( currentModelFile.empty() || newModel )
341  {
343 
344  if( m_previewPane )
345  {
347  m_previewPane->Refresh();
348  }
349 
350  if( currentModelFile.empty() )
351  return;
352  }
353  else
354  {
355  if( m_previewPane )
356  m_previewPane->Refresh();
357  }
358 
359  if( m_previewPane )
360  m_previewPane->SetFocus();
361 
362  return;
363 }
364 
365 
366 void PANEL_PREV_3D::updateOrientation( wxCommandEvent &event )
367 {
368  wxTextCtrl *textCtrl = (wxTextCtrl *)event.GetEventObject();
369 
370  if( textCtrl == NULL )
371  return;
372 
373  if( textCtrl->GetLineLength(0) == 0 ) // This will skip the got and event with empty field
374  return;
375 
376  if( textCtrl->GetLineLength(0) == 1 )
377  if( (textCtrl->GetLineText(0).compare( "." ) == 0) ||
378  (textCtrl->GetLineText(0).compare( "," ) == 0) )
379  return;
380 
381  SGPOINT scale;
382  SGPOINT rotation;
383  SGPOINT offset;
384 
385  getOrientationVars( scale, rotation, offset );
386 
387  m_modelInfo.m_Scale.x = scale.x;
388  m_modelInfo.m_Scale.y = scale.y;
389  m_modelInfo.m_Scale.z = scale.z;
390  m_modelInfo.m_Offset.x = offset.x;
391  m_modelInfo.m_Offset.y = offset.y;
392  m_modelInfo.m_Offset.z = offset.z;
393  m_modelInfo.m_Rotation.x = rotation.x;
394  m_modelInfo.m_Rotation.y = rotation.y;
395  m_modelInfo.m_Rotation.z = rotation.z;
396 
397  if( m_currentSelectedIdx >= 0 )
398  {
399  // This will update the parent list with the new data
400  (*m_parentInfoList)[m_currentSelectedIdx] = m_modelInfo;
401 
402  // It will update the copy model in the preview board
404 
405  // Since the OpenGL render does not need to be reloaded to update the
406  // shapes position, we just request to redraw again the canvas
407  if( m_previewPane )
408  m_previewPane->Refresh();
409  }
410 }
411 
412 
413 void PANEL_PREV_3D::onIncrementRot( wxSpinEvent& event )
414 {
415  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
416 
417  wxTextCtrl * textCtrl = xrot;
418 
419  if( spinCtrl == m_spinYrot )
420  textCtrl = yrot;
421  else if( spinCtrl == m_spinZrot )
422  textCtrl = zrot;
423 
425 }
426 
427 
428 void PANEL_PREV_3D::onDecrementRot( wxSpinEvent& event )
429 {
430  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
431 
432  wxTextCtrl * textCtrl = xrot;
433 
434  if( spinCtrl == m_spinYrot )
435  textCtrl = yrot;
436  else if( spinCtrl == m_spinZrot )
437  textCtrl = zrot;
438 
440 }
441 
442 
443 void PANEL_PREV_3D::onIncrementScale( wxSpinEvent& event )
444 {
445  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
446 
447  wxTextCtrl * textCtrl = xscale;
448 
449  if( spinCtrl == m_spinYscale )
450  textCtrl = yscale;
451  else if( spinCtrl == m_spinZscale )
452  textCtrl = zscale;
453 
455 }
456 
457 
458 void PANEL_PREV_3D::onDecrementScale( wxSpinEvent& event )
459 {
460  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
461 
462  wxTextCtrl * textCtrl = xscale;
463 
464  if( spinCtrl == m_spinYscale )
465  textCtrl = yscale;
466  else if( spinCtrl == m_spinZscale )
467  textCtrl = zscale;
468 
470 }
471 
472 
473 void PANEL_PREV_3D::onIncrementOffset( wxSpinEvent& event )
474 {
475  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
476 
477  wxTextCtrl * textCtrl = xoff;
478 
479  if( spinCtrl == m_spinYoffset )
480  textCtrl = yoff;
481  else if( spinCtrl == m_spinZoffset )
482  textCtrl = zoff;
483 
484  double step = OFFSET_INCREMENT_MM;
485 
486  if( g_UserUnit == INCHES )
487  step = OFFSET_INCREMENT_MIL/1000.0;
488 
489  incrementTextCtrl( textCtrl, step, -MAX_OFFSET, MAX_OFFSET );
490 }
491 
492 
493 void PANEL_PREV_3D::onDecrementOffset( wxSpinEvent& event )
494 {
495  wxSpinButton* spinCtrl = (wxSpinButton*) event.GetEventObject();
496 
497  wxTextCtrl * textCtrl = xoff;
498 
499  if( spinCtrl == m_spinYoffset )
500  textCtrl = yoff;
501  else if( spinCtrl == m_spinZoffset )
502  textCtrl = zoff;
503 
504  double step = OFFSET_INCREMENT_MM;
505 
506  if( g_UserUnit == INCHES )
507  step = OFFSET_INCREMENT_MIL/1000.0;
508 
509  incrementTextCtrl( textCtrl, -step, -MAX_OFFSET, MAX_OFFSET );
510 }
511 
512 
513 void PANEL_PREV_3D::onMouseWheelScale( wxMouseEvent& event )
514 {
515  wxTextCtrl* textCtrl = (wxTextCtrl*) event.GetEventObject();
516 
517  double step = SCALE_INCREMENT;
518 
519  if( event.ShiftDown( ) )
520  step = SCALE_INCREMENT_FINE;
521 
522  if( event.GetWheelRotation() >= 0 )
523  step = -step;
524 
525  incrementTextCtrl( textCtrl, step, 1/MAX_SCALE, MAX_SCALE );
526 }
527 
528 
529 void PANEL_PREV_3D::onMouseWheelRot( wxMouseEvent& event )
530 {
531  wxTextCtrl* textCtrl = (wxTextCtrl*) event.GetEventObject();
532 
533  wxKeyboardState kbdState;
534 
535  double step = ROTATION_INCREMENT_WHEEL;
536 
537  if( event.ShiftDown( ) )
539 
540  if( event.GetWheelRotation() >= 0 )
541  step = -step;
542 
543  incrementTextCtrl( textCtrl, step, -MAX_ROTATION, MAX_ROTATION );
544 }
545 
546 void PANEL_PREV_3D::onMouseWheelOffset( wxMouseEvent& event )
547 {
548  wxTextCtrl* textCtrl = (wxTextCtrl*) event.GetEventObject();
549 
550  double step = OFFSET_INCREMENT_MM;
551  if( event.ShiftDown( ) )
553 
554  if( g_UserUnit == INCHES )
555  {
556  step = OFFSET_INCREMENT_MIL/1000.0;
557  if( event.ShiftDown( ) )
558  step = OFFSET_INCREMENT_MIL_FINE/1000.0;
559  }
560 
561  if( event.GetWheelRotation() >= 0 )
562  step = -step;
563 
564  incrementTextCtrl( textCtrl, step, -MAX_OFFSET, MAX_OFFSET );
565 }
566 
567 void PANEL_PREV_3D::getOrientationVars( SGPOINT& aScale, SGPOINT& aRotation, SGPOINT& aOffset )
568 {
569  if( NULL == xscale || NULL == yscale || NULL == zscale
570  || NULL == xrot || NULL == yrot || NULL == zrot
571  || NULL == xoff || NULL == yoff || NULL == zoff )
572  {
573  return;
574  }
575 
576  xscale->GetValue().ToDouble( &aScale.x );
577  yscale->GetValue().ToDouble( &aScale.y );
578  zscale->GetValue().ToDouble( &aScale.z );
579 
580  xrot->GetValue().ToDouble( &aRotation.x );
581  yrot->GetValue().ToDouble( &aRotation.y );
582  zrot->GetValue().ToDouble( &aRotation.z );
583 
584  checkRotation( aRotation.x );
585  checkRotation( aRotation.y );
586  checkRotation( aRotation.z );
587 
588  xoff->GetValue().ToDouble( &aOffset.x );
589  yoff->GetValue().ToDouble( &aOffset.y );
590  zoff->GetValue().ToDouble( &aOffset.z );
591 
592  // Convert from user units to internal units (mm)
593 
594  double scaler = 1.0f;
595 
596  switch( g_UserUnit )
597  {
598  case MILLIMETRES:
599  scaler = 1.0f;
600  break;
601  case INCHES:
602  scaler = 25.4f;
603  break;
604  default:
605  wxASSERT( 0 );
606  }
607 
608  aOffset.x *= scaler;
609  aOffset.y *= scaler;
610  aOffset.z *= scaler;
611 
612  return;
613 }
614 
615 
616 bool PANEL_PREV_3D::ValidateWithMessage( wxString& aErrorMessage )
617 {
618  bool invalidScale = false;
619 
620  for( unsigned int idx = 0; idx < m_parentInfoList->size(); ++idx )
621  {
622  wxString msg;
623  bool addError = false;
624  MODULE_3D_SETTINGS& s3dshape = (*m_parentInfoList)[idx];
625 
626  SGPOINT scale;
627  scale.x = s3dshape.m_Scale.x;
628  scale.y = s3dshape.m_Scale.y;
629  scale.z = s3dshape.m_Scale.z;
630 
631  if( 1/MAX_SCALE > scale.x || MAX_SCALE < scale.x )
632  {
633  invalidScale = true;
634  addError = true;
635  msg += _( "Invalid X scale" );
636  }
637 
638  if( 1/MAX_SCALE > scale.y || MAX_SCALE < scale.y )
639  {
640  invalidScale = true;
641  addError = true;
642 
643  if( !msg.IsEmpty() )
644  msg += "\n";
645 
646  msg += _( "Invalid Y scale" );
647  }
648 
649  if( 1/MAX_SCALE > scale.z || MAX_SCALE < scale.z )
650  {
651  invalidScale = true;
652  addError = true;
653 
654  if( !msg.IsEmpty() )
655  msg += "\n";
656 
657  msg += _( "Invalid Z scale" );
658  }
659 
660  if( addError )
661  {
662  msg.Prepend( s3dshape.m_Filename + "\n" );
663 
664  if( !aErrorMessage.IsEmpty() )
665  aErrorMessage += "\n\n";
666 
667  aErrorMessage += msg;
668  }
669  }
670 
671  if( !aErrorMessage.IsEmpty() )
672  {
673  aErrorMessage += "\n\n";
674  aErrorMessage += wxString::Format( "Min value = %.4f and max value = %.4f",
675  1/MAX_SCALE, MAX_SCALE );
676  }
677 
678  return invalidScale == false;
679 }
680 
682 {
683  auto draw3D = &m_copyModule->Models();
684  draw3D->clear();
685  draw3D->insert( draw3D->end(), m_parentInfoList->begin(), m_parentInfoList->end() );
686 }
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:100
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:36
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.
wxStaticBoxSizer * vbOffset
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:101
void onMouseWheelRot(wxMouseEvent &event) override
EDA_UNITS_T g_UserUnit
Global variables definitions.
Definition: common.cpp:56
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:170
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:99
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:98
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.