Pcbnew: 3D view: Better 3D rendering (fix some artifact issues). Add a realistic rendering mode.
This commit is contained in:
parent
191cc6d16d
commit
5614ba009a
|
@ -146,11 +146,69 @@ void EDA_3D_CANVAS::Redraw( bool finish )
|
|||
SwapBuffers();
|
||||
}
|
||||
|
||||
// Helper function: initialize the copper color to draw the board
|
||||
// in realistic mode.
|
||||
static inline void SetGLCopperColor()
|
||||
{
|
||||
// Generates a golden yellow color, near board "copper" color
|
||||
const double lum = 0.7/255.0;
|
||||
glColor4f( 255.0*lum, 223.0*lum, 0.0*lum, 1.0 );
|
||||
}
|
||||
|
||||
// Helper function: initialize the color to draw the epoxy layers
|
||||
// ( body board and solder mask layers) in realistic mode.
|
||||
static inline void SetGLEpoxyColor( double aTransparency = 1.0 )
|
||||
{
|
||||
// Generates an epoxy color, near board color
|
||||
const double lum = 0.2/255.0;
|
||||
glColor4f( 100.0*lum, 255.0*lum, 180.0*lum, aTransparency );
|
||||
}
|
||||
|
||||
// Helper function: initialize the color to draw the non copper layers
|
||||
// in realistic mode and normal mode.
|
||||
static inline void SetGLTechLayersColor( LAYER_NUM aLayer )
|
||||
{
|
||||
// Generates an epoxy color, near board color
|
||||
// const double lum = 0.2/255.0;
|
||||
|
||||
if( g_Parm_3D_Visu.IsRealisticMode() )
|
||||
{
|
||||
switch( aLayer )
|
||||
{
|
||||
case SOLDERPASTE_N_BACK:
|
||||
case SOLDERPASTE_N_FRONT:
|
||||
SetGLColor( DARKGRAY, 0.7 );
|
||||
break;
|
||||
|
||||
case SILKSCREEN_N_BACK:
|
||||
case SILKSCREEN_N_FRONT:
|
||||
SetGLColor( LIGHTGRAY, 0.9 );
|
||||
break;
|
||||
|
||||
case SOLDERMASK_N_BACK:
|
||||
case SOLDERMASK_N_FRONT:
|
||||
SetGLEpoxyColor( 0.7 );
|
||||
break;
|
||||
|
||||
default:
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( aLayer );
|
||||
SetGLColor( color, 0.7 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( aLayer );
|
||||
SetGLColor( color, 0.7 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void EDA_3D_CANVAS::BuildBoard3DView()
|
||||
{
|
||||
PCB_BASE_FRAME* pcbframe = Parent()->Parent();
|
||||
BOARD* pcb = pcbframe->GetBoard();
|
||||
bool realistic_mode = g_Parm_3D_Visu.IsRealisticMode();
|
||||
|
||||
// Number of segments to draw a circle using segments
|
||||
const int segcountforcircle = 16;
|
||||
|
@ -170,12 +228,15 @@ void EDA_3D_CANVAS::BuildBoard3DView()
|
|||
|
||||
// Build a polygon from edge cut items
|
||||
wxString msg;
|
||||
if( ! pcb->GetBoardPolygonOutlines( bufferPcbOutlines,
|
||||
allLayerHoles, &msg ) )
|
||||
if( realistic_mode || g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_SHOW_BOARD_BODY] )
|
||||
{
|
||||
msg << wxT("\n\n") <<
|
||||
_("Unable to calculate the board outlines, will use the outlines boundary box");
|
||||
wxMessageBox( msg );
|
||||
if( ! pcb->GetBoardPolygonOutlines( bufferPcbOutlines,
|
||||
allLayerHoles, &msg ) )
|
||||
{
|
||||
msg << wxT("\n\n") <<
|
||||
_("Unable to calculate the board outlines, will use the outlines boundary box");
|
||||
wxMessageBox( msg );
|
||||
}
|
||||
}
|
||||
|
||||
CPOLYGONS_LIST bufferZonesPolys;
|
||||
|
@ -192,7 +253,7 @@ void EDA_3D_CANVAS::BuildBoard3DView()
|
|||
&& layer >= g_Parm_3D_Visu.m_CopperLayersCount )
|
||||
continue;
|
||||
|
||||
if( !g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( layer ) )
|
||||
if( !Is3DLayerEnabled( layer ) )
|
||||
continue;
|
||||
|
||||
bufferPolys.RemoveAllContours();
|
||||
|
@ -315,11 +376,17 @@ void EDA_3D_CANVAS::BuildBoard3DView()
|
|||
// Merge polygons, remove holes
|
||||
currLayerPolyset -= polysetHoles;
|
||||
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( layer );
|
||||
int thickness = g_Parm_3D_Visu.GetLayerObjectThicknessBIU( layer );
|
||||
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
|
||||
|
||||
SetGLColor( color );
|
||||
if( realistic_mode )
|
||||
SetGLCopperColor();
|
||||
else
|
||||
{
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( layer );
|
||||
SetGLColor( color );
|
||||
}
|
||||
|
||||
glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) );
|
||||
|
||||
bufferPolys.RemoveAllContours();
|
||||
|
@ -350,6 +417,53 @@ void EDA_3D_CANVAS::BuildBoard3DView()
|
|||
Draw3DPadHole( pad );
|
||||
}
|
||||
|
||||
// Draw board substrate:
|
||||
if( bufferPcbOutlines.GetCornersCount() )
|
||||
{
|
||||
int copper_thickness = g_Parm_3D_Visu.GetCopperThicknessBIU();
|
||||
// a small offset between substrate and external copper layer to avoid artifacts
|
||||
// when drawing copper items on board
|
||||
int epsilon = Millimeter2iu( 0.01 );
|
||||
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK );
|
||||
int board_thickness = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_FRONT )
|
||||
- g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK );
|
||||
// items on copper layers and having a thickness = copper_thickness
|
||||
// are drawn from zpos - copper_thickness/2 to zpos + copper_thickness
|
||||
// therefore substrate position is copper_thickness/2 to
|
||||
// substrate_height - copper_thickness/2
|
||||
zpos += (copper_thickness + epsilon) / 2;
|
||||
board_thickness -= copper_thickness + epsilon;
|
||||
|
||||
if( realistic_mode )
|
||||
SetGLEpoxyColor();
|
||||
else
|
||||
{
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( EDGE_N );
|
||||
SetGLColor( color, 0.7 );
|
||||
}
|
||||
|
||||
glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( LAYER_N_FRONT ) );
|
||||
KI_POLYGON_SET currLayerPolyset;
|
||||
KI_POLYGON_SET polysetHoles;
|
||||
|
||||
// Add polygons, without holes
|
||||
bufferPcbOutlines.ExportTo( currLayerPolyset );
|
||||
|
||||
// Build holes list
|
||||
allLayerHoles.ExportTo( polysetHoles );
|
||||
|
||||
// remove holes
|
||||
currLayerPolyset -= polysetHoles;
|
||||
|
||||
bufferPcbOutlines.RemoveAllContours();
|
||||
bufferPcbOutlines.ImportFrom( currLayerPolyset );
|
||||
|
||||
// for Draw3D_SolidHorizontalPolyPolygons, zpos it the middle between bottom and top
|
||||
// sides
|
||||
Draw3D_SolidHorizontalPolyPolygons( bufferPcbOutlines, zpos + board_thickness/2,
|
||||
board_thickness, g_Parm_3D_Visu.m_BiuTo3Dunits );
|
||||
}
|
||||
|
||||
// draw graphic items, not on copper layers
|
||||
for( LAYER_NUM layer = FIRST_NON_COPPER_LAYER; layer <= LAST_NON_COPPER_LAYER;
|
||||
layer++ )
|
||||
|
@ -357,10 +471,7 @@ void EDA_3D_CANVAS::BuildBoard3DView()
|
|||
if( !Is3DLayerEnabled( layer ) )
|
||||
continue;
|
||||
|
||||
if( !g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( layer ) )
|
||||
continue;
|
||||
|
||||
if( layer == EDGE_N )
|
||||
if( layer == EDGE_N && g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_SHOW_BOARD_BODY] )
|
||||
continue;
|
||||
|
||||
bufferPolys.RemoveAllContours();
|
||||
|
@ -442,50 +553,36 @@ void EDA_3D_CANVAS::BuildBoard3DView()
|
|||
currLayerPolyset += polyset;
|
||||
}
|
||||
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( layer );
|
||||
SetGLTechLayersColor( layer );
|
||||
int thickness = g_Parm_3D_Visu.GetLayerObjectThicknessBIU( layer );
|
||||
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
|
||||
|
||||
SetGLColor( color, 0.7 );
|
||||
glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) );
|
||||
|
||||
if( layer == EDGE_N )
|
||||
{
|
||||
thickness = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_FRONT )
|
||||
- g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK );
|
||||
zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK )
|
||||
+ (thickness / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
// for Draw3D_SolidHorizontalPolyPolygons, zpos it the middle between bottom and top
|
||||
// sides.
|
||||
// However for top layers, zpos should be the bottom layer pos,
|
||||
// and for bottom layers, zpos should be the top layer pos.
|
||||
if( Get3DLayer_Z_Orientation( layer ) > 0 )
|
||||
zpos += thickness/2;
|
||||
else
|
||||
zpos -= thickness/2 ;
|
||||
}
|
||||
|
||||
bufferPolys.RemoveAllContours();
|
||||
bufferPolys.ImportFrom( currLayerPolyset );
|
||||
Draw3D_SolidHorizontalPolyPolygons( bufferPolys, zpos,
|
||||
thickness, g_Parm_3D_Visu.m_BiuTo3Dunits );
|
||||
}
|
||||
|
||||
// Draw board substrate:
|
||||
if( bufferPcbOutlines.GetCornersCount() )
|
||||
{
|
||||
int copper_thickness = g_Parm_3D_Visu.GetLayerObjectThicknessBIU( LAYER_N_BACK );
|
||||
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK );
|
||||
int thickness = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_FRONT )
|
||||
- g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK );
|
||||
zpos += (thickness/2) + (copper_thickness/2);
|
||||
thickness -= copper_thickness;
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( EDGE_N );
|
||||
SetGLColor( color, 0.8 );
|
||||
glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( LAYER_N_FRONT ) );
|
||||
KI_POLYGON_SET currLayerPolyset;
|
||||
KI_POLYGON_SET polysetHoles;
|
||||
|
||||
// Add polygons, without holes
|
||||
bufferPcbOutlines.ExportTo( currLayerPolyset );
|
||||
|
||||
// Build holes list
|
||||
allLayerHoles.ExportTo( polysetHoles );
|
||||
|
||||
// remove holes
|
||||
currLayerPolyset -= polysetHoles;
|
||||
|
||||
bufferPcbOutlines.RemoveAllContours();
|
||||
bufferPcbOutlines.ImportFrom( currLayerPolyset );
|
||||
|
||||
Draw3D_SolidHorizontalPolyPolygons( bufferPcbOutlines, zpos,
|
||||
thickness, g_Parm_3D_Visu.m_BiuTo3Dunits );
|
||||
}
|
||||
|
||||
// draw modules 3D shapes
|
||||
for( MODULE* module = pcb->m_Modules; module != NULL; module = module->Next() )
|
||||
module->ReadAndInsert3DComponentShape( this );
|
||||
|
@ -706,8 +803,14 @@ void EDA_3D_CANVAS::Draw3DViaHole( SEGVIA* aVia )
|
|||
aVia->ReturnLayerPair( &top_layer, &bottom_layer );
|
||||
|
||||
// Drawing via hole:
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + aVia->GetShape() );
|
||||
SetGLColor( color );
|
||||
if( g_Parm_3D_Visu.IsRealisticMode() )
|
||||
SetGLCopperColor();
|
||||
else
|
||||
{
|
||||
EDA_COLOR_T color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + aVia->GetShape() );
|
||||
SetGLColor( color );
|
||||
}
|
||||
|
||||
int height = g_Parm_3D_Visu.GetLayerZcoordBIU( top_layer ) -
|
||||
g_Parm_3D_Visu.GetLayerZcoordBIU( bottom_layer ) - thickness;
|
||||
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( bottom_layer ) + thickness / 2;
|
||||
|
@ -773,7 +876,11 @@ void EDA_3D_CANVAS::Draw3DPadHole( D_PAD* aPad )
|
|||
int height = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_FRONT ) -
|
||||
g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK );
|
||||
|
||||
SetGLColor( DARKGRAY );
|
||||
if( g_Parm_3D_Visu.IsRealisticMode() )
|
||||
SetGLCopperColor();
|
||||
else
|
||||
SetGLColor( DARKGRAY );
|
||||
|
||||
int holeZpoz = g_Parm_3D_Visu.GetLayerZcoordBIU( LAYER_N_BACK ) + thickness / 2;
|
||||
int holeHeight = height - thickness;
|
||||
|
||||
|
@ -815,6 +922,7 @@ void EDA_3D_CANVAS::Draw3DPadHole( D_PAD* aPad )
|
|||
bool Is3DLayerEnabled( LAYER_NUM aLayer )
|
||||
{
|
||||
int flg;
|
||||
bool realistic_mode = g_Parm_3D_Visu.IsRealisticMode();
|
||||
|
||||
// see if layer needs to be shown
|
||||
// check the flags
|
||||
|
@ -842,21 +950,37 @@ bool Is3DLayerEnabled( LAYER_NUM aLayer )
|
|||
|
||||
case DRAW_N:
|
||||
case COMMENT_N:
|
||||
if( realistic_mode )
|
||||
return false;
|
||||
|
||||
flg = g_Parm_3D_Visu.FL_COMMENTS;
|
||||
break;
|
||||
|
||||
case ECO1_N:
|
||||
case ECO2_N:
|
||||
if( realistic_mode )
|
||||
return false;
|
||||
|
||||
flg = g_Parm_3D_Visu.FL_ECO;
|
||||
break;
|
||||
|
||||
case LAYER_N_BACK:
|
||||
case LAYER_N_FRONT:
|
||||
return g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( aLayer )
|
||||
|| realistic_mode;
|
||||
break;
|
||||
|
||||
default:
|
||||
// the layer was not a layer with a flag, so show it
|
||||
return true;
|
||||
// the layer is an internal copper layer
|
||||
if( realistic_mode )
|
||||
return false;
|
||||
|
||||
return g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( aLayer );
|
||||
}
|
||||
|
||||
// if the layer has a flag, return the flag
|
||||
return g_Parm_3D_Visu.m_DrawFlags[flg];
|
||||
return g_Parm_3D_Visu.m_DrawFlags[flg] &&
|
||||
g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( aLayer );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
* @param aThickness = thickness in board internal units
|
||||
* @param aBiuTo3DUnits = board internal units to 3D units scaling value
|
||||
* If aThickness = 0, a polygon area is drawn in a XY plane at Z position = aZpos.
|
||||
* If aThickness 1 0, a solid object is drawn.
|
||||
* If aThickness > 0, a solid object is drawn.
|
||||
* The top side is located at aZpos + aThickness / 2
|
||||
* The bottom side is located at aZpos - aThickness / 2
|
||||
*/
|
||||
|
|
|
@ -47,6 +47,7 @@ static const wxString keySizey( wxT( "Size_y" ) );
|
|||
static const wxString keyBgColor_Red( wxT( "BgColor_Red" ) );
|
||||
static const wxString keyBgColor_Green( wxT( "BgColor_Green" ) );
|
||||
static const wxString keyBgColor_Blue( wxT( "BgColor_Blue" ) );
|
||||
static const wxString keyShowRealisticMode( wxT( "ShowRealisticMode" ) );
|
||||
static const wxString keyShowAxis( wxT( "ShowAxis" ) );
|
||||
static const wxString keyShowZones( wxT( "ShowZones" ) );
|
||||
static const wxString keyShowFootprints( wxT( "ShowFootprints" ) );
|
||||
|
@ -56,6 +57,7 @@ static const wxString keyShowSilkScreenLayers( wxT( "ShowSilkScreenLayers" ) )
|
|||
static const wxString keyShowSolderMaskLayers( wxT( "ShowSolderMasLayers" ) );
|
||||
static const wxString keyShowSolderPasteLayers( wxT( "ShowSolderPasteLayers" ) );
|
||||
static const wxString keyShowCommentsLayer( wxT( "ShowCommentsLayers" ) );
|
||||
static const wxString keyShowBoardBody( wxT( "ShowBoardBody" ) );
|
||||
static const wxString keyShowEcoLayers( wxT( "ShowEcoLayers" ) );
|
||||
|
||||
BEGIN_EVENT_TABLE( EDA_3D_FRAME, wxFrame )
|
||||
|
@ -167,6 +169,8 @@ void EDA_3D_FRAME::GetSettings()
|
|||
config->Read( keyBgColor_Green, &g_Parm_3D_Visu.m_BgColor.m_Green, 0.0 );
|
||||
config->Read( keyBgColor_Blue, &g_Parm_3D_Visu.m_BgColor.m_Blue, 0.0 );
|
||||
class INFO3D_VISU& prms = g_Parm_3D_Visu;
|
||||
config->Read( keyShowRealisticMode,
|
||||
&prms.m_DrawFlags[prms.FL_USE_REALISTIC_MODE], false );
|
||||
config->Read( keyShowAxis, &prms.m_DrawFlags[prms.FL_AXIS], true );
|
||||
config->Read( keyShowFootprints, &prms.m_DrawFlags[prms.FL_MODULE], true );
|
||||
config->Read( keyShowCopperThickness,
|
||||
|
@ -179,6 +183,7 @@ void EDA_3D_FRAME::GetSettings()
|
|||
config->Read( keyShowSolderPasteLayers, &prms.m_DrawFlags[prms.FL_SOLDERPASTE], true );
|
||||
config->Read( keyShowCommentsLayer, &prms.m_DrawFlags[prms.FL_COMMENTS], true );
|
||||
config->Read( keyShowEcoLayers, &prms.m_DrawFlags[prms.FL_ECO], true );
|
||||
config->Read( keyShowBoardBody, &prms.m_DrawFlags[prms.FL_SHOW_BOARD_BODY], true );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -195,6 +200,7 @@ void EDA_3D_FRAME::SaveSettings()
|
|||
config->Write( keyBgColor_Green, g_Parm_3D_Visu.m_BgColor.m_Green );
|
||||
config->Write( keyBgColor_Blue, g_Parm_3D_Visu.m_BgColor.m_Blue );
|
||||
class INFO3D_VISU& prms = g_Parm_3D_Visu;
|
||||
config->Write( keyShowRealisticMode, prms.m_DrawFlags[prms.FL_USE_REALISTIC_MODE] );
|
||||
config->Write( keyShowAxis, prms.m_DrawFlags[prms.FL_AXIS] );
|
||||
config->Write( keyShowFootprints, prms.m_DrawFlags[prms.FL_MODULE] );
|
||||
config->Write( keyShowCopperThickness, prms.m_DrawFlags[prms.FL_USE_COPPER_THICKNESS] );
|
||||
|
@ -205,6 +211,7 @@ void EDA_3D_FRAME::SaveSettings()
|
|||
config->Write( keyShowSolderPasteLayers, prms.m_DrawFlags[prms.FL_SOLDERPASTE] );
|
||||
config->Write( keyShowCommentsLayer, prms.m_DrawFlags[prms.FL_COMMENTS] );
|
||||
config->Write( keyShowEcoLayers, prms.m_DrawFlags[prms.FL_ECO] );
|
||||
config->Write( keyShowBoardBody, prms.m_DrawFlags[prms.FL_SHOW_BOARD_BODY] );
|
||||
|
||||
if( IsIconized() )
|
||||
return;
|
||||
|
@ -355,6 +362,16 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
Set3DBgColor();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_REALISTIC_MODE:
|
||||
g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_USE_REALISTIC_MODE] = isChecked;
|
||||
NewDisplay();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_SHOW_BOARD_BODY:
|
||||
g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_SHOW_BOARD_BODY] = isChecked;
|
||||
NewDisplay();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_AXIS_ONOFF:
|
||||
g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_AXIS] = isChecked;
|
||||
NewDisplay();
|
||||
|
|
|
@ -158,17 +158,19 @@ void EDA_3D_FRAME::CreateMenuBar()
|
|||
|
||||
menuBar->Append( prefsMenu, _( "&Preferences" ) );
|
||||
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_REALISTIC_MODE,
|
||||
_( "Realistic Mode" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
|
||||
prefsMenu->AppendSeparator();
|
||||
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_BGCOLOR_SELECTION,
|
||||
_( "Choose background color" ), KiBitmap( palette_xpm ) );
|
||||
|
||||
wxMenuItem* item;
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_AXIS_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_AXIS_ONOFF,
|
||||
_( "Show 3D &Axis" ), KiBitmap( axis3d_front_xpm ), wxITEM_CHECK );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_AXIS]);
|
||||
|
||||
// Creates grid menu
|
||||
wxMenu * gridlistMenu = new wxMenu;
|
||||
item = AddMenuItem( prefsMenu, gridlistMenu, ID_MENU3D_GRID,
|
||||
AddMenuItem( prefsMenu, gridlistMenu, ID_MENU3D_GRID,
|
||||
_( "3D Grid" ), KiBitmap( grid_xpm ) );
|
||||
gridlistMenu->Append( ID_MENU3D_GRID_NOGRID, _( "No 3D Grid" ), wxEmptyString, true );
|
||||
gridlistMenu->Check( ID_MENU3D_GRID_NOGRID, true );
|
||||
|
@ -178,32 +180,34 @@ void EDA_3D_FRAME::CreateMenuBar()
|
|||
gridlistMenu->Append( ID_MENU3D_GRID_2P5_MM, _( "3D Grid 2.5 mm" ), wxEmptyString, true );
|
||||
gridlistMenu->Append( ID_MENU3D_GRID_1_MM, _( "3D Grid 1 mm" ), wxEmptyString, true );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_USE_COPPER_THICKNESS,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_SHOW_BOARD_BODY,
|
||||
_( "Show Board Body" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
|
||||
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_USE_COPPER_THICKNESS,
|
||||
_( "Show Copper Thickness" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_MODULE_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_MODULE_ONOFF,
|
||||
_( "Show 3D F&ootprints" ), KiBitmap( shape_3d_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_ZONE_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_ZONE_ONOFF,
|
||||
_( "Show Zone &Filling" ), KiBitmap( add_zone_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_ADHESIVE_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_ADHESIVE_ONOFF,
|
||||
_( "Show &Adhesive Layers" ), KiBitmap( tools_xpm ), wxITEM_CHECK );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_ADHESIVE]);
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_SILKSCREEN_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_SILKSCREEN_ONOFF,
|
||||
_( "Show &Silkscreen Layer" ), KiBitmap( add_text_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_SOLDER_MASK_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_SOLDER_MASK_ONOFF,
|
||||
_( "Show Solder &Mask Layers" ), KiBitmap( pads_mask_layers_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_SOLDER_PASTE_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_SOLDER_PASTE_ONOFF,
|
||||
_( "Show Solder &Paste Layers" ), KiBitmap( pads_mask_layers_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_COMMENTS_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_COMMENTS_ONOFF,
|
||||
_( "Show &Comments and Drawings Layer" ), KiBitmap( edit_sheet_xpm ), wxITEM_CHECK );
|
||||
|
||||
item = AddMenuItem( prefsMenu, ID_MENU3D_ECO_ONOFF,
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_ECO_ONOFF,
|
||||
_( "Show &Eco Layers" ), KiBitmap( edit_sheet_xpm ), wxITEM_CHECK );
|
||||
|
||||
SetMenuBar( menuBar );
|
||||
|
@ -219,6 +223,12 @@ void EDA_3D_FRAME::SetMenuBarOptionsState()
|
|||
|
||||
wxMenuItem* item;
|
||||
// Set the state of toggle menus according to the current display options
|
||||
item = menuBar->FindItem( ID_MENU3D_REALISTIC_MODE );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_USE_REALISTIC_MODE]);
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_SHOW_BOARD_BODY );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_SHOW_BOARD_BODY]);
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_USE_COPPER_THICKNESS );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_USE_COPPER_THICKNESS]);
|
||||
|
||||
|
@ -228,6 +238,9 @@ void EDA_3D_FRAME::SetMenuBarOptionsState()
|
|||
item = menuBar->FindItem( ID_MENU3D_ZONE_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_ZONE]);
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_AXIS_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_AXIS]);
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_ADHESIVE_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.m_DrawFlags[g_Parm_3D_Visu.FL_ADHESIVE]);
|
||||
|
||||
|
|
|
@ -39,6 +39,8 @@ enum id_3dview_frm
|
|||
ID_MENU3D_SOLDER_MASK_ONOFF,
|
||||
ID_MENU3D_COMMENTS_ONOFF,
|
||||
ID_MENU3D_ECO_ONOFF,
|
||||
ID_MENU3D_SHOW_BOARD_BODY,
|
||||
ID_MENU3D_REALISTIC_MODE,
|
||||
ID_END_COMMAND_3D,
|
||||
|
||||
ID_TOOL_SET_VISIBLE_ITEMS,
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
// Thickness of copper
|
||||
// TODO: define the actual copper thickness by user
|
||||
#define COPPER_THICKNESS KiROUND( 0.035 * IU_PER_MM ) // for 35 µm
|
||||
#define COPPER_THICKNESS KiROUND( 0.035 * IU_PER_MM ) // for 35 um
|
||||
#define TECH_LAYER_THICKNESS KiROUND( 0.04 * IU_PER_MM )
|
||||
#define EPOXY_THICKNESS KiROUND( 1.6 * IU_PER_MM ) // for 1.6 mm
|
||||
|
||||
|
@ -124,8 +124,10 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
|
|||
m_EpoxyThickness * layer / (copper_layers_cnt - 1);
|
||||
}
|
||||
|
||||
double zpos_copper_back = m_LayerZcoord[0];
|
||||
double zpos_copper_front = m_EpoxyThickness;
|
||||
#define layerThicknessMargin 1.1
|
||||
double zpos_offset = m_NonCopperLayerThickness * layerThicknessMargin;
|
||||
double zpos_copper_back = m_LayerZcoord[0] - layerThicknessMargin*m_CopperThickness/2;
|
||||
double zpos_copper_front = m_EpoxyThickness + layerThicknessMargin*m_CopperThickness/2;
|
||||
|
||||
// Fill remaining unused copper layers and front layer zpos
|
||||
// with m_EpoxyThickness
|
||||
|
@ -138,54 +140,44 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
|
|||
for( int layer_id = FIRST_NON_COPPER_LAYER; layer_id < NB_PCB_LAYERS; layer_id++ )
|
||||
{
|
||||
double zpos;
|
||||
#define NonCopperLayerThicknessMargin 1.1
|
||||
|
||||
switch( layer_id )
|
||||
{
|
||||
case ADHESIVE_N_BACK:
|
||||
zpos = zpos_copper_back -
|
||||
4 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_back - 4 * zpos_offset;
|
||||
break;
|
||||
|
||||
case ADHESIVE_N_FRONT:
|
||||
zpos = zpos_copper_front +
|
||||
4 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_front + 4 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERPASTE_N_BACK:
|
||||
zpos = zpos_copper_back -
|
||||
3 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_back - 3 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERPASTE_N_FRONT:
|
||||
zpos = zpos_copper_front +
|
||||
3 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_front + 3 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERMASK_N_BACK:
|
||||
zpos = zpos_copper_back -
|
||||
1 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_back - 1 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERMASK_N_FRONT:
|
||||
zpos = zpos_copper_front +
|
||||
1 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_front + 2 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SILKSCREEN_N_BACK:
|
||||
zpos = zpos_copper_back -
|
||||
2 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_back - 2 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SILKSCREEN_N_FRONT:
|
||||
zpos = zpos_copper_front +
|
||||
2 * m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
zpos = zpos_copper_front + 2 * zpos_offset;
|
||||
break;
|
||||
|
||||
default:
|
||||
zpos = zpos_copper_front +
|
||||
(layer_id - FIRST_NON_COPPER_LAYER + 5) *
|
||||
m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
|
||||
(layer_id - FIRST_NON_COPPER_LAYER + 5) * zpos_offset;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -72,6 +72,8 @@ public:
|
|||
FL_COMMENTS, FL_ECO,
|
||||
FL_GRID,
|
||||
FL_USE_COPPER_THICKNESS,
|
||||
FL_SHOW_BOARD_BODY,
|
||||
FL_USE_REALISTIC_MODE,
|
||||
FL_LAST
|
||||
};
|
||||
|
||||
|
@ -133,11 +135,14 @@ public: INFO3D_VISU();
|
|||
* note: the thickness (Z size) of the copper is not the thickness
|
||||
* of the layer (the thickness of the layer is the epoxy thickness / layer count)
|
||||
*
|
||||
* Note: if m_DrawFlags[FL_USE_COPPER_THICKNESS] is not set, returns 0
|
||||
* Note: if m_DrawFlags[FL_USE_COPPER_THICKNESS] is not set,
|
||||
* and normal mode, returns 0
|
||||
*/
|
||||
int GetCopperThicknessBIU() const
|
||||
{
|
||||
return m_DrawFlags[FL_USE_COPPER_THICKNESS] ?
|
||||
bool use_copper_thickness = m_DrawFlags[FL_USE_COPPER_THICKNESS] ||
|
||||
m_DrawFlags[FL_USE_REALISTIC_MODE];
|
||||
return use_copper_thickness ?
|
||||
KiROUND( m_CopperThickness / m_BiuTo3Dunits )
|
||||
: 0;
|
||||
}
|
||||
|
@ -160,7 +165,9 @@ public: INFO3D_VISU();
|
|||
*/
|
||||
int GetNonCopperLayerThicknessBIU() const
|
||||
{
|
||||
return m_DrawFlags[FL_USE_COPPER_THICKNESS] ?
|
||||
bool use_copper_thickness = m_DrawFlags[FL_USE_COPPER_THICKNESS] ||
|
||||
m_DrawFlags[FL_USE_REALISTIC_MODE];
|
||||
return use_copper_thickness ?
|
||||
KiROUND( m_NonCopperLayerThickness / m_BiuTo3Dunits )
|
||||
: 0;
|
||||
}
|
||||
|
@ -178,6 +185,8 @@ public: INFO3D_VISU();
|
|||
GetNonCopperLayerThicknessBIU() :
|
||||
GetCopperThicknessBIU();
|
||||
}
|
||||
|
||||
bool IsRealisticMode() { return m_DrawFlags[FL_USE_REALISTIC_MODE]; }
|
||||
};
|
||||
|
||||
extern INFO3D_VISU g_Parm_3D_Visu;
|
||||
|
|
Loading…
Reference in New Issue