Hi I made the patch for the 3D viewer, drawing the zones and text types. You can switch the layers (Comments, Drawings Eco1 Eco2) and the 3D modules.
Find attached the patch file. Regards, BusJ
diff -Naur kicad-2008-07-15.orig/3d-viewer/3d_aux.cpp kicad-2008-07-15/3d-viewer/3d_aux.cpp --- kicad-2008-07-15.orig/3d-viewer/3d_aux.cpp 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/3d-viewer/3d_aux.cpp 2008-08-13 10:59:26.000000000 +0200 @@ -172,6 +172,14 @@ m_Layers = 1; m_BoardSettings = NULL; + m_Draw3DAxis = TRUE; + m_Draw3DModule = TRUE; + m_Draw3DPlace = TRUE; + m_Draw3DZone = TRUE; + m_Draw3DComments = TRUE; + m_Draw3DDrawings = TRUE; + m_Draw3DEco1 = TRUE; + m_Draw3DEco2 = TRUE; } diff -Naur kicad-2008-07-15.orig/3d-viewer/3d_canvas.cpp kicad-2008-07-15/3d-viewer/3d_canvas.cpp --- kicad-2008-07-15.orig/3d-viewer/3d_canvas.cpp 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/3d-viewer/3d_canvas.cpp 2008-08-12 09:07:04.000000000 +0200 @@ -83,6 +83,7 @@ /*************************************/ { ClearLists(); + m_init = FALSE; } @@ -92,7 +93,7 @@ { if( m_gllist > 0 ) glDeleteLists( m_gllist, 1 ); - m_init = FALSE; +// m_init = FALSE; m_gllist = 0; } diff -Naur kicad-2008-07-15.orig/3d-viewer/3d_draw.cpp kicad-2008-07-15/3d-viewer/3d_draw.cpp --- kicad-2008-07-15.orig/3d-viewer/3d_draw.cpp 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/3d-viewer/3d_draw.cpp 2008-08-14 10:43:20.000000000 +0200 @@ -1,5 +1,4 @@ ////////////////////////////////////// - // Name: 3d_draw.cpp ////////////////////////////////////// @@ -47,7 +46,8 @@ double endx, double endy,double width, double zpos); static void Draw3D_CircleSegment(double startx, double starty, double endx, double endy,double width, double zpos); - +static int Get3DLayerEnable(int act_layer); +static GLfloat Get3DLayerSide(int act_layer); /******************************************/ void Pcb3D_GLCanvas::Redraw( bool finish ) @@ -122,7 +122,8 @@ g_Parm_3D_Visu.m_LayerZcoord[ii] = g_Parm_3D_Visu.m_Epoxy_Width; } - GLfloat zpos_cu = 500 * g_Parm_3D_Visu.m_BoardScale; + //GLfloat zpos_cu = 500 * g_Parm_3D_Visu.m_BoardScale; + GLfloat zpos_cu = 10 * g_Parm_3D_Visu.m_BoardScale; GLfloat zpos_cmp = g_Parm_3D_Visu.m_Epoxy_Width + zpos_cu; g_Parm_3D_Visu.m_LayerZcoord[ADHESIVE_N_CU] = -zpos_cu * 2; g_Parm_3D_Visu.m_LayerZcoord[ADHESIVE_N_CMP] = zpos_cmp + zpos_cu; @@ -138,19 +139,21 @@ glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); /* draw axes */ - glEnable( GL_COLOR_MATERIAL ); - SetGLColor( WHITE ); - glBegin( GL_LINES ); - glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis - glVertex3f( 0.0, 0.0, 0.0 ); - glVertex3f( 1.0, 0.0, 0.0 ); // X axis - glVertex3f( 0.0, 0.0, 0.0 ); - glVertex3f( 0.0, -1.0, 0.0 ); // Y axis - glNormal3f( 1.0, 0.0, 0.0 ); // Normal is Y axis - glVertex3f( 0.0, 0.0, 0.0 ); - glVertex3f( 0.0, 0.0, 0.3 ); // Z axis - glEnd(); - + if (g_Parm_3D_Visu.m_Draw3DAxis){ + glEnable( GL_COLOR_MATERIAL ); + SetGLColor( WHITE ); + glBegin( GL_LINES ); + glNormal3f( 0.0, 0.0, 1.0 ); // Normal is Z axis + glVertex3f( 0.0, 0.0, 0.0 ); + glVertex3f( 1.0, 0.0, 0.0 ); // X axis + glVertex3f( 0.0, 0.0, 0.0 ); + glVertex3f( 0.0, -1.0, 0.0 ); // Y axis + glNormal3f( 1.0, 0.0, 0.0 ); // Normal is Y axis + glVertex3f( 0.0, 0.0, 0.0 ); + glVertex3f( 0.0, 0.0, 0.3 ); // Z axis + glEnd(); + } + /* Draw epoxy limits (do not use, works and test in progress) */ #if 0 glEnable( GL_FOG ); @@ -198,15 +201,32 @@ else Draw3D_Track( pt_piste ); } + if (g_Parm_3D_Visu.m_Draw3DZone){ + for( pt_piste = pcb->m_Zone; pt_piste != NULL; pt_piste = (TRACK*) pt_piste->Pnext ) + { + if( pt_piste->Type() == TYPEZONE ) + Draw3D_Track( pt_piste ); + } + } /* Tracé des edges */ EDA_BaseStruct* PtStruct; for( PtStruct = pcb->m_Drawings; PtStruct != NULL; PtStruct = PtStruct->Pnext ) { - #define STRUCT ( (DRAWSEGMENT*) PtStruct ) - if( PtStruct->Type() != TYPEDRAWSEGMENT ) - continue; - Draw3D_DrawSegment( STRUCT ); + //if( PtStruct->Type() != TYPEDRAWSEGMENT ) + // continue; + if( PtStruct->Type() == TYPEDRAWSEGMENT ) + { + #undef STRUCT + #define STRUCT ( (DRAWSEGMENT*) PtStruct ) + Draw3D_DrawSegment( STRUCT ); + } + if( PtStruct->Type() == TYPETEXTE ) + { + #undef STRUCT + #define STRUCT ( (TEXTE_PCB*) PtStruct ) + Draw3D_DrawText( STRUCT ); + } } /* tracé des modules */ @@ -284,8 +304,11 @@ color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[CMP_N]; if( color & ITEM_NOT_SHOW ) continue; - SetGLColor( color ); + //SetGLColor( color ); + SetGLColor( LIGHTGRAY ); glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 ); + if (layer == COPPER_LAYER_N) zpos = zpos - 5 * g_Parm_3D_Visu.m_BoardScale; + else zpos = zpos + 5 * g_Parm_3D_Visu.m_BoardScale; Draw3D_FilledCircle( x, -y, r, hole, zpos ); if( layer >= top_layer ) break; @@ -339,11 +362,75 @@ } else { - zpos = g_Parm_3D_Visu.m_LayerZcoord[segment->GetLayer()]; - Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos ); + layer = segment->GetLayer(); + glNormal3f( 0.0, 0.0, Get3DLayerSide(layer) ); + zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; + if (Get3DLayerEnable(layer)) + { + switch( segment->m_Shape ) + { + case S_ARC: + Draw3D_ArcSegment( x, -y, xf, -yf, w, zpos); + break; + case S_CIRCLE: + Draw3D_CircleSegment( x, -y, xf, -yf, w, zpos); + break; + default : + Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos); + break; + } + } } } +/*************************************************************/ +void Pcb3D_GLCanvas::Draw3D_DrawText( TEXTE_PCB* text ) +/*************************************************************/ +{ + int layer = text->GetLayer(); + double x, y, xf, yf; + double zpos, w; + int color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer]; + int coord[104]; + int ii, jj, kk, ll, nbpoints; + + + if (Get3DLayerEnable(layer)) + { + zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; + glNormal3f( 0.0, 0.0, Get3DLayerSide(layer) ); + + text->CreateDrawData(); + jj = 5; ii = jj + 1; + while( ii < text->m_TextDrawingsSize ) + { + nbpoints = text->m_TextDrawings[jj]; + if( nbpoints > 50 ) + nbpoints = 50; + + for( kk = 0, ll = 0; (kk < nbpoints) && (ii < text->m_TextDrawingsSize); kk++ ) + { + coord[ll++] = text->m_TextDrawings[ii++] + text->m_Pos.x; + coord[ll++] = text->m_TextDrawings[ii++] + text->m_Pos.y; + } + + jj = ii++; + + for( kk = 0, ll = 0; kk < (nbpoints - 1); kk++, ll += 2 ) + { + SetGLColor( color ); + w = text->m_Width * g_Parm_3D_Visu.m_BoardScale; + x = coord[ll] * g_Parm_3D_Visu.m_BoardScale; + y = coord[ll + 1] * g_Parm_3D_Visu.m_BoardScale; + xf = coord[ll + 2] * g_Parm_3D_Visu.m_BoardScale; + yf = coord[ll + 3] * g_Parm_3D_Visu.m_BoardScale; + + //printf("text koordinata x=%d, y=%d, x2=%d, y2=%d\n",x,y,xf,yf); + Draw3D_FilledSegment( x, -y, xf, -yf, w, zpos ); + } + } + } +} /*********************************************/ void MODULE::Draw3D( Pcb3D_GLCanvas* glcanvas ) @@ -373,34 +460,43 @@ } /* Draw module shape: 3D shape if exists (or module edge if not exists) */ - Struct3D_Master* Struct3D = m_3D_Drawings; - bool As3dShape = FALSE; - glPushMatrix(); - glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BoardScale, - -m_Pos.y * g_Parm_3D_Visu.m_BoardScale, - g_Parm_3D_Visu.m_LayerZcoord[m_Layer] ); - if( m_Orient ) - { - glRotatef( (double) m_Orient / 10, 0.0, 0.0, 1.0 ); - } - if( m_Layer == COPPER_LAYER_N ) - { - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - } - DataScale3D = g_Parm_3D_Visu.m_BoardScale * UNITS3D_TO_UNITSPCB; - - for( ; Struct3D != NULL; Struct3D = (Struct3D_Master*) Struct3D->Pnext ) - { - if( !Struct3D->m_Shape3DName.IsEmpty() ) - { - As3dShape = TRUE; - Struct3D->ReadData(); - } - } - - glPopMatrix(); - + Struct3D_Master* Struct3D = m_3D_Drawings; + bool As3dShape = FALSE; + bool Place3D; + if ( (Struct3D->m_Shape3DName.Find(wxString(wxT("placa"))) != -1) || + (Struct3D->m_Shape3DName.Find(wxString(wxT("place"))) != -1) ) + Place3D = TRUE; + else Place3D = FALSE; + + if ( (g_Parm_3D_Visu.m_Draw3DModule && !Place3D) || + (g_Parm_3D_Visu.m_Draw3DPlace && Place3D) ) + { + glPushMatrix(); + glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BoardScale, + -m_Pos.y * g_Parm_3D_Visu.m_BoardScale, + g_Parm_3D_Visu.m_LayerZcoord[m_Layer] ); + if( m_Orient ) + { + glRotatef( (double) m_Orient / 10, 0.0, 0.0, 1.0 ); + } + if( m_Layer == COPPER_LAYER_N ) + { + glRotatef( 180.0, 0.0, 1.0, 0.0 ); + glRotatef( 180.0, 0.0, 0.0, 1.0 ); + } + DataScale3D = g_Parm_3D_Visu.m_BoardScale * UNITS3D_TO_UNITSPCB; + + for( ; Struct3D != NULL; Struct3D = (Struct3D_Master*) Struct3D->Pnext ) + { + if( !Struct3D->m_Shape3DName.IsEmpty() ) + { + As3dShape = TRUE; + Struct3D->ReadData(); + } + } + glPopMatrix(); + } + if( !As3dShape ) { EDA_BaseStruct* Struct = m_Drawings; @@ -546,9 +642,12 @@ color = g_Parm_3D_Visu.m_BoardSettings->m_LayerColor[layer]; if( color & ITEM_NOT_SHOW ) continue; - SetGLColor( color ); + //SetGLColor( color ); + SetGLColor( LIGHTGRAY ); glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 ); zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; + if (layer == COPPER_LAYER_N) zpos = zpos - 5 * g_Parm_3D_Visu.m_BoardScale; + else zpos = zpos + 5 * g_Parm_3D_Visu.m_BoardScale; Draw3D_FilledCircle( x, -y, r, hole, zpos ); } @@ -591,8 +690,11 @@ glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 ); if( color & ITEM_NOT_SHOW ) continue; - SetGLColor( color ); - zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; + //SetGLColor( color ); + SetGLColor( LIGHTGRAY ); + zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; + if (layer == COPPER_LAYER_N) zpos = zpos - 5 * g_Parm_3D_Visu.m_BoardScale; + else zpos = zpos + 5 * g_Parm_3D_Visu.m_BoardScale; Draw3D_FilledSegmentWithHole( ox, -oy, fx, -fy, w, drillx, -drilly, hole, zpos ); } } @@ -662,8 +764,11 @@ glNormal3f( 0.0, 0.0, (layer == COPPER_LAYER_N) ? -1.0 : 1.0 ); if( color & ITEM_NOT_SHOW ) continue; - SetGLColor( color ); + //SetGLColor( color ); + SetGLColor( LIGHTGRAY ); zpos = g_Parm_3D_Visu.m_LayerZcoord[layer]; + if (layer == COPPER_LAYER_N) zpos = zpos - 5 * g_Parm_3D_Visu.m_BoardScale; + else zpos = zpos + 5 * g_Parm_3D_Visu.m_BoardScale; glBegin( GL_QUAD_STRIP ); for( ii = 0; ii < 8; ii++ ) { @@ -946,3 +1051,40 @@ } glEnd(); } + +/******************************************/ +static int Get3DLayerEnable(int act_layer) +/******************************************/ +{ + bool enablelayer; + + enablelayer = TRUE; + if (act_layer == DRAW_N && !g_Parm_3D_Visu.m_Draw3DDrawings) + enablelayer = FALSE; + if (act_layer == COMMENT_N && !g_Parm_3D_Visu.m_Draw3DComments) + enablelayer = FALSE; + if (act_layer == ECO1_N && !g_Parm_3D_Visu.m_Draw3DEco1) + enablelayer = FALSE; + if (act_layer == ECO2_N && !g_Parm_3D_Visu.m_Draw3DEco2) + enablelayer = FALSE; + + return enablelayer; +} + +/******************************************/ +static GLfloat Get3DLayerSide(int act_layer) +/******************************************/ +{ + GLfloat nZ; + nZ = 1.0; + if ( + (act_layer <= LAST_COPPER_LAYER-1) || + (act_layer == ADHESIVE_N_CU) || + (act_layer == SOLDERPASTE_N_CU) || + (act_layer == SILKSCREEN_N_CU) || + (act_layer == SOLDERMASK_N_CU) + ) + nZ = -1.0; + return nZ; + +} diff -Naur kicad-2008-07-15.orig/3d-viewer/3d_frame.cpp kicad-2008-07-15/3d-viewer/3d_frame.cpp --- kicad-2008-07-15.orig/3d-viewer/3d_frame.cpp 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/3d-viewer/3d_frame.cpp 2008-08-14 09:08:23.000000000 +0200 @@ -293,6 +293,38 @@ Set3DBgColor(); return; + case ID_MENU3D_AXIS_ONOFF: + Set3DAxisOnOff(); + return; + + case ID_MENU3D_MODULE_ONOFF: + Set3DModuleOnOff(); + return; + + case ID_MENU3D_PLACE_ONOFF: + Set3DPlaceOnOff(); + return; + + case ID_MENU3D_ZONE_ONOFF: + Set3DZoneOnOff(); + return; + + case ID_MENU3D_COMMENTS_ONOFF: + Set3DCommentsOnOff(); + return; + + case ID_MENU3D_DRAWINGS_ONOFF: + Set3DDrawingsOnOff(); + return; + + case ID_MENU3D_ECO1_ONOFF: + Set3DEco1OnOff(); + return; + + case ID_MENU3D_ECO2_ONOFF: + Set3DEco2OnOff(); + return; + default: wxMessageBox( wxT( "WinEDA3D_DrawFrame::Process_Special_Functions() error: unknown command" ) ); @@ -315,7 +347,6 @@ m_Canvas->Refresh( true ); } - /******************************************/ void WinEDA3D_DrawFrame::Set3DBgColor() /******************************************/ @@ -339,3 +370,75 @@ NewDisplay(); } } + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DAxisOnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DAxis) g_Parm_3D_Visu.m_Draw3DAxis = FALSE; + else g_Parm_3D_Visu.m_Draw3DAxis = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DModuleOnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DModule) g_Parm_3D_Visu.m_Draw3DModule = FALSE; + else g_Parm_3D_Visu.m_Draw3DModule = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DPlaceOnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DPlace) g_Parm_3D_Visu.m_Draw3DPlace = FALSE; + else g_Parm_3D_Visu.m_Draw3DPlace = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DZoneOnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DZone) g_Parm_3D_Visu.m_Draw3DZone = FALSE; + else g_Parm_3D_Visu.m_Draw3DZone = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DCommentsOnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DComments) g_Parm_3D_Visu.m_Draw3DComments = FALSE; + else g_Parm_3D_Visu.m_Draw3DComments = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DDrawingsOnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DDrawings) g_Parm_3D_Visu.m_Draw3DDrawings = FALSE; + else g_Parm_3D_Visu.m_Draw3DDrawings = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DEco1OnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DEco1) g_Parm_3D_Visu.m_Draw3DEco1 = FALSE; + else g_Parm_3D_Visu.m_Draw3DEco1 = TRUE; + NewDisplay(); +} + +/******************************************/ +void WinEDA3D_DrawFrame::Set3DEco2OnOff() +/******************************************/ +{ + if (g_Parm_3D_Visu.m_Draw3DEco2) g_Parm_3D_Visu.m_Draw3DEco2 = FALSE; + else g_Parm_3D_Visu.m_Draw3DEco2 = TRUE; + NewDisplay(); +} diff -Naur kicad-2008-07-15.orig/3d-viewer/3d_toolbar.cpp kicad-2008-07-15/3d-viewer/3d_toolbar.cpp --- kicad-2008-07-15.orig/3d-viewer/3d_toolbar.cpp 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/3d-viewer/3d_toolbar.cpp 2008-08-14 09:37:09.000000000 +0200 @@ -120,6 +120,29 @@ ADD_MENUITEM( referencesMenu, ID_MENU3D_BGCOLOR_SELECTION, _( "Choose background color" ), palette_xpm ); + ADD_MENUITEM( referencesMenu, ID_MENU3D_AXIS_ONOFF, + _( "Axis On/Off" ), axis3d_front_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_MODULE_ONOFF, + _( "Module 3D On/Off" ), add_component_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_PLACE_ONOFF, + _( "PCB place 3D On/off" ), select_w_layer_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_ZONE_ONOFF, + _( "Zone On/Off" ), add_zone_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_COMMENTS_ONOFF, + _( "Comments On/Off" ), edit_sheet_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_DRAWINGS_ONOFF, + _( "Drawings On/Off" ), options_text_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_ECO1_ONOFF, + _( "Eco1 On/Off" ), options_text_xpm ); + + ADD_MENUITEM( referencesMenu, ID_MENU3D_ECO2_ONOFF, + _( "Eco2 On/Off" ), options_text_xpm ); SetMenuBar( menuBar ); } diff -Naur kicad-2008-07-15.orig/3d-viewer/3d_viewer.h kicad-2008-07-15/3d-viewer/3d_viewer.h --- kicad-2008-07-15.orig/3d-viewer/3d_viewer.h 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/3d-viewer/3d_viewer.h 2008-08-14 09:09:08.000000000 +0200 @@ -54,6 +54,14 @@ float m_Rot[4]; /* man rotation of object */ float m_Zoom; /* field of view in degrees */ S3D_Color m_BgColor; + bool m_Draw3DAxis; + bool m_Draw3DModule; + bool m_Draw3DPlace; + bool m_Draw3DZone; + bool m_Draw3DComments; + bool m_Draw3DDrawings; + bool m_Draw3DEco1; + bool m_Draw3DEco2; wxPoint m_BoardPos; wxSize m_BoardSize; int m_Layers; @@ -107,6 +115,8 @@ void Draw3D_Track(TRACK * track); void Draw3D_Via(SEGVIA * via); void Draw3D_DrawSegment(DRAWSEGMENT * segment); + void Draw3D_DrawText(TEXTE_PCB * text); + //int Get3DLayerEnable(int act_layer); DECLARE_EVENT_TABLE() }; @@ -151,6 +161,14 @@ void NewDisplay(); void Set3DBgColor(); + void Set3DAxisOnOff(); + void Set3DModuleOnOff(); + void Set3DPlaceOnOff(); + void Set3DZoneOnOff(); + void Set3DCommentsOnOff(); + void Set3DDrawingsOnOff(); + void Set3DEco1OnOff(); + void Set3DEco2OnOff(); DECLARE_EVENT_TABLE() }; diff -Naur kicad-2008-07-15.orig/include/id.h kicad-2008-07-15/include/id.h --- kicad-2008-07-15.orig/include/id.h 2008-07-25 16:45:43.000000000 +0200 +++ kicad-2008-07-15/include/id.h 2008-08-13 11:10:10.000000000 +0200 @@ -856,6 +856,14 @@ ID_MOVE3D_UP, ID_MOVE3D_DOWN, ID_MENU3D_BGCOLOR_SELECTION, + ID_MENU3D_AXIS_ONOFF, + ID_MENU3D_MODULE_ONOFF, + ID_MENU3D_PLACE_ONOFF, + ID_MENU3D_ZONE_ONOFF, + ID_MENU3D_DRAWINGS_ONOFF, + ID_MENU3D_COMMENTS_ONOFF, + ID_MENU3D_ECO1_ONOFF, + ID_MENU3D_ECO2_ONOFF, ID_3D_UNUSED0, ID_3D_UNUSED1, ID_3D_UNUSED2,