Intermediate Changes

This commit is contained in:
Brian Sidebotham 2014-09-23 21:23:52 +01:00
commit 64bae1cf37
448 changed files with 73707 additions and 54061 deletions

View File

@ -151,7 +151,7 @@ void TransfertToGLlist( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUni
glEnd();
}
VERTEX_VALUE_CTRL::VERTEX_VALUE_CTRL( wxWindow* aParent, wxBoxSizer* aBoxSizer )
S3DPOINT_VALUE_CTRL::S3DPOINT_VALUE_CTRL( wxWindow* aParent, wxBoxSizer* aBoxSizer )
{
wxString text;
@ -187,15 +187,16 @@ VERTEX_VALUE_CTRL::VERTEX_VALUE_CTRL( wxWindow* aParent, wxBoxSizer* aBoxSizer )
}
VERTEX_VALUE_CTRL::~VERTEX_VALUE_CTRL()
S3DPOINT_VALUE_CTRL::~S3DPOINT_VALUE_CTRL()
{
// Nothing to delete: all items are managed by the parent window.
}
S3D_VERTEX VERTEX_VALUE_CTRL::GetValue()
S3DPOINT S3DPOINT_VALUE_CTRL::GetValue()
{
S3D_VERTEX value;
double dtmp;
S3DPOINT value;
double dtmp;
m_XValueCtrl->GetValue().ToDouble( &dtmp );
value.x = dtmp;
@ -207,7 +208,7 @@ S3D_VERTEX VERTEX_VALUE_CTRL::GetValue()
}
void VERTEX_VALUE_CTRL::SetValue( S3D_VERTEX vertex )
void S3DPOINT_VALUE_CTRL::SetValue( S3DPOINT vertex )
{
wxString text;
@ -225,7 +226,7 @@ void VERTEX_VALUE_CTRL::SetValue( S3D_VERTEX vertex )
}
void VERTEX_VALUE_CTRL::Enable( bool onoff )
void S3DPOINT_VALUE_CTRL::Enable( bool onoff )
{
m_XValueCtrl->Enable( onoff );
m_YValueCtrl->Enable( onoff );

View File

@ -1,3 +1,26 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_canvas.cpp
*/
@ -26,8 +49,8 @@
#include <trackball.h>
#include <3d_viewer_id.h>
#include <textures/text_silk.c>
#include <textures/text_pcb.c>
#include <textures/text_silk.h>
#include <textures/text_pcb.h>
// -----------------
// helper function (from wxWidgets, opengl/cube.cpp sample
@ -52,8 +75,9 @@ void CheckGLError(const char *aFileName, int aLineNumber)
}
errLast = err;
wxLogError( wxT( "OpenGL error %d At: %s, line: %d" ), err, GetChars( FROM_UTF8( aFileName ) ), aLineNumber );
wxLogError( wxT( "OpenGL error %d At: %s, line: %d" ), err,
GetChars( FROM_UTF8( aFileName ) ), aLineNumber );
}
}
@ -137,7 +161,7 @@ void EDA_3D_CANVAS::OnChar( wxKeyEvent& event )
void EDA_3D_CANVAS::SetView3D( int keycode )
{
int ii;
double delta_move = 0.7 * g_Parm_3D_Visu.m_Zoom;
double delta_move = 0.7 * GetPrm3DVisu().m_Zoom;
switch( keycode )
{
@ -158,22 +182,22 @@ void EDA_3D_CANVAS::SetView3D( int keycode )
break;
case WXK_HOME:
g_Parm_3D_Visu.m_Zoom = 1.0;
GetPrm3DVisu().m_Zoom = 1.0;
m_draw3dOffset.x = m_draw3dOffset.y = 0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
break;
case WXK_END:
break;
case WXK_F1:
g_Parm_3D_Visu.m_Zoom /= 1.4;
if( g_Parm_3D_Visu.m_Zoom <= 0.01 )
g_Parm_3D_Visu.m_Zoom = 0.01;
GetPrm3DVisu().m_Zoom /= 1.4;
if( GetPrm3DVisu().m_Zoom <= 0.01 )
GetPrm3DVisu().m_Zoom = 0.01;
break;
case WXK_F2:
g_Parm_3D_Visu.m_Zoom *= 1.4;
GetPrm3DVisu().m_Zoom *= 1.4;
break;
case '+':
@ -186,59 +210,59 @@ void EDA_3D_CANVAS::SetView3D( int keycode )
case 'R':
m_draw3dOffset.x = m_draw3dOffset.y = 0;
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
break;
case 'x':
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
g_Parm_3D_Visu.m_ROTZ = -90;
g_Parm_3D_Visu.m_ROTX = -90;
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
GetPrm3DVisu().m_ROTZ = -90;
GetPrm3DVisu().m_ROTX = -90;
break;
case 'X':
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
g_Parm_3D_Visu.m_ROTZ = 90;
g_Parm_3D_Visu.m_ROTX = -90;
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
GetPrm3DVisu().m_ROTZ = 90;
GetPrm3DVisu().m_ROTX = -90;
break;
case 'y':
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
g_Parm_3D_Visu.m_ROTX = -90;
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
GetPrm3DVisu().m_ROTX = -90;
break;
case 'Y':
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
g_Parm_3D_Visu.m_ROTX = -90;
g_Parm_3D_Visu.m_ROTZ = -180;
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
GetPrm3DVisu().m_ROTX = -90;
GetPrm3DVisu().m_ROTZ = -180;
break;
case 'z':
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
break;
case 'Z':
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
g_Parm_3D_Visu.m_ROTX = -180;
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
GetPrm3DVisu().m_ROTX = -180;
break;
default:
@ -255,47 +279,35 @@ void EDA_3D_CANVAS::OnMouseWheel( wxMouseEvent& event )
if( event.ShiftDown() )
{
if( event.GetWheelRotation() < 0 )
{
/* up */
SetView3D( WXK_UP );
}
SetView3D( WXK_UP ); // move up
else
{
/* down */
SetView3D( WXK_DOWN );
}
SetView3D( WXK_DOWN ); // move down
}
else if( event.ControlDown() )
{
if( event.GetWheelRotation() > 0 )
{
/* right */
SetView3D( WXK_RIGHT );
}
SetView3D( WXK_RIGHT ); // move right
else
{
/* left */
SetView3D( WXK_LEFT );
}
SetView3D( WXK_LEFT ); // move left
}
else
{
if( event.GetWheelRotation() > 0 )
{
g_Parm_3D_Visu.m_Zoom /= 1.4;
GetPrm3DVisu().m_Zoom /= 1.4;
if( g_Parm_3D_Visu.m_Zoom <= 0.01 )
g_Parm_3D_Visu.m_Zoom = 0.01;
if( GetPrm3DVisu().m_Zoom <= 0.01 )
GetPrm3DVisu().m_Zoom = 0.01;
}
else
g_Parm_3D_Visu.m_Zoom *= 1.4;
GetPrm3DVisu().m_Zoom *= 1.4;
DisplayStatus();
Refresh( false );
}
g_Parm_3D_Visu.m_Beginx = event.GetX();
g_Parm_3D_Visu.m_Beginy = event.GetY();
GetPrm3DVisu().m_Beginx = event.GetX();
GetPrm3DVisu().m_Beginy = event.GetY();
}
@ -310,12 +322,12 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent& event )
{
/* drag in progress, simulate trackball */
trackball( spin_quat,
(2.0 * g_Parm_3D_Visu.m_Beginx - size.x) / size.x,
(size.y - 2.0 * g_Parm_3D_Visu.m_Beginy) / size.y,
(2.0 * GetPrm3DVisu().m_Beginx - size.x) / size.x,
(size.y - 2.0 * GetPrm3DVisu().m_Beginy) / size.y,
( 2.0 * event.GetX() - size.x) / size.x,
( size.y - 2.0 * event.GetY() ) / size.y );
add_quats( spin_quat, g_Parm_3D_Visu.m_Quat, g_Parm_3D_Visu.m_Quat );
add_quats( spin_quat, GetPrm3DVisu().m_Quat, GetPrm3DVisu().m_Quat );
}
else if( event.MiddleIsDown() )
{
@ -323,11 +335,11 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent& event )
/* Current zoom and an additional factor are taken into account
* for the amount of panning. */
const double PAN_FACTOR = 8.0 * g_Parm_3D_Visu.m_Zoom;
const double PAN_FACTOR = 8.0 * GetPrm3DVisu().m_Zoom;
m_draw3dOffset.x -= PAN_FACTOR *
( g_Parm_3D_Visu.m_Beginx - event.GetX() ) / size.x;
( GetPrm3DVisu().m_Beginx - event.GetX() ) / size.x;
m_draw3dOffset.y -= PAN_FACTOR *
(event.GetY() - g_Parm_3D_Visu.m_Beginy) / size.y;
(event.GetY() - GetPrm3DVisu().m_Beginy) / size.y;
}
/* orientation has changed, redraw mesh */
@ -335,8 +347,8 @@ void EDA_3D_CANVAS::OnMouseMove( wxMouseEvent& event )
Refresh( false );
}
g_Parm_3D_Visu.m_Beginx = event.GetX();
g_Parm_3D_Visu.m_Beginy = event.GetY();
GetPrm3DVisu().m_Beginx = event.GetX();
GetPrm3DVisu().m_Beginy = event.GetY();
}
@ -478,7 +490,7 @@ void EDA_3D_CANVAS::DisplayStatus()
msg.Printf( wxT( "dy %3.2f" ), m_draw3dOffset.y );
Parent()->SetStatusText( msg, 2 );
msg.Printf( wxT( "View: %3.1f" ), 45 * g_Parm_3D_Visu.m_Zoom );
msg.Printf( wxT( "View: %3.1f" ), 45 * GetPrm3DVisu().m_Zoom );
Parent()->SetStatusText( msg, 3 );
}
@ -515,12 +527,13 @@ GLuint load_and_generate_texture( tsImage *image )
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->pixel_data );
gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, image->width, image->height,
GL_RGBA, GL_UNSIGNED_BYTE, image->pixel_data );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
return texture;
@ -537,7 +550,7 @@ void EDA_3D_CANVAS::InitGL()
m_text_pcb = load_and_generate_texture( (tsImage *)&text_pcb );
m_text_silk = load_and_generate_texture( (tsImage *)&text_silk );
g_Parm_3D_Visu.m_Zoom = 1.0;
GetPrm3DVisu().m_Zoom = 1.0;
m_ZBottom = 1.0;
m_ZTop = 10.0;
@ -546,7 +559,7 @@ void EDA_3D_CANVAS::InitGL()
glEnable( GL_ALPHA_TEST );
glEnable( GL_LINE_SMOOTH );
// glEnable(GL_POLYGON_SMOOTH); // creates issues with some graphic cards
glShadeModel( GL_SMOOTH );
glEnable( GL_NORMALIZE );
glEnable( GL_COLOR_MATERIAL );
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
@ -566,28 +579,27 @@ void EDA_3D_CANVAS::InitGL()
/* Initialize OpenGL light sources. */
void EDA_3D_CANVAS::SetLights()
{
double light;
GLfloat light_color[4];
/* set viewing projection */
// activate light. the source is above the xy plane, at source_pos
GLfloat source_pos[4] = { 0.0, 0.0, 30.0, 0.0 };
GLfloat light_color[4]; // color of lights (RGBA values)
light_color[3] = 1.0;
GLfloat Z_axis_pos[4] = { 0.0, 0.0, 30.0, 0.0 };
GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -30.0, 0.5 };
/* activate light */
light = 1.0;
light_color[0] = light_color[1] = light_color[2] = light;
glLightfv( GL_LIGHT0, GL_POSITION, Z_axis_pos );
// Light above the xy plane
light_color[0] = light_color[1] = light_color[2] = 0.1;
glLightfv( GL_LIGHT0, GL_AMBIENT, light_color );
light_color[0] = light_color[1] = light_color[2] = 1.0;
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_color );
light_color[0] = 0.3;
light_color[1] = 0.3;
light_color[2] = 0.4;
light_color[0] = light_color[1] = light_color[2] = 1.0;
glLightfv( GL_LIGHT0, GL_SPECULAR, light_color );
glLightfv( GL_LIGHT1, GL_POSITION, lowZ_axis_pos );
glLightfv( GL_LIGHT1, GL_DIFFUSE, light_color );
glEnable( GL_LIGHT0 ); // White spot on Z axis
glEnable( GL_LIGHT1 ); // White spot on Z axis ( bottom)
glLightfv( GL_LIGHT0, GL_POSITION, source_pos );
light_color[0] = light_color[1] = light_color[2] = 0.1;
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, light_color );
glEnable( GL_LIGHT0 ); // White spot on Z axis ( top )
glEnable( GL_LIGHTING );
}
@ -625,7 +637,7 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
wxYield();
}
struct vieport_params
struct viewport_params
{
GLint originx;
GLint originy;
@ -633,6 +645,10 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
GLint y;
} viewport;
// Be sure we have the latest 3D view (remember 3D view is buffered)
Refresh();
wxYield();
// Build image from the 3D buffer
wxWindowUpdateLocker noUpdates( this );
glGetIntegerv( GL_VIEWPORT, (GLint*) &viewport );

View File

@ -46,6 +46,7 @@
class BOARD_DESIGN_SETTINGS;
class EDA_3D_FRAME;
class CPOLYGONS_LIST;
class VIA;
class D_PAD;
@ -63,12 +64,12 @@ enum GL_LIST_ID
GL_ID_AUX_LAYERS, // List id for user layers (draw, eco, comment)
GL_ID_3DSHAPES_SOLID_FRONT, // List id for 3D shapes, non transparent entities
GL_ID_3DSHAPES_TRANSP_FRONT,// List id for 3D shapes, transparent entities
GL_ID_3DSHAPES_SOLID_BACK, // List id for 3D shapes, non transparent entities
GL_ID_3DSHAPES_TRANSP_BACK,// List id for 3D shapes, transparent entities
GL_ID_3DSHAPES_SOLID_BACK, // List id for 3D shapes, non transparent entities
GL_ID_3DSHAPES_TRANSP_BACK, // List id for 3D shapes, transparent entities
GL_ID_SHADOW_FRONT,
GL_ID_SHADOW_BACK,
GL_ID_SHADOW_BOARD,
GL_ID_BODY, // Body only list
GL_ID_BODY, // Body only list
GL_ID_END
};
@ -134,14 +135,72 @@ public:
void CreateDrawGL_List();
void InitGL();
void SetLights();
void SetOffset(double aPosX, double aPosY)
{
m_draw3dOffset.x = aPosX;
m_draw3dOffset.y = aPosY;
}
void SetGLTechLayersColor( LAYER_NUM aLayer );
void SetGLCopperColor();
void SetGLEpoxyColor( double aTransparency = 1.0 );
/** @return the INFO3D_VISU which contains the current parameters
* to draw the 3D view og the board
*/
INFO3D_VISU& GetPrm3DVisu() const;
private:
/**
* return true if we are in realistic mode render
*/
bool isRealisticMode() const;
/**
* @return true if aItem should be displayed
* @param aItem = an item of DISPLAY3D_FLG enum
*/
bool isEnabled( DISPLAY3D_FLG aItem ) const;
/** Helper function
* @return true if aLayer should be displayed, false otherwise
*/
bool is3DLayerEnabled( LAYER_ID aLayer ) const;
/**
* @return the size of the board in pcb units
*/
wxSize getBoardSize() const;
/**
* @return the position of the board center in pcb units
*/
wxPoint getBoardCenter() const;
/**
* Helper function SetGLTechLayersColor
* Initialize the color to draw the non copper layers
* in realistic mode and normal mode.
*/
void setGLTechLayersColor( LAYER_NUM aLayer );
/**
* Helper function SetGLCopperColor
* Initialize the copper color to draw the board
* in realistic mode (a golden yellow color )
*/
void setGLCopperColor();
/**
* Helper function SetGLEpoxyColor
* Initialize the color to draw the epoxy body board in realistic mode.
*/
void setGLEpoxyColor( double aTransparency = 1.0 );
/**
* Helper function SetGLSolderMaskColor
* Initialize the color to draw the solder mask layers in realistic mode.
*/
void setGLSolderMaskColor( double aTransparency = 1.0 );
/**
* Function BuildBoard3DView
@ -187,7 +246,31 @@ public:
void Draw3DGrid( double aGriSizeMM );
void Draw3DAxis();
/**
* Helper function BuildPadShapeThickOutlineAsPolygon:
* Build a pad outline as non filled polygon, to draw pads on silkscreen layer
* with a line thickness = aWidth
* Used only to draw pads outlines on silkscreen layers.
*/
void BuildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
CPOLYGONS_LIST& aCornerBuffer,
int aWidth,
int aCircleToSegmentsCount,
double aCorrectionFactor );
/**
* Helper function Draw3DViaHole:
* Draw the via hole:
* Build a vertical hole (a cylinder) between the first and the last via layers
*/
void Draw3DViaHole( const VIA * aVia );
/**
* Helper function Draw3DPadHole:
* Draw the pad hole:
* Build a vertical hole (round or oblong) between the front and back layers
*/
void Draw3DPadHole( const D_PAD * aPad );
void GenerateFakeShadowsTextures();

View File

@ -78,11 +78,11 @@ S3D_MASTER::S3D_MASTER( EDA_ITEM* aParent ) :
m_ShapeType = FILE3D_NONE;
m_use_modelfile_diffuseColor = true;
m_use_modelfile_emissiveColor = false;
m_use_modelfile_specularColor = false;
m_use_modelfile_ambientIntensity = false;
m_use_modelfile_emissiveColor = true;
m_use_modelfile_specularColor = true;
m_use_modelfile_ambientIntensity = true;
m_use_modelfile_transparency = true;
m_use_modelfile_shininess = false;
m_use_modelfile_shininess = true;
}

File diff suppressed because it is too large Load Diff

View File

@ -42,6 +42,12 @@
#define CALLBACK
#endif
// Variables used to pass a value to call back openGL functions
static float s_textureScale;
static double s_currentZpos;
static double s_biuTo3Dunits;
bool s_useTextures;
// CALLBACK functions for GLU_TESS
static void CALLBACK tessBeginCB( GLenum which );
static void CALLBACK tessEndCB();
@ -121,22 +127,26 @@ static void Draw3D_VerticalPolygonalCylinder( const CPOLYGONS_LIST& aPolysList,
void SetGLColor( EDA_COLOR_T color, double alpha )
{
double red, green, blue;
const StructColors &colordata = g_ColorRefs[ColorGetBase( color )];
red = colordata.m_Red / 255.0;
blue = colordata.m_Blue / 255.0;
green = colordata.m_Green / 255.0;
double red = colordata.m_Red / 255.0;
double blue = colordata.m_Blue / 255.0;
double green = colordata.m_Green / 255.0;
glColor4f( red, green, blue, alpha );
}
static float m_texture_scale;
void SetGLColor( S3D_COLOR& aColor, float aTransparency )
{
glColor4f( aColor.m_Red, aColor.m_Green, aColor.m_Blue, aTransparency );
}
void SetGLTexture( GLuint text_id, float scale )
{
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, text_id );
m_texture_scale = scale;
s_textureScale = scale; // for Tess callback functions
}
@ -149,8 +159,13 @@ void SetGLTexture( GLuint text_id, float scale )
* The bottom side is located at aZpos - aThickness / 2
*/
void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
int aZpos, int aThickness, double aBiuTo3DUnits )
int aZpos, int aThickness, double aBiuTo3DUnits,
bool aUseTextures )
{
// for Tess callback functions:
s_biuTo3Dunits = aBiuTo3DUnits;
s_useTextures = aUseTextures;
GLUtesselator* tess = gluNewTess();
gluTessCallback( tess, GLU_TESS_BEGIN, ( void (CALLBACK*) () )tessBeginCB );
@ -160,10 +175,10 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
GLdouble v_data[3];
double zpos = ( aZpos + (aThickness / 2.0) ) * aBiuTo3DUnits;
g_Parm_3D_Visu.m_CurrentZpos = zpos;
s_currentZpos = zpos; // for Tess callback functions
v_data[2] = aZpos + (aThickness / 2.0);
// Set normal to toward positive Z axis, for a solid object only (to draw the top side)
// Set normal toward positive Z axis, for a solid object on the top side
if( aThickness )
SetNormalZpos();
@ -213,9 +228,9 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
// Prepare the bottom side of solid areas
zpos = ( aZpos - (aThickness / 2.0) ) * aBiuTo3DUnits;
g_Parm_3D_Visu.m_CurrentZpos = zpos;
s_currentZpos = zpos; // for Tess callback functions
v_data[2] = zpos;
// Now;, set normal to toward negative Z axis, for the solid object bottom side
// Set normal toward negative Z axis, for a solid object on bottom side
SetNormalZneg();
}
@ -243,12 +258,12 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
*/
void Draw3D_SolidHorizontalPolygonWithHoles( const CPOLYGONS_LIST& aPolysList,
int aZpos, int aThickness,
double aBiuTo3DUnits )
double aBiuTo3DUnits, bool aUseTextures )
{
CPOLYGONS_LIST polygon;
ConvertPolysListWithHolesToOnePolygon( aPolysList, polygon );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos, aThickness, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos, aThickness, aBiuTo3DUnits, aUseTextures );
}
@ -295,13 +310,13 @@ void Draw3D_ZaxisCylinder( wxPoint aCenterPos, int aRadius,
ConvertPolysListWithHolesToOnePolygon( outer_cornerBuffer, polygon );
// draw top (front) horizontal ring
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos + aHeight, 0, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos + aHeight, 0, aBiuTo3DUnits, false );
if( aHeight )
{
// draw bottom (back) horizontal ring
SetNormalZneg();
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos, 0, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos, 0, aBiuTo3DUnits, false );
}
}
@ -355,13 +370,13 @@ void Draw3D_ZaxisOblongCylinder( wxPoint aAxis1Pos, wxPoint aAxis2Pos,
// draw top (front) horizontal side (ring)
SetNormalZpos();
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos + aHeight, 0, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos + aHeight, 0, aBiuTo3DUnits, false );
if( aHeight )
{
// draw bottom (back) horizontal side (ring)
SetNormalZneg();
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos, 0, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( polygon, aZpos, 0, aBiuTo3DUnits, false );
}
}
@ -383,7 +398,7 @@ void Draw3D_SolidSegment( const wxPoint& aStart, const wxPoint& aEnd,
TransformRoundedEndsSegmentToPolygon( cornerBuffer, aStart, aEnd, slice, aWidth );
Draw3D_SolidHorizontalPolyPolygons( cornerBuffer, aZpos, aThickness, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( cornerBuffer, aZpos, aThickness, aBiuTo3DUnits, false );
}
@ -397,7 +412,7 @@ void Draw3D_ArcSegment( const wxPoint& aCenterPos, const wxPoint& aStartPoint,
TransformArcToPolygon( cornerBuffer, aCenterPos, aStartPoint, aArcAngle,
slice, aWidth );
Draw3D_SolidHorizontalPolyPolygons( cornerBuffer, aZpos, aThickness, aBiuTo3DUnits );
Draw3D_SolidHorizontalPolyPolygons( cornerBuffer, aZpos, aThickness, aBiuTo3DUnits, false );
}
@ -422,15 +437,13 @@ void CALLBACK tessCPolyPt2Vertex( const GLvoid* data )
// cast back to double type
const CPolyPt* ptr = (const CPolyPt*) data;
if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
if( s_useTextures )
{
glTexCoord2f( ptr->x* g_Parm_3D_Visu.m_BiuTo3Dunits * m_texture_scale,
-ptr->y * g_Parm_3D_Visu.m_BiuTo3Dunits * m_texture_scale);
glTexCoord2f( ptr->x * s_biuTo3Dunits * s_textureScale,
-ptr->y * s_biuTo3Dunits * s_textureScale);
}
glVertex3d( ptr->x * g_Parm_3D_Visu.m_BiuTo3Dunits,
-ptr->y * g_Parm_3D_Visu.m_BiuTo3Dunits,
g_Parm_3D_Visu.m_CurrentZpos );
glVertex3d( ptr->x * s_biuTo3Dunits, -ptr->y * s_biuTo3Dunits, s_currentZpos );
}

View File

@ -36,13 +36,15 @@
* @param aZpos = z position in board internal units
* @param aThickness = thickness in board internal units
* @param aBiuTo3DUnits = board internal units to 3D units scaling value
* @param aUseTextures = true to use textxures for the polygons
* If aThickness = 0, a polygon area is drawn in a XY plane at Z position = aZpos.
* 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
*/
void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
int aZpos, int aThickness, double aBiuTo3DUnits );
int aZpos, int aThickness, double aBiuTo3DUnits,
bool aUseTextures );
/** draw the solid polygon found in aPolysList
* The first polygonj is the main polygon, others are holes
@ -50,13 +52,15 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
* @param aZpos = z position in board internal units
* @param aThickness = thickness in board internal units
* @param aBiuTo3DUnits = board internal units to 3D units scaling value
* @param aUseTextures = true to use textxures for the polygons
* If aThickness = 0, a polygon area is drawn in a XY plane at Z position = aZpos.
* 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
*/
void Draw3D_SolidHorizontalPolygonWithHoles( const CPOLYGONS_LIST& aPolysList,
int aZpos, int aThickness, double aBiuTo3DUnits );
int aZpos, int aThickness, double aBiuTo3DUnits,
bool aUseTextures );
/** draw a thick segment using 3D primitives, in a XY plane
* @param aStart = YX position of start point in board units
@ -125,6 +129,13 @@ void Draw3D_ZaxisOblongCylinder( wxPoint aAxis1Pos, wxPoint aAxis2Pos,
*/
void SetGLColor( EDA_COLOR_T aColor, double aTransparency = 1.0 );
/**
* Set the current 3D color from a S3D_COLOR color, with optional transparency
* @param aColor = a S3D_COLOR RGB color index
* @param aTransparency = the color transparency (default = 1.0 = no transparency)
*/
void SetGLColor( S3D_COLOR& aColor, float aTransparency );
/**
* Set a texture id and a scale to apply when rendering the polygons

View File

@ -0,0 +1,431 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_draw_helper_functions.cpp
*/
#include <fctsys.h>
#include <PolyLine.h>
#include <colors.h>
#include <colors_selection.h>
#include <class_pad.h>
#include <class_track.h>
#include <convert_basic_shapes_to_polygon.h>
#include <3d_viewer.h>
#include <3d_canvas.h>
#include <info3d_visu.h>
#include <3d_draw_basic_functions.h>
#define TEXTURE_PCB_SCALE 5.0
INFO3D_VISU& EDA_3D_CANVAS::GetPrm3DVisu() const
{
return Parent()->GetPrm3DVisu();
}
wxSize EDA_3D_CANVAS::getBoardSize() const
{
// return the size of the board in pcb units
return GetPrm3DVisu().m_BoardSize;
}
wxPoint EDA_3D_CANVAS::getBoardCenter() const
{
// return the position of the board center in pcb units
return GetPrm3DVisu().m_BoardPos;
}
// return true if we are in realistic mode render
bool EDA_3D_CANVAS::isRealisticMode() const
{
return GetPrm3DVisu().IsRealisticMode();
}
// return true if aItem should be displayed
bool EDA_3D_CANVAS::isEnabled( DISPLAY3D_FLG aItem ) const
{
return GetPrm3DVisu().GetFlag( aItem );
}
// Helper function: initialize the copper color to draw the board
// in realistic mode.
void EDA_3D_CANVAS::setGLCopperColor()
{
glDisable( GL_TEXTURE_2D );
SetGLColor( GetPrm3DVisu().m_CopperColor, 1.0 );
}
// Helper function: initialize the color to draw the epoxy
// body board in realistic mode.
void EDA_3D_CANVAS::setGLEpoxyColor( double aTransparency )
{
// Generates an epoxy color, near board color
SetGLColor( GetPrm3DVisu().m_BoardBodyColor, aTransparency );
if( isEnabled( FL_RENDER_TEXTURES ) )
{
SetGLTexture( m_text_pcb, TEXTURE_PCB_SCALE );
}
}
// Helper function: initialize the color to draw the
// solder mask layers in realistic mode.
void EDA_3D_CANVAS::setGLSolderMaskColor( double aTransparency )
{
// Generates a solder mask color
SetGLColor( GetPrm3DVisu().m_SolderMaskColor, aTransparency );
if( isEnabled( FL_RENDER_TEXTURES ) )
{
SetGLTexture( m_text_pcb, TEXTURE_PCB_SCALE );
}
}
// Helper function: initialize the color to draw the non copper layers
// in realistic mode and normal mode.
void EDA_3D_CANVAS::setGLTechLayersColor( LAYER_NUM aLayer )
{
EDA_COLOR_T color;
if( isRealisticMode() )
{
switch( aLayer )
{
case B_Paste:
case F_Paste:
SetGLColor( DARKGRAY, 0.7 );
break;
case B_SilkS:
case F_SilkS:
SetGLColor( GetPrm3DVisu().m_SilkScreenColor, 0.96 );
if( isEnabled( FL_RENDER_TEXTURES ) )
{
SetGLTexture( m_text_silk, 10.0f );
}
break;
case B_Mask:
case F_Mask:
setGLSolderMaskColor( 0.90 );
break;
default:
color = g_ColorsSettings.GetLayerColor( aLayer );
SetGLColor( color, 0.7 );
break;
}
}
else
{
color = g_ColorsSettings.GetLayerColor( aLayer );
SetGLColor( color, 0.7 );
}
}
void EDA_3D_CANVAS::Draw3DAxis()
{
if( ! m_glLists[GL_ID_AXIS] )
{
m_glLists[GL_ID_AXIS] = glGenLists( 1 );
glNewList( m_glLists[GL_ID_AXIS], GL_COMPILE );
glEnable( GL_COLOR_MATERIAL );
SetGLColor( WHITE );
glBegin( GL_LINES );
glNormal3f( 0.0f, 0.0f, 1.0f ); // Normal is Z axis
glVertex3f( 0.0f, 0.0f, 0.0f );
glVertex3f( 1.0f, 0.0f, 0.0f ); // X axis
glVertex3f( 0.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, -1.0f, 0.0f ); // Y axis
glNormal3f( 1.0f, 0.0f, 0.0f ); // Normal is Y axis
glVertex3f( 0.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.3f ); // Z axis
glEnd();
glEndList();
}
}
// draw a 3D grid: an horizontal grid (XY plane and Z = 0,
// and a vertical grid (XZ plane and Y = 0)
void EDA_3D_CANVAS::Draw3DGrid( double aGriSizeMM )
{
double zpos = 0.0;
EDA_COLOR_T gridcolor = DARKGRAY; // Color of grid lines
EDA_COLOR_T gridcolor_marker = LIGHTGRAY; // Color of grid lines every 5 lines
const double scale = GetPrm3DVisu().m_BiuTo3Dunits;
const double transparency = 0.3;
glNormal3f( 0.0, 0.0, 1.0 );
wxSize brd_size = getBoardSize();
wxPoint brd_center_pos = getBoardCenter();
NEGATE( brd_center_pos.y );
int xsize = std::max( brd_size.x, Millimeter2iu( 100 ) );
int ysize = std::max( brd_size.y, Millimeter2iu( 100 ) );
// Grid limits, in 3D units
double xmin = (brd_center_pos.x - xsize / 2) * scale;
double xmax = (brd_center_pos.x + xsize / 2) * scale;
double ymin = (brd_center_pos.y - ysize / 2) * scale;
double ymax = (brd_center_pos.y + ysize / 2) * scale;
double zmin = Millimeter2iu( -50 ) * scale;
double zmax = Millimeter2iu( 100 ) * scale;
// Draw horizontal grid centered on 3D origin (center of the board)
for( int ii = 0; ; ii++ )
{
if( (ii % 5) )
SetGLColor( gridcolor, transparency );
else
SetGLColor( gridcolor_marker, transparency );
int delta = KiROUND( ii * aGriSizeMM * IU_PER_MM );
if( delta <= xsize / 2 ) // Draw grid lines parallel to X axis
{
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x + delta) * scale, -ymin, zpos );
glVertex3f( (brd_center_pos.x + delta) * scale, -ymax, zpos );
glEnd();
if( ii != 0 )
{
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x - delta) * scale, -ymin, zpos );
glVertex3f( (brd_center_pos.x - delta) * scale, -ymax, zpos );
glEnd();
}
}
if( delta <= ysize / 2 ) // Draw grid lines parallel to Y axis
{
glBegin( GL_LINES );
glVertex3f( xmin, -(brd_center_pos.y + delta) * scale, zpos );
glVertex3f( xmax, -(brd_center_pos.y + delta) * scale, zpos );
glEnd();
if( ii != 0 )
{
glBegin( GL_LINES );
glVertex3f( xmin, -(brd_center_pos.y - delta) * scale, zpos );
glVertex3f( xmax, -(brd_center_pos.y - delta) * scale, zpos );
glEnd();
}
}
if( ( delta > ysize / 2 ) && ( delta > xsize / 2 ) )
break;
}
// Draw vertical grid n Z axis
glNormal3f( 0.0, -1.0, 0.0 );
// Draw vertical grid lines (parallel to Z axis)
for( int ii = 0; ; ii++ )
{
if( (ii % 5) )
SetGLColor( gridcolor, transparency );
else
SetGLColor( gridcolor_marker, transparency );
double delta = ii * aGriSizeMM * IU_PER_MM;
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x + delta) * scale, -brd_center_pos.y * scale, zmin );
glVertex3f( (brd_center_pos.x + delta) * scale, -brd_center_pos.y * scale, zmax );
glEnd();
if( ii != 0 )
{
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x - delta) * scale, -brd_center_pos.y * scale, zmin );
glVertex3f( (brd_center_pos.x - delta) * scale, -brd_center_pos.y * scale, zmax );
glEnd();
}
if( delta > xsize / 2 )
break;
}
// Draw horizontal grid lines on Z axis
for( int ii = 0; ; ii++ )
{
if( (ii % 5) )
SetGLColor( gridcolor, transparency);
else
SetGLColor( gridcolor_marker, transparency );
double delta = ii * aGriSizeMM * IU_PER_MM * scale;
if( delta <= zmax )
{
// Draw grid lines on Z axis (positive Z axis coordinates)
glBegin( GL_LINES );
glVertex3f( xmin, -brd_center_pos.y * scale, delta );
glVertex3f( xmax, -brd_center_pos.y * scale, delta );
glEnd();
}
if( delta <= -zmin && ( ii != 0 ) )
{
// Draw grid lines on Z axis (negative Z axis coordinates)
glBegin( GL_LINES );
glVertex3f( xmin, -brd_center_pos.y * scale, -delta );
glVertex3f( xmax, -brd_center_pos.y * scale, -delta );
glEnd();
}
if( ( delta > zmax ) && ( delta > -zmin ) )
break;
}
}
// Draw 3D pads.
void EDA_3D_CANVAS::Draw3DPadHole( const D_PAD* aPad )
{
// Draw the pad hole
wxSize drillsize = aPad->GetDrillSize();
bool hasHole = drillsize.x && drillsize.y;
if( !hasHole )
return;
// Store here the points to approximate hole by segments
CPOLYGONS_LIST holecornersBuffer;
int thickness = GetPrm3DVisu().GetCopperThicknessBIU();
int height = GetPrm3DVisu().GetLayerZcoordBIU( F_Cu ) -
GetPrm3DVisu().GetLayerZcoordBIU( B_Cu );
if( isRealisticMode() )
setGLCopperColor();
else
SetGLColor( DARKGRAY );
int holeZpoz = GetPrm3DVisu().GetLayerZcoordBIU( B_Cu ) + thickness / 2;
int holeHeight = height - thickness;
if( drillsize.x == drillsize.y ) // usual round hole
{
Draw3D_ZaxisCylinder( aPad->GetPosition(),
(drillsize.x + thickness) / 2, holeHeight,
thickness, holeZpoz, GetPrm3DVisu().m_BiuTo3Dunits );
}
else // Oblong hole
{
wxPoint ends_offset;
int width;
if( drillsize.x > drillsize.y ) // Horizontal oval
{
ends_offset.x = ( drillsize.x - drillsize.y ) / 2;
width = drillsize.y;
}
else // Vertical oval
{
ends_offset.y = ( drillsize.y - drillsize.x ) / 2;
width = drillsize.x;
}
RotatePoint( &ends_offset, aPad->GetOrientation() );
wxPoint start = aPad->GetPosition() + ends_offset;
wxPoint end = aPad->GetPosition() - ends_offset;
int hole_radius = ( width + thickness ) / 2;
// Draw the hole
Draw3D_ZaxisOblongCylinder( start, end, hole_radius, holeHeight,
thickness, holeZpoz, GetPrm3DVisu().m_BiuTo3Dunits );
}
}
void EDA_3D_CANVAS::Draw3DViaHole( const VIA* aVia )
{
LAYER_ID top_layer, bottom_layer;
int inner_radius = aVia->GetDrillValue() / 2;
int thickness = GetPrm3DVisu().GetCopperThicknessBIU();
aVia->LayerPair( &top_layer, &bottom_layer );
// Drawing via hole:
if( isRealisticMode() )
setGLCopperColor();
else
{
EDA_COLOR_T color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + aVia->GetViaType() );
SetGLColor( color );
}
int height = GetPrm3DVisu().GetLayerZcoordBIU( top_layer ) -
GetPrm3DVisu().GetLayerZcoordBIU( bottom_layer ) - thickness;
int zpos = GetPrm3DVisu().GetLayerZcoordBIU( bottom_layer ) + thickness / 2;
Draw3D_ZaxisCylinder( aVia->GetStart(), inner_radius + thickness / 2, height,
thickness, zpos, GetPrm3DVisu().m_BiuTo3Dunits );
}
/* Build a pad outline as non filled polygon, to draw pads on silkscreen layer
* Used only to draw pads outlines on silkscreen layers.
*/
void EDA_3D_CANVAS::BuildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
CPOLYGONS_LIST& aCornerBuffer,
int aWidth,
int aCircleToSegmentsCount,
double aCorrectionFactor )
{
if( aPad->GetShape() == PAD_CIRCLE ) // Draw a ring
{
TransformRingToPolygon( aCornerBuffer, aPad->ShapePos(),
aPad->GetSize().x / 2, aCircleToSegmentsCount, aWidth );
return;
}
// For other shapes, draw polygon outlines
CPOLYGONS_LIST corners;
aPad->BuildPadShapePolygon( corners, wxSize( 0, 0 ),
aCircleToSegmentsCount, aCorrectionFactor );
// Add outlines as thick segments in polygon buffer
for( unsigned ii = 0, jj = corners.GetCornersCount() - 1;
ii < corners.GetCornersCount(); jj = ii, ii++ )
{
TransformRoundedEndsSegmentToPolygon( aCornerBuffer,
corners.GetPos( jj ),
corners.GetPos( ii ),
aCircleToSegmentsCount, aWidth );
}
}

View File

@ -28,6 +28,7 @@
#include <fctsys.h>
#include <kiface_i.h>
#include <pgm_base.h>
#include <macros.h>
#include <3d_viewer.h>
#include <3d_canvas.h>
@ -44,8 +45,18 @@ INFO3D_VISU g_Parm_3D_Visu;
static const wxChar keyBgColor_Red[] = wxT( "BgColor_Red" );
static const wxChar keyBgColor_Green[] = wxT( "BgColor_Green" );
static const wxChar keyBgColor_Blue[] = wxT( "BgColor_Blue" );
static const wxChar keyBgColor_Red_Top[] = wxT( "BgColor_Red_Top" );
static const wxChar keyBgColor_Green_Top[] = wxT( "BgColor_Green_Top" );
static const wxChar keyBgColor_Blue_Top[] = wxT( "BgColor_Blue_Top" );
static const wxChar keyShowRealisticMode[] = wxT( "ShowRealisticMode" );
static const wxChar keyUseHQinRealisticMode[] = wxT( "UseHQinRealisticMode" );
static const wxChar keyRenderShadows[] = wxT( "Render_Shadows" );
static const wxChar keyRenderRemoveHoles[] = wxT( "Render_RemoveHoles" );
static const wxChar keyRenderTextures[] = wxT( "Render_Textures" );
static const wxChar keyRenderSmooth[] = wxT( "Render_Smooth" );
static const wxChar keyRenderMaterial[] = wxT( "Render_Material" );
static const wxChar keyShowAxis[] = wxT( "ShowAxis" );
static const wxChar keyShowGrid[] = wxT( "ShowGrid3D" );
static const wxChar keyShowGridSize[] = wxT( "Grid3DSize" );
@ -107,8 +118,70 @@ EDA_3D_FRAME::EDA_3D_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent,
ReCreateMainToolbar();
// Make a EDA_3D_CANVAS
int attrs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16,
WX_GL_STENCIL_SIZE, 1, 0 };
// Note: We try to use anti aliasing if the graphic card allows that,
// but only on wxWidgets >= 3.0.0 (this option does not exist on wxWidgets 2.8)
int attrs[] = { // This array should be 2*n+1
// Sadly wxwidgets / glx < 13 allowed
// a thing named "boolean attributes" that don't take a value.
// (See src/unix/glx11.cpp -> wxGLCanvasX11::ConvertWXAttrsToGL() ).
// To avoid problems due to this, just specify those attributes twice.
// Only WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_STEREO are such boolean
// attributes.
// Boolean attributes (using itself at padding):
WX_GL_RGBA, WX_GL_RGBA,
WX_GL_DOUBLEBUFFER, WX_GL_DOUBLEBUFFER,
// Normal attributes with values:
WX_GL_DEPTH_SIZE, 16,
WX_GL_STENCIL_SIZE, 1,
#if wxCHECK_VERSION( 3, 0, 0 )
WX_GL_SAMPLE_BUFFERS, 1, // Enable multisampling support (antialiasing).
WX_GL_SAMPLES, 0, // Disable AA for the start.
#endif
0 }; // NULL termination
#if wxCHECK_VERSION( 3, 0, 0 )
// Check if the canvas supports multisampling.
if( EDA_3D_CANVAS::IsDisplaySupported( attrs ) )
{
// Check for possible sample sizes, start form the top.
int maxSamples = 8; // Any higher doesn't change anything.
int samplesOffset = 0;
for( unsigned int ii = 0; ii < DIM( attrs ); ii += 2 )
{
if( attrs[ii] == WX_GL_SAMPLES )
{
samplesOffset = ii+1;
break;
}
}
attrs[samplesOffset] = maxSamples;
for( ; maxSamples > 0 && !EDA_3D_CANVAS::IsDisplaySupported( attrs );
maxSamples = maxSamples>>1 )
{
attrs[samplesOffset] = maxSamples;
}
}
else
{
// Disable multisampling
for( unsigned int ii = 0; ii < DIM( attrs ); ii += 2 )
{
if( attrs[ii] == WX_GL_SAMPLE_BUFFERS )
{
attrs[ii+1] = 0;
break;
}
}
}
#endif
m_canvas = new EDA_3D_CANVAS( this, attrs );
m_auimgr.SetManagedWindow( this );
@ -151,18 +224,34 @@ void EDA_3D_FRAME::LoadSettings( wxConfigBase* aCfg )
{
EDA_BASE_FRAME::LoadSettings( aCfg );
INFO3D_VISU& prms = g_Parm_3D_Visu;
INFO3D_VISU& prms = GetPrm3DVisu();
aCfg->Read( keyBgColor_Red, &g_Parm_3D_Visu.m_BgColor.m_Red, 0.0 );
aCfg->Read( keyBgColor_Green, &g_Parm_3D_Visu.m_BgColor.m_Green, 0.0 );
aCfg->Read( keyBgColor_Blue, &g_Parm_3D_Visu.m_BgColor.m_Blue, 0.0 );
aCfg->Read( keyBgColor_Red, &GetPrm3DVisu().m_BgColor.m_Red, 0.4 );
aCfg->Read( keyBgColor_Green, &GetPrm3DVisu().m_BgColor.m_Green, 0.4 );
aCfg->Read( keyBgColor_Blue, &GetPrm3DVisu().m_BgColor.m_Blue, 0.5 );
aCfg->Read( keyBgColor_Red_Top, &GetPrm3DVisu().m_BgColor_Top.m_Red, 0.8 );
aCfg->Read( keyBgColor_Green_Top, &GetPrm3DVisu().m_BgColor_Top.m_Green, 0.8 );
aCfg->Read( keyBgColor_Blue_Top, &GetPrm3DVisu().m_BgColor_Top.m_Blue, 0.9 );
bool tmp;
aCfg->Read( keyShowRealisticMode, &tmp, false );
prms.SetFlag( FL_USE_REALISTIC_MODE, tmp );
aCfg->Read( keyUseHQinRealisticMode, &tmp, false );
prms.SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, tmp );
aCfg->Read( keyRenderShadows, &tmp, false );
prms.SetFlag( FL_RENDER_SHADOWS, tmp );
aCfg->Read( keyRenderRemoveHoles, &tmp, false );
prms.SetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES, tmp );
aCfg->Read( keyRenderTextures, &tmp, false );
prms.SetFlag( FL_RENDER_TEXTURES, tmp );
aCfg->Read( keyRenderSmooth, &tmp, false );
prms.SetFlag( FL_RENDER_SMOOTH, tmp );
aCfg->Read( keyRenderMaterial, &tmp, false );
prms.SetFlag( FL_RENDER_MATERIAL, tmp );
aCfg->Read( keyShowAxis, &tmp, true );
prms.SetFlag( FL_AXIS, tmp );
@ -171,7 +260,6 @@ void EDA_3D_FRAME::LoadSettings( wxConfigBase* aCfg )
prms.SetFlag( FL_GRID, tmp );
aCfg->Read( keyShowGridSize, &prms.m_3D_Grid, 10.0 );
prms.SetFlag( FL_MODULE, tmp );
aCfg->Read( keyShowFootprints, &tmp, true );
prms.SetFlag( FL_MODULE, tmp );
@ -209,26 +297,37 @@ void EDA_3D_FRAME::SaveSettings( wxConfigBase* aCfg )
{
EDA_BASE_FRAME::SaveSettings( aCfg );
INFO3D_VISU& prms = g_Parm_3D_Visu;
INFO3D_VISU& prms = GetPrm3DVisu();
aCfg->Write( keyBgColor_Red, g_Parm_3D_Visu.m_BgColor.m_Red );
aCfg->Write( keyBgColor_Green, g_Parm_3D_Visu.m_BgColor.m_Green );
aCfg->Write( keyBgColor_Blue, g_Parm_3D_Visu.m_BgColor.m_Blue );
aCfg->Write( keyShowRealisticMode, prms.GetFlag( FL_USE_REALISTIC_MODE ) );
aCfg->Write( keyUseHQinRealisticMode, prms.GetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE ) );
aCfg->Write( keyShowAxis, prms.GetFlag( FL_AXIS ) );
aCfg->Write( keyShowGrid, prms.GetFlag( FL_GRID ) );
aCfg->Write( keyShowGridSize, prms.m_3D_Grid );
aCfg->Write( keyShowFootprints, prms.GetFlag( FL_MODULE ) );
aCfg->Write( keyShowCopperThickness, prms.GetFlag( FL_USE_COPPER_THICKNESS ) );
aCfg->Write( keyShowZones, prms.GetFlag( FL_ZONE ) );
aCfg->Write( keyShowAdhesiveLayers, prms.GetFlag( FL_ADHESIVE ) );
aCfg->Write( keyShowSilkScreenLayers, prms.GetFlag( FL_SILKSCREEN ) );
aCfg->Write( keyShowSolderMaskLayers, prms.GetFlag( FL_SOLDERMASK ) );
aCfg->Write( keyShowSolderPasteLayers, prms.GetFlag( FL_SOLDERPASTE ) );
aCfg->Write( keyShowCommentsLayer, prms.GetFlag( FL_COMMENTS ) );
aCfg->Write( keyShowEcoLayers, prms.GetFlag( FL_ECO ) );
aCfg->Write( keyShowBoardBody, prms.GetFlag( FL_SHOW_BOARD_BODY ) );
aCfg->Write( keyBgColor_Red, GetPrm3DVisu().m_BgColor.m_Red );
aCfg->Write( keyBgColor_Green, GetPrm3DVisu().m_BgColor.m_Green );
aCfg->Write( keyBgColor_Blue, GetPrm3DVisu().m_BgColor.m_Blue );
aCfg->Write( keyBgColor_Red_Top, GetPrm3DVisu().m_BgColor_Top.m_Red );
aCfg->Write( keyBgColor_Green_Top, GetPrm3DVisu().m_BgColor_Top.m_Green );
aCfg->Write( keyBgColor_Blue_Top, GetPrm3DVisu().m_BgColor_Top.m_Blue );
aCfg->Write( keyShowRealisticMode, prms.GetFlag( FL_USE_REALISTIC_MODE ) );
aCfg->Write( keyRenderShadows, prms.GetFlag( FL_RENDER_SHADOWS ) );
aCfg->Write( keyRenderRemoveHoles, prms.GetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES ) );
aCfg->Write( keyRenderTextures, prms.GetFlag( FL_RENDER_TEXTURES ) );
aCfg->Write( keyRenderSmooth, prms.GetFlag( FL_RENDER_SMOOTH ) );
aCfg->Write( keyRenderMaterial, prms.GetFlag( FL_RENDER_MATERIAL ) );
aCfg->Write( keyShowAxis, prms.GetFlag( FL_AXIS ) );
aCfg->Write( keyShowGrid, prms.GetFlag( FL_GRID ) );
aCfg->Write( keyShowGridSize, prms.m_3D_Grid );
aCfg->Write( keyShowFootprints, prms.GetFlag( FL_MODULE ) );
aCfg->Write( keyShowCopperThickness, prms.GetFlag( FL_USE_COPPER_THICKNESS ) );
aCfg->Write( keyShowZones, prms.GetFlag( FL_ZONE ) );
aCfg->Write( keyShowAdhesiveLayers, prms.GetFlag( FL_ADHESIVE ) );
aCfg->Write( keyShowSilkScreenLayers, prms.GetFlag( FL_SILKSCREEN ) );
aCfg->Write( keyShowSolderMaskLayers, prms.GetFlag( FL_SOLDERMASK ) );
aCfg->Write( keyShowSolderPasteLayers, prms.GetFlag( FL_SOLDERPASTE ) );
aCfg->Write( keyShowCommentsLayer, prms.GetFlag( FL_COMMENTS ) );
aCfg->Write( keyShowEcoLayers, prms.GetFlag( FL_ECO ) );
aCfg->Write( keyShowBoardBody, prms.GetFlag( FL_SHOW_BOARD_BODY ) );
}
@ -241,23 +340,23 @@ void EDA_3D_FRAME::Process_Zoom( wxCommandEvent& event )
case ID_ZOOM_PAGE:
for( ii = 0; ii < 4; ii++ )
g_Parm_3D_Visu.m_Rot[ii] = 0.0;
GetPrm3DVisu().m_Rot[ii] = 0.0;
g_Parm_3D_Visu.m_Zoom = 1.0;
GetPrm3DVisu().m_Zoom = 1.0;
m_canvas->SetOffset( 0.0, 0.0 );
trackball( g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
trackball( GetPrm3DVisu().m_Quat, 0.0, 0.0, 0.0, 0.0 );
break;
case ID_ZOOM_IN:
g_Parm_3D_Visu.m_Zoom /= 1.2;
GetPrm3DVisu().m_Zoom /= 1.2;
if( g_Parm_3D_Visu.m_Zoom <= 0.01 )
g_Parm_3D_Visu.m_Zoom = 0.01;
if( GetPrm3DVisu().m_Zoom <= 0.01 )
GetPrm3DVisu().m_Zoom = 0.01;
break;
case ID_ZOOM_OUT:
g_Parm_3D_Visu.m_Zoom *= 1.2;
GetPrm3DVisu().m_Zoom *= 1.2;
break;
case ID_ZOOM_REDRAW:
@ -311,27 +410,27 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
break;
case ID_ROTATE3D_X_POS:
g_Parm_3D_Visu.m_ROTX += ROT_ANGLE;
GetPrm3DVisu().m_ROTX += ROT_ANGLE;
break;
case ID_ROTATE3D_X_NEG:
g_Parm_3D_Visu.m_ROTX -= ROT_ANGLE;
GetPrm3DVisu().m_ROTX -= ROT_ANGLE;
break;
case ID_ROTATE3D_Y_POS:
g_Parm_3D_Visu.m_ROTY += ROT_ANGLE;
GetPrm3DVisu().m_ROTY += ROT_ANGLE;
break;
case ID_ROTATE3D_Y_NEG:
g_Parm_3D_Visu.m_ROTY -= ROT_ANGLE;
GetPrm3DVisu().m_ROTY -= ROT_ANGLE;
break;
case ID_ROTATE3D_Z_POS:
g_Parm_3D_Visu.m_ROTZ += ROT_ANGLE;
GetPrm3DVisu().m_ROTZ += ROT_ANGLE;
break;
case ID_ROTATE3D_Z_NEG:
g_Parm_3D_Visu.m_ROTZ -= ROT_ANGLE;
GetPrm3DVisu().m_ROTZ -= ROT_ANGLE;
break;
case ID_MOVE3D_LEFT:
@ -361,71 +460,97 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
break;
case ID_MENU3D_BGCOLOR_SELECTION:
Set3DBgColor();
Get3DColorFromUser( GetPrm3DVisu().m_BgColor );
return;
case ID_MENU3D_BGCOLOR_TOP_SELECTION:
Get3DColorFromUser( GetPrm3DVisu().m_BgColor_Top );
return;
case ID_MENU3D_REALISTIC_MODE:
g_Parm_3D_Visu.SetFlag( FL_USE_REALISTIC_MODE, isChecked );
GetPrm3DVisu().SetFlag( FL_USE_REALISTIC_MODE, isChecked );
NewDisplay();
return;
case ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE:
g_Parm_3D_Visu.SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, isChecked );
case ID_MENU3D_FL_RENDER_SHADOWS:
GetPrm3DVisu().SetFlag( FL_RENDER_SHADOWS, isChecked );
NewDisplay();
return;
case ID_MENU3D_FL_RENDER_SHOW_HOLES_IN_ZONES:
GetPrm3DVisu().SetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES, isChecked );
NewDisplay();
return;
case ID_MENU3D_FL_RENDER_TEXTURES:
GetPrm3DVisu().SetFlag( FL_RENDER_TEXTURES, isChecked );
NewDisplay(GL_ID_BOARD);
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_FL_RENDER_SMOOTH:
GetPrm3DVisu().SetFlag( FL_RENDER_SMOOTH, isChecked );
NewDisplay();
return;
case ID_MENU3D_FL_RENDER_MATERIAL:
GetPrm3DVisu().SetFlag( FL_RENDER_MATERIAL, isChecked );
NewDisplay();
return;
case ID_MENU3D_SHOW_BOARD_BODY:
g_Parm_3D_Visu.SetFlag( FL_SHOW_BOARD_BODY, isChecked );
GetPrm3DVisu().SetFlag( FL_SHOW_BOARD_BODY, isChecked );
NewDisplay();
return;
case ID_MENU3D_AXIS_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_AXIS, isChecked );
GetPrm3DVisu().SetFlag( FL_AXIS, isChecked );
m_canvas->Refresh();
return;
case ID_MENU3D_MODULE_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_MODULE, isChecked );
GetPrm3DVisu().SetFlag( FL_MODULE, isChecked );
m_canvas->Refresh();
return;
case ID_MENU3D_USE_COPPER_THICKNESS:
g_Parm_3D_Visu.SetFlag( FL_USE_COPPER_THICKNESS, isChecked );
GetPrm3DVisu().SetFlag( FL_USE_COPPER_THICKNESS, isChecked );
NewDisplay(GL_ID_BOARD);
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_ZONE_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_ZONE, isChecked );
GetPrm3DVisu().SetFlag( FL_ZONE, isChecked );
NewDisplay(GL_ID_BOARD);
return;
case ID_MENU3D_ADHESIVE_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_ADHESIVE, isChecked );
GetPrm3DVisu().SetFlag( FL_ADHESIVE, isChecked );
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_SILKSCREEN_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_SILKSCREEN, isChecked );
GetPrm3DVisu().SetFlag( FL_SILKSCREEN, isChecked );
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_SOLDER_MASK_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_SOLDERMASK, isChecked );
GetPrm3DVisu().SetFlag( FL_SOLDERMASK, isChecked );
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_SOLDER_PASTE_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_SOLDERPASTE, isChecked );
GetPrm3DVisu().SetFlag( FL_SOLDERPASTE, isChecked );
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_COMMENTS_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_COMMENTS, isChecked );
GetPrm3DVisu().SetFlag( FL_COMMENTS, isChecked );
NewDisplay(GL_ID_AUX_LAYERS);
return;
case ID_MENU3D_ECO_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_ECO, isChecked );
GetPrm3DVisu().SetFlag( FL_ECO, isChecked );
NewDisplay(GL_ID_AUX_LAYERS);
return;
@ -443,7 +568,7 @@ void EDA_3D_FRAME::On3DGridSelection( wxCommandEvent& event )
{
int id = event.GetId();
for( int ii = ID_MENU3D_GRID; ii < ID_MENU3D_GRID_END; ii++ )
for( int ii = ID_MENU3D_GRID_NOGRID; ii < ID_MENU3D_GRID_END; ii++ )
{
if( event.GetId() == ii )
continue;
@ -454,27 +579,27 @@ void EDA_3D_FRAME::On3DGridSelection( wxCommandEvent& event )
switch( id )
{
case ID_MENU3D_GRID_NOGRID:
g_Parm_3D_Visu.SetFlag( FL_GRID, false );
GetPrm3DVisu().SetFlag( FL_GRID, false );
break;
case ID_MENU3D_GRID_10_MM:
g_Parm_3D_Visu.SetFlag( FL_GRID, true );
g_Parm_3D_Visu.m_3D_Grid = 10.0;
GetPrm3DVisu().SetFlag( FL_GRID, true );
GetPrm3DVisu().m_3D_Grid = 10.0;
break;
case ID_MENU3D_GRID_5_MM:
g_Parm_3D_Visu.SetFlag( FL_GRID, true );
g_Parm_3D_Visu.m_3D_Grid = 5.0;
GetPrm3DVisu().SetFlag( FL_GRID, true );
GetPrm3DVisu().m_3D_Grid = 5.0;
break;
case ID_MENU3D_GRID_2P5_MM:
g_Parm_3D_Visu.SetFlag( FL_GRID, true );
g_Parm_3D_Visu.m_3D_Grid = 2.5;
GetPrm3DVisu().SetFlag( FL_GRID, true );
GetPrm3DVisu().m_3D_Grid = 2.5;
break;
case ID_MENU3D_GRID_1_MM:
g_Parm_3D_Visu.SetFlag( FL_GRID, true );
g_Parm_3D_Visu.m_3D_Grid = 1.0;
GetPrm3DVisu().SetFlag( FL_GRID, true );
GetPrm3DVisu().m_3D_Grid = 1.0;
break;
default:
@ -511,30 +636,44 @@ void EDA_3D_FRAME::OnActivate( wxActivateEvent& event )
/* called to set the background color of the 3D scene
*/
void EDA_3D_FRAME::Set3DBgColor()
bool EDA_3D_FRAME::Get3DColorFromUser( S3D_COLOR &color )
{
S3D_COLOR color;
wxColour newcolor, oldcolor;
oldcolor.Set( KiROUND( g_Parm_3D_Visu.m_BgColor.m_Red * 255 ),
KiROUND( g_Parm_3D_Visu.m_BgColor.m_Green * 255 ),
KiROUND( g_Parm_3D_Visu.m_BgColor.m_Blue * 255 ) );
oldcolor.Set( KiROUND( color.m_Red * 255 ),
KiROUND( color.m_Green * 255 ),
KiROUND( color.m_Blue * 255 ) );
newcolor = wxGetColourFromUser( this, oldcolor );
if( !newcolor.IsOk() ) // Happens on cancel dialog
return;
if( !newcolor.IsOk() ) // Cancel command
return false;
if( newcolor != oldcolor )
{
g_Parm_3D_Visu.m_BgColor.m_Red = (double) newcolor.Red() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Green = (double) newcolor.Green() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Blue = (double) newcolor.Blue() / 255.0;
NewDisplay();
color.m_Red = (double) newcolor.Red() / 255.0;
color.m_Green = (double) newcolor.Green() / 255.0;
color.m_Blue = (double) newcolor.Blue() / 255.0;
m_canvas->Redraw();
}
return true;
}
BOARD* EDA_3D_FRAME::GetBoard()
{
return Parent()->GetBoard();
}
INFO3D_VISU& EDA_3D_FRAME::GetPrm3DVisu() const
{
// return the INFO3D_VISU which contains the current parameters
// to draw the 3D view og the board
return g_Parm_3D_Visu;
}
bool EDA_3D_FRAME::IsEnabled( DISPLAY3D_FLG aItem ) const
{
// return true if aItem must be displayed
return GetPrm3DVisu().GetFlag( aItem );
}

View File

@ -28,6 +28,7 @@
#include <fctsys.h>
#include <3d_struct.h>
#include <3d_material.h>
#include <info3d_visu.h>
#ifdef __WXMAC__
# ifdef __DARWIN__
@ -54,83 +55,96 @@ S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
void SetOpenGlDefaultMaterial()
{
glm::vec4 ambient( 0.15, 0.15, 0.15, 1.0 );
glm::vec4 specular( 0.1, 0.1, 0.1, 1.0 );
glm::vec4 emissive( 0.1, 0.1, 0.1, 1.0 );
GLint shininess_value = 80;
glm::vec4 ambient( 0.2, 0.2, 0.2, 1.0 );
glm::vec4 specular( 0.0, 0.0, 0.0, 1.0 );
glm::vec4 emissive( 0.0, 0.0, 0.0, 1.0 );
glm::vec4 diffuse( 0.0, 0.0, 0.0, 1.0 );
GLint shininess_value = 0;
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
//glColor4f( 1.0, 1.0, 1.0, 1.0 );
glMateriali ( GL_FRONT_AND_BACK, GL_SHININESS, shininess_value );
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.x );
glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.x );
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.x );
glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.x );
}
void S3D_MATERIAL::SetOpenGLMaterial( unsigned int materialIndex )
void S3D_MATERIAL::SetOpenGLMaterial( unsigned int aMaterialIndex, bool aUseMaterial )
{
S3D_MASTER * s3dParent = (S3D_MASTER *) GetParent();
if( ! s3dParent->IsOpenGlAllowed() )
return;
float transparency_value = 0.0f;
if( m_Transparency.size() > materialIndex )
if( aUseMaterial )
{
transparency_value = m_Transparency[materialIndex];
s3dParent->SetLastTransparency( transparency_value );
}
if( m_DiffuseColor.size() > materialIndex )
{
glm::vec3 color = m_DiffuseColor[materialIndex];
if( m_AmbientColor.size() == 0 )
float transparency_value = 0.0f;
if( m_Transparency.size() > aMaterialIndex )
{
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
transparency_value = m_Transparency[aMaterialIndex];
s3dParent->SetLastTransparency( transparency_value );
}
glColor4f( color.x, color.y, color.z, 1.0 - transparency_value );
}
if( m_Shininess.size() > materialIndex )
{
glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, m_Shininess[materialIndex] );
}
if( m_DiffuseColor.size() > aMaterialIndex )
{
glm::vec3 color = m_DiffuseColor[aMaterialIndex];
// emissive
if( m_EmissiveColor.size() > materialIndex )
{
glm::vec4 emissive;
emissive[0] = m_EmissiveColor[materialIndex].x;
emissive[1] = m_EmissiveColor[materialIndex].y;
emissive[2] = m_EmissiveColor[materialIndex].z;
emissive[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.x );
}
if( m_AmbientColor.size() == 0 )
{
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
}
// specular
if( m_SpecularColor.size() > materialIndex )
{
glm::vec4 specular;
specular[0] = m_SpecularColor[materialIndex].x;
specular[1] = m_SpecularColor[materialIndex].y;
specular[2] = m_SpecularColor[materialIndex].z;
specular[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.x );
}
glColor4f( color.x, color.y, color.z, 1.0 - transparency_value );
}
// ambient
if( m_AmbientColor.size() > materialIndex )
if( m_Shininess.size() > aMaterialIndex )
{
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, m_Shininess[aMaterialIndex] );
}
// emissive
if( m_EmissiveColor.size() > aMaterialIndex )
{
glm::vec4 emissive;
emissive[0] = m_EmissiveColor[aMaterialIndex].x;
emissive[1] = m_EmissiveColor[aMaterialIndex].y;
emissive[2] = m_EmissiveColor[aMaterialIndex].z;
emissive[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.x );
}
// specular
if( m_SpecularColor.size() > aMaterialIndex )
{
glm::vec4 specular;
specular[0] = m_SpecularColor[aMaterialIndex].x;
specular[1] = m_SpecularColor[aMaterialIndex].y;
specular[2] = m_SpecularColor[aMaterialIndex].z;
specular[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.x );
}
// ambient
if( m_AmbientColor.size() > aMaterialIndex )
{
glm::vec4 ambient;
ambient[0] = m_AmbientColor[aMaterialIndex].x;
ambient[1] = m_AmbientColor[aMaterialIndex].y;
ambient[2] = m_AmbientColor[aMaterialIndex].z;
ambient[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.x );
}
}
else
{
glm::vec4 ambient;
ambient[0] = m_AmbientColor[materialIndex].x;
ambient[1] = m_AmbientColor[materialIndex].y;
ambient[2] = m_AmbientColor[materialIndex].z;
ambient[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.x );
}
if( m_DiffuseColor.size() > aMaterialIndex )
{
glm::vec3 color = m_DiffuseColor[aMaterialIndex];
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
glColor4f( color.x, color.y, color.z, 1.0 );
}
}
}

View File

@ -35,11 +35,11 @@
class S3D_MASTER;
class S3D_MATERIAL : public EDA_ITEM /* openGL "material" data*/
class S3D_MATERIAL : public EDA_ITEM // openGL "material" data
{
public:
wxString m_Name;
// Material list
std::vector< glm::vec3 > m_AmbientColor;
std::vector< glm::vec3 > m_DiffuseColor;
@ -54,7 +54,13 @@ public:
S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
void SetOpenGLMaterial(unsigned int materialIndex);
/**
* Initialize the material prms.
* @param aMaterialIndex = the index in list of available materials
* @param aUseMaterial = true to use the values found in the available material
* = false to use only the color, and other prms are fixed
*/
void SetOpenGLMaterial(unsigned int aMaterialIndex, bool aUseMaterial);
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override

View File

@ -24,13 +24,17 @@
/**
* @file 3d_mesh_model.cpp
* @brief
* @brief
*/
#include <3d_mesh_model.h>
#include <boost/geometry/algorithms/area.hpp>
#ifdef USE_OPENMP
#include <omp.h>
#endif // USE_OPENMP
S3D_MESH::S3D_MESH()
{
isPerFaceNormalsComputed = false;
@ -85,10 +89,13 @@ void S3D_MESH::openGL_RenderAllChilds()
void S3D_MESH::openGL_Render()
{
//DBG( printf( "openGL_Render" ) );
bool useMaterial = g_Parm_3D_Visu.GetFlag( FL_RENDER_MATERIAL );
bool smoothShapes = g_Parm_3D_Visu.IsRealisticMode()
&& g_Parm_3D_Visu.GetFlag( FL_RENDER_SMOOTH );
if( m_Materials )
{
m_Materials->SetOpenGLMaterial( 0 );
m_Materials->SetOpenGLMaterial( 0, useMaterial );
}
if( m_CoordIndex.size() == 0)
@ -109,7 +116,7 @@ void S3D_MESH::openGL_Render()
if( m_PerVertexNormalsNormalized.size() == 0 )
{
if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
if( smoothShapes )
{
calcPerPointNormals();
}
@ -118,21 +125,21 @@ void S3D_MESH::openGL_Render()
for( unsigned int idx = 0; idx < m_CoordIndex.size(); idx++ )
{
if( m_MaterialIndex.size() > 1 )
{
{
if( m_Materials )
{
m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx] );
m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx], useMaterial );
}
}
}
switch( m_CoordIndex[idx].size() )
{
case 3: glBegin( GL_TRIANGLES );break;
case 4: glBegin( GL_QUADS ); break;
default: glBegin( GL_POLYGON ); break;
case 3: glBegin( GL_TRIANGLES );break;
case 4: glBegin( GL_QUADS ); break;
default: glBegin( GL_POLYGON ); break;
}
if( m_PerVertexNormalsNormalized.size() > 0 )
{
@ -144,7 +151,8 @@ void S3D_MESH::openGL_Render()
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
glVertex3fv( &point.x );
}
} else if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
}
else if( smoothShapes )
{
std::vector< glm::vec3 > normals_list;
normals_list = m_PerFaceVertexNormals[idx];
@ -157,7 +165,8 @@ void S3D_MESH::openGL_Render()
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
glVertex3fv( &point.x );
}
} else
}
else
{
// Flat
glm::vec3 normal = m_PerFaceNormalsNormalized[idx];
@ -167,7 +176,7 @@ void S3D_MESH::openGL_Render()
glNormal3fv( &normal.x );
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
glVertex3fv( &point.x );
glVertex3fv( &point.x );
}
}
@ -258,7 +267,7 @@ void S3D_MESH::calcPerFaceNormals ()
//DBG( printf("m_CoordIndex.size %u\n", m_CoordIndex.size()) );
//DBG( printf("m_PointNormalized.size %u\n", m_PointNormalized.size()) );
for( unsigned int idx = 0; idx < m_CoordIndex.size(); idx++ )
{
@ -307,7 +316,7 @@ void S3D_MESH::calcPerFaceNormals ()
if( haveAlreadyNormals_from_model_file == false )
{
// normalize vertex normal
// normalize vertex normal
float l = glm::length( cross_prod );
if( l > FLT_EPSILON ) // avoid division by zero
@ -331,7 +340,7 @@ void S3D_MESH::calcPerFaceNormals ()
m_PerFaceNormalsNormalized.push_back( cross_prod );
}
}
}
@ -355,13 +364,18 @@ void S3D_MESH::calcPerPointNormals ()
m_PerFaceVertexNormals.clear();
// Pre-allocate space for the entire vector of vertex normals so we can do parallel writes
m_PerFaceVertexNormals.resize( m_CoordIndex.size() );
// for each face A in mesh
#ifdef USE_OPENMP
#pragma omp parallel for
#endif /* USE_OPENMP */
for( unsigned int each_face_A_idx = 0; each_face_A_idx < m_CoordIndex.size(); each_face_A_idx++ )
{
// n = face A facet normal
std::vector< glm::vec3 > face_A_normals;
face_A_normals.clear();
face_A_normals.resize(m_CoordIndex[each_face_A_idx].size());
std::vector< glm::vec3 >& face_A_normals = m_PerFaceVertexNormals[each_face_A_idx];
face_A_normals.resize( m_CoordIndex[each_face_A_idx].size() );
// loop through all 3 vertices
// for each vert in face A
@ -393,16 +407,14 @@ void S3D_MESH::calcPerPointNormals ()
}
}
// normalize vertex normal
// normalize vertex normal
float l = glm::length( face_A_normals[each_vert_A_idx] );
if( l > FLT_EPSILON ) // avoid division by zero
{
face_A_normals[each_vert_A_idx] /= l;
}
}
m_PerFaceVertexNormals.push_back( face_A_normals );
}
}
}

View File

@ -77,7 +77,7 @@ const wxString S3D_MASTER::GetShape3DFullFilename()
return shapeName;
wxString default_path;
wxGetEnv( wxT( KISYS3DMOD ), &default_path );
wxGetEnv( KISYS3DMOD, &default_path );
if( default_path.IsEmpty() )
return shapeName;
@ -119,7 +119,7 @@ int S3D_MASTER::ReadData()
if( parser )
{
parser->Load( filename );
parser->Load( filename, g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB );
delete parser;
return 0;
}

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2004 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
*
@ -35,9 +35,10 @@
#include <base_struct.h>
#include <3d_material.h>
#include <gal/opengl/glm/glm.hpp>
/* 3D modeling units -> PCB units conversion scale:
* 1 "3D model unit" wings3d = 1 unit = 2.54 mm = 0.1 inch = 100 mils
/**
* @note For historical reasons the 3D modeling unit is 0.1 inch
* 1 3Dunit = 2.54 mm = 0.1 inch = 100 mils
*/
#define UNITS3D_TO_UNITSPCB (IU_PER_MILS * 100)
@ -45,19 +46,42 @@
class S3D_MASTER;
class STRUCT_3D_SHAPE;
/* S3D_VERTEX manages a 3D coordinate (3 float numbers: x,y,z coordinates)*/
// S3D_VERTEX manages a opengl 3D coordinate (3 float numbers: x,y,z coordinates)
// float are widely used in opengl functions.
// they are used here in coordinates which are also used in opengl functions.
#define S3D_VERTEX glm::vec3
// S3DPOINT manages a set of 3 double values (x,y,z )
// It is used for values which are not directly used in opengl functions.
// It is used in dialogs, or when reading/writing files for instance
class S3DPOINT
{
public:
double x, y, z;
/* Master structure for a 3D item description */
public:
S3DPOINT()
{
x = y = z = 0.0;
}
S3DPOINT( double px, double py, double pz)
{
x = px;
y = py;
z = pz;
}
};
// Master structure for a 3D footprint shape description
class S3D_MASTER : public EDA_ITEM
{
public:
S3D_VERTEX m_MatScale;
S3D_VERTEX m_MatRotation;
S3D_VERTEX m_MatPosition;
STRUCT_3D_SHAPE* m_3D_Drawings;
S3D_MATERIAL* m_Materials;
S3DPOINT m_MatScale; ///< a scaling factor for the entire 3D footprint shape
S3DPOINT m_MatRotation; ///< a grotation for the entire 3D footprint shape
S3DPOINT m_MatPosition; ///< an offset for the entire 3D footprint shape
STRUCT_3D_SHAPE* m_3D_Drawings; ///< the list of basic shapes
S3D_MATERIAL* m_Materials; ///< the list of materiels used by the shapes
enum FILE3D_TYPE
{
@ -76,9 +100,9 @@ public:
bool m_use_modelfile_shininess;
private:
wxString m_Shape3DName; /* 3D shape name in 3D library */
wxString m_Shape3DName; // the 3D shape filename in 3D library
FILE3D_TYPE m_ShapeType;
double m_lastTransparency; // last transparency value from
double m_lastTransparency; // last transparency value from
// last material in use
bool m_loadTransparentObjects;
bool m_loadNonTransparentObjects;
@ -185,26 +209,26 @@ public:
/**
* Class VERTEX_VALUE_CTRL
* displays a vertex for editing. A vertex is a triplet of values
* Class S3DPOINT_VALUE_CTRL
* displays a S3DPOINT for editing (in dialogs). A S3DPOINT is a triplet of values
* Values can be scale, rotation, offset...
*/
class VERTEX_VALUE_CTRL
class S3DPOINT_VALUE_CTRL
{
private:
wxTextCtrl* m_XValueCtrl, * m_YValueCtrl, * m_ZValueCtrl;
public:
VERTEX_VALUE_CTRL( wxWindow* parent, wxBoxSizer* BoxSizer );
S3DPOINT_VALUE_CTRL( wxWindow* parent, wxBoxSizer* BoxSizer );
~VERTEX_VALUE_CTRL();
~S3DPOINT_VALUE_CTRL();
/**
* Function GetValue
* @return the vertex in internal units.
* @return the 3D point in internal units.
*/
S3D_VERTEX GetValue();
void SetValue( S3D_VERTEX vertex );
S3DPOINT GetValue();
void SetValue( S3DPOINT a3Dpoint );
void Enable( bool enbl );
void SetToolTip( const wxString& text );
};

View File

@ -156,16 +156,46 @@ void EDA_3D_FRAME::CreateMenuBar()
_( "Realistic Mode" ),
KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE,
_( "Max Quality in Realistic Mode" ),
_( "When using max quality, holes are removed from copper zones, "
"but the calculation time is longer" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
wxMenu * renderOptionsMenu = new wxMenu;
AddMenuItem( prefsMenu, renderOptionsMenu, ID_MENU3D_COLOR,
_( "Render Options" ), KiBitmap( tools_xpm ) );
AddMenuItem( renderOptionsMenu, ID_MENU3D_FL_RENDER_SHADOWS,
_( "Render Shadows" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
AddMenuItem( renderOptionsMenu, ID_MENU3D_FL_RENDER_SHOW_HOLES_IN_ZONES,
_( "Show Holes in Zones" ),
_( "Holes inside a copper layer copper zones are shown, "
"but the calculation time is longer" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
AddMenuItem( renderOptionsMenu, ID_MENU3D_FL_RENDER_TEXTURES,
_( "Render Textures" ),
_( "Apply a grid/cloud textures to Board, Solder Mask and Silkscreen" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
AddMenuItem( renderOptionsMenu, ID_MENU3D_FL_RENDER_SMOOTH,
_( "Render Smooth Normals" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
AddMenuItem( renderOptionsMenu, ID_MENU3D_FL_RENDER_MATERIAL,
_( "Render Material Properties" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
prefsMenu->AppendSeparator();
AddMenuItem( prefsMenu, ID_MENU3D_BGCOLOR_SELECTION,
_( "Choose Background Color" ), KiBitmap( palette_xpm ) );
wxMenu * backgrounColorMenu = new wxMenu;
// Add submenu Choose Colors
AddMenuItem( prefsMenu, backgrounColorMenu, ID_MENU3D_COLOR,
_( "Choose Colors" ), KiBitmap( palette_xpm ) );
AddMenuItem( backgrounColorMenu, ID_MENU3D_BGCOLOR_TOP_SELECTION,
_( "Background Top Color" ), KiBitmap( palette_xpm ) );
AddMenuItem( backgrounColorMenu, ID_MENU3D_BGCOLOR_SELECTION,
_( "Background Bottom Color" ), KiBitmap( palette_xpm ) );
AddMenuItem( prefsMenu, ID_MENU3D_AXIS_ONOFF,
_( "Show 3D &Axis" ), KiBitmap( axis3d_front_xpm ), wxITEM_CHECK );
@ -174,19 +204,19 @@ void EDA_3D_FRAME::CreateMenuBar()
wxMenu * gridlistMenu = new wxMenu;
AddMenuItem( prefsMenu, gridlistMenu, ID_MENU3D_GRID,
_( "3D Grid" ), KiBitmap( grid_xpm ) );
gridlistMenu->Append( ID_MENU3D_GRID_NOGRID, _( "No 3D Grid" ), wxEmptyString, true );
gridlistMenu->Append( ID_MENU3D_GRID_10_MM, _( "3D Grid 10 mm" ), wxEmptyString, true );
gridlistMenu->Append( ID_MENU3D_GRID_5_MM, _( "3D Grid 5 mm" ), wxEmptyString, true );
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 );
gridlistMenu->AppendCheckItem( ID_MENU3D_GRID_NOGRID, _( "No 3D Grid" ), wxEmptyString );
gridlistMenu->AppendCheckItem( ID_MENU3D_GRID_10_MM, _( "3D Grid 10 mm" ), wxEmptyString );
gridlistMenu->AppendCheckItem( ID_MENU3D_GRID_5_MM, _( "3D Grid 5 mm" ), wxEmptyString );
gridlistMenu->AppendCheckItem( ID_MENU3D_GRID_2P5_MM, _( "3D Grid 2.5 mm" ), wxEmptyString );
gridlistMenu->AppendCheckItem( ID_MENU3D_GRID_1_MM, _( "3D Grid 1 mm" ), wxEmptyString );
// If the grid is on, check the corresponding menuitem showing the grid size
if( g_Parm_3D_Visu.GetFlag( FL_GRID ) )
if( IsEnabled( FL_GRID ) )
{
gridlistMenu->Check( ID_MENU3D_GRID_10_MM, g_Parm_3D_Visu.m_3D_Grid == 10.0 );
gridlistMenu->Check( ID_MENU3D_GRID_5_MM, g_Parm_3D_Visu.m_3D_Grid == 5.0 );
gridlistMenu->Check( ID_MENU3D_GRID_2P5_MM, g_Parm_3D_Visu.m_3D_Grid == 2.5 );
gridlistMenu->Check( ID_MENU3D_GRID_1_MM, g_Parm_3D_Visu.m_3D_Grid == 1.0 );
gridlistMenu->Check( ID_MENU3D_GRID_10_MM, GetPrm3DVisu().m_3D_Grid == 10.0 );
gridlistMenu->Check( ID_MENU3D_GRID_5_MM, GetPrm3DVisu().m_3D_Grid == 5.0 );
gridlistMenu->Check( ID_MENU3D_GRID_2P5_MM, GetPrm3DVisu().m_3D_Grid == 2.5 );
gridlistMenu->Check( ID_MENU3D_GRID_1_MM, GetPrm3DVisu().m_3D_Grid == 1.0 );
}
else
gridlistMenu->Check( ID_MENU3D_GRID_NOGRID, true );
@ -194,10 +224,10 @@ void EDA_3D_FRAME::CreateMenuBar()
prefsMenu->AppendSeparator();
AddMenuItem( prefsMenu, ID_MENU3D_SHOW_BOARD_BODY,
_( "Show Board Body" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
_( "Show Board Bod&y" ), 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 );
_( "Show Copper &Thickness" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_MODULE_ONOFF,
_( "Show 3D F&ootprints" ), KiBitmap( shape_3d_xpm ), wxITEM_CHECK );
@ -207,22 +237,26 @@ void EDA_3D_FRAME::CreateMenuBar()
prefsMenu->AppendSeparator();
AddMenuItem( prefsMenu, ID_MENU3D_ADHESIVE_ONOFF,
wxMenu * layersMenu = new wxMenu;
AddMenuItem( prefsMenu, layersMenu, ID_MENU3D_LAYERS,
_( "Show &Layers" ), KiBitmap( tools_xpm ) );
AddMenuItem( layersMenu, ID_MENU3D_ADHESIVE_ONOFF,
_( "Show &Adhesive Layers" ), KiBitmap( tools_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_SILKSCREEN_ONOFF,
AddMenuItem( layersMenu, ID_MENU3D_SILKSCREEN_ONOFF,
_( "Show &Silkscreen Layer" ), KiBitmap( add_text_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_SOLDER_MASK_ONOFF,
AddMenuItem( layersMenu, ID_MENU3D_SOLDER_MASK_ONOFF,
_( "Show Solder &Mask Layers" ), KiBitmap( pads_mask_layers_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_SOLDER_PASTE_ONOFF,
AddMenuItem( layersMenu, ID_MENU3D_SOLDER_PASTE_ONOFF,
_( "Show Solder &Paste Layers" ), KiBitmap( pads_mask_layers_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_COMMENTS_ONOFF,
AddMenuItem( layersMenu, ID_MENU3D_COMMENTS_ONOFF,
_( "Show &Comments and Drawings Layer" ), KiBitmap( edit_sheet_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_ECO_ONOFF,
AddMenuItem( layersMenu, ID_MENU3D_ECO_ONOFF,
_( "Show &Eco Layers" ), KiBitmap( edit_sheet_xpm ), wxITEM_CHECK );
SetMenuBar( menuBar );
@ -239,43 +273,58 @@ 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.IsRealisticMode() );
item->Check( GetPrm3DVisu().IsRealisticMode() );
item = menuBar->FindItem( ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE );
item->Check( g_Parm_3D_Visu.HightQualityMode() );
item = menuBar->FindItem( ID_MENU3D_FL_RENDER_SHADOWS );
item->Check( GetPrm3DVisu().GetFlag( FL_RENDER_SHADOWS ) );
item = menuBar->FindItem( ID_MENU3D_FL_RENDER_SHADOWS );
item->Check( GetPrm3DVisu().GetFlag( FL_RENDER_SHADOWS ) );
item = menuBar->FindItem( ID_MENU3D_FL_RENDER_SHOW_HOLES_IN_ZONES );
item->Check( GetPrm3DVisu().GetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES ) );
item = menuBar->FindItem( ID_MENU3D_FL_RENDER_TEXTURES );
item->Check( GetPrm3DVisu().GetFlag( FL_RENDER_TEXTURES ) );
item = menuBar->FindItem( ID_MENU3D_FL_RENDER_SMOOTH );
item->Check( GetPrm3DVisu().GetFlag( FL_RENDER_SMOOTH ) );
item = menuBar->FindItem( ID_MENU3D_FL_RENDER_MATERIAL );
item->Check( GetPrm3DVisu().GetFlag( FL_RENDER_MATERIAL ) );
item = menuBar->FindItem( ID_MENU3D_SHOW_BOARD_BODY );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SHOW_BOARD_BODY ) );
item->Check( GetPrm3DVisu().GetFlag( FL_SHOW_BOARD_BODY ) );
item = menuBar->FindItem( ID_MENU3D_USE_COPPER_THICKNESS );
item->Check( g_Parm_3D_Visu.GetFlag( FL_USE_COPPER_THICKNESS ) );
item->Check( GetPrm3DVisu().GetFlag( FL_USE_COPPER_THICKNESS ) );
item = menuBar->FindItem( ID_MENU3D_MODULE_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_MODULE ) );
item->Check( GetPrm3DVisu().GetFlag( FL_MODULE ) );
item = menuBar->FindItem( ID_MENU3D_ZONE_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_ZONE ) );
item->Check( GetPrm3DVisu().GetFlag( FL_ZONE ) );
item = menuBar->FindItem( ID_MENU3D_AXIS_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_AXIS ) );
item->Check( GetPrm3DVisu().GetFlag( FL_AXIS ) );
item = menuBar->FindItem( ID_MENU3D_ADHESIVE_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_ADHESIVE ) );
item->Check( GetPrm3DVisu().GetFlag( FL_ADHESIVE ) );
item = menuBar->FindItem( ID_MENU3D_SILKSCREEN_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SILKSCREEN ) );
item->Check( GetPrm3DVisu().GetFlag( FL_SILKSCREEN ) );
item = menuBar->FindItem( ID_MENU3D_SOLDER_MASK_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SOLDERMASK ) );
item->Check( GetPrm3DVisu().GetFlag( FL_SOLDERMASK ) );
item = menuBar->FindItem( ID_MENU3D_SOLDER_PASTE_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SOLDERPASTE ) );
item->Check( GetPrm3DVisu().GetFlag( FL_SOLDERPASTE ) );
item = menuBar->FindItem( ID_MENU3D_COMMENTS_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_COMMENTS ) );
item->Check( GetPrm3DVisu().GetFlag( FL_COMMENTS ) );
item = menuBar->FindItem( ID_MENU3D_ECO_ONOFF );
item->Check( g_Parm_3D_Visu.GetFlag( FL_ECO ));
item->Check( GetPrm3DVisu().GetFlag( FL_ECO ));
}
void EDA_3D_FRAME::SetToolbars()

View File

@ -38,14 +38,20 @@
#include <wx/glcanvas.h>
#include <3d_struct.h>
#include <info3d_visu.h>
#define KISYS3DMOD "KISYS3DMOD"
/// A variable name whose value holds the path of 3D shape files.
/// Currently an environment variable, eventually a project variable.
#define KISYS3DMOD wxT( "KISYS3DMOD" )
/// All 3D files are expected to be stored in LIB3D_FOLDER, or one of
/// its subdirectory.
#define LIB3D_FOLDER wxT( "packages3d" )
class EDA_3D_CANVAS;
class PCB_BASE_FRAME;
#define KICAD_DEFAULT_3D_DRAWFRAME_STYLE (wxDEFAULT_FRAME_STYLE | wxWANTS_CHARS)
#define LIB3D_PATH wxT( "packages3d" )
class EDA_3D_FRAME : public KIWAY_PLAYER
@ -97,9 +103,21 @@ public:
/// Toggles orthographic projection on and off
void ToggleOrtho(){ m_ortho = !m_ortho ; Refresh(true);};
/// Returns the orthographic projection flag
/// @return the orthographic projection flag
bool ModeIsOrtho() { return m_ortho ;};
/** @return the INFO3D_VISU which contains the current parameters
* to draw the 3D view og the board
*/
INFO3D_VISU& GetPrm3DVisu() const;
/**
* @return true if aItem must be displayed
* @param aItem = an item of DISPLAY3D_FLG enum
*/
bool IsEnabled( DISPLAY3D_FLG aItem ) const;
private:
// Event handlers:
void Exit3DFrame( wxCommandEvent& event );
@ -127,7 +145,10 @@ private:
double BestZoom();
void RedrawActiveWindow( wxDC* DC, bool EraseBg );
void Set3DBgColor();
// Get a S3D_COLOR from a wx colour dialog
// return true if a new color is chosen, false if
// no change or aborted by user
bool Get3DColorFromUser( S3D_COLOR &color );
DECLARE_EVENT_TABLE()
};

View File

@ -8,13 +8,15 @@
* Please add IDs that are unique to the 3D viewer here and not in the global
* id.h file. This will prevent the entire project from being rebuilt when
* adding new commands to the 3D viewer.
* However the number of IDs should be < ROOM_FOR_3D_VIEWER, defined in id.h
* Please change the value of ROOM_FOR_3D_VIEWER if too small.
*/
#include <id.h> // Generic Id.
#include <id.h> // Generic Id.
enum id_3dview_frm
{
ID_START_COMMAND_3D = ID_END_LIST,
ID_START_COMMAND_3D = ID_KICAD_3D_VIEWER_START,
ID_ROTATE3D_X_NEG,
ID_ROTATE3D_X_POS,
ID_ROTATE3D_Y_NEG,
@ -28,11 +30,14 @@ enum id_3dview_frm
ID_MOVE3D_UP,
ID_MOVE3D_DOWN,
ID_ORTHO,
ID_MENU3D_COLOR,
ID_MENU3D_BGCOLOR_SELECTION,
ID_MENU3D_BGCOLOR_TOP_SELECTION,
ID_MENU3D_USE_COPPER_THICKNESS,
ID_MENU3D_AXIS_ONOFF,
ID_MENU3D_MODULE_ONOFF,
ID_MENU3D_ZONE_ONOFF,
ID_MENU3D_LAYERS,
ID_MENU3D_ADHESIVE_ONOFF,
ID_MENU3D_SILKSCREEN_ONOFF,
ID_MENU3D_SOLDER_PASTE_ONOFF,
@ -41,7 +46,11 @@ enum id_3dview_frm
ID_MENU3D_ECO_ONOFF,
ID_MENU3D_SHOW_BOARD_BODY,
ID_MENU3D_REALISTIC_MODE,
ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE,
ID_MENU3D_FL_RENDER_SHADOWS,
ID_MENU3D_FL_RENDER_SHOW_HOLES_IN_ZONES,
ID_MENU3D_FL_RENDER_TEXTURES,
ID_MENU3D_FL_RENDER_SMOOTH,
ID_MENU3D_FL_RENDER_MATERIAL,
ID_END_COMMAND_3D,
ID_TOOL_SET_VISIBLE_ITEMS,

View File

@ -17,6 +17,7 @@ set(3D-VIEWER_SRCS
3d_class.cpp
3d_draw.cpp
3d_draw_basic_functions.cpp
3d_draw_helper_functions.cpp
3d_frame.cpp
3d_material.cpp
3d_mesh_model.cpp

View File

@ -1,8 +1,8 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -65,14 +65,42 @@ INFO3D_VISU::INFO3D_VISU()
m_copperThickness = 0;
m_epoxyThickness = 0;
m_nonCopperLayerThickness = 0;
m_BiuTo3Dunits = 1.0;
// Set copper color, in realistic mode
#define LUMINANCE 0.7/255.0
m_CopperColor.m_Red = 255.0*LUMINANCE;
m_CopperColor.m_Green = 223.0*LUMINANCE;
m_CopperColor.m_Blue = 0.0*LUMINANCE;
// Set the solder mask color, in realistic mode
#undef LUMINANCE
#define LUMINANCE 0.2/255.0
m_SolderMaskColor.m_Red = 100.0*LUMINANCE;
m_SolderMaskColor.m_Green = 255.0*LUMINANCE;
m_SolderMaskColor.m_Blue = 180.0*LUMINANCE;
// Set the silk screen mask color, in realistic mode
#undef LUMINANCE
#define LUMINANCE 0.9
m_SilkScreenColor.m_Red = 1.0*LUMINANCE;
m_SilkScreenColor.m_Green = 1.0*LUMINANCE;
m_SilkScreenColor.m_Blue = 1.0*LUMINANCE;
// Set the body board (FR4) color, in realistic mode
#undef LUMINANCE
#define LUMINANCE 0.2/255.0
m_BoardBodyColor.m_Red = 255.0*LUMINANCE;
m_BoardBodyColor.m_Green = 218.0*LUMINANCE;
m_BoardBodyColor.m_Blue = 110.0*LUMINANCE;
// default all special item layers Visible
for( ii = 0; ii < FL_LAST; ii++ )
m_drawFlags[ii] = true;
m_drawFlags.set();
SetFlag( FL_GRID, false );
SetFlag( FL_USE_COPPER_THICKNESS, false );
SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, false );
SetFlag( FL_RENDER_SHADOWS, false );
SetFlag( FL_RENDER_SHOW_HOLES_IN_ZONES, false );
}
@ -85,14 +113,17 @@ INFO3D_VISU::~INFO3D_VISU()
*/
void INFO3D_VISU::InitSettings( BOARD* aBoard )
{
// Calculates the board bounding box
// First, use only the board outlines
EDA_RECT bbbox = aBoard->ComputeBoundingBox( true );
// If no outlines, use the board with items
if( bbbox.GetWidth() == 0 && bbbox.GetHeight() == 0 )
{
bbbox.SetWidth( Millimeter2iu( 100 ) );
bbbox.SetHeight( Millimeter2iu( 100 ) );
}
bbbox = aBoard->ComputeBoundingBox( false );
// Gives a non null size to avoid issues in zoom / scale calculations
if( bbbox.GetWidth() == 0 && bbbox.GetHeight() == 0 )
bbbox.Inflate( Millimeter2iu( 10 ) );
m_BoardSettings = &aBoard->GetDesignSettings();
@ -199,9 +230,10 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
*/
double INFO3D_VISU::GetModulesZcoord3DIU( bool aIsFlipped )
{
// NOTE: Z position to display modules in top of Paste and near the shadow
if( aIsFlipped )
return m_layerZcoord[B_Paste] - ( m_copperThickness / 2 ); //B_Cu NOTE: in order to display modules in top of Paste and near the shadow
return m_layerZcoord[B_Paste] - ( m_copperThickness / 2 );
else
return m_layerZcoord[F_Paste] + ( m_copperThickness / 2 ); //F_Cu
return m_layerZcoord[F_Paste] + ( m_copperThickness / 2 );
}

View File

@ -52,7 +52,9 @@
class BOARD_DESIGN_SETTINGS;
class S3D_COLOR /* 3D color (R, G, B) 3 floats range 0 to 1.0*/
/** Minor class to store a 3D color (R, G, B) 3 floats range 0 to 1.0
*/
class S3D_COLOR
{
public:
double m_Red, m_Green, m_Blue;
@ -62,7 +64,6 @@ public: S3D_COLOR()
}
};
/* information needed to display 3D board */
enum DISPLAY3D_FLG {
FL_AXIS=0, FL_MODULE, FL_ZONE,
FL_ADHESIVE, FL_SILKSCREEN, FL_SOLDERMASK, FL_SOLDERPASTE,
@ -71,10 +72,16 @@ enum DISPLAY3D_FLG {
FL_USE_COPPER_THICKNESS,
FL_SHOW_BOARD_BODY,
FL_USE_REALISTIC_MODE,
FL_USE_MAXQUALITY_IN_REALISTIC_MODE,
FL_RENDER_SHADOWS,
FL_RENDER_SHOW_HOLES_IN_ZONES,
FL_RENDER_TEXTURES,
FL_RENDER_SMOOTH,
FL_RENDER_MATERIAL,
FL_LAST
};
/** Helper class to handle information needed to display 3D board
*/
class INFO3D_VISU
{
public:
@ -84,6 +91,11 @@ public:
double m_Zoom; // 3D zoom value
double m_3D_Grid; // 3D grid value, in mm
S3D_COLOR m_BgColor;
S3D_COLOR m_BgColor_Top;
S3D_COLOR m_BoardBodyColor; // in realistic mode: FR4 board color
S3D_COLOR m_SolderMaskColor; // in realistic mode: solder mask color
S3D_COLOR m_SilkScreenColor; // in realistic mode: SilkScreen color
S3D_COLOR m_CopperColor; // in realistic mode: copper color
wxPoint m_BoardPos; // center board actual position in board units
wxSize m_BoardSize; // board actual size in board units
int m_CopperLayersCount; // Number of copper layers actually used by the board
@ -92,38 +104,34 @@ public:
double m_BiuTo3Dunits; // Normalization scale to convert board
// internal units to 3D units
// to scale 3D units between -1.0 and +1.0
double m_CurrentZpos; // temporary storage of current value of Z position,
// used in some calculation
// to normalize 3D units between -1.0 and +1.0
double zpos_offset;
private:
double m_layerZcoord[LAYER_ID_COUNT]; // Z position of each layer (normalized)
double m_copperThickness; // Copper thickness (normalized)
double m_epoxyThickness; // Epoxy thickness (normalized)
double m_nonCopperLayerThickness; // Non copper layers thickness
bool m_drawFlags[FL_LAST]; // Enable/disable flags (see DISPLAY3D_FLG list)
std::bitset<FL_LAST> m_drawFlags; // Enable/disable flags (see DISPLAY3D_FLG list)
public: INFO3D_VISU();
~INFO3D_VISU();
// Accessors
bool GetFlag( DISPLAY3D_FLG aFlag ) const { return m_drawFlags[aFlag]; }
bool SetFlag( DISPLAY3D_FLG aFlag, bool aState )
void SetFlag( DISPLAY3D_FLG aFlag, bool aState )
{
return m_drawFlags[aFlag] = aState;
m_drawFlags[aFlag] = aState;
}
/**
* Function InitSettings
* Initialize info 3D Parameters from aBoard
* Initialize 3D Parameters depending on aBoard
* @param aBoard: the board to display
*/
void InitSettings( BOARD* aBoard );
/**
* function GetModulesZcoord3DIU
* @return the Z position of 3D shapes, in 3D Units
* @param aIsFlipped: true for modules on Front (top) layer, false
* if on back (bottom) layer
@ -131,7 +139,6 @@ public: INFO3D_VISU();
double GetModulesZcoord3DIU( bool aIsFlipped );
/**
* function GetLayerZcoordBIU
* @return the Z coordinate of the layer aLayer, in Board Internal Units
* @param aLayerId: the layer number
*/
@ -141,7 +148,6 @@ public: INFO3D_VISU();
}
/**
* function GetCopperThicknessBIU
* @return the thickness (Z size) of the copper, in Board Internal Units
* 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)
@ -200,7 +206,6 @@ public: INFO3D_VISU();
}
bool IsRealisticMode() { return GetFlag( FL_USE_REALISTIC_MODE ); }
bool HightQualityMode() { return GetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE ); }
};
extern INFO3D_VISU g_Parm_3D_Visu;

View File

@ -66,12 +66,15 @@ public:
* @param aExtension is file extension of the file you are going to parse.
*/
static S3D_MODEL_PARSER* Create( S3D_MASTER* aMaster, const wxString aExtension );
/**
* Function Load
*
* pure virtual Function
* Concrete parsers should implement this function
* @param aFilename = the full file name of the file to load
* @param aVrmlunits_to_3Dunits = the scaling factor, i.e. the
* convertion from file unit to internal 3D units
*/
virtual void Load( const wxString aFilename ) = 0;
virtual void Load( const wxString& aFilename, double aVrmlunits_to_3Dunits ) = 0;
private:
S3D_MASTER* master;
@ -89,7 +92,8 @@ class X3D_MODEL_PARSER: public S3D_MODEL_PARSER
public:
X3D_MODEL_PARSER( S3D_MASTER* aMaster );
~X3D_MODEL_PARSER();
void Load( const wxString aFilename );
void Load( const wxString& aFilename, double aVrmlunits_to_3Dunits );
typedef std::map< wxString, wxString > PROPERTY_MAP;
typedef std::vector< wxXmlNode* > NODE_LIST;
@ -148,7 +152,8 @@ class VRML2_MODEL_PARSER: public S3D_MODEL_PARSER
public:
VRML2_MODEL_PARSER( S3D_MASTER* aMaster );
~VRML2_MODEL_PARSER();
void Load( const wxString aFilename );
void Load( const wxString& aFilename, double aVrmlunits_to_3Dunits );
/**
* Return string representing VRML2 file in vrml2 format
@ -191,7 +196,8 @@ class VRML1_MODEL_PARSER: public S3D_MODEL_PARSER
public:
VRML1_MODEL_PARSER( S3D_MASTER* aMaster );
~VRML1_MODEL_PARSER();
void Load( const wxString aFilename );
void Load( const wxString& aFilename, double aVrmlunits_to_3Dunits );
/**
* Return string representing VRML2 file in vrml2 format
@ -236,7 +242,8 @@ class VRML_MODEL_PARSER: public S3D_MODEL_PARSER
public:
VRML_MODEL_PARSER( S3D_MASTER* aMaster );
~VRML_MODEL_PARSER();
void Load( const wxString aFilename );
void Load( const wxString& aFilename, double aVrmlunits_to_3Dunits );
private:
VRML1_MODEL_PARSER *vrml1_parser;

View File

@ -1,922 +0,0 @@
/* GIMP RGBA C-Source image dump (text_pcb.c) */
static const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char pixel_data[64 * 64 * 4 + 1];
} text_pcb = {
64, 64, 4,
"\357\357\357\377\357\357\357\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\366\366\366\377\366\366\366\377\370\370\370\377\370\370\370\377"
"\363\363\363\377\363\363\363\377\357\357\357\377\360\360\360\377\354\354"
"\354\377\354\354\354\377\351\351\351\377\351\351\351\377\357\357\357\377"
"\357\357\357\377\363\363\363\377\357\357\357\377\366\366\366\377\366\366"
"\366\377\366\366\366\377\366\366\366\377\362\362\362\377\363\363\363\377"
"\355\355\355\377\346\346\346\377\340\340\340\377\335\335\335\377\331\331"
"\331\377\331\331\331\377\335\335\335\377\335\335\335\377\343\343\343\377"
"\351\351\351\377\355\355\355\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\360\360\360\377\360\360\360\377\354\354\354\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\352\352\352\377"
"\352\352\352\377\357\357\357\377\355\355\355\377\360\360\360\377\360\360"
"\360\377\355\355\355\377\355\355\355\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\355\355\355\377\357\357\357\377\355\355\355\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\357\357\357\377\357\357"
"\357\377\354\354\354\377\346\346\346\377\346\346\346\377\351\351\351\377"
"\357\357\357\377\360\360\360\377\363\363\363\377\360\360\360\377\366\366"
"\366\377\366\366\366\377\366\366\366\377\366\366\366\377\363\363\363\377"
"\363\363\363\377\355\355\355\377\346\346\346\377\343\343\343\377\335\335"
"\335\377\331\331\331\377\331\331\331\377\335\335\335\377\340\340\340\377"
"\343\343\343\377\351\351\351\377\355\355\355\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\360\360\360\377\360\360\360\377\354\354\354\377\351\351"
"\351\377\343\343\343\377\343\343\343\377\344\344\344\377\344\344\344\377"
"\352\352\352\377\352\352\352\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\360\360\360\377\355\355\355\377\357\357\357\377"
"\357\357\357\377\354\354\354\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\362\362\362\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\357\357"
"\357\377\357\357\357\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\355\355\355\377\355\355\355\377\363\363\363\377\363\363"
"\363\377\366\366\366\377\366\366\366\377\366\366\366\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\355\355\355\377\343\343\343\377\340\340"
"\340\377\335\335\335\377\331\331\331\377\331\331\331\377\335\335\335\377"
"\340\340\340\377\346\346\346\377\351\351\351\377\355\355\355\377\357\357"
"\357\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377\354\354"
"\354\377\354\354\354\377\351\351\351\377\343\343\343\377\344\344\344\377"
"\344\344\344\377\352\352\352\377\352\352\352\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\354\354\354\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\354\354\354\377\355\355\355\377\354\354\354\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\355\355\355\377\355\355\355\377\363\363"
"\363\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\366\366\366\377\363\363\363\377\363\363\363\377\355\355\355\377\346\346"
"\346\377\340\340\340\377\335\335\335\377\331\331\331\377\331\331\331\377"
"\335\335\335\377\340\340\340\377\346\346\346\377\351\351\351\377\355\355"
"\355\377\360\360\360\377\362\362\362\377\362\362\362\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\354\354\354\377\355\355\355\377\351\351\351\377\343\343\343\377"
"\344\344\344\377\344\344\344\377\352\352\352\377\352\352\352\377\357\357"
"\357\377\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\352\352\352\377\351\351\351\377\354\354\354\377\354\354"
"\354\377\354\354\354\377\354\354\354\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\363\363"
"\363\377\363\363\363\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\357\357\357\377\357\357"
"\357\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\366\366\366\377\363\363\363\377\355\355\355\377\351\351"
"\351\377\346\346\346\377\340\340\340\377\335\335\335\377\332\332\332\377"
"\332\332\332\377\335\335\335\377\335\335\335\377\343\343\343\377\352\352"
"\352\377\355\355\355\377\360\360\360\377\365\365\365\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\362\362"
"\362\377\362\362\362\377\355\355\355\377\357\357\357\377\352\352\352\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\352\352\352\377\352\352"
"\352\377\357\357\357\377\355\355\355\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\355\355\355\377\351\351\351\377\354\354"
"\354\377\354\354\354\377\357\357\357\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\355\355\355\377\355\355\355\377"
"\351\351\351\377\343\343\343\377\343\343\343\377\352\352\352\377\357\357"
"\357\377\357\357\357\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\363\363\363\377\355\355"
"\355\377\352\352\352\377\346\346\346\377\342\342\342\377\337\337\337\377"
"\332\332\332\377\327\327\327\377\335\335\335\377\337\337\337\377\343\343"
"\343\377\352\352\352\377\355\355\355\377\360\360\360\377\365\365\365\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363"
"\363\377\362\362\362\377\362\362\362\377\355\355\355\377\357\357\357\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\344\344\344\377\352\352"
"\352\377\352\352\352\377\357\357\357\377\357\357\357\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\357\357\357\377\357\357"
"\357\377\362\362\362\377\354\354\354\377\357\357\357\377\357\357\357\377"
"\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\355\355\355\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\352\352\352\377\355\355\355\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\365\365\365\377\360\360"
"\360\377\355\355\355\377\352\352\352\377\347\347\347\377\342\342\342\377"
"\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377\337\337"
"\337\377\344\344\344\377\346\346\346\377\352\352\352\377\360\360\360\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377\365\365"
"\365\377\363\363\363\377\362\362\362\377\362\362\362\377\355\355\355\377"
"\357\357\357\377\352\352\352\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\352\352\352\377\352\352\352\377\357\357\357\377\357\357\357\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\357\357"
"\357\377\357\357\357\377\362\362\362\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\355\355\355\377\352\352\352\377\344\344\344\377\344\344\344\377\337\337"
"\337\377\344\344\344\377\352\352\352\377\355\355\355\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\360\360\360\377\360\360\360\377\354\354\354\377\347\347\347\377"
"\342\342\342\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335"
"\335\377\337\337\337\377\344\344\344\377\347\347\347\377\352\352\352\377"
"\360\360\360\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363"
"\363\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\355\355\355\377\355\355\355\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\352\352\352\377\352\352\352\377\357\357\357\377"
"\357\357\357\377\352\352\352\377\352\352\352\377\355\355\355\377\355\355"
"\355\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\357\357\357\377\352\352\352\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\337\337\337\377\337\337\337\377\344\344\344\377\352\352\352\377"
"\357\357\357\377\362\362\362\377\365\365\365\377\365\365\365\377\363\363"
"\363\377\363\363\363\377\360\360\360\377\352\352\352\377\347\347\347\377"
"\344\344\344\377\337\337\337\377\335\335\335\377\331\331\331\377\331\331"
"\331\377\335\335\335\377\337\337\337\377\344\344\344\377\347\347\347\377"
"\354\354\354\377\360\360\360\377\363\363\363\377\363\363\363\377\365\365"
"\365\377\365\365\365\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\355\355\355\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\352\352\352\377\352\352\352\377"
"\357\357\357\377\357\357\357\377\352\352\352\377\352\352\352\377\355\355"
"\355\377\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\354\354"
"\354\377\354\354\354\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344"
"\344\377\342\342\342\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\354\354\354\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\352\352\352\377"
"\347\347\347\377\344\344\344\377\342\342\342\377\337\337\337\377\331\331"
"\331\377\331\331\331\377\337\337\337\377\342\342\342\377\344\344\344\377"
"\347\347\347\377\354\354\354\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\347\347\347\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\362\362\362\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\357\357\357\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344"
"\344\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\347\347\347\377\354\354\354\377\355\355\355\377\360\360\360\377\363\363"
"\363\377\363\363\363\377\360\360\360\377\360\360\360\377\352\352\352\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\342\342\342\377\337\337"
"\337\377\331\331\331\377\331\331\331\377\337\337\337\377\342\342\342\377"
"\347\347\347\377\344\344\344\377\352\352\352\377\352\352\352\377\355\355"
"\355\377\360\360\360\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\355\355\355\377\352\352\352\377\347\347\347\377\344\344"
"\344\377\347\347\347\377\347\347\347\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\354\354\354\377\355\355\355\377\354\354\354\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\344\344"
"\344\377\344\344\344\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\343\343\343\377\343\343\343\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\360\360\360\377\355\355\355\377"
"\354\354\354\377\352\352\352\377\344\344\344\377\347\347\347\377\342\342"
"\342\377\334\334\334\377\331\331\331\377\331\331\331\377\334\334\334\377"
"\342\342\342\377\347\347\347\377\344\344\344\377\352\352\352\377\354\354"
"\354\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\344\344\344\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\346\346\346\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\354\354\354\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\351\351\351\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\347\347"
"\347\377\344\344\344\377\344\344\344\377\342\342\342\377\342\342\342\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377\346\346"
"\346\377\351\351\351\377\351\351\351\377\352\352\352\377\352\352\352\377"
"\354\354\354\377\352\352\352\377\347\347\347\377\344\344\344\377\342\342"
"\342\377\334\334\334\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\331\331\331\377\334\334\334\377\342\342\342\377\344\344\344\377\347\347"
"\347\377\352\352\352\377\354\354\354\377\352\352\352\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\346\346\346\377\346\346\346\377\351\351"
"\351\377\351\351\351\377\347\347\347\377\347\347\347\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\347\347"
"\347\377\344\344\344\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\340\340\340\377\340\340"
"\340\377\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377"
"\346\346\346\377\347\347\347\377\347\347\347\377\351\351\351\377\344\344"
"\344\377\342\342\342\377\334\334\334\377\331\331\331\377\325\325\325\377"
"\325\325\325\377\331\331\331\377\334\334\334\377\342\342\342\377\344\344"
"\344\377\351\351\351\377\347\347\347\377\347\347\347\377\346\346\346\377"
"\346\346\346\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\342\342\342\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\335\335\335\377\340\340"
"\340\377\340\340\340\377\340\340\340\377\343\343\343\377\351\351\351\377"
"\346\346\346\377\346\346\346\377\352\352\352\377\347\347\347\377\347\347"
"\347\377\342\342\342\377\337\337\337\377\331\331\331\377\334\334\334\377"
"\326\326\326\377\326\326\326\377\334\334\334\377\331\331\331\377\337\337"
"\337\377\342\342\342\377\347\347\347\377\347\347\347\377\352\352\352\377"
"\346\346\346\377\346\346\346\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\340\340\340\377\343\343"
"\343\377\343\343\343\377\351\351\351\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\346\346\346\377\343\343\343\377"
"\343\343\343\377\340\340\340\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\340\340\340\377\340\340\340\377\340\340\340\377\346\346\346\377"
"\351\351\351\377\346\346\346\377\352\352\352\377\352\352\352\377\347\347"
"\347\377\347\347\347\377\342\342\342\377\337\337\337\377\334\334\334\377"
"\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377\334\334"
"\334\377\337\337\337\377\342\342\342\377\347\347\347\377\344\344\344\377"
"\352\352\352\377\351\351\351\377\346\346\346\377\346\346\346\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\335\335\335\377\335\335\335\377\340\340"
"\340\377\343\343\343\377\343\343\343\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\347\347\347\377\346\346\346\377"
"\343\343\343\377\343\343\343\377\340\340\340\377\340\340\340\377\335\335"
"\335\377\335\335\335\377\340\340\340\377\340\340\340\377\343\343\343\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\347\347\347\377\352\352"
"\352\377\347\347\347\377\347\347\347\377\342\342\342\377\337\337\337\377"
"\334\334\334\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335"
"\335\377\334\334\334\377\337\337\337\377\342\342\342\377\347\347\347\377"
"\347\347\347\377\352\352\352\377\346\346\346\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340"
"\340\377\340\340\340\377\343\343\343\377\343\343\343\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\347\347\347\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354\354\377"
"\351\351\351\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377"
"\346\346\346\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354"
"\354\377\352\352\352\377\347\347\347\377\347\347\347\377\342\342\342\377"
"\340\340\340\377\334\334\334\377\335\335\335\377\327\327\327\377\327\327"
"\327\377\335\335\335\377\335\335\335\377\340\340\340\377\342\342\342\377"
"\347\347\347\377\347\347\347\377\352\352\352\377\354\354\354\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\351\351\351\377\351\351\351\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343"
"\343\377\340\340\340\377\343\343\343\377\346\346\346\377\351\351\351\377"
"\351\351\351\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352\352\377"
"\354\354\354\377\351\351\351\377\351\351\351\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\351\351\351\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354"
"\354\377\354\354\354\377\354\354\354\377\351\351\351\377\351\351\351\377"
"\344\344\344\377\340\340\340\377\335\335\335\377\335\335\335\377\327\327"
"\327\377\327\327\327\377\335\335\335\377\335\335\335\377\340\340\340\377"
"\344\344\344\377\351\351\351\377\351\351\351\377\352\352\352\377\354\354"
"\354\377\354\354\354\377\352\352\352\377\352\352\352\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\340\340\340\377\343\343\343\377\351\351\351\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\357\357\357\377\357\357\357\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\357\357\357\377\360\360\360\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\346\346\346\377\346\346\346\377\343\343\343\377"
"\351\351\351\377\355\355\355\377\360\360\360\377\360\360\360\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\357\357\357\377\354\354\354\377"
"\351\351\351\377\346\346\346\377\343\343\343\377\335\335\335\377\335\335"
"\335\377\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377"
"\343\343\343\377\346\346\346\377\351\351\351\377\354\354\354\377\357\357"
"\357\377\362\362\362\377\362\362\362\377\362\362\362\377\360\360\360\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\351\351\351\377\355\355\355\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\362\362\362\377\363\363\363\377\360\360\360\377\355\355"
"\355\377\351\351\351\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\351\351\351\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\363\363\363\377"
"\357\357\357\377\351\351\351\377\346\346\346\377\343\343\343\377\335\335"
"\335\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377"
"\335\335\335\377\343\343\343\377\346\346\346\377\351\351\351\377\357\357"
"\357\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\360\360\360\377\360\360\360\377\355\355\355\377\355\355\355\377\351\351"
"\351\377\351\351\351\377\343\343\343\377\343\343\343\377\346\346\346\377"
"\351\351\351\377\355\355\355\377\360\360\360\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\355\355\355\377\351\351\351\377\351\351\351\377\346\346\346\377"
"\346\346\346\377\351\351\351\377\351\351\351\377\360\360\360\377\363\363"
"\363\377\363\363\363\377\365\365\365\377\365\365\365\377\363\363\363\377"
"\363\363\363\377\357\357\357\377\354\354\354\377\347\347\347\377\343\343"
"\343\377\335\335\335\377\335\335\335\377\327\327\327\377\327\327\327\377"
"\335\335\335\377\335\335\335\377\343\343\343\377\347\347\347\377\351\351"
"\351\377\357\357\357\377\363\363\363\377\363\363\363\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\363\363\363\377\360\360\360\377\355\355"
"\355\377\351\351\351\377\351\351\351\377\351\351\351\377\346\346\346\377"
"\351\351\351\377\351\351\351\377\355\355\355\377\360\360\360\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\360\360\360\377\360\360"
"\360\377\363\363\363\377\363\363\363\377\365\365\365\377\365\365\365\377"
"\363\363\363\377\363\363\363\377\357\357\357\377\355\355\355\377\347\347"
"\347\377\343\343\343\377\335\335\335\377\335\335\335\377\327\327\327\377"
"\327\327\327\377\335\335\335\377\335\335\335\377\343\343\343\377\347\347"
"\347\377\351\351\351\377\357\357\357\377\363\363\363\377\363\363\363\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377\363\363"
"\363\377\360\360\360\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\355\355\355\377\360\360"
"\360\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\363\363\363\377\363\363\363\377\355\355\355\377\355\355\355\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\352\352\352\377\360\360"
"\360\377\360\360\360\377\363\363\363\377\365\365\365\377\365\365\365\377"
"\370\370\370\377\363\363\363\377\363\363\363\377\360\360\360\377\355\355"
"\355\377\347\347\347\377\343\343\343\377\335\335\335\377\335\335\335\377"
"\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377\343\343"
"\343\377\347\347\347\377\354\354\354\377\357\357\357\377\363\363\363\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377\363\363"
"\363\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\351\351\351\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\360\360\360\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\363\363\363\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\365\365\365\377\363\363\363\377\363\363\363\377\355\355\355\377"
"\355\355\355\377\351\351\351\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\360\360\360\377\360\360\360\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\370\370\370\377\363\363\363\377\357\357\357\377\352\352"
"\352\377\355\355\355\377\347\347\347\377\343\343\343\377\335\335\335\377"
"\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377\335\335"
"\335\377\343\343\343\377\347\347\347\377\355\355\355\377\354\354\354\377"
"\357\357\357\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\351\351"
"\351\377\351\351\351\377\355\355\355\377\363\363\363\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\355\355\355\377\355\355\355\377\352\352\352\377\351\351\351\377\351\351"
"\351\377\352\352\352\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\357\357"
"\357\377\355\355\355\377\355\355\355\377\347\347\347\377\343\343\343\377"
"\335\335\335\377\337\337\337\377\331\331\331\377\331\331\331\377\337\337"
"\337\377\335\335\335\377\343\343\343\377\347\347\347\377\355\355\355\377"
"\352\352\352\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354"
"\354\377\354\354\354\377\362\362\362\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\351\351\351\377\346\346\346\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\351\351\351\377\355\355\355\377\355\355\355\377"
"\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\360\360\360\377\352\352\352\377\351\351\351\377\351\351"
"\351\377\352\352\352\377\354\354\354\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\355\355\355\377\355\355\355\377\352\352\352\377\346\346\346\377"
"\335\335\335\377\332\332\332\377\331\331\331\377\331\331\331\377\331\331"
"\331\377\337\337\337\377\335\335\335\377\343\343\343\377\346\346\346\377"
"\352\352\352\377\352\352\352\377\354\354\354\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\351\351\351\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\346\346\346\377\351\351\351\377\354\354\354\377"
"\352\352\352\377\360\360\360\377\360\360\360\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\352\352\352\377\352\352\352\377\352\352\352\377\347\347"
"\347\377\344\344\344\377\344\344\344\377\347\347\347\377\347\347\347\377"
"\347\347\347\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\352\352\352\377\352\352\352\377\347\347\347\377"
"\343\343\343\377\335\335\335\377\327\327\327\377\331\331\331\377\331\331"
"\331\377\331\331\331\377\337\337\337\377\335\335\335\377\343\343\343\377"
"\346\346\346\377\352\352\352\377\351\351\351\377\347\347\347\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\351\351\351\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\344\344\344\377\344\344"
"\344\377\342\342\342\377\342\342\342\377\344\344\344\377\344\344\344\377"
"\347\347\347\377\347\347\347\377\354\354\354\377\352\352\352\377\352\352"
"\352\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\346\346\346\377\346\346\346\377\346\346\346\377\347\347"
"\347\377\347\347\347\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\351\351\351\377\346\346\346\377\346\346\346\377"
"\343\343\343\377\340\340\340\377\335\335\335\377\327\327\327\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\334\334\334\377\335\335\335\377"
"\335\335\335\377\340\340\340\377\346\346\346\377\351\351\351\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\347\347\347\377\347\347"
"\347\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\342\342\342\377\342\342\342\377\342\342"
"\342\377\342\342\342\377\342\342\342\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342"
"\342\377\342\342\342\377\342\342\342\377\346\346\346\377\340\340\340\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\335\335\335\377\327\327"
"\327\377\331\331\331\377\337\337\337\377\337\337\337\377\331\331\331\377"
"\327\327\327\377\335\335\335\377\340\340\340\377\346\346\346\377\343\343"
"\343\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\335\335\335\377\332\332\332\377\332\332\332\377\335\335\335\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\342\342"
"\342\377\342\342\342\377\342\342\342\377\340\340\340\377\340\340\340\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\334\334\334\377\334\334"
"\334\377\334\334\334\377\334\334\334\377\335\335\335\377\335\335\335\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\342\342\342\377\342\342\342\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\340\340\340\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\327\327\327\377\331\331\331\377\337\337\337\377\335\335\335\377"
"\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377\343\343"
"\343\377\337\337\337\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\337\337\337\377\337\337\337\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\335\335\335\377"
"\335\335\335\377\334\334\334\377\334\334\334\377\334\334\334\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\331\331\331\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\332\332\332\377\334\334\334\377\334\334\334\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\335\335\335\377\335\335\335\377\327\327\327\377\327\327\327\377\327\327"
"\327\377\327\327\327\377\327\327\327\377\327\327\327\377\327\327\327\377"
"\327\327\327\377\332\332\332\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\340\340\340\377\334\334\334\377\334\334\334\377\334\334\334\377"
"\334\334\334\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\327\327\327\377\332\332\332\377\332\332\332\377"
"\327\327\327\377\327\327\327\377\327\327\327\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\331\331\331\377\331\331\331\377\331\331\331\377\326\326\326\377\326\326"
"\326\377\326\326\326\377\326\326\326\377\326\326\326\377\331\331\331\377"
"\331\331\331\377\331\331\331\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\332\332\332\377\332\332\332\377\334\334\334\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\331\331\331\377\335\335\335\377\335\335\335\377\327\327\327\377\327\327"
"\327\377\327\327\327\377\327\327\327\377\327\327\327\377\327\327\327\377"
"\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\334\334\334\377\334\334\334\377\334\334\334\377"
"\334\334\334\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\327\327\327\377\327\327\327\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\331\331\331\377\331\331\331\377\326\326\326\377\326\326"
"\326\377\326\326\326\377\334\334\334\377\334\334\334\377\334\334\334\377"
"\334\334\334\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\337\337\337\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\335\335\335\377\332\332"
"\332\377\334\334\334\377\337\337\337\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\337\337\337\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\332\332\332\377\327\327\327\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\340\340\340\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\337\337\337\377\337\337\337\377\337\337\337\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\332\332\332\377\332\332\332\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\334\334\334\377\334\334"
"\334\377\334\334\334\377\334\334\334\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\340\340\340\377\340\340\340\377\340\340"
"\340\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\332\332\332\377\334\334\334\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377\335\335"
"\335\377\340\340\340\377\340\340\340\377\340\340\340\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\334\334\334\377\337\337\337\377\342\342\342\377\342\342\342\377"
"\347\347\347\377\344\344\344\377\344\344\344\377\344\344\344\377\343\343"
"\343\377\340\340\340\377\340\340\340\377\340\340\340\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\334\334\334\377\334\334"
"\334\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\343\343\343\377\346\346\346\377\343\343\343\377\344\344\344\377\344\344"
"\344\377\342\342\342\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\344\344\344\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\342\342\342\377\342\342\342\377\342\342\342\377\346\346\346\377"
"\343\343\343\377\335\335\335\377\335\335\335\377\335\335\335\377\331\331"
"\331\377\337\337\337\377\337\337\337\377\342\342\342\377\344\344\344\377"
"\344\344\344\377\352\352\352\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340"
"\340\377\340\340\340\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\351\351\351\377\352\352\352\377\346\346\346\377\346\346"
"\346\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\347\347\347\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\347\347\347\377\347\347\347\377\344\344\344\377"
"\344\344\344\377\343\343\343\377\335\335\335\377\334\334\334\377\331\331"
"\331\377\334\334\334\377\342\342\342\377\342\342\342\377\344\344\344\377"
"\347\347\347\377\352\352\352\377\355\355\355\377\360\360\360\377\355\355"
"\355\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\355\355\355\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\343\343\343\377\351\351\351\377\351\351\351\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\351\351\351\377\343\343\343\377"
"\343\343\343\377\354\354\354\377\354\354\354\377\354\354\354\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\355\355\355\377\355\355\355\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\352\352\352\377\354\354"
"\354\377\354\354\354\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\351\351\351\377\344\344\344\377\342\342\342\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\334\334\334\377\342\342\342\377\342\342\342\377"
"\344\344\344\377\352\352\352\377\355\355\355\377\362\362\362\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\365\365\365\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\357\357\357\377\357\357\357\377\352\352"
"\352\377\352\352\352\377\344\344\344\377\344\344\344\377\352\352\352\377"
"\354\354\354\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\355\355\355\377\355\355\355\377\354\354\354\377\354\354\354\377"
"\347\347\347\377\347\347\347\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\360\360\360\377\360\360\360\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\355\355\355\377\351\351\351\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\351\351\351\377\352\352\352\377\352\352\352\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\354\354\354\377\354\354\354\377\347\347\347\377\347\347\347\377\342\342"
"\342\377\337\337\337\377\334\334\334\377\334\334\334\377\337\337\337\377"
"\344\344\344\377\351\351\351\377\355\355\355\377\360\360\360\377\365\365"
"\365\377\366\366\366\377\371\371\371\377\370\370\370\377\366\366\366\377"
"\366\366\366\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\355\355\355\377\355\355\355\377\352\352\352\377\352\352\352\377"
"\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\360\360\360\377\355\355\355\377\351\351\351\377\351\351\351\377"
"\343\343\343\377\343\343\343\377\351\351\351\377\354\354\354\377\355\355"
"\355\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\357\357\357\377\352\352\352\377\347\347\347\377\344\344"
"\344\377\337\337\337\377\337\337\337\377\332\332\332\377\337\337\337\377"
"\337\337\337\377\343\343\343\377\351\351\351\377\355\355\355\377\363\363"
"\363\377\366\366\366\377\366\366\366\377\371\371\371\377\373\373\373\377"
"\373\373\373\377\371\371\371\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\365\365\365\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\357\357\357\377\357\357\357\377\362\362\362\377\362\362\362\377\363\363"
"\363\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377\362\362"
"\362\377\362\362\362\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\343\343\343\377\343\343\343\377\351\351\351\377\355\355"
"\355\377\360\360\360\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\362\362\362\377\360\360\360\377\355\355\355\377\354\354"
"\354\377\347\347\347\377\342\342\342\377\337\337\337\377\335\335\335\377"
"\337\337\337\377\340\340\340\377\343\343\343\377\346\346\346\377\355\355"
"\355\377\365\365\365\377\370\370\370\377\371\371\371\377\373\373\373\377"
"\373\373\373\377\373\373\373\377\371\371\371\377\366\366\366\377\366\366"
"\366\377\366\366\366\377\365\365\365\377\365\365\365\377\360\360\360\377"
"\360\360\360\377\355\355\355\377\355\355\355\377\360\360\360\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\357\357\357\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\355\355\355\377\352\352\352\377"
"\347\347\347\377\347\347\347\377\343\343\343\377\351\351\351\377\351\351"
"\351\377\355\355\355\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\352\352\352\377\346\346\346\377\342\342\342\377\337\337\337\377"
"\335\335\335\377\335\335\335\377\340\340\340\377\340\340\340\377\351\351"
"\351\377\360\360\360\377\363\363\363\377\366\366\366\377\373\373\373\377"
"\373\373\373\377\371\371\371\377\371\371\371\377\373\373\373\377\373\373"
"\373\377\370\370\370\377\370\370\370\377\363\363\363\377\363\363\363\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\363\363\363\377\365\365\365\377"
"\365\365\365\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\355\355\355\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\352\352\352\377\354\354\354\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\355\355\355\377\351\351\351\377\346\346\346\377\343\343\343\377"
"\335\335\335\377\335\335\335\377\334\334\334\377\340\340\340\377\343\343"
"\343\377\351\351\351\377\357\357\357\377\362\362\362\377\366\366\366\377"
"\373\373\373\377\371\371\371\377\371\371\371\377\370\370\370\377\373\373"
"\373\377\373\373\373\377\370\370\370\377\370\370\370\377\363\363\363\377"
"\363\363\363\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\360\360\360\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377\357\357"
"\357\377\357\357\357\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\360\360\360\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\355\355\355\377\352\352\352\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\352\352\352\377\352\352\352\377\357\357\357\377"
"\355\355\355\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\363\363\363\377\355\355\355\377\351\351\351\377\346\346\346\377"
"\340\340\340\377\340\340\340\377\334\334\334\377\334\334\334\377\340\340"
"\340\377\343\343\343\377\347\347\347\377\355\355\355\377\362\362\362\377"
"\366\366\366\377\371\371\371\377\371\371\371\377\366\366\366\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\366\366\366\377\366\366\366\377"
"\362\362\362\377\362\362\362\377\355\355\355\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\357\357\357\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\360\360\360\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\360\360\360\377\354\354\354\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\352\352\352\377\355\355\355\377"
"\357\357\357\377\360\360\360\377\362\362\362\377\362\362\362\377\363\363"
"\363\377\365\365\365\377\363\363\363\377\363\363\363\377\355\355\355\377"
"\346\346\346\377\340\340\340\377\340\340\340\377\334\334\334\377\334\334"
"\334\377\340\340\340\377\343\343\343\377\347\347\347\377\355\355\355\377"
"\362\362\362\377\366\366\366\377\371\371\371\377\371\371\371\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\365\365\365\377\366\366\366\377"
"\366\366\366\377\362\362\362\377\362\362\362\377\355\355\355\377\357\357"
"\357\377\357\357\357\377\360\360\360\377\357\357\357\377\357\357\357\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\357\357\357\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\354\354\354\377\357\357\357\377\351\351\351\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\344\344\344\377\344\344\344\377\352\352\352\377"
"\355\355\355\377\362\362\362\377\362\362\362\377\357\357\357\377\357\357"
"\357\377\363\363\363\377\363\363\363\377\362\362\362\377\363\363\363\377"
"\355\355\355\377\346\346\346\377\340\340\340\377\340\340\340\377\335\335"
"\335\377\335\335\335\377\340\340\340\377\342\342\342\377\344\344\344\377"
"\355\355\355\377\362\362\362\377\366\366\366\377\363\363\363\377\365\365"
"\365\377\370\370\370\377\370\370\370\377\366\366\366\377\366\366\366\377"
"\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377\355\355"
"\355\377\355\355\355\377\352\352\352\377\352\352\352\377\360\360\360\377"
"\360\360\360\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\354\354\354\377\354\354\354\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354"
"\354\377\357\357\357\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\357\357\357\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\351\351\351\377\354\354\354\377\360\360\360\377\362\362\362\377\357\357"
"\357\377\362\362\362\377\363\363\363\377\363\363\363\377\357\357\357\377"
"\357\357\357\377\354\354\354\377\351\351\351\377\343\343\343\377\340\340"
"\340\377\335\335\335\377\335\335\335\377\337\337\337\377\337\337\337\377"
"\344\344\344\377\355\355\355\377\362\362\362\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\370\370\370\377\370\370\370\377\366\366\366\377"
"\366\366\366\377\363\363\363\377\362\362\362\377\357\357\357\377\357\357"
"\357\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352\352\377"
"\357\357\357\377\360\360\360\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377\351\351"
"\351\377\346\346\346\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\351\351\351\377\354\354\354\377\355\355\355\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\357\357\357\377\357\357\357\377\352\352\352\377\347\347\347\377\343\343"
"\343\377\343\343\343\377\335\335\335\377\335\335\335\377\337\337\337\377"
"\337\337\337\377\344\344\344\377\355\355\355\377\362\362\362\377\360\360"
"\360\377\360\360\360\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\355\355\355\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\355\355\355\377\352\352\352\377\352\352\352\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\354\354\354\377\357\357\357\377\357\357"
"\357\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340\340\377"
"\340\340\340\377\343\343\343\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\355\355\355\377\360\360\360\377\360\360\360\377\362\362\362\377"
"\362\362\362\377\357\357\357\377\357\357\357\377\352\352\352\377\344\344"
"\344\377\342\342\342\377\342\342\342\377\334\334\334\377\334\334\334\377"
"\337\337\337\377\337\337\337\377\344\344\344\377\352\352\352\377\357\357"
"\357\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\355\355\355\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\347\347\347\377"
"\352\352\352\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\352\352\352\377\347\347\347\377\346\346\346\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\346\346\346\377\346\346"
"\346\377\354\354\354\377\354\354\354\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\357\357\357\377\352\352"
"\352\377\344\344\344\377\342\342\342\377\342\342\342\377\334\334\334\377"
"\334\334\334\377\337\337\337\377\337\337\337\377\344\344\344\377\352\352"
"\352\377\357\357\357\377\355\355\355\377\360\360\360\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\344\344\344\377\344\344\344\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\347\347\347\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\347\347\347\377\352\352\352\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\344\344\344\377\344\344\344\377"
"\337\337\337\377\332\332\332\377\332\332\332\377\337\337\337\377\346\346"
"\346\377\346\346\346\377\351\351\351\377\351\351\351\377\354\354\354\377"
"\351\351\351\377\354\354\354\377\355\355\355\377\354\354\354\377\357\357"
"\357\377\352\352\352\377\344\344\344\377\342\342\342\377\342\342\342\377"
"\334\334\334\377\334\334\334\377\335\335\335\377\335\335\335\377\342\342"
"\342\377\344\344\344\377\352\352\352\377\354\354\354\377\360\360\360\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\354\354\354\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\347\347\347\377\344\344\344\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\346\346"
"\346\377\346\346\346\377\354\354\354\377\354\354\354\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\352\352\352\377\352\352\352\377\355\355"
"\355\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344\344\377"
"\344\344\344\377\342\342\342\377\337\337\337\377\337\337\337\377\342\342"
"\342\377\344\344\344\377\344\344\344\377\352\352\352\377\354\354\354\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\355\355\355\377\352\352\352\377\344\344\344\377\342\342\342\377"
"\342\342\342\377\334\334\334\377\332\332\332\377\335\335\335\377\335\335"
"\335\377\342\342\342\377\344\344\344\377\352\352\352\377\354\354\354\377"
"\360\360\360\377\357\357\357\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344\344\377"
"\344\344\344\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340"
"\340\377\346\346\346\377\346\346\346\377\354\354\354\377\351\351\351\377"
"\354\354\354\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\346\346\346\377\346\346\346\377"
"\346\346\346\377\347\347\347\377\347\347\347\377\347\347\347\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\355\355\355\377\352\352\352\377"
"\352\352\352\377\347\347\347\377\347\347\347\377\344\344\344\377\344\344"
"\344\377\347\347\347\377\347\347\347\377\352\352\352\377\352\352\352\377"
"\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\355\355\355\377\344\344\344\377"
"\337\337\337\377\337\337\337\377\332\332\332\377\332\332\332\377\337\337"
"\337\377\337\337\337\377\344\344\344\377\352\352\352\377\357\357\357\377"
"\355\355\355\377\360\360\360\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\354\354\354\377\354\354\354\377\352\352\352\377\352\352\352\377"
"\351\351\351\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340"
"\340\377\340\340\340\377\346\346\346\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\354\354\354\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\357\357\357\377\357\357\357\377\360\360\360\377\362\362\362\377"
"\357\357\357\377\357\357\357\377\355\355\355\377\355\355\355\377\352\352"
"\352\377\352\352\352\377\355\355\355\377\355\355\355\377\357\357\357\377"
"\357\357\357\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\360\360\360\377\354\354\354\377"
"\344\344\344\377\337\337\337\377\337\337\337\377\332\332\332\377\332\332"
"\332\377\337\337\337\377\337\337\337\377\344\344\344\377\352\352\352\377"
"\357\357\357\377\360\360\360\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\357\357\357\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\346\346\346\377\346\346"
"\346\377\343\343\343\377\346\346\346\377\346\346\346\377\354\354\354\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\355\355\355\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\357\357\357\377\352\352\352\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\355\355\355\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377"
"\355\355\355\377\352\352\352\377\344\344\344\377\337\337\337\377\332\332"
"\332\377\332\332\332\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\355\355\355\377\362\362\362\377\360\360\360\377\363\363\363\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\354\354\354\377\354\354\354\377\346\346"
"\346\377\346\346\346\377\346\346\346\377\346\346\346\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377\355\355"
"\355\377\357\357\357\377\355\355\355\377\357\357\357\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\363\363\363\377\360\360\360\377\357\357"
"\357\377\354\354\354\377\354\354\354\377\354\354\354\377\351\351\351\377"
"\362\362\362\377\363\363\363\377\366\366\366\377\370\370\370\377\370\370"
"\370\377\370\370\370\377\370\370\370\377\370\370\370\377\365\365\365\377"
"\363\363\363\377\355\355\355\377\352\352\352\377\344\344\344\377\337\337"
"\337\377\332\332\332\377\332\332\332\377\337\337\337\377\337\337\337\377"
"\344\344\344\377\355\355\355\377\362\362\362\377\360\360\360\377\365\365"
"\365\377\363\363\363\377\363\363\363\377\363\363\363\377\362\362\362\377"
"\362\362\362\377\360\360\360\377\360\360\360\377\354\354\354\377\354\354"
"\354\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\354\354\354\377\354\354\354\377\360\360\360\377\360\360\360\377\363\363"
"\363\377\357\357\357\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\366\366\366\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\363\363\363\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\354\354\354\377\351\351\351\377"
"\351\351\351\377\357\357\357\377\362\362\362\377\370\370\370\377\370\370"
"\370\377\370\370\370\377\370\370\370\377\370\370\370\377\370\370\370\377"
"\365\365\365\377\365\365\365\377\360\360\360\377\352\352\352\377\344\344"
"\344\377\337\337\337\377\332\332\332\377\332\332\332\377\337\337\337\377"
"\337\337\337\377\344\344\344\377\355\355\355\377\362\362\362\377\360\360"
"\360\377\365\365\365\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\362\362\362\377\360\360\360\377\360\360\360\377\354\354"
"\354\377\354\354\354\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\346\346\346\377\354\354\354\377\354\354\354\377\360\360\360\377\360\360"
"\360\377\362\362\362\377\355\355\355\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\366\366\366\377\366\366\366\377\363\363\363\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\365\365\365\377\371\371\371\377"
"\371\371\371\377\371\371\371\377\371\371\371\377\365\365\365\377\365\365"
"\365\377\360\360\360\377\363\363\363\377\357\357\357\377\357\357\357\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\360\360\360\377\365\365"
"\365\377\370\370\370\377\376\376\376\377\376\376\376\377\370\370\370\377"
"\370\370\370\377\365\365\365\377\363\363\363\377\360\360\360\377\352\352"
"\352\377\344\344\344\377\337\337\337\377\332\332\332\377\332\332\332\377"
"\337\337\337\377\337\337\337\377\344\344\344\377\355\355\355\377\362\362"
"\362\377\362\362\362\377\365\365\365\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\354\354\354\377\354\354\354\377\346\346\346\377\346\346\346\377"
"\346\346\346\377\346\346\346\377\354\354\354\377\354\354\354\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\355\355\355\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\366\366\366\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\370\370\370\377"
"\370\370\370\377\370\370\370\377\370\370\370\377\371\371\371\377\365\365"
"\365\377\365\365\365\377\360\360\360\377\363\363\363\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\365\365\365\377\366\366\366\377\376\376\376\377\376\376\376\377"
"\370\370\370\377\370\370\370\377\365\365\365\377\360\360\360\377\355\355"
"\355\377\343\343\343\377\337\337\337\377\337\337\337\377\332\332\332\377"
"\332\332\332\377\337\337\337\377\337\337\337\377\344\344\344\377\355\355"
"\355\377\362\362\362\377\362\362\362\377\365\365\365\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\354\354\354\377\354\354\354\377\346\346\346\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\354\354\354\377\354\354"
"\354\377\360\360\360\377\360\360\360\377\357\357\357\377\357\357\357\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377\366\366"
"\366\377\357\357\357\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\370\370\370\377\370\370\370\377\370\370\370\377\370\370\370\377\370\370"
"\370\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\365\365\365\377\365\365\365\377\376\376\376\377"
"\370\370\370\377\370\370\370\377\370\370\370\377\365\365\365\377\360\360"
"\360\377\355\355\355\377\343\343\343\377\337\337\337\377\335\335\335\377"
"\332\332\332\377\332\332\332\377\335\335\335\377\337\337\337\377\344\344"
"\344\377\355\355\355\377\362\362\362\377\362\362\362\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\354\354\354\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377\354\354"
"\354\377\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\355\355\355\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\366\366\366\377\355\355\355\377\360\360\360\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\366\366\366\377\370\370\370\377\370\370"
"\370\377\370\370\370\377\363\363\363\377\363\363\363\377\360\360\360\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\357\357\357\377\360\360\360\377\365\365\365\377\365\365\365\377"
"\371\371\371\377\370\370\370\377\370\370\370\377\366\366\366\377\362\362"
"\362\377\360\360\360\377\355\355\355\377\343\343\343\377\337\337\337\377"
"\335\335\335\377\332\332\332\377\332\332\332\377\335\335\335\377\335\335"
"\335\377\342\342\342\377\352\352\352\377\357\357\357\377\362\362\362\377"
"\363\363\363\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\354\354\354\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346"
"\346\377\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\355\355\355\377\355\355\355\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\352\352\352\377\355\355\355\377"
"\355\355\355\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\357\357\357\377\357\357\357\377\351\351\351\377\351\351\351\377\346\346"
"\346\377\351\351\351\377\357\357\357\377\360\360\360\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\370\370\370\377\363\363\363\377\363\363"
"\363\377\362\362\362\377\360\360\360\377\355\355\355\377\343\343\343\377"
"\337\337\337\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335"
"\335\377\335\335\335\377\342\342\342\377\352\352\352\377\357\357\357\377"
"\357\357\357\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\351\351\351\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340"
"\340\377\346\346\346\377\351\351\351\377\351\351\351\377\357\357\357\377"
"\354\354\354\377\352\352\352\377\352\352\352\377\355\355\355\377\355\355"
"\355\377\362\362\362\377\362\362\362\377\360\360\360\377\355\355\355\377"
"\352\352\352\377\355\355\355\377\360\360\360\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\354\354\354\377\354\354\354\377\351\351\351\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\354\354\354\377\357\357\357\377"
"\363\363\363\377\365\365\365\377\365\365\365\377\363\363\363\377\362\362"
"\362\377\362\362\362\377\355\355\355\377\357\357\357\377\354\354\354\377"
"\343\343\343\377\335\335\335\377\335\335\335\377\327\327\327\377\327\327"
"\327\377\335\335\335\377\335\335\335\377\342\342\342\377\352\352\352\377"
"\357\357\357\377\357\357\357\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340"
"\340\377\340\340\340\377\340\340\340\377\346\346\346\377\351\351\351\377"
"\357\357\357\377\357\357\357\377\352\352\352\377\352\352\352\377\354\354"
"\354\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\357\357\357\377\355\355\355\377\357\357\357\377\362\362\362\377"
"\357\357\357\377\362\362\362\377\354\354\354\377\354\354\354\377\346\346"
"\346\377\346\346\346\377\344\344\344\377\344\344\344\377\354\354\354\377"
"\357\357\357\377\363\363\363\377\360\360\360\377\360\360\360\377\363\363"
"\363\377\362\362\362\377\362\362\362\377\355\355\355\377\357\357\357\377"
"\354\354\354\377\340\340\340\377\335\335\335\377\335\335\335\377\327\327"
"\327\377\327\327\327\377\335\335\335\377\335\335\335\377\342\342\342\377"
"\352\352\352\377\357\357\357\377\357\357\357\377\363\363\363\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\351\351\351\377\346\346\346\377\340\340"
"\340\377\340\340\340\377\340\340\340\377\340\340\340\377\346\346\346\377"
"\351\351\351\377\357\357\357\377\354\354\354\377\355\355\355\377\355\355"
"\355\377\354\354\354\377\354\354\354\377\355\355\355\377\352\352\352\377"
"\352\352\352\377",
};

File diff suppressed because it is too large Load Diff

View File

@ -1,922 +0,0 @@
/* GIMP RGBA C-Source image dump (text_silk.c) */
static const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char pixel_data[64 * 64 * 4 + 1];
} text_silk = {
64, 64, 4,
"\377\377\377\366\377\377\377\372\377\377\377\375\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\377\377\377\377\374\377\377"
"\377\366\377\377\377\365\377\377\377\364\377\377\377\366\377\377\377\370"
"\377\377\377\365\377\377\377\362\377\377\377\364\377\377\377\366\377\377"
"\377\370\377\377\377\372\377\377\377\363\377\377\377\354\377\377\377\350"
"\377\377\377\351\377\377\377\352\377\377\377\354\377\377\377\356\377\377"
"\377\361\377\377\377\366\377\377\377\372\377\377\377\375\377\377\377\375"
"\377\377\377\373\377\377\377\365\377\377\377\366\377\377\377\371\377\377"
"\377\372\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\366\377\377"
"\377\357\377\377\377\350\377\377\377\346\377\377\377\342\377\377\377\335"
"\377\377\377\346\377\377\377\351\377\377\377\351\377\377\377\357\377\377"
"\377\357\377\377\377\363\377\377\377\363\377\377\377\361\377\377\377\361"
"\377\377\377\362\377\377\377\357\377\377\377\365\377\377\377\372\377\377"
"\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\365\377\377\377\364\377\377\377\367"
"\377\377\377\370\377\377\377\363\377\377\377\357\377\377\377\356\377\377"
"\377\360\377\377\377\364\377\377\377\370\377\377\377\365\377\377\377\355"
"\377\377\377\350\377\377\377\347\377\377\377\344\377\377\377\344\377\377"
"\377\352\377\377\377\357\377\377\377\362\377\377\377\370\377\377\377\374"
"\377\377\377\372\377\377\377\366\377\377\377\362\377\377\377\363\377\377"
"\377\363\377\377\377\363\377\377\377\365\377\377\377\371\377\377\377\375"
"\377\377\377\375\377\377\377\376\377\377\377\377\377\377\377\377\377\377"
"\377\373\377\377\377\363\377\377\377\352\377\377\377\347\377\377\377\346"
"\377\377\377\342\377\377\377\345\377\377\377\344\377\377\377\340\377\377"
"\377\344\377\377\377\351\377\377\377\355\377\377\377\356\377\377\377\357"
"\377\377\377\354\377\377\377\354\377\377\377\356\377\377\377\364\377\377"
"\377\371\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\374\377\377\377\373\377\377\377\372"
"\377\377\377\374\377\377\377\372\377\377\377\362\377\377\377\360\377\377"
"\377\356\377\377\377\357\377\377\377\366\377\377\377\367\377\377\377\361"
"\377\377\377\351\377\377\377\346\377\377\377\350\377\377\377\344\377\377"
"\377\340\377\377\377\347\377\377\377\360\377\377\377\361\377\377\377\365"
"\377\377\377\370\377\377\377\365\377\377\377\362\377\377\377\356\377\377"
"\377\355\377\377\377\355\377\377\377\354\377\377\377\356\377\377\377\360"
"\377\377\377\364\377\377\377\370\377\377\377\372\377\377\377\377\377\377"
"\377\377\377\377\377\372\377\377\377\364\377\377\377\352\377\377\377\342"
"\377\377\377\342\377\377\377\340\377\377\377\342\377\377\377\342\377\377"
"\377\333\377\377\377\327\377\377\377\336\377\377\377\345\377\377\377\352"
"\377\377\377\357\377\377\377\355\377\377\377\354\377\377\377\357\377\377"
"\377\364\377\377\377\371\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\366\377\377"
"\377\363\377\377\377\362\377\377\377\365\377\377\377\370\377\377\377\365"
"\377\377\377\357\377\377\377\352\377\377\377\351\377\377\377\355\377\377"
"\377\351\377\377\377\343\377\377\377\347\377\377\377\360\377\377\377\364"
"\377\377\377\366\377\377\377\365\377\377\377\363\377\377\377\360\377\377"
"\377\351\377\377\377\346\377\377\377\352\377\377\377\353\377\377\377\347"
"\377\377\377\352\377\377\377\361\377\377\377\365\377\377\377\370\377\377"
"\377\376\377\377\377\376\377\377\377\366\377\377\377\361\377\377\377\353"
"\377\377\377\336\377\377\377\332\377\377\377\334\377\377\377\335\377\377"
"\377\336\377\377\377\327\377\377\377\316\377\377\377\322\377\377\377\333"
"\377\377\377\344\377\377\377\357\377\377\377\357\377\377\377\357\377\377"
"\377\361\377\377\377\364\377\377\377\372\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\366\377\377"
"\377\365\377\377\377\365\377\377\377\370\377\377\377\374\377\377\377\374"
"\377\377\377\366\377\377\377\360\377\377\377\353\377\377\377\353\377\377"
"\377\361\377\377\377\356\377\377\377\353\377\377\377\357\377\377\377\365"
"\377\377\377\371\377\377\377\371\377\377\377\367\377\377\377\361\377\377"
"\377\354\377\377\377\351\377\377\377\351\377\377\377\352\377\377\377\350"
"\377\377\377\343\377\377\377\354\377\377\377\366\377\377\377\373\377\377"
"\377\374\377\377\377\375\377\377\377\374\377\377\377\363\377\377\377\351"
"\377\377\377\342\377\377\377\332\377\377\377\333\377\377\377\340\377\377"
"\377\341\377\377\377\340\377\377\377\326\377\377\377\312\377\377\377\317"
"\377\377\377\327\377\377\377\343\377\377\377\357\377\377\377\360\377\377"
"\377\361\377\377\377\357\377\377\377\364\377\377\377\372\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\372\377\377\377\371\377\377\377\372\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\371\377\377\377\357\377\377\377\355\377\377"
"\377\360\377\377\377\365\377\377\377\365\377\377\377\362\377\377\377\365"
"\377\377\377\372\377\377\377\374\377\377\377\372\377\377\377\366\377\377"
"\377\361\377\377\377\360\377\377\377\356\377\377\377\356\377\377\377\353"
"\377\377\377\347\377\377\377\347\377\377\377\361\377\377\377\372\377\377"
"\377\377\377\377\377\377\377\377\377\373\377\377\377\365\377\377\377\355"
"\377\377\377\345\377\377\377\335\377\377\377\333\377\377\377\337\377\377"
"\377\344\377\377\377\347\377\377\377\343\377\377\377\330\377\377\377\317"
"\377\377\377\317\377\377\377\322\377\377\377\337\377\377\377\352\377\377"
"\377\354\377\377\377\356\377\377\377\364\377\377\377\367\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\375\377\377\377\373\377\377\377\370\377\377\377\363\377\377"
"\377\361\377\377\377\363\377\377\377\366\377\377\377\367\377\377\377\365"
"\377\377\377\371\377\377\377\373\377\377\377\371\377\377\377\370\377\377"
"\377\364\377\377\377\360\377\377\377\361\377\377\377\357\377\377\377\356"
"\377\377\377\357\377\377\377\357\377\377\377\361\377\377\377\366\377\377"
"\377\372\377\377\377\375\377\377\377\377\377\377\377\370\377\377\377\361"
"\377\377\377\355\377\377\377\351\377\377\377\342\377\377\377\337\377\377"
"\377\340\377\377\377\345\377\377\377\350\377\377\377\343\377\377\377\334"
"\377\377\377\325\377\377\377\320\377\377\377\316\377\377\377\335\377\377"
"\377\351\377\377\377\356\377\377\377\361\377\377\377\370\377\377\377\372"
"\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\365\377\377\377\363\377\377"
"\377\365\377\377\377\363\377\377\377\363\377\377\377\366\377\377\377\366"
"\377\377\377\370\377\377\377\374\377\377\377\372\377\377\377\364\377\377"
"\377\361\377\377\377\357\377\377\377\354\377\377\377\356\377\377\377\353"
"\377\377\377\355\377\377\377\362\377\377\377\367\377\377\377\373\377\377"
"\377\375\377\377\377\374\377\377\377\374\377\377\377\375\377\377\377\371"
"\377\377\377\363\377\377\377\356\377\377\377\350\377\377\377\343\377\377"
"\377\342\377\377\377\344\377\377\377\350\377\377\377\350\377\377\377\346"
"\377\377\377\340\377\377\377\333\377\377\377\330\377\377\377\331\377\377"
"\377\342\377\377\377\354\377\377\377\362\377\377\377\367\377\377\377\366"
"\377\377\377\366\377\377\377\373\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\374"
"\377\377\377\375\377\377\377\373\377\377\377\370\377\377\377\364\377\377"
"\377\361\377\377\377\365\377\377\377\365\377\377\377\365\377\377\377\367"
"\377\377\377\365\377\377\377\370\377\377\377\373\377\377\377\372\377\377"
"\377\366\377\377\377\357\377\377\377\351\377\377\377\351\377\377\377\354"
"\377\377\377\352\377\377\377\360\377\377\377\363\377\377\377\370\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\370\377\377\377\363\377\377\377\356\377\377\377\350\377\377"
"\377\344\377\377\377\342\377\377\377\343\377\377\377\352\377\377\377\354"
"\377\377\377\352\377\377\377\343\377\377\377\340\377\377\377\335\377\377"
"\377\340\377\377\377\346\377\377\377\356\377\377\377\362\377\377\377\367"
"\377\377\377\363\377\377\377\361\377\377\377\367\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\374\377\377\377\370\377\377\377\366"
"\377\377\377\372\377\377\377\372\377\377\377\367\377\377\377\367\377\377"
"\377\366\377\377\377\365\377\377\377\366\377\377\377\362\377\377\377\361"
"\377\377\377\364\377\377\377\364\377\377\377\370\377\377\377\372\377\377"
"\377\374\377\377\377\373\377\377\377\363\377\377\377\355\377\377\377\353"
"\377\377\377\352\377\377\377\354\377\377\377\364\377\377\377\367\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\362\377\377\377\356\377\377"
"\377\350\377\377\377\346\377\377\377\342\377\377\377\342\377\377\377\353"
"\377\377\377\361\377\377\377\356\377\377\377\353\377\377\377\346\377\377"
"\377\337\377\377\377\341\377\377\377\351\377\377\377\361\377\377\377\362"
"\377\377\377\364\377\377\377\361\377\377\377\360\377\377\377\370\377\377"
"\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\372"
"\377\377\377\365\377\377\377\364\377\377\377\365\377\377\377\364\377\377"
"\377\364\377\377\377\364\377\377\377\364\377\377\377\361\377\377\377\352"
"\377\377\377\354\377\377\377\357\377\377\377\362\377\377\377\372\377\377"
"\377\376\377\377\377\375\377\377\377\373\377\377\377\365\377\377\377\361"
"\377\377\377\363\377\377\377\362\377\377\377\363\377\377\377\370\377\377"
"\377\373\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\363\377\377"
"\377\353\377\377\377\346\377\377\377\346\377\377\377\347\377\377\377\352"
"\377\377\377\356\377\377\377\361\377\377\377\356\377\377\377\357\377\377"
"\377\354\377\377\377\350\377\377\377\350\377\377\377\360\377\377\377\366"
"\377\377\377\363\377\377\377\362\377\377\377\361\377\377\377\364\377\377"
"\377\374\377\377\377\376\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\374\377\377"
"\377\377\377\377\377\375\377\377\377\374\377\377\377\375\377\377\377\376"
"\377\377\377\374\377\377\377\366\377\377\377\361\377\377\377\363\377\377"
"\377\366\377\377\377\365\377\377\377\363\377\377\377\361\377\377\377\355"
"\377\377\377\344\377\377\377\351\377\377\377\355\377\377\377\360\377\377"
"\377\372\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\366"
"\377\377\377\367\377\377\377\370\377\377\377\371\377\377\377\371\377\377"
"\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377"
"\377\366\377\377\377\357\377\377\377\351\377\377\377\350\377\377\377\354"
"\377\377\377\360\377\377\377\361\377\377\377\363\377\377\377\357\377\377"
"\377\361\377\377\377\357\377\377\377\355\377\377\377\360\377\377\377\363"
"\377\377\377\365\377\377\377\365\377\377\377\364\377\377\377\370\377\377"
"\377\370\377\377\377\375\377\377\377\375\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\372\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\377"
"\377\377\377\376\377\377\377\372\377\377\377\365\377\377\377\362\377\377"
"\377\361\377\377\377\363\377\377\377\365\377\377\377\367\377\377\377\363"
"\377\377\377\353\377\377\377\341\377\377\377\345\377\377\377\356\377\377"
"\377\365\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\374"
"\377\377\377\367\377\377\377\371\377\377\377\372\377\377\377\375\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\363\377\377\377\357\377\377\377\356"
"\377\377\377\357\377\377\377\357\377\377\377\360\377\377\377\362\377\377"
"\377\357\377\377\377\361\377\377\377\356\377\377\377\355\377\377\377\365"
"\377\377\377\367\377\377\377\366\377\377\377\372\377\377\377\373\377\377"
"\377\376\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\374\377\377\377\371\377\377\377\375\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\374\377\377\377\370\377\377\377\364\377\377"
"\377\361\377\377\377\356\377\377\377\355\377\377\377\362\377\377\377\365"
"\377\377\377\357\377\377\377\353\377\377\377\344\377\377\377\344\377\377"
"\377\353\377\377\377\365\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\370\377\377\377\367\377\377\377\371\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377"
"\377\372\377\377\377\371\377\377\377\370\377\377\377\364\377\377\377\362"
"\377\377\377\361\377\377\377\357\377\377\377\356\377\377\377\354\377\377"
"\377\357\377\377\377\357\377\377\377\361\377\377\377\361\377\377\377\361"
"\377\377\377\366\377\377\377\373\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\374\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\376\377\377\377\376\377\377\377\374\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\370\377\377\377\367\377\377"
"\377\365\377\377\377\362\377\377\377\356\377\377\377\355\377\377\377\356"
"\377\377\377\355\377\377\377\350\377\377\377\352\377\377\377\355\377\377"
"\377\354\377\377\377\355\377\377\377\363\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\371\377\377"
"\377\372\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\374\377\377"
"\377\364\377\377\377\361\377\377\377\362\377\377\377\365\377\377\377\366"
"\377\377\377\364\377\377\377\361\377\377\377\356\377\377\377\355\377\377"
"\377\353\377\377\377\361\377\377\377\360\377\377\377\356\377\377\377\362"
"\377\377\377\363\377\377\377\367\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\372\377\377\377\365\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\365\377\377\377\366\377\377"
"\377\366\377\377\377\364\377\377\377\363\377\377\377\361\377\377\377\360"
"\377\377\377\357\377\377\377\351\377\377\377\350\377\377\377\354\377\377"
"\377\361\377\377\377\364\377\377\377\364\377\377\377\364\377\377\377\371"
"\377\377\377\373\377\377\377\373\377\377\377\373\377\377\377\370\377\377"
"\377\371\377\377\377\374\377\377\377\375\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377"
"\377\370\377\377\377\362\377\377\377\356\377\377\377\356\377\377\377\361"
"\377\377\377\365\377\377\377\364\377\377\377\361\377\377\377\360\377\377"
"\377\360\377\377\377\361\377\377\377\365\377\377\377\361\377\377\377\353"
"\377\377\377\357\377\377\377\365\377\377\377\372\377\377\377\376\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\366\377\377\377\357"
"\377\377\377\365\377\377\377\372\377\377\377\373\377\377\377\373\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\376\377\377\377\374\377\377\377\367\377\377\377\363\377\377"
"\377\366\377\377\377\366\377\377\377\364\377\377\377\367\377\377\377\365"
"\377\377\377\362\377\377\377\363\377\377\377\353\377\377\377\353\377\377"
"\377\355\377\377\377\362\377\377\377\366\377\377\377\365\377\377\377\363"
"\377\377\377\363\377\377\377\365\377\377\377\363\377\377\377\366\377\377"
"\377\363\377\377\377\362\377\377\377\370\377\377\377\372\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\375\377\377"
"\377\374\377\377\377\367\377\377\377\363\377\377\377\357\377\377\377\355"
"\377\377\377\362\377\377\377\366\377\377\377\367\377\377\377\364\377\377"
"\377\362\377\377\377\357\377\377\377\360\377\377\377\361\377\377\377\356"
"\377\377\377\347\377\377\377\350\377\377\377\357\377\377\377\366\377\377"
"\377\370\377\377\377\370\377\377\377\372\377\377\377\373\377\377\377\357"
"\377\377\377\351\377\377\377\356\377\377\377\364\377\377\377\370\377\377"
"\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\374\377\377\377\370\377\377"
"\377\365\377\377\377\364\377\377\377\362\377\377\377\362\377\377\377\365"
"\377\377\377\364\377\377\377\365\377\377\377\365\377\377\377\356\377\377"
"\377\353\377\377\377\356\377\377\377\364\377\377\377\366\377\377\377\365"
"\377\377\377\363\377\377\377\357\377\377\377\355\377\377\377\354\377\377"
"\377\353\377\377\377\352\377\377\377\353\377\377\377\362\377\377\377\370"
"\377\377\377\373\377\377\377\376\377\377\377\376\377\377\377\372\377\377"
"\377\374\377\377\377\375\377\377\377\372\377\377\377\366\377\377\377\362"
"\377\377\377\361\377\377\377\366\377\377\377\372\377\377\377\367\377\377"
"\377\364\377\377\377\357\377\377\377\352\377\377\377\355\377\377\377\352"
"\377\377\377\346\377\377\377\343\377\377\377\344\377\377\377\351\377\377"
"\377\355\377\377\377\355\377\377\377\356\377\377\377\362\377\377\377\364"
"\377\377\377\353\377\377\377\344\377\377\377\346\377\377\377\352\377\377"
"\377\357\377\377\377\371\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\372\377\377"
"\377\370\377\377\377\365\377\377\377\362\377\377\377\357\377\377\377\355"
"\377\377\377\355\377\377\377\354\377\377\377\362\377\377\377\365\377\377"
"\377\362\377\377\377\356\377\377\377\357\377\377\377\364\377\377\377\363"
"\377\377\377\362\377\377\377\362\377\377\377\356\377\377\377\356\377\377"
"\377\355\377\377\377\351\377\377\377\351\377\377\377\353\377\377\377\357"
"\377\377\377\370\377\377\377\373\377\377\377\374\377\377\377\375\377\377"
"\377\370\377\377\377\370\377\377\377\372\377\377\377\372\377\377\377\371"
"\377\377\377\367\377\377\377\366\377\377\377\370\377\377\377\370\377\377"
"\377\361\377\377\377\356\377\377\377\350\377\377\377\346\377\377\377\353"
"\377\377\377\347\377\377\377\337\377\377\377\342\377\377\377\346\377\377"
"\377\347\377\377\377\350\377\377\377\350\377\377\377\350\377\377\377\355"
"\377\377\377\361\377\377\377\351\377\377\377\340\377\377\377\340\377\377"
"\377\343\377\377\377\353\377\377\377\367\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\371\377\377"
"\377\370\377\377\377\372\377\377\377\372\377\377\377\363\377\377\377\356"
"\377\377\377\350\377\377\377\346\377\377\377\344\377\377\377\353\377\377"
"\377\363\377\377\377\363\377\377\377\356\377\377\377\355\377\377\377\361"
"\377\377\377\360\377\377\377\361\377\377\377\361\377\377\377\357\377\377"
"\377\360\377\377\377\361\377\377\377\360\377\377\377\355\377\377\377\353"
"\377\377\377\360\377\377\377\367\377\377\377\371\377\377\377\371\377\377"
"\377\370\377\377\377\365\377\377\377\366\377\377\377\370\377\377\377\372"
"\377\377\377\370\377\377\377\367\377\377\377\371\377\377\377\370\377\377"
"\377\365\377\377\377\355\377\377\377\344\377\377\377\337\377\377\377\341"
"\377\377\377\344\377\377\377\342\377\377\377\340\377\377\377\340\377\377"
"\377\342\377\377\377\342\377\377\377\346\377\377\377\347\377\377\377\346"
"\377\377\377\351\377\377\377\354\377\377\377\342\377\377\377\334\377\377"
"\377\337\377\377\377\344\377\377\377\360\377\377\377\370\377\377\377\371"
"\377\377\377\372\377\377\377\372\377\377\377\365\377\377\377\367\377\377"
"\377\370\377\377\377\371\377\377\377\375\377\377\377\374\377\377\377\365"
"\377\377\377\356\377\377\377\344\377\377\377\334\377\377\377\332\377\377"
"\377\342\377\377\377\354\377\377\377\354\377\377\377\350\377\377\377\350"
"\377\377\377\354\377\377\377\354\377\377\377\357\377\377\377\361\377\377"
"\377\361\377\377\377\363\377\377\377\363\377\377\377\362\377\377\377\360"
"\377\377\377\355\377\377\377\355\377\377\377\360\377\377\377\363\377\377"
"\377\365\377\377\377\363\377\377\377\365\377\377\377\367\377\377\377\367"
"\377\377\377\372\377\377\377\370\377\377\377\365\377\377\377\366\377\377"
"\377\363\377\377\377\357\377\377\377\350\377\377\377\335\377\377\377\326"
"\377\377\377\332\377\377\377\333\377\377\377\332\377\377\377\336\377\377"
"\377\333\377\377\377\340\377\377\377\347\377\377\377\352\377\377\377\347"
"\377\377\377\346\377\377\377\347\377\377\377\346\377\377\377\340\377\377"
"\377\336\377\377\377\337\377\377\377\350\377\377\377\363\377\377\377\371"
"\377\377\377\367\377\377\377\365\377\377\377\364\377\377\377\363\377\377"
"\377\366\377\377\377\366\377\377\377\367\377\377\377\373\377\377\377\373"
"\377\377\377\365\377\377\377\362\377\377\377\346\377\377\377\325\377\377"
"\377\322\377\377\377\332\377\377\377\346\377\377\377\347\377\377\377\345"
"\377\377\377\346\377\377\377\346\377\377\377\347\377\377\377\352\377\377"
"\377\353\377\377\377\360\377\377\377\365\377\377\377\365\377\377\377\365"
"\377\377\377\362\377\377\377\360\377\377\377\357\377\377\377\353\377\377"
"\377\357\377\377\377\364\377\377\377\366\377\377\377\371\377\377\377\371"
"\377\377\377\370\377\377\377\372\377\377\377\371\377\377\377\362\377\377"
"\377\362\377\377\377\357\377\377\377\351\377\377\377\344\377\377\377\330"
"\377\377\377\316\377\377\377\322\377\377\377\327\377\377\377\327\377\377"
"\377\326\377\377\377\325\377\377\377\335\377\377\377\350\377\377\377\354"
"\377\377\377\352\377\377\377\350\377\377\377\344\377\377\377\343\377\377"
"\377\340\377\377\377\344\377\377\377\346\377\377\377\356\377\377\377\366"
"\377\377\377\371\377\377\377\365\377\377\377\362\377\377\377\362\377\377"
"\377\363\377\377\377\364\377\377\377\364\377\377\377\365\377\377\377\370"
"\377\377\377\371\377\377\377\363\377\377\377\362\377\377\377\353\377\377"
"\377\336\377\377\377\325\377\377\377\330\377\377\377\343\377\377\377\344"
"\377\377\377\343\377\377\377\343\377\377\377\341\377\377\377\347\377\377"
"\377\354\377\377\377\356\377\377\377\363\377\377\377\366\377\377\377\367"
"\377\377\377\371\377\377\377\365\377\377\377\361\377\377\377\363\377\377"
"\377\355\377\377\377\356\377\377\377\364\377\377\377\372\377\377\377\374"
"\377\377\377\374\377\377\377\374\377\377\377\373\377\377\377\370\377\377"
"\377\363\377\377\377\364\377\377\377\360\377\377\377\350\377\377\377\340"
"\377\377\377\317\377\377\377\306\377\377\377\322\377\377\377\327\377\377"
"\377\325\377\377\377\324\377\377\377\326\377\377\377\334\377\377\377\344"
"\377\377\377\351\377\377\377\353\377\377\377\354\377\377\377\352\377\377"
"\377\344\377\377\377\347\377\377\377\351\377\377\377\354\377\377\377\360"
"\377\377\377\370\377\377\377\372\377\377\377\366\377\377\377\363\377\377"
"\377\361\377\377\377\364\377\377\377\370\377\377\377\370\377\377\377\371"
"\377\377\377\370\377\377\377\364\377\377\377\361\377\377\377\362\377\377"
"\377\355\377\377\377\344\377\377\377\333\377\377\377\327\377\377\377\335"
"\377\377\377\341\377\377\377\342\377\377\377\342\377\377\377\343\377\377"
"\377\352\377\377\377\360\377\377\377\364\377\377\377\366\377\377\377\370"
"\377\377\377\372\377\377\377\372\377\377\377\365\377\377\377\365\377\377"
"\377\365\377\377\377\356\377\377\377\355\377\377\377\363\377\377\377\372"
"\377\377\377\374\377\377\377\375\377\377\377\377\377\377\377\375\377\377"
"\377\373\377\377\377\367\377\377\377\365\377\377\377\361\377\377\377\346"
"\377\377\377\327\377\377\377\310\377\377\377\302\377\377\377\316\377\377"
"\377\326\377\377\377\325\377\377\377\332\377\377\377\341\377\377\377\342"
"\377\377\377\344\377\377\377\351\377\377\377\354\377\377\377\361\377\377"
"\377\361\377\377\377\353\377\377\377\357\377\377\377\356\377\377\377\356"
"\377\377\377\356\377\377\377\365\377\377\377\367\377\377\377\364\377\377"
"\377\364\377\377\377\364\377\377\377\366\377\377\377\373\377\377\377\372"
"\377\377\377\372\377\377\377\372\377\377\377\364\377\377\377\357\377\377"
"\377\356\377\377\377\347\377\377\377\335\377\377\377\333\377\377\377\325"
"\377\377\377\333\377\377\377\344\377\377\377\351\377\377\377\350\377\377"
"\377\351\377\377\377\355\377\377\377\362\377\377\377\365\377\377\377\367"
"\377\377\377\372\377\377\377\372\377\377\377\367\377\377\377\361\377\377"
"\377\365\377\377\377\366\377\377\377\362\377\377\377\356\377\377\377\363"
"\377\377\377\372\377\377\377\371\377\377\377\372\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\371\377\377\377\364"
"\377\377\377\347\377\377\377\322\377\377\377\307\377\377\377\303\377\377"
"\377\312\377\377\377\331\377\377\377\333\377\377\377\340\377\377\377\345"
"\377\377\377\347\377\377\377\350\377\377\377\353\377\377\377\357\377\377"
"\377\363\377\377\377\365\377\377\377\361\377\377\377\366\377\377\377\364"
"\377\377\377\363\377\377\377\364\377\377\377\367\377\377\377\370\377\377"
"\377\365\377\377\377\365\377\377\377\365\377\377\377\367\377\377\377\374"
"\377\377\377\373\377\377\377\374\377\377\377\374\377\377\377\366\377\377"
"\377\355\377\377\377\350\377\377\377\337\377\377\377\327\377\377\377\324"
"\377\377\377\317\377\377\377\333\377\377\377\347\377\377\377\351\377\377"
"\377\351\377\377\377\356\377\377\377\364\377\377\377\366\377\377\377\370"
"\377\377\377\372\377\377\377\372\377\377\377\370\377\377\377\366\377\377"
"\377\364\377\377\377\365\377\377\377\367\377\377\377\366\377\377\377\361"
"\377\377\377\361\377\377\377\366\377\377\377\367\377\377\377\370\377\377"
"\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373"
"\377\377\377\362\377\377\377\350\377\377\377\333\377\377\377\317\377\377"
"\377\307\377\377\377\305\377\377\377\322\377\377\377\335\377\377\377\343"
"\377\377\377\351\377\377\377\354\377\377\377\354\377\377\377\356\377\377"
"\377\363\377\377\377\367\377\377\377\372\377\377\377\372\377\377\377\374"
"\377\377\377\371\377\377\377\370\377\377\377\371\377\377\377\371\377\377"
"\377\372\377\377\377\371\377\377\377\367\377\377\377\365\377\377\377\366"
"\377\377\377\372\377\377\377\373\377\377\377\376\377\377\377\376\377\377"
"\377\364\377\377\377\355\377\377\377\347\377\377\377\337\377\377\377\335"
"\377\377\377\331\377\377\377\324\377\377\377\334\377\377\377\343\377\377"
"\377\346\377\377\377\354\377\377\377\360\377\377\377\364\377\377\377\366"
"\377\377\377\370\377\377\377\373\377\377\377\370\377\377\377\364\377\377"
"\377\365\377\377\377\367\377\377\377\365\377\377\377\366\377\377\377\365"
"\377\377\377\362\377\377\377\361\377\377\377\360\377\377\377\361\377\377"
"\377\366\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\373"
"\377\377\377\364\377\377\377\353\377\377\377\350\377\377\377\342\377\377"
"\377\325\377\377\377\320\377\377\377\314\377\377\377\315\377\377\377\332"
"\377\377\377\342\377\377\377\352\377\377\377\362\377\377\377\363\377\377"
"\377\362\377\377\377\365\377\377\377\370\377\377\377\372\377\377\377\376"
"\377\377\377\372\377\377\377\372\377\377\377\367\377\377\377\371\377\377"
"\377\374\377\377\377\373\377\377\377\373\377\377\377\372\377\377\377\366"
"\377\377\377\367\377\377\377\370\377\377\377\367\377\377\377\373\377\377"
"\377\373\377\377\377\365\377\377\377\354\377\377\377\347\377\377\377\345"
"\377\377\377\343\377\377\377\336\377\377\377\336\377\377\377\342\377\377"
"\377\344\377\377\377\353\377\377\377\361\377\377\377\361\377\377\377\361"
"\377\377\377\364\377\377\377\366\377\377\377\366\377\377\377\364\377\377"
"\377\364\377\377\377\366\377\377\377\370\377\377\377\367\377\377\377\366"
"\377\377\377\365\377\377\377\365\377\377\377\365\377\377\377\362\377\377"
"\377\356\377\377\377\363\377\377\377\374\377\377\377\374\377\377\377\372"
"\377\377\377\364\377\377\377\353\377\377\377\347\377\377\377\354\377\377"
"\377\351\377\377\377\341\377\377\377\337\377\377\377\332\377\377\377\324"
"\377\377\377\327\377\377\377\340\377\377\377\351\377\377\377\363\377\377"
"\377\371\377\377\377\370\377\377\377\367\377\377\377\366\377\377\377\366"
"\377\377\377\371\377\377\377\372\377\377\377\374\377\377\377\367\377\377"
"\377\370\377\377\377\373\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\374\377\377\377\373\377\377\377\367\377\377\377\363\377\377"
"\377\366\377\377\377\365\377\377\377\360\377\377\377\347\377\377\377\344"
"\377\377\377\350\377\377\377\344\377\377\377\336\377\377\377\340\377\377"
"\377\347\377\377\377\350\377\377\377\357\377\377\377\362\377\377\377\363"
"\377\377\377\365\377\377\377\362\377\377\377\361\377\377\377\361\377\377"
"\377\362\377\377\377\365\377\377\377\367\377\377\377\367\377\377\377\370"
"\377\377\377\367\377\377\377\370\377\377\377\367\377\377\377\365\377\377"
"\377\367\377\377\377\365\377\377\377\363\377\377\377\370\377\377\377\367"
"\377\377\377\365\377\377\377\361\377\377\377\351\377\377\377\347\377\377"
"\377\353\377\377\377\355\377\377\377\354\377\377\377\355\377\377\377\347"
"\377\377\377\343\377\377\377\344\377\377\377\350\377\377\377\355\377\377"
"\377\364\377\377\377\372\377\377\377\372\377\377\377\371\377\377\377\370"
"\377\377\377\370\377\377\377\367\377\377\377\372\377\377\377\370\377\377"
"\377\364\377\377\377\362\377\377\377\370\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\370\377\377\377\363\377\377"
"\377\363\377\377\377\366\377\377\377\363\377\377\377\353\377\377\377\345"
"\377\377\377\342\377\377\377\346\377\377\377\350\377\377\377\345\377\377"
"\377\344\377\377\377\350\377\377\377\352\377\377\377\361\377\377\377\364"
"\377\377\377\364\377\377\377\365\377\377\377\357\377\377\377\351\377\377"
"\377\355\377\377\377\364\377\377\377\367\377\377\377\366\377\377\377\367"
"\377\377\377\371\377\377\377\370\377\377\377\371\377\377\377\370\377\377"
"\377\366\377\377\377\371\377\377\377\372\377\377\377\365\377\377\377\365"
"\377\377\377\364\377\377\377\357\377\377\377\356\377\377\377\353\377\377"
"\377\347\377\377\377\352\377\377\377\360\377\377\377\364\377\377\377\365"
"\377\377\377\363\377\377\377\363\377\377\377\360\377\377\377\357\377\377"
"\377\362\377\377\377\371\377\377\377\374\377\377\377\374\377\377\377\374"
"\377\377\377\372\377\377\377\371\377\377\377\371\377\377\377\370\377\377"
"\377\361\377\377\377\356\377\377\377\354\377\377\377\365\377\377\377\372"
"\377\377\377\374\377\377\377\377\377\377\377\371\377\377\377\361\377\377"
"\377\361\377\377\377\361\377\377\377\362\377\377\377\364\377\377\377\363"
"\377\377\377\355\377\377\377\350\377\377\377\346\377\377\377\350\377\377"
"\377\355\377\377\377\355\377\377\377\355\377\377\377\356\377\377\377\361"
"\377\377\377\360\377\377\377\355\377\377\377\353\377\377\377\351\377\377"
"\377\345\377\377\377\347\377\377\377\357\377\377\377\365\377\377\377\367"
"\377\377\377\366\377\377\377\371\377\377\377\371\377\377\377\374\377\377"
"\377\376\377\377\377\373\377\377\377\373\377\377\377\373\377\377\377\371"
"\377\377\377\372\377\377\377\370\377\377\377\361\377\377\377\356\377\377"
"\377\353\377\377\377\353\377\377\377\361\377\377\377\365\377\377\377\370"
"\377\377\377\371\377\377\377\372\377\377\377\374\377\377\377\367\377\377"
"\377\363\377\377\377\365\377\377\377\373\377\377\377\373\377\377\377\375"
"\377\377\377\375\377\377\377\374\377\377\377\374\377\377\377\374\377\377"
"\377\370\377\377\377\355\377\377\377\347\377\377\377\352\377\377\377\363"
"\377\377\377\365\377\377\377\371\377\377\377\372\377\377\377\363\377\377"
"\377\355\377\377\377\357\377\377\377\361\377\377\377\362\377\377\377\370"
"\377\377\377\375\377\377\377\366\377\377\377\356\377\377\377\351\377\377"
"\377\347\377\377\377\356\377\377\377\361\377\377\377\356\377\377\377\355"
"\377\377\377\354\377\377\377\352\377\377\377\351\377\377\377\343\377\377"
"\377\342\377\377\377\342\377\377\377\345\377\377\377\354\377\377\377\364"
"\377\377\377\367\377\377\377\366\377\377\377\370\377\377\377\372\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375"
"\377\377\377\375\377\377\377\377\377\377\377\374\377\377\377\366\377\377"
"\377\360\377\377\377\355\377\377\377\360\377\377\377\365\377\377\377\367"
"\377\377\377\372\377\377\377\374\377\377\377\375\377\377\377\375\377\377"
"\377\374\377\377\377\372\377\377\377\371\377\377\377\371\377\377\377\373"
"\377\377\377\375\377\377\377\374\377\377\377\375\377\377\377\377\377\377"
"\377\377\377\377\377\366\377\377\377\353\377\377\377\346\377\377\377\351"
"\377\377\377\357\377\377\377\361\377\377\377\367\377\377\377\370\377\377"
"\377\363\377\377\377\356\377\377\377\357\377\377\377\365\377\377\377\367"
"\377\377\377\374\377\377\377\377\377\377\377\374\377\377\377\366\377\377"
"\377\361\377\377\377\356\377\377\377\361\377\377\377\360\377\377\377\352"
"\377\377\377\353\377\377\377\352\377\377\377\352\377\377\377\354\377\377"
"\377\343\377\377\377\337\377\377\377\337\377\377\377\346\377\377\377\356"
"\377\377\377\364\377\377\377\366\377\377\377\367\377\377\377\371\377\377"
"\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377"
"\377\366\377\377\377\363\377\377\377\364\377\377\377\365\377\377\377\366"
"\377\377\377\370\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\366"
"\377\377\377\371\377\377\377\375\377\377\377\374\377\377\377\373\377\377"
"\377\375\377\377\377\375\377\377\377\361\377\377\377\345\377\377\377\343"
"\377\377\377\350\377\377\377\355\377\377\377\357\377\377\377\363\377\377"
"\377\366\377\377\377\366\377\377\377\363\377\377\377\364\377\377\377\366"
"\377\377\377\370\377\377\377\374\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\365\377\377\377\365\377\377\377\360"
"\377\377\377\354\377\377\377\356\377\377\377\356\377\377\377\354\377\377"
"\377\354\377\377\377\347\377\377\377\340\377\377\377\337\377\377\377\347"
"\377\377\377\354\377\377\377\361\377\377\377\362\377\377\377\361\377\377"
"\377\365\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\370\377\377\377\367\377\377\377\367\377\377\377\366"
"\377\377\377\371\377\377\377\374\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374"
"\377\377\377\367\377\377\377\365\377\377\377\371\377\377\377\373\377\377"
"\377\372\377\377\377\372\377\377\377\370\377\377\377\356\377\377\377\340"
"\377\377\377\340\377\377\377\344\377\377\377\350\377\377\377\355\377\377"
"\377\360\377\377\377\361\377\377\377\363\377\377\377\364\377\377\377\365"
"\377\377\377\370\377\377\377\372\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\370\377\377\377\367\377\377\377\366"
"\377\377\377\361\377\377\377\354\377\377\377\354\377\377\377\356\377\377"
"\377\353\377\377\377\347\377\377\377\346\377\377\377\342\377\377\377\345"
"\377\377\377\352\377\377\377\351\377\377\377\354\377\377\377\355\377\377"
"\377\354\377\377\377\364\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\374\377\377\377\374\377\377\377\367"
"\377\377\377\365\377\377\377\371\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\375\377\377\377\372\377\377\377\366\377\377\377\365\377\377"
"\377\366\377\377\377\370\377\377\377\367\377\377\377\365\377\377\377\356"
"\377\377\377\340\377\377\377\335\377\377\377\340\377\377\377\340\377\377"
"\377\346\377\377\377\352\377\377\377\350\377\377\377\354\377\377\377\361"
"\377\377\377\364\377\377\377\372\377\377\377\375\377\377\377\376\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\372"
"\377\377\377\372\377\377\377\363\377\377\377\353\377\377\377\354\377\377"
"\377\357\377\377\377\352\377\377\377\346\377\377\377\346\377\377\377\345"
"\377\377\377\346\377\377\377\347\377\377\377\351\377\377\377\351\377\377"
"\377\347\377\377\377\351\377\377\377\363\377\377\377\372\377\377\377\374"
"\377\377\377\372\377\377\377\372\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\373\377\377\377\370\377\377\377\371\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\375\377\377\377\372\377\377\377\370\377\377\377\366\377\377"
"\377\363\377\377\377\364\377\377\377\366\377\377\377\367\377\377\377\364"
"\377\377\377\355\377\377\377\341\377\377\377\334\377\377\377\335\377\377"
"\377\333\377\377\377\336\377\377\377\337\377\377\377\335\377\377\377\346"
"\377\377\377\360\377\377\377\366\377\377\377\373\377\377\377\374\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\364\377\377\377\353\377\377"
"\377\355\377\377\377\360\377\377\377\351\377\377\377\347\377\377\377\350"
"\377\377\377\351\377\377\377\350\377\377\377\344\377\377\377\347\377\377"
"\377\352\377\377\377\350\377\377\377\350\377\377\377\354\377\377\377\360"
"\377\377\377\361\377\377\377\356\377\377\377\364\377\377\377\374\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\375\377\377\377\375\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\374\377\377\377\372\377\377\377\371\377\377\377\366\377\377"
"\377\362\377\377\377\363\377\377\377\365\377\377\377\370\377\377\377\370"
"\377\377\377\363\377\377\377\354\377\377\377\343\377\377\377\335\377\377"
"\377\332\377\377\377\330\377\377\377\327\377\377\377\327\377\377\377\332"
"\377\377\377\344\377\377\377\355\377\377\377\367\377\377\377\373\377\377"
"\377\371\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\371\377\377\377\360\377\377"
"\377\350\377\377\377\347\377\377\377\353\377\377\377\347\377\377\377\345"
"\377\377\377\352\377\377\377\356\377\377\377\357\377\377\377\353\377\377"
"\377\350\377\377\377\353\377\377\377\353\377\377\377\346\377\377\377\345"
"\377\377\377\350\377\377\377\352\377\377\377\351\377\377\377\357\377\377"
"\377\364\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\374"
"\377\377\377\374\377\377\377\373\377\377\377\371\377\377\377\365\377\377"
"\377\361\377\377\377\355\377\377\377\362\377\377\377\365\377\377\377\366"
"\377\377\377\367\377\377\377\364\377\377\377\354\377\377\377\343\377\377"
"\377\332\377\377\377\325\377\377\377\326\377\377\377\325\377\377\377\325"
"\377\377\377\333\377\377\377\342\377\377\377\350\377\377\377\366\377\377"
"\377\374\377\377\377\372\377\377\377\372\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\366\377\377\377\357\377\377"
"\377\354\377\377\377\352\377\377\377\350\377\377\377\352\377\377\377\350"
"\377\377\377\350\377\377\377\361\377\377\377\365\377\377\377\364\377\377"
"\377\364\377\377\377\355\377\377\377\352\377\377\377\350\377\377\377\345"
"\377\377\377\344\377\377\377\344\377\377\377\345\377\377\377\346\377\377"
"\377\350\377\377\377\354\377\377\377\370\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\375"
"\377\377\377\372\377\377\377\371\377\377\377\370\377\377\377\367\377\377"
"\377\363\377\377\377\356\377\377\377\354\377\377\377\360\377\377\377\357"
"\377\377\377\357\377\377\377\362\377\377\377\363\377\377\377\344\377\377"
"\377\333\377\377\377\330\377\377\377\330\377\377\377\325\377\377\377\327"
"\377\377\377\335\377\377\377\337\377\377\377\346\377\377\377\356\377\377"
"\377\366\377\377\377\374\377\377\377\372\377\377\377\367\377\377\377\372"
"\377\377\377\375\377\377\377\372\377\377\377\363\377\377\377\352\377\377"
"\377\350\377\377\377\353\377\377\377\353\377\377\377\352\377\377\377\354"
"\377\377\377\354\377\377\377\360\377\377\377\370\377\377\377\372\377\377"
"\377\372\377\377\377\367\377\377\377\360\377\377\377\355\377\377\377\347"
"\377\377\377\342\377\377\377\341\377\377\377\340\377\377\377\340\377\377"
"\377\335\377\377\377\336\377\377\377\344\377\377\377\361\377\377\377\374"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\372\377\377\377\372\377\377\377\372\377\377\377\374\377\377\377\377"
"\377\377\377\374\377\377\377\366\377\377\377\365\377\377\377\366\377\377"
"\377\367\377\377\377\363\377\377\377\356\377\377\377\355\377\377\377\352"
"\377\377\377\347\377\377\377\351\377\377\377\352\377\377\377\352\377\377"
"\377\341\377\377\377\325\377\377\377\325\377\377\377\333\377\377\377\327"
"\377\377\377\325\377\377\377\335\377\377\377\345\377\377\377\360\377\377"
"\377\370\377\377\377\374\377\377\377\375\377\377\377\370\377\377\377\364"
"\377\377\377\366\377\377\377\365\377\377\377\363\377\377\377\360\377\377"
"\377\346\377\377\377\345\377\377\377\347\377\377\377\352\377\377\377\354"
"\377\377\377\355\377\377\377\357\377\377\377\365\377\377\377\373\377\377"
"\377\373\377\377\377\375\377\377\377\370\377\377\377\362\377\377\377\362"
"\377\377\377\354\377\377\377\342\377\377\377\340\377\377\377\332\377\377"
"\377\325\377\377\377\325\377\377\377\330\377\377\377\337\377\377\377\352"
"\377\377\377\365\377\377\377\375\377\377\377\377\377\377\377\376\377\377"
"\377\372\377\377\377\367\377\377\377\367\377\377\377\365\377\377\377\366"
"\377\377\377\370\377\377\377\370\377\377\377\362\377\377\377\360\377\377"
"\377\362\377\377\377\363\377\377\377\355\377\377\377\347\377\377\377\347"
"\377\377\377\344\377\377\377\347\377\377\377\352\377\377\377\350\377\377"
"\377\346\377\377\377\343\377\377\377\332\377\377\377\323\377\377\377\325"
"\377\377\377\327\377\377\377\332\377\377\377\340\377\377\377\354\377\377"
"\377\371\377\377\377\375\377\377\377\377\377\377\377\376\377\377\377\370"
"\377\377\377\364\377\377\377\363\377\377\377\360\377\377\377\356\377\377"
"\377\352\377\377\377\345\377\377\377\350\377\377\377\350\377\377\377\354"
"\377\377\377\357\377\377\377\360\377\377\377\360\377\377\377\366\377\377"
"\377\374\377\377\377\376\377\377\377\377\377\377\377\370\377\377\377\365"
"\377\377\377\365\377\377\377\362\377\377\377\355\377\377\377\343\377\377"
"\377\321\377\377\377\307\377\377\377\314\377\377\377\325\377\377\377\332"
"\377\377\377\343\377\377\377\356\377\377\377\370\377\377\377\375\377\377"
"\377\375\377\377\377\371\377\377\377\364\377\377\377\362\377\377\377\360"
"\377\377\377\362\377\377\377\363\377\377\377\362\377\377\377\357\377\377"
"\377\354\377\377\377\351\377\377\377\352\377\377\377\347\377\377\377\340"
"\377\377\377\337\377\377\377\343\377\377\377\350\377\377\377\345\377\377"
"\377\343\377\377\377\344\377\377\377\337\377\377\377\337\377\377\377\333"
"\377\377\377\327\377\377\377\333\377\377\377\344\377\377\377\350\377\377"
"\377\361\377\377\377\372\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\371\377\377\377\365\377\377\377\361\377\377\377\353\377\377"
"\377\353\377\377\377\347\377\377\377\347\377\377\377\355\377\377\377\353"
"\377\377\377\353\377\377\377\354\377\377\377\355\377\377\377\357\377\377"
"\377\365\377\377\377\372\377\377\377\376\377\377\377\376\377\377\377\370"
"\377\377\377\370\377\377\377\367\377\377\377\367\377\377\377\365\377\377"
"\377\346\377\377\377\321\377\377\377\312\377\377\377\311\377\377\377\312"
"\377\377\377\325\377\377\377\340\377\377\377\353\377\377\377\366\377\377"
"\377\371\377\377\377\370\377\377\377\366\377\377\377\363\377\377\377\363"
"\377\377\377\362\377\377\377\362\377\377\377\355\377\377\377\350\377\377"
"\377\347\377\377\377\350\377\377\377\345\377\377\377\341\377\377\377\334"
"\377\377\377\333\377\377\377\333\377\377\377\336\377\377\377\337\377\377"
"\377\332\377\377\377\337\377\377\377\340\377\377\377\336\377\377\377\343"
"\377\377\377\347\377\377\377\341\377\377\377\340\377\377\377\350\377\377"
"\377\355\377\377\377\366\377\377\377\372\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\367\377\377\377\361\377\377"
"\377\355\377\377\377\354\377\377\377\350\377\377\377\350\377\377\377\355"
"\377\377\377\353\377\377\377\351\377\377\377\351\377\377\377\351\377\377"
"\377\356\377\377\377\362\377\377\377\371\377\377\377\376\377\377\377\375"
"\377\377\377\367\377\377\377\370\377\377\377\371\377\377\377\372\377\377"
"\377\367\377\377\377\353\377\377\377\334\377\377\377\325\377\377\377\317"
"\377\377\377\314\377\377\377\325\377\377\377\337\377\377\377\352\377\377"
"\377\363\377\377\377\367\377\377\377\365\377\377\377\365\377\377\377\366"
"\377\377\377\365\377\377\377\362\377\377\377\356\377\377\377\351\377\377"
"\377\344\377\377\377\343\377\377\377\346\377\377\377\346\377\377\377\334"
"\377\377\377\325\377\377\377\331\377\377\377\332\377\377\377\332\377\377"
"\377\330\377\377\377\322\377\377\377\330\377\377\377\335\377\377\377\336"
"\377\377\377\341\377\377\377\347\377\377\377\346\377\377\377\351\377\377"
"\377\357\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\371\377\377\377\366\377\377"
"\377\357\377\377\377\355\377\377\377\353\377\377\377\351\377\377\377\353"
"\377\377\377\355\377\377\377\353\377\377\377\351\377\377\377\353\377\377"
"\377\352\377\377\377\360\377\377\377\363\377\377\377\370\377\377\377\377"
"\377\377\377\374\377\377\377\366\377\377\377\367\377\377\377\370\377\377"
"\377\371\377\377\377\370\377\377\377\363\377\377\377\351\377\377\377\341"
"\377\377\377\332\377\377\377\324\377\377\377\330\377\377\377\337\377\377"
"\377\353\377\377\377\363\377\377\377\367\377\377\377\364\377\377\377\361"
"\377\377\377\361\377\377\377\361\377\377\377\356\377\377\377\350\377\377"
"\377\346\377\377\377\346\377\377\377\347\377\377\377\347\377\377\377\347"
"\377\377\377\340\377\377\377\337\377\377\377\342\377\377\377\337\377\377"
"\377\337\377\377\377\334\377\377\377\324\377\377\377\327\377\377\377\337"
"\377\377\377\344\377\377\377\344\377\377\377\350\377\377\377\353\377\377"
"\377\357\377\377\377\364\377\377\377\372\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377"
"\377\370\377\377\377\362\377\377\377\356\377\377\377\352\377\377\377\353"
"\377\377\377\357\377\377\377\361\377\377\377\361\377\377\377\355\377\377"
"\377\360\377\377\377\362\377\377\377\367\377\377\377\371\377\377\377\371"
"\377\377\377\371\377\377\377\370\377\377\377\366\377\377\377\370\377\377"
"\377\370\377\377\377\370\377\377\377\371\377\377\377\371\377\377\377\362"
"\377\377\377\354\377\377\377\343\377\377\377\327\377\377\377\331\377\377"
"\377\337\377\377\377\354\377\377\377\364\377\377\377\365\377\377\377\362"
"\377\377\377\360\377\377\377\354\377\377\377\356\377\377\377\355\377\377"
"\377\350\377\377\377\344\377\377\377\350\377\377\377\353\377\377\377\350"
"\377\377\377\350\377\377\377\351\377\377\377\347\377\377\377\347\377\377"
"\377\345\377\377\377\340\377\377\377\337\377\377\377\334\377\377\377\334"
"\377\377\377\342\377\377\377\352\377\377\377\353\377\377\377\361\377\377"
"\377\364\377\377\377\364\377\377\377\370\377\377\377\372\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\364\377\377\377\360\377\377\377\356"
"\377\377\377\356\377\377\377\361\377\377\377\365\377\377\377\370\377\377"
"\377\364\377\377\377\370\377\377\377\371\377\377\377\373\377\377\377\377"
"\377\377\377\373\377\377\377\365\377\377\377\365\377\377\377\365\377\377"
"\377\365\377\377\377\370\377\377\377\374\377\377\377\373\377\377\377\371"
"\377\377\377\364\377\377\377\356\377\377\377\352\377\377\377\343\377\377"
"\377\337\377\377\377\337\377\377\377\347\377\377\377\353\377\377\377\356"
"\377\377\377\360\377\377\377\362\377\377\377\361\377\377\377\356\377\377"
"\377\354\377\377\377\352\377\377\377\352\377\377\377\353\377\377\377\355"
"\377\377\377\352\377\377\377\357\377\377\377\362\377\377\377\355\377\377"
"\377\352\377\377\377\351\377\377\377\344\377\377\377\346\377\377\377\347"
"\377\377\377\345\377\377\377\350\377\377\377\361\377\377\377\360\377\377"
"\377\365\377\377\377\370\377\377\377\371\377\377\377\373\377\377\377\372"
"\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\373\377\377\377\370\377\377\377\365\377\377\377\364"
"\377\377\377\363\377\377\377\362\377\377\377\363\377\377\377\370\377\377"
"\377\374\377\377\377\375\377\377\377\377\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\370\377\377\377\370\377\377"
"\377\366\377\377\377\363\377\377\377\370\377\377\377\375\377\377\377\372"
"\377\377\377\365\377\377\377\361\377\377\377\352\377\377\377\352\377\377"
"\377\350\377\377\377\340\377\377\377\336\377\377\377\342\377\377\377\343"
"\377\377\377\353\377\377\377\360\377\377\377\362\377\377\377\364\377\377"
"\377\364\377\377\377\361\377\377\377\356\377\377\377\357\377\377\377\361"
"\377\377\377\356\377\377\377\354\377\377\377\364\377\377\377\370\377\377"
"\377\362\377\377\377\357\377\377\377\356\377\377\377\353\377\377\377\354"
"\377\377\377\356\377\377\377\362\377\377\377\363\377\377\377\366\377\377"
"\377\362\377\377\377\367\377\377\377\367\377\377\377\367\377\377\377\371"
"\377\377\377\367\377\377\377\371\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\372\377\377\377\370\377\377\377\371"
"\377\377\377\370\377\377\377\366\377\377\377\367\377\377\377\370\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\371\377\377\377\367\377\377\377\363\377\377\377\363\377\377\377\366"
"\377\377\377\363\377\377\377\361\377\377\377\356\377\377\377\346\377\377"
"\377\345\377\377\377\344\377\377\377\334\377\377\377\334\377\377\377\342"
"\377\377\377\347\377\377\377\361\377\377\377\365\377\377\377\366\377\377"
"\377\373\377\377\377\373\377\377\377\366\377\377\377\361\377\377\377\364"
"\377\377\377\370\377\377\377\364\377\377\377\357\377\377\377\365\377\377"
"\377\372\377\377\377\365\377\377\377\361\377\377\377\362\377\377\377\363"
"\377\377\377\364\377\377\377\362\377\377\377\365\377\377\377\370\377\377"
"\377\374\377\377\377\371\377\377\377\374\377\377\377\375\377\377\377\372"
"\377\377\377\371\377\377\377\373\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\371"
"\377\377\377\374\377\377\377\372\377\377\377\367\377\377\377\371\377\377"
"\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\370\377\377\377\364\377\377\377\361"
"\377\377\377\356\377\377\377\355\377\377\377\355\377\377\377\350\377\377"
"\377\342\377\377\377\342\377\377\377\337\377\377\377\331\377\377\377\331"
"\377\377\377\342\377\377\377\353\377\377\377\365\377\377\377\371\377\377"
"\377\374\377\377\377\377\377\377\377\373\377\377\377\365\377\377\377\364"
"\377\377\377\370\377\377\377\372\377\377\377\373\377\377\377\370\377\377"
"\377\370\377\377\377\372\377\377\377\371\377\377\377\371\377\377\377\371"
"\377\377\377\374\377\377\377\377\377\377\377\372\377\377\377\370\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374"
"\377\377\377\371\377\377\377\372\377\377\377\373\377\377\377\370\377\377"
"\377\370\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\365"
"\377\377\377\365\377\377\377\361\377\377\377\354\377\377\377\350\377\377"
"\377\342\377\377\377\337\377\377\377\343\377\377\377\335\377\377\377\330"
"\377\377\377\330\377\377\377\340\377\377\377\353\377\377\377\365\377\377"
"\377\373\377\377\377\373\377\377\377\373\377\377\377\372\377\377\377\370"
"\377\377\377\371\377\377\377\374\377\377\377\374\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\373\377\377\377\371\377\377\377\366\377\377"
"\377\366\377\377\377\365\377\377\377\367\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373"
"\377\377\377\371\377\377\377\370\377\377\377\365\377\377\377\355\377\377"
"\377\347\377\377\377\347\377\377\377\347\377\377\377\350\377\377\377\346"
"\377\377\377\341\377\377\377\336\377\377\377\345\377\377\377\357\377\377"
"\377\367\377\377\377\371\377\377\377\371\377\377\377\371\377\377\377\370"
"\377\377\377\372\377\377\377\375\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\371\377\377"
"\377\362\377\377\377\362\377\377\377\361\377\377\377\365\377\377\377\376"
"\377\377\377\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\376\377\377\377\374\377\377\377\374\377\377\377\370\377\377"
"\377\364\377\377\377\361\377\377\377\362\377\377\377\361\377\377\377\356"
"\377\377\377\355\377\377\377\352\377\377\377\346\377\377\377\350\377\377"
"\377\360\377\377\377\366\377\377\377\367\377\377\377\366\377\377\377\370"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377"
"\377\367\377\377\377\362\377\377\377\361\377\377\377\361\377\377\377\361"
"\377\377\377\366\377\377\377\371\377\377\377\373\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\375\377\377"
"\377\374\377\377\377\374\377\377\377\373\377\377\377\373\377\377\377\372"
"\377\377\377\367\377\377\377\363\377\377\377\362\377\377\377\362\377\377"
"\377\363\377\377\377\364\377\377\377\367\377\377\377\371\377\377\377\367"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\372\377\377\377\372\377\377\377\365\377\377\377\360\377\377\377\362"
"\377\377\377\361\377\377\377\361\377\377\377\366\377\377\377\370\377\377"
"\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\372\377\377\377\367\377\377"
"\377\370\377\377\377\372\377\377\377\373\377\377\377\372\377\377\377\372"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\363"
"\377\377\377\362\377\377\377\363\377\377\377\364\377\377\377\367\377\377"
"\377\363\377\377\377\361\377\377\377\372\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\374\377\377"
"\377\372\377\377\377\372\377\377\377\375\377\377\377\377\377\377\377\375"
"\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\371\377\377\377\364\377\377\377\367\377\377\377\366\377\377"
"\377\362\377\377\377\360\377\377\377\361\377\377\377\367\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\375\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\374\377\377\377\374\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\372\377\377\377\372\377\377"
"\377\364\377\377\377\355\377\377\377\355\377\377\377\363\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\374\377\377\377\374\377\377\377\373\377\377\377\372\377\377\377\374"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\375\377\377\377\376\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\367\377\377\377\363\377\377\377\361\377\377\377\360\377\377\377\365"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\376\377\377"
"\377\371\377\377\377\366\377\377\377\367\377\377\377\364\377\377\377\364"
"\377\377\377\371\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\373\377\377\377\361\377\377\377\361\377\377\377\365\377\377\377\366"
"\377\377\377\370\377\377\377\372\377\377\377\373\377\377\377\375\377\377"
"\377\374\377\377\377\372\377\377\377\370\377\377\377\366\377\377\377\364"
"\377\377\377\364\377\377\377\366\377\377\377\375\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\370\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\371\377\377\377\364\377\377\377\362\377\377\377\366"
"\377\377\377\370\377\377\377\370\377\377\377\370\377\377\377\371\377\377"
"\377\372\377\377\377\371\377\377\377\371\377\377\377\366\377\377\377\364"
"\377\377\377\364\377\377\377\366\377\377\377\370\377\377\377\373\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\373\377\377"
"\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\374\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\372\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\376"
"\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\373\377\377\377\367\377\377\377\366\377\377\377\370"
"\377\377\377\373\377\377\377\372\377\377\377\365\377\377\377\364\377\377"
"\377\364\377\377\377\370\377\377\377\371\377\377\377\371\377\377\377\370"
"\377\377\377\366\377\377\377\363\377\377\377\366\377\377\377\373\377\377"
"\377\375\377\377\377\375\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\367\377\377\377\361\377\377"
"\377\362\377\377\377\366\377\377\377\366\377\377\377\372\377\377\377\376"
"\377\377\377\375\377\377\377\374\377\377\377\375\377\377\377\375\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\372\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\374\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\372\377\377\377\366\377\377\377\367"
"\377\377\377\371\377\377\377\373\377\377\377\374\377\377\377\371\377\377"
"\377\364\377\377\377\361\377\377\377\362\377\377\377\361\377\377\377\363"
"\377\377\377\367\377\377\377\370\377\377\377\365\377\377\377\365\377\377"
"\377\372\377\377\377\376\377\377\377\375\377\377\377\374\377\377\377\374"
"\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\356\377\377"
"\377\353\377\377\377\351\377\377\377\347\377\377\377\351\377\377\377\362"
"\377\377\377\372\377\377\377\370\377\377\377\364\377\377\377\370\377\377"
"\377\375\377\377\377\372\377\377\377\372\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\375\377\377"
"\377\372\377\377\377\370\377\377\377\370\377\377\377\372\377\377\377\370"
"\377\377\377\365\377\377\377\366\377\377\377\370\377\377\377\374\377\377"
"\377\374\377\377\377\371\377\377\377\363\377\377\377\356\377\377\377\351"
"\377\377\377\354\377\377\377\360\377\377\377\362\377\377\377\363\377\377"
"\377\364\377\377\377\371\377\377\377\374\377\377\377\374\377\377\377\373"
"\377\377\377\372\377\377\377\371\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\364\377\377"
"\377\353\377\377\377\347\377\377\377\343\377\377\377\335\377\377\377\336"
"\377\377\377\351\377\377\377\361\377\377\377\361\377\377\377\361\377\377"
"\377\363\377\377\377\370\377\377\377\370\377\377\377\366\377\377\377\367"
"\377\377\377\374",
};

File diff suppressed because it is too large Load Diff

View File

@ -28,65 +28,63 @@
#include "vrml_aux.h"
char SkipGetChar ( FILE* File )
char SkipGetChar( FILE* File )
{
char c;
bool re_parse;
char c;
bool re_parse;
if( (c = fgetc( File )) == EOF )
if( ( c = fgetc( File ) ) == EOF )
{
//DBG( printf( "EOF\n" ) );
// DBG( printf( "EOF\n" ) );
return EOF;
}
//DBG( printf( "c %c 0x%02X\n", c, c ) );
// DBG( printf( "c %c 0x%02X\n", c, c ) );
do
{
re_parse = false;
if ((c == ' ') || (c == '\t') || (c == '{') || (c == '['))
if( (c == ' ') || (c == '\t') || (c == '{') || (c == '[') )
{
//DBG( printf( "Skipping space \\t or { or [\n" ) );
// DBG( printf( "Skipping space \\t or { or [\n" ) );
do
{
if( (c = fgetc( File )) == EOF )
if( ( c = fgetc( File ) ) == EOF )
{
//DBG( printf( "EOF\n" ) );
// DBG( printf( "EOF\n" ) );
return EOF;
}
}
while((c == ' ') || (c == '\t') || (c == '{') || (c == '['));
} while( (c == ' ') || (c == '\t') || (c == '{') || (c == '[') );
}
if ((c == '#') || (c == '\n') || (c == '\r') || (c == 0) || (c == ','))
if( (c == '#') || (c == '\n') || (c == '\r') || (c == 0) || (c == ',') )
{
if (c == '#')
if( c == '#' )
{
//DBG( printf( "Skipping # \\n or \\r or 0, 0x%02X\n", c ) );
// DBG( printf( "Skipping # \\n or \\r or 0, 0x%02X\n", c ) );
do
{
if( (c = fgetc( File )) == EOF )
if( ( c = fgetc( File ) ) == EOF )
{
//DBG( printf( "EOF\n" ) );
// DBG( printf( "EOF\n" ) );
return EOF;
}
}
while((c != '\n') && (c != '\r') && (c != 0) && (c != ','));
} while( (c != '\n') && (c != '\r') && (c != 0) && (c != ',') );
}
else
{
if( (c = fgetc( File )) == EOF )
if( ( c = fgetc( File ) ) == EOF )
{
//DBG( printf( "EOF\n" ) );
// DBG( printf( "EOF\n" ) );
return EOF;
}
}
re_parse = true;
}
}while(re_parse == true);
} while( re_parse == true );
return c;
}
@ -94,34 +92,38 @@ char SkipGetChar ( FILE* File )
char* GetNextTag( FILE* File, char* tag )
{
char c = SkipGetChar( File );
if (c == EOF)
if( c == EOF )
{
return NULL;
}
tag[0] = c;
tag[1] = 0;
//DBG( printf( "tag[0] %c\n", tag[0] ) );
tag[0] = c;
tag[1] = 0;
// DBG( printf( "tag[0] %c\n", tag[0] ) );
if( (c != '}') && (c != ']') )
{
char *dst = &tag[1];
while (fscanf( File, "%c", dst))
char* dst = &tag[1];
while( fscanf( File, "%c", dst ) )
{
if( (*dst == ' ') || (*dst == '[') || (*dst == '{') || (*dst == '\t') || (*dst == '\n')|| (*dst == '\r') )
if( (*dst == ' ') || (*dst == '[') || (*dst == '{')
|| (*dst == '\t') || (*dst == '\n')|| (*dst == '\r') )
{
*dst = 0;
break;
}
dst++;
}
//DBG( printf( "tag %s\n", tag ) );
// DBG( printf( "tag %s\n", tag ) );
c = SkipGetChar( File );
if (c != EOF)
if( c != EOF )
{
// Puts again the read char in the buffer
ungetc( c, File );
@ -132,40 +134,44 @@ char* GetNextTag( FILE* File, char* tag )
}
int read_NotImplemented( FILE* File, char closeChar)
int read_NotImplemented( FILE* File, char closeChar )
{
char c;
//DBG( printf( "look for %c\n", closeChar) );
while( (c = fgetc( File )) != EOF )
// DBG( printf( "look for %c\n", closeChar) );
while( ( c = fgetc( File ) ) != EOF )
{
if( c == '{' )
{
//DBG( printf( "{\n") );
// DBG( printf( "{\n") );
read_NotImplemented( File, '}' );
} else if( c == '[' )
}
else if( c == '[' )
{
//DBG( printf( "[\n") );
// DBG( printf( "[\n") );
read_NotImplemented( File, ']' );
} else if( c == closeChar )
}
else if( c == closeChar )
{
//DBG( printf( "%c\n", closeChar) );
// DBG( printf( "%c\n", closeChar) );
return 0;
}
}
DBG( printf( " NotImplemented failed\n" ) );
// DBG( printf( " NotImplemented failed\n" ) );
return -1;
}
int parseVertexList( FILE* File, std::vector< glm::vec3 > &dst_vector)
int parseVertexList( FILE* File, std::vector<glm::vec3>& dst_vector )
{
//DBG( printf( " parseVertexList\n" ) );
// DBG( printf( " parseVertexList\n" ) );
dst_vector.clear();
glm::vec3 vertex;
while( parseVertex ( File, vertex ) == 3 )
while( parseVertex( File, vertex ) == 3 )
{
dst_vector.push_back( vertex );
}
@ -174,32 +180,34 @@ int parseVertexList( FILE* File, std::vector< glm::vec3 > &dst_vector)
}
int parseVertex( FILE* File, glm::vec3 &dst_vertex )
int parseVertex( FILE* File, glm::vec3& dst_vertex )
{
float a,b,c;
int ret = fscanf( File, "%e %e %e", &a, &b, &c );
float a, b, c;
int ret = fscanf( File, "%e %e %e", &a, &b, &c );
dst_vertex.x = a;
dst_vertex.y = b;
dst_vertex.z = c;
dst_vertex.x = a;
dst_vertex.y = b;
dst_vertex.z = c;
char s = SkipGetChar( File );
if (s != EOF)
if( s != EOF )
{
// Puts again the read char in the buffer
ungetc( s, File );
}
//DBG( printf( "ret%d(%.9f,%.9f,%.9f)", ret, a,b,c) );
// DBG( printf( "ret%d(%.9f,%.9f,%.9f)", ret, a,b,c) );
return ret;
}
int parseFloat( FILE* File, float *dst_float )
int parseFloat( FILE* File, float* dst_float )
{
float value;
int ret = fscanf( File, "%e", &value );
float value;
int ret = fscanf( File, "%e", &value );
*dst_float = value;
return ret;

View File

@ -40,7 +40,7 @@ VRML1_MODEL_PARSER::VRML1_MODEL_PARSER( S3D_MASTER* aMaster ) :
S3D_MODEL_PARSER( aMaster )
{
m_model = NULL;
m_file = NULL;
m_file = NULL;
}
@ -48,16 +48,16 @@ VRML1_MODEL_PARSER::~VRML1_MODEL_PARSER()
{
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
delete childs[idx];
delete childs[idx];
}
}
void VRML1_MODEL_PARSER::Load( const wxString aFilename )
void VRML1_MODEL_PARSER::Load( const wxString& aFilename, double aVrmlunits_to_3Dunits )
{
char text[128];
char text[128];
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
// DBG( printf( "Load %s\n", GetChars(aFilename) ) );
m_file = wxFopen( aFilename, wxT( "rt" ) );
if( m_file == NULL )
@ -65,37 +65,35 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
return;
}
glShadeModel( GL_SMOOTH );
glEnable( GL_NORMALIZE );
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
float vrmlunits_to_3Dunits = aVrmlunits_to_3Dunits;
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y,
GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y,
GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y,
GetMaster()->m_MatPosition.z );
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
#define SCALE_3D_CONV ( (IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB )
//glPushMatrix();
// glPushMatrix();
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
glScalef( matScale.x, matScale.y, matScale.z );
glRotatef( -matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef( -matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef( -matRot.x, 1.0f, 0.0f, 0.0f );
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
glScalef( matScale.x, matScale.y, matScale.z );
LOCALE_IO toggle; // Switch the locale to standard C
childs.clear();
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
{
continue;
}
@ -103,18 +101,14 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
if( strcmp( text, "Separator" ) == 0 )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
read_separator();
}
}
fclose( m_file );
SetLocaleTo_Default(); // revert to the current locale
//DBG( printf( "chils size:%lu\n", childs.size() ) );
// DBG( printf( "chils size:%lu\n", childs.size() ) );
if( GetMaster()->IsOpenGlAllowed() )
{
@ -125,29 +119,32 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
}
}
int VRML1_MODEL_PARSER::read_separator()
{
char text[128];
char text[128];
//DBG( printf( "Separator\n" ) );
// DBG( printf( "Separator\n" ) );
while( GetNextTag( m_file, text) )
while( GetNextTag( m_file, text ) )
{
if( strcmp( text, "Material" ) == 0 )
{
readMaterial( );
} else if( strcmp( text, "Coordinate3" ) == 0 )
readMaterial();
}
else if( strcmp( text, "Coordinate3" ) == 0 )
{
readCoordinate3();
} else if( strcmp( text, "IndexedFaceSet" ) == 0 )
}
else if( strcmp( text, "IndexedFaceSet" ) == 0 )
{
readIndexedFaceSet();
} else if( strcmp( text, "Separator" ) == 0 )
}
else if( strcmp( text, "Separator" ) == 0 )
{
S3D_MESH *parent = m_model;
S3D_MESH* parent = m_model;
S3D_MESH *new_mesh_model = new S3D_MESH();
S3D_MESH* new_mesh_model = new S3D_MESH();
m_model->childs.push_back( new_mesh_model );
@ -157,11 +154,13 @@ int VRML1_MODEL_PARSER::read_separator()
read_separator();
m_model = parent;
}else if ( ( *text != '}' ) )
}
else if( ( *text != '}' ) )
{
//DBG( printf( "read_NotImplemented %s\n", text ) );
read_NotImplemented( m_file, '}');
} else
// DBG( printf( "read_NotImplemented %s\n", text ) );
read_NotImplemented( m_file, '}' );
}
else
{
break;
}
@ -173,12 +172,12 @@ int VRML1_MODEL_PARSER::read_separator()
int VRML1_MODEL_PARSER::readMaterial()
{
char text[128];
char text[128];
S3D_MATERIAL* material = NULL;
//DBG( printf( " readMaterial\n" ) );
// DBG( printf( " readMaterial\n" ) );
wxString mat_name;
wxString mat_name;
material = new S3D_MATERIAL( GetMaster(), mat_name );
@ -188,12 +187,12 @@ int VRML1_MODEL_PARSER::readMaterial()
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
return 0;
}
@ -201,21 +200,26 @@ int VRML1_MODEL_PARSER::readMaterial()
if( strcmp( text, "ambientColor" ) == 0 )
{
readMaterial_ambientColor();
} else if( strcmp( text, "diffuseColor" ) == 0 )
}
else if( strcmp( text, "diffuseColor" ) == 0 )
{
readMaterial_diffuseColor( );
} else if( strcmp( text, "emissiveColor" ) == 0 )
readMaterial_diffuseColor();
}
else if( strcmp( text, "emissiveColor" ) == 0 )
{
readMaterial_emissiveColor( );
}else if( strcmp( text, "specularColor" ) == 0 )
readMaterial_emissiveColor();
}
else if( strcmp( text, "specularColor" ) == 0 )
{
readMaterial_specularColor( );
}else if( strcmp( text, "shininess" ) == 0 )
readMaterial_specularColor();
}
else if( strcmp( text, "shininess" ) == 0 )
{
readMaterial_shininess( );
}else if( strcmp( text, "transparency" ) == 0 )
readMaterial_shininess();
}
else if( strcmp( text, "transparency" ) == 0 )
{
readMaterial_transparency( );
readMaterial_transparency();
}
}
@ -223,27 +227,27 @@ int VRML1_MODEL_PARSER::readMaterial()
}
int VRML1_MODEL_PARSER::readCoordinate3( )
int VRML1_MODEL_PARSER::readCoordinate3()
{
char text[128];
char text[128];
//DBG( printf( " readCoordinate3\n" ) );
// DBG( printf( " readCoordinate3\n" ) );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "point" ) == 0 )
{
readCoordinate3_point( );
readCoordinate3_point();
}
}
@ -251,59 +255,61 @@ int VRML1_MODEL_PARSER::readCoordinate3( )
}
int VRML1_MODEL_PARSER::readIndexedFaceSet( )
int VRML1_MODEL_PARSER::readIndexedFaceSet()
{
char text[128];
char text[128];
//DBG( printf( " readIndexedFaceSet\n" ) );
// DBG( printf( " readIndexedFaceSet\n" ) );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "coordIndex" ) == 0 )
{
readIndexedFaceSet_coordIndex( );
} else if( strcmp( text, "materialIndex" ) == 0 )
readIndexedFaceSet_coordIndex();
}
else if( strcmp( text, "materialIndex" ) == 0 )
{
readIndexedFaceSet_materialIndex( );
readIndexedFaceSet_materialIndex();
}
}
return -1;
}
int VRML1_MODEL_PARSER::readMaterial_ambientColor( )
{
//DBG( printf( " readMaterial_ambientColor\n" ) );
return parseVertexList( m_file, m_model->m_Materials->m_AmbientColor);
int VRML1_MODEL_PARSER::readMaterial_ambientColor()
{
// DBG( printf( " readMaterial_ambientColor\n" ) );
return parseVertexList( m_file, m_model->m_Materials->m_AmbientColor );
}
int VRML1_MODEL_PARSER::readMaterial_diffuseColor( )
int VRML1_MODEL_PARSER::readMaterial_diffuseColor()
{
//DBG( printf( " readMaterial_diffuseColor\n" ) );
return parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor);
// DBG( printf( " readMaterial_diffuseColor\n" ) );
return parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor );
}
int VRML1_MODEL_PARSER::readMaterial_emissiveColor( )
int VRML1_MODEL_PARSER::readMaterial_emissiveColor()
{
//DBG( printf( " readMaterial_emissiveColor\n" ) );
// DBG( printf( " readMaterial_emissiveColor\n" ) );
int ret = parseVertexList( m_file, m_model->m_Materials->m_EmissiveColor);
int ret = parseVertexList( m_file, m_model->m_Materials->m_EmissiveColor );
if( GetMaster()->m_use_modelfile_emissiveColor == false)
if( GetMaster()->m_use_modelfile_emissiveColor == false )
{
m_model->m_Materials->m_EmissiveColor.clear();
}
@ -314,11 +320,11 @@ int VRML1_MODEL_PARSER::readMaterial_emissiveColor( )
int VRML1_MODEL_PARSER::readMaterial_specularColor()
{
//DBG( printf( " readMaterial_specularColor\n" ) );
// DBG( printf( " readMaterial_specularColor\n" ) );
int ret = parseVertexList( m_file, m_model->m_Materials->m_SpecularColor );
if( GetMaster()->m_use_modelfile_specularColor == false)
if( GetMaster()->m_use_modelfile_specularColor == false )
{
m_model->m_Materials->m_SpecularColor.clear();
}
@ -327,13 +333,14 @@ int VRML1_MODEL_PARSER::readMaterial_specularColor()
}
int VRML1_MODEL_PARSER::readMaterial_shininess( )
int VRML1_MODEL_PARSER::readMaterial_shininess()
{
//DBG( printf( " readMaterial_shininess\n" ) );
// DBG( printf( " readMaterial_shininess\n" ) );
m_model->m_Materials->m_Shininess.clear();
float shininess_value;
while( fscanf( m_file, "%f,", &shininess_value ) )
{
// VRML value is normalized and openGL expects a value 0 - 128
@ -346,7 +353,7 @@ int VRML1_MODEL_PARSER::readMaterial_shininess( )
m_model->m_Materials->m_Shininess.clear();
}
//DBG( printf( " m_Shininess.size: %ld\n", m_model->m_Materials->m_Shininess.size() ) );
// DBG( printf( " m_Shininess.size: %ld\n", m_model->m_Materials->m_Shininess.size() ) );
return 0;
}
@ -354,12 +361,13 @@ int VRML1_MODEL_PARSER::readMaterial_shininess( )
int VRML1_MODEL_PARSER::readMaterial_transparency()
{
//DBG( printf( " readMaterial_transparency\n" ) );
// DBG( printf( " readMaterial_transparency\n" ) );
m_model->m_Materials->m_Transparency.clear();
float tmp;
while( fscanf (m_file, "%f,", &tmp) )
while( fscanf( m_file, "%f,", &tmp ) )
{
m_model->m_Materials->m_Transparency.push_back( tmp );
}
@ -368,8 +376,8 @@ int VRML1_MODEL_PARSER::readMaterial_transparency()
{
m_model->m_Materials->m_Transparency.clear();
}
//DBG( printf( " m_Transparency.size: %ld\n", m_model->m_Materials->m_Transparency.size() ) );
// DBG( printf( " m_Transparency.size: %ld\n", m_model->m_Materials->m_Transparency.size() ) );
return 0;
}
@ -377,8 +385,8 @@ int VRML1_MODEL_PARSER::readMaterial_transparency()
int VRML1_MODEL_PARSER::readCoordinate3_point()
{
//DBG( printf( " readCoordinate3_point\n" ) );
// DBG( printf( " readCoordinate3_point\n" ) );
if( parseVertexList( m_file, m_model->m_Point ) == 0 )
{
return 0;
@ -390,13 +398,14 @@ int VRML1_MODEL_PARSER::readCoordinate3_point()
int VRML1_MODEL_PARSER::readIndexedFaceSet_coordIndex()
{
//DBG( printf( " readIndexedFaceSet_coordIndex\n" ) );
// DBG( printf( " readIndexedFaceSet_coordIndex\n" ) );
m_model->m_CoordIndex.clear();
glm::ivec3 coord;
int dummy; // should be -1
int dummy; // should be -1
while( fscanf( m_file, "%d,%d,%d,%d,", &coord[0], &coord[1], &coord[2], &dummy ) )
{
std::vector<int> coord_list;
@ -406,21 +415,22 @@ int VRML1_MODEL_PARSER::readIndexedFaceSet_coordIndex()
coord_list[1] = coord[1];
coord_list[2] = coord[2];
if( (coord[0] == coord[1]) ||
(coord[0] == coord[2]) ||
(coord[2] == coord[1]) )
if( (coord[0] == coord[1])
|| (coord[0] == coord[2])
|| (coord[2] == coord[1]) )
{
//DBG( printf( " invalid coordIndex at index %lu (%d, %d, %d, %d)\n", m_model->m_CoordIndex.size()+1,coord[0], coord[1], coord[2], dummy ) );
// DBG( printf( " invalid coordIndex at index %lu (%d, %d, %d, %d)\n", m_model->m_CoordIndex.size()+1,coord[0], coord[1], coord[2], dummy ) );
}
if (dummy != -1)
if( dummy != -1 )
{
//DBG( printf( " Error at index %lu, -1 Expected, got %d\n", m_model->m_CoordIndex.size()+1, dummy ) );
// DBG( printf( " Error at index %lu, -1 Expected, got %d\n", m_model->m_CoordIndex.size()+1, dummy ) );
}
m_model->m_CoordIndex.push_back( coord_list );
}
//DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
// DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
return 0;
}
@ -428,17 +438,18 @@ int VRML1_MODEL_PARSER::readIndexedFaceSet_coordIndex()
int VRML1_MODEL_PARSER::readIndexedFaceSet_materialIndex()
{
//DBG( printf( " readIndexedFaceSet_materialIndex\n" ) );
// DBG( printf( " readIndexedFaceSet_materialIndex\n" ) );
m_model->m_MaterialIndex.clear();
int index;
while( fscanf( m_file, "%d,", &index ) )
{
m_model->m_MaterialIndex.push_back( index );
}
//DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
// DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
return 0;
}

View File

@ -48,18 +48,18 @@ VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MASTER* aMaster ) :
VRML2_MODEL_PARSER::~VRML2_MODEL_PARSER()
{
for(unsigned int idx = 0; idx < childs.size(); idx++)
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
delete childs[idx];
delete childs[idx];
}
}
void VRML2_MODEL_PARSER::Load( const wxString aFilename )
void VRML2_MODEL_PARSER::Load( const wxString& aFilename, double aVrmlunits_to_3Dunits )
{
char text[128];
char text[128];
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
// DBG( printf( "Load %s\n", GetChars(aFilename) ) );
m_file = wxFopen( aFilename, wxT( "rt" ) );
if( m_file == NULL )
@ -67,25 +67,25 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
return;
}
glShadeModel(GL_SMOOTH);
glEnable(GL_NORMALIZE);
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
float vrmlunits_to_3Dunits = aVrmlunits_to_3Dunits;
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y,
GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y,
GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y,
GetMaster()->m_MatPosition.z );
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
#define SCALE_3D_CONV ( (IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB )
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
glRotatef( -matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef( -matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef( -matRot.x, 1.0f, 0.0f, 0.0f );
glScalef( matScale.x, matScale.y, matScale.z );
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
@ -95,7 +95,6 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
while( GetNextTag( m_file, text ) )
{
if( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
{
continue;
@ -104,15 +103,13 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
if( strcmp( text, "Transform" ) == 0 )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
read_Transform();
} else if( strcmp( text, "DEF" ) == 0 )
}
else if( strcmp( text, "DEF" ) == 0 )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
read_DEF();
@ -123,7 +120,7 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
SetLocaleTo_Default(); // revert to the current locale
//DBG( printf( "chils size:%lu\n", childs.size() ) );
// DBG( printf( "chils size:%lu\n", childs.size() ) );
if( GetMaster()->IsOpenGlAllowed() )
{
@ -137,58 +134,98 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
int VRML2_MODEL_PARSER::read_Transform()
{
char text[128];
char text[128];
//DBG( printf( "Transform\n" ) );
// DBG( printf( "Transform\n" ) );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
//DBG( printf( " } Exit Transform\n" ) );
// DBG( printf( " } Exit Transform\n" ) );
break;
}
if( strcmp( text, "translation" ) == 0 )
{
parseVertex( m_file, m_model->m_translation );
} else if( strcmp( text, "rotation" ) == 0 )
}
else if( strcmp( text, "rotation" ) == 0 )
{
fscanf( m_file, "%f %f %f %f", &m_model->m_rotation[0], &m_model->m_rotation[1], &m_model->m_rotation[2], &m_model->m_rotation[3]);
m_model->m_rotation[3] = m_model->m_rotation[3] * 180.0f / 3.14f; // !TODO: use constants or functions
} else if( strcmp( text, "scale" ) == 0 )
if( fscanf( m_file, "%f %f %f %f", &m_model->m_rotation[0],
&m_model->m_rotation[1],
&m_model->m_rotation[2],
&m_model->m_rotation[3] ) != 4 )
{
// !TODO: log errors
m_model->m_rotation[0] = 0.0f;
m_model->m_rotation[1] = 0.0f;
m_model->m_rotation[2] = 0.0f;
m_model->m_rotation[3] = 0.0f;
}
else
{
m_model->m_rotation[3] = m_model->m_rotation[3] * 180.0f / 3.14f; // !TODO: use constants or functions
}
}
else if( strcmp( text, "scale" ) == 0 )
{
parseVertex( m_file, m_model->m_scale );
} else if( strcmp( text, "scaleOrientation" ) == 0 )
}
else if( strcmp( text, "scaleOrientation" ) == 0 )
{
fscanf( m_file, "%f %f %f %f", &m_model->m_scaleOrientation[0], &m_model->m_scaleOrientation[1], &m_model->m_scaleOrientation[2], &m_model->m_scaleOrientation[3]);
} else if( strcmp( text, "center" ) == 0 )
// this m_scaleOrientation is not implemented, but it will be parsed
if( fscanf( m_file, "%f %f %f %f", &m_model->m_scaleOrientation[0],
&m_model->m_scaleOrientation[1],
&m_model->m_scaleOrientation[2],
&m_model->m_scaleOrientation[3] ) != 4 )
{
// !TODO: log errors
m_model->m_scaleOrientation[0] = 0.0f;
m_model->m_scaleOrientation[1] = 0.0f;
m_model->m_scaleOrientation[2] = 0.0f;
m_model->m_scaleOrientation[3] = 0.0f;
}
}
else if( strcmp( text, "center" ) == 0 )
{
parseVertex( m_file, m_model->m_center );
} else if( strcmp( text, "children" ) == 0 )
}
else if( strcmp( text, "children" ) == 0 )
{
// skip
} else if( strcmp( text, "Switch" ) == 0 )
}
else if( strcmp( text, "Switch" ) == 0 )
{
// skip
} else if( strcmp( text, "whichChoice" ) == 0 )
}
else if( strcmp( text, "whichChoice" ) == 0 )
{
int dummy;
fscanf( m_file, "%d", &dummy );
} else if( strcmp( text, "choice" ) == 0 )
{
// skip
} else if( strcmp( text, "Group" ) == 0 )
{
// skip
} else if( strcmp( text, "Shape" ) == 0 )
{
S3D_MESH *parent = m_model;
S3D_MESH *new_mesh_model = new S3D_MESH();
if( fscanf( m_file, "%d", &dummy ) != 1 )
{
// !TODO: log errors
}
}
else if( strcmp( text, "choice" ) == 0 )
{
// skip
}
else if( strcmp( text, "Group" ) == 0 )
{
// skip
}
else if( strcmp( text, "Shape" ) == 0 )
{
S3D_MESH* parent = m_model;
S3D_MESH* new_mesh_model = new S3D_MESH();
m_model->childs.push_back( new_mesh_model );
@ -197,134 +234,141 @@ int VRML2_MODEL_PARSER::read_Transform()
read_Shape();
m_model = parent;
} else if( strcmp( text, "DEF" ) == 0 )
}
else if( strcmp( text, "DEF" ) == 0 )
{
read_DEF();
} else
}
else
{
DBG( printf( " %s NotImplemented\n", text ) );
// DBG( printf( " %s NotImplemented\n", text ) );
read_NotImplemented( m_file, '}' );
}
}
return 0;
}
int VRML2_MODEL_PARSER::read_DEF()
{
char text[128];
char text[128];
GetNextTag( m_file, text);
//DBG( printf( "DEF %s ", text ) );
GetNextTag( m_file, text );
// DBG( printf( "DEF %s ", text ) );
while( GetNextTag( m_file, text ) )
{
if( ( text == NULL ) || ( *text == ']' ) )
{
//DBG( printf( " skiping %c\n", *text) );
// DBG( printf( " skiping %c\n", *text) );
continue;
}
if( ( *text == '}' ) )
{
//DBG( printf( " } Exit DEF\n") );
// DBG( printf( " } Exit DEF\n") );
return 0;
}
if( strcmp( text, "Transform" ) == 0 )
{
return read_Transform ();
} else if( strcmp( text, "children" ) == 0 )
return read_Transform();
}
else if( strcmp( text, "children" ) == 0 )
{
// skip
} else if( strcmp( text, "Switch" ) == 0 )
}
else if( strcmp( text, "Switch" ) == 0 )
{
// skip
} else if( strcmp( text, "whichChoice" ) == 0 )
}
else if( strcmp( text, "whichChoice" ) == 0 )
{
// skip
} else if( strcmp( text, "choice" ) == 0 )
}
else if( strcmp( text, "choice" ) == 0 )
{
// skip
}else if( strcmp( text, "Shape" ) == 0 )
}
else if( strcmp( text, "Shape" ) == 0 )
{
S3D_MESH *parent = m_model;
S3D_MESH *new_mesh_model = new S3D_MESH();
S3D_MESH* parent = m_model;
S3D_MESH* new_mesh_model = new S3D_MESH();
m_model->childs.push_back( new_mesh_model );
m_model = new_mesh_model;
read_Shape();
m_model = parent;
}
}
DBG( printf( " DEF failed\n" ) );
// DBG( printf( " DEF failed\n" ) );
return -1;
}
int VRML2_MODEL_PARSER::read_Shape()
{
char text[128];
char text[128];
//DBG( printf( " Shape\n") );
// DBG( printf( " Shape\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
//DBG( printf( " } Exit Shape\n") );
// DBG( printf( " } Exit Shape\n") );
return 0;
}
if( strcmp( text, "appearance" ) == 0 )
{
//skip
} else if( strcmp( text, "Appearance" ) == 0 )
// skip
}
else if( strcmp( text, "Appearance" ) == 0 )
{
read_Appearance();
} else if( strcmp( text, "geometry" ) == 0 )
}
else if( strcmp( text, "geometry" ) == 0 )
{
//skip
} else if( strcmp( text, "IndexedFaceSet" ) == 0 )
// skip
}
else if( strcmp( text, "IndexedFaceSet" ) == 0 )
{
read_IndexedFaceSet();
} else
}
else
{
DBG( printf( " %s NotImplemented\n", text ) );
// DBG( printf( " %s NotImplemented\n", text ) );
read_NotImplemented( m_file, '}' );
}
}
DBG( printf( " Shape failed\n") );
// DBG( printf( " Shape failed\n" ) );
return -1;
}
int VRML2_MODEL_PARSER::read_Appearance()
{
char text[128];
char text[128];
//DBG( printf( " Appearance\n") );
// DBG( printf( " Appearance\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
return 0;
}
@ -335,7 +379,7 @@ int VRML2_MODEL_PARSER::read_Appearance()
}
}
DBG( printf( " Appearance failed\n") );
// DBG( printf( " Appearance failed\n" ) );
return -1;
}
@ -343,40 +387,37 @@ int VRML2_MODEL_PARSER::read_Appearance()
int VRML2_MODEL_PARSER::read_material()
{
S3D_MATERIAL* material = NULL;
char text[128];
//DBG( printf( " material ") );
char text[128];
// DBG( printf( " material ") );
if( GetNextTag( m_file, text ) )
{
{
if( strcmp( text, "Material" ) == 0 )
{
wxString mat_name;
wxString mat_name;
material = new S3D_MATERIAL( GetMaster(), mat_name );
GetMaster()->Insert( material );
m_model->m_Materials = material;
if( strcmp( text, "Material" ) == 0 )
{
return read_Material();
}
} else if( strcmp( text, "DEF" ) == 0 )
}
else if( strcmp( text, "DEF" ) == 0 )
{
//DBG( printf( "DEF") );
// DBG( printf( "DEF") );
if( GetNextTag( m_file, text ) )
{
//DBG( printf( "%s", text ) );
{
// DBG( printf( "%s", text ) );
wxString mat_name;
wxString mat_name;
mat_name = FROM_UTF8( text );
material = new S3D_MATERIAL( GetMaster(), mat_name );
GetMaster()->Insert( material );
m_model->m_Materials = material;
if( GetNextTag( m_file, text ) )
@ -387,15 +428,16 @@ int VRML2_MODEL_PARSER::read_material()
}
}
}
} else if( strcmp( text, "USE" ) == 0 )
}
else if( strcmp( text, "USE" ) == 0 )
{
//DBG( printf( "USE") );
// DBG( printf( "USE") );
if( GetNextTag( m_file, text ) )
{
//DBG( printf( "%s\n", text ) );
{
// DBG( printf( "%s\n", text ) );
wxString mat_name;
wxString mat_name;
mat_name = FROM_UTF8( text );
for( material = GetMaster()->m_Materials; material; material = material->Next() )
@ -406,82 +448,94 @@ int VRML2_MODEL_PARSER::read_material()
return 0;
}
}
DBG( printf( " read_material error: material not found\n" ) );
}
}
}
DBG( printf( " failed material\n") );
// DBG( printf( " failed material\n" ) );
return -1;
}
int VRML2_MODEL_PARSER::read_Material()
{
char text[128];
char text[128];
glm::vec3 vertex;
//DBG( printf( " Material\n") );
// DBG( printf( " Material\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "diffuseColor" ) == 0 )
{
//DBG( printf( " diffuseColor") );
parseVertex ( m_file, vertex);
//DBG( printf( "\n") );
// DBG( printf( " diffuseColor") );
parseVertex( m_file, vertex );
// DBG( printf( "\n") );
m_model->m_Materials->m_DiffuseColor.push_back( vertex );
} else if( strcmp( text, "emissiveColor" ) == 0 )
}
else if( strcmp( text, "emissiveColor" ) == 0 )
{
//DBG( printf( " emissiveColor") );
parseVertex ( m_file, vertex);
//DBG( printf( "\n") );
// DBG( printf( " emissiveColor") );
parseVertex( m_file, vertex );
// DBG( printf( "\n") );
if( GetMaster()->m_use_modelfile_emissiveColor == true )
{
m_model->m_Materials->m_EmissiveColor.push_back( vertex );
}
} else if( strcmp( text, "specularColor" ) == 0 )
}
else if( strcmp( text, "specularColor" ) == 0 )
{
//DBG( printf( " specularColor") );
parseVertex ( m_file, vertex);
//DBG( printf( "\n") );
// DBG( printf( " specularColor") );
parseVertex( m_file, vertex );
// DBG( printf( "\n") );
if( GetMaster()->m_use_modelfile_specularColor == true )
{
m_model->m_Materials->m_SpecularColor.push_back( vertex );
}
} else if( strcmp( text, "ambientIntensity" ) == 0 )
}
else if( strcmp( text, "ambientIntensity" ) == 0 )
{
float ambientIntensity;
parseFloat( m_file, &ambientIntensity );
//DBG( printf( " ambientIntensity %f\n", ambientIntensity) );
// DBG( printf( " ambientIntensity %f\n", ambientIntensity) );
if( GetMaster()->m_use_modelfile_ambientIntensity == true )
{
m_model->m_Materials->m_AmbientColor.push_back( glm::vec3( ambientIntensity, ambientIntensity, ambientIntensity ) );
m_model->m_Materials->m_AmbientColor.push_back( glm::vec3( ambientIntensity,
ambientIntensity, ambientIntensity ) );
}
} else if( strcmp( text, "transparency" ) == 0 )
}
else if( strcmp( text, "transparency" ) == 0 )
{
float transparency;
parseFloat( m_file, &transparency );
//DBG( printf( " transparency %f\n", transparency) );
// DBG( printf( " transparency %f\n", transparency) );
if( GetMaster()->m_use_modelfile_transparency == true )
{
m_model->m_Materials->m_Transparency.push_back( transparency );
}
} else if( strcmp( text, "shininess" ) == 0 )
}
else if( strcmp( text, "shininess" ) == 0 )
{
float shininess;
parseFloat( m_file, &shininess );
//DBG( printf( " shininess %f\n", shininess) );
// DBG( printf( " shininess %f\n", shininess) );
// VRML value is normalized and openGL expects a value 0 - 128
if( GetMaster()->m_use_modelfile_shininess == true )
{
@ -491,30 +545,30 @@ int VRML2_MODEL_PARSER::read_Material()
}
}
DBG( printf( " Material failed\n") );
// DBG( printf( " Material failed\n" ) );
return -1;
}
int VRML2_MODEL_PARSER::read_IndexedFaceSet()
{
char text[128];
char text[128];
//DBG( printf( " IndexedFaceSet\n") );
// DBG( printf( " IndexedFaceSet\n") );
m_normalPerVertex = false;
colorPerVertex = false;
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
//DBG( printf( " } Exit IndexedFaceSet\n") );
// DBG( printf( " } Exit IndexedFaceSet\n") );
return 0;
}
@ -524,52 +578,59 @@ int VRML2_MODEL_PARSER::read_IndexedFaceSet()
{
if( strcmp( text, "TRUE" ) == 0 )
{
//DBG( printf( " m_normalPerVertex TRUE\n") );
// DBG( printf( " m_normalPerVertex TRUE\n") );
m_normalPerVertex = true;
}
}
} else if( strcmp( text, "colorPerVertex" ) == 0 )
}
else if( strcmp( text, "colorPerVertex" ) == 0 )
{
GetNextTag( m_file, text );
if( strcmp( text, "TRUE" ) )
{
//DBG( printf( " colorPerVertex = true\n") );
// DBG( printf( " colorPerVertex = true\n") );
colorPerVertex = true;
} else
}
else
{
colorPerVertex = false;
}
} else if( strcmp( text, "Coordinate" ) == 0 )
}
else if( strcmp( text, "Coordinate" ) == 0 )
{
read_Coordinate();
} else if( strcmp( text, "Normal" ) == 0 )
}
else if( strcmp( text, "Normal" ) == 0 )
{
read_Normal();
} else if( strcmp( text, "normalIndex" ) == 0 )
}
else if( strcmp( text, "normalIndex" ) == 0 )
{
read_NormalIndex();
} else if( strcmp( text, "Color" ) == 0 )
}
else if( strcmp( text, "Color" ) == 0 )
{
read_Color();
} else if( strcmp( text, "coordIndex" ) == 0 )
}
else if( strcmp( text, "coordIndex" ) == 0 )
{
read_coordIndex();
} else if( strcmp( text, "colorIndex" ) == 0 )
}
else if( strcmp( text, "colorIndex" ) == 0 )
{
read_colorIndex();
}
}
DBG( printf( " IndexedFaceSet failed %s\n", text) );
// DBG( printf( " IndexedFaceSet failed %s\n", text ) );
return -1;
}
int VRML2_MODEL_PARSER::read_colorIndex()
{
//DBG( printf( " read_colorIndex\n" ) );
// DBG( printf( " read_colorIndex\n" ) );
m_model->m_MaterialIndex.clear();
@ -577,27 +638,31 @@ int VRML2_MODEL_PARSER::read_colorIndex()
{
int index;
int first_index;
while( fscanf( m_file, "%d, ", &index ) )
{
if( index == -1 )
{
// it only implemented color per face, so it will store as the first in the list
m_model->m_MaterialIndex.push_back( first_index );
} else
}
else
{
first_index = index;
}
}
} else
}
else
{
int index;
while( fscanf( m_file, "%d,", &index ) )
{
m_model->m_MaterialIndex.push_back( index );
}
}
//DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
// DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
return 0;
}
@ -605,31 +670,33 @@ int VRML2_MODEL_PARSER::read_colorIndex()
int VRML2_MODEL_PARSER::read_NormalIndex()
{
//DBG( printf( " read_NormalIndex\n" ) );
// DBG( printf( " read_NormalIndex\n" ) );
m_model->m_NormalIndex.clear();
glm::ivec3 coord;
int dummy; // should be -1
int dummy; // should be -1
std::vector<int> coord_list;
coord_list.clear();
while( fscanf (m_file, "%d, ", &dummy ) == 1 )
while( fscanf( m_file, "%d, ", &dummy ) == 1 )
{
if( dummy == -1 )
{
m_model->m_NormalIndex.push_back( coord_list );
//DBG( printf( " size: %lu ", coord_list.size()) );
// DBG( printf( " size: %lu ", coord_list.size()) );
coord_list.clear();
} else
}
else
{
coord_list.push_back( dummy );
//DBG( printf( "%d ", dummy) );
// DBG( printf( "%d ", dummy) );
}
}
//DBG( printf( " m_NormalIndex.size: %ld\n", m_model->m_NormalIndex.size() ) );
// DBG( printf( " m_NormalIndex.size: %ld\n", m_model->m_NormalIndex.size() ) );
return 0;
}
@ -637,31 +704,33 @@ int VRML2_MODEL_PARSER::read_NormalIndex()
int VRML2_MODEL_PARSER::read_coordIndex()
{
//DBG( printf( " read_coordIndex\n" ) );
// DBG( printf( " read_coordIndex\n" ) );
m_model->m_CoordIndex.clear();
glm::ivec3 coord;
int dummy; // should be -1
int dummy; // should be -1
std::vector<int> coord_list;
coord_list.clear();
while( fscanf (m_file, "%d, ", &dummy ) == 1 )
while( fscanf( m_file, "%d, ", &dummy ) == 1 )
{
if( dummy == -1 )
{
m_model->m_CoordIndex.push_back( coord_list );
//DBG( printf( " size: %lu ", coord_list.size()) );
// DBG( printf( " size: %lu ", coord_list.size()) );
coord_list.clear();
} else
}
else
{
coord_list.push_back( dummy );
//DBG( printf( "%d ", dummy) );
// DBG( printf( "%d ", dummy) );
}
}
//DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
// DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
return 0;
}
@ -669,20 +738,20 @@ int VRML2_MODEL_PARSER::read_coordIndex()
int VRML2_MODEL_PARSER::read_Color()
{
char text[128];
char text[128];
//DBG( printf( " read_Color\n") );
// DBG( printf( " read_Color\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
//DBG( printf( " m_DiffuseColor.size: %ld\n", m_model->m_Materials->m_DiffuseColor.size() ) );
// DBG( printf( " m_DiffuseColor.size: %ld\n", m_model->m_Materials->m_DiffuseColor.size() ) );
return 0;
}
@ -692,75 +761,73 @@ int VRML2_MODEL_PARSER::read_Color()
}
}
//DBG( printf( " read_Color failed\n") );
return -1;
// DBG( printf( " read_Color failed\n") );
return -1;
}
int VRML2_MODEL_PARSER::read_Normal()
{
char text[128];
char text[128];
//DBG( printf( " Normal\n") );
// DBG( printf( " Normal\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
//DBG( printf( " m_PerFaceNormalsNormalized.size: %lu\n", m_model->m_PerFaceNormalsNormalized.size() ) );
// DBG( printf( " m_PerFaceNormalsNormalized.size: %lu\n", m_model->m_PerFaceNormalsNormalized.size() ) );
return 0;
}
if( strcmp( text, "vector" ) == 0 )
{
if(m_normalPerVertex == false )
if( m_normalPerVertex == false )
{
parseVertexList( m_file, m_model->m_PerFaceNormalsNormalized );
} else
}
else
{
parseVertexList( m_file, m_model->m_PerVertexNormalsNormalized );
//DBG( printf( " m_PerVertexNormalsNormalized.size: %lu\n", m_model->m_PerVertexNormalsNormalized.size() ) );
// DBG( printf( " m_PerVertexNormalsNormalized.size: %lu\n", m_model->m_PerVertexNormalsNormalized.size() ) );
}
}
}
return -1;
return -1;
}
int VRML2_MODEL_PARSER::read_Coordinate()
{
char text[128];
char text[128];
//DBG( printf( " Coordinate\n") );
// DBG( printf( " Coordinate\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
if( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
if( ( *text == '}' ) )
{
//DBG( printf( " m_Point.size: %lu\n", m_model->m_Point.size() ) );
// DBG( printf( " m_Point.size: %lu\n", m_model->m_Point.size() ) );
return 0;
}
if( strcmp( text, "point" ) == 0 )
{
parseVertexList( m_file, m_model->m_Point);
parseVertexList( m_file, m_model->m_Point );
}
}
return -1;
return -1;
}

View File

@ -59,12 +59,12 @@ VRML_MODEL_PARSER::~VRML_MODEL_PARSER()
}
void VRML_MODEL_PARSER::Load( const wxString aFilename )
void VRML_MODEL_PARSER::Load( const wxString& aFilename, double aVrmlunits_to_3Dunits )
{
char line[12];
char line[128];
FILE* file;
//DBG( printf( "Load %s", static_cast<const char*>(aFilename.mb_str()) ) );
//DBG( printf( "Load %s", GetChars( aFilename ) ) );
file = wxFopen( aFilename, wxT( "rt" ) );
@ -76,26 +76,27 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
if( fgets( line, 11, file ) == NULL )
{
fclose( file );
return;
}
fclose( file );
if( stricmp( line, "#VRML V2.0" ) == 0)
if( stricmp( line, "#VRML V2.0" ) == 0 )
{
//DBG( printf( "About to parser a #VRML V2.0 file\n" ) );
vrml2_parser->Load( aFilename );
vrml2_parser->Load( aFilename, aVrmlunits_to_3Dunits );
return;
}
else if( stricmp( line, "#VRML V1.0" ) == 0)
else if( stricmp( line, "#VRML V1.0" ) == 0 )
{
//DBG( printf( "About to parser a #VRML V1.0 file\n" ) );
vrml1_parser->Load( aFilename );
vrml1_parser->Load( aFilename, aVrmlunits_to_3Dunits );
return;
}
DBG( printf( "Unknown VRML file format: %s\n", line ) );
// DBG( printf( "Unknown VRML file format: %s\n", line ) );
}

View File

@ -43,14 +43,16 @@
X3D_MODEL_PARSER::X3D_MODEL_PARSER( S3D_MASTER* aMaster ) :
S3D_MODEL_PARSER( aMaster )
{}
{
}
X3D_MODEL_PARSER::~X3D_MODEL_PARSER()
{}
{
}
void X3D_MODEL_PARSER::Load( const wxString aFilename )
void X3D_MODEL_PARSER::Load( const wxString& aFilename, double aVrmlunits_to_3Dunits )
{
wxXmlDocument doc;
@ -66,28 +68,26 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
return;
}
glShadeModel(GL_SMOOTH);
glEnable(GL_NORMALIZE);
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
float vrmlunits_to_3Dunits = aVrmlunits_to_3Dunits;
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y,
GetMaster()->m_MatScale.z );
GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y,
GetMaster()->m_MatRotation.z );
GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y,
GetMaster()->m_MatPosition.z );
GetMaster()->m_MatPosition.z );
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
#define SCALE_3D_CONV ( (IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB )
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
glRotatef( -matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef( -matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef( -matRot.x, 1.0f, 0.0f, 0.0f );
glScalef( matScale.x, matScale.y, matScale.z );
@ -103,8 +103,8 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
GetChildsByName( doc.GetRoot(), wxT( "Transform" ), transforms );
for( NODE_LIST::iterator node_it = transforms.begin();
node_it != transforms.end();
node_it++ )
node_it != transforms.end();
node_it++ )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
@ -112,7 +112,7 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
readTransform( *node_it );
}
//DBG( printf( "chils size:%lu\n", childs.size() ) );
// DBG( printf( "chils size:%lu\n", childs.size() ) );
if( GetMaster()->IsOpenGlAllowed() )
{
@ -140,7 +140,7 @@ wxString X3D_MODEL_PARSER::VRML2_representation()
" geometry IndexedFaceSet {\n"
" solid TRUE\n"
" coord Coordinate {\n"
" point [\n") +
" point [\n" ) +
vrml_points[i] +
wxT( " ]\n"
" }\n"
@ -156,19 +156,19 @@ wxString X3D_MODEL_PARSER::VRML2_representation()
void X3D_MODEL_PARSER::GetChildsByName( wxXmlNode* aParent,
const wxString aName,
std::vector< wxXmlNode* >& aResult )
const wxString aName,
std::vector<wxXmlNode*>& aResult )
{
// Breadth-first search (BFS)
std::queue< wxXmlNode* > found;
std::queue<wxXmlNode*> found;
found.push( aParent );
while( !found.empty() )
{
wxXmlNode *elem = found.front();
wxXmlNode* elem = found.front();
for( wxXmlNode *child = elem->GetChildren();
for( wxXmlNode* child = elem->GetChildren();
child != NULL;
child = child->GetNext() )
{
@ -197,11 +197,13 @@ void X3D_MODEL_PARSER::GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps
}
}
/* Private ----- */
void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode )
{
NODE_LIST childnodes;
GetChildsByName( aTransformNode, wxT( "Material" ), childnodes );
for( NODE_LIST::iterator node = childnodes.begin();
@ -216,7 +218,7 @@ void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode )
PROPERTY_MAP properties;
GetNodeProperties( aTransformNode, properties );
GetChildsByName( aTransformNode, wxT("IndexedFaceSet"), childnodes );
GetChildsByName( aTransformNode, wxT( "IndexedFaceSet" ), childnodes );
for( NODE_LIST::iterator node = childnodes.begin();
node != childnodes.end();
@ -234,6 +236,7 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
glm::vec3 color;
PROPERTY_MAP properties;
GetNodeProperties( aMatNode, properties );
// DEFine new Material named as value of DEF
@ -246,10 +249,9 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
m_model->m_Materials = material;
if( !parseDoubleTriplet( properties[ wxT( "diffuseColor" ) ],
color ) )
if( !parseDoubleTriplet( properties[ wxT( "diffuseColor" ) ], color ) )
{
DBG( printf("diffuseColor parsing error") );
// DBG( printf( "diffuseColor parsing error" ) );
}
else
{
@ -258,7 +260,7 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ], color ) )
{
DBG( printf("specularColor parsing error") );
// DBG( printf( "specularColor parsing error" ) );
}
else
{
@ -267,7 +269,7 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
if( !parseDoubleTriplet( properties[ wxT( "emissiveColor" ) ], color ) )
{
DBG( printf("emissiveColor parsing error") );
// DBG( printf( "emissiveColor parsing error" ) );
}
else
{
@ -283,7 +285,7 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
}
else
{
DBG( printf( "ambienterror" ) );
// DBG( printf( "ambienterror" ) );
}
values.SetString( properties[ wxT( "shininess" ) ] );
@ -291,12 +293,19 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
if( values.GetNextToken().ToDouble( &shine ) )
{
// VRML value is normalized and openGL expects a value 0 - 128
if( shine > 1.0 )
{
shine = 1.0;
} else if( shine < 0.0 )
{
shine = 0.0;
}
shine = shine * 128.0f;
m_model->m_Materials->m_Shininess.push_back( shine );
}
else
{
DBG( printf( "shininess error" ) );
// DBG( printf( "shininess error" ) );
}
values.SetString( properties[ wxT( "transparency" ) ] );
@ -307,12 +316,12 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
}
else
{
DBG( printf( "trans error") );
// DBG( printf( "trans error" ) );
}
// VRML
wxString vrml_material;
PROPERTY_MAP::const_iterator p = ++properties.begin(); // skip DEF
PROPERTY_MAP::const_iterator p = ++properties.begin(); // skip DEF
for( ; p != properties.end(); p++ )
{
@ -321,7 +330,6 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
vrml_materials.push_back( vrml_material );
}
// USE existing material named by value of USE
else if( properties.find( wxT( "USE" ) ) != properties.end() )
{
@ -335,28 +343,28 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
wxString vrml_material;
vrml_material.Append( wxString::Format( wxT( "specularColor %f %f %f\n" ),
material->m_SpecularColor[0].x,
material->m_SpecularColor[0].y,
material->m_SpecularColor[0].z ) );
material->m_SpecularColor[0].x,
material->m_SpecularColor[0].y,
material->m_SpecularColor[0].z ) );
vrml_material.Append( wxString::Format( wxT( "diffuseColor %f %f %f\n" ),
material->m_DiffuseColor[0].x,
material->m_DiffuseColor[0].y,
material->m_DiffuseColor[0].z ) );
material->m_DiffuseColor[0].x,
material->m_DiffuseColor[0].y,
material->m_DiffuseColor[0].z ) );
vrml_material.Append( wxString::Format( wxT( "emissiveColor %f %f %f\n" ),
material->m_EmissiveColor[0].x,
material->m_EmissiveColor[0].y,
material->m_EmissiveColor[0].z ) );
material->m_EmissiveColor[0].x,
material->m_EmissiveColor[0].y,
material->m_EmissiveColor[0].z ) );
vrml_material.Append( wxString::Format( wxT( "ambientIntensity %f\n"),
material->m_AmbientColor[0].x ) );
vrml_material.Append( wxString::Format( wxT( "ambientIntensity %f\n" ),
material->m_AmbientColor[0].x ) );
vrml_material.Append( wxString::Format( wxT( "shininess %f\n"),
material->m_Shininess[0] ) );
vrml_material.Append( wxString::Format( wxT( "shininess %f\n" ),
material->m_Shininess[0] ) );
vrml_material.Append( wxString::Format( wxT( "transparency %f\n"),
material->m_Transparency[0] ) );
vrml_material.Append( wxString::Format( wxT( "transparency %f\n" ),
material->m_Transparency[0] ) );
vrml_materials.push_back( vrml_material );
@ -366,38 +374,38 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
}
}
DBG( printf( "ReadMaterial error: material not found\n" ) );
// DBG( printf( "ReadMaterial error: material not found\n" ) );
}
}
bool X3D_MODEL_PARSER::parseDoubleTriplet( const wxString& aData,
S3D_VERTEX& aResult )
S3D_VERTEX& aResult )
{
wxStringTokenizer tokens(aData);
wxStringTokenizer tokens( aData );
double x,y,z;
double x, y, z;
bool ret = tokens.GetNextToken().ToDouble( &x ) &&
tokens.GetNextToken().ToDouble( &y ) &&
tokens.GetNextToken().ToDouble( &z );
bool ret = tokens.GetNextToken().ToDouble( &x )
&& tokens.GetNextToken().ToDouble( &y )
&& tokens.GetNextToken().ToDouble( &z );
aResult.x = x;
aResult.y = y;
aResult.z = z;
aResult.x = x;
aResult.y = y;
aResult.z = z;
return ret;
}
void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV,
S3D_VERTEX& aU,
double angle )
S3D_VERTEX& aU,
double angle )
{
S3D_VERTEX rotated;
double C = cos( angle );
double S = sin( angle );
double t = 1.0 - C;
double C = cos( angle );
double S = sin( angle );
double t = 1.0 - C;
rotated.x = ( t * aU.x * aU.x + C ) * aV.x +
( t * aU.x * aU.y - S * aU.z ) * aV.y +
@ -411,9 +419,9 @@ void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV,
( t * aU.y * aU.z + S * aU.x ) * aV.y +
( t * aU.z * aU.z + C) * aV.z;
aV.x = rotated.x;
aV.y = rotated.y;
aV.z = rotated.z;
aV.x = rotated.x;
aV.y = rotated.y;
aV.z = rotated.z;
}
@ -424,12 +432,13 @@ void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV,
* 4. Apply geometry to Master object
*/
void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
PROPERTY_MAP& aTransformProps)
PROPERTY_MAP& aTransformProps )
{
/* Step 1: Read transform data
* --------------------------- */
S3D_VERTEX translation;
parseDoubleTriplet( aTransformProps[ wxT( "translation" ) ], translation );
S3D_VERTEX scale;
@ -437,35 +446,36 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
S3D_VERTEX rotation;
double angle = 0.0;
wxStringTokenizer tokens(aTransformProps[ wxT( "rotation" ) ]);
wxStringTokenizer tokens( aTransformProps[ wxT( "rotation" ) ] );
double x,y,z;
if( !(tokens.GetNextToken().ToDouble( &x ) &&
tokens.GetNextToken().ToDouble( &y ) &&
tokens.GetNextToken().ToDouble( &z ) &&
tokens.GetNextToken().ToDouble( &angle ) ) )
double x, y, z;
if( !( tokens.GetNextToken().ToDouble( &x )
&& tokens.GetNextToken().ToDouble( &y )
&& tokens.GetNextToken().ToDouble( &z )
&& tokens.GetNextToken().ToDouble( &angle ) ) )
{
DBG( printf("rotation read error") );
// DBG( printf( "rotation read error" ) );
}
else
{
rotation.x = x;
rotation.y = y;
rotation.z = z;
rotation.x = x;
rotation.y = y;
rotation.z = z;
}
/* Step 2: Read all coordinate points
* ---------------------------- */
std::vector< double > points;
std::vector<double> points;
NODE_LIST coordinates;
GetChildsByName( aFaceNode, wxT( "Coordinate" ), coordinates);
GetChildsByName( aFaceNode, wxT( "Coordinate" ), coordinates );
PROPERTY_MAP coordinate_properties;
// IndexedFaceSet has one Coordinate child node
GetNodeProperties( coordinates[0], coordinate_properties );
// Save points to vector as doubles
wxStringTokenizer point_tokens( coordinate_properties[ wxT("point") ] );
wxStringTokenizer point_tokens( coordinate_properties[ wxT( "point" ) ] );
double point = 0.0;
while( point_tokens.HasMoreTokens() )
@ -482,7 +492,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
if( points.size() % 3 != 0 )
{
DBG( printf( "Number of points is incorrect" ) );
// DBG( printf( "Number of points is incorrect" ) );
return;
}
@ -490,14 +500,14 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
* apply transforms in order of SCALE, ROTATION, TRANSLATION
*/
wxString vrml_pointlist;
std::vector< S3D_VERTEX > triplets;
std::vector<S3D_VERTEX> triplets;
for( unsigned id = 0; id < points.size() / 3; id++ )
{
int triplet_indx = id * 3;
S3D_VERTEX point( points[ triplet_indx ],
points[ triplet_indx + 1 ],
points[ triplet_indx + 2 ] );
points[ triplet_indx + 1 ],
points[ triplet_indx + 2 ] );
point.x *= scale.x;
point.y *= scale.y;
@ -520,9 +530,9 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
/* Step 3: Read all color points
* ---------------------------- */
std::vector< double > color_points;
std::vector<double> color_points;
NODE_LIST color;
GetChildsByName( aFaceNode, wxT( "Color" ), color);
GetChildsByName( aFaceNode, wxT( "Color" ), color );
// Some models lack color information, need to handle this safely
if( !color.empty() )
@ -532,7 +542,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
GetNodeProperties( color[0], color_properties );
// Save points to vector as doubles
wxStringTokenizer colorpoint_tokens( color_properties[ wxT("color") ] );
wxStringTokenizer colorpoint_tokens( color_properties[ wxT( "color" ) ] );
double color_point = 0.0;
while( colorpoint_tokens.HasMoreTokens() )
@ -549,21 +559,22 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
if( color_points.size() % 3 != 0 )
{
DBG( printf( "Number of points is incorrect" ) );
// DBG( printf( "Number of points is incorrect" ) );
return;
}
/* Create 3D face color from 3 color points
*/
m_model->m_Materials->m_DiffuseColor.clear();
for( unsigned id = 0; id < color_points.size() / 3; id++ )
{
m_model->m_MaterialIndex.push_back( id );
int color_triplet_indx = id * 3;
glm::vec3 colorface( color_points[ color_triplet_indx + 0 ],
color_points[ color_triplet_indx + 1 ],
color_points[ color_triplet_indx + 2 ] );
color_points[ color_triplet_indx + 1 ],
color_points[ color_triplet_indx + 2 ] );
m_model->m_Materials->m_DiffuseColor.push_back( colorface );
}
@ -601,7 +612,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
else
{
coord_list.push_back( index );
vrml_coord_indx_list.Append( wxString::Format( wxT( "%u " ), index ) );
vrml_coord_indx_list.Append( wxString::Format( wxT( "%ld " ), index ) );
}
}

View File

@ -26,20 +26,6 @@ set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules )
#option( USE_KIWAY_DLLS "Build the major modules as KIFACE DLLs or DSOs, will soon be the norm." ON )
set( USE_KIWAY_DLLS true ) # this is now mandatory, the code is the same anyways, the old code is gone.
# The desire is to migrate designs *away from* case independence, and to create designs which use
# literally (case specific) interpreted component names. But for backwards compatibility,
# you may turn OFF this option if you really must. (Remember that with KiCad using text
# data files, typically you would be better off simply doctoring those files into
# a case literal state with a text editor and move forward into the brave new
# world of case specificity. Also, BOM generators may not work properly when you
# have this option turned OFF, the xml export's referential integrity is broken
# on library part name. Hence the default is ON now, as of 29-Jan-2014.
option( KICAD_KEEPCASE
"ON= case specific string matching on component names, OFF= match names as if they were spelt using uppercase."
ON
)
option( USE_WX_GRAPHICS_CONTEXT
"Use wxGraphicsContext for rendering ( default OFF). Warning, this is experimental" )
@ -245,10 +231,6 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
endif( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
if( KICAD_KEEPCASE )
add_definitions( -DKICAD_KEEPCASE )
endif()
if( USE_WX_OVERLAY OR APPLE )
add_definitions( -DUSE_WX_OVERLAY )
endif()

View File

@ -783,6 +783,10 @@ ELSE(wxWidgets_FIND_STYLE STREQUAL "win32")
STRING(REPLACE "-I" ""
wxWidgets_INCLUDE_DIRS "${wxWidgets_INCLUDE_DIRS}")
# Flags are a string, not a list, fix it here
string(REPLACE ";" " "
wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
DBG_MSG_V("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}")
DBG_MSG_V("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}")
DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")

View File

@ -219,6 +219,8 @@ ExternalProject_Add( boost
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_macosx_older_openssl.patch" #https://svn.boost.org/trac/boost/ticket/9273
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_mingw.patch" #https://svn.boost.org/trac/boost/ticket/7262
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_mingw64_interlocked.patch"
# tell bzr about "added" files by last patch:
COMMAND bzr add libs/context/src/asm/make_i386_ms_pe_gas.S
COMMAND bzr add libs/context/src/asm/jump_i386_ms_pe_gas.S

View File

@ -64,18 +64,13 @@ PCBNew
Dick's Final TODO List:
======================
*) Milestone B of Modular KiCad Blueprint:
* Put SEARCH_STACK::LastVisitedPath() out of its misery.
* Combine CVPCB into PCBNEW.
*) Milestone C of Modular KiCad Blueprint
* SWIG class KIWAY, PROJECT, and KIWAY_MGR and fill out KIWAY_MGR as needed.
* Implement PROJECT::Substitute().
* Other stuff in blueprint milestone.
*) Get licensing cleaned up.
*) DLL-ization of pcbnew & eeschema
http://www.eevblog.com/forum/open-source-kicad-geda/seriously-irritated-with-the-library-editor!/
https://blueprints.launchpad.net/kicad/+spec/modular-kicad
Issues as a result of minimal testing:
* If eeschema launched from C++ project manager and does not find all libraries,
then the dialog showing the names of missing libraries is shown twice.
* Clear all/some? retained strings on project change.
* Clear the FP_LIB_TABLE when the last KIWAY_PLAYER using it is closed.
Fix export gencad

View File

@ -29,8 +29,10 @@
#include <wxstruct.h>
#include <confirm.h>
#include <gestfich.h>
#include <wildcards_and_files_ext.h>
#include <bitmap2cmp_gui_base.h>
#include <bitmap2component.h>
#include <potracelib.h>
#include <bitmap_io.h>
@ -54,7 +56,7 @@
#define DEFAULT_DPI 300 // Default resolution in Bit per inches
extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
int aFormat, int aDpi_X, int aDpi_Y );
OUTPUT_FMT_ID aFormat, int aDpi_X, int aDpi_Y );
/**
* Class BM2CMP_FRAME_BASE
@ -63,19 +65,19 @@ extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
class BM2CMP_FRAME : public BM2CMP_FRAME_BASE
{
private:
wxImage m_Pict_Image;
wxBitmap m_Pict_Bitmap;
wxImage m_Greyscale_Image;
wxBitmap m_Greyscale_Bitmap;
wxImage m_NB_Image;
wxBitmap m_BN_Bitmap;
wxSize m_imageDPI; // The initial image resolution. When unknown,
wxImage m_Pict_Image;
wxBitmap m_Pict_Bitmap;
wxImage m_Greyscale_Image;
wxBitmap m_Greyscale_Bitmap;
wxImage m_NB_Image;
wxBitmap m_BN_Bitmap;
wxSize m_imageDPI; // The initial image resolution. When unknown,
// set to DEFAULT_DPI x DEFAULT_DPI per Inch
wxString m_BitmapFileName;
wxString m_ConvertedFileName;
wxSize m_frameSize;
wxPoint m_framePos;
wxConfig* m_config;
wxString m_BitmapFileName;
wxString m_ConvertedFileName;
wxSize m_frameSize;
wxPoint m_framePos;
wxConfigBase* m_config;
public:
BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent );
@ -98,11 +100,9 @@ private:
void OnExportEeschema();
/**
* Depending on the option:
* Legacy format: generate a module library which comtains one component
* New kicad_mod format: generate a module in S expr format
* Generate a module in S expr format
*/
void OnExportPcbnew( bool aLegacyFormat );
void OnExportPcbnew();
/**
* Generate a postscript file
@ -129,13 +129,14 @@ private:
{
m_DPIValueX->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.x ) );
}
void UpdateDPITextValueY( wxMouseEvent& event )
{
m_DPIValueY->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.y ) );
}
void NegateGreyscaleImage( );
void ExportFile( FILE* aOutfile, int aFormat );
void ExportFile( FILE* aOutfile, OUTPUT_FMT_ID aFormat );
void updateImageInfo();
};
@ -146,7 +147,7 @@ BM2CMP_FRAME::BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
SetKiway( this, aKiway );
int tmp;
m_config = new wxConfig();
m_config = GetNewConfig( Pgm().App().GetAppName() );
m_config->Read( KEYWORD_FRAME_POSX, & m_framePos.x, -1 );
m_config->Read( KEYWORD_FRAME_POSY, & m_framePos.y, -1 );
m_config->Read( KEYWORD_FRAME_SIZEX, & m_frameSize.x, -1 );
@ -160,8 +161,13 @@ BM2CMP_FRAME::BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
if( m_config->Read( KEYWORD_BW_NEGATIVE, &tmp ) )
m_rbOptions->SetSelection( tmp ? 1 : 0 );
m_config->Read( KEYWORD_LAST_FORMAT, &tmp );
m_radioBoxFormat->SetSelection( tmp );
if( m_config->Read( KEYWORD_LAST_FORMAT, &tmp ) )
{
if( tmp < 0 || tmp > FINAL_FMT )
tmp = PCBNEW_KICAD_MOD;
m_radioBoxFormat->SetSelection( tmp );
}
// Give an icon
wxIcon icon;
@ -273,14 +279,7 @@ bool BM2CMP_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int
if( !m_Pict_Image.LoadFile( m_BitmapFileName ) )
{
/* LoadFile has its own UI, no need for further failure notification here
wxString msg = wxString::Format(
_( "Could not load image '%s'" ),
GetChars( aFilename )
);
wxMessageBox( msg );
*/
// LoadFile has its own UI, no need for further failure notification here
return false;
}
@ -430,27 +429,25 @@ void BM2CMP_FRAME::OnThresholdChange( wxScrollEvent& event )
void BM2CMP_FRAME::OnExport( wxCommandEvent& event )
{
int sel = m_radioBoxFormat->GetSelection();
// choices of m_radioBoxFormat are expected to be in same order as
// OUTPUT_FMT_ID. See bitmap2component.h
OUTPUT_FMT_ID sel = (OUTPUT_FMT_ID) m_radioBoxFormat->GetSelection();
switch( sel )
{
case 0:
case EESCHEMA_FMT:
OnExportEeschema();
break;
case 1:
OnExportPcbnew( true );
case PCBNEW_KICAD_MOD:
OnExportPcbnew();
break;
case 2:
OnExportPcbnew( false );
break;
case 3:
case POSTSCRIPT_FMT:
OnExportPostScript();
break;
case 4:
case KICAD_LOGO:
OnExportLogo();
break;
}
@ -465,16 +462,18 @@ void BM2CMP_FRAME::OnExportLogo()
if( path.IsEmpty() || !wxDirExists(path) )
path = ::wxGetCwd();
wxString msg = _( "Logo file (*.kicad_wks)|*.kicad_wks" );
wxFileDialog fileDlg( this, _( "Create a logo file" ), path, wxEmptyString,
msg,
wxFileDialog fileDlg( this, _( "Create a logo file" ),
path, wxEmptyString,
wxGetTranslation( PageLayoutDescrFileWildcard ),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
int diag = fileDlg.ShowModal();
if( diag != wxID_OK )
return;
m_ConvertedFileName = fileDlg.GetPath();
fn = fileDlg.GetPath();
fn.SetExt( PageLayoutDescrFileExtension );
m_ConvertedFileName = fn.GetFullPath();
FILE* outfile;
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
@ -482,12 +481,12 @@ void BM2CMP_FRAME::OnExportLogo()
if( outfile == NULL )
{
wxString msg;
msg.Printf( _( "File %s could not be created" ), m_ConvertedFileName.c_str() );
msg.Printf( _( "File '%s' could not be created" ), GetChars(m_ConvertedFileName) );
wxMessageBox( msg );
return;
}
ExportFile( outfile, 4 );
ExportFile( outfile, KICAD_LOGO );
fclose( outfile );
}
@ -500,9 +499,9 @@ void BM2CMP_FRAME::OnExportPostScript()
if( path.IsEmpty() || !wxDirExists( path ) )
path = ::wxGetCwd();
wxString msg = _( "Postscript file (*.ps)|*.ps" );
wxFileDialog fileDlg( this, _( "Create a Postscript file" ), path, wxEmptyString,
msg,
wxFileDialog fileDlg( this, _( "Create a Postscript file" ),
path, wxEmptyString,
wxGetTranslation( PSFileWildcard ),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
int diag = fileDlg.ShowModal();
@ -510,7 +509,9 @@ void BM2CMP_FRAME::OnExportPostScript()
if( diag != wxID_OK )
return;
m_ConvertedFileName = fileDlg.GetPath();
fn = fileDlg.GetPath();
fn.SetExt( wxT( "ps" ) );
m_ConvertedFileName = fn.GetFullPath();
FILE* outfile;
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
@ -518,12 +519,12 @@ void BM2CMP_FRAME::OnExportPostScript()
if( outfile == NULL )
{
wxString msg;
msg.Printf( _( "File %s could not be created" ), m_ConvertedFileName.c_str() );
msg.Printf( _( "File '%s' could not be created" ), GetChars( m_ConvertedFileName ) );
wxMessageBox( msg );
return;
}
ExportFile( outfile, 3 );
ExportFile( outfile, POSTSCRIPT_FMT );
fclose( outfile );
}
@ -536,10 +537,9 @@ void BM2CMP_FRAME::OnExportEeschema()
if( path.IsEmpty() || !wxDirExists(path) )
path = ::wxGetCwd();
wxString msg = _( "Schematic lib file (*.lib)|*.lib" );
wxFileDialog fileDlg( this, _( "Create a lib file for Eeschema" ), path, wxEmptyString,
msg,
wxFileDialog fileDlg( this, _( "Create a lib file for Eeschema" ),
path, wxEmptyString,
wxGetTranslation( SchematicLibraryFileWildcard ),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
int diag = fileDlg.ShowModal();
@ -547,24 +547,26 @@ void BM2CMP_FRAME::OnExportEeschema()
if( diag != wxID_OK )
return;
m_ConvertedFileName = fileDlg.GetPath();
fn = fileDlg.GetPath();
fn.SetExt( SchematicLibraryFileExtension );
m_ConvertedFileName = fn.GetFullPath();
FILE* outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
if( outfile == NULL )
{
wxString msg;
msg.Printf( _( "File %s could not be created" ), m_ConvertedFileName.c_str() );
msg.Printf( _( "File '%s' could not be created" ), GetChars( m_ConvertedFileName ) );
wxMessageBox( msg );
return;
}
ExportFile( outfile, 2 );
ExportFile( outfile, EESCHEMA_FMT );
fclose( outfile );
}
void BM2CMP_FRAME::OnExportPcbnew( bool aLegacyFormat )
void BM2CMP_FRAME::OnExportPcbnew()
{
wxFileName fn( m_ConvertedFileName );
wxString path = fn.GetPath();
@ -572,13 +574,9 @@ void BM2CMP_FRAME::OnExportPcbnew( bool aLegacyFormat )
if( path.IsEmpty() || !wxDirExists( path ) )
path = ::wxGetCwd();
wxString msg = aLegacyFormat ?
_( "Footprint file (*.emp)|*.emp" ) :
_( "Footprint file (*.kicad_mod)|*.kicad_mod" );
wxFileDialog fileDlg( this, _( "Create a footprint file for PcbNew" ),
path, wxEmptyString,
msg,
wxGetTranslation( KiCadFootprintLibFileWildcard ),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
int diag = fileDlg.ShowModal();
@ -586,24 +584,26 @@ void BM2CMP_FRAME::OnExportPcbnew( bool aLegacyFormat )
if( diag != wxID_OK )
return;
m_ConvertedFileName = fileDlg.GetPath();
fn = fileDlg.GetPath();
fn.SetExt( KiCadFootprintFileExtension );
m_ConvertedFileName = fn.GetFullPath();
FILE* outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
if( outfile == NULL )
{
wxString msg;
msg.Printf( _( "File %s could not be created" ), m_ConvertedFileName.c_str() );
msg.Printf( _( "File '%s' could not be created" ), GetChars( m_ConvertedFileName ) );
wxMessageBox( msg );
return;
}
ExportFile( outfile, aLegacyFormat ? 0 : 1 );
ExportFile( outfile, PCBNEW_KICAD_MOD );
fclose( outfile );
}
void BM2CMP_FRAME::ExportFile( FILE* aOutfile, int aFormat )
void BM2CMP_FRAME::ExportFile( FILE* aOutfile, OUTPUT_FMT_ID aFormat )
{
// Create a potrace bitmap
int h = m_NB_Image.GetHeight();

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 5 2013)
// C++ code generated with wxFormBuilder (version Nov 6 2013)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -126,10 +126,10 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
brightSizer->Add( m_buttonExport, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxString m_radioBoxFormatChoices[] = { _("Eeschema"), _("Pcbnew old fmt (.emp)"), _("Pcbnew kicad_mod"), _("Postscript"), _("Logo for title block") };
wxString m_radioBoxFormatChoices[] = { _("Eeschema (.lib file)"), _("Pcbnew (.kicad_mod file)"), _("Postscript (.ps file)"), _("Logo for title block (.kicad_wks file)") };
int m_radioBoxFormatNChoices = sizeof( m_radioBoxFormatChoices ) / sizeof( wxString );
m_radioBoxFormat = new wxRadioBox( m_panelRight, wxID_ANY, _("Format"), wxDefaultPosition, wxDefaultSize, m_radioBoxFormatNChoices, m_radioBoxFormatChoices, 1, wxRA_SPECIFY_COLS );
m_radioBoxFormat->SetSelection( 2 );
m_radioBoxFormat->SetSelection( 1 );
brightSizer->Add( m_radioBoxFormat, 0, wxEXPAND|wxALL, 5 );
wxString m_rbOptionsChoices[] = { _("Normal"), _("Negative") };

View File

@ -2003,7 +2003,7 @@
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices">&quot;Eeschema&quot; &quot;Pcbnew old fmt (.emp)&quot; &quot;Pcbnew kicad_mod&quot; &quot;Postscript&quot; &quot;Logo for title block&quot;</property>
<property name="choices">&quot;Eeschema (.lib file)&quot; &quot;Pcbnew (.kicad_mod file)&quot; &quot;Postscript (.ps file)&quot; &quot;Logo for title block (.kicad_wks file)&quot;</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
@ -2035,7 +2035,7 @@
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">2</property>
<property name="selection">1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxRA_SPECIFY_COLS</property>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 5 2013)
// C++ code generated with wxFormBuilder (version Nov 6 2013)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!

View File

@ -38,6 +38,8 @@
#include <potracelib.h>
#include <auxiliary.h>
#include <bitmap2component.h>
// Define some types used here from boost::polygon
namespace bpl = boost::polygon; // bpl = boost polygon library
@ -50,14 +52,6 @@ typedef std::vector<KPolygon> KPolygonSet; // define a set of p
typedef bpl::point_data<coordinate_type> KPolyPoint; // define a corner of a polygon
enum output_format {
POSTSCRIPT_FMT = 1,
PCBNEW_LEGACY_EMP,
PCBNEW_KICAD_MOD,
EESCHEMA_FMT,
KICAD_LOGO
};
/* free a potrace bitmap */
static void bm_free( potrace_bitmap_t* bm )
{
@ -75,7 +69,7 @@ static void bm_free( potrace_bitmap_t* bm )
class BITMAPCONV_INFO
{
public:
enum output_format m_Format; // File format
enum OUTPUT_FMT_ID m_Format; // File format
int m_PixmapWidth;
int m_PixmapHeight; // the bitmap size in pixels
double m_ScaleX;
@ -139,7 +133,7 @@ BITMAPCONV_INFO::BITMAPCONV_INFO()
int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
int aFormat, int aDpi_X, int aDpi_Y )
OUTPUT_FMT_ID aFormat, int aDpi_X, int aDpi_Y )
{
potrace_param_t* param;
potrace_state_t* st;
@ -169,14 +163,14 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
switch( aFormat )
{
case 4:
case KICAD_LOGO:
info.m_Format = KICAD_LOGO;
info.m_ScaleX = 1e3 * 25.4 / aDpi_X; // the conversion scale from PPI to micro
info.m_ScaleY = 1e3 * 25.4 / aDpi_Y; // Y axis is top to bottom
info.CreateOutputFile();
break;
case 3:
case POSTSCRIPT_FMT:
info.m_Format = POSTSCRIPT_FMT;
info.m_ScaleX = 1.0; // the conversion scale
info.m_ScaleY = info.m_ScaleX;
@ -184,27 +178,20 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
info.CreateOutputFile();
break;
case 2:
case EESCHEMA_FMT:
info.m_Format = EESCHEMA_FMT;
info.m_ScaleX = 1000.0 / aDpi_X; // the conversion scale from PPI to UI
info.m_ScaleY = -1000.0 / aDpi_Y; // Y axis is bottom to Top for components in libs
info.CreateOutputFile();
break;
case 1:
case PCBNEW_KICAD_MOD:
info.m_Format = PCBNEW_KICAD_MOD;
info.m_ScaleX = 1e6 * 25.4 / aDpi_X; // the conversion scale from PPI to UI
info.m_ScaleY = 1e6 * 25.4 / aDpi_Y; // Y axis is top to bottom in modedit
info.CreateOutputFile();
break;
case 0:
info.m_Format = PCBNEW_LEGACY_EMP;
info.m_ScaleX = 10000.0 / aDpi_X; // the conversion scale
info.m_ScaleY = 10000.0 / aDpi_Y; // Y axis is top to bottom in modedit
info.CreateOutputFile();
break;
default:
break;
}
@ -233,25 +220,6 @@ void BITMAPCONV_INFO::OuputFileHeader()
fprintf( m_Outfile, "gsave\n" );
break;
case PCBNEW_LEGACY_EMP:
#define FIELD_LAYER 21
fieldSize = 600; // fields text size = 60 mils
Ypos += fieldSize / 2;
fprintf( m_Outfile, "PCBNEW-LibModule-V1\n" );
fprintf( m_Outfile, "$INDEX\n%s\n$EndINDEX\n", m_CmpName );
fprintf( m_Outfile, "#\n# %s\n", m_CmpName );
fprintf( m_Outfile, "# pixmap w = %d, h = %d\n#\n",
m_PixmapWidth, m_PixmapHeight );
fprintf( m_Outfile, "$MODULE %s\n", m_CmpName );
fprintf( m_Outfile, "Po 0 0 0 15 00000000 00000000 ~~\n" );
fprintf( m_Outfile, "Li %s\n", m_CmpName );
fprintf( m_Outfile, "T0 0 %d %d %d 0 %d N I %d \"G***\"\n",
Ypos, fieldSize, fieldSize, fieldSize / 5, FIELD_LAYER );
fprintf( m_Outfile, "T1 0 %d %d %d 0 %d N I %d \"%s\"\n",
-Ypos, fieldSize, fieldSize, fieldSize / 5, FIELD_LAYER, m_CmpName );
break;
case PCBNEW_KICAD_MOD:
// fields text size = 1.5 mm
// fields text thickness = 1.5 / 5 = 0.3mm
@ -295,11 +263,6 @@ void BITMAPCONV_INFO::OuputFileEnd()
fprintf( m_Outfile, "%%EOF\n" );
break;
case PCBNEW_LEGACY_EMP:
fprintf( m_Outfile, "$EndMODULE %s\n", m_CmpName );
fprintf( m_Outfile, "$EndLIBRARY\n" );
break;
case PCBNEW_KICAD_MOD:
fprintf( m_Outfile, ")\n" );
break;
@ -353,27 +316,6 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
fprintf( m_Outfile, "\nclosepath fill\n" );
break;
case PCBNEW_LEGACY_EMP:
{
LAYER_NUM layer = F_SilkS;
int width = 1;
fprintf( m_Outfile, "DP %d %d %d %d %d %d %d\n",
0, 0, 0, 0,
(int) aPolygon.size() + 1, width, layer );
for( ii = 0; ii < aPolygon.size(); ii++ )
{
currpoint = *( aPolygon.begin() + ii );
fprintf( m_Outfile, "Dl %d %d\n",
currpoint.x() - offsetX, currpoint.y() - offsetY );
}
// Close polygon
fprintf( m_Outfile, "Dl %d %d\n",
startpoint.x() - offsetX, startpoint.y() - offsetY );
}
break;
case PCBNEW_KICAD_MOD:
{
double width = 0.1;

View File

@ -0,0 +1,38 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 1992-2014 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef BITMAP2COMPONENT_H
#define BITMAP2COMPONENT_H
// for consistency this enum should conform to the
// indices in m_radioBoxFormat from bitmap2cmp_gui.cpp
enum OUTPUT_FMT_ID
{
EESCHEMA_FMT = 0,
PCBNEW_KICAD_MOD,
POSTSCRIPT_FMT,
KICAD_LOGO,
FINAL_FMT = KICAD_LOGO
};
#endif // BITMAP2COMPONENT_H

View File

@ -8,71 +8,67 @@
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x03, 0xf2, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x5b, 0x48, 0x9b,
0x67, 0x18, 0xc7, 0x83, 0xb8, 0xad, 0xc5, 0x5e, 0x94, 0x51, 0xc6, 0x6e, 0x06, 0x03, 0x6f, 0xbd,
0x50, 0x2f, 0xaa, 0xf5, 0x94, 0x43, 0x47, 0x84, 0x95, 0x68, 0xba, 0xc6, 0xd8, 0x56, 0xb3, 0x39,
0x8a, 0x83, 0x59, 0x16, 0x32, 0xb6, 0x31, 0x7b, 0x33, 0xbc, 0x50, 0xf1, 0x46, 0xb6, 0x39, 0x89,
0x13, 0x37, 0xe2, 0x66, 0x52, 0x98, 0x0d, 0xa3, 0xa9, 0x2d, 0xd6, 0x2b, 0x63, 0x40, 0x1b, 0xa3,
0xa8, 0x4c, 0x5b, 0x4d, 0x3d, 0xd4, 0xc4, 0x34, 0xe6, 0x9c, 0x98, 0x7c, 0x39, 0x79, 0xc8, 0x7f,
0xef, 0xf7, 0x69, 0x52, 0xb3, 0x7e, 0x4b, 0x75, 0x73, 0x0b, 0xfc, 0x20, 0xdf, 0x93, 0xbc, 0xcf,
0x8f, 0xe7, 0x3d, 0x3c, 0xef, 0xc7, 0xd9, 0x8b, 0x6d, 0x81, 0x8d, 0xc8, 0x96, 0xcb, 0x17, 0xf4,
0x6d, 0x8e, 0x93, 0xef, 0x97, 0x00, 0x70, 0xfe, 0x2d, 0x1c, 0x3a, 0xe9, 0xc7, 0x37, 0x3e, 0x82,
0xf4, 0x5a, 0x4d, 0x8a, 0xda, 0xeb, 0x52, 0xc8, 0x15, 0x37, 0xd1, 0xdd, 0xfd, 0x2d, 0x28, 0xbf,
0x23, 0x4a, 0xa4, 0xdf, 0x9f, 0x88, 0xa8, 0xfe, 0xc3, 0xeb, 0xb8, 0x2c, 0x11, 0xb3, 0x72, 0xa3,
0xb1, 0x01, 0x21, 0xdf, 0x26, 0x8c, 0x8f, 0x0c, 0xf1, 0xe1, 0x87, 0xf7, 0xa3, 0x49, 0xc6, 0xc6,
0xc6, 0x76, 0xf4, 0x63, 0x7a, 0x9b, 0x5e, 0xaf, 0xbf, 0x35, 0x31, 0x31, 0x71, 0xfa, 0x58, 0x22,
0x93, 0xd1, 0x10, 0x7b, 0x6e, 0x79, 0x1a, 0x5c, 0x5f, 0x7d, 0x4c, 0x29, 0x95, 0xdf, 0x31, 0xd5,
0xd1, 0x71, 0x95, 0xaa, 0x17, 0xa1, 0x80, 0x1b, 0xc1, 0x60, 0x30, 0xc5, 0xd0, 0xd0, 0x10, 0x9c,
0x4e, 0x27, 0x26, 0x27, 0x27, 0xf7, 0x88, 0xcc, 0x4f, 0xc4, 0x82, 0x23, 0x8b, 0xbc, 0x4e, 0x6b,
0x98, 0x3c, 0xbb, 0x09, 0x89, 0x68, 0xd0, 0x83, 0x9f, 0xfa, 0x94, 0x4c, 0xfc, 0x33, 0x79, 0x13,
0x62, 0x21, 0x2f, 0x28, 0x8a, 0x4a, 0xa1, 0xd1, 0xa8, 0x91, 0x48, 0x24, 0x10, 0x0a, 0x85, 0x30,
0x33, 0x33, 0x03, 0x22, 0x8b, 0x8e, 0x8e, 0x8e, 0xf2, 0x8e, 0x24, 0x0a, 0x07, 0x9c, 0xf1, 0xe4,
0x66, 0xd8, 0x8d, 0x06, 0x60, 0x7e, 0x3c, 0xc7, 0xc4, 0xa5, 0xd7, 0x24, 0xcc, 0x73, 0xf8, 0x90,
0xa8, 0xb7, 0xb7, 0x07, 0x7e, 0xbf, 0x1f, 0x81, 0x40, 0x00, 0x36, 0x9b, 0x0d, 0x06, 0x83, 0x01,
0x23, 0x23, 0x23, 0x9b, 0x3c, 0x1e, 0xef, 0xec, 0x2b, 0x45, 0x94, 0x3f, 0x5d, 0x64, 0x59, 0x79,
0xc2, 0xc4, 0x25, 0xb5, 0x57, 0xb0, 0xf3, 0x17, 0xd1, 0xbd, 0x7b, 0x3a, 0x0c, 0x0c, 0xfc, 0x82,
0xdb, 0xb7, 0xd5, 0xd0, 0x6a, 0xef, 0x40, 0xa7, 0xbb, 0x4b, 0x62, 0x77, 0xc1, 0xe3, 0x57, 0xb8,
0x39, 0x1c, 0x4e, 0x56, 0xe6, 0xa9, 0x73, 0x58, 0xa8, 0xbd, 0x58, 0x70, 0x35, 0x4e, 0x79, 0xc9,
0x06, 0x70, 0x40, 0xa3, 0x56, 0x31, 0xf1, 0x4f, 0x6f, 0x7e, 0x82, 0x38, 0xe5, 0x4b, 0x9b, 0x3a,
0x36, 0xee, 0x3f, 0xd0, 0x81, 0x2f, 0xe0, 0xc6, 0x48, 0x55, 0xa7, 0x32, 0x8a, 0xec, 0xd6, 0x65,
0xa6, 0xa2, 0x48, 0xd0, 0x85, 0x87, 0xc3, 0x3a, 0x66, 0xdb, 0xd3, 0xf1, 0xce, 0xce, 0x0e, 0x50,
0x01, 0xd7, 0xc9, 0x89, 0xd8, 0xa0, 0xd7, 0xc7, 0x65, 0x5f, 0x47, 0x34, 0x1c, 0xfa, 0x6f, 0x44,
0xf4, 0xba, 0x7c, 0xf9, 0xd5, 0xe7, 0xb0, 0x3e, 0x5b, 0x42, 0x78, 0xcb, 0xf3, 0x4a, 0xc9, 0xb1,
0x44, 0xf3, 0x73, 0x26, 0x78, 0x1c, 0x16, 0x82, 0x15, 0xdb, 0x61, 0x1f, 0xdc, 0xa4, 0x92, 0x81,
0x5f, 0x7f, 0xc6, 0x55, 0xd2, 0x29, 0x98, 0xae, 0x71, 0x35, 0x89, 0x24, 0x45, 0x4d, 0x92, 0x5a,
0x09, 0xf3, 0x9b, 0x46, 0xa3, 0xc1, 0xe0, 0xe0, 0xe0, 0x0e, 0x21, 0xa2, 0xd5, 0x6a, 0xbf, 0x61,
0x15, 0xd1, 0x53, 0x14, 0x8f, 0x86, 0x11, 0x8d, 0x84, 0x21, 0x6b, 0x90, 0x41, 0xa1, 0x50, 0x40,
0x2e, 0x97, 0xa3, 0xa9, 0xa9, 0x09, 0x8d, 0x8d, 0x8d, 0x68, 0x68, 0x68, 0x80, 0x4c, 0x26, 0x43,
0x7d, 0x7d, 0x3d, 0x2b, 0x1f, 0xd4, 0x5c, 0x81, 0xc7, 0xe3, 0x61, 0x0e, 0xb4, 0xcb, 0xe5, 0x82,
0x5a, 0xad, 0xde, 0x26, 0x67, 0x2b, 0xfb, 0x25, 0x91, 0x7b, 0xd3, 0x82, 0xc8, 0xc1, 0x5a, 0x5c,
0xaa, 0x12, 0xa1, 0xb9, 0xb9, 0x99, 0x49, 0x5e, 0x57, 0x57, 0x07, 0xa9, 0x54, 0x0a, 0xb1, 0x58,
0x8c, 0xaa, 0xaa, 0x2a, 0x56, 0x44, 0x22, 0x11, 0x33, 0xc6, 0xe1, 0x70, 0xc0, 0xeb, 0xf5, 0x32,
0xf4, 0xf7, 0xf7, 0xef, 0xaa, 0x54, 0xaa, 0x53, 0x2c, 0xa2, 0x75, 0xb8, 0x5d, 0x0e, 0xd8, 0xed,
0x76, 0x5c, 0xac, 0x14, 0x42, 0x22, 0x91, 0x80, 0xcc, 0xf7, 0x4b, 0x70, 0xb9, 0x5c, 0x56, 0xde,
0xab, 0xac, 0x84, 0xc5, 0x62, 0x61, 0xc6, 0xd3, 0xf4, 0xf5, 0xf5, 0xb1, 0x8b, 0xe8, 0xa9, 0x7b,
0x6e, 0xb3, 0x62, 0x6d, 0x6d, 0x0d, 0x65, 0x7c, 0x3e, 0x0a, 0x0b, 0x0b, 0x51, 0x50, 0x50, 0x70,
0x24, 0xf2, 0xf3, 0xf3, 0x51, 0xce, 0x17, 0xc0, 0x6c, 0x36, 0x33, 0xe3, 0x69, 0x94, 0x4a, 0xe5,
0xdf, 0x8b, 0x9e, 0xad, 0xad, 0x62, 0x71, 0x71, 0x11, 0x85, 0x45, 0x17, 0x50, 0x5c, 0xce, 0x3d,
0x44, 0xc5, 0x0b, 0xca, 0x2a, 0x50, 0xc4, 0x42, 0xfe, 0xf9, 0x22, 0x3c, 0x9a, 0x37, 0xe0, 0x87,
0x15, 0x05, 0xf4, 0x4b, 0x0f, 0xd0, 0xd5, 0xd5, 0x95, 0x2e, 0x8a, 0x86, 0x3c, 0x71, 0x2a, 0xe0,
0xdc, 0xef, 0x6f, 0x4b, 0x4f, 0x30, 0x3b, 0x3b, 0x8b, 0xf1, 0xf1, 0xf1, 0x7f, 0x44, 0xf7, 0xd2,
0x17, 0x10, 0x6d, 0x64, 0xe3, 0xeb, 0x15, 0x21, 0x39, 0xe8, 0x9d, 0xbb, 0x2d, 0x2d, 0x2d, 0x29,
0xd1, 0xbb, 0x34, 0x3f, 0xf6, 0x28, 0xb1, 0x30, 0xff, 0x07, 0xd3, 0x89, 0xa7, 0xa7, 0xa7, 0x31,
0x35, 0x35, 0x05, 0x93, 0xc9, 0x04, 0xa3, 0xd1, 0x78, 0x2c, 0x86, 0xa7, 0x7e, 0xc7, 0x2d, 0xf3,
0xfb, 0xf8, 0x6d, 0xb6, 0x07, 0x1d, 0x1d, 0x1d, 0x2f, 0x44, 0xc9, 0x7d, 0xde, 0xde, 0xde, 0xee,
0x6b, 0x6b, 0x6b, 0x4b, 0xb0, 0x80, 0x24, 0xad, 0xad, 0xad, 0x99, 0x48, 0xb0, 0xb0, 0x45, 0x44,
0xd9, 0x29, 0x11, 0xf9, 0xbc, 0x96, 0x9b, 0x9b, 0xfb, 0x0e, 0x8f, 0xcf, 0x8d, 0x55, 0x57, 0x57,
0x43, 0x7c, 0x59, 0x8c, 0x85, 0x85, 0x05, 0x08, 0x85, 0xc2, 0x63, 0x41, 0x4f, 0xb9, 0xa4, 0x46,
0x42, 0x8e, 0x41, 0x35, 0xdd, 0xc5, 0x77, 0xf3, 0xf2, 0xf2, 0x72, 0x49, 0xee, 0xd7, 0x0f, 0x8b,
0xb2, 0x08, 0x6f, 0x16, 0x97, 0x9c, 0x57, 0x97, 0x95, 0x97, 0xc4, 0xcb, 0x2b, 0x4a, 0x77, 0x36,
0x36, 0x36, 0xb0, 0xbc, 0xbc, 0x7c, 0x2c, 0xe8, 0x7b, 0x49, 0x20, 0xe0, 0xc5, 0x49, 0x8e, 0xed,
0x0b, 0x25, 0x45, 0x77, 0xe8, 0x9c, 0xc9, 0x2b, 0x23, 0xbd, 0x1f, 0x91, 0xca, 0x72, 0x72, 0x72,
0xde, 0x2e, 0x2d, 0x2d, 0x1e, 0x25, 0xd5, 0xed, 0xf2, 0x05, 0xbc, 0x3d, 0xc1, 0xc5, 0x7d, 0x48,
0x0f, 0x4b, 0x64, 0x80, 0xee, 0x71, 0x74, 0x15, 0x28, 0x2d, 0x2b, 0x99, 0xa3, 0x73, 0xd0, 0xb9,
0xd2, 0x72, 0x67, 0xbc, 0xe7, 0xf7, 0x2b, 0x7d, 0x83, 0x70, 0x86, 0x70, 0x96, 0x70, 0x8e, 0xf0,
0xd6, 0x01, 0xe7, 0x0e, 0x62, 0x67, 0x0e, 0xfe, 0x93, 0x95, 0x31, 0xd7, 0x49, 0xbc, 0xb3, 0x1d,
0xe9, 0x75, 0xeb, 0xff, 0x12, 0xfd, 0x09, 0xe5, 0x6d, 0x34, 0x09, 0xd2, 0x38, 0x7f, 0x95, 0x00,
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
0xce, 0x00, 0x00, 0x03, 0xb1, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x49, 0x4c, 0x13,
0x51, 0x18, 0xc7, 0x1b, 0xe3, 0x16, 0xf7, 0x28, 0x31, 0xc6, 0xc4, 0x48, 0x10, 0x5b, 0x4c, 0x13,
0xd2, 0x32, 0x2d, 0x6a, 0xc0, 0x84, 0xc4, 0x80, 0x96, 0xa5, 0x33, 0xd3, 0x85, 0x2e, 0x60, 0x5b,
0x16, 0x4b, 0x62, 0xa2, 0xb4, 0x43, 0xa4, 0x88, 0x52, 0x0a, 0xd1, 0x83, 0xd1, 0x83, 0x07, 0xe2,
0x5a, 0xf5, 0x60, 0x22, 0x07, 0x85, 0x83, 0x89, 0x8a, 0x82, 0xe0, 0xc1, 0x1d, 0x0d, 0x1a, 0x34,
0x22, 0xa0, 0xc1, 0x28, 0x21, 0x1a, 0x8a, 0x8a, 0x6b, 0x2a, 0xfa, 0x39, 0x6f, 0x98, 0x69, 0xdf,
0x30, 0xa0, 0x12, 0x97, 0xc3, 0x2f, 0xed, 0xbc, 0xf6, 0xfd, 0x7f, 0xf3, 0xbd, 0x65, 0xde, 0xc8,
0x00, 0x40, 0xf6, 0x3f, 0x90, 0xfd, 0x57, 0x91, 0x5a, 0xb5, 0xbc, 0x94, 0xe5, 0x24, 0xc6, 0x09,
0x8c, 0xe3, 0x3c, 0x41, 0x8c, 0x63, 0x18, 0x47, 0x31, 0x8e, 0x60, 0x1c, 0xe6, 0xd9, 0xcb, 0x32,
0x5d, 0x96, 0xa4, 0x8e, 0xdd, 0x4f, 0x24, 0xc5, 0x8e, 0x18, 0x0c, 0x04, 0x18, 0x8d, 0xa3, 0xb0,
0xdf, 0xbf, 0x47, 0x49, 0x42, 0x7c, 0xa3, 0x69, 0x0c, 0x2a, 0x69, 0x04, 0x41, 0x71, 0xa8, 0x11,
0x5f, 0x11, 0x24, 0x29, 0x21, 0x9c, 0xac, 0x8d, 0x0b, 0xb3, 0xf9, 0x67, 0x51, 0x35, 0xb0, 0xad,
0x74, 0x3d, 0xd4, 0x1d, 0xb4, 0xff, 0x13, 0x98, 0xb2, 0x0c, 0x40, 0x0e, 0x4e, 0x54, 0xb1, 0x43,
0xc7, 0x35, 0x7a, 0xcb, 0xd2, 0xa1, 0x78, 0xf3, 0xba, 0xbf, 0xc2, 0x36, 0xcf, 0xe8, 0xcd, 0x57,
0xee, 0xcc, 0x94, 0x8a, 0xd6, 0xac, 0x89, 0x83, 0x98, 0x98, 0x39, 0x1c, 0xa9, 0xa9, 0x6b, 0xc1,
0x6e, 0xb7, 0x80, 0xcd, 0x66, 0x01, 0xab, 0x35, 0x17, 0x72, 0x73, 0x4d, 0x60, 0x36, 0x1b, 0xc1,
0x64, 0xa2, 0xd9, 0xe1, 0xa5, 0x80, 0xa6, 0xf5, 0x40, 0x92, 0xd9, 0x90, 0x93, 0x93, 0x09, 0xd9,
0xd9, 0x3a, 0x0e, 0xa5, 0x52, 0x1e, 0xe9, 0xaf, 0x52, 0x2d, 0xe3, 0x32, 0x77, 0xee, 0xca, 0x92,
0x8a, 0xcc, 0xb9, 0x1a, 0x48, 0x49, 0x8d, 0xe7, 0x70, 0x97, 0xb8, 0x20, 0x14, 0x0a, 0x4d, 0x0a,
0xa3, 0x31, 0x33, 0xd2, 0x9f, 0xa4, 0x54, 0x5c, 0xe6, 0xae, 0xaa, 0x6c, 0xa9, 0x08, 0xa7, 0x3a,
0x50, 0x2a, 0x0a, 0xe9, 0xef, 0xe9, 0xf9, 0xa5, 0xa8, 0xdc, 0xe7, 0x94, 0xe4, 0x54, 0xf9, 0x31,
0x91, 0x97, 0x49, 0x87, 0x7d, 0xfb, 0x4d, 0x22, 0xaa, 0xaa, 0xb6, 0x8a, 0x42, 0xea, 0x8d, 0x46,
0x68, 0xaa, 0xa8, 0x80, 0x97, 0xdd, 0xdd, 0x13, 0x8a, 0xca, 0xca, 0x36, 0x49, 0x72, 0x7c, 0x15,
0xba, 0xa8, 0x68, 0x3c, 0x8a, 0x8b, 0x9c, 0x91, 0x80, 0x67, 0xed, 0xed, 0x70, 0xb9, 0xb2, 0x12,
0x3e, 0x0c, 0x0d, 0x41, 0x5b, 0x6d, 0x2d, 0x5c, 0xaf, 0xab, 0x83, 0xd0, 0xe0, 0xa0, 0x44, 0x44,
0x92, 0x1b, 0x61, 0xa2, 0x3c, 0x24, 0x52, 0x25, 0xaa, 0xe5, 0xab, 0x13, 0x88, 0x0d, 0x80, 0x58,
0xa5, 0x49, 0xbf, 0x87, 0xda, 0x18, 0xc6, 0x7b, 0x5d, 0x08, 0xb8, 0x57, 0x5f, 0x0f, 0x17, 0x18,
0x06, 0x1e, 0x35, 0x36, 0x42, 0x6f, 0x4b, 0x0b, 0xf4, 0xdf, 0xbf, 0x0f, 0xe7, 0x3d, 0x1e, 0xe8,
0x6a, 0x6b, 0x13, 0x89, 0x1c, 0x8e, 0xfc, 0x06, 0xd4, 0x37, 0x41, 0x93, 0x11, 0x4a, 0xd0, 0xb0,
0x79, 0x9a, 0x8c, 0x37, 0xe8, 0x1a, 0xc1, 0x3d, 0x19, 0x96, 0x12, 0x39, 0xb3, 0xe4, 0x1a, 0x0a,
0x46, 0x21, 0xaf, 0xa1, 0x36, 0x9f, 0xcf, 0xd7, 0x84, 0x87, 0x5c, 0xa9, 0xa9, 0x81, 0x87, 0x0d,
0x0d, 0xd0, 0xdf, 0xd1, 0x01, 0xe1, 0x70, 0x18, 0xba, 0x2f, 0x5d, 0x82, 0x7a, 0x93, 0x09, 0xae,
0xec, 0xd9, 0x13, 0xf9, 0x4f, 0x61, 0x61, 0xe1, 0x51, 0xd4, 0x57, 0xae, 0xa5, 0x5e, 0xb3, 0x00,
0x4b, 0x48, 0xf4, 0x08, 0x4a, 0x4c, 0xcc, 0x98, 0x1d, 0x11, 0x69, 0xc9, 0x9b, 0x63, 0x45, 0x28,
0xec, 0xdc, 0x96, 0x2d, 0xd0, 0x79, 0xe6, 0x0c, 0xf4, 0x36, 0x37, 0x43, 0xd3, 0xf6, 0xed, 0xd0,
0x7e, 0xea, 0x94, 0x64, 0xe8, 0x30, 0xd1, 0x20, 0x2f, 0x7a, 0x2b, 0x12, 0x29, 0x52, 0xf4, 0x73,
0xa3, 0x15, 0x51, 0x77, 0x50, 0x9b, 0xc7, 0xe3, 0x39, 0x2d, 0xaa, 0x28, 0x10, 0x80, 0xdb, 0x87,
0x0e, 0x41, 0x4b, 0x75, 0x35, 0xbc, 0x7a, 0xf1, 0x62, 0xdc, 0xc5, 0x80, 0x89, 0x42, 0xbc, 0x68,
0x58, 0x24, 0x8a, 0x5f, 0xad, 0x9b, 0x17, 0xad, 0x88, 0xba, 0x8b, 0xda, 0x0c, 0x06, 0x03, 0xdd,
0xda, 0xda, 0xfa, 0x5e, 0x08, 0xb9, 0x58, 0x5e, 0x0e, 0x3d, 0x37, 0x6e, 0xfc, 0x74, 0x79, 0x63,
0xa2, 0x21, 0x24, 0x52, 0x68, 0xa9, 0x8f, 0x22, 0x51, 0x1c, 0x61, 0x9e, 0x8f, 0x55, 0xd4, 0x21,
0xfc, 0xc8, 0x76, 0x3c, 0x11, 0x0c, 0x06, 0xdf, 0x0c, 0x0c, 0x0c, 0xfc, 0xd6, 0x86, 0x2d, 0x28,
0x28, 0x38, 0xc2, 0x8b, 0xde, 0xf2, 0x15, 0x7d, 0x11, 0x89, 0x62, 0x55, 0xd4, 0x82, 0xa8, 0x88,
0x7e, 0x80, 0x9f, 0x23, 0x25, 0x25, 0x25, 0x7b, 0xdd, 0x6e, 0xf7, 0x67, 0xbf, 0xdf, 0xff, 0x7c,
0x12, 0xa2, 0x77, 0xbc, 0x28, 0x2c, 0x12, 0x29, 0xd7, 0x9a, 0x17, 0x62, 0xa2, 0x87, 0x63, 0x0f,
0x2d, 0x86, 0x61, 0x82, 0x5e, 0xaf, 0x77, 0xe8, 0x57, 0x22, 0xa7, 0xd3, 0x29, 0x88, 0x86, 0x79,
0xd1, 0x37, 0x91, 0x28, 0x21, 0x99, 0x5e, 0x84, 0x2d, 0xef, 0xc7, 0x63, 0x45, 0x81, 0x40, 0x60,
0x6a, 0x51, 0x51, 0x51, 0x57, 0x5f, 0x5f, 0xdf, 0x4f, 0x45, 0x2e, 0x97, 0xeb, 0x30, 0x27, 0x4a,
0xa6, 0xde, 0xf3, 0x22, 0x10, 0x89, 0xe4, 0x44, 0x4e, 0x0c, 0x36, 0x47, 0x4f, 0xc6, 0x3b, 0x8a,
0x1d, 0x0e, 0xc7, 0x22, 0x76, 0x25, 0xde, 0xea, 0xec, 0xec, 0x1c, 0x41, 0x73, 0x36, 0x1e, 0x82,
0x08, 0x2d, 0x02, 0x41, 0x24, 0x93, 0x05, 0xa6, 0x44, 0x44, 0x2b, 0x12, 0xe9, 0xc5, 0x98, 0xa8,
0x77, 0xa2, 0x73, 0x3f, 0x2d, 0x2d, 0x6d, 0xaa, 0x5e, 0xaf, 0xcf, 0xcf, 0xcb, 0xcb, 0xf3, 0xdb,
0xed, 0xf6, 0x00, 0xc2, 0x66, 0xb3, 0xd5, 0x58, 0xad, 0xd6, 0x5a, 0x8b, 0xc5, 0xb2, 0x3b, 0x2b,
0x2b, 0x6b, 0x1d, 0x3f, 0x74, 0x9f, 0x04, 0x11, 0x41, 0xb8, 0xa7, 0x45, 0xe7, 0x48, 0x6b, 0x5e,
0x82, 0x89, 0xfa, 0xfe, 0xe4, 0x25, 0x84, 0xdb, 0x2a, 0xec, 0x22, 0x10, 0x44, 0x0a, 0xb5, 0x7e,
0x29, 0x27, 0x52, 0x68, 0xe8, 0x42, 0x85, 0x86, 0x3a, 0x87, 0x89, 0x40, 0x4e, 0x50, 0x27, 0xd9,
0xf2, 0xf3, 0x27, 0x2b, 0x59, 0xa9, 0xa5, 0x0e, 0xb0, 0xe1, 0x4f, 0x05, 0xc9, 0x28, 0xe4, 0x00,
0xfb, 0xd9, 0x2c, 0x43, 0x15, 0x88, 0x24, 0x51, 0xd9, 0xa3, 0xc9, 0x8a, 0xd8, 0x9b, 0xbb, 0xca,
0xef, 0x21, 0x09, 0xb2, 0xf8, 0x78, 0xdd, 0x8c, 0xd8, 0x34, 0xd7, 0xcc, 0xb1, 0x28, 0x95, 0xe6,
0xe9, 0x7f, 0xf3, 0xbd, 0xee, 0x07, 0xad, 0x9c, 0x79, 0xf1, 0x33, 0xfc, 0xbe, 0xc6, 0x00, 0x00,
0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE plot_xpm[1] = {{ png, sizeof( png ), "plot_xpm" }};

View File

@ -1,336 +1,178 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="26"
width="26"
version="1.0"
width="64"
height="64"
id="svg2"
inkscape:version="0.48.3.1 r9886"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="plot.svg">
<defs
id="defs4">
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter3945">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.05617153"
id="feGaussianBlur3947" />
</filter>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter3941">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.05617153"
id="feGaussianBlur3943" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.511069"
inkscape:cx="16.516904"
inkscape:cy="36.797954"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1441"
inkscape:window-height="789"
inkscape:window-x="384"
inkscape:window-y="19"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid3940"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata249">
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="849"
id="namedview247"
showgrid="true"
inkscape:snap-grids="false"
inkscape:snap-to-guides="false"
inkscape:zoom="19.416417"
inkscape:cx="8.3256187"
inkscape:cy="15.933751"
inkscape:window-x="0"
inkscape:window-y="29"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
<inkscape:grid
type="xygrid"
id="grid3230"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<linearGradient
id="linearGradient7612">
<stop
id="stop7614"
style="stop-color:black;stop-opacity:1"
offset="0" />
<stop
id="stop7616"
style="stop-color:black;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient8589">
<stop
id="stop8591"
style="stop-color:#fefefe;stop-opacity:1"
offset="0" />
<stop
id="stop8593"
style="stop-color:#bebebe;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient4559">
<stop
id="stop4561"
style="stop-color:silver;stop-opacity:1"
offset="0" />
<stop
id="stop4563"
style="stop-color:#949492;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient6866">
<stop
id="stop6868"
style="stop-color:#828282;stop-opacity:1"
offset="0" />
<stop
id="stop6870"
style="stop-color:#aaa;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient6842">
<stop
id="stop6844"
style="stop-color:white;stop-opacity:1"
offset="0" />
<stop
id="stop6846"
style="stop-color:white;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient6828">
<stop
id="stop6830"
style="stop-color:#6e6e6e;stop-opacity:1"
offset="0" />
<stop
id="stop6832"
style="stop-color:#1e1e1e;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient2366">
<stop
id="stop2368"
style="stop-color:#2e3436;stop-opacity:1"
offset="0" />
<stop
id="stop2370"
style="stop-color:#555753;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient2463">
<stop
id="stop2465"
style="stop-color:white;stop-opacity:1"
offset="0" />
<stop
id="stop2467"
style="stop-color:white;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2463"
id="radialGradient3363"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.34597801,-0.00249102,0.00146451,0.18254759,3.4976504,10.233464)"
cx="11.537243"
cy="15.279687"
fx="11.537243"
fy="15.279687"
r="13" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6828"
id="linearGradient3366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.48487278,0,0,0.45905421,1.3755554,1.6651282)"
x1="21.919418"
y1="21"
x2="22.007805"
y2="33" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2366"
id="linearGradient3368"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.48487278,0,0,0.45905421,1.3755554,1.6651282)"
x1="15.600636"
y1="33"
x2="15.335471"
y2="21" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6842"
id="radialGradient3371"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.46478332,0.00764214,-0.00586981,0.27402266,1.926003,10.140931)"
cx="3.7590685"
cy="11.918329"
fx="3.7590685"
fy="11.918329"
r="21" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8589"
id="linearGradient3374"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.48929015,0,0,0.50164024,1.2695365,1.2507085)"
x1="11.519291"
y1="20"
x2="11.50602"
y2="37" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6866"
id="linearGradient3376"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.48929015,0,0,0.50164024,1.2695366,1.2507185)"
x1="20.561552"
y1="36.999981"
x2="20.278992"
y2="19.999981" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient7612"
id="radialGradient3384"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.62941178,0,0,0.16148867,-2.0933823,14.074183)"
cx="24"
cy="41.875"
fx="24"
fy="41.875"
r="19.125" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8589"
id="linearGradient3386"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.3707081,0,0,0.3548465,-0.8566575,-0.04895116)"
x1="32.892288"
y1="8.0590115"
x2="36.358372"
y2="5.4565363" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4559"
id="linearGradient3388"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6844293,0,0,0.6820072,-0.2131519,0.1569169)"
x1="17.288921"
y1="2.184907"
x2="15.179585"
y2="5.8214641" />
</defs>
<path
style="opacity:0.7;fill:url(#radialGradient3384);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible"
id="path3087"
d="m 25.05,20.836527 c 0,1.705716 -5.389372,3.088473 -12.0375,3.088473 -6.6481279,0 -12.03749995,-1.382757 -12.03749995,-3.088473 0,-1.705717 5.38937205,-3.088474 12.03749995,-3.088474 6.648128,0 12.0375,1.382757 12.0375,3.088474 l 0,0 z"
inkscape:connector-curvature="0" />
<rect
style="fill:#505050;fill-opacity:1;stroke:#3c3d3a;stroke-width:0.97643673;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect2315"
y="6.3444996"
x="5.4891047"
ry="0.34386581"
rx="0.29248512"
height="10.453215"
width="15.046791" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="matrix(1.003125,0,0,0.95029949,4.9875,2.0681112)">
transform="translate(0,-988.36218)">
<path
style="fill:#f4f4f4;fill-opacity:1;stroke:#b5b6b2;stroke-width:0.9952535;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
id="rect2594"
d="m 1.4976268,0.49762721 c 2.980045,0 4.9376418,0 7.9176887,0 0.522766,0.16184396 4.3536885,2.61362219 5.0870585,3.89029659 0,3.907463 0,7.2069842 0,11.1144502 -4.334914,0 -8.6698338,0 -13.0047472,0 0,-5.001584 0,-10.0031638 0,-15.00474679 z"
inkscape:connector-curvature="0" />
style="fill:#727272;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 17.002107,1026.8886 11.090925,12.7083 -2.114472,-8.0173 z"
id="path3009"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="fill:url(#linearGradient3386);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3388);stroke-width:0.9952535;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="path12038"
d="M 9.5,0.4979205 C 9.5,2.041279 9.5,4.5 9.5,4.5 c 0,0 4.080603,0 5.00208,0 0,-1.9018156 -3.00574,-4.0020795 -5.00208,-4.0020795 z"
inkscape:connector-curvature="0" />
style="fill:#263550;fill-opacity:1;stroke:#6e6d46;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 51.898416,1013.7273 6.938118,0 0.330387,30.3114 1.428336,1.3934 3.390612,0.3088 0,4.0213 -16.716961,-3e-4 0.0625,-4.0002 3.080268,-0.2268 1.321547,-1.4968 z"
id="path3784-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccc" />
<path
style="fill:#263450;fill-opacity:1;stroke:#31301f;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 4.8409543,1014.4098 6.8644757,0 0.326879,30.3113 1.413176,1.3935 3.354621,0.3087 0.0221,3.5389 -16.4997807,0 0,-3.5181 3.0475729,-0.2267 1.3075192,-1.4969 z"
id="path3784"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccc" />
<path
style="fill:#94965a;fill-opacity:1;stroke:#31301f;stroke-width:3.14142156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 1.5627572,998.69949 c -0.115116,15.76081 0,15.47331 0,15.59551 0,0.1222 60.9743798,0 60.9743798,0 l -0.115116,-15.83981 -2.370672,-2.56571 -55.4439697,-0.10732 z"
id="path3770"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccccc" />
<rect
style="opacity:0.86666667;fill:#000000;fill-opacity:1;stroke:#813333;stroke-width:0;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3768"
width="48"
height="5.0951352"
x="8.0951376"
y="1002.2205" />
<path
style="fill:#ededed;fill-opacity:1;stroke:#2c2c2c;stroke-width:1.01575553;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 16,1004.3622 31.53081,0.4152 -0.0627,35.7326 -16.186945,-0.016 -2.602111,-1.0754 -1.766453,-2.1849 -0.866085,-2.6812 -0.04652,-3.1903 -4,-1 -2.440352,-1.3616 -2.413562,-2.2059 L 16,1023.3622 z"
id="path3772"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccc" />
<g
transform="matrix(0.80589226,0,0,0.73295435,21.519982,1009.0252)"
id="g3872">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path2990"
d="M 5,2 5,24 21.5,13 z"
style="fill:#fafafa;fill-opacity:1;stroke:#800000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3760"
d="m 7.5,10.43551 4.5,0"
style="fill:#f0f0f0;fill-opacity:1;stroke:#800000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
style="fill:#f0f0f0;fill-opacity:1;stroke:#800000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 7.5,15.5 4.5,0"
id="path3762"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3766"
d="M 21.5,13 25,13"
style="fill:#f0f0f0;fill-opacity:1;stroke:#800000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3768"
d="M 5,9 1,9"
style="fill:#f0f0f0;fill-opacity:1;stroke:#800000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3770-7"
d="M 5,17 1,17"
style="fill:#f0f0f0;fill-opacity:1;stroke:#800000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
style="opacity:0.75;fill:none;stroke:#800000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter3945)"
d="M 12.265694,2.5 23.5,13.734306"
id="path3767"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3813"
d="m 9.6628978,13.25 0,4.5"
style="fill:#f0f0f0;fill-opacity:1;stroke:#800000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3769"
d="M 23.5,2.5 12.265694,13.734306"
style="opacity:0.75;fill:none;stroke:#800000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter3941)" />
</g>
</g>
<path
style="fill:#505050;fill-opacity:1;stroke:#3c3d3a;stroke-width:0.97607064;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect6333"
d="m 3.4902373,19.648515 c 0.0372,0.492312 -0.096322,1.022083 0.1178052,1.478207 0.4016867,0.578915 1.2882102,0.388557 1.88102,0.421686 0.010697,0.341741 0.043493,0.869308 0.5015625,0.942 4.838952,0.01854 9.204246,0.0027 14.04375,0.008 0.499416,0.01509 0.517708,-0.551924 0.501563,-0.911739 0.163104,-0.08864 0.62666,-0.01312 0.851906,-0.0382 0.557337,0.07746 1.238803,-0.313401 1.145931,-0.963311 0,-0.312193 0,-0.62439 0,-0.936581 -6.347846,0 -12.6956916,0 -19.0435377,0 z"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient3374);fill-opacity:1;stroke:url(#linearGradient3376);stroke-width:1.0025059;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect2313"
d="m 3.5099795,11.534333 19.0050395,0 c 0.563539,0 1.017219,0.465131 1.017219,1.042893 l 0,6.98335 -21.0394761,0 0,-6.98335 c 0,-0.577762 0.4536792,-1.042893 1.0172176,-1.042893 z"
inkscape:connector-curvature="0" />
<path
style="opacity:0.9;fill:none;stroke:url(#radialGradient3371);stroke-width:0.97626287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect2374"
d="m 3.94763,12.996511 18.129739,0 c 0.24118,0 0.464866,0.195974 0.464866,0.407279 l 0,5.294608 -19.0594698,0 0,-5.294608 c 0,-0.211305 0.223685,-0.407279 0.4648648,-0.407279 z"
inkscape:connector-curvature="0" />
<rect
style="fill:url(#linearGradient3366);fill-opacity:1;stroke:url(#linearGradient3368);stroke-width:0.94357365;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect2319"
y="11.534793"
x="6.4667187"
height="5.0495954"
width="13.091562" />
<rect
style="opacity:0.3;fill:none;stroke:url(#radialGradient3363);stroke-width:0.97617936;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect2459"
y="12.996471"
x="7.4952221"
height="2.8510695"
width="11.034554" />
<path
style="fill:#4de304;fill-opacity:1;stroke:none"
id="path2764"
d="m 22.794417,17.581559 c 5.67e-4,0.646248 -0.523919,1.170436 -1.171098,1.170436 -0.647182,0 -1.171667,-0.524188 -1.171099,-1.170436 -5.68e-4,-0.646251 0.523917,-1.170439 1.171099,-1.170439 0.647179,0 1.171665,0.524188 1.171098,1.170439 l 0,0 z"
inkscape:connector-curvature="0" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:none"
id="rect6331"
d="m 20.034375,20.123802 0,1.663024 c 0,0.131617 -0.09787,0.237575 -0.219434,0.237575 l -13.6048824,0 c -0.1215662,0 -0.2194336,-0.105958 -0.2194336,-0.237575 l 0,-1.663024 14.04375,0 z"
inkscape:connector-curvature="0" />
<rect
style="fill:#323232;fill-opacity:1;stroke:none"
id="rect6329"
y="20.123802"
x="6.9937501"
height="0.95029944"
width="12.0375" />
<g
transform="scale(0.84648552,1.1813551)"
style="font-size:19.81988144px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#183f51;fill-opacity:1;stroke:#fdf8f1;stroke-width:1.06046307;stroke-miterlimit:4;stroke-opacity:1;font-family:Sans"
id="text3097">
<path
d="m 0.62596119,0.43464328 6.18403531,0 c 1.8387487,1.445e-5 3.2484625,0.40970234 4.2291445,1.22906492 0.98711,0.8129372 1.480671,1.9742572 1.480685,3.4839635 -1.4e-5,1.5161776 -0.493575,2.6839494 -1.480685,3.5033189 -0.980682,0.8129303 -2.3903958,1.2193923 -4.2291445,1.2193872 l -2.4581299,0 0,5.0130362 -3.72590541,0 0,-14.44877072 M 4.3518666,3.134715 l 0,4.0355911 2.0613451,0 C 7.1358032,7.1703138 7.693882,6.9961158 8.0874498,6.6477116 8.4809989,6.292872 8.6777782,5.7928592 8.677788,5.1476717 8.6777782,4.5025037 8.4809989,4.0057168 8.0874498,3.6573095 7.693882,3.3089248 7.1358032,3.1347268 6.4132117,3.134715 l -2.0613451,0"
style="font-weight:bold;fill:#515450;stroke:#fdf8f1;-inkscape-font-specification:Sans Bold;fill-opacity:1"
id="path3032" />
</g>
<path
sodipodi:type="arc"
style="fill:#fdf8f1;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3030"
sodipodi:cx="5.7425632"
sodipodi:cy="6.0684133"
sodipodi:rx="1.6738412"
sodipodi:ry="2.2146208"
d="m 7.4164045,6.0684133 a 1.6738412,2.2146208 0 1 1 -3.3476825,0 1.6738412,2.2146208 0 1 1 3.3476825,0 z"
transform="matrix(1.1846154,0,0,1,-1.5236908,-0.10300562)" />
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -186,6 +186,7 @@ set( COMMON_SRCS
kiway_express.cpp
kiway_holder.cpp
kiway_player.cpp
lockfile.cpp
msgpanel.cpp
netlist_keywords.cpp
newstroke_font.cpp

View File

@ -192,7 +192,7 @@ bool EDA_ITEM::Replace( wxFindReplaceData& aSearchData, wxString& aText )
wxCHECK_MSG( IsReplaceable(), false,
wxT( "Attempt to replace text in <" ) + GetClass() + wxT( "> item." ) );
wxString searchString = (aSearchData.GetFlags() & wxFR_MATCHCASE) ? aText.Upper() : aText;
wxString searchString = (aSearchData.GetFlags() & wxFR_MATCHCASE) ? aText : aText.Upper();
int result = searchString.Find( (aSearchData.GetFlags() & wxFR_MATCHCASE) ?
aSearchData.GetFindString() :

View File

@ -44,6 +44,7 @@
#include <wxstruct.h>
#include <macros.h>
#include <menus_helpers.h>
#include <dialog_shim.h>
#include <boost/version.hpp>
#include <typeinfo>
@ -107,6 +108,39 @@ EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
{
DIALOG_SHIM* dlg = NULL;
wxWindowList list = GetChildren();
// Quasi modal dialogs create issues (crashes) when closing Kicad.
// I am guessing they are delete too late, when deleting main frames.
// AFAIK, only these DIALOG_SHIM dialogs create such issues.
// The policy is do not allow closing Kicad if a Quasi modal dialog is open.
// (Anyway, closing without prompting the user is certainly bad,
// because an edit is in preogress)
// Therefore, iterate through the child list to find at least
// a DIALOG_SHIM opened in quasi modal mode
for( wxWindowList::iterator iter = list.begin(); iter != list.end(); ++iter )
{
if( (dlg = dynamic_cast<DIALOG_SHIM*> (*iter) ) != NULL )
{
if( dlg->IsQuasiModal() )
break;
else
dlg = NULL;
}
}
if( dlg )
{
// Happens when a quasi modal dialog is currently open.
// For example: if the Kicad manager try to close Kicad.
wxMessageBox( _(
"The program cannot be closed\n"
"A quasi-modal dialog window is currently open, please close it first." ) );
event.Veto();
return;
}
wxConfigBase* cfg = config();
if( cfg )
@ -361,18 +395,27 @@ void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
*/
if( event.GetId() == wxID_INDEX )
{
// Search for "getting_started_in_kicad.pdf" or "Getting_Started_in_KiCad.pdf"
wxString helpFile = SearchHelpFileFullPath( search, wxT( "getting_started_in_kicad.pdf" ) );
// List of possible names for Getting Started in KiCad
const wxChar* names[2] = {
wxT( "getting_started_in_kicad" ),
wxT( "Getting_Started_in_KiCad" )
};
if( !helpFile )
helpFile = SearchHelpFileFullPath( search, wxT( "Getting_Started_in_KiCad.pdf" ) );
wxString helpFile;
// Search for "getting_started_in_kicad.html" or "getting_started_in_kicad.pdf"
// or "Getting_Started_in_KiCad.html" or "Getting_Started_in_KiCad.pdf"
for( unsigned ii = 0; ii < DIM( names ); ii++ )
{
helpFile = SearchHelpFileFullPath( search, names[ii] );
if( !helpFile.IsEmpty() )
break;
}
if( !helpFile )
{
wxString msg = wxString::Format( _(
"Help file '%s' could not be found." ),
wxT( "getting_started_in_kicad.pdf" )
);
"Html or pdf help file \n'%s'\n or\n'%s' could not be found." ), names[0], names[1] );
wxMessageBox( msg );
}
else
@ -384,24 +427,6 @@ void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
}
wxString base_name = help_name();
#if defined ONLINE_HELP_FILES_FORMAT_IS_HTML
wxHtmlHelpController* hc = Pgm().GetHtmlHelpController();
wxString helpFile = SearchHelpFileFullPath( search, );
if( !!helpFile )
{
hc->UseConfig( Pgm().CommonSettings() );
hc->SetTitleFormat( wxT( "KiCad Help" ) );
hc->AddBook( helpFile );
}
hc->DisplayContents();
hc->Display( helpFile );
#elif defined ONLINE_HELP_FILES_FORMAT_IS_PDF
wxString helpFile = SearchHelpFileFullPath( search, base_name );
if( !helpFile )
@ -416,10 +441,6 @@ void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
{
GetAssociatedDocument( this, helpFile );
}
#else
# error Help files format not defined
#endif
}

View File

@ -1,8 +1,7 @@
#include <wx/config.h>
#include <bin_mod.h>
#include <online_help.h>
#include <common.h>
BIN_MOD::BIN_MOD( const char* aName ) :
@ -15,19 +14,17 @@ BIN_MOD::BIN_MOD( const char* aName ) :
void BIN_MOD::Init()
{
// do an OS specific wxConfig instantiation, using the bin_mod (EXE/DLL/DSO) name.
m_config = new wxConfig( wxString::FromUTF8( m_name ) );
m_config = GetNewConfig( wxString::FromUTF8( m_name ) );
m_history.Load( *m_config );
// Prepare On Line Help. Use only lower case for help file names, in order to
// avoid problems with upper/lower case file names under windows and unix.
#if defined ONLINE_HELP_FILES_FORMAT_IS_HTML
m_help_file = wxString::FromUTF8( m_name ) + wxT( ".html" );
#elif defined ONLINE_HELP_FILES_FORMAT_IS_PDF
m_help_file = wxString::FromUTF8( m_name ) + wxT( ".pdf" );
#else
#error Help files format not defined
#endif
// Help files are now using html format.
// Old help files used pdf format.
// so when searching a help file, the .html file will be searched,
// and if not found, the .pdf file will be searched.
m_help_file = wxString::FromUTF8( m_name ); // no ext given. can be .html or .pdf
}

View File

@ -39,16 +39,10 @@
#include <base_units.h>
#include <wx/process.h>
#include <wx/config.h>
#include <wx/utils.h>
#include <wx/stdpaths.h>
// Show warning if wxWidgets Gnome or GTK printing was not configured.
// Since wxWidgets 3.0, this is no more needed (build in printing works!)
#if defined( __WXGTK__ )
#if !wxCHECK_VERSION( 3, 0, 0 )
# if !wxUSE_LIBGNOMEPRINT && !wxUSE_GTKPRINT && !SWIG
# warning "You must use '--with-gnomeprint' or '--with-gtkprint' in your wx library configuration for full print capabilities."
# endif
#endif
#endif
/**
* Global variables definitions.
@ -59,7 +53,6 @@
*/
bool g_ShowPageLimits = true;
EDA_UNITS_T g_UserUnit;
EDA_COLOR_T g_GhostColor;
@ -290,8 +283,8 @@ double RoundTo0( double x, double precision )
wxString FormatDateLong( const wxDateTime &aDate )
{
/* GetInfo was introduced only on wx 2.9; for portability reason an
* hardcoded format is used on wx 2.8 */
// GetInfo was introduced only on wx 2.9; for portability reason an
// hardcoded format is used on wx 2.8
#if wxCHECK_VERSION( 2, 9, 0 )
return aDate.Format( wxLocale::GetInfo( wxLOCALE_LONG_DATE_FMT ) );
#else
@ -299,3 +292,54 @@ wxString FormatDateLong( const wxDateTime &aDate )
#endif
}
wxConfigBase* GetNewConfig( const wxString& aProgName )
{
wxConfigBase* cfg = 0;
wxFileName configname;
configname.AssignDir( GetKicadConfigPath() );
configname.SetFullName( aProgName );
cfg = new wxFileConfig( wxT( "" ), wxT( "" ), configname.GetFullPath() );
return cfg;
}
wxString GetKicadConfigPath()
{
wxFileName cfgpath;
// From the wxWidgets wxStandardPaths::GetUserConfigDir() help:
// Unix: ~ (the home directory)
// Windows: "C:\Documents and Settings\username\Application Data"
// Mac: ~/Library/Preferences
cfgpath.AssignDir( wxStandardPaths::Get().GetUserConfigDir() );
#if !defined( __WINDOWS__ ) && !defined( __WXMAC__ )
wxString envstr;
if( !wxGetEnv( wxT( "XDG_CONFIG_HOME" ), &envstr ) || envstr.IsEmpty() )
{
// XDG_CONFIG_HOME is not set, so use the fallback
cfgpath.AppendDir( wxT( ".config" ) );
}
else
{
// Override the assignment above with XDG_CONFIG_HOME
cfgpath.AssignDir( envstr );
}
#endif
cfgpath.AppendDir( wxT( "kicad" ) );
#if !wxCHECK_VERSION( 2, 9, 0 )
#define wxS_DIR_DEFAULT 0777
#endif
if( !cfgpath.DirExists() )
{
cfgpath.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL );
}
return cfgpath.GetPath();
}

View File

@ -129,7 +129,7 @@ void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock,
{
WS_DRAW_ITEM_TEXT* text = (WS_DRAW_ITEM_TEXT*) item;
plotter->Text( text->GetTextPosition(), text->GetColor(),
text->GetText(), text->GetOrientation(),
text->GetShownText(), text->GetOrientation(),
text->GetSize(),
text->GetHorizJustify(), text->GetVertJustify(),
text->GetPenWidth(),

View File

@ -40,6 +40,40 @@
#include <boost/foreach.hpp>
void wxConfigLoadParams( wxConfigBase* aCfg,
const PARAM_CFG_ARRAY& aList, const wxString& aGroup )
{
wxASSERT( aCfg );
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
{
if( !!param.m_Group )
aCfg->SetPath( param.m_Group );
else
aCfg->SetPath( aGroup );
if( param.m_Setup )
continue;
param.ReadParam( aCfg );
}
}
void wxConfigLoadSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
{
wxASSERT( aCfg );
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
{
if( !param.m_Setup )
continue;
param.ReadParam( aCfg );
}
}
void wxConfigSaveParams( wxConfigBase* aCfg,
const PARAM_CFG_ARRAY& aList, const wxString& aGroup )
{
@ -68,26 +102,6 @@ void wxConfigSaveParams( wxConfigBase* aCfg,
}
void wxConfigLoadParams( wxConfigBase* aCfg,
const PARAM_CFG_ARRAY& aList, const wxString& aGroup )
{
wxASSERT( aCfg );
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
{
if( !!param.m_Group )
aCfg->SetPath( param.m_Group );
else
aCfg->SetPath( aGroup );
if( param.m_Setup )
continue;
param.ReadParam( aCfg );
}
}
void wxConfigSaveSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
{
wxASSERT( aCfg );
@ -110,21 +124,6 @@ void wxConfigSaveSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
}
void wxConfigLoadSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
{
wxASSERT( aCfg );
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
{
if( !param.m_Setup )
continue;
param.ReadParam( aCfg );
}
}
void ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double aValue )
{
// Use a single strategy, regardless of wx version.

View File

@ -27,29 +27,30 @@
#include <kiway_player.h>
#include <wx/evtloop.h>
/*
Quasi-Modal Mode Explained:
The gtk calls in wxDialog::ShowModal() cause event routing problems if that
modal dialog then tries to use KIWAY_PLAYER::ShowModal(). The latter shows up
and mostly works but does not respond to the window decoration close button.
There is no way to get around this without reversing the gtk calls temporarily.
/// Toggle a window's "enable" status to disabled, then enabled on destruction.
class WDO_ENABLE_DISABLE
{
wxWindow* m_win;
Quasi-Modal mode is our own almost modal mode which disables only the parent
of the DIALOG_SHIM, leaving other frames operable and while staying captured in the
nested event loop. This avoids the gtk calls and leaves event routing pure
and sufficient to operate the KIWAY_PLAYER::ShowModal() properly. When using
ShowQuasiModal() you have to use EndQuasiModal() in your dialogs and not
EndModal(). There is also IsQuasiModal() but its value can only be true
when the nested event loop is active. Do not mix the modal and quasi-modal
functions. Use one set or the other.
public:
You might find this behavior preferable over a pure modal mode, and it was said
that only the Mac has this natively, but now other platforms have something
similar. You CAN use it anywhere for any dialog. But you MUST use it when
you want to use KIWAY_PLAYER::ShowModal() from a dialog event.
*/
WDO_ENABLE_DISABLE( wxWindow* aWindow ) :
m_win( aWindow )
{
if( m_win )
m_win->Disable();
}
~WDO_ENABLE_DISABLE()
{
if( m_win )
{
m_win->Enable();
m_win->SetFocus(); // let's focus back on the parent window
}
}
};
DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& title,
@ -57,13 +58,13 @@ DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& titl
wxDialog( aParent, id, title, pos, size, style, name ),
KIWAY_HOLDER( 0 ),
m_qmodal_loop( 0 ),
m_qmodal_showing( false )
m_qmodal_showing( false ),
m_qmodal_parent_disabler( 0 )
{
// pray that aParent is either a KIWAY_PLAYER or DIALOG_SHIM derivation.
KIWAY_HOLDER* h = dynamic_cast<KIWAY_HOLDER*>( aParent );
wxASSERT_MSG( h,
wxT( "DIALOG_SHIM's parent is NULL or not derived from KIWAY_PLAYER nor DIALOG_SHIM" ) );
// wxASSERT_MSG( h, wxT( "DIALOG_SHIM's parent is NULL or not derived from KIWAY_PLAYER nor DIALOG_SHIM" ) );
if( h )
SetKiway( this, &h->Kiway() );
@ -79,6 +80,8 @@ DIALOG_SHIM::~DIALOG_SHIM()
// if the dialog is quasi-modal, this will end its event loop
if( IsQuasiModal() )
EndQuasiModal( wxID_CANCEL );
delete m_qmodal_parent_disabler; // usually NULL by now
}
@ -141,6 +144,82 @@ bool DIALOG_SHIM::Enable( bool enable )
}
#if DLGSHIM_USE_SETFOCUS
static bool findWindowRecursively( const wxWindowList& children, const wxWindow* wanted )
{
for( wxWindowList::const_iterator it = children.begin(); it != children.end(); ++it )
{
const wxWindow* child = *it;
if( wanted == child )
return true;
else
{
if( findWindowRecursively( child->GetChildren(), wanted ) )
return true;
}
}
return false;
}
static bool findWindowRecursively( const wxWindow* topmost, const wxWindow* wanted )
{
// wanted may be NULL and that is ok.
if( wanted == topmost )
return true;
return findWindowRecursively( topmost->GetChildren(), wanted );
}
/// Set the focus if it is not already set in a derived constructor to a specific control.
void DIALOG_SHIM::onInit( wxInitDialogEvent& aEvent )
{
wxWindow* focusWnd = wxWindow::FindFocus();
// If focusWnd is not already this window or a child of it, then SetFocus().
// Otherwise the derived class's constructor SetFocus() already to a specific
// child control.
if( !findWindowRecursively( this, focusWnd ) )
{
// Linux wxGTK needs this to allow the ESCAPE key to close a wxDialog window.
SetFocus();
}
aEvent.Skip(); // derived class's handler should be called too
}
#endif
/*
Quasi-Modal Mode Explained:
The gtk calls in wxDialog::ShowModal() cause event routing problems if that
modal dialog then tries to use KIWAY_PLAYER::ShowModal(). The latter shows up
and mostly works but does not respond to the window decoration close button.
There is no way to get around this without reversing the gtk calls temporarily.
Quasi-Modal mode is our own almost modal mode which disables only the parent
of the DIALOG_SHIM, leaving other frames operable and while staying captured in the
nested event loop. This avoids the gtk calls and leaves event routing pure
and sufficient to operate the KIWAY_PLAYER::ShowModal() properly. When using
ShowQuasiModal() you have to use EndQuasiModal() in your dialogs and not
EndModal(). There is also IsQuasiModal() but its value can only be true
when the nested event loop is active. Do not mix the modal and quasi-modal
functions. Use one set or the other.
You might find this behavior preferable over a pure modal mode, and it was said
that only the Mac has this natively, but now other platforms have something
similar. You CAN use it anywhere for any dialog. But you MUST use it when
you want to use KIWAY_PLAYER::ShowModal() from a dialog event.
*/
#if !wxCHECK_VERSION( 2, 9, 4 )
wxWindow* DIALOG_SHIM::CheckIfCanBeUsedAsParent( wxWindow* parent ) const
{
@ -208,24 +287,231 @@ wxWindow* DIALOG_SHIM::GetParentForModalDialog(wxWindow *parent, long style) con
#endif
int DIALOG_SHIM::ShowQuasiModal()
/*
/// wxEventLoopActivator but with a friend so it
/// has access to m_evtLoopOld, and it does not SetActive() as that is
/// done inside base class Run().
class ELOOP_ACTIVATOR
{
// toggle a window's "enable" status to disabled, then enabled on exit.
// exception safe.
struct ENABLE_DISABLE
friend class EVENT_LOOP;
public:
ELOOP_ACTIVATOR( WX_EVENT_LOOP* evtLoop )
{
wxWindow* m_win;
ENABLE_DISABLE( wxWindow* aWindow ) : m_win( aWindow ) { if( m_win ) m_win->Disable(); }
~ENABLE_DISABLE()
m_evtLoopOld = wxEventLoopBase::GetActive();
// wxEventLoopBase::SetActive( evtLoop );
}
~ELOOP_ACTIVATOR()
{
// restore the previously active event loop
wxEventLoopBase::SetActive( m_evtLoopOld );
}
private:
WX_EVENT_LOOP* m_evtLoopOld;
};
*/
class EVENT_LOOP : public WX_EVENT_LOOP
{
public:
EVENT_LOOP()
{
;
}
~EVENT_LOOP()
{
}
#if 0 // does not work any better than inherited wxGuiEventLoop functions:
// sets the "should exit" flag and wakes up the loop so that it terminates
// soon
void ScheduleExit( int rc = 0 )
{
wxCHECK_RET( IsInsideRun(), wxT("can't call ScheduleExit() if not running") );
m_exitcode = rc;
m_shouldExit = true;
OnExit();
// all we have to do to exit from the loop is to (maybe) wake it up so that
// it can notice that Exit() had been called
//
// in particular, do *not* use here calls such as PostQuitMessage() (under
// MSW) which terminate the current event loop here because we're not sure
// that it is going to be processed by the correct event loop: it would be
// possible that another one is started and terminated by mistake if we do
// this
WakeUp();
}
int Run()
{
// event loops are not recursive, you need to create another loop!
//wxCHECK_MSG( !IsInsideRun(), -1, wxT("can't reenter a message loop") );
// ProcessIdle() and ProcessEvents() below may throw so the code here should
// be exception-safe, hence we must use local objects for all actions we
// should undo
wxEventLoopActivator activate(this);
// We might be called again, after a previous call to ScheduleExit(), so
// reset this flag.
m_shouldExit = false;
// Set this variable to true for the duration of this method.
setInsideRun( true );
struct SET_FALSE
{
if( m_win )
EVENT_LOOP* m_loop;
SET_FALSE( EVENT_LOOP* aLoop ) : m_loop( aLoop ) {}
~SET_FALSE() { m_loop->setInsideRun( false ); }
} t( this );
// Finally really run the loop.
return DoRun();
}
bool ProcessEvents()
{
// process pending wx events first as they correspond to low-level events
// which happened before, i.e. typically pending events were queued by a
// previous call to Dispatch() and if we didn't process them now the next
// call to it might enqueue them again (as happens with e.g. socket events
// which would be generated as long as there is input available on socket
// and this input is only removed from it when pending event handlers are
// executed)
if( wxTheApp )
{
wxTheApp->ProcessPendingEvents();
// One of the pending event handlers could have decided to exit the
// loop so check for the flag before trying to dispatch more events
// (which could block indefinitely if no more are coming).
if( m_shouldExit )
return false;
}
return Dispatch();
}
int DoRun()
{
// we must ensure that OnExit() is called even if an exception is thrown
// from inside ProcessEvents() but we must call it from Exit() in normal
// situations because it is supposed to be called synchronously,
// wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or
// something similar here)
#if wxUSE_EXCEPTIONS
for ( ;; )
{
try
{
m_win->Enable();
m_win->SetFocus(); // let's focus back on the parent window
#endif // wxUSE_EXCEPTIONS
// this is the event loop itself
for ( ;; )
{
// generate and process idle events for as long as we don't
// have anything else to do
while ( !m_shouldExit && !Pending() && ProcessIdle() )
;
if ( m_shouldExit )
break;
// a message came or no more idle processing to do, dispatch
// all the pending events and call Dispatch() to wait for the
// next message
if ( !ProcessEvents() )
{
// we got WM_QUIT
break;
}
}
// Process the remaining queued messages, both at the level of the
// underlying toolkit level (Pending/Dispatch()) and wx level
// (Has/ProcessPendingEvents()).
//
// We do run the risk of never exiting this loop if pending event
// handlers endlessly generate new events but they shouldn't do
// this in a well-behaved program and we shouldn't just discard the
// events we already have, they might be important.
for ( ;; )
{
bool hasMoreEvents = false;
if ( wxTheApp && wxTheApp->HasPendingEvents() )
{
wxTheApp->ProcessPendingEvents();
hasMoreEvents = true;
}
if ( Pending() )
{
Dispatch();
hasMoreEvents = true;
}
if ( !hasMoreEvents )
break;
}
#if wxUSE_EXCEPTIONS
// exit the outer loop as well
break;
}
catch ( ... )
{
try
{
if ( !wxTheApp || !wxTheApp->OnExceptionInMainLoop() )
{
OnExit();
break;
}
//else: continue running the event loop
}
catch ( ... )
{
// OnException() throwed, possibly rethrowing the same
// exception again: very good, but we still need OnExit() to
// be called
OnExit();
throw;
}
}
}
};
#endif // wxUSE_EXCEPTIONS
return m_exitcode;
}
protected:
int m_exitcode;
/* this only works if you add
friend class EVENT_LOOP
to EventLoopBase
*/
void setInsideRun( bool aValue )
{
m_isInsideRun = aValue;
}
#endif
};
int DIALOG_SHIM::ShowQuasiModal()
{
// This is an exception safe way to zero a pointer before returning.
// Yes, even though DismissModal() clears this first normally, this is
// here in case there's an exception before the dialog is dismissed.
@ -236,7 +522,6 @@ int DIALOG_SHIM::ShowQuasiModal()
~NULLER() { m_what = 0; } // indeed, set it to NULL on destruction
} clear_this( (void*&) m_qmodal_loop );
// release the mouse if it's currently captured as the window having it
// will be disabled when this dialog is shown -- but will still keep the
// capture making it impossible to do anything in the modal dialog itself
@ -250,20 +535,17 @@ int DIALOG_SHIM::ShowQuasiModal()
// Show the optimal parent
DBG( if( parent ) printf( "%s: optimal parent: %s\n", __func__, typeid(*parent).name() );)
ENABLE_DISABLE toggle( parent ); // quasi-modal: disable only my "optimal" parent
wxASSERT_MSG( !m_qmodal_parent_disabler,
wxT( "Caller using ShowQuasiModal() twice on same window?" ) );
// quasi-modal: disable only my "optimal" parent
m_qmodal_parent_disabler = new WDO_ENABLE_DISABLE( parent );
Show( true );
m_qmodal_showing = true;
WX_EVENT_LOOP event_loop;
#if wxCHECK_VERSION( 2, 9, 4 ) // 2.9.4 is only approximate.
// new code needs this, old code does it in wxEventLoop::Run() and cannot
// tolerate it here. Where that boundary is as a version number, I don't know.
// A closer look at the subversion repo for wx would tell.
wxEventLoopActivator event_loop_stacker( &event_loop );
#endif
EVENT_LOOP event_loop;
m_qmodal_loop = &event_loop;
@ -287,61 +569,19 @@ void DIALOG_SHIM::EndQuasiModal( int retCode )
if( m_qmodal_loop )
{
m_qmodal_loop->Exit();
#if wxCHECK_VERSION( 2, 9, 4 ) // 2.9.4 is only approximate, might be 3, 0, 0.
if( m_qmodal_loop->IsRunning() )
m_qmodal_loop->Exit( 0 );
else
m_qmodal_loop->ScheduleExit( 0 );
#else
m_qmodal_loop->Exit( 0 );
#endif
m_qmodal_loop = NULL;
}
delete m_qmodal_parent_disabler;
m_qmodal_parent_disabler = 0;
Show( false );
}
#if DLGSHIM_USE_SETFOCUS
static bool findWindowRecursively( const wxWindowList& children, const wxWindow* wanted )
{
for( wxWindowList::const_iterator it = children.begin(); it != children.end(); ++it )
{
const wxWindow* child = *it;
if( wanted == child )
return true;
else
{
if( findWindowRecursively( child->GetChildren(), wanted ) )
return true;
}
}
return false;
}
static bool findWindowRecursively( const wxWindow* topmost, const wxWindow* wanted )
{
// wanted may be NULL and that is ok.
if( wanted == topmost )
return true;
return findWindowRecursively( topmost->GetChildren(), wanted );
}
/// Set the focus if it is not already set in a derived constructor to a specific control.
void DIALOG_SHIM::onInit( wxInitDialogEvent& aEvent )
{
wxWindow* focusWnd = wxWindow::FindFocus();
// If focusWnd is not already this window or a child of it, then SetFocus().
// Otherwise the derived class's constructor SetFocus() already to a specific
// child control.
if( !findWindowRecursively( this, focusWnd ) )
{
// Linux wxGTK needs this to allow the ESCAPE key to close a wxDialog window.
SetFocus();
}
aEvent.Skip(); // derived class's handler should be called too
}
#endif

View File

@ -28,6 +28,7 @@
#include <fctsys.h>
#include <macros.h> // DIM()
#include <common.h>
#include <project.h>
#include <confirm.h>
#include <gr_basic.h>
#include <base_struct.h>
@ -781,9 +782,11 @@ void DIALOG_PAGES_SETTINGS::GetCustomSizeMilsFromDialog()
// Called on .kicad_wks file description selection change
void DIALOG_PAGES_SETTINGS::OnWksFileSelection( wxCommandEvent& event )
{
wxString pro_dir = wxPathOnly( Prj().GetProjectFullName() );
// Display a file picker dialog
wxFileDialog fileDialog( this, _( "Select Page Layout Descr File" ),
wxGetCwd(), GetWksFileName(),
pro_dir, GetWksFileName(),
PageLayoutDescrFileWildcard,
wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
@ -800,11 +803,14 @@ void DIALOG_PAGES_SETTINGS::OnWksFileSelection( wxCommandEvent& event )
// For Win/Linux/macOS compatibility, a relative path is a good idea
if( fn.IsAbsolute() && fileName != GetWksFileName() )
{
fn.MakeRelativeTo( wxGetCwd() );
wxString msg;
msg.Printf( _( "The page layout descr filename has changed\n"
"Do you want to use the relative path:\n%s"),
fn.GetFullPath().GetData() );
fn.MakeRelativeTo( pro_dir );
wxString msg = wxString::Format( _(
"The page layout descr filename has changed.\n"
"Do you want to use the relative path:\n"
"'%s'" ),
GetChars( fn.GetFullPath() )
);
if( IsOK( this, msg ) )
shortFileName = fn.GetFullPath();
}

View File

@ -37,12 +37,14 @@ EDA_LIST_DIALOG::EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitl
const wxArrayString& aItemHeaders,
const std::vector<wxArrayString>& aItemList,
const wxString& aSelection,
void( *aCallBackFunction )( wxString& ),
void( *aCallBackFunction )( wxString&, void* ),
void* aCallBackFunctionData,
bool aSortList ) :
EDA_LIST_DIALOG_BASE( aParent, wxID_ANY, aTitle )
{
m_sortList = aSortList;
m_callBackFct = aCallBackFunction;
m_cb_func = aCallBackFunction;
m_cb_data = aCallBackFunctionData;
m_itemsListCp = &aItemList;
for( unsigned i = 0; i < aItemHeaders.Count(); i++ )
@ -57,7 +59,7 @@ EDA_LIST_DIALOG::EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitl
InsertItems( aItemList, 0 );
if( m_callBackFct == NULL )
if( m_cb_func == NULL )
{
m_messages->Show( false );
m_staticTextMsg->Show( false );
@ -231,12 +233,11 @@ void EDA_LIST_DIALOG::onCancelClick( wxCommandEvent& event )
void EDA_LIST_DIALOG::onListItemSelected( wxListEvent& event )
{
if( m_callBackFct )
if( m_cb_func )
{
m_messages->Clear();
wxString text = GetTextSelection();
m_callBackFct( text );
m_cb_func( text, m_cb_data );
m_messages->WriteText( text );
}
}

View File

@ -47,6 +47,7 @@
#include <math/box2.h>
#include <wx/fontdlg.h>
#include <wx/snglinst.h>
#include <view/view.h>
#include <view/view_controls.h>
#include <gal/graphics_abstraction_layer.h>
@ -97,6 +98,8 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
long aStyle, const wxString & aFrameName ) :
KIWAY_PLAYER( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName )
{
m_file_checker = NULL;
m_drawToolBar = NULL;
m_optionsToolBar = NULL;
m_gridSelectBox = NULL;
@ -113,6 +116,7 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_showAxis = false; // true to draw axis.
m_showBorderAndTitleBlock = false; // true to display reference sheet.
m_showGridAxis = false; // true to draw the grid axis
m_showOriginAxis = false; // true to draw the grid origin
m_cursorShape = 0;
m_LastGridSizeId = 0;
m_DrawGrid = true; // hide/Show grid. default = show
@ -178,6 +182,25 @@ EDA_DRAW_FRAME::~EDA_DRAW_FRAME()
m_currentScreen = NULL;
m_auimgr.UnInit();
ReleaseFile();
}
void EDA_DRAW_FRAME::ReleaseFile()
{
delete m_file_checker;
m_file_checker = 0;
}
bool EDA_DRAW_FRAME::LockFile( const wxString& aFileName )
{
delete m_file_checker;
m_file_checker = ::LockFile( aFileName );
return bool( m_file_checker );
}
@ -218,24 +241,17 @@ void EDA_DRAW_FRAME::OnMenuOpen( wxMenuEvent& event )
event.Skip();
}
/* function SkipNextLeftButtonReleaseEvent
* after calling this function, if the left mouse button
* is down, the next left mouse button release event will be ignored.
* It is is usefull for instance when closing a dialog on a mouse click,
* to skip the next mouse left button release event
* by the parent window, because the mouse button
* clicked on the dialog is often released in the parent frame,
* and therefore creates a left button released mouse event
* which can be unwanted in some cases
*/
void EDA_DRAW_FRAME::SkipNextLeftButtonReleaseEvent()
{
m_canvas->SetIgnoreLeftButtonReleaseEvent( true );
}
void EDA_DRAW_FRAME::OnToggleGridState( wxCommandEvent& aEvent )
{
SetGridVisibility( !IsGridVisible() );
if( IsGalCanvasActive() )
{
GetGalCanvas()->GetGAL()->SetGridVisibility( IsGridVisible() );
@ -321,8 +337,9 @@ void EDA_DRAW_FRAME::ReCreateMenuBar()
}
void EDA_DRAW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
bool EDA_DRAW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
{
return false;
}
@ -658,7 +675,7 @@ void EDA_DRAW_FRAME::AppendMsgPanel( const wxString& textUpper,
}
void EDA_DRAW_FRAME::ClearMsgPanel( void )
void EDA_DRAW_FRAME::ClearMsgPanel()
{
if( m_messagePanel == NULL )
return;

View File

@ -1389,7 +1389,9 @@ void EDA_DRAW_PANEL::OnKeyEvent( wxKeyEvent& event )
pos = wxPoint( DC.DeviceToLogicalX( pos.x ), DC.DeviceToLogicalY( pos.y ) );
GetParent()->SetMousePosition( pos );
GetParent()->GeneralControl( &DC, pos, localkey );
if( !GetParent()->GeneralControl( &DC, pos, localkey ) )
event.Skip();
}

View File

@ -29,6 +29,7 @@
#include <eda_text.h>
#include <drawtxt.h>
#include <macros.h>
#include <trigo.h> // RotatePoint
#include <class_drawpanel.h> // EDA_DRAW_PANEL
@ -89,6 +90,21 @@ int EDA_TEXT::LenSize( const wxString& aLine ) const
return GraphicTextWidth( aLine, m_Size.x, m_Italic, m_Bold );
}
wxString EDA_TEXT::ShortenedShownText() const
{
wxString tmp = GetShownText();
tmp.Replace( wxT( "\n" ), wxT( " " ) );
tmp.Replace( wxT( "\r" ), wxT( " " ) );
tmp.Replace( wxT( "\t" ), wxT( " " ) );
if( tmp.Length() > 15 )
tmp = tmp.Left( 12 ) + wxT( "..." );
return tmp;
}
/**
* Function GetInterline
* return the distance between 2 text lines
@ -105,13 +121,13 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
EDA_RECT rect;
wxPoint pos;
wxArrayString* list = NULL;
wxString text = m_Text;
wxString text = GetShownText();
int thickness = ( aThickness < 0 ) ? m_Thickness : aThickness;
int linecount = 1;
if( m_MultilineAllowed )
{
list = wxStringSplit( m_Text, '\n' );
list = wxStringSplit( text, '\n' );
if ( list->GetCount() ) // GetCount() == 0 for void strings
{
@ -128,7 +144,7 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
int dx = LenSize( text );
int dy = GetInterline( aThickness );
/* Creates bounding box (rectangle) for an horizontal text */
// Creates bounding box (rectangle) for an horizontal text
wxSize textsize = wxSize( dx, dy );
if( aInvertY )
@ -256,7 +272,7 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
if( m_MultilineAllowed )
{
std::vector<wxPoint> positions;
wxArrayString* list = wxStringSplit( m_Text, '\n' );
wxArrayString* list = wxStringSplit( GetShownText(), '\n' );
positions.reserve( list->Count() );
GetPositionsOfLinesOfMultilineText(positions, list->Count() );
@ -272,7 +288,7 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
}
else
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
aDrawMode, aFillMode, m_Text, m_Pos );
aDrawMode, aFillMode, GetShownText(), m_Pos );
// Draw text anchor, if requested
if( aAnchor_color != UNSPECIFIED_COLOR )
@ -329,7 +345,7 @@ void EDA_TEXT::GetPositionsOfLinesOfMultilineText(
void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC,
const wxPoint& aOffset, EDA_COLOR_T aColor,
GR_DRAWMODE aDrawMode, EDA_DRAW_MODE_T aFillMode,
wxString& aText, wxPoint aPos )
const wxString& aText, const wxPoint &aPos )
{
int width = m_Thickness;
@ -447,3 +463,55 @@ void EDA_TEXT::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControl
}
#endif
}
// Convert the text shape to a list of segment
// each segment is stored as 2 wxPoints: its starting point and its ending point
// we are using DrawGraphicText to create the segments.
// and therefore a call-back function is needed
static std::vector<wxPoint>* s_cornerBuffer;
// This is a call back function, used by DrawGraphicText to put each segment in buffer
static void addTextSegmToBuffer( int x0, int y0, int xf, int yf )
{
s_cornerBuffer->push_back( wxPoint( x0, y0 ) );
s_cornerBuffer->push_back( wxPoint( xf, yf ) );
}
void EDA_TEXT::TransformTextShapeToSegmentList( std::vector<wxPoint>& aCornerBuffer ) const
{
wxSize size = GetSize();
if( IsMirrored() )
NEGATE( size.x );
s_cornerBuffer = &aCornerBuffer;
EDA_COLOR_T color = BLACK; // not actually used, but needed by DrawGraphicText
if( IsMultilineAllowed() )
{
wxArrayString* list = wxStringSplit( GetShownText(), '\n' );
std::vector<wxPoint> positions;
positions.reserve( list->Count() );
GetPositionsOfLinesOfMultilineText( positions, list->Count() );
for( unsigned ii = 0; ii < list->Count(); ii++ )
{
wxString txt = list->Item( ii );
DrawGraphicText( NULL, NULL, positions[ii], color,
txt, GetOrientation(), size,
GetHorizJustify(), GetVertJustify(),
GetThickness(), IsItalic(),
true, addTextSegmToBuffer );
}
delete list;
}
else
{
DrawGraphicText( NULL, NULL, GetTextPosition(), color,
GetText(), GetOrientation(), size,
GetHorizJustify(), GetVertJustify(),
GetThickness(), IsItalic(),
true, addTextSegmToBuffer );
}
}

View File

@ -733,14 +733,7 @@ wxString FP_LIB_TABLE::GetGlobalTableFileName()
{
wxFileName fn;
// This is possibly problematic with an uncertain wxApp title, which is now
// the case. We'll need a better technique soon.
fn.SetPath( wxStandardPaths::Get().GetUserConfigDir() );
#if defined( __WINDOWS__ )
fn.AppendDir( wxT( "kicad" ) );
#endif
fn.SetPath( GetKicadConfigPath() );
fn.SetName( global_tbl_name );
return fn.GetFullPath();

View File

@ -223,6 +223,19 @@ void CAIRO_GAL::DrawArc( const VECTOR2D& aCenterPoint, double aRadius, double aS
cairo_new_sub_path( currentContext );
cairo_arc( currentContext, aCenterPoint.x, aCenterPoint.y, aRadius, aStartAngle, aEndAngle );
if( isFillEnabled )
{
VECTOR2D startPoint( cos( aStartAngle ) * aRadius + aCenterPoint.x,
sin( aStartAngle ) * aRadius + aCenterPoint.y );
VECTOR2D endPoint( cos( aEndAngle ) * aRadius + aCenterPoint.x,
sin( aEndAngle ) * aRadius + aCenterPoint.y );
cairo_move_to( currentContext, aCenterPoint.x, aCenterPoint.y );
cairo_line_to( currentContext, startPoint.x, startPoint.y );
cairo_line_to( currentContext, endPoint.x, endPoint.y );
cairo_close_path( currentContext );
}
isElementAdded = true;
}

View File

@ -94,6 +94,7 @@ GPU_CACHED_MANAGER::~GPU_CACHED_MANAGER()
{
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDeleteBuffers( 1, &m_verticesBuffer );
glDeleteBuffers( 1, &m_indicesBuffer );
}
}
@ -105,6 +106,7 @@ void GPU_CACHED_MANAGER::Initialize()
if( !m_buffersInitialized )
{
glGenBuffers( 1, &m_verticesBuffer );
glGenBuffers( 1, &m_indicesBuffer );
m_buffersInitialized = true;
}
}
@ -167,9 +169,13 @@ void GPU_CACHED_MANAGER::EndDrawing()
VertexSize, (GLvoid*) ShaderOffset );
}
glDrawElements( GL_TRIANGLES, m_indicesSize, GL_UNSIGNED_INT, (GLvoid*) m_indices.get() );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_indicesBuffer );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, m_indicesSize * sizeof(int), (GLvoid*) m_indices.get(), GL_DYNAMIC_DRAW );
glDrawElements( GL_TRIANGLES, m_indicesSize, GL_UNSIGNED_INT, 0 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
// Deactivate vertex array
glDisableClientState( GL_COLOR_ARRAY );

View File

@ -377,17 +377,12 @@ void OPENGL_GAL::DrawArc( const VECTOR2D& aCenterPoint, double aRadius, double a
// Swap the angles, if start angle is greater than end angle
SWAP( aStartAngle, >, aEndAngle );
VECTOR2D startPoint( cos( aStartAngle ), sin( aStartAngle ) );
VECTOR2D endPoint( cos( aEndAngle ), sin( aEndAngle ) );
VECTOR2D startEndPoint = startPoint + endPoint;
VECTOR2D middlePoint = 0.5 * startEndPoint;
Save();
currentManager->Translate( aCenterPoint.x, aCenterPoint.y, layerDepth );
if( isStrokeEnabled )
{
double alphaIncrement = 2.0 * M_PI / CIRCLE_POINTS;
const double alphaIncrement = 2.0 * M_PI / CIRCLE_POINTS;
currentManager->Color( strokeColor.r, strokeColor.g, strokeColor.b, strokeColor.a );
VECTOR2D p( cos( aStartAngle ) * aRadius, sin( aStartAngle ) * aRadius );
@ -411,20 +406,24 @@ void OPENGL_GAL::DrawArc( const VECTOR2D& aCenterPoint, double aRadius, double a
if( isFillEnabled )
{
double alphaIncrement = 2 * M_PI / CIRCLE_POINTS;
const double alphaIncrement = 2 * M_PI / CIRCLE_POINTS;
double alpha;
currentManager->Color( fillColor.r, fillColor.g, fillColor.b, fillColor.a );
currentManager->Shader( SHADER_NONE );
// Triangle fan
for( alpha = aStartAngle; ( alpha + alphaIncrement ) < aEndAngle; )
{
currentManager->Vertex( middlePoint.x, middlePoint.y, 0.0 );
currentManager->Vertex( cos( alpha ), sin( alpha ), 0.0 );
currentManager->Vertex( 0.0, 0.0, 0.0 );
currentManager->Vertex( cos( alpha ) * aRadius, sin( alpha ) * aRadius, 0.0 );
alpha += alphaIncrement;
currentManager->Vertex( cos( alpha ), sin( alpha ), 0.0 );
currentManager->Vertex( cos( alpha ) * aRadius, sin( alpha ) * aRadius, 0.0 );
}
currentManager->Vertex( middlePoint.x, middlePoint.y, 0.0 );
currentManager->Vertex( cos( alpha ), sin( alpha ), 0.0 );
// The last missing triangle
const VECTOR2D endPoint( cos( aEndAngle ) * aRadius, sin( aEndAngle ) * aRadius );
currentManager->Vertex( 0.0, 0.0, 0.0 );
currentManager->Vertex( cos( alpha ) * aRadius, sin( alpha ) * aRadius, 0.0 );
currentManager->Vertex( endPoint.x, endPoint.y, 0.0 );
}

View File

@ -61,7 +61,7 @@ static inline bool Collide( const SHAPE_RECT& aA, const SHAPE_CIRCLE& aB, int aC
const VECTOR2I size = aA.GetSize();
const int r = aB.GetRadius();
const int min_dist = aClearance + r;
const VECTOR2I vts[] =
{
VECTOR2I( p0.x, p0.y ),
@ -107,7 +107,7 @@ static inline bool Collide( const SHAPE_RECT& aA, const SHAPE_CIRCLE& aB, int aC
if( !aNeedMTV )
return true;
if( inside )
aMTV = -delta.Resize( abs( min_dist + 1 + nearest_seg_dist ) + 1 );
else
@ -152,7 +152,7 @@ static inline bool Collide( const SHAPE_CIRCLE& aA, const SHAPE_LINE_CHAIN& aB,
if( !aNeedMTV || !found )
return found;
SHAPE_CIRCLE cmoved( aA );
VECTOR2I f_total( 0, 0 );
@ -162,7 +162,7 @@ static inline bool Collide( const SHAPE_CIRCLE& aA, const SHAPE_LINE_CHAIN& aB,
cmoved.SetCenter( cmoved.GetCenter() + f );
f_total += f;
}
aMTV = f_total;
return found;
}
@ -246,13 +246,13 @@ bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance, bool aNeed
case SH_RECT:
switch( aB->Type() )
{
case SH_CIRCLE:
case SH_CIRCLE:
return CollCase<SHAPE_RECT, SHAPE_CIRCLE>( aA, aB, aClearance, aNeedMTV, aMTV );
case SH_LINE_CHAIN:
case SH_LINE_CHAIN:
return CollCase<SHAPE_RECT, SHAPE_LINE_CHAIN>( aA, aB, aClearance, aNeedMTV, aMTV );
case SH_SEGMENT:
case SH_SEGMENT:
return CollCase<SHAPE_RECT, SHAPE_SEGMENT>( aA, aB, aClearance, aNeedMTV, aMTV );
default:
@ -320,6 +320,7 @@ bool CollideShapes( const SHAPE* aA, const SHAPE* aB, int aClearance, bool aNeed
}
bool unsupported_collision = true;
(void) unsupported_collision; // make gcc quiet
assert( unsupported_collision == false );

View File

@ -41,100 +41,6 @@
#include <wx/filename.h>
#include <wx/dir.h>
/* List of default paths used to locate help files and KiCad library files.
*
* Under windows, KiCad search its files from the binary path file (first
* argument when running "main") So for a standard install, default paths
* are not mandatory, but they exist, just in case.
* KiCad is often installed in c:/Program Files/kicad or c:/kicad (or d: or
* e: ... ) and the directory "share" has no meaning under windows.
*
* Under linux, the problem is more complex.
* In fact there are 3 cases:
* 1 - When released in a distribution:
* binaries are in /usr/bin, KiCad libs in /usr/share/kicad/ and doc in
* /usr/share/doc/kicad/
* 2 - When compiled by an user:
* binaries also can be in /usr/local/bin, KiCad libs in
* /usr/local/share/kicad/ and doc in /usr/local/share/doc/kicad/
* 3 - When in an "universal tarball" or build for a server:
* all files are in /usr/local/kicad
* This is mandatory when KiCad is installed on a server (in a school for
* instance) because one can export /usr/local/kicad and obviously the others
* paths cannot be used (cannot be mounted by the client, because they are
* already used).
*
* in cases 1 and 2 KiCad files cannot be found from the binary path.
* in case 3 KiCad files can be found from the binary path only if this is
* a KiCad binary file which is launched.
* But if an user creates a symbolic link to the actual binary file to run
* KiCad, the binary path is not good and the defaults paths must be used
*
* Note:
* KiCad uses first the bin path lo locate KiCad tree.
* if not found KiCad uses the environment variable KICAD to find its files
* and at last KiCad uses the default paths.
* So we can export (linux and windows) the variable KICAD:
* like export KICAD=/my_path/kicad if /my_path/kicad is not a default path
*/
wxString MakeReducedFileName( const wxString& fullfilename,
const wxString& default_path,
const wxString& default_ext )
{
wxString reduced_filename = fullfilename;
wxString Cwd, ext, path;
Cwd = default_path;
ext = default_ext;
path = wxPathOnly( reduced_filename ) + UNIX_STRING_DIR_SEP;
reduced_filename.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP );
Cwd.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP );
if( Cwd.Last() != '/' )
Cwd += UNIX_STRING_DIR_SEP;
path.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP );
#ifdef __WINDOWS__
// names are case insensitive under windows
path.MakeLower();
Cwd.MakeLower();
ext.MakeLower();
#endif
// if the path is "default_path" -> remove it
wxString root_path = path.Left( Cwd.Length() );
if( root_path == Cwd )
{
reduced_filename.Remove( 0, Cwd.Length() );
}
else // if the path is the current path -> change path to ./
{
Cwd = wxGetCwd() + UNIX_STRING_DIR_SEP;
#ifdef __WINDOWS__
Cwd.MakeLower();
#endif
Cwd.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP );
if( path == Cwd )
{ // the path is the current path -> path = "./"
reduced_filename.Remove( 0, Cwd.Length() );
wxString tmp = wxT( "./" ) + reduced_filename;
reduced_filename = tmp;
}
}
// remove extension if == default_ext:
if( !ext.IsEmpty() && reduced_filename.Contains( ext ) )
reduced_filename.Truncate( reduced_filename.Length() - ext.Length() );
return reduced_filename;
}
void AddDelimiterString( wxString& string )
{

View File

@ -533,8 +533,9 @@ int EDA_BASE_FRAME::WriteHotkeyConfig( struct EDA_HOTKEY_CONFIG* aDescList,
}
else
{
wxConfig config( m_FrameName );
config.Write( HOTKEYS_CONFIG_KEY, msg );
wxConfigBase* config = GetNewConfig( m_FrameName );
config->Write( HOTKEYS_CONFIG_KEY, msg );
delete config;
}
return 1;
@ -575,16 +576,17 @@ int EDA_BASE_FRAME::ReadHotkeyConfigFile( const wxString& aFilename,
void ReadHotkeyConfig( const wxString& Appname, struct EDA_HOTKEY_CONFIG* aDescList )
{
wxConfig config( Appname );
wxConfigBase* config = GetNewConfig( Appname );
if( !config.HasEntry( HOTKEYS_CONFIG_KEY ) )
if( !config->HasEntry( HOTKEYS_CONFIG_KEY ) )
{
// assume defaults are ok
return;
}
wxString data;
config.Read( HOTKEYS_CONFIG_KEY, &data );
config->Read( HOTKEYS_CONFIG_KEY, &data );
delete config;
ParseHotkeyConfig( data, aDescList );
}
@ -676,16 +678,17 @@ void ParseHotkeyConfig( const wxString& data,
}
/**
* Function ImportHotkeyConfigFromFile
* Prompt the user for an old hotkey file to read, and read it.
* @param aDescList = current hotkey list descr. to initialize.
*/
void EDA_BASE_FRAME::ImportHotkeyConfigFromFile( struct EDA_HOTKEY_CONFIG* aDescList )
void EDA_BASE_FRAME::ImportHotkeyConfigFromFile( EDA_HOTKEY_CONFIG* aDescList )
{
wxString ext = DEFAULT_HOTKEY_FILENAME_EXT;
wxString mask = wxT( "*." ) + ext;
#if 0 // pass in the project dir as an argument
wxString path = wxPathOnly( Prj().GetProjectFullName() );
#else
wxString path = wxGetCwd();
#endif
wxString filename = Kiface().Name() + wxT( '.' ) + ext;
filename = EDA_FileSelector( _( "Read Hotkey Configuration File:" ),
@ -704,16 +707,17 @@ void EDA_BASE_FRAME::ImportHotkeyConfigFromFile( struct EDA_HOTKEY_CONFIG* aDesc
}
/**
* Function ExportHotkeyConfigToFile
* Prompt the user for an old hotkey file to read, and read it.
* @param aDescList = current hotkey list descr. to initialize.
*/
void EDA_BASE_FRAME::ExportHotkeyConfigToFile( struct EDA_HOTKEY_CONFIG* aDescList )
void EDA_BASE_FRAME::ExportHotkeyConfigToFile( EDA_HOTKEY_CONFIG* aDescList )
{
wxString ext = DEFAULT_HOTKEY_FILENAME_EXT;
wxString mask = wxT( "*." ) + ext;
#if 0
wxString path = wxPathOnly( Prj().GetProjectFullName() );
#else
wxString path = wxGetCwd();
#endif
wxString filename = Kiface().Name() + wxT( "." ) + ext;
filename = EDA_FileSelector( _( "Write Hotkey Configuration File:" ),

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*

View File

@ -104,14 +104,7 @@ bool KIWAY_PLAYER::ShowModal( wxString* aResult, wxWindow* aResultantFocusWindow
// re-enables only those that were disabled on exit
wxWindowDisabler toggle( this );
WX_EVENT_LOOP event_loop;
#if wxCHECK_VERSION( 2, 9, 4 ) // 2.9.4 is only approximate.
// new code needs this, old code does it in wxEventLoop::Run() and cannot
// tolerate it here. Where that boundary is as a version number, I don't know.
// A closer look at the subversion repo for wx would tell.
wxEventLoopActivator event_loop_stacker( &event_loop );
#endif
WX_EVENT_LOOP event_loop;
m_modal_loop = &event_loop;

32
common/lockfile.cpp Normal file
View File

@ -0,0 +1,32 @@
#include <wx/filename.h>
#include <wx/snglinst.h>
wxSingleInstanceChecker* LockFile( const wxString& aFileName )
{
// first make absolute and normalize, to avoid that different lock files
// for the same file can be created
wxFileName fn( aFileName );
fn.MakeAbsolute();
wxString lockFileName = fn.GetFullPath() + wxT( ".lock" );
lockFileName.Replace( wxT( "/" ), wxT( "_" ) );
// We can have filenames coming from Windows, so also convert Windows separator
lockFileName.Replace( wxT( "\\" ), wxT( "_" ) );
wxSingleInstanceChecker* p = new wxSingleInstanceChecker( lockFileName );
if( p->IsAnotherRunning() )
{
delete p;
p = NULL;
}
return p;
}

View File

@ -381,6 +381,66 @@ LSEQ LSET::Seq() const
}
LSEQ LSET::SeqStackupBottom2Top() const
{
// bottom-to-top stack-up layers
static const LAYER_ID sequence[] = {
B_Fab,
B_CrtYd,
B_Adhes,
B_SilkS,
B_Paste,
B_Mask,
B_Cu,
In30_Cu,
In29_Cu,
In28_Cu,
In27_Cu,
In26_Cu,
In25_Cu,
In24_Cu,
In23_Cu,
In22_Cu,
In21_Cu,
In20_Cu,
In19_Cu,
In18_Cu,
In17_Cu,
In16_Cu,
In15_Cu,
In14_Cu,
In13_Cu,
In12_Cu,
In11_Cu,
In10_Cu,
In9_Cu,
In8_Cu,
In7_Cu,
In6_Cu,
In5_Cu,
In4_Cu,
In3_Cu,
In2_Cu,
In1_Cu,
F_Cu,
F_Mask,
F_Paste,
F_SilkS,
F_Adhes,
F_CrtYd,
F_Fab,
Dwgs_User,
Cmts_User,
Eco1_User,
Eco2_User,
Margin,
Edge_Cuts,
};
return Seq( sequence, DIM( sequence ) );
}
LAYER_ID FlipLayer( LAYER_ID aLayerId )
{
switch( aLayerId )

View File

@ -23,49 +23,128 @@
*/
/*
* This file contains the global constants and variables used in the PCB
* applications Pcbnew, CvPcb, and GervView. The goal of this was to
* unobfuscate the original header file design that made it very difficult
* to figure out where these variables lived. Ideally, they should be pushed
* back into the application layer.
* This file contains some functions used in the PCB
* applications Pcbnew and CvPcb.
*/
#include <fctsys.h>
#include <pgm_base.h>
#include <kiface_i.h>
#include <pcbcommon.h>
#include <plot_common.h>
#include <class_board.h>
#include <class_pad.h>
#include <class_zone_settings.h>
#include <class_board_design_settings.h>
class MODULE;
DISPLAY_OPTIONS DisplayOpt; // Display options for board items
int g_AnchorColor = BLUE;
int g_ModuleTextCMPColor = LIGHTGRAY;
int g_ModuleTextCUColor = MAGENTA;
int g_ModuleTextNOVColor = DARKGRAY;
int g_PadCUColor = GREEN;
int g_PadCMPColor = RED;
#include <3d_viewer.h>
/**
* Used in track creation, a list of track segments currently being created,
* with the newest track at the end of the list, sorted by new-ness. e.g. use
* TRACK->Back() to get the next older track, TRACK->Next() to get the next
* newer track.
* attempts to set the environment variable given by aKiSys3Dmod to a valid path.
* (typically "KISYS3DMOD" )
* If the environment variable is already set, then it left as is to respect
* the wishes of the user.
*
* The path is determined by attempting to find the path modules/packages3d
* files in kicad tree.
* This may or may not be the best path but it provides the best solution for
* backwards compatibility with the previous 3D shapes search path implementation.
*
* @note This must be called after #SetBinDir() is called at least on Windows.
* Otherwise, the kicad path is not known (Windows specific)
*
* @param aKiSys3Dmod = the value of environment variable, typically "KISYS3DMOD"
* @param aProcess = the current process
* @return false if the aKiSys3Dmod path is not valid.
*/
DLIST<TRACK> g_CurrentTrackList;
void AccumulateDescription( wxString &aDesc, const wxString &aItem )
bool Set3DShapesDefaultPath( const wxString& aKiSys3Dmod, const PGM_BASE* aProcess )
{
if( !aDesc.IsEmpty() )
aDesc << wxT(", ");
aDesc << aItem;
wxString path;
// Set the KISYS3DMOD environment variable for the current process,
// if it is not already defined in the user's environment and valid.
if( wxGetEnv( aKiSys3Dmod, &path ) && wxFileName::DirExists( path ) )
return true;
#if 1
// Try to find a valid path is standard KiCad paths
SEARCH_STACK& search = Kiface().KifaceSearch();
path = search.FindValidPath( LIB3D_FOLDER );
if( !path.IsEmpty() )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#endif
// Attempt to determine where the 3D shape libraries were installed using the
// legacy path:
// on Unix: /usr/local/kicad/share/modules/packages3d
// or /usr/share/kicad/modules/packages3d
// On Windows: bin../share/modules/packages3d
wxString relpath( wxT( "modules/" ) );
relpath += LIB3D_FOLDER;
// Apple MacOSx
#ifdef __WXMAC__
path = wxT("/Library/Application Support/kicad/modules/packages3d/");
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
path = wxString( wxGetenv( wxT( "HOME" ) ) ) + wxT("/Library/Application Support/kicad/modules/packages3d/");
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#elif defined(__UNIX__) // Linux and non-Apple Unix
// Try the home directory:
path.Empty();
wxGetEnv( wxT("HOME"), &path );
path += wxT("/kicad/share/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
// Try the standard install path:
path = wxT("/usr/local/kicad/share/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
// Try the official distrib standard install path:
path = wxT("/usr/share/kicad/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#else // Windows
// On Windows, the install path is given by the path of executables
wxFileName fn;
fn.AssignDir( aProcess->GetExecutablePath() );
fn.RemoveLastDir();
path = fn.GetPathWithSep() + wxT("share/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#endif
return false;
}

View File

@ -262,8 +262,6 @@ static LANGUAGE_DESCR s_Languages[] =
PGM_BASE::PGM_BASE()
{
m_pgm_checker = NULL;
m_file_checker = NULL;
m_html_ctrl = NULL;
m_locale = NULL;
m_common_settings = NULL;
@ -291,21 +289,8 @@ void PGM_BASE::destroy()
delete m_pgm_checker;
m_pgm_checker = 0;
delete m_file_checker;
m_file_checker = 0;
delete m_locale;
m_locale = 0;
/*
// Close the help frame
if( m_html_ctrl && m_html_ctrl->GetFrame() ) // returns NULL if no help frame active
m_html_ctrl->GetFrame()->Close( true );
}
*/
delete m_html_ctrl;
m_html_ctrl = 0;
}
@ -364,6 +349,8 @@ bool PGM_BASE::initPgm()
{
wxFileName pgm_name( App().argv[0] );
wxConfigBase::DontCreateOnDemand();
wxInitAllImageHandlers();
m_pgm_checker = new wxSingleInstanceChecker( pgm_name.GetName().Lower() + wxT( "-" ) + wxGetUserId() );
@ -407,7 +394,7 @@ bool PGM_BASE::initPgm()
SetLanguagePath();
// OS specific instantiation of wxConfigBase derivative:
m_common_settings = new wxConfig( KICAD_COMMON );
m_common_settings = GetNewConfig( KICAD_COMMON );
ReadPdfBrowserInfos(); // needs m_common_settings
@ -422,40 +409,6 @@ bool PGM_BASE::initPgm()
}
void PGM_BASE::initHtmlHelpController()
{
#if defined ONLINE_HELP_FILES_FORMAT_IS_HTML
if( !m_html_ctrl )
m_html_ctrl = new wxHtmlHelpController(
wxHF_TOOLBAR | wxHF_CONTENTS |
wxHF_PRINT | wxHF_OPEN_FILES
// | wxHF_SEARCH
);
wxASSERT( m_html_ctrl ); // may not leave here as NULL
#elif defined ONLINE_HELP_FILES_FORMAT_IS_PDF
m_html_ctrl = NULL;
#else
#error Help files format not defined
#endif
}
wxHtmlHelpController* PGM_BASE::HtmlHelpController()
{
if( !m_html_ctrl )
initHtmlHelpController();
// there should not be calls to this unless ONLINE_HELP_FILES_FORMAT_IS_HTML is defined
wxASSERT( m_html_ctrl );
return m_html_ctrl;
}
bool PGM_BASE::setExecutablePath()
{
@ -536,7 +489,9 @@ void PGM_BASE::saveCommonSettings()
// process startup: initPgm(), so test before using:
if( m_common_settings )
{
m_common_settings->Write( workingDirKey, wxGetCwd() );
wxString cur_dir = wxGetCwd();
m_common_settings->Write( workingDirKey, cur_dir );
}
}
@ -711,36 +666,3 @@ void PGM_BASE::AddMenuLanguageList( wxMenu* MasterMenu )
}
}
bool PGM_BASE::LockFile( const wxString& aFileName )
{
// first make absolute and normalize, to avoid that different lock files
// for the same file can be created
wxFileName fn( aFileName );
fn.MakeAbsolute();
// semaphore to protect the edition of the file by more than one instance
if( m_file_checker != NULL )
{
// it means that we had an open file and we are opening a different one
delete m_file_checker;
}
wxString lockFileName = fn.GetFullPath() + wxT( ".lock" );
lockFileName.Replace( wxT( "/" ), wxT( "_" ) );
// We can have filenames coming from Windows, so also convert Windows separator
lockFileName.Replace( wxT( "\\" ), wxT( "_" ) );
m_file_checker = new wxSingleInstanceChecker( lockFileName );
if( m_file_checker &&
m_file_checker->IsAnotherRunning() )
{
return false;
}
return true;
}

View File

@ -27,7 +27,6 @@
#include <fctsys.h>
#include <macros.h>
#include <gr_basic.h>
#include <pgm_base.h>
#include <project.h>
#include <common.h> // NAMELESS_PROJECT
@ -45,12 +44,13 @@ PROJECT::PROJECT()
void PROJECT::ElemsClear()
{
DBG( printf( "%s: clearing all _ELEMS for project %s\n", __func__, TO_UTF8( GetProjectFullName() ) );)
// careful here, this should work, but the virtual destructor may not
// be in the same link image as PROJECT.
for( unsigned i = 0; i<DIM(m_elems); ++i )
for( unsigned i = 0; i < DIM( m_elems ); ++i )
{
delete m_elems[i];
m_elems[i] = NULL;
SetElem( ELEM_T( i ), NULL );
}
}
@ -63,23 +63,27 @@ PROJECT::~PROJECT()
void PROJECT::SetProjectFullName( const wxString& aFullPathAndName )
{
m_project_name = aFullPathAndName;
wxASSERT( m_project_name.GetName() == NAMELESS_PROJECT || m_project_name.IsAbsolute() );
#if 0
wxASSERT( m_project_name.GetExt() == ProjectFileExtension )
#else
m_project_name.SetExt( ProjectFileExtension );
#endif
// until multiple projects are in play, set an environment variable for the
// the project pointer.
// Edge transitions only. This is what clears the project
// data using the Clear() function.
if( m_project_name != aFullPathAndName )
{
wxString path = m_project_name.GetPath();
Clear(); // clear the data when the project changes.
// wxLogDebug( wxT( "Setting env %s to '%s'." ), PROJECT_VAR_NAME, GetChars( path ) );
DBG(printf( "%s: old:'%s' new:'%s'\n", __func__, TO_UTF8( GetProjectFullName() ), TO_UTF8( aFullPathAndName ) );)
wxSetEnv( PROJECT_VAR_NAME, path );
m_project_name = aFullPathAndName;
wxASSERT( m_project_name.IsAbsolute() );
wxASSERT( m_project_name.GetExt() == ProjectFileExtension );
// until multiple projects are in play, set an environment variable for the
// the project pointer.
{
wxString path = m_project_name.GetPath();
wxSetEnv( PROJECT_VAR_NAME, path );
}
}
}
@ -185,163 +189,90 @@ void PROJECT::SetElem( ELEM_T aIndex, _ELEM* aElem )
if( unsigned( aIndex ) < DIM( m_elems ) )
{
#if defined(DEBUG) && 0
if( aIndex == ELEM_SCH_PART_LIBS )
{
printf( "%s: &m_elems[%i]:%p aElem:%p\n", __func__, aIndex, &m_elems[aIndex], aElem );
}
#endif
delete m_elems[aIndex];
m_elems[aIndex] = aElem;
}
}
// non-member so it can be moved easily, and kept REALLY private.
// Do NOT Clear() in here.
static void add_search_paths( SEARCH_STACK* aDst, wxConfigBase* aCfg, int aIndex )
static bool copy_pro_file_template( const SEARCH_STACK& aSearchS, const wxString& aDestination )
{
for( int i=1; true; ++i )
if( aDestination.IsEmpty() )
{
wxString key = wxString::Format( wxT( "LibraryPath%d" ), i );
wxString upath = aCfg->Read( key, wxEmptyString );
if( !upath )
break;
aDst->AddPaths( upath, aIndex );
}
}
// non-member so it can be moved easily, and kept REALLY private.
// Do NOT Clear() in here.
static void add_search_paths( SEARCH_STACK* aDst, const SEARCH_STACK& aSrc, int aIndex )
{
for( unsigned i=0; i<aSrc.GetCount(); ++i )
aDst->AddPaths( aSrc[i], aIndex );
}
/*
bool PROJECT::MaybeLoadProjectSettings( const std::vector<wxString>& aFileSet )
{
// @todo
return true;
}
*/
wxConfigBase* PROJECT::configCreate( const SEARCH_STACK& aSList, const wxString& aFileName,
const wxString& aGroupName, bool aForceUseLocalConfig )
{
wxConfigBase* cfg = 0;
wxFileName fn = aFileName;
fn.SetExt( ProjectFileExtension );
wxString cur_pro_fn = fn.GetFullPath();
// is there an edge transition, a change in m_project_filename?
if( m_project_name != cur_pro_fn )
{
m_sch_search.Clear();
// to the empty lists, add project dir as first
m_sch_search.AddPaths( fn.GetPath() );
// append all paths from aSList
add_search_paths( &m_sch_search, aSList, -1 );
// addLibrarySearchPaths( SEARCH_STACK* aSP, wxConfigBase* aCfg )
// This is undocumented, but somebody wanted to store !schematic!
// library search paths in the .kicad_common file?
add_search_paths( &m_sch_search, Pgm().CommonSettings(), -1 );
#if 1 && defined(DEBUG)
m_sch_search.Show( __func__ );
#endif
DBG( printf( "%s: destination is empty.\n", __func__ );)
return false;
}
// Init local config filename
if( aForceUseLocalConfig || fn.FileExists() )
{
cfg = new wxFileConfig( wxEmptyString, wxEmptyString, cur_pro_fn, wxEmptyString );
cfg->DontCreateOnDemand();
if( aForceUseLocalConfig )
{
SetProjectFullName( cur_pro_fn );
return cfg;
}
/* Check the application version against the version saved in the
* project file.
*
* TODO: Push the version test up the stack so that when one of the
* KiCad application version changes, the other applications
* settings do not get updated. Practically, this can go away.
* It isn't used anywhere as far as I know (WLS).
*/
cfg->SetPath( aGroupName );
int def_version = 0;
int version = cfg->Read( wxT( "version" ), def_version );
if( version > 0 )
{
cfg->SetPath( wxCONFIG_PATH_SEPARATOR );
SetProjectFullName( cur_pro_fn );
return cfg;
}
else // Version incorrect
{
wxLogDebug( wxT( "Project file version is zero, not using this old project file, going with template." ) );
delete cfg;
cfg = 0;
}
}
// No suitable pro file was found, either does not exist, or is too old.
// Use the template kicad.pro file. Find it by using caller's SEARCH_STACK.
wxString templateFile = wxT( "kicad." ) + ProjectFileExtension;
wxString kicad_pro_template = aSList.FindValidPath( templateFile );
wxString kicad_pro_template = aSearchS.FindValidPath( templateFile );
if( !kicad_pro_template )
{
wxLogDebug( wxT( "Template file <%s> not found using search paths." ),
GetChars( templateFile ) );
DBG( printf( "%s: template file '%s' not found using search paths.\n", __func__, TO_UTF8( templateFile ) );)
wxFileName templ( wxStandardPaths::Get().GetDocumentsDir(),
wxT( "kicad" ), ProjectFileExtension );
if( !templ.IsFileReadable() )
{
wxString msg = wxString::Format( _( "Unable to find %s template config file." ),
GetChars( templateFile ) );
wxString msg = wxString::Format( _(
"Unable to find '%s' template config file." ),
GetChars( templateFile ) );
DisplayError( NULL, msg );
return NULL;
return false;
}
kicad_pro_template = templ.GetFullPath();
}
// The project config file is not found (happens for new projects,
// or if the schematic editor is run outside an existing project
// In this case the default template (kicad.pro) is used
cur_pro_fn = kicad_pro_template;
wxLogDebug( wxT( "Use template file '%s' as project file." ), GetChars( cur_pro_fn ) );
DBG( printf( "%s: using template file '%s' as project file.\n", __func__, TO_UTF8( kicad_pro_template ) );)
wxCopyFile( kicad_pro_template, aDestination );
return true;
}
wxConfigBase* PROJECT::configCreate( const SEARCH_STACK& aSList,
const wxString& aGroupName, const wxString& aFileName )
{
wxConfigBase* cfg = 0;
wxString cur_pro_fn = !aFileName ? GetProjectFullName() : aFileName;
if( wxFileName( cur_pro_fn ).IsFileReadable() )
{
// Note: currently, aGroupName is not used.
// Previoulsy, the version of aGroupName was tested, but it
// was useless, and if the version is important,
// this is not the right place here, because configCreate does know anything
// about info stored in this config file.
cfg = new wxFileConfig( wxEmptyString, wxEmptyString, cur_pro_fn, wxEmptyString );
return cfg;
}
// No suitable pro file was found, either does not exist, or not readable.
// Use the template kicad.pro file. Find it by using caller's SEARCH_STACK.
copy_pro_file_template( aSList, cur_pro_fn );
cfg = new wxFileConfig( wxEmptyString, wxEmptyString, cur_pro_fn, wxEmptyString );
cfg->DontCreateOnDemand();
SetProjectFullName( cur_pro_fn );
return cfg;
}
void PROJECT::ConfigSave( const SEARCH_STACK& aSList, const wxString& aFileName,
const wxString& aGroupName, const PARAM_CFG_ARRAY& aParams )
void PROJECT::ConfigSave( const SEARCH_STACK& aSList, const wxString& aGroupName,
const PARAM_CFG_ARRAY& aParams, const wxString& aFileName )
{
std::auto_ptr<wxConfigBase> cfg( configCreate( aSList, aFileName, aGroupName, true ) );
std::auto_ptr<wxConfigBase> cfg( configCreate( aSList, aGroupName, aFileName ) );
if( !cfg.get() )
{
@ -373,11 +304,10 @@ void PROJECT::ConfigSave( const SEARCH_STACK& aSList, const wxString& aFileName
}
bool PROJECT::ConfigLoad( const SEARCH_STACK& aSList, const wxString& aFileName,
const wxString& aGroupName, const PARAM_CFG_ARRAY& aParams,
bool doLoadOnlyIfNew )
bool PROJECT::ConfigLoad( const SEARCH_STACK& aSList, const wxString& aGroupName,
const PARAM_CFG_ARRAY& aParams, const wxString& aForeignProjectFileName )
{
std::auto_ptr<wxConfigBase> cfg( configCreate( aSList, aFileName, aGroupName, false ) );
std::auto_ptr<wxConfigBase> cfg( configCreate( aSList, aGroupName, aForeignProjectFileName ) );
if( !cfg.get() )
{
@ -389,11 +319,6 @@ bool PROJECT::ConfigLoad( const SEARCH_STACK& aSList, const wxString& aFileName,
wxString timestamp = cfg->Read( wxT( "update" ) );
if( doLoadOnlyIfNew && timestamp.size() && timestamp == m_pro_date_and_time )
{
return false;
}
m_pro_date_and_time = timestamp;
wxConfigLoadParams( cfg.get(), aParams, aGroupName );
@ -401,3 +326,17 @@ bool PROJECT::ConfigLoad( const SEARCH_STACK& aSList, const wxString& aFileName,
return true;
}
const wxString PROJECT::AbsolutePath( const wxString& aFileName ) const
{
wxFileName fn = aFileName;
if( !fn.IsAbsolute() )
{
wxString pro_dir = wxPathOnly( GetProjectFullName() );
fn.Normalize( wxPATH_NORM_ALL, pro_dir );
}
return fn.GetFullPath();
}

View File

@ -11,17 +11,39 @@
#endif
wxString SEARCH_STACK::FilenameWithRelativePathInSearchList( const wxString& aFullFilename )
int SEARCH_STACK::Split( wxArrayString* aResult, const wxString aPathString )
{
wxStringTokenizer tokenizer( aPathString, PATH_SEPS, wxTOKEN_STRTOK );
while( tokenizer.HasMoreTokens() )
{
wxString path = tokenizer.GetNextToken();
aResult->Add( path );
}
return aResult->GetCount();
}
// Convert aRelativePath to an absolute path based on aBaseDir
static wxString base_dir( const wxString& aRelativePath, const wxString& aBaseDir )
{
wxFileName fn = aRelativePath;
if( !fn.IsAbsolute() && !!aBaseDir )
{
wxASSERT_MSG( wxFileName( aBaseDir ).IsAbsolute(), wxT( "Must pass absolute path in aBaseDir" ) );
fn.MakeRelativeTo( aBaseDir );
}
return fn.GetFullPath();
}
wxString SEARCH_STACK::FilenameWithRelativePathInSearchList(
const wxString& aFullFilename, const wxString& aBaseDir )
{
/* If the library path is already in the library search paths
* list, just add the library name to the list. Otherwise, add
* the library name with the full or relative path.
* the relative path, when possible is preferable,
* because it preserve use of default libraries paths, when the path is a sub path of
* these default paths
* Note we accept only sub paths,
* not relative paths starting by ../ that are not subpaths and are outside kicad libs paths
*/
wxFileName fn = aFullFilename;
wxString filename = aFullFilename;
@ -33,7 +55,7 @@ wxString SEARCH_STACK::FilenameWithRelativePathInSearchList( const wxString& aFu
fn = aFullFilename;
// Search for the shortest subpath within 'this':
if( fn.MakeRelativeTo( (*this)[kk] ) )
if( fn.MakeRelativeTo( base_dir( (*this)[kk], aBaseDir ) ) )
{
if( fn.GetPathWithSep().StartsWith( wxT("..") ) ) // Path outside kicad libs paths
continue;
@ -52,13 +74,16 @@ wxString SEARCH_STACK::FilenameWithRelativePathInSearchList( const wxString& aFu
void SEARCH_STACK::RemovePaths( const wxString& aPaths )
{
wxStringTokenizer tokenizer( aPaths, PATH_SEPS, wxTOKEN_STRTOK );
bool isCS = wxFileName::IsCaseSensitive();
wxArrayString paths;
while( tokenizer.HasMoreTokens() )
Split( &paths, aPaths );
for( unsigned i=0; i<paths.GetCount(); ++i )
{
wxString path = tokenizer.GetNextToken();
wxString path = paths[i];
if( Index( path, wxFileName::IsCaseSensitive() ) != wxNOT_FOUND )
if( Index( path, isCS ) != wxNOT_FOUND )
{
Remove( path );
}
@ -68,15 +93,17 @@ void SEARCH_STACK::RemovePaths( const wxString& aPaths )
void SEARCH_STACK::AddPaths( const wxString& aPaths, int aIndex )
{
bool isCS = wxFileName::IsCaseSensitive();
wxStringTokenizer tokenizer( aPaths, PATH_SEPS, wxTOKEN_STRTOK );
bool isCS = wxFileName::IsCaseSensitive();
wxArrayString paths;
Split( &paths, aPaths );
// appending all of them, on large or negative aIndex
if( unsigned( aIndex ) >= GetCount() )
{
while( tokenizer.HasMoreTokens() )
for( unsigned i=0; i<paths.GetCount(); ++i )
{
wxString path = tokenizer.GetNextToken();
wxString path = paths[i];
if( wxFileName::IsDirReadable( path )
&& Index( path, isCS ) == wxNOT_FOUND )
@ -89,9 +116,9 @@ void SEARCH_STACK::AddPaths( const wxString& aPaths, int aIndex )
// inserting all of them:
else
{
while( tokenizer.HasMoreTokens() )
for( unsigned i=0; i<paths.GetCount(); ++i )
{
wxString path = tokenizer.GetNextToken();
wxString path = paths[i];
if( wxFileName::IsDirReadable( path )
&& Index( path, isCS ) == wxNOT_FOUND )
@ -104,6 +131,8 @@ void SEARCH_STACK::AddPaths( const wxString& aPaths, int aIndex )
}
#if 1 // this function is too convoluted for words.
const wxString SEARCH_STACK::LastVisitedPath( const wxString& aSubPathToSearch )
{
wxString path;
@ -142,6 +171,7 @@ const wxString SEARCH_STACK::LastVisitedPath( const wxString& aSubPathToSearch )
return path;
}
#endif
#if defined(DEBUG)

View File

@ -89,10 +89,20 @@ wxString SearchHelpFileFullPath( const SEARCH_STACK& aSStack, const wxString& aB
printf( "%s: m_help_file:'%s'\n", __func__, TO_UTF8( aBaseName ) );
#endif
wxString fn = FindFileInSearchPaths( ss, aBaseName, &altsubdirs );
// Help files can be html (.html ext) or pdf (.pdf ext) files.
// Therefore, <BaseName>.html file is searched and if not found,
// <BaseName>.pdf file is searched in the same paths
wxString fn = FindFileInSearchPaths( ss, aBaseName + wxT(".html"), &altsubdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName, &subdirs );
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".pdf"), &altsubdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".html"), &subdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".pdf"), &subdirs );
// Step 2 : if not found Try to find help file in help/<short name>
if( !fn )
@ -104,10 +114,10 @@ wxString SearchHelpFileFullPath( const SEARCH_STACK& aSStack, const wxString& aB
subdirs.Add( i18n->GetName().BeforeLast( '_' ) );
altsubdirs.Add( i18n->GetName().BeforeLast( '_' ) );
fn = FindFileInSearchPaths( ss, aBaseName, &altsubdirs );
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".html"), &altsubdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName, &subdirs );
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".pdf"), &subdirs );
}
// Step 3 : if not found Try to find help file in help/en
@ -121,7 +131,13 @@ wxString SearchHelpFileFullPath( const SEARCH_STACK& aSStack, const wxString& aB
fn = FindFileInSearchPaths( ss, aBaseName, &altsubdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName, &subdirs );
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".pdf"), &altsubdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".html"), &subdirs );
if( !fn )
fn = FindFileInSearchPaths( ss, aBaseName + wxT(".pdf"), &subdirs );
}
return fn;

View File

@ -270,20 +270,6 @@ bool PGM_SINGLE_TOP::OnPgmInit( wxApp* aWxApp )
argv1.MakeAbsolute();
argSet[0] = argv1.GetFullPath();
if( !Pgm().LockFile( argSet[0] ) )
{
wxLogSysError( _( "This file is already open." ) );
return false;
}
}
// @todo: setting CWD is taboo in a multi-project environment, this
// will not be possible soon.
if( argv1.GetPath().size() ) // path only
{
// wxSetWorkingDirectory() does not like empty paths
wxSetWorkingDirectory( argv1.GetPath() );
}
// Use the KIWAY_PLAYER::OpenProjectFiles() API function:
@ -298,24 +284,6 @@ bool PGM_SINGLE_TOP::OnPgmInit( wxApp* aWxApp )
return false;
}
}
else
{
/*
The lean single_top program launcher has no access to program
settings, for if it did, it would not be lean. That kind of
functionality is in the KIFACE now, but it cannot assume that it is
the only KIFACE in memory. So this looks like a dead concept here,
or an expensive one in terms of code size.
wxString dir;
if( m_pgmSettings->Read( workingDirKey, &dir ) && wxDirExists( dir ) )
{
wxSetWorkingDirectory( dir );
}
*/
}
frame->Show();

View File

@ -31,7 +31,7 @@
#include <validators.h>
FOOTPRINT_NAME_VALIDATOR::FOOTPRINT_NAME_VALIDATOR( wxString* aValue ) :
FILE_NAME_CHAR_VALIDATOR::FILE_NAME_CHAR_VALIDATOR( wxString* aValue ) :
wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, aValue )
{
// The Windows (DOS) file system forbidden characters already include the forbidden

View File

@ -75,7 +75,7 @@ const wxString LegacyPcbFileWildcard( _( "KiCad printed circuit board files (*.b
const wxString EaglePcbFileWildcard( _( "Eagle ver. 6.x XML PCB files (*.brd)|*.brd" ) );
const wxString PCadPcbFileWildcard( _( "P-Cad 200x ASCII PCB files (*.pcb)|*.pcb" ) );
const wxString PcbFileWildcard( _( "KiCad s-expr printed circuit board files (*.kicad_pcb)|*.kicad_pcb" ) );
const wxString KiCadFootprintLibFileWildcard( _( "KiCad footprint s-expre library file (*.kicad_mod)|*.kicad_mod" ) );
const wxString KiCadFootprintLibFileWildcard( _( "KiCad footprint s-expre file (*.kicad_mod)|*.kicad_mod" ) );
const wxString KiCadFootprintLibPathWildcard( _( "KiCad footprint s-expre library path (*.pretty)|*.pretty" ) );
const wxString LegacyFootprintLibPathWildcard( _( "Legacy footprint library file (*.mod)|*.mod" ) );
const wxString EagleFootprintLibPathWildcard( _( "Eagle ver. 6.x XML library files (*.lbr)|*.lbr" ) );

View File

@ -186,10 +186,14 @@ void WORKSHEET_VIEWITEM::draw( const WS_DRAW_ITEM_TEXT* aItem, GAL* aGal ) const
{
VECTOR2D position( aItem->GetTextPosition().x, aItem->GetTextPosition().y );
aGal->Save();
aGal->Translate( position );
aGal->Rotate( -aItem->GetOrientation() * M_PI / 1800.0 );
aGal->SetStrokeColor( COLOR4D( aItem->GetColor() ) );
aGal->SetLineWidth( aItem->GetThickness() );
aGal->SetTextAttributes( aItem );
aGal->StrokeText( aItem->GetText(), position, 0.0 );
aGal->StrokeText( aItem->GetShownText(), VECTOR2D( 0, 0 ), 0.0 );
aGal->Restore();
}

View File

@ -29,6 +29,7 @@
#include <fctsys.h>
#include <common.h>
#include <kiface_i.h>
#include <project.h>
#include <confirm.h>
#include <gestfich.h>
@ -91,7 +92,8 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
char Line[1024];
FILE* file;
size_t ii;
SEARCH_STACK& search = Prj().SchSearchS();
SEARCH_STACK& search = Kiface().KifaceSearch();
if( m_netlist.IsEmpty() )
return;

View File

@ -59,30 +59,25 @@ PARAM_CFG_ARRAY& CVPCB_MAINFRAME::GetProjectFileParameters()
}
void CVPCB_MAINFRAME::LoadProjectFile( const wxString& aFileName )
void CVPCB_MAINFRAME::LoadProjectFile()
{
wxFileName fn( aFileName );
PROJECT& prj = Prj();
PROJECT& prj = Prj();
m_ModuleLibNames.Clear();
m_AliasLibNames.Clear();
fn.SetExt( ProjectFileExtension );
// was: Pgm().ReadProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters(), false );
prj.ConfigLoad( Kiface().KifaceSearch(), fn.GetFullPath(), GROUP_CVP, GetProjectFileParameters(), false );
prj.ConfigLoad( Kiface().KifaceSearch(), GROUP_CVP, GetProjectFileParameters() );
if( m_NetlistFileExtension.IsEmpty() )
m_NetlistFileExtension = wxT( "net" );
// Force FP_LIB_TABLE to be loaded on demand.
prj.ElemClear( PROJECT::ELEM_FPTBL );
}
void CVPCB_MAINFRAME::SaveProjectFile( wxCommandEvent& aEvent )
{
wxFileName fn = m_NetlistFileName;
PROJECT& prj = Prj();
wxFileName fn = prj.AbsolutePath( m_NetlistFileName.GetFullPath() );
fn.SetExt( ProjectFileExtension );
@ -103,11 +98,8 @@ void CVPCB_MAINFRAME::SaveProjectFile( wxCommandEvent& aEvent )
if( !IsWritable( fn ) )
return;
// was:
// Pgm().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() );
wxString pro_name = fn.GetFullPath();
PROJECT& prj = Prj();
prj.ConfigSave( Kiface().KifaceSearch(), fn.GetFullPath(), GROUP_CVP, GetProjectFileParameters() );
prj.ConfigSave( Kiface().KifaceSearch(), GROUP_CVP, GetProjectFileParameters(), pro_name );
}

View File

@ -53,6 +53,8 @@
#include <3d_viewer.h>
DISPLAY_OPTIONS DisplayOpt; // General display options
BEGIN_EVENT_TABLE( DISPLAY_FOOTPRINTS_FRAME, PCB_BASE_FRAME )
EVT_CLOSE( DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow )
@ -325,13 +327,15 @@ void DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
}
void DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey )
bool DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey )
{
bool eventHandled = true;
// Filter out the 'fake' mouse motion after a keyboard movement
if( !aHotKey && m_movingCursorWithKeyboard )
{
m_movingCursorWithKeyboard = false;
return;
return false;
}
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
@ -371,12 +375,17 @@ void DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPositi
case ' ':
GetScreen()->m_O_Curseur = GetCrossHairPosition();
break;
default:
eventHandled = false;
}
SetCrossHairPosition( pos );
RefreshCrossHair( oldpos, aPosition, aDC );
UpdateStatusBar(); /* Display new cursor coordinates */
return eventHandled;
}

View File

@ -92,7 +92,7 @@ public:
void OnLeftClick( wxDC* DC, const wxPoint& MousePos );
void OnLeftDClick( wxDC* DC, const wxPoint& MousePos );
bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu );
void GeneralControl( wxDC* DC, const wxPoint& aPosition, int aHotKey = 0 );
bool GeneralControl( wxDC* DC, const wxPoint& aPosition, int aHotKey = 0 );
void InstallOptionsDisplay( wxCommandEvent& event );
MODULE* Get_Module( const wxString& CmpName );

View File

@ -68,17 +68,14 @@ BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, EDA_BASE_FRAME )
EVT_MENU( wxID_EXIT, CVPCB_MAINFRAME::OnQuit )
EVT_MENU( wxID_HELP, CVPCB_MAINFRAME::GetKicadHelp )
EVT_MENU( wxID_ABOUT, CVPCB_MAINFRAME::GetKicadAbout )
EVT_MENU( wxID_PREFERENCES, CVPCB_MAINFRAME::ConfigCvpcb )
EVT_MENU( ID_SAVE_PROJECT, CVPCB_MAINFRAME::SaveProjectFile )
EVT_MENU( ID_SAVE_PROJECT_AS, CVPCB_MAINFRAME::SaveProjectFile )
EVT_MENU( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, CVPCB_MAINFRAME::OnKeepOpenOnSave )
EVT_MENU( ID_CVPCB_LIB_TABLE_EDIT, CVPCB_MAINFRAME::OnEditFootprintLibraryTable )
// Toolbar events
EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit )
EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, CVPCB_MAINFRAME::LoadNetList )
EVT_TOOL( ID_CVPCB_CREATE_CONFIGWINDOW, CVPCB_MAINFRAME::ConfigCvpcb )
EVT_TOOL( ID_CVPCB_LIB_TABLE_EDIT, CVPCB_MAINFRAME::OnEditFootprintLibraryTable )
EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP, CVPCB_MAINFRAME::DisplayModule )
EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA, CVPCB_MAINFRAME::ToFirstNA )
EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA, CVPCB_MAINFRAME::ToPreviousNA )
@ -144,7 +141,7 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
// Set minimal frame width and height
SetSizeHints( FRAME_MIN_SIZE_X, FRAME_MIN_SIZE_Y, -1, -1, -1, -1 );
// Framesize and position
// Frame size and position
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
// create the status bar
@ -205,7 +202,7 @@ void CVPCB_MAINFRAME::LoadSettings( wxConfigBase* aCfg )
aCfg->Read( KeepCvpcbOpenEntry, &m_KeepCvpcbOpen, true );
aCfg->Read( FootprintDocFileEntry, &m_DocModulesFileName,
DEFAULT_FOOTPRINTS_LIST_FILENAME );
DEFAULT_FOOTPRINTS_LIST_FILENAME );
}
@ -459,18 +456,6 @@ bool CVPCB_MAINFRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, i
}
void CVPCB_MAINFRAME::ConfigCvpcb( wxCommandEvent& event )
{
/* This is showing FOOTPRINT search paths, which are obsoleted.
I am removing this for the time being, since cvpcb will soon be part of pcbnew.
DIALOG_CVPCB_CONFIG dlg( this );
dlg.ShowModal();
*/
}
void CVPCB_MAINFRAME::OnEditFootprintLibraryTable( wxCommandEvent& aEvent )
{
bool tableChanged = false;
@ -487,8 +472,8 @@ void CVPCB_MAINFRAME::OnEditFootprintLibraryTable( wxCommandEvent& aEvent )
}
catch( const IO_ERROR& ioe )
{
wxString msg = wxString::Format( _(
"Error occurred saving the global footprint library table:\n'%s'\n%s" ),
wxString msg = wxString::Format(
_( "Error occurred saving the global footprint library table:\n'%s'\n%s" ),
GetChars( fileName ),
GetChars( ioe.errorText )
);
@ -507,8 +492,8 @@ void CVPCB_MAINFRAME::OnEditFootprintLibraryTable( wxCommandEvent& aEvent )
}
catch( const IO_ERROR& ioe )
{
wxString msg = wxString::Format( _(
"Error occurred saving the project footprint library table:\n'%s'\n%s" ),
wxString msg = wxString::Format(
_( "Error occurred saving the project footprint library table:\n'%s'\n%s" ),
GetChars( fileName ),
GetChars( ioe.errorText )
);
@ -917,15 +902,15 @@ void CVPCB_MAINFRAME::BuildFOOTPRINTS_LISTBOX()
if( m_footprintListBox == NULL )
{
m_footprintListBox = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST,
wxDefaultPosition, wxDefaultSize );
wxDefaultPosition, wxDefaultSize );
m_footprintListBox->SetFont( wxFont( guiFont.GetPointSize(),
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
}
m_footprintListBox->SetFootprints( m_footprints, wxEmptyString, NULL,
FOOTPRINTS_LISTBOX::UNFILTERED );
FOOTPRINTS_LISTBOX::UNFILTERED );
DisplayStatus();
}
@ -939,11 +924,11 @@ void CVPCB_MAINFRAME::BuildCmpListBox()
if( m_compListBox == NULL )
{
m_compListBox = new COMPONENTS_LISTBOX( this, ID_CVPCB_COMPONENT_LIST,
wxDefaultPosition, wxDefaultSize );
wxDefaultPosition, wxDefaultSize );
m_compListBox->SetFont( wxFont( guiFont.GetPointSize(),
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
}
m_compListBox->m_ComponentList.Clear();
@ -986,11 +971,11 @@ void CVPCB_MAINFRAME::BuildLIBRARY_LISTBOX()
if( m_libListBox == NULL )
{
m_libListBox = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST,
wxDefaultPosition, wxDefaultSize );
wxDefaultPosition, wxDefaultSize );
m_libListBox->SetFont( wxFont( guiFont.GetPointSize(),
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
}
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();

View File

@ -1,8 +1,9 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2007 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2007 Jean-Pierre Charras, jp..charras at wanadoo.fr
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -29,12 +30,12 @@
#include <fctsys.h>
#include <macros.h>
#include <fp_lib_table.h>
#include <gr_basic.h>
#include <kiface_i.h>
#include <pgm_base.h>
#include <wxstruct.h>
#include <confirm.h>
#include <gestfich.h>
#include <3d_viewer.h>
#include <pcbcommon.h>
#include <cvpcb.h>
#include <zones.h>
@ -50,13 +51,11 @@
COLORS_DESIGN_SETTINGS g_ColorsSettings;
// Constant string definitions for CvPcb
const wxString RetroFileExtension( wxT( "stf" ) );
const wxString FootprintAliasFileExtension( wxT( "equ" ) );
// Wildcard for schematic retroannotation (import footprint names in schematic):
const wxString FootprintAliasFileWildcard( _( "KiCad footprint alias files (*.equ)|*.equ" ) );
#if 0 // add this logic to OpenProjectFiles()
/*
@ -165,106 +164,6 @@ PGM_BASE& Pgm()
}
/**
* Function set3DShapesPath
* attempts to set the environment variable given by aKiSys3Dmod to a valid path.
* (typically "KISYS3DMOD" )
* If the environment variable is already set,
* then it left as is to respect the wishes of the user.
*
* The path is determined by attempting to find the path modules/packages3d
* files in kicad tree.
* This may or may not be the best path but it provides the best solution for
* backwards compatibility with the previous 3D shapes search path implementation.
*
* @note This must be called after #SetBinDir() is called at least on Windows.
* Otherwise, the kicad path is not known (Windows specific)
*
* @param aKiSys3Dmod = the value of environment variable, typically "KISYS3DMOD"
* @return false if the aKiSys3Dmod path is not valid.
*/
static bool set3DShapesPath( const wxString& aKiSys3Dmod )
{
wxString path;
// Set the KISYS3DMOD environment variable for the current process,
// if it is not already defined in the user's environment and valid.
if( wxGetEnv( aKiSys3Dmod, &path ) && wxFileName::DirExists( path ) )
return true;
// Attempt to determine where the 3D shape libraries were installed using the
// legacy path:
// on Unix: /usr/local/kicad/share/modules/packages3d
// or /usr/share/kicad/modules/packages3d
// On Windows: bin../share/modules/packages3d
wxString relpath( wxT( "modules/packages3d" ) );
// Apple MacOSx
#ifdef __WXMAC__
path = wxT("/Library/Application Support/kicad/modules/packages3d/");
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
path = wxString( wxGetenv( wxT( "HOME" ) ) ) + wxT("/Library/Application Support/kicad/modules/packages3d/");
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#elif defined(__UNIX__) // Linux and non-Apple Unix
// Try the home directory:
path.Empty();
wxGetEnv( wxT("HOME"), &path );
path += wxT("/kicad/share/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
// Try the standard install path:
path = wxT("/usr/local/kicad/share/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
// Try the official distrib standard install path:
path = wxT("/usr/share/kicad/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#else // Windows
// On Windows, the install path is given by the path of executables
wxFileName fn;
fn.AssignDir( Pgm().GetExecutablePath() );
fn.RemoveLastDir();
path = fn.GetPathWithSep() + wxT("share/") + relpath;
if( wxFileName::DirExists( path ) )
{
wxSetEnv( aKiSys3Dmod, path );
return true;
}
#endif
return false;
}
//!!!!!!!!!!!!!!! This code is obsolete because of the merge into pcbnew, don't bother with it.
FP_LIB_TABLE GFootprintTable;
@ -282,8 +181,10 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
start_common( aCtlBits );
// Set 3D shape path from environment variable KISYS3DMOD
set3DShapesPath( wxT("KISYS3DMOD") );
// Set 3D shape path (environment variable KISYS3DMOD (if not defined or valid)
// Currently, called here, but could be moved ( OpenProjectFiles() ? )
// if KISYS3DMOD is defined in a project config file
Set3DShapesDefaultPath( KISYS3DMOD, aProgram );
/* Now that there are no *.mod files in the standard library, this function
has no utility. User should simply set the variable manually.

View File

@ -17,8 +17,6 @@
wxLC_SINGLE_SEL | wxVSCROLL | wxHSCROLL )
extern const wxString FootprintAliasFileExtension;
extern const wxString RetroFileExtension;
extern const wxString FootprintAliasFileWildcard;

View File

@ -18,7 +18,6 @@ enum id_cvpcb_frm
ID_CVPCB_QUIT = ID_END_LIST,
ID_CVPCB_READ_INPUT_NETLIST,
ID_CVPCB_SAVEQUITCVPCB,
ID_CVPCB_CREATE_CONFIGWINDOW,
ID_CVPCB_CREATE_SCREENCMP,
ID_CVPCB_GOTO_FIRSTNA,
ID_CVPCB_GOTO_PREVIOUSNA,

View File

@ -135,8 +135,6 @@ public:
*/
void LoadNetList( wxCommandEvent& event );
void ConfigCvpcb( wxCommandEvent& event );
/**
* Function OnEditLibraryTable
* envokes the footpirnt library table edit dialog.
@ -219,7 +217,7 @@ public:
* Function LoadProjectFile
* reads the configuration parameter from the project (.pro) file \a aFileName
*/
void LoadProjectFile( const wxString& aFileName );
void LoadProjectFile();
void LoadSettings( wxConfigBase* aCfg ); // override virtual

View File

@ -169,7 +169,7 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
if( m_compListBox == NULL )
return false;
LoadProjectFile( m_NetlistFileName.GetFullPath() );
LoadProjectFile();
LoadFootprintFiles();
BuildFOOTPRINTS_LISTBOX();

View File

@ -52,13 +52,12 @@ void CVPCB_MAINFRAME::ReCreateHToolbar()
m_mainToolBar->AddTool( ID_CVPCB_READ_INPUT_NETLIST, wxEmptyString,
KiBitmap( open_document_xpm ), LOAD_FILE_HELP );
m_mainToolBar->AddTool( wxID_SAVE, wxEmptyString, KiBitmap( save_xpm ),
SAVE_HLP_MSG );
m_mainToolBar->AddTool( wxID_SAVE, wxEmptyString, KiBitmap( save_xpm ), SAVE_HLP_MSG );
m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_CVPCB_CREATE_CONFIGWINDOW, wxEmptyString,
m_mainToolBar->AddTool( ID_CVPCB_LIB_TABLE_EDIT, wxEmptyString,
KiBitmap( config_xpm ),
_( "Set CvPcb config (paths and equ files)" ) );
_( "Edit footprint library table" ) );
m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_CVPCB_CREATE_SCREENCMP, wxEmptyString,

View File

@ -0,0 +1,3 @@
(fp_lib_table
(lib (name footprints)(type KiCad)(uri ${KIPRJMOD}/libs/footprints.pretty)(options "")(descr "project specific"))
)

View File

@ -0,0 +1,12 @@
(module 1pin-4 (layer F.Cu) (tedit 5401E012)
(descr "module 1 pin (ou trou mecanique de percage)")
(tags DEV)
(fp_text reference 1PIN-4 (at 0 -3.048) (layer F.SilkS)
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_text value P103 (at 0 2.794) (layer F.SilkS) hide
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS))
)

View File

@ -0,0 +1,62 @@
(module textool_40 (layer F.Cu) (tedit 5401B510)
(descr "Module Dil 40 pins, pads elliptiques, e=600 mils")
(tags DIL)
(fp_text reference P3 (at -19.05 -3.81) (layer F.SilkS)
(effects (font (size 1.778 1.143) (thickness 0.3048)))
)
(fp_text value textool_40 (at 0 2.54) (layer F.SilkS)
(effects (font (size 1.778 1.778) (thickness 0.3048)))
)
(fp_line (start -26.67 -1.27) (end -25.4 -1.27) (layer F.SilkS) (width 0.381))
(fp_line (start -25.4 -1.27) (end -25.4 1.27) (layer F.SilkS) (width 0.381))
(fp_line (start -25.4 1.27) (end -26.67 1.27) (layer F.SilkS) (width 0.381))
(fp_line (start -26.67 -6.35) (end 26.67 -6.35) (layer F.SilkS) (width 0.381))
(fp_line (start 26.67 -6.35) (end 26.67 6.35) (layer F.SilkS) (width 0.381))
(fp_line (start 26.67 6.35) (end -26.67 6.35) (layer F.SilkS) (width 0.381))
(fp_line (start -26.67 6.35) (end -26.67 -6.35) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole rect (at -24.13 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 2 thru_hole oval (at -21.59 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 3 thru_hole oval (at -19.05 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 4 thru_hole oval (at -16.51 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 5 thru_hole oval (at -13.97 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 6 thru_hole oval (at -11.43 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 7 thru_hole oval (at -8.89 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 8 thru_hole oval (at -6.35 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 9 thru_hole oval (at -3.81 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 10 thru_hole oval (at -1.27 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 11 thru_hole oval (at 1.27 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 12 thru_hole oval (at 3.81 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 13 thru_hole oval (at 6.35 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 14 thru_hole oval (at 8.89 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 15 thru_hole oval (at 11.43 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 16 thru_hole oval (at 13.97 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 17 thru_hole oval (at 16.51 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 18 thru_hole oval (at 19.05 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 19 thru_hole oval (at 21.59 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 20 thru_hole oval (at 24.13 7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 21 thru_hole oval (at 24.13 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 22 thru_hole oval (at 21.59 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 23 thru_hole oval (at 19.05 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 24 thru_hole oval (at 16.51 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 25 thru_hole oval (at 13.97 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 26 thru_hole oval (at 11.43 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 27 thru_hole oval (at 8.89 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 28 thru_hole oval (at 6.35 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 29 thru_hole oval (at 3.81 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 30 thru_hole oval (at 1.27 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 31 thru_hole oval (at -1.27 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 32 thru_hole oval (at -3.81 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 33 thru_hole oval (at -6.35 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 34 thru_hole oval (at -8.89 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 35 thru_hole oval (at -11.43 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 36 thru_hole oval (at -13.97 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 37 thru_hole oval (at -16.51 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 38 thru_hole oval (at -19.05 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 39 thru_hole oval (at -21.59 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(pad 40 thru_hole oval (at -24.13 -7.62) (size 1.5748 2.286) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))
(model dil/textool_40.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)

View File

@ -84,6 +84,20 @@ X ~ 2 0 -200 170 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
# CONN_1
#
DEF ~CONN_1 P 0 30 N N 1 F N
F0 "P" 80 0 40 H V L CNN
F1 "CONN_1" 0 55 30 H I C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
C 0 0 31 0 1 0 N
P 2 0 1 0 -30 0 -50 0 N
X 1 1 -150 0 100 R 60 60 1 1 P
ENDDRAW
ENDDEF
#
# CONN_2
#
DEF CONN_2 P 0 40 Y N 1 F N

View File

@ -1,409 +1,444 @@
Cmp-Mod V01 Created by Cvpcb (2007-05-11) date = 16/5/2007-09:46:07
Cmp-Mod V01 Created by Cvpcb (2014-08-26 BZR 5101)-product date = 01/09/2014 11:21:38
BeginCmp
TimeStamp = 442A5056;
TimeStamp = /442A5056;
Reference = C1;
ValeurCmp = 100uF;
IdModule = CP10;
ValeurCmp = 100µF;
IdModule = discret:CP10;
EndCmp
BeginCmp
TimeStamp = 442A501D;
TimeStamp = /442A501D;
Reference = C2;
ValeurCmp = 220uF;
IdModule = CP10;
IdModule = discret:CP10;
EndCmp
BeginCmp
TimeStamp = 442A584C;
TimeStamp = /442A584C;
Reference = C3;
ValeurCmp = 22uF/25V;
IdModule = CP8;
IdModule = discret:CP8;
EndCmp
BeginCmp
TimeStamp = 442A5F61;
TimeStamp = /442A5F61;
Reference = C4;
ValeurCmp = 0;
IdModule = C1-1;
IdModule = discret:C1-1;
EndCmp
BeginCmp
TimeStamp = 442A58B1;
TimeStamp = /442A58B1;
Reference = C5;
ValeurCmp = 10nF;
IdModule = C1-1;
IdModule = discret:C1-1;
EndCmp
BeginCmp
TimeStamp = 442AA12B;
TimeStamp = /4804A5E2/442AA12B;
Reference = C6;
ValeurCmp = 100nF;
IdModule = C1-1;
IdModule = discret:C1-1;
EndCmp
BeginCmp
TimeStamp = 442AA145;
TimeStamp = /4804A5E2/442AA145;
Reference = C7;
ValeurCmp = 100nF;
IdModule = C1-1;
IdModule = discret:C1-1;
EndCmp
BeginCmp
TimeStamp = 4639BE2C;
Reference = C8;
ValeurCmp = 100nF;
IdModule = C1-1;
EndCmp
BeginCmp
TimeStamp = 464AD280;
TimeStamp = /464AD280;
Reference = C9;
ValeurCmp = 22OnF;
IdModule = C1-1;
IdModule = discret:C1-1;
EndCmp
BeginCmp
TimeStamp = 442A500B;
TimeStamp = /442A500B;
Reference = D1;
ValeurCmp = 1N4004;
IdModule = D5;
IdModule = discret:D5;
EndCmp
BeginCmp
TimeStamp = 442A4D1B;
TimeStamp = /442A4D1B;
Reference = D2;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 442A4D25;
TimeStamp = /442A4D25;
Reference = D3;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 442A4D5C;
TimeStamp = /442A4D5C;
Reference = D4;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 442A4D5D;
TimeStamp = /442A4D5D;
Reference = D5;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 442A4D64;
TimeStamp = /442A4D64;
Reference = D6;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 442A4D65;
TimeStamp = /442A4D65;
Reference = D7;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 442A4F5D;
TimeStamp = /442A4F5D;
Reference = D8;
ValeurCmp = RED-LED;
IdModule = LEDV;
IdModule = discret:LEDV;
EndCmp
BeginCmp
TimeStamp = 442A5084;
TimeStamp = /442A5084;
Reference = D9;
ValeurCmp = GREEN-LED;
IdModule = LEDV;
IdModule = discret:LEDV;
EndCmp
BeginCmp
TimeStamp = 442A6026;
TimeStamp = /442A6026;
Reference = D10;
ValeurCmp = SCHOTTKY;
IdModule = D5;
IdModule = discret:D5;
EndCmp
BeginCmp
TimeStamp = 4639BA28;
TimeStamp = /4639BA28;
Reference = D11;
ValeurCmp = BAT43;
IdModule = D3;
IdModule = discret:D3;
EndCmp
BeginCmp
TimeStamp = 4639B9EA;
TimeStamp = /4639B9EA;
Reference = D12;
ValeurCmp = YELLOW-LED;
IdModule = LEDV;
IdModule = discret:LEDV;
EndCmp
BeginCmp
TimeStamp = 442A4C93;
TimeStamp = /442A4C93;
Reference = J1;
ValeurCmp = DB9-FEMAL;
IdModule = DB9FC;
IdModule = connect:DB9FC;
EndCmp
BeginCmp
TimeStamp = 4639BAF8;
TimeStamp = /4639BAF8;
Reference = JP1;
ValeurCmp = JUMPER;
IdModule = PIN_ARRAY_2X1;
IdModule = connect:GS2;
EndCmp
BeginCmp
TimeStamp = 442A57BE;
TimeStamp = /442A57BE;
Reference = L1;
ValeurCmp = 22uH;
IdModule = INDUCTOR_V;
IdModule = inductors:INDUCTOR_V;
EndCmp
BeginCmp
TimeStamp = 442A4FE7;
TimeStamp = /442A4FE7;
Reference = P1;
ValeurCmp = CONN_2;
IdModule = bornier2;
IdModule = connect:bornier2;
EndCmp
BeginCmp
TimeStamp = 4436967E;
TimeStamp = /4804A5E2/4436967E;
Reference = P2;
ValeurCmp = SUPP28;
IdModule = 28DIP-ELL300;
IdModule = dip_sockets:DIP-28__300_ELL;
EndCmp
BeginCmp
TimeStamp = 442A88ED;
TimeStamp = /4804A5E2/442A88ED;
Reference = P3;
ValeurCmp = SUPP40;
IdModule = 40DIP-ELL600;
IdModule = footprints:textool_40;
EndCmp
BeginCmp
TimeStamp = 442A4EB9;
TimeStamp = /54020BEA;
Reference = P101;
ValeurCmp = CONN_1;
IdModule = footprints:1pin-4;
EndCmp
BeginCmp
TimeStamp = /54020DA9;
Reference = P102;
ValeurCmp = CONN_1;
IdModule = footprints:1pin-4;
EndCmp
BeginCmp
TimeStamp = /54020DC2;
Reference = P103;
ValeurCmp = CONN_1;
IdModule = footprints:1pin-4;
EndCmp
BeginCmp
TimeStamp = /54020DE3;
Reference = P104;
ValeurCmp = CONN_1;
IdModule = footprints:1pin-4;
EndCmp
BeginCmp
TimeStamp = /54020E5D;
Reference = P105;
ValeurCmp = CONN_1;
IdModule = footprints:1pin-4;
EndCmp
BeginCmp
TimeStamp = /54020E76;
Reference = P106;
ValeurCmp = CONN_1;
IdModule = footprints:1pin-4;
EndCmp
BeginCmp
TimeStamp = /442A4EB9;
Reference = Q1;
ValeurCmp = BC237;
IdModule = TO92;
IdModule = discret:TO92;
EndCmp
BeginCmp
TimeStamp = 442A4F30;
TimeStamp = /442A4F30;
Reference = Q2;
ValeurCmp = BC307;
IdModule = TO92;
IdModule = discret:TO92;
EndCmp
BeginCmp
TimeStamp = 4639B996;
TimeStamp = /4639B996;
Reference = Q3;
ValeurCmp = BC307;
IdModule = TO92;
IdModule = discret:TO92;
EndCmp
BeginCmp
TimeStamp = 442A4CF4;
TimeStamp = /442A4CF4;
Reference = R1;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4CFB;
TimeStamp = /442A4CFB;
Reference = R2;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D5A;
TimeStamp = /442A4D5A;
Reference = R3;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D5B;
TimeStamp = /442A4D5B;
Reference = R4;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D62;
TimeStamp = /442A4D62;
Reference = R5;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D63;
TimeStamp = /442A4D63;
Reference = R6;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4F2A;
TimeStamp = /442A4F2A;
Reference = R7;
ValeurCmp = 10K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D92;
TimeStamp = /442A4D92;
Reference = R8;
ValeurCmp = 1K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4F52;
TimeStamp = /442A4F52;
Reference = R9;
ValeurCmp = 2.2K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A5F83;
TimeStamp = /442A5F83;
Reference = R10;
ValeurCmp = 5,1K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4F23;
TimeStamp = /442A4F23;
Reference = R11;
ValeurCmp = 22K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D85;
TimeStamp = /442A4D85;
Reference = R12;
ValeurCmp = 470;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A4D8D;
TimeStamp = /442A4D8D;
Reference = R13;
ValeurCmp = 470;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A5083;
TimeStamp = /442A5083;
Reference = R14;
ValeurCmp = 470;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A58D7;
TimeStamp = /442A58D7;
Reference = R15;
ValeurCmp = 6.2K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A58DC;
TimeStamp = /442A58DC;
Reference = R16;
ValeurCmp = 62K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 442A50BF;
TimeStamp = /442A50BF;
Reference = R17;
ValeurCmp = 22K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 44369638;
TimeStamp = /44369638;
Reference = R18;
ValeurCmp = 220;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 4639B9B0;
TimeStamp = /4639B9B0;
Reference = R19;
ValeurCmp = 2.2K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 4639B9B3;
TimeStamp = /4639B9B3;
Reference = R20;
ValeurCmp = 2.2K;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 4639B9E9;
TimeStamp = /4639B9E9;
Reference = R21;
ValeurCmp = 470;
IdModule = R4;
IdModule = discret:R4;
EndCmp
BeginCmp
TimeStamp = 443D0101;
TimeStamp = /443D0101;
Reference = RV1;
ValeurCmp = 1K;
IdModule = RV2X4;
IdModule = discret:RV2X4;
EndCmp
BeginCmp
TimeStamp = 442A87F7;
TimeStamp = /4804A5E2/442A87F7;
Reference = U1;
ValeurCmp = 24Cxx;
IdModule = 8DIP-ELL300;
IdModule = dip_sockets:DIP-8__300_ELL;
EndCmp
BeginCmp
TimeStamp = 442A4D6B;
TimeStamp = /442A4D6B;
Reference = U2;
ValeurCmp = 74HC125;
IdModule = 14DIP-ELL300;
IdModule = dip_sockets:DIP-14__300_ELL;
EndCmp
BeginCmp
TimeStamp = 442A504A;
TimeStamp = /442A504A;
Reference = U3;
ValeurCmp = 7805;
IdModule = LM78XX;
IdModule = discret:LM78XX;
EndCmp
BeginCmp
TimeStamp = 442A5E20;
TimeStamp = /442A5E20;
Reference = U4;
ValeurCmp = LT1373;
IdModule = 8DIP-ELL300;
IdModule = dip_sockets:DIP-8__300_ELL;
EndCmp
BeginCmp
TimeStamp = 442A81A7;
TimeStamp = /4804A5E2/442A81A7;
Reference = U5;
ValeurCmp = PIC_18_PINS;
IdModule = 18DIP-ELL300;
IdModule = dip_sockets:DIP-18__300_ELL;
EndCmp
BeginCmp
TimeStamp = 442A81A5;
TimeStamp = /4804A5E2/442A81A5;
Reference = U6;
ValeurCmp = PIC_8_PINS;
IdModule = 8DIP-ELL300;
IdModule = dip_sockets:DIP-8__300_ELL;
EndCmp
EndListe

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
update=05/01/2014 10:29:06
update=31/08/2014 15:16:56
last_client=kicad
[common]
NetDir=
@ -37,3 +37,12 @@ LibName5=pin_array
LibName6=divers
[general]
version=1
[eeschema]
version=1
LibDir=
[eeschema/libraries]
LibName1=power
LibName2=device
LibName3=74xx
LibName4=conn
LibName5=xilinx

View File

@ -1,32 +1,9 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:conn
LIBS:xilinx
LIBS:special
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:pic_programmer-cache
EELAYER 24 0
EELAYER END
@ -42,15 +19,12 @@ Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
Wire Wire Line
4850 4750 4850 5100
Wire Wire Line
5700 1250 6100 1250
Wire Wire Line
5700 1250 5700 1200
Connection ~ 8650 3200
Wire Wire Line
8650 3150 8650 3200
8650 3200 8650 3150
Wire Wire Line
6550 1600 7100 1600
Wire Wire Line
@ -140,7 +114,6 @@ Wire Wire Line
3900 4200 2250 4200
Wire Wire Line
2250 4200 2250 3700
Connection ~ 8300 1600
Connection ~ 3400 6650
Wire Wire Line
3400 6650 3400 6600
@ -163,9 +136,9 @@ Wire Wire Line
Wire Wire Line
1450 6650 1350 6650
Wire Wire Line
7600 1600 8350 1600
7600 1600 8250 1600
Wire Wire Line
5950 4750 5350 4750
5950 5100 5350 5100
Wire Wire Line
5350 3150 6200 3150
Wire Wire Line
@ -266,7 +239,7 @@ U 1 1 464AD280
P 5700 1000
F 0 "C9" H 5750 1100 50 0000 L CNN
F 1 "22OnF" H 5750 900 50 0000 L CNN
F 2 "" H 5700 1000 60 0001 C CNN
F 2 "discret:C1-1" H 5500 900 30 0000 C CNN
F 3 "" H 5700 1000 60 0001 C CNN
1 5700 1000
1 0 0 -1
@ -288,7 +261,7 @@ U 1 1 4639BAF8
P 8650 2850
F 0 "JP1" H 8650 3000 60 0000 C CNN
F 1 "JUMPER" H 8650 2770 40 0000 C CNN
F 2 "" H 8650 2850 60 0001 C CNN
F 2 "connect:GS2" H 8650 3050 30 0000 C CNN
F 3 "" H 8650 2850 60 0001 C CNN
1 8650 2850
0 1 1 0
@ -299,7 +272,7 @@ U 1 1 4639BA28
P 7150 2900
F 0 "D11" H 7150 3000 40 0000 C CNN
F 1 "BAT43" H 7150 2800 40 0000 C CNN
F 2 "" H 7150 2900 60 0001 C CNN
F 2 "discret:D3" H 7150 3050 60 0000 C CNN
F 3 "" H 7150 2900 60 0001 C CNN
1 7150 2900
-1 0 0 1
@ -332,9 +305,8 @@ U 1 1 4639B9EA
P 7650 3500
F 0 "D12" H 7650 3600 50 0000 C CNN
F 1 "YELLOW-LED" H 7650 3400 50 0000 C CNN
F 2 "" H 7650 3500 60 0001 C CNN
F 2 "discret:LEDV" H 7650 3650 30 0000 C CNN
F 3 "" H 7650 3500 60 0001 C CNN
F 4 "YELLOW-LED" H 7700 3650 40 0000 C CNN "Champ4"
1 7650 3500
0 1 1 0
$EndComp
@ -344,7 +316,7 @@ U 1 1 4639B9E9
P 7900 3200
F 0 "R21" V 7980 3200 50 0000 C CNN
F 1 "470" V 7900 3200 50 0000 C CNN
F 2 "" H 7900 3200 60 0001 C CNN
F 2 "discret:R4" V 7824 3189 30 0000 C CNN
F 3 "" H 7900 3200 60 0001 C CNN
1 7900 3200
0 -1 -1 0
@ -355,7 +327,7 @@ U 1 1 4639B9B3
P 7650 2650
F 0 "R20" V 7730 2650 50 0000 C CNN
F 1 "2.2K" V 7650 2650 50 0000 C CNN
F 2 "" H 7650 2650 60 0001 C CNN
F 2 "discret:R4" V 7778 2650 30 0000 C CNN
F 3 "" H 7650 2650 60 0001 C CNN
1 7650 2650
0 -1 -1 0
@ -366,7 +338,7 @@ U 1 1 4639B9B0
P 7650 2900
F 0 "R19" V 7730 2900 50 0000 C CNN
F 1 "2.2K" V 7650 2900 50 0000 C CNN
F 2 "" H 7650 2900 60 0001 C CNN
F 2 "discret:R4" V 7578 2900 30 0000 C CNN
F 3 "" H 7650 2900 60 0001 C CNN
1 7650 2900
0 -1 -1 0
@ -377,7 +349,7 @@ U 1 1 4639B996
P 8200 2900
F 0 "Q3" H 8350 2900 60 0000 C CNN
F 1 "BC307" H 8104 3050 60 0000 C CNN
F 2 "" H 8200 2900 60 0001 C CNN
F 2 "discret:TO92" H 8100 3100 30 0000 C CNN
F 3 "" H 8200 2900 60 0001 C CNN
1 8200 2900
1 0 0 1
@ -401,7 +373,7 @@ U 1 1 443D0101
P 9600 5900
F 0 "RV1" H 9600 5800 50 0000 C CNN
F 1 "1K" H 9600 5900 50 0000 C CNN
F 2 "" H 9600 5900 60 0001 C CNN
F 2 "discret:RV2X4" H 9600 5900 60 0000 C CNN
F 3 "" H 9600 5900 60 0001 C CNN
1 9600 5900
0 -1 -1 0
@ -412,7 +384,7 @@ U 1 1 44369638
P 7350 1600
F 0 "R18" V 7430 1600 50 0000 C CNN
F 1 "220" V 7350 1600 50 0000 C CNN
F 2 "" H 7350 1600 60 0001 C CNN
F 2 "discret:R4" V 7500 1600 60 0000 C CNN
F 3 "" H 7350 1600 60 0001 C CNN
1 7350 1600
0 -1 -1 0
@ -448,7 +420,7 @@ VPP/MCLR
$Sheet
S 9200 3100 1550 1200
U 4804A5E2
F0 "pic_sockets.sch" 60
F0 "pic_sockets" 60
F1 "pic_sockets.sch" 60
F2 "VPP-MCLR" I L 9200 3500 60
F3 "CLOCK-RB6" I L 9200 4150 60
@ -472,7 +444,7 @@ U 1 1 442A6026
P 9400 5400
F 0 "D10" H 9400 5500 40 0000 C CNN
F 1 "SCHOTTKY" H 9400 5300 40 0000 C CNN
F 2 "" H 9400 5400 60 0001 C CNN
F 2 "discret:D5" H 9400 5250 30 0000 C CNN
F 3 "" H 9400 5400 60 0001 C CNN
1 9400 5400
1 0 0 -1
@ -483,7 +455,7 @@ U 1 1 442A5F83
P 8350 6100
F 0 "R10" V 8430 6100 50 0000 C CNN
F 1 "5,1K" V 8350 6100 50 0000 C CNN
F 2 "" H 8350 6100 60 0001 C CNN
F 2 "discret:R4" H 8350 6100 60 0000 C CNN
F 3 "" H 8350 6100 60 0001 C CNN
1 8350 6100
0 -1 -1 0
@ -494,7 +466,7 @@ U 1 1 442A5F61
P 8850 6300
F 0 "C4" H 8900 6400 50 0000 L CNN
F 1 "0" V 8900 6200 50 0000 L CNN
F 2 "" H 8850 6300 60 0001 C CNN
F 2 "discret:C1-1" V 8800 6100 30 0000 C CNN
F 3 "" H 8850 6300 60 0001 C CNN
1 8850 6300
0 -1 -1 0
@ -505,7 +477,7 @@ U 1 1 442A5E20
P 7750 5400
F 0 "U4" H 8350 5900 60 0000 C CNN
F 1 "LT1373" H 7250 5900 60 0000 C CNN
F 2 "" H 7750 5400 60 0001 C CNN
F 2 "dip_sockets:DIP-8__300_ELL" H 7350 5850 30 0000 C CNN
F 3 "" H 7750 5400 60 0001 C CNN
1 7750 5400
1 0 0 -1
@ -529,7 +501,7 @@ U 1 1 442A58DC
P 10000 5650
F 0 "R16" V 10080 5650 50 0000 C CNN
F 1 "62K" V 10000 5650 50 0000 C CNN
F 2 "" H 10000 5650 60 0001 C CNN
F 2 "discret:R4" H 10000 5650 60 0000 C CNN
F 3 "" H 10000 5650 60 0001 C CNN
1 10000 5650
0 -1 -1 0
@ -540,7 +512,7 @@ U 1 1 442A58D7
P 10000 6150
F 0 "R15" V 10080 6150 50 0000 C CNN
F 1 "6.2K" V 10000 6150 50 0000 C CNN
F 2 "" H 10000 6150 60 0001 C CNN
F 2 "discret:R4" H 10000 6150 60 0000 C CNN
F 3 "" H 10000 6150 60 0001 C CNN
1 10000 6150
0 -1 -1 0
@ -563,7 +535,7 @@ U 1 1 442A58B1
P 9000 6000
F 0 "C5" H 9050 6100 50 0000 L CNN
F 1 "10nF" V 9150 5850 50 0000 L CNN
F 2 "" H 9000 6000 60 0001 C CNN
F 2 "discret:C1-1" V 8950 6200 30 0000 C CNN
F 3 "" H 9000 6000 60 0001 C CNN
1 9000 6000
0 -1 -1 0
@ -606,17 +578,17 @@ L CP C3
U 1 1 442A584C
P 10550 5400
F 0 "C3" H 10600 5500 50 0000 L CNN
F 1 "22uF/25V" H 10600 5300 50 0000 L CNN
F 2 "" H 10550 5400 60 0001 C CNN
F 1 "22uF/25V" V 10700 5050 50 0000 L CNN
F 2 "discret:CP8" V 10450 5400 30 0000 C CNN
F 3 "" H 10550 5400 60 0001 C CNN
1 10550 5400
0 -1 -1 0
$EndComp
$Comp
L VPP #PWR34
L VPP #PWR134
U 1 1 442A5846
P 10250 5350
F 0 "#PWR34" H 10250 5550 40 0001 C CNN
F 0 "#PWR134" H 10250 5550 40 0001 C CNN
F 1 "VPP" H 10250 5500 40 0000 C CNN
F 2 "" H 10250 5350 60 0001 C CNN
F 3 "" H 10250 5350 60 0001 C CNN
@ -651,7 +623,7 @@ U 1 1 442A57BE
P 9100 5150
F 0 "L1" V 9050 5150 40 0000 C CNN
F 1 "22uH" V 9200 5150 40 0000 C CNN
F 2 "" H 9100 5150 60 0001 C CNN
F 2 "inductors:INDUCTOR_V" V 9250 5150 30 0000 C CNN
F 3 "" H 9100 5150 60 0001 C CNN
1 9100 5150
0 -1 -1 0
@ -677,7 +649,7 @@ U 1 1 442A50BF
P 7050 2100
F 0 "R17" V 7130 2100 50 0000 C CNN
F 1 "22K" V 7050 2100 50 0000 C CNN
F 2 "" H 7050 2100 60 0001 C CNN
F 2 "discret:R4" V 7200 2100 60 0000 C CNN
F 3 "" H 7050 2100 60 0001 C CNN
1 7050 2100
1 0 0 -1
@ -710,7 +682,7 @@ U 1 1 442A5084
P 4150 6950
F 0 "D9" H 4150 7050 50 0000 C CNN
F 1 "GREEN-LED" H 4150 6850 50 0000 C CNN
F 2 "" H 4150 6950 60 0001 C CNN
F 2 "discret:LEDV" H 4150 7200 60 0000 C CNN
F 3 "" H 4150 6950 60 0001 C CNN
F 4 "GREEN LED" H 4200 7100 40 0000 C CNN "Champ4"
1 4150 6950
@ -722,7 +694,7 @@ U 1 1 442A5083
P 3850 6650
F 0 "R14" V 3930 6650 50 0000 C CNN
F 1 "470" V 3850 6650 50 0000 C CNN
F 2 "" H 3850 6650 60 0001 C CNN
F 2 "discret:R4" H 3850 6650 60 0000 C CNN
F 3 "" H 3850 6650 60 0001 C CNN
1 3850 6650
0 -1 -1 0
@ -743,8 +715,8 @@ L CP C1
U 1 1 442A5056
P 3200 6900
F 0 "C1" H 3250 7000 50 0000 L CNN
F 1 "100uF" H 3250 6800 50 0000 L CNN
F 2 "" H 3200 6900 60 0001 C CNN
F 1 "100µF" H 3250 6800 50 0000 L CNN
F 2 "discret:CP10" H 3500 6750 60 0000 C CNN
F 3 "" H 3200 6900 60 0001 C CNN
1 3200 6900
1 0 0 -1
@ -766,7 +738,7 @@ U 1 1 442A504A
P 2700 6700
F 0 "U3" H 2850 6504 60 0000 C CNN
F 1 "7805" H 2700 6900 60 0000 C CNN
F 2 "" H 2700 6700 60 0001 C CNN
F 2 "discret:LM78XX" H 2750 7000 60 0000 C CNN
F 3 "" H 2700 6700 60 0001 C CNN
1 2700 6700
1 0 0 -1
@ -788,7 +760,7 @@ U 1 1 442A501D
P 1950 6900
F 0 "C2" H 2000 7000 50 0000 L CNN
F 1 "220uF" H 2000 6800 50 0000 L CNN
F 2 "" H 1950 6900 60 0001 C CNN
F 2 "discret:CP10" H 2300 6700 60 0000 C CNN
F 3 "" H 1950 6900 60 0001 C CNN
1 1950 6900
1 0 0 -1
@ -810,7 +782,7 @@ U 1 1 442A500B
P 1650 6650
F 0 "D1" H 1650 6750 40 0000 C CNN
F 1 "1N4004" H 1650 6550 40 0000 C CNN
F 2 "" H 1650 6650 60 0001 C CNN
F 2 "discret:D5" H 1700 6850 60 0000 C CNN
F 3 "" H 1650 6650 60 0001 C CNN
1 1650 6650
1 0 0 -1
@ -821,7 +793,7 @@ U 1 1 442A4FE7
P 1000 6750
F 0 "P1" V 950 6750 40 0000 C CNN
F 1 "CONN_2" V 1050 6750 40 0000 C CNN
F 2 "" H 1000 6750 60 0001 C CNN
F 2 "connect:bornier2" H 950 7000 60 0000 C CNN
F 3 "" H 1000 6750 60 0001 C CNN
1 1000 6750
-1 0 0 1
@ -834,10 +806,9 @@ U 1 1 442A4F5D
P 6550 2400
F 0 "D8" H 6550 2500 50 0000 C CNN
F 1 "RED-LED" H 6550 2300 50 0000 C CNN
F 2 "" H 6550 2400 60 0001 C CNN
F 2 "discret:LEDV" H 6550 2250 30 0000 C CNN
F 3 "" H 6550 2400 60 0001 C CNN
F 4 "Low Current Led" H 6600 2550 40 0000 C CNN "Champ4"
F 5 "RED LED" H 6550 2250 40 0000 C CNN "Champ5"
1 6550 2400
0 1 1 0
$EndComp
@ -847,16 +818,16 @@ U 1 1 442A4F52
P 6550 1900
F 0 "R9" V 6630 1900 50 0000 C CNN
F 1 "2.2K" V 6550 1900 50 0000 C CNN
F 2 "" H 6550 1900 60 0001 C CNN
F 2 "discret:R4" V 6450 1900 30 0000 C CNN
F 3 "" H 6550 1900 60 0001 C CNN
1 6550 1900
1 0 0 -1
$EndComp
$Comp
L VPP #PWR23
L VPP #PWR123
U 1 1 442A4F48
P 6550 1100
F 0 "#PWR23" H 6550 1300 40 0001 C CNN
F 0 "#PWR123" H 6550 1300 40 0001 C CNN
F 1 "VPP" H 6550 1250 40 0000 C CNN
F 2 "" H 6550 1100 60 0001 C CNN
F 3 "" H 6550 1100 60 0001 C CNN
@ -864,10 +835,10 @@ F 3 "" H 6550 1100 60 0001 C CNN
1 0 0 -1
$EndComp
$Comp
L VPP #PWR22
L VPP #PWR122
U 1 1 442A4F44
P 6100 700
F 0 "#PWR22" H 6100 900 40 0001 C CNN
F 0 "#PWR122" H 6100 900 40 0001 C CNN
F 1 "VPP" H 6100 850 40 0000 C CNN
F 2 "" H 6100 700 60 0001 C CNN
F 3 "" H 6100 700 60 0001 C CNN
@ -878,9 +849,9 @@ $Comp
L PNP Q2
U 1 1 442A4F30
P 6450 1400
F 0 "Q2" H 6600 1400 60 0000 C CNN
F 0 "Q2" H 6400 1250 60 0000 C CNN
F 1 "BC307" H 6354 1550 60 0000 C CNN
F 2 "" H 6450 1400 60 0001 C CNN
F 2 "discret:TO92" H 6348 1617 30 0000 C CNN
F 3 "" H 6450 1400 60 0001 C CNN
1 6450 1400
1 0 0 1
@ -891,7 +862,7 @@ U 1 1 442A4F2A
P 6100 1000
F 0 "R7" V 6180 1000 50 0000 C CNN
F 1 "10K" V 6100 1000 50 0000 C CNN
F 2 "" H 6100 1000 60 0001 C CNN
F 2 "discret:R4" V 6250 1000 60 0000 C CNN
F 3 "" H 6100 1000 60 0001 C CNN
1 6100 1000
1 0 0 -1
@ -902,7 +873,7 @@ U 1 1 442A4F23
P 5750 1400
F 0 "R11" V 5830 1400 50 0000 C CNN
F 1 "22K" V 5750 1400 50 0000 C CNN
F 2 "" H 5750 1400 60 0001 C CNN
F 2 "discret:R4" V 5821 1591 30 0000 C CNN
F 3 "" H 5750 1400 60 0001 C CNN
1 5750 1400
0 -1 -1 0
@ -920,7 +891,7 @@ F 3 "" H 5450 1900 60 0001 C CNN
$EndComp
Text Label 2300 1700 0 60 ~ 0
VPP_ON
Text Label 5400 4750 0 60 ~ 0
Text Label 5400 5100 0 60 ~ 0
CLOCK-RB6
Text Label 5500 3150 0 60 ~ 0
DATA-RB7
@ -930,7 +901,7 @@ U 1 1 442A4EB9
P 5350 1700
F 0 "Q1" H 5500 1700 50 0000 C CNN
F 1 "BC237" H 5252 1850 50 0000 C CNN
F 2 "" H 5350 1700 60 0001 C CNN
F 2 "discret:TO92" H 5200 1550 30 0000 C CNN
F 3 "" H 5350 1700 60 0001 C CNN
1 5350 1700
1 0 0 -1
@ -991,7 +962,7 @@ U 1 1 442A4D92
P 4700 1700
F 0 "R8" V 4780 1700 50 0000 C CNN
F 1 "1K" V 4700 1700 50 0000 C CNN
F 2 "" H 4700 1700 60 0001 C CNN
F 2 "discret:R4" V 4850 1700 60 0000 C CNN
F 3 "" H 4700 1700 60 0001 C CNN
1 4700 1700
0 -1 -1 0
@ -999,12 +970,12 @@ $EndComp
$Comp
L R R13
U 1 1 442A4D8D
P 5100 4750
F 0 "R13" V 5180 4750 50 0000 C CNN
F 1 "470" V 5100 4750 50 0000 C CNN
F 2 "" H 5100 4750 60 0001 C CNN
F 3 "" H 5100 4750 60 0001 C CNN
1 5100 4750
P 5100 5100
F 0 "R13" V 5180 5100 50 0000 C CNN
F 1 "470" V 5100 5100 50 0000 C CNN
F 2 "discret:R4" V 5250 5100 60 0000 C CNN
F 3 "" H 5100 5100 60 0001 C CNN
1 5100 5100
0 -1 -1 0
$EndComp
$Comp
@ -1013,7 +984,7 @@ U 1 1 442A4D85
P 5100 3150
F 0 "R12" V 5180 3150 50 0000 C CNN
F 1 "470" V 5100 3150 50 0000 C CNN
F 2 "" H 5100 3150 60 0001 C CNN
F 2 "discret:R4" V 5250 3150 60 0000 C CNN
F 3 "" H 5100 3150 60 0001 C CNN
1 5100 3150
0 -1 -1 0
@ -1035,7 +1006,7 @@ U 4 1 442A4D6B
P 4350 4200
F 0 "U2" H 4350 4300 50 0000 L BNN
F 1 "74HC125" H 4400 4050 40 0000 L TNN
F 2 "" H 4350 4200 60 0001 C CNN
F 2 "dip_sockets:DIP-14__300_ELL" H 4750 4100 30 0000 C CNN
F 3 "" H 4350 4200 60 0001 C CNN
4 4350 4200
-1 0 0 -1
@ -1079,7 +1050,7 @@ U 1 1 442A4D65
P 3850 5400
F 0 "D7" H 3850 5500 40 0000 C CNN
F 1 "BAT43" H 3850 5300 40 0000 C CNN
F 2 "" H 3850 5400 60 0001 C CNN
F 2 "discret:D3" H 3850 5250 60 0000 C CNN
F 3 "" H 3850 5400 60 0001 C CNN
1 3850 5400
0 -1 -1 0
@ -1090,7 +1061,7 @@ U 1 1 442A4D64
P 3850 4850
F 0 "D6" H 3850 4950 40 0000 C CNN
F 1 "BAT43" H 3850 4750 40 0000 C CNN
F 2 "" H 3850 4850 60 0001 C CNN
F 2 "discret:D3" H 3850 4700 30 0000 C CNN
F 3 "" H 3850 4850 60 0001 C CNN
1 3850 4850
0 -1 -1 0
@ -1101,7 +1072,7 @@ U 1 1 442A4D63
P 3200 5400
F 0 "R6" V 3280 5400 50 0000 C CNN
F 1 "10K" V 3200 5400 50 0000 C CNN
F 2 "" H 3200 5400 60 0001 C CNN
F 2 "discret:R4" V 3100 5400 60 0000 C CNN
F 3 "" H 3200 5400 60 0001 C CNN
1 3200 5400
1 0 0 -1
@ -1112,7 +1083,7 @@ U 1 1 442A4D62
P 3500 5100
F 0 "R5" V 3580 5100 50 0000 C CNN
F 1 "10K" V 3500 5100 50 0000 C CNN
F 2 "" H 3500 5100 60 0001 C CNN
F 2 "discret:R4" H 3500 5100 60 0000 C CNN
F 3 "" H 3500 5100 60 0001 C CNN
1 3500 5100
0 -1 -1 0
@ -1123,7 +1094,7 @@ U 3 1 442A4D61
P 4350 5100
F 0 "U2" H 4350 5200 50 0000 L BNN
F 1 "74HC125" H 4400 4950 40 0000 L TNN
F 2 "" H 4350 5100 60 0001 C CNN
F 2 "dip_sockets:DIP-14__300_ELL" H 4750 4850 30 0000 C CNN
F 3 "" H 4350 5100 60 0001 C CNN
3 4350 5100
1 0 0 -1
@ -1167,7 +1138,7 @@ U 1 1 442A4D5D
P 3850 3450
F 0 "D5" H 3850 3550 40 0000 C CNN
F 1 "BAT43" H 3850 3350 40 0000 C CNN
F 2 "" H 3850 3450 60 0001 C CNN
F 2 "discret:D3" H 3850 3300 60 0000 C CNN
F 3 "" H 3850 3450 60 0001 C CNN
1 3850 3450
0 -1 -1 0
@ -1178,7 +1149,7 @@ U 1 1 442A4D5C
P 3850 2900
F 0 "D4" H 3850 3000 40 0000 C CNN
F 1 "BAT43" H 3850 2800 40 0000 C CNN
F 2 "" H 3850 2900 60 0001 C CNN
F 2 "discret:D3" H 3850 2750 30 0000 C CNN
F 3 "" H 3850 2900 60 0001 C CNN
1 3850 2900
0 -1 -1 0
@ -1189,7 +1160,7 @@ U 1 1 442A4D5B
P 3200 3450
F 0 "R4" V 3280 3450 50 0000 C CNN
F 1 "10K" V 3200 3450 50 0000 C CNN
F 2 "" H 3200 3450 60 0001 C CNN
F 2 "discret:R4" V 3100 3450 60 0000 C CNN
F 3 "" H 3200 3450 60 0001 C CNN
1 3200 3450
1 0 0 -1
@ -1200,7 +1171,7 @@ U 1 1 442A4D5A
P 3500 3150
F 0 "R3" V 3580 3150 50 0000 C CNN
F 1 "10K" V 3500 3150 50 0000 C CNN
F 2 "" H 3500 3150 60 0001 C CNN
F 2 "discret:R4" V 3650 3150 30 0000 C CNN
F 3 "" H 3500 3150 60 0001 C CNN
1 3500 3150
0 -1 -1 0
@ -1211,7 +1182,7 @@ U 2 1 442A4D59
P 4350 3150
F 0 "U2" H 4350 3250 50 0000 L BNN
F 1 "74HC125" H 4400 3000 40 0000 L TNN
F 2 "" H 4350 3150 60 0001 C CNN
F 2 "dip_sockets:DIP-14__300_ELL" H 4712 2930 30 0000 C CNN
F 3 "" H 4350 3150 60 0001 C CNN
2 4350 3150
1 0 0 -1
@ -1255,7 +1226,7 @@ U 1 1 442A4D25
P 3450 2000
F 0 "D3" H 3450 2100 40 0000 C CNN
F 1 "BAT43" H 3450 1900 40 0000 C CNN
F 2 "" H 3450 2000 60 0001 C CNN
F 2 "discret:D3" H 3450 1850 60 0000 C CNN
F 3 "" H 3450 2000 60 0001 C CNN
1 3450 2000
0 -1 -1 0
@ -1266,7 +1237,7 @@ U 1 1 442A4D1B
P 3450 1450
F 0 "D2" H 3450 1550 40 0000 C CNN
F 1 "BAT43" H 3450 1350 40 0000 C CNN
F 2 "" H 3450 1450 60 0001 C CNN
F 2 "discret:D3" H 3500 1300 60 0000 C CNN
F 3 "" H 3450 1450 60 0001 C CNN
1 3450 1450
0 -1 -1 0
@ -1277,7 +1248,7 @@ U 1 1 442A4CFB
P 2800 2000
F 0 "R2" V 2880 2000 50 0000 C CNN
F 1 "10K" V 2800 2000 50 0000 C CNN
F 2 "" H 2800 2000 60 0001 C CNN
F 2 "discret:R4" V 2700 2000 60 0000 C CNN
F 3 "" H 2800 2000 60 0001 C CNN
1 2800 2000
1 0 0 -1
@ -1288,7 +1259,7 @@ U 1 1 442A4CF4
P 3100 1700
F 0 "R1" V 3180 1700 50 0000 C CNN
F 1 "10K" V 3100 1700 50 0000 C CNN
F 2 "" H 3100 1700 60 0001 C CNN
F 2 "discret:R4" V 3250 1700 60 0000 C CNN
F 3 "" H 3100 1700 60 0001 C CNN
1 3100 1700
0 -1 -1 0
@ -1299,7 +1270,7 @@ U 1 1 442A4CC8
P 3950 1700
F 0 "U2" H 3950 1800 50 0000 L BNN
F 1 "74HC125" H 4000 1550 40 0000 L TNN
F 2 "" H 3950 1700 60 0001 C CNN
F 2 "dip_sockets:DIP-14__300_ELL" H 4350 1450 30 0000 C CNN
F 3 "" H 3950 1700 60 0001 C CNN
1 3950 1700
1 0 0 -1
@ -1310,9 +1281,76 @@ U 1 1 442A4C93
P 1250 3600
F 0 "J1" H 1250 4150 70 0000 C CNN
F 1 "DB9-FEMAL" H 1250 3050 70 0000 C CNN
F 2 "" H 1250 3600 60 0001 C CNN
F 2 "connect:DB9FC" H 1200 4250 60 0000 C CNN
F 3 "" H 1250 3600 60 0001 C CNN
1 1250 3600
-1 0 0 1
$EndComp
$Comp
L CONN_1 P101
U 1 1 54020BEA
P 6400 6850
F 0 "P101" H 6480 6850 40 0000 L CNN
F 1 "CONN_1" H 6400 6905 30 0001 C CNN
F 2 "footprints:1pin-4" H 6400 6850 60 0001 C CNN
F 3 "" H 6400 6850 60 0000 C CNN
1 6400 6850
1 0 0 -1
$EndComp
$Comp
L CONN_1 P102
U 1 1 54020DA9
P 6400 7000
F 0 "P102" H 6480 7000 40 0000 L CNN
F 1 "CONN_1" H 6400 7055 30 0001 C CNN
F 2 "footprints:1pin-4" H 6400 7000 60 0001 C CNN
F 3 "" H 6400 7000 60 0000 C CNN
1 6400 7000
1 0 0 -1
$EndComp
$Comp
L CONN_1 P103
U 1 1 54020DC2
P 6400 7150
F 0 "P103" H 6480 7150 40 0000 L CNN
F 1 "CONN_1" H 6400 7205 30 0001 C CNN
F 2 "footprints:1pin-4" H 6400 7150 60 0001 C CNN
F 3 "" H 6400 7150 60 0000 C CNN
1 6400 7150
1 0 0 -1
$EndComp
$Comp
L CONN_1 P104
U 1 1 54020DE3
P 6400 7300
F 0 "P104" H 6480 7300 40 0000 L CNN
F 1 "CONN_1" H 6400 7355 30 0001 C CNN
F 2 "footprints:1pin-4" H 6400 7300 60 0001 C CNN
F 3 "" H 6400 7300 60 0000 C CNN
1 6400 7300
1 0 0 -1
$EndComp
$Comp
L CONN_1 P105
U 1 1 54020E5D
P 6400 7450
F 0 "P105" H 6480 7450 40 0000 L CNN
F 1 "CONN_1" H 6400 7505 30 0001 C CNN
F 2 "footprints:1pin-4" H 6400 7450 60 0001 C CNN
F 3 "" H 6400 7450 60 0000 C CNN
1 6400 7450
1 0 0 -1
$EndComp
$Comp
L CONN_1 P106
U 1 1 54020E76
P 6400 7600
F 0 "P106" H 6480 7600 40 0000 L CNN
F 1 "CONN_1" H 6400 7655 30 0001 C CNN
F 2 "footprints:1pin-4" H 6400 7600 60 0001 C CNN
F 3 "" H 6400 7600 60 0000 C CNN
1 6400 7600
1 0 0 -1
$EndComp
Connection ~ 8650 3200
$EndSCHEMATC

View File

@ -1,32 +1,9 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:conn
LIBS:xilinx
LIBS:special
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:pic_programmer-cache
EELAYER 24 0
EELAYER END
@ -79,7 +56,7 @@ Wire Wire Line
Wire Wire Line
4050 5000 4850 5000
Wire Wire Line
2500 4700 1750 4700
2500 4700 1850 4700
Wire Wire Line
5400 2850 4550 2850
Wire Wire Line
@ -97,33 +74,7 @@ Wire Wire Line
Wire Wire Line
8450 5150 7650 5150
Wire Wire Line
3700 6900 4550 6900
Wire Wire Line
4550 6900 4550 7000
Text Label 3950 6900 0 60 ~ 0
VCC_PIC
$Comp
L GND #PWR036
U 1 1 4639BE2E
P 4550 7400
F 0 "#PWR036" H 4550 7400 30 0001 C CNN
F 1 "GND" H 4550 7330 30 0001 C CNN
F 2 "" H 4550 7400 60 0001 C CNN
F 3 "" H 4550 7400 60 0001 C CNN
1 4550 7400
1 0 0 -1
$EndComp
$Comp
L C C8
U 1 1 4639BE2C
P 4550 7200
F 0 "C8" H 4600 7300 50 0000 L CNN
F 1 "100nF" H 4600 7100 50 0000 L CNN
F 2 "" H 4550 7200 60 0001 C CNN
F 3 "" H 4550 7200 60 0001 C CNN
1 4550 7200
1 0 0 -1
$EndComp
3700 6900 2700 6900
Text HLabel 2350 2150 0 60 Input ~ 0
VCC_PIC
Text Label 2550 2150 0 60 ~ 0
@ -135,10 +86,10 @@ VCC_PIC
Text Label 9650 2500 0 60 ~ 0
VCC_PIC
$Comp
L GND #PWR037
L GND #PWR036
U 1 1 442A8794
P 8450 5250
F 0 "#PWR037" H 8450 5250 30 0001 C CNN
F 0 "#PWR036" H 8450 5250 30 0001 C CNN
F 1 "GND" H 8450 5180 30 0001 C CNN
F 2 "" H 8450 5250 60 0001 C CNN
F 3 "" H 8450 5250 60 0001 C CNN
@ -148,10 +99,10 @@ $EndComp
Text Label 4300 4850 0 60 ~ 0
VCC_PIC
$Comp
L GND #PWR038
L GND #PWR037
U 1 1 443CCA5D
P 8450 4850
F 0 "#PWR038" H 8450 4850 30 0001 C CNN
F 0 "#PWR037" H 8450 4850 30 0001 C CNN
F 1 "GND" H 8450 4780 30 0001 C CNN
F 2 "" H 8450 4850 60 0001 C CNN
F 3 "" H 8450 4850 60 0001 C CNN
@ -181,10 +132,10 @@ NoConn ~ 8200 2000
NoConn ~ 8200 1900
NoConn ~ 8200 1800
$Comp
L GND #PWR039
L GND #PWR038
U 1 1 443697C7
P 9400 2600
F 0 "#PWR039" H 9400 2600 30 0001 C CNN
F 0 "#PWR038" H 9400 2600 30 0001 C CNN
F 1 "GND" H 9400 2530 30 0001 C CNN
F 2 "" H 9400 2600 60 0001 C CNN
F 3 "" H 9400 2600 60 0001 C CNN
@ -192,10 +143,10 @@ F 3 "" H 9400 2600 60 0001 C CNN
0 -1 -1 0
$EndComp
$Comp
L GND #PWR040
L GND #PWR039
U 1 1 443697C3
P 8200 2400
F 0 "#PWR040" H 8200 2400 30 0001 C CNN
F 0 "#PWR039" H 8200 2400 30 0001 C CNN
F 1 "GND" H 8200 2330 30 0001 C CNN
F 2 "" H 8200 2400 60 0001 C CNN
F 3 "" H 8200 2400 60 0001 C CNN
@ -214,16 +165,16 @@ U 1 1 4436967E
P 8800 2350
F 0 "P2" H 8850 3150 70 0000 C CNN
F 1 "SUPP28" H 8800 1550 70 0000 C CNN
F 2 "" H 8800 2350 60 0001 C CNN
F 2 "dip_sockets:DIP-28__300_ELL" H 8800 1450 60 0000 C CNN
F 3 "" H 8800 2350 60 0001 C CNN
1 8800 2350
1 0 0 -1
$EndComp
$Comp
L GND #PWR041
L GND #PWR040
U 1 1 442AA147
P 3700 7400
F 0 "#PWR041" H 3700 7400 30 0001 C CNN
F 0 "#PWR040" H 3700 7400 30 0001 C CNN
F 1 "GND" H 3700 7330 30 0001 C CNN
F 2 "" H 3700 7400 60 0001 C CNN
F 3 "" H 3700 7400 60 0001 C CNN
@ -236,44 +187,22 @@ U 1 1 442AA145
P 3700 7200
F 0 "C7" H 3750 7300 50 0000 L CNN
F 1 "100nF" H 3750 7100 50 0000 L CNN
F 2 "" H 3700 7200 60 0001 C CNN
F 2 "discret:C1-1" H 4050 7000 60 0000 C CNN
F 3 "" H 3700 7200 60 0001 C CNN
1 3700 7200
1 0 0 -1
$EndComp
$Comp
L GND #PWR042
L GND #PWR041
U 1 1 442AA138
P 2700 7400
F 0 "#PWR042" H 2700 7400 30 0001 C CNN
F 0 "#PWR041" H 2700 7400 30 0001 C CNN
F 1 "GND" H 2700 7330 30 0001 C CNN
F 2 "" H 2700 7400 60 0001 C CNN
F 3 "" H 2700 7400 60 0001 C CNN
1 2700 7400
1 0 0 -1
$EndComp
$Comp
L VCC #PWR043
U 1 1 442AA134
P 2700 7000
F 0 "#PWR043" H 2700 7100 30 0001 C CNN
F 1 "VCC" H 2700 7100 30 0000 C CNN
F 2 "" H 2700 7000 60 0001 C CNN
F 3 "" H 2700 7000 60 0001 C CNN
1 2700 7000
1 0 0 -1
$EndComp
$Comp
L C C6
U 1 1 442AA12B
P 2700 7200
F 0 "C6" H 2750 7300 50 0000 L CNN
F 1 "100nF" H 2750 7100 50 0000 L CNN
F 2 "" H 2700 7200 60 0001 C CNN
F 3 "" H 2700 7200 60 0001 C CNN
1 2700 7200
1 0 0 -1
$EndComp
NoConn ~ 9650 6050
NoConn ~ 9650 5950
NoConn ~ 9650 5850
@ -307,10 +236,10 @@ NoConn ~ 8450 4450
NoConn ~ 8450 4350
NoConn ~ 8450 4250
$Comp
L GND #PWR044
L GND #PWR042
U 1 1 442A896A
P 9650 5050
F 0 "#PWR044" H 9650 5050 30 0001 C CNN
F 0 "#PWR042" H 9650 5050 30 0001 C CNN
F 1 "GND" H 9650 4980 30 0001 C CNN
F 2 "" H 9650 5050 60 0001 C CNN
F 3 "" H 9650 5050 60 0001 C CNN
@ -323,17 +252,17 @@ U 1 1 442A88ED
P 9050 5100
F 0 "P3" H 9100 6200 70 0000 C CNN
F 1 "SUPP40" H 8900 4000 70 0000 C CNN
F 2 "" H 9050 5100 60 0001 C CNN
F 2 "footprints:textool_40" H 9100 3900 60 0000 C CNN
F 3 "" H 9050 5100 60 0001 C CNN
1 9050 5100
1 0 0 -1
$EndComp
NoConn ~ 4550 1100
$Comp
L GND #PWR045
L GND #PWR043
U 1 1 442A8838
P 2950 1250
F 0 "#PWR045" H 2950 1250 30 0001 C CNN
F 0 "#PWR043" H 2950 1250 30 0001 C CNN
F 1 "GND" H 2950 1180 30 0001 C CNN
F 2 "" H 2950 1250 60 0001 C CNN
F 3 "" H 2950 1250 60 0001 C CNN
@ -350,7 +279,7 @@ U 1 1 442A87F7
P 3850 1200
F 0 "U1" H 4000 1550 60 0000 C CNN
F 1 "24Cxx" H 4050 850 60 0000 C CNN
F 2 "" H 3850 1200 60 0001 C CNN
F 2 "dip_sockets:DIP-8__300_ELL" H 4600 800 60 0000 C CNN
F 3 "" H 3850 1200 60 0001 C CNN
1 3850 1200
1 0 0 -1
@ -378,9 +307,9 @@ $Comp
L PIC16F54 U5
U 1 1 442A81A7
P 3300 4850
F 0 "U5" H 3600 5650 60 0000 C CNN
F 1 "PIC_18_PINS" H 3750 4050 60 0000 C CNN
F 2 "" H 3300 4850 60 0001 C CNN
F 0 "U5" H 3300 5600 60 0000 C CNN
F 1 "PIC_18_PINS" H 3300 4050 60 0000 C CNN
F 2 "dip_sockets:DIP-18__300_ELL" H 3350 3950 60 0000 C CNN
F 3 "" H 3300 4850 60 0001 C CNN
1 3300 4850
1 0 0 -1
@ -407,10 +336,10 @@ CLOCK-RB6
Text HLabel 1350 4050 0 60 Input ~ 0
DATA-RB7
$Comp
L GND #PWR046
L GND #PWR044
U 1 1 442A820F
P 2300 4900
F 0 "#PWR046" H 2300 4900 30 0001 C CNN
F 0 "#PWR044" H 2300 4900 30 0001 C CNN
F 1 "GND" H 2300 4830 30 0001 C CNN
F 2 "" H 2300 4900 60 0001 C CNN
F 3 "" H 2300 4900 60 0001 C CNN
@ -418,10 +347,10 @@ F 3 "" H 2300 4900 60 0001 C CNN
1 0 0 -1
$EndComp
$Comp
L GND #PWR047
L GND #PWR045
U 1 1 442A8205
P 4550 2150
F 0 "#PWR047" H 4550 2150 30 0001 C CNN
F 0 "#PWR045" H 4550 2150 30 0001 C CNN
F 1 "GND" H 4550 2080 30 0001 C CNN
F 2 "" H 4550 2150 60 0001 C CNN
F 3 "" H 4550 2150 60 0001 C CNN
@ -434,31 +363,37 @@ U 1 1 442A81A5
P 3850 2650
F 0 "U6" H 3800 3350 60 0000 C CNN
F 1 "PIC_8_PINS" H 3850 1950 60 0000 C CNN
F 2 "" H 3850 2650 60 0001 C CNN
F 2 "dip_sockets:DIP-8__300_ELL" H 3850 1850 60 0000 C CNN
F 3 "" H 3850 2650 60 0001 C CNN
1 3850 2650
1 0 0 -1
$EndComp
$Comp
L GND #PWR048
L GND #PWR046
U 1 1 52C92629
P 3850 1700
F 0 "#PWR048" H 3850 1700 30 0001 C CNN
F 0 "#PWR046" H 3850 1700 30 0001 C CNN
F 1 "GND" H 3850 1630 30 0001 C CNN
F 2 "" H 3850 1700 60 0001 C CNN
F 3 "" H 3850 1700 60 0001 C CNN
1 3850 1700
1 0 0 -1
$EndComp
Text Label 3850 700 0 60 ~ 0
VCC_PIC
$Comp
L VCC #PWR049
U 1 1 52C92634
P 3850 700
F 0 "#PWR049" H 3850 800 30 0001 C CNN
F 1 "VCC" H 3850 800 30 0000 C CNN
F 2 "" H 3850 700 60 0001 C CNN
F 3 "" H 3850 700 60 0001 C CNN
1 3850 700
L C C6
U 1 1 442AA12B
P 2700 7200
F 0 "C6" H 2750 7300 50 0000 L CNN
F 1 "100nF" H 2750 7100 50 0000 L CNN
F 2 "discret:C1-1" H 3050 7050 60 0000 C CNN
F 3 "" H 2700 7200 60 0001 C CNN
1 2700 7200
1 0 0 -1
$EndComp
Wire Wire Line
2700 6900 2700 7000
Text Label 3150 6900 0 60 ~ 0
VCC_PIC
$EndSCHEMATC

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More