* Merge in changes from TIP
|
@ -28,6 +28,7 @@ version.h
|
|||
config.h
|
||||
install_manifest.txt
|
||||
Documentation/doxygen
|
||||
Documentation/development/doxygen
|
||||
*.bak
|
||||
common/pcb_plot_params_keywords.cpp
|
||||
include/pcb_plot_params_lexer.h
|
||||
|
|
|
@ -45,16 +45,11 @@
|
|||
#include <info3d_visu.h>
|
||||
#include <trackball.h>
|
||||
|
||||
// Exported function:
|
||||
void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
|
||||
|
||||
|
||||
void S3D_MASTER::Set_Object_Coords( std::vector< S3D_VERTEX >& aVertices )
|
||||
void S3D_MASTER::ObjectCoordsTo3DUnits( std::vector< S3D_VERTEX >& aVertices )
|
||||
{
|
||||
unsigned ii;
|
||||
|
||||
/* adjust object scale, rotation and offset position */
|
||||
for( ii = 0; ii < aVertices.size(); ii++ )
|
||||
for( unsigned ii = 0; ii < aVertices.size(); ii++ )
|
||||
{
|
||||
aVertices[ii].x *= m_MatScale.x;
|
||||
aVertices[ii].y *= m_MatScale.y;
|
||||
|
@ -62,13 +57,31 @@ void S3D_MASTER::Set_Object_Coords( std::vector< S3D_VERTEX >& aVertices )
|
|||
|
||||
// adjust rotation
|
||||
if( m_MatRotation.x )
|
||||
RotatePoint( &aVertices[ii].y, &aVertices[ii].z, m_MatRotation.x * 10 );
|
||||
{
|
||||
double a = aVertices[ii].y;
|
||||
double b = aVertices[ii].z;
|
||||
RotatePoint( &a, &b, m_MatRotation.x * 10 );
|
||||
aVertices[ii].y = (float)a;
|
||||
aVertices[ii].z = (float)b;
|
||||
}
|
||||
|
||||
if( m_MatRotation.y )
|
||||
RotatePoint( &aVertices[ii].z, &aVertices[ii].x, m_MatRotation.y * 10 );
|
||||
{
|
||||
double a = aVertices[ii].z;
|
||||
double b = aVertices[ii].x;
|
||||
RotatePoint( &a, &b, m_MatRotation.x * 10 );
|
||||
aVertices[ii].z = (float)a;
|
||||
aVertices[ii].x = (float)b;
|
||||
}
|
||||
|
||||
if( m_MatRotation.z )
|
||||
RotatePoint( &aVertices[ii].x, &aVertices[ii].y, m_MatRotation.z * 10 );
|
||||
{
|
||||
double a = aVertices[ii].x;
|
||||
double b = aVertices[ii].y;
|
||||
RotatePoint( &a, &b, m_MatRotation.x * 10 );
|
||||
aVertices[ii].x = (float)a;
|
||||
aVertices[ii].y = (float)b;
|
||||
}
|
||||
|
||||
/* adjust offset position (offset is given in UNIT 3D (0.1 inch) */
|
||||
#define SCALE_3D_CONV ((IU_PER_MILS * 1000) / UNITS3D_TO_UNITSPCB)
|
||||
|
@ -79,7 +92,7 @@ void S3D_MASTER::Set_Object_Coords( std::vector< S3D_VERTEX >& aVertices )
|
|||
}
|
||||
|
||||
|
||||
void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits )
|
||||
void TransfertToGLlist( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits )
|
||||
{
|
||||
unsigned ii;
|
||||
GLfloat ax, ay, az, bx, by, bz, nx, ny, nz, r;
|
||||
|
@ -138,52 +151,14 @@ void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits
|
|||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
GLuint EDA_3D_CANVAS::DisplayCubeforTest()
|
||||
{
|
||||
GLuint gllist = glGenLists( 1 );
|
||||
|
||||
glNewList( gllist, GL_COMPILE_AND_EXECUTE );
|
||||
/* draw six faces of a cube */
|
||||
glBegin( GL_QUADS );
|
||||
glNormal3f( 0.0F, 0.0F, 1.0F );
|
||||
glVertex3f( 0.5F, 0.5F, 0.5F ); glVertex3f( -0.5F, 0.5F, 0.5F );
|
||||
glVertex3f( -0.5F, -0.5F, 0.5F ); glVertex3f( 0.5F, -0.5F, 0.5F );
|
||||
|
||||
glNormal3f( 0.0F, 0.0F, -1.0F );
|
||||
glVertex3f( -0.5F, -0.5F, -0.5F ); glVertex3f( -0.5F, 0.5F, -0.5F );
|
||||
glVertex3f( 0.5F, 0.5F, -0.5F ); glVertex3f( 0.5F, -0.5F, -0.5F );
|
||||
|
||||
glNormal3f( 0.0F, 1.0F, 0.0F );
|
||||
glVertex3f( 0.5F, 0.5F, 0.5F ); glVertex3f( 0.5F, 0.5F, -0.5F );
|
||||
glVertex3f( -0.5F, 0.5F, -0.5F ); glVertex3f( -0.5F, 0.5F, 0.5F );
|
||||
|
||||
glNormal3f( 0.0F, -1.0F, 0.0F );
|
||||
glVertex3f( -0.5F, -0.5F, -0.5F ); glVertex3f( 0.5F, -0.5F, -0.5F );
|
||||
glVertex3f( 0.5F, -0.5F, 0.5F ); glVertex3f( -0.5F, -0.5F, 0.5F );
|
||||
|
||||
glNormal3f( 1.0F, 0.0F, 0.0F );
|
||||
glVertex3f( 0.5F, 0.5F, 0.5F ); glVertex3f( 0.5F, -0.5F, 0.5F );
|
||||
glVertex3f( 0.5F, -0.5F, -0.5F ); glVertex3f( 0.5F, 0.5F, -0.5F );
|
||||
|
||||
glNormal3f( -1.0F, 0.0F, 0.0F );
|
||||
glVertex3f( -0.5F, -0.5F, -0.5F ); glVertex3f( -0.5F, -0.5F, 0.5F );
|
||||
glVertex3f( -0.5F, 0.5F, 0.5F ); glVertex3f( -0.5F, 0.5F, -0.5F );
|
||||
glEnd();
|
||||
|
||||
glEndList();
|
||||
|
||||
return gllist;
|
||||
}
|
||||
|
||||
VERTEX_VALUE_CTRL::VERTEX_VALUE_CTRL( wxWindow* aParent, wxBoxSizer* aBoxSizer )
|
||||
{
|
||||
wxString text;
|
||||
|
||||
wxFlexGridSizer* gridSizer = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
gridSizer->AddGrowableCol( 1 );
|
||||
gridSizer->SetFlexibleDirection( wxHORIZONTAL );
|
||||
gridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
gridSizer->AddGrowableCol( 1 );
|
||||
gridSizer->SetFlexibleDirection( wxHORIZONTAL );
|
||||
gridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
aBoxSizer->Add( gridSizer, 0, wxEXPAND, 5 );
|
||||
|
||||
|
|
|
@ -16,17 +16,23 @@
|
|||
|
||||
#include <gestfich.h>
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
#include <GL/glew.h> // must be included before gl.h
|
||||
#endif
|
||||
|
||||
#include <3d_viewer.h>
|
||||
#include <3d_canvas.h>
|
||||
#include <info3d_visu.h>
|
||||
#include <trackball.h>
|
||||
#include <3d_viewer_id.h>
|
||||
|
||||
#include <textures/text_silk.c>
|
||||
#include <textures/text_pcb.c>
|
||||
|
||||
// -----------------
|
||||
// helper function (from wxWidgets, opengl/cube.cpp sample
|
||||
// -----------------
|
||||
void CheckGLError()
|
||||
void CheckGLError(const char *aFileName, int aLineNumber)
|
||||
{
|
||||
GLenum errLast = GL_NO_ERROR;
|
||||
|
||||
|
@ -46,8 +52,8 @@ void CheckGLError()
|
|||
}
|
||||
|
||||
errLast = err;
|
||||
|
||||
wxLogError(wxT("OpenGL error %d"), err);
|
||||
|
||||
wxLogError( wxT( "OpenGL error %d At: %s, line: %d" ), err, GetChars( FROM_UTF8( aFileName ) ), aLineNumber );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -78,7 +84,12 @@ EDA_3D_CANVAS::EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList ) :
|
|||
wxFULL_REPAINT_ON_RESIZE )
|
||||
{
|
||||
m_init = false;
|
||||
m_gllist = 0;
|
||||
m_shadow_init = false;
|
||||
|
||||
// Clear all gl list identifiers:
|
||||
for( int ii = GL_ID_BEGIN; ii < GL_ID_END; ii++ )
|
||||
m_glLists[ii] = 0;
|
||||
|
||||
// Explicitly create a new rendering context instance for this canvas.
|
||||
m_glRC = new wxGLContext( this );
|
||||
|
||||
|
@ -94,12 +105,25 @@ EDA_3D_CANVAS::~EDA_3D_CANVAS()
|
|||
}
|
||||
|
||||
|
||||
void EDA_3D_CANVAS::ClearLists()
|
||||
void EDA_3D_CANVAS::ClearLists( int aGlList )
|
||||
{
|
||||
if( m_gllist > 0 )
|
||||
glDeleteLists( m_gllist, 1 );
|
||||
if( aGlList )
|
||||
{
|
||||
if( m_glLists[aGlList] > 0 )
|
||||
glDeleteLists( m_glLists[aGlList], 1 );
|
||||
|
||||
m_gllist = 0;
|
||||
m_glLists[aGlList] = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for( int ii = GL_ID_BEGIN; ii < GL_ID_END; ii++ )
|
||||
{
|
||||
if( m_glLists[ii] > 0 )
|
||||
glDeleteLists( m_glLists[ii], 1 );
|
||||
|
||||
m_glLists[ii] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -473,15 +497,46 @@ void EDA_3D_CANVAS::OnEraseBackground( wxEraseEvent& event )
|
|||
// Do nothing, to avoid flashing.
|
||||
}
|
||||
|
||||
typedef struct s_sImage
|
||||
{
|
||||
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];
|
||||
}tsImage;
|
||||
|
||||
|
||||
GLuint load_and_generate_texture( tsImage *image )
|
||||
{
|
||||
|
||||
GLuint texture;
|
||||
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
|
||||
glPixelStorei (GL_PACK_ALIGNMENT, 1);
|
||||
|
||||
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 );
|
||||
|
||||
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);
|
||||
|
||||
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
|
||||
return texture;
|
||||
}
|
||||
|
||||
/* Initialize broad parameters for OpenGL */
|
||||
void EDA_3D_CANVAS::InitGL()
|
||||
{
|
||||
wxSize size = GetClientSize();
|
||||
|
||||
if( !m_init )
|
||||
{
|
||||
m_init = true;
|
||||
|
||||
|
||||
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;
|
||||
m_ZBottom = 1.0;
|
||||
m_ZTop = 10.0;
|
||||
|
@ -496,7 +551,7 @@ void EDA_3D_CANVAS::InitGL()
|
|||
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
|
||||
|
||||
// speedups
|
||||
glEnable( GL_DITHER );
|
||||
//glEnable( GL_DITHER );
|
||||
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_DONT_CARE );
|
||||
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
|
||||
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
|
||||
|
@ -504,52 +559,7 @@ void EDA_3D_CANVAS::InitGL()
|
|||
// Initialize alpha blending function.
|
||||
glEnable( GL_BLEND );
|
||||
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||
}
|
||||
|
||||
// set viewing projection
|
||||
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
|
||||
#define MAX_VIEW_ANGLE 160.0 / 45.0
|
||||
if( g_Parm_3D_Visu.m_Zoom > MAX_VIEW_ANGLE )
|
||||
g_Parm_3D_Visu.m_Zoom = MAX_VIEW_ANGLE;
|
||||
|
||||
if( Parent()->ModeIsOrtho() )
|
||||
{
|
||||
// OrthoReductionFactor is chosen so as to provide roughly the same size as
|
||||
// Perspective View
|
||||
const double orthoReductionFactor = 400 / g_Parm_3D_Visu.m_Zoom;
|
||||
|
||||
// Initialize Projection Matrix for Ortographic View
|
||||
glOrtho( -size.x / orthoReductionFactor, size.x / orthoReductionFactor,
|
||||
-size.y / orthoReductionFactor, size.y / orthoReductionFactor, 1, 10 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ratio width / height of the window display
|
||||
double ratio_HV = (double) size.x / size.y;
|
||||
|
||||
// Initialize Projection Matrix for Perspective View
|
||||
gluPerspective( 45.0 * g_Parm_3D_Visu.m_Zoom, ratio_HV, 1, 10 );
|
||||
}
|
||||
|
||||
|
||||
// position viewer
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0F, 0.0F, -( m_ZBottom + m_ZTop) / 2 );
|
||||
|
||||
// clear color and depth buffers
|
||||
glClearColor( g_Parm_3D_Visu.m_BgColor.m_Red,
|
||||
g_Parm_3D_Visu.m_BgColor.m_Green,
|
||||
g_Parm_3D_Visu.m_BgColor.m_Blue, 1 );
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
|
||||
// Setup light sources:
|
||||
SetLights();
|
||||
|
||||
CheckGLError();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -561,16 +571,19 @@ void EDA_3D_CANVAS::SetLights()
|
|||
|
||||
/* set viewing projection */
|
||||
light_color[3] = 1.0;
|
||||
GLfloat Z_axis_pos[4] = { 0.0, 0.0, 3.0, 0.0 };
|
||||
GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -3.0, 0.5 };
|
||||
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 );
|
||||
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_color );
|
||||
light = 0.3;
|
||||
light_color[0] = light_color[1] = light_color[2] = light;
|
||||
|
||||
light_color[0] = 0.3;
|
||||
light_color[1] = 0.3;
|
||||
light_color[2] = 0.4;
|
||||
|
||||
glLightfv( GL_LIGHT1, GL_POSITION, lowZ_axis_pos );
|
||||
glLightfv( GL_LIGHT1, GL_DIFFUSE, light_color );
|
||||
glEnable( GL_LIGHT0 ); // White spot on Z axis
|
||||
|
@ -637,7 +650,6 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
|
|||
viewport.x, viewport.y,
|
||||
GL_ALPHA, GL_UNSIGNED_BYTE, alphabuffer );
|
||||
|
||||
|
||||
image.SetData( pixelbuffer );
|
||||
image.SetAlpha( alphabuffer );
|
||||
image = image.Mirror( false );
|
||||
|
|
|
@ -46,28 +46,68 @@
|
|||
|
||||
class BOARD_DESIGN_SETTINGS;
|
||||
class EDA_3D_FRAME;
|
||||
class S3D_VERTEX;
|
||||
class SEGVIA;
|
||||
|
||||
class VIA;
|
||||
class D_PAD;
|
||||
|
||||
// We are using GL lists to store layers and other items
|
||||
// to draw or not
|
||||
// GL_LIST_ID are the GL lists indexes in m_glLists
|
||||
enum GL_LIST_ID
|
||||
{
|
||||
GL_ID_BEGIN = 0,
|
||||
GL_ID_AXIS = GL_ID_BEGIN, // list id for 3D axis
|
||||
GL_ID_GRID, // list id for 3D grid
|
||||
GL_ID_BOARD, // List id for copper layers
|
||||
GL_ID_TECH_LAYERS, // List id for non copper layers (masks...)
|
||||
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_SHADOW_FRONT,
|
||||
GL_ID_SHADOW_BACK,
|
||||
GL_ID_SHADOW_BOARD,
|
||||
GL_ID_BODY, // Body only list
|
||||
GL_ID_END
|
||||
};
|
||||
|
||||
class EDA_3D_CANVAS : public wxGLCanvas
|
||||
{
|
||||
private:
|
||||
bool m_init;
|
||||
GLuint m_gllist;
|
||||
GLuint m_glLists[GL_ID_END]; // GL lists
|
||||
wxGLContext* m_glRC;
|
||||
wxRealPoint m_draw3dOffset; // offset to draw the 3 mesh.
|
||||
wxRealPoint m_draw3dOffset; // offset to draw the 3D mesh.
|
||||
double m_ZBottom; // position of the back layer
|
||||
double m_ZTop; // position of the front layer
|
||||
|
||||
GLuint m_text_pcb;
|
||||
GLuint m_text_silk;
|
||||
|
||||
bool m_shadow_init;
|
||||
GLuint m_text_fake_shadow_front;
|
||||
GLuint m_text_fake_shadow_back;
|
||||
GLuint m_text_fake_shadow_board;
|
||||
|
||||
void Create_and_Render_Shadow_Buffer( GLuint *aDst_gl_texture,
|
||||
GLuint aTexture_size, bool aDraw_body, int aBlurPasses );
|
||||
|
||||
public:
|
||||
EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList = 0 );
|
||||
~EDA_3D_CANVAS();
|
||||
|
||||
EDA_3D_FRAME* Parent() { return (EDA_3D_FRAME*)GetParent(); }
|
||||
EDA_3D_FRAME* Parent() const { return static_cast<EDA_3D_FRAME*>( GetParent() ); }
|
||||
|
||||
void ClearLists();
|
||||
BOARD* GetBoard() { return Parent()->GetBoard(); }
|
||||
|
||||
/**
|
||||
* Function ClearLists
|
||||
* Clear the display list.
|
||||
* @param aGlList = the list to clear.
|
||||
* if 0 (default) all lists are cleared
|
||||
*/
|
||||
void ClearLists( int aGlList = 0 );
|
||||
|
||||
// Event functions:
|
||||
void OnPaint( wxPaintEvent& event );
|
||||
|
@ -81,7 +121,6 @@ public:
|
|||
void OnEnterWindow( wxMouseEvent& event );
|
||||
|
||||
// Display functions
|
||||
GLuint DisplayCubeforTest(); // Just a test function
|
||||
void SetView3D( int keycode );
|
||||
void DisplayStatus();
|
||||
void Redraw();
|
||||
|
@ -92,7 +131,7 @@ public:
|
|||
* Prepares the parameters of the OpenGL draw list
|
||||
* creates the OpenGL draw list items (board, grid ...
|
||||
*/
|
||||
GLuint CreateDrawGL_List();
|
||||
void CreateDrawGL_List();
|
||||
void InitGL();
|
||||
void SetLights();
|
||||
void SetOffset(double aPosX, double aPosY)
|
||||
|
@ -100,19 +139,62 @@ public:
|
|||
m_draw3dOffset.x = aPosX;
|
||||
m_draw3dOffset.y = aPosY;
|
||||
}
|
||||
void SetGLTechLayersColor( LAYER_NUM aLayer );
|
||||
void SetGLCopperColor();
|
||||
void SetGLEpoxyColor( double aTransparency = 1.0 );
|
||||
|
||||
/**
|
||||
* Function BuildBoard3DView
|
||||
* Called by CreateDrawGL_List()
|
||||
* Fills the OpenGL draw list with board items draw list.
|
||||
* Populates the OpenGL GL_ID_BOARD draw list with board items only on copper layers.
|
||||
* 3D footprint shapes, tech layers and aux layers are not on this list
|
||||
*/
|
||||
void BuildBoard3DView();
|
||||
void BuildBoard3DView(GLuint aBoardList, GLuint aBodyOnlyList);
|
||||
|
||||
void DrawGrid( double aGriSizeMM );
|
||||
void Draw3DViaHole( SEGVIA * aVia );
|
||||
void Draw3DPadHole( D_PAD * aPad );
|
||||
/**
|
||||
* Function BuildTechLayers3DView
|
||||
* Called by CreateDrawGL_List()
|
||||
* Populates the OpenGL GL_ID_TECH_LAYERS draw list with items on tech layers
|
||||
*/
|
||||
void BuildTechLayers3DView();
|
||||
|
||||
/**
|
||||
* Function BuildShadowList
|
||||
* Called by CreateDrawGL_List()
|
||||
*/
|
||||
void BuildShadowList( GLuint aFrontList, GLuint aBacklist, GLuint aBoardList );
|
||||
|
||||
/**
|
||||
* Function BuildFootprintShape3DList
|
||||
* Called by CreateDrawGL_List()
|
||||
* Fills the OpenGL GL_ID_3DSHAPES_SOLID and GL_ID_3DSHAPES_TRANSP
|
||||
* draw lists with 3D footprint shapes
|
||||
* @param aOpaqueList is the gl list for non transparent items
|
||||
* @param aTransparentList is the gl list for non transparent items,
|
||||
* which need to be drawn after all other items
|
||||
*/
|
||||
void BuildFootprintShape3DList( GLuint aOpaqueList,
|
||||
GLuint aTransparentList,
|
||||
bool aSideToLoad );
|
||||
/**
|
||||
* Function BuildBoard3DAuxLayers
|
||||
* Called by CreateDrawGL_List()
|
||||
* Fills the OpenGL GL_ID_AUX_LAYERS draw list
|
||||
* with items on aux layers only
|
||||
*/
|
||||
void BuildBoard3DAuxLayers();
|
||||
|
||||
void Draw3DGrid( double aGriSizeMM );
|
||||
void Draw3DAxis();
|
||||
|
||||
void Draw3DViaHole( const VIA * aVia );
|
||||
void Draw3DPadHole( const D_PAD * aPad );
|
||||
|
||||
void GenerateFakeShadowsTextures();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
void CheckGLError(const char *aFileName, int aLineNumber);
|
||||
|
||||
#endif /* _3D_CANVAS_H_ */
|
||||
|
|
|
@ -29,31 +29,24 @@
|
|||
#include <fctsys.h>
|
||||
|
||||
#include <3d_viewer.h>
|
||||
#include <3d_struct.h>
|
||||
|
||||
S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
|
||||
EDA_ITEM( father, NOT_USED )
|
||||
|
||||
bool S3D_MASTER::IsOpenGlAllowed()
|
||||
{
|
||||
m_DiffuseColor.x = m_DiffuseColor.y = m_DiffuseColor.z = 1.0;
|
||||
m_SpecularColor.x = m_SpecularColor.y = m_SpecularColor.z = 1.0;
|
||||
m_AmbientIntensity = 1.0;
|
||||
m_Transparency = 0.0;
|
||||
m_Shininess = 1.0;
|
||||
m_Name = name;
|
||||
}
|
||||
if( m_loadNonTransparentObjects ) // return true for non transparent objects only
|
||||
{
|
||||
if( m_lastTransparency == 0.0 )
|
||||
return true;
|
||||
}
|
||||
|
||||
if( m_loadTransparentObjects ) // return true for transparent objects only
|
||||
{
|
||||
if( m_lastTransparency != 0.0 )
|
||||
return true;
|
||||
}
|
||||
|
||||
void S3D_MATERIAL::SetMaterial()
|
||||
{
|
||||
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
|
||||
glColor4f( m_DiffuseColor.x * m_AmbientIntensity,
|
||||
m_DiffuseColor.y * m_AmbientIntensity,
|
||||
m_DiffuseColor.z * m_AmbientIntensity,
|
||||
1.0 - m_Transparency );
|
||||
#if 0
|
||||
glColorMaterial( GL_FRONT_AND_BACK, GL_SPECULAR );
|
||||
glColor3f( m_SpecularColor.x, m_SpecularColor.y, m_SpecularColor.z );
|
||||
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -79,9 +72,17 @@ S3D_MASTER::S3D_MASTER( EDA_ITEM* aParent ) :
|
|||
EDA_ITEM( aParent, NOT_USED )
|
||||
{
|
||||
m_MatScale.x = m_MatScale.y = m_MatScale.z = 1.0;
|
||||
m_lastTransparency = 0.0;
|
||||
m_3D_Drawings = NULL;
|
||||
m_Materials = NULL;
|
||||
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_transparency = true;
|
||||
m_use_modelfile_shininess = false;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -33,10 +33,7 @@
|
|||
#include <3d_viewer.h>
|
||||
#include <info3d_visu.h>
|
||||
#include <3d_draw_basic_functions.h>
|
||||
|
||||
// Imported function:
|
||||
extern void Set_Object_Data( std::vector<S3D_VERTEX>& aVertices, double aBiuTo3DUnits );
|
||||
extern void CheckGLError();
|
||||
#include <modelparsers.h>
|
||||
|
||||
// Number of segments to approximate a circle by segments
|
||||
#define SEGM_PER_CIRCLE 16
|
||||
|
@ -54,14 +51,15 @@ static void CALLBACK tessCPolyPt2Vertex( const GLvoid* data );
|
|||
// 2 helper functions to set the current normal vector for gle items
|
||||
static inline void SetNormalZpos()
|
||||
{
|
||||
glNormal3f( 0.0, 0.0, 1.0 );
|
||||
//glNormal3f( 0.0, 0.0, 1.0 );
|
||||
}
|
||||
|
||||
static inline void SetNormalZneg()
|
||||
{
|
||||
glNormal3f( 0.0, 0.0, -1.0 );
|
||||
//glNormal3f( 0.0, 0.0, -1.0 );
|
||||
}
|
||||
|
||||
void TransfertToGLlist( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
|
||||
|
||||
/* Draw3D_VerticalPolygonalCylinder is a helper function.
|
||||
*
|
||||
|
@ -116,7 +114,7 @@ static void Draw3D_VerticalPolygonalCylinder( const CPOLYGONS_LIST& aPolysList,
|
|||
coords[3].y = coords[2].y; // only z change
|
||||
|
||||
// Creates the GL_QUAD
|
||||
Set_Object_Data( coords, aBiuTo3DUnits );
|
||||
TransfertToGLlist( coords, aBiuTo3DUnits );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,6 +130,15 @@ void SetGLColor( EDA_COLOR_T color, double alpha )
|
|||
glColor4f( red, green, blue, alpha );
|
||||
}
|
||||
|
||||
static float m_texture_scale;
|
||||
|
||||
void SetGLTexture( GLuint text_id, float scale )
|
||||
{
|
||||
glEnable( GL_TEXTURE_2D );
|
||||
glBindTexture( GL_TEXTURE_2D, text_id );
|
||||
m_texture_scale = scale;
|
||||
}
|
||||
|
||||
|
||||
/* draw all solid polygons found in aPolysList
|
||||
* aZpos = z position in board internal units
|
||||
|
@ -152,9 +159,9 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
|
|||
gluTessCallback( tess, GLU_TESS_VERTEX, ( void (CALLBACK*) () )tessCPolyPt2Vertex );
|
||||
|
||||
GLdouble v_data[3];
|
||||
double zpos = ( aZpos + (aThickness / 2) ) * aBiuTo3DUnits;
|
||||
double zpos = ( aZpos + (aThickness / 2.0) ) * aBiuTo3DUnits;
|
||||
g_Parm_3D_Visu.m_CurrentZpos = zpos;
|
||||
v_data[2] = aZpos + (aThickness / 2);
|
||||
v_data[2] = aZpos + (aThickness / 2.0);
|
||||
|
||||
// Set normal to toward positive Z axis, for a solid object only (to draw the top side)
|
||||
if( aThickness )
|
||||
|
@ -165,9 +172,11 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
|
|||
// Draw solid areas contained in this list
|
||||
CPOLYGONS_LIST polylist = aPolysList; // temporary copy for gluTessVertex
|
||||
|
||||
int startContour;
|
||||
|
||||
for( int side = 0; side < 2; side++ )
|
||||
{
|
||||
int startContour = 1;
|
||||
startContour = 1;
|
||||
|
||||
for( unsigned ii = 0; ii < polylist.GetCornersCount(); ii++ )
|
||||
{
|
||||
|
@ -178,6 +187,10 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
|
|||
startContour = 0;
|
||||
}
|
||||
|
||||
// https://www.opengl.org/sdk/docs/man2/xhtml/gluTessNormal.xml
|
||||
gluTessNormal( tess, 0.0, 0.0, 0.0 );
|
||||
|
||||
|
||||
v_data[0] = polylist.GetX( ii ) * aBiuTo3DUnits;
|
||||
v_data[1] = -polylist.GetY( ii ) * aBiuTo3DUnits;
|
||||
// gluTessVertex store pointers on data, not data, so do not store
|
||||
|
@ -186,6 +199,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
|
|||
// before calling gluDeleteTess
|
||||
gluTessVertex( tess, v_data, &polylist[ii] );
|
||||
|
||||
|
||||
if( polylist.IsEndContour( ii ) )
|
||||
{
|
||||
gluTessEndContour( tess );
|
||||
|
@ -198,20 +212,28 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
|
|||
break;
|
||||
|
||||
// Prepare the bottom side of solid areas
|
||||
zpos = ( aZpos - (aThickness / 2) ) * aBiuTo3DUnits;
|
||||
zpos = ( aZpos - (aThickness / 2.0) ) * aBiuTo3DUnits;
|
||||
g_Parm_3D_Visu.m_CurrentZpos = zpos;
|
||||
v_data[2] = zpos;
|
||||
// Now;, set normal to toward negative Z axis, for the solid object bottom side
|
||||
SetNormalZneg();
|
||||
}
|
||||
|
||||
if( startContour == 0 )
|
||||
{
|
||||
gluTessEndContour( tess );
|
||||
gluTessEndPolygon( tess );
|
||||
}
|
||||
|
||||
gluDeleteTess( tess );
|
||||
|
||||
if( aThickness == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Build the 3D data : vertical side
|
||||
Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos - (aThickness / 2), false, aBiuTo3DUnits );
|
||||
Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos - (aThickness / 2.0), false, aBiuTo3DUnits );
|
||||
}
|
||||
|
||||
|
||||
|
@ -400,6 +422,12 @@ 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() )
|
||||
{
|
||||
glTexCoord2f( ptr->x* g_Parm_3D_Visu.m_BiuTo3Dunits * m_texture_scale,
|
||||
-ptr->y * g_Parm_3D_Visu.m_BiuTo3Dunits * m_texture_scale);
|
||||
}
|
||||
|
||||
glVertex3d( ptr->x * g_Parm_3D_Visu.m_BiuTo3Dunits,
|
||||
-ptr->y * g_Parm_3D_Visu.m_BiuTo3Dunits,
|
||||
g_Parm_3D_Visu.m_CurrentZpos );
|
||||
|
|
|
@ -126,4 +126,12 @@ void Draw3D_ZaxisOblongCylinder( wxPoint aAxis1Pos, wxPoint aAxis2Pos,
|
|||
void SetGLColor( EDA_COLOR_T aColor, double aTransparency = 1.0 );
|
||||
|
||||
|
||||
/**
|
||||
* Set a texture id and a scale to apply when rendering the polygons
|
||||
* @param text_id = texture ID created by glGenTextures
|
||||
* @param scale = scale to apply to texture coords
|
||||
*/
|
||||
void SetGLTexture( GLuint text_id, float scale );
|
||||
|
||||
|
||||
#endif // _3D_DRAW_BASIC_FUNCTIONS_H_
|
||||
|
|
|
@ -26,7 +26,8 @@
|
|||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <kiface_i.h>
|
||||
#include <pgm_base.h>
|
||||
|
||||
#include <3d_viewer.h>
|
||||
#include <3d_canvas.h>
|
||||
|
@ -40,21 +41,25 @@
|
|||
INFO3D_VISU g_Parm_3D_Visu;
|
||||
|
||||
// Key to store 3D Viewer config:
|
||||
static const wxString keyBgColor_Red( wxT( "BgColor_Red" ) );
|
||||
static const wxString keyBgColor_Green( wxT( "BgColor_Green" ) );
|
||||
static const wxString keyBgColor_Blue( wxT( "BgColor_Blue" ) );
|
||||
static const wxString keyShowRealisticMode( wxT( "ShowRealisticMode" ) );
|
||||
static const wxString keyShowAxis( wxT( "ShowAxis" ) );
|
||||
static const wxString keyShowZones( wxT( "ShowZones" ) );
|
||||
static const wxString keyShowFootprints( wxT( "ShowFootprints" ) );
|
||||
static const wxString keyShowCopperThickness( wxT( "ShowCopperThickness" ) );
|
||||
static const wxString keyShowAdhesiveLayers( wxT( "ShowAdhesiveLayers" ) );
|
||||
static const wxString keyShowSilkScreenLayers( wxT( "ShowSilkScreenLayers" ) );
|
||||
static const wxString keyShowSolderMaskLayers( wxT( "ShowSolderMasLayers" ) );
|
||||
static const wxString keyShowSolderPasteLayers( wxT( "ShowSolderPasteLayers" ) );
|
||||
static const wxString keyShowCommentsLayer( wxT( "ShowCommentsLayers" ) );
|
||||
static const wxString keyShowBoardBody( wxT( "ShowBoardBody" ) );
|
||||
static const wxString keyShowEcoLayers( wxT( "ShowEcoLayers" ) );
|
||||
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 keyShowRealisticMode[] = wxT( "ShowRealisticMode" );
|
||||
static const wxChar keyUseHQinRealisticMode[] = wxT( "UseHQinRealisticMode" );
|
||||
static const wxChar keyShowAxis[] = wxT( "ShowAxis" );
|
||||
static const wxChar keyShowGrid[] = wxT( "ShowGrid3D" );
|
||||
static const wxChar keyShowGridSize[] = wxT( "Grid3DSize" );
|
||||
static const wxChar keyShowZones[] = wxT( "ShowZones" );
|
||||
static const wxChar keyShowFootprints[] = wxT( "ShowFootprints" );
|
||||
static const wxChar keyShowCopperThickness[] = wxT( "ShowCopperThickness" );
|
||||
static const wxChar keyShowAdhesiveLayers[] = wxT( "ShowAdhesiveLayers" );
|
||||
static const wxChar keyShowSilkScreenLayers[] = wxT( "ShowSilkScreenLayers" );
|
||||
static const wxChar keyShowSolderMaskLayers[] = wxT( "ShowSolderMasLayers" );
|
||||
static const wxChar keyShowSolderPasteLayers[] =wxT( "ShowSolderPasteLayers" );
|
||||
static const wxChar keyShowCommentsLayer[] = wxT( "ShowCommentsLayers" );
|
||||
static const wxChar keyShowBoardBody[] = wxT( "ShowBoardBody" );
|
||||
static const wxChar keyShowEcoLayers[] = wxT( "ShowEcoLayers" );
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE( EDA_3D_FRAME, EDA_BASE_FRAME )
|
||||
EVT_ACTIVATE( EDA_3D_FRAME::OnActivate )
|
||||
|
@ -72,11 +77,13 @@ EVT_MENU_RANGE( ID_MENU3D_GRID, ID_MENU3D_GRID_END,
|
|||
|
||||
EVT_CLOSE( EDA_3D_FRAME::OnCloseWindow )
|
||||
|
||||
END_EVENT_TABLE() EDA_3D_FRAME::EDA_3D_FRAME( PCB_BASE_FRAME* parent,
|
||||
const wxString& title,
|
||||
long style ) :
|
||||
EDA_BASE_FRAME( parent, DISPLAY3D_FRAME_TYPE, title,
|
||||
wxDefaultPosition, wxDefaultSize, style, wxT( "Frame3D" ) )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
EDA_3D_FRAME::EDA_3D_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent,
|
||||
const wxString& aTitle, long style ) :
|
||||
KIWAY_PLAYER( aKiway, aParent, FRAME_PCB_DISPLAY3D, aTitle,
|
||||
wxDefaultPosition, wxDefaultSize, style, wxT( "Frame3D" ) )
|
||||
{
|
||||
m_canvas = NULL;
|
||||
m_reloadRequest = false;
|
||||
|
@ -87,7 +94,7 @@ END_EVENT_TABLE() EDA_3D_FRAME::EDA_3D_FRAME( PCB_BASE_FRAME* parent,
|
|||
icon.CopyFromBitmap( KiBitmap( icon_3d_xpm ) );
|
||||
SetIcon( icon );
|
||||
|
||||
GetSettings();
|
||||
LoadSettings( config() );
|
||||
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
|
||||
|
||||
// Create the status line
|
||||
|
@ -100,7 +107,8 @@ END_EVENT_TABLE() EDA_3D_FRAME::EDA_3D_FRAME( PCB_BASE_FRAME* parent,
|
|||
ReCreateMainToolbar();
|
||||
|
||||
// Make a EDA_3D_CANVAS
|
||||
int attrs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0 };
|
||||
int attrs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16,
|
||||
WX_GL_STENCIL_SIZE, 1, 0 };
|
||||
m_canvas = new EDA_3D_CANVAS( this, attrs );
|
||||
|
||||
m_auimgr.SetManagedWindow( this );
|
||||
|
@ -139,84 +147,88 @@ void EDA_3D_FRAME::OnCloseWindow( wxCloseEvent& Event )
|
|||
}
|
||||
|
||||
|
||||
void EDA_3D_FRAME::GetSettings()
|
||||
void EDA_3D_FRAME::LoadSettings( wxConfigBase* aCfg )
|
||||
{
|
||||
wxConfig* config = wxGetApp().GetSettings(); // Current config used by application
|
||||
class INFO3D_VISU& prms = g_Parm_3D_Visu;
|
||||
EDA_BASE_FRAME::LoadSettings( aCfg );
|
||||
|
||||
if( config )
|
||||
{
|
||||
EDA_BASE_FRAME::LoadSettings();
|
||||
INFO3D_VISU& prms = g_Parm_3D_Visu;
|
||||
|
||||
config->Read( keyBgColor_Red, &g_Parm_3D_Visu.m_BgColor.m_Red, 0.0 );
|
||||
config->Read( keyBgColor_Green, &g_Parm_3D_Visu.m_BgColor.m_Green, 0.0 );
|
||||
config->Read( keyBgColor_Blue, &g_Parm_3D_Visu.m_BgColor.m_Blue, 0.0 );
|
||||
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 );
|
||||
|
||||
bool tmp;
|
||||
config->Read( keyShowRealisticMode, &tmp, false );
|
||||
prms.SetFlag( FL_USE_REALISTIC_MODE, tmp );
|
||||
bool tmp;
|
||||
aCfg->Read( keyShowRealisticMode, &tmp, false );
|
||||
prms.SetFlag( FL_USE_REALISTIC_MODE, tmp );
|
||||
|
||||
config->Read( keyShowAxis, &tmp, true );
|
||||
prms.SetFlag( FL_AXIS, tmp );
|
||||
aCfg->Read( keyUseHQinRealisticMode, &tmp, false );
|
||||
prms.SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, tmp );
|
||||
|
||||
config->Read( keyShowFootprints, &tmp, true );
|
||||
prms.SetFlag( FL_MODULE, tmp );
|
||||
aCfg->Read( keyShowAxis, &tmp, true );
|
||||
prms.SetFlag( FL_AXIS, tmp );
|
||||
|
||||
config->Read( keyShowCopperThickness, &tmp, false );
|
||||
prms.SetFlag( FL_USE_COPPER_THICKNESS, tmp );
|
||||
aCfg->Read( keyShowGrid, &tmp, true );
|
||||
prms.SetFlag( FL_GRID, tmp );
|
||||
|
||||
config->Read( keyShowZones, &tmp, true );
|
||||
prms.SetFlag( FL_ZONE, tmp );
|
||||
aCfg->Read( keyShowGridSize, &prms.m_3D_Grid, 10.0 );
|
||||
prms.SetFlag( FL_MODULE, tmp );
|
||||
|
||||
config->Read( keyShowAdhesiveLayers, &tmp, true );
|
||||
prms.SetFlag( FL_ADHESIVE, tmp );
|
||||
aCfg->Read( keyShowFootprints, &tmp, true );
|
||||
prms.SetFlag( FL_MODULE, tmp );
|
||||
|
||||
config->Read( keyShowSilkScreenLayers, &tmp, true );
|
||||
prms.SetFlag( FL_SILKSCREEN, tmp );
|
||||
aCfg->Read( keyShowCopperThickness, &tmp, false );
|
||||
prms.SetFlag( FL_USE_COPPER_THICKNESS, tmp );
|
||||
|
||||
config->Read( keyShowSolderMaskLayers, &tmp, true );
|
||||
prms.SetFlag( FL_SOLDERMASK, tmp );
|
||||
aCfg->Read( keyShowZones, &tmp, true );
|
||||
prms.SetFlag( FL_ZONE, tmp );
|
||||
|
||||
config->Read( keyShowSolderPasteLayers, &tmp, true );
|
||||
prms.SetFlag( FL_SOLDERPASTE, tmp );
|
||||
aCfg->Read( keyShowAdhesiveLayers, &tmp, true );
|
||||
prms.SetFlag( FL_ADHESIVE, tmp );
|
||||
|
||||
config->Read( keyShowCommentsLayer, &tmp, true );
|
||||
prms.SetFlag( FL_COMMENTS, tmp );
|
||||
aCfg->Read( keyShowSilkScreenLayers, &tmp, true );
|
||||
prms.SetFlag( FL_SILKSCREEN, tmp );
|
||||
|
||||
config->Read( keyShowEcoLayers, &tmp, true );
|
||||
prms.SetFlag( FL_ECO, tmp );
|
||||
aCfg->Read( keyShowSolderMaskLayers, &tmp, true );
|
||||
prms.SetFlag( FL_SOLDERMASK, tmp );
|
||||
|
||||
config->Read( keyShowBoardBody, &tmp, true );
|
||||
prms.SetFlag( FL_SHOW_BOARD_BODY, tmp );
|
||||
}
|
||||
aCfg->Read( keyShowSolderPasteLayers, &tmp, true );
|
||||
prms.SetFlag( FL_SOLDERPASTE, tmp );
|
||||
|
||||
aCfg->Read( keyShowCommentsLayer, &tmp, true );
|
||||
prms.SetFlag( FL_COMMENTS, tmp );
|
||||
|
||||
aCfg->Read( keyShowEcoLayers, &tmp, true );
|
||||
prms.SetFlag( FL_ECO, tmp );
|
||||
|
||||
aCfg->Read( keyShowBoardBody, &tmp, true );
|
||||
prms.SetFlag( FL_SHOW_BOARD_BODY, tmp );
|
||||
}
|
||||
|
||||
|
||||
void EDA_3D_FRAME::SaveSettings()
|
||||
void EDA_3D_FRAME::SaveSettings( wxConfigBase* aCfg )
|
||||
{
|
||||
wxConfig* config = wxGetApp().GetSettings(); // Current config used by application
|
||||
EDA_BASE_FRAME::SaveSettings( aCfg );
|
||||
|
||||
if( !config )
|
||||
return;
|
||||
INFO3D_VISU& prms = g_Parm_3D_Visu;
|
||||
|
||||
EDA_BASE_FRAME::SaveSettings();
|
||||
|
||||
config->Write( keyBgColor_Red, g_Parm_3D_Visu.m_BgColor.m_Red );
|
||||
config->Write( keyBgColor_Green, g_Parm_3D_Visu.m_BgColor.m_Green );
|
||||
config->Write( keyBgColor_Blue, g_Parm_3D_Visu.m_BgColor.m_Blue );
|
||||
class INFO3D_VISU& prms = g_Parm_3D_Visu;
|
||||
config->Write( keyShowRealisticMode, prms.GetFlag( FL_USE_REALISTIC_MODE ) );
|
||||
config->Write( keyShowAxis, prms.GetFlag( FL_AXIS ) );
|
||||
config->Write( keyShowFootprints, prms.GetFlag( FL_MODULE ) );
|
||||
config->Write( keyShowCopperThickness, prms.GetFlag( FL_USE_COPPER_THICKNESS ) );
|
||||
config->Write( keyShowZones, prms.GetFlag( FL_ZONE ) );
|
||||
config->Write( keyShowAdhesiveLayers, prms.GetFlag( FL_ADHESIVE ) );
|
||||
config->Write( keyShowSilkScreenLayers, prms.GetFlag( FL_SILKSCREEN ) );
|
||||
config->Write( keyShowSolderMaskLayers, prms.GetFlag( FL_SOLDERMASK ) );
|
||||
config->Write( keyShowSolderPasteLayers, prms.GetFlag( FL_SOLDERPASTE ) );
|
||||
config->Write( keyShowCommentsLayer, prms.GetFlag( FL_COMMENTS ) );
|
||||
config->Write( keyShowEcoLayers, prms.GetFlag( FL_ECO ) );
|
||||
config->Write( keyShowBoardBody, prms.GetFlag( FL_SHOW_BOARD_BODY ) );
|
||||
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 ) );
|
||||
}
|
||||
|
||||
|
||||
|
@ -357,6 +369,11 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
NewDisplay();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE:
|
||||
g_Parm_3D_Visu.SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, isChecked );
|
||||
NewDisplay();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_SHOW_BOARD_BODY:
|
||||
g_Parm_3D_Visu.SetFlag( FL_SHOW_BOARD_BODY, isChecked );
|
||||
NewDisplay();
|
||||
|
@ -364,52 +381,52 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
|
||||
case ID_MENU3D_AXIS_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_AXIS, isChecked );
|
||||
NewDisplay();
|
||||
m_canvas->Refresh();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_MODULE_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_MODULE, isChecked );
|
||||
NewDisplay();
|
||||
m_canvas->Refresh();
|
||||
return;
|
||||
|
||||
case ID_MENU3D_USE_COPPER_THICKNESS:
|
||||
g_Parm_3D_Visu.SetFlag( FL_USE_COPPER_THICKNESS, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_BOARD);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_ZONE_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_ZONE, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_BOARD);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_ADHESIVE_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_ADHESIVE, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_TECH_LAYERS);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_SILKSCREEN_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_SILKSCREEN, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_TECH_LAYERS);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_SOLDER_MASK_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_SOLDERMASK, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_TECH_LAYERS);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_SOLDER_PASTE_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_SOLDERPASTE, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_TECH_LAYERS);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_COMMENTS_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_COMMENTS, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_AUX_LAYERS);
|
||||
return;
|
||||
|
||||
case ID_MENU3D_ECO_ONOFF:
|
||||
g_Parm_3D_Visu.SetFlag( FL_ECO, isChecked );
|
||||
NewDisplay();
|
||||
NewDisplay(GL_ID_AUX_LAYERS);
|
||||
return;
|
||||
|
||||
default:
|
||||
|
@ -434,7 +451,6 @@ void EDA_3D_FRAME::On3DGridSelection( wxCommandEvent& event )
|
|||
GetMenuBar()->Check( ii, false );
|
||||
}
|
||||
|
||||
|
||||
switch( id )
|
||||
{
|
||||
case ID_MENU3D_GRID_NOGRID:
|
||||
|
@ -466,18 +482,17 @@ void EDA_3D_FRAME::On3DGridSelection( wxCommandEvent& event )
|
|||
return;
|
||||
}
|
||||
|
||||
NewDisplay();
|
||||
NewDisplay( GL_ID_GRID );
|
||||
}
|
||||
|
||||
|
||||
void EDA_3D_FRAME::NewDisplay()
|
||||
void EDA_3D_FRAME::NewDisplay( int aGlList )
|
||||
{
|
||||
m_reloadRequest = false;
|
||||
|
||||
m_canvas->ClearLists();
|
||||
m_canvas->ClearLists( aGlList );
|
||||
m_canvas->CreateDrawGL_List();
|
||||
|
||||
// m_canvas->InitGL();
|
||||
m_canvas->Refresh( true );
|
||||
m_canvas->DisplayStatus();
|
||||
}
|
||||
|
@ -507,6 +522,9 @@ void EDA_3D_FRAME::Set3DBgColor()
|
|||
|
||||
newcolor = wxGetColourFromUser( this, oldcolor );
|
||||
|
||||
if( !newcolor.IsOk() ) // Happens on cancel dialog
|
||||
return;
|
||||
|
||||
if( newcolor != oldcolor )
|
||||
{
|
||||
g_Parm_3D_Visu.m_BgColor.m_Red = (double) newcolor.Red() / 255.0;
|
||||
|
@ -515,3 +533,8 @@ void EDA_3D_FRAME::Set3DBgColor()
|
|||
NewDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
BOARD* EDA_3D_FRAME::GetBoard()
|
||||
{
|
||||
return Parent()->GetBoard();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
|
||||
* Copyright (C) 1992-2012 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_class.cpp
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <3d_struct.h>
|
||||
#include <3d_material.h>
|
||||
|
||||
#ifdef __WXMAC__
|
||||
# ifdef __DARWIN__
|
||||
# include <OpenGL/glu.h>
|
||||
# else
|
||||
# include <glu.h>
|
||||
# endif
|
||||
#else
|
||||
# include <GL/glu.h>
|
||||
#endif
|
||||
|
||||
S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
|
||||
EDA_ITEM( father, NOT_USED )
|
||||
{
|
||||
m_Name = name;
|
||||
m_AmbientColor.clear();
|
||||
m_DiffuseColor.clear();
|
||||
m_EmissiveColor.clear();
|
||||
m_SpecularColor.clear();
|
||||
m_Shininess.clear();
|
||||
m_Transparency.clear();
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
|
||||
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 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
void S3D_MATERIAL::SetOpenGLMaterial( unsigned int materialIndex )
|
||||
{
|
||||
S3D_MASTER * s3dParent = (S3D_MASTER *) GetParent();
|
||||
|
||||
if( ! s3dParent->IsOpenGlAllowed() )
|
||||
return;
|
||||
|
||||
float transparency_value = 0.0f;
|
||||
if( m_Transparency.size() > materialIndex )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
|
||||
}
|
||||
|
||||
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] );
|
||||
}
|
||||
|
||||
// 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 );
|
||||
}
|
||||
|
||||
// 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 );
|
||||
}
|
||||
|
||||
// ambient
|
||||
if( m_AmbientColor.size() > materialIndex )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.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
|
||||
* 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_material.h
|
||||
*/
|
||||
|
||||
#ifndef STRUCT_3D_MATERIAL_H
|
||||
#define STRUCT_3D_MATERIAL_H
|
||||
|
||||
#include <common.h>
|
||||
#include <base_struct.h>
|
||||
#include <gal/opengl/glm/glm.hpp>
|
||||
|
||||
class S3D_MASTER;
|
||||
|
||||
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;
|
||||
std::vector< glm::vec3 > m_EmissiveColor;
|
||||
std::vector< glm::vec3 > m_SpecularColor;
|
||||
std::vector< float > m_Shininess;
|
||||
std::vector< float > m_Transparency;
|
||||
|
||||
public:
|
||||
S3D_MATERIAL( S3D_MASTER* father, const wxString& name );
|
||||
|
||||
S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
|
||||
S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
|
||||
|
||||
void SetOpenGLMaterial(unsigned int materialIndex);
|
||||
|
||||
#if defined(DEBUG)
|
||||
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
|
||||
#endif
|
||||
};
|
||||
|
||||
void SetOpenGlDefaultMaterial();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,408 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.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
|
||||
* 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_mesh_model.cpp
|
||||
* @brief
|
||||
*/
|
||||
|
||||
|
||||
#include <3d_mesh_model.h>
|
||||
#include <boost/geometry/algorithms/area.hpp>
|
||||
|
||||
S3D_MESH::S3D_MESH()
|
||||
{
|
||||
isPerFaceNormalsComputed = false;
|
||||
isPointNormalizedComputed = false;
|
||||
isPerPointNormalsComputed = false;
|
||||
m_Materials = NULL;
|
||||
childs.clear();
|
||||
|
||||
m_translation = glm::vec3( 0.0f, 0.0f, 0.0f );
|
||||
m_rotation = glm::vec4( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||
m_scale = glm::vec3( 1.0f, 1.0f, 1.0f );
|
||||
m_scaleOrientation = glm::vec4( 0.0f, 0.0f, 1.0f, 0.0f ); // not used
|
||||
m_center = glm::vec3( 0.0f, 0.0f, 0.0f ); // not used
|
||||
}
|
||||
|
||||
|
||||
S3D_MESH::~S3D_MESH()
|
||||
{
|
||||
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
||||
{
|
||||
delete childs[idx];
|
||||
}
|
||||
}
|
||||
|
||||
void S3D_MESH::openGL_RenderAllChilds()
|
||||
{
|
||||
//DBG( printf( "openGL_RenderAllChilds") );
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( m_translation.x, m_translation.y, m_translation.z );
|
||||
glRotatef( m_rotation[3], m_rotation[0], m_rotation[1], m_rotation[2] );
|
||||
glScalef( m_scale.x, m_scale.y, m_scale.z );
|
||||
|
||||
SetOpenGlDefaultMaterial();
|
||||
|
||||
// Render your self
|
||||
openGL_Render();
|
||||
|
||||
// Render childs
|
||||
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
||||
{
|
||||
childs[idx]->openGL_Render();
|
||||
}
|
||||
|
||||
SetOpenGlDefaultMaterial();
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void S3D_MESH::openGL_Render()
|
||||
{
|
||||
//DBG( printf( "openGL_Render" ) );
|
||||
|
||||
if( m_Materials )
|
||||
{
|
||||
m_Materials->SetOpenGLMaterial( 0 );
|
||||
}
|
||||
|
||||
if( m_CoordIndex.size() == 0)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( m_translation.x, m_translation.y, m_translation.z );
|
||||
glRotatef( m_rotation[3], m_rotation[0], m_rotation[1], m_rotation[2] );
|
||||
glScalef( m_scale.x, m_scale.y, m_scale.z );
|
||||
|
||||
std::vector< glm::vec3 > normals;
|
||||
|
||||
calcPointNormalized();
|
||||
calcPerFaceNormals();
|
||||
|
||||
if( m_PerVertexNormalsNormalized.size() == 0 )
|
||||
{
|
||||
if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
|
||||
{
|
||||
calcPerPointNormals();
|
||||
}
|
||||
}
|
||||
|
||||
for( unsigned int idx = 0; idx < m_CoordIndex.size(); idx++ )
|
||||
{
|
||||
if( m_MaterialIndex.size() > 1 )
|
||||
{
|
||||
if( m_Materials )
|
||||
{
|
||||
m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
switch( m_CoordIndex[idx].size() )
|
||||
{
|
||||
case 3: glBegin( GL_TRIANGLES );break;
|
||||
case 4: glBegin( GL_QUADS ); break;
|
||||
default: glBegin( GL_POLYGON ); break;
|
||||
}
|
||||
|
||||
|
||||
if( m_PerVertexNormalsNormalized.size() > 0 )
|
||||
{
|
||||
for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
|
||||
{
|
||||
glm::vec3 normal = m_PerVertexNormalsNormalized[m_NormalIndex[idx][ii]];
|
||||
glNormal3fv( &normal.x );
|
||||
|
||||
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
|
||||
glVertex3fv( &point.x );
|
||||
}
|
||||
} else if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
|
||||
{
|
||||
std::vector< glm::vec3 > normals_list;
|
||||
normals_list = m_PerFaceVertexNormals[idx];
|
||||
|
||||
for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
|
||||
{
|
||||
glm::vec3 normal = normals_list[ii];
|
||||
glNormal3fv( &normal.x );
|
||||
|
||||
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
|
||||
glVertex3fv( &point.x );
|
||||
}
|
||||
} else
|
||||
{
|
||||
// Flat
|
||||
glm::vec3 normal = m_PerFaceNormalsNormalized[idx];
|
||||
|
||||
for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
|
||||
{
|
||||
glNormal3fv( &normal.x );
|
||||
|
||||
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
|
||||
glVertex3fv( &point.x );
|
||||
}
|
||||
}
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
|
||||
void S3D_MESH::calcPointNormalized ()
|
||||
{
|
||||
//DBG( printf( "calcPointNormalized\n" ) );
|
||||
|
||||
if( isPointNormalizedComputed == true )
|
||||
{
|
||||
return;
|
||||
}
|
||||
isPointNormalizedComputed = true;
|
||||
|
||||
if( m_PerVertexNormalsNormalized.size() > 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_PointNormalized.clear();
|
||||
|
||||
float biggerPoint = 0.0f;
|
||||
for( unsigned int i = 0; i< m_Point.size(); i++ )
|
||||
{
|
||||
if( fabs( m_Point[i].x ) > biggerPoint) biggerPoint = fabs( m_Point[i].x );
|
||||
if( fabs( m_Point[i].y ) > biggerPoint) biggerPoint = fabs( m_Point[i].y );
|
||||
if( fabs( m_Point[i].z ) > biggerPoint) biggerPoint = fabs( m_Point[i].z );
|
||||
}
|
||||
|
||||
biggerPoint = 1.0 / biggerPoint;
|
||||
|
||||
for( unsigned int i= 0; i< m_Point.size(); i++ )
|
||||
{
|
||||
glm::vec3 p;
|
||||
p = m_Point[i] * biggerPoint;
|
||||
m_PointNormalized.push_back( p );
|
||||
}
|
||||
|
||||
//DBG( printf("m_Point.size %u\n", m_Point.size()) );
|
||||
}
|
||||
|
||||
|
||||
bool IsClockwise( glm::vec3 v0, glm::vec3 v1, glm::vec3 v2 )
|
||||
{
|
||||
double sum = 0.0;
|
||||
|
||||
sum += (v1.x - v0.x) * (v1.y + v0.y);
|
||||
sum += (v2.x - v1.x) * (v2.y + v1.y);
|
||||
sum += (v0.x - v2.x) * (v0.y + v2.y);
|
||||
|
||||
return sum > FLT_EPSILON;
|
||||
}
|
||||
|
||||
|
||||
void S3D_MESH::calcPerFaceNormals ()
|
||||
{
|
||||
//DBG( printf( "calcPerFaceNormals" ) );
|
||||
|
||||
if( isPerFaceNormalsComputed == true )
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
isPerFaceNormalsComputed = true;
|
||||
|
||||
|
||||
if( m_PerVertexNormalsNormalized.size() > 0 )
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
bool haveAlreadyNormals_from_model_file = false;
|
||||
|
||||
if( m_PerFaceNormalsNormalized.size() > 0 )
|
||||
{
|
||||
haveAlreadyNormals_from_model_file = true;
|
||||
}
|
||||
|
||||
m_PerFaceNormalsRaw.clear();
|
||||
m_PerFaceSquaredArea.clear();
|
||||
|
||||
//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++ )
|
||||
{
|
||||
|
||||
// User normalized and multiply to get better resolution
|
||||
glm::vec3 v0 = m_PointNormalized[m_CoordIndex[idx][0]];
|
||||
glm::vec3 v1 = m_PointNormalized[m_CoordIndex[idx][1]];
|
||||
glm::vec3 v2 = m_PointNormalized[m_CoordIndex[idx][m_CoordIndex[idx].size() - 1]];
|
||||
|
||||
/*
|
||||
// !TODO: improove and check what is best to calc the normal (check what have more resolution)
|
||||
glm::vec3 v0 = m_Point[m_CoordIndex[idx][0]];
|
||||
glm::vec3 v1 = m_Point[m_CoordIndex[idx][1]];
|
||||
glm::vec3 v2 = m_Point[m_CoordIndex[idx][m_CoordIndex[idx].size() - 1]];
|
||||
*/
|
||||
|
||||
glm::vec3 cross_prod;
|
||||
|
||||
/*
|
||||
// This is not working as good as it is expected :/
|
||||
if( IsClockwise( v0, v1, v2 ) )
|
||||
{
|
||||
// CW
|
||||
cross_prod = glm::cross( v1 - v2, v0 - v2 );
|
||||
} else
|
||||
{*/
|
||||
// CCW
|
||||
cross_prod = glm::cross( v1 - v0, v2 - v0 );
|
||||
//}
|
||||
|
||||
float area = glm::dot( cross_prod, cross_prod );
|
||||
|
||||
if( cross_prod[2] < 0.0 )
|
||||
{
|
||||
area = -area;
|
||||
}
|
||||
|
||||
if( area < FLT_EPSILON )
|
||||
{
|
||||
area = FLT_EPSILON * 2.0f;
|
||||
}
|
||||
|
||||
m_PerFaceSquaredArea.push_back( area );
|
||||
|
||||
m_PerFaceNormalsRaw.push_back( cross_prod );
|
||||
|
||||
if( haveAlreadyNormals_from_model_file == false )
|
||||
{
|
||||
|
||||
// normalize vertex normal
|
||||
float l = glm::length( cross_prod );
|
||||
|
||||
if( l > FLT_EPSILON ) // avoid division by zero
|
||||
{
|
||||
cross_prod = cross_prod / l;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Cannot calc normal
|
||||
if( ( cross_prod.x > cross_prod.y ) && ( cross_prod.x > cross_prod.z ) )
|
||||
{
|
||||
cross_prod.x = 1.0; cross_prod.y = 0.0; cross_prod.z = 0.0;
|
||||
} else if( ( cross_prod.y > cross_prod.x ) && ( cross_prod.y > cross_prod.z ))
|
||||
{
|
||||
cross_prod.x = 0.0; cross_prod.y = 1.0; cross_prod.z = 0.0;
|
||||
} else
|
||||
{
|
||||
cross_prod.x = 0.0; cross_prod.y = 1.0; cross_prod.z = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
m_PerFaceNormalsNormalized.push_back( cross_prod );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// http://www.bytehazard.com/code/vertnorm.html
|
||||
// http://www.emeyex.com/site/tuts/VertexNormals.pdf
|
||||
void S3D_MESH::calcPerPointNormals ()
|
||||
{
|
||||
//DBG( printf( "calcPerPointNormals" ) );
|
||||
|
||||
if( isPerPointNormalsComputed == true )
|
||||
{
|
||||
return;
|
||||
}
|
||||
isPerPointNormalsComputed = true;
|
||||
|
||||
if( m_PerVertexNormalsNormalized.size() > 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_PerFaceVertexNormals.clear();
|
||||
|
||||
// for each face A in mesh
|
||||
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());
|
||||
|
||||
// loop through all 3 vertices
|
||||
// for each vert in face A
|
||||
for( unsigned int each_vert_A_idx = 0; each_vert_A_idx < m_CoordIndex[each_face_A_idx].size(); each_vert_A_idx++ )
|
||||
{
|
||||
face_A_normals[each_vert_A_idx] = m_PerFaceNormalsRaw[each_face_A_idx] * (m_PerFaceSquaredArea[each_face_A_idx]);
|
||||
|
||||
int vertexIndex = (int)(m_CoordIndex[each_face_A_idx][each_vert_A_idx]);
|
||||
glm::vec3 vector_face_A = m_PerFaceNormalsNormalized[each_face_A_idx];
|
||||
|
||||
// for each face B in mesh
|
||||
for( unsigned int each_face_B_idx = 0; each_face_B_idx < m_CoordIndex.size(); each_face_B_idx++ )
|
||||
{
|
||||
//if A != B { // ignore self
|
||||
if ( each_face_A_idx != each_face_B_idx)
|
||||
{
|
||||
if( (m_CoordIndex[each_face_B_idx][0] == vertexIndex) ||
|
||||
(m_CoordIndex[each_face_B_idx][1] == vertexIndex) ||
|
||||
(m_CoordIndex[each_face_B_idx][2] == vertexIndex) )
|
||||
{
|
||||
glm::vec3 vector_face_B = m_PerFaceNormalsNormalized[each_face_B_idx];
|
||||
|
||||
float dot_prod = glm::dot(vector_face_A, vector_face_B);
|
||||
if( dot_prod > 0.05f )
|
||||
{
|
||||
face_A_normals[each_vert_A_idx] += m_PerFaceNormalsRaw[each_face_B_idx] * (m_PerFaceSquaredArea[each_face_B_idx] * dot_prod);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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 );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.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
|
||||
* 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_mesh_model.h
|
||||
* @brief
|
||||
*/
|
||||
|
||||
#ifndef __3D_MESH_MODEL_H__
|
||||
#define __3D_MESH_MODEL_H__
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <common.h>
|
||||
#include <macros.h>
|
||||
#include <base_struct.h>
|
||||
#include <gal/opengl/glm/glm.hpp>
|
||||
#include <vector>
|
||||
#include <kicad_string.h>
|
||||
#include <info3d_visu.h>
|
||||
#ifdef __WXMAC__
|
||||
# ifdef __DARWIN__
|
||||
# include <OpenGL/glu.h>
|
||||
# else
|
||||
# include <glu.h>
|
||||
# endif
|
||||
#else
|
||||
# include <GL/glu.h>
|
||||
#endif
|
||||
#include <wx/glcanvas.h>
|
||||
|
||||
class S3D_MESH;
|
||||
|
||||
class S3D_MESH
|
||||
{
|
||||
public:
|
||||
|
||||
S3D_MESH();
|
||||
~S3D_MESH();
|
||||
|
||||
void openGL_Render();
|
||||
void openGL_RenderAllChilds();
|
||||
|
||||
S3D_MATERIAL *m_Materials;
|
||||
|
||||
// Point and index list
|
||||
std::vector< glm::vec3 > m_Point;
|
||||
std::vector< std::vector<int> > m_CoordIndex;
|
||||
std::vector< std::vector<int> > m_NormalIndex;
|
||||
std::vector< glm::vec3 > m_PerFaceNormalsNormalized;
|
||||
std::vector< glm::vec3 > m_PerVertexNormalsNormalized;
|
||||
|
||||
std::vector< int > m_MaterialIndex;
|
||||
|
||||
glm::vec3 m_translation;
|
||||
glm::vec4 m_rotation;
|
||||
glm::vec3 m_scale;
|
||||
glm::vec4 m_scaleOrientation; // not used
|
||||
glm::vec3 m_center; // not used
|
||||
|
||||
std::vector<S3D_MESH *> childs;
|
||||
|
||||
private:
|
||||
std::vector< glm::vec3 > m_PerFaceNormalsRaw;
|
||||
std::vector< std::vector< glm::vec3 > > m_PerFaceVertexNormals;
|
||||
std::vector< glm::vec3 > m_PointNormalized;
|
||||
std::vector< float > m_PerFaceSquaredArea;
|
||||
std::vector< std::vector<int> > m_InvalidCoordIndexes; //!TODO: check for invalid CoordIndex in file and remove the index and the same material index
|
||||
|
||||
bool isPerFaceNormalsComputed;
|
||||
void calcPerFaceNormals ();
|
||||
|
||||
bool isPointNormalizedComputed;
|
||||
void calcPointNormalized();
|
||||
|
||||
bool isPerPointNormalsComputed;
|
||||
void calcPerPointNormals();
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -31,7 +31,7 @@
|
|||
#include <common.h>
|
||||
#include <macros.h>
|
||||
#include <kicad_string.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <pgm_base.h>
|
||||
|
||||
#include <3d_viewer.h>
|
||||
#include <info3d_visu.h>
|
||||
|
|
|
@ -1,6 +1,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) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
|
@ -32,8 +33,9 @@
|
|||
|
||||
#include <common.h>
|
||||
#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
|
||||
*/
|
||||
|
@ -44,48 +46,7 @@ class S3D_MASTER;
|
|||
class STRUCT_3D_SHAPE;
|
||||
|
||||
/* S3D_VERTEX manages a 3D coordinate (3 float numbers: x,y,z coordinates)*/
|
||||
class S3D_VERTEX
|
||||
{
|
||||
public:
|
||||
double x, y, z;
|
||||
|
||||
public:
|
||||
S3D_VERTEX()
|
||||
{
|
||||
x = y = z = 0.0;
|
||||
}
|
||||
|
||||
S3D_VERTEX( double px, double py, double pz)
|
||||
{
|
||||
x = px;
|
||||
y = py;
|
||||
z = pz;
|
||||
}
|
||||
};
|
||||
|
||||
class S3D_MATERIAL : public EDA_ITEM /* openGL "material" data*/
|
||||
{
|
||||
public:
|
||||
wxString m_Name;
|
||||
S3D_VERTEX m_DiffuseColor;
|
||||
S3D_VERTEX m_EmissiveColor;
|
||||
S3D_VERTEX m_SpecularColor;
|
||||
float m_AmbientIntensity;
|
||||
float m_Transparency;
|
||||
float m_Shininess;
|
||||
|
||||
public:
|
||||
S3D_MATERIAL( S3D_MASTER* father, const wxString& name );
|
||||
|
||||
S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
|
||||
S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
|
||||
|
||||
void SetMaterial();
|
||||
|
||||
#if defined(DEBUG)
|
||||
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
|
||||
#endif
|
||||
};
|
||||
#define S3D_VERTEX glm::vec3
|
||||
|
||||
|
||||
/* Master structure for a 3D item description */
|
||||
|
@ -106,9 +67,23 @@ public:
|
|||
FILE3D_UNKNOWN
|
||||
};
|
||||
|
||||
// Check defaults in S3D_MASTER
|
||||
bool m_use_modelfile_diffuseColor;
|
||||
bool m_use_modelfile_emissiveColor;
|
||||
bool m_use_modelfile_specularColor;
|
||||
bool m_use_modelfile_ambientIntensity;
|
||||
bool m_use_modelfile_transparency;
|
||||
bool m_use_modelfile_shininess;
|
||||
|
||||
private:
|
||||
wxString m_Shape3DName; /* 3D shape name in 3D library */
|
||||
FILE3D_TYPE m_ShapeType;
|
||||
double m_lastTransparency; // last transparency value from
|
||||
// last material in use
|
||||
bool m_loadTransparentObjects;
|
||||
bool m_loadNonTransparentObjects;
|
||||
|
||||
|
||||
|
||||
public:
|
||||
S3D_MASTER( EDA_ITEM* aParent );
|
||||
|
@ -117,11 +92,41 @@ public:
|
|||
S3D_MASTER* Next() const { return (S3D_MASTER*) Pnext; }
|
||||
S3D_MASTER* Back() const { return (S3D_MASTER*) Pback; }
|
||||
|
||||
// Accessors
|
||||
void SetLastTransparency( double aValue ) { m_lastTransparency = aValue; }
|
||||
|
||||
void SetLoadTransparentObjects( bool aLoad )
|
||||
{ m_loadTransparentObjects = aLoad; }
|
||||
|
||||
void SetLoadNonTransparentObjects( bool aLoad )
|
||||
{ m_loadNonTransparentObjects = aLoad; }
|
||||
|
||||
void Insert( S3D_MATERIAL* aMaterial );
|
||||
|
||||
/**
|
||||
* Function IsOpenGlAllowed
|
||||
* @return true if opengl current list accepts a gl data
|
||||
* used to filter transparent objects, which are drawn after
|
||||
* non transparent objects
|
||||
*/
|
||||
bool IsOpenGlAllowed();
|
||||
|
||||
void Copy( S3D_MASTER* pattern );
|
||||
|
||||
/**
|
||||
* Function ReadData
|
||||
* Select the parser to read the 3D data file (vrml, x3d ...)
|
||||
* and build the description objects list
|
||||
*/
|
||||
int ReadData();
|
||||
void Set_Object_Coords( std::vector< S3D_VERTEX >& aVertices );
|
||||
|
||||
/**
|
||||
* Function ObjectCoordsTo3DUnits
|
||||
* @param aVertices = a list of 3D coordinates in shape units
|
||||
* to convert to 3D canvas units, according to the
|
||||
* footprint 3Dshape rotation, offset and scale parameters
|
||||
*/
|
||||
void ObjectCoordsTo3DUnits( std::vector< S3D_VERTEX >& aVertices );
|
||||
|
||||
#if defined(DEBUG)
|
||||
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
|
||||
|
@ -147,6 +152,13 @@ public:
|
|||
*/
|
||||
const wxString GetShape3DFullFilename();
|
||||
|
||||
/**
|
||||
* Function SetShape3DName
|
||||
* @param aShapeName = file name of the data file relative to the 3D shape
|
||||
*
|
||||
* Set the filename of the 3D shape, and depending on the file extention
|
||||
* (vrl, x3d, idf ) the type of file.
|
||||
*/
|
||||
void SetShape3DName( const wxString& aShapeName );
|
||||
};
|
||||
|
||||
|
|
|
@ -153,26 +153,43 @@ void EDA_3D_FRAME::CreateMenuBar()
|
|||
menuBar->Append( prefsMenu, _( "&Preferences" ) );
|
||||
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_REALISTIC_MODE,
|
||||
_( "Realistic Mode" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
|
||||
_( "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 );
|
||||
|
||||
prefsMenu->AppendSeparator();
|
||||
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_BGCOLOR_SELECTION,
|
||||
_( "Choose background color" ), KiBitmap( palette_xpm ) );
|
||||
_( "Choose Background Color" ), KiBitmap( palette_xpm ) );
|
||||
|
||||
AddMenuItem( prefsMenu, ID_MENU3D_AXIS_ONOFF,
|
||||
_( "Show 3D &Axis" ), KiBitmap( axis3d_front_xpm ), wxITEM_CHECK );
|
||||
_( "Show 3D &Axis" ), KiBitmap( axis3d_front_xpm ), wxITEM_CHECK );
|
||||
|
||||
// Creates grid menu
|
||||
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->Check( ID_MENU3D_GRID_NOGRID, true );
|
||||
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->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 );
|
||||
// If the grid is on, check the corresponding menuitem showing the grid size
|
||||
if( g_Parm_3D_Visu.GetFlag( 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 );
|
||||
}
|
||||
else
|
||||
gridlistMenu->Check( ID_MENU3D_GRID_NOGRID, true );
|
||||
|
||||
prefsMenu->AppendSeparator();
|
||||
|
||||
|
@ -222,40 +239,43 @@ 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.GetFlag( FL_USE_REALISTIC_MODE ) );
|
||||
item->Check( g_Parm_3D_Visu.IsRealisticMode() );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE );
|
||||
item->Check( g_Parm_3D_Visu.HightQualityMode() );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_SHOW_BOARD_BODY );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_SHOW_BOARD_BODY ) );
|
||||
item->Check( g_Parm_3D_Visu.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( g_Parm_3D_Visu.GetFlag( FL_USE_COPPER_THICKNESS ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_MODULE_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_MODULE ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_MODULE ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_ZONE_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_ZONE ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_ZONE ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_AXIS_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_AXIS ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_AXIS ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_ADHESIVE_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_ADHESIVE ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_ADHESIVE ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_SILKSCREEN_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_SILKSCREEN ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_SILKSCREEN ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_SOLDER_MASK_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_SOLDERMASK ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_SOLDERMASK ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_SOLDER_PASTE_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_SOLDERPASTE ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_SOLDERPASTE ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_COMMENTS_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_COMMENTS ) );
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_COMMENTS ) );
|
||||
|
||||
item = menuBar->FindItem( ID_MENU3D_ECO_ONOFF );
|
||||
item->Check(g_Parm_3D_Visu.GetFlag( FL_ECO ));
|
||||
item->Check( g_Parm_3D_Visu.GetFlag( FL_ECO ));
|
||||
}
|
||||
|
||||
void EDA_3D_FRAME::SetToolbars()
|
||||
|
|
|
@ -30,53 +30,46 @@
|
|||
#ifndef __3D_VIEWER_H__
|
||||
#define __3D_VIEWER_H__
|
||||
|
||||
#include <wxstruct.h> // for EDA_BASE_FRAME.
|
||||
#include <draw_frame.h>
|
||||
|
||||
#if !wxUSE_GLCANVAS
|
||||
#error Please build wxWidgets with Opengl support (./configure --with-opengl)
|
||||
#endif
|
||||
|
||||
#include <wx/glcanvas.h>
|
||||
|
||||
#ifdef __WXMAC__
|
||||
# ifdef __DARWIN__
|
||||
# include <OpenGL/glu.h>
|
||||
# else
|
||||
# include <glu.h>
|
||||
# endif
|
||||
#else
|
||||
# include <GL/glu.h>
|
||||
#endif
|
||||
|
||||
#include <3d_struct.h>
|
||||
|
||||
#define KISYS3DMOD "KISYS3DMOD"
|
||||
|
||||
#include <3d_struct.h>
|
||||
|
||||
class EDA_3D_CANVAS;
|
||||
class PCB_BASE_FRAME;
|
||||
|
||||
#define KICAD_DEFAULT_3D_DRAWFRAME_STYLE wxDEFAULT_FRAME_STYLE | wxWANTS_CHARS
|
||||
#define LIB3D_PATH wxT( "packages3d" )
|
||||
#define KICAD_DEFAULT_3D_DRAWFRAME_STYLE (wxDEFAULT_FRAME_STYLE | wxWANTS_CHARS)
|
||||
#define LIB3D_PATH wxT( "packages3d" )
|
||||
|
||||
class EDA_3D_FRAME : public EDA_BASE_FRAME
|
||||
|
||||
class EDA_3D_FRAME : public KIWAY_PLAYER
|
||||
{
|
||||
private:
|
||||
EDA_3D_CANVAS* m_canvas;
|
||||
bool m_reloadRequest;
|
||||
wxString m_defaultFileName; /// Filename to propose for screenshot
|
||||
|
||||
/// Tracks whether to use Orthographic or Perspective projection
|
||||
bool m_ortho;
|
||||
|
||||
public:
|
||||
EDA_3D_FRAME( PCB_BASE_FRAME* parent, const wxString& title,
|
||||
EDA_3D_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent, const wxString& aTitle,
|
||||
long style = KICAD_DEFAULT_3D_DRAWFRAME_STYLE );
|
||||
|
||||
~EDA_3D_FRAME()
|
||||
{
|
||||
m_auimgr.UnInit();
|
||||
};
|
||||
|
||||
PCB_BASE_FRAME* Parent() { return (PCB_BASE_FRAME*)GetParent(); }
|
||||
PCB_BASE_FRAME* Parent() const { return (PCB_BASE_FRAME*)GetParent(); }
|
||||
|
||||
BOARD* GetBoard();
|
||||
|
||||
/**
|
||||
* Function ReloadRequest
|
||||
|
@ -93,8 +86,10 @@ public:
|
|||
* Function NewDisplay
|
||||
* Rebuild the display list.
|
||||
* must be called when 3D opengl data is modified
|
||||
* @param aGlList = the list to rebuild.
|
||||
* if 0 (default) all lists are rebuilt
|
||||
*/
|
||||
void NewDisplay();
|
||||
void NewDisplay( int aGlList = 0 );
|
||||
|
||||
void SetDefaultFileName(const wxString &aFn) { m_defaultFileName = aFn; }
|
||||
const wxString &GetDefaultFileName() const { return m_defaultFileName; }
|
||||
|
@ -121,8 +116,9 @@ private:
|
|||
// to the current display options
|
||||
void ReCreateMainToolbar();
|
||||
void SetToolbars();
|
||||
void GetSettings();
|
||||
void SaveSettings();
|
||||
|
||||
void LoadSettings( wxConfigBase* aCfg ); // overload virtual
|
||||
void SaveSettings( wxConfigBase* aCfg ); // overload virtual
|
||||
|
||||
// Other functions
|
||||
void OnLeftClick( wxDC* DC, const wxPoint& MousePos );
|
||||
|
|
|
@ -41,6 +41,7 @@ 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_END_COMMAND_3D,
|
||||
|
||||
ID_TOOL_SET_VISIBLE_ITEMS,
|
||||
|
|
|
@ -2,8 +2,10 @@ add_definitions(-DPCBNEW)
|
|||
|
||||
include_directories(BEFORE ${INC_BEFORE})
|
||||
include_directories(
|
||||
textures
|
||||
../pcbnew
|
||||
../polygon
|
||||
${GLEW_INCLUDE_DIR}
|
||||
${INC_AFTER}
|
||||
)
|
||||
|
||||
|
@ -16,12 +18,17 @@ set(3D-VIEWER_SRCS
|
|||
3d_draw.cpp
|
||||
3d_draw_basic_functions.cpp
|
||||
3d_frame.cpp
|
||||
3d_material.cpp
|
||||
3d_mesh_model.cpp
|
||||
3d_read_mesh.cpp
|
||||
3d_toolbar.cpp
|
||||
info3d_visu.cpp
|
||||
trackball.cpp
|
||||
x3dmodelparser.cpp
|
||||
vrmlmodelparser.cpp
|
||||
vrml_aux.cpp
|
||||
vrml_v1_modelparser.cpp
|
||||
vrml_v2_modelparser.cpp
|
||||
x3dmodelparser.cpp
|
||||
)
|
||||
|
||||
add_library(3d-viewer STATIC ${3D-VIEWER_SRCS})
|
||||
|
|
|
@ -62,9 +62,9 @@ INFO3D_VISU::INFO3D_VISU()
|
|||
|
||||
m_CopperLayersCount = 2;
|
||||
m_BoardSettings = NULL;
|
||||
m_CopperThickness = 0;
|
||||
m_EpoxyThickness = 0;
|
||||
m_NonCopperLayerThickness = 0;
|
||||
m_copperThickness = 0;
|
||||
m_epoxyThickness = 0;
|
||||
m_nonCopperLayerThickness = 0;
|
||||
|
||||
// default all special item layers Visible
|
||||
for( ii = 0; ii < FL_LAST; ii++ )
|
||||
|
@ -72,6 +72,7 @@ INFO3D_VISU::INFO3D_VISU()
|
|||
|
||||
SetFlag( FL_GRID, false );
|
||||
SetFlag( FL_USE_COPPER_THICKNESS, false );
|
||||
SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, false );
|
||||
}
|
||||
|
||||
|
||||
|
@ -84,7 +85,7 @@ INFO3D_VISU::~INFO3D_VISU()
|
|||
*/
|
||||
void INFO3D_VISU::InitSettings( BOARD* aBoard )
|
||||
{
|
||||
EDA_RECT bbbox = aBoard->ComputeBoundingBox( false );
|
||||
EDA_RECT bbbox = aBoard->ComputeBoundingBox( true );
|
||||
|
||||
if( bbbox.GetWidth() == 0 && bbbox.GetHeight() == 0 )
|
||||
{
|
||||
|
@ -92,6 +93,7 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
|
|||
bbbox.SetHeight( Millimeter2iu( 100 ) );
|
||||
}
|
||||
|
||||
|
||||
m_BoardSettings = &aBoard->GetDesignSettings();
|
||||
|
||||
m_BoardSize = bbbox.GetSize();
|
||||
|
@ -107,97 +109,99 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
|
|||
|
||||
m_BiuTo3Dunits = 2.0 / std::max( m_BoardSize.x, m_BoardSize.y );
|
||||
|
||||
m_EpoxyThickness = aBoard->GetDesignSettings().GetBoardThickness() * m_BiuTo3Dunits;
|
||||
m_epoxyThickness = aBoard->GetDesignSettings().GetBoardThickness() * m_BiuTo3Dunits;
|
||||
|
||||
// TODO use value defined by user (currently use default values by ctor
|
||||
m_CopperThickness = COPPER_THICKNESS * m_BiuTo3Dunits;
|
||||
m_NonCopperLayerThickness = TECH_LAYER_THICKNESS * m_BiuTo3Dunits;
|
||||
m_copperThickness = COPPER_THICKNESS * m_BiuTo3Dunits;
|
||||
m_nonCopperLayerThickness = TECH_LAYER_THICKNESS * m_BiuTo3Dunits;
|
||||
|
||||
// Init Z position of each layer
|
||||
// calculate z position for each copper layer
|
||||
// Z = 0 is the z position of the back (bottom) layer (layer id = 31)
|
||||
// Z = m_epoxyThickness is the z position of the front (top) layer (layer id = 0)
|
||||
// all unused copper layer z position are set to 0
|
||||
int layer;
|
||||
int copper_layers_cnt = m_CopperLayersCount;
|
||||
|
||||
for( layer = 0; layer < copper_layers_cnt; layer++ )
|
||||
{
|
||||
m_LayerZcoord[layer] =
|
||||
m_EpoxyThickness * layer / (copper_layers_cnt - 1);
|
||||
m_layerZcoord[layer] =
|
||||
m_epoxyThickness - (m_epoxyThickness * layer / (copper_layers_cnt - 1));
|
||||
}
|
||||
|
||||
#define layerThicknessMargin 1.1
|
||||
double zpos_offset = m_NonCopperLayerThickness * layerThicknessMargin;
|
||||
double zpos_copper_back = m_LayerZcoord[0] - layerThicknessMargin*m_CopperThickness/2;
|
||||
double zpos_copper_front = m_EpoxyThickness + layerThicknessMargin*m_CopperThickness/2;
|
||||
double zpos_offset = m_nonCopperLayerThickness * layerThicknessMargin;
|
||||
double zpos_copper_back = - layerThicknessMargin*m_copperThickness/2;
|
||||
double zpos_copper_front = m_epoxyThickness + layerThicknessMargin*m_copperThickness/2;
|
||||
|
||||
// Fill remaining unused copper layers and front layer zpos
|
||||
// with m_EpoxyThickness
|
||||
// Solder mask and Solder paste have the same Z position
|
||||
for( ; layer <= LAST_COPPER_LAYER; layer++ )
|
||||
// Fill remaining unused copper layers and back layer zpos
|
||||
// with 0
|
||||
for( ; layer < MAX_CU_LAYERS; layer++ )
|
||||
{
|
||||
m_LayerZcoord[layer] = m_EpoxyThickness;
|
||||
m_layerZcoord[layer] = 0;
|
||||
}
|
||||
|
||||
// calculate z position for each non copper layer
|
||||
for( int layer_id = FIRST_NON_COPPER_LAYER; layer_id < NB_PCB_LAYERS; layer_id++ )
|
||||
// Solder mask and Solder paste have the same Z position
|
||||
for( int layer_id = MAX_CU_LAYERS; layer_id < LAYER_ID_COUNT; layer_id++ )
|
||||
{
|
||||
double zpos;
|
||||
|
||||
switch( layer_id )
|
||||
{
|
||||
case ADHESIVE_N_BACK:
|
||||
case B_Adhes:
|
||||
zpos = zpos_copper_back - 3 * zpos_offset;
|
||||
break;
|
||||
|
||||
case ADHESIVE_N_FRONT:
|
||||
case F_Adhes:
|
||||
zpos = zpos_copper_front + 3 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERPASTE_N_BACK:
|
||||
case B_Paste:
|
||||
zpos = zpos_copper_back - 1 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERPASTE_N_FRONT:
|
||||
case F_Paste:
|
||||
zpos = zpos_copper_front + 1 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERMASK_N_BACK:
|
||||
case B_Mask:
|
||||
zpos = zpos_copper_back - 1 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SOLDERMASK_N_FRONT:
|
||||
case F_Mask:
|
||||
zpos = zpos_copper_front + 1 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SILKSCREEN_N_BACK:
|
||||
case B_SilkS:
|
||||
zpos = zpos_copper_back - 2 * zpos_offset;
|
||||
break;
|
||||
|
||||
case SILKSCREEN_N_FRONT:
|
||||
case F_SilkS:
|
||||
zpos = zpos_copper_front + 2 * zpos_offset;
|
||||
break;
|
||||
|
||||
default:
|
||||
zpos = zpos_copper_front +
|
||||
(layer_id - FIRST_NON_COPPER_LAYER + 4) * zpos_offset;
|
||||
zpos = zpos_copper_front + (layer_id - MAX_CU_LAYERS + 4) * zpos_offset;
|
||||
break;
|
||||
}
|
||||
|
||||
m_LayerZcoord[layer_id] = zpos;
|
||||
m_layerZcoord[layer_id] = zpos;
|
||||
}
|
||||
}
|
||||
|
||||
/* return the Z position of 3D shapes, in 3D Units
|
||||
* aIsFlipped: true for modules on Front (top) layer, false
|
||||
* if on back (bottom) layer
|
||||
* Note: in draw functions, the copper has a thickness = m_CopperThickness
|
||||
* Vias and tracks are draw with the top side position = m_CopperThickness/2
|
||||
* and the bottom side position = -m_CopperThickness/2 from the Z layer position
|
||||
* Note: in draw functions, the copper has a thickness = m_copperThickness
|
||||
* Vias and tracks are draw with the top side position = m_copperThickness/2
|
||||
* and the bottom side position = -m_copperThickness/2 from the Z layer position
|
||||
*/
|
||||
double INFO3D_VISU::GetModulesZcoord3DIU( bool aIsFlipped )
|
||||
{
|
||||
if( aIsFlipped )
|
||||
return m_LayerZcoord[LAYER_N_BACK] - ( m_CopperThickness / 2 );
|
||||
return m_layerZcoord[B_Paste] - ( m_copperThickness / 2 ); //B_Cu NOTE: in order to display modules in top of Paste and near the shadow
|
||||
else
|
||||
return m_LayerZcoord[LAYER_N_FRONT] + ( m_CopperThickness / 2 );
|
||||
return m_layerZcoord[F_Paste] + ( m_copperThickness / 2 ); //F_Cu
|
||||
}
|
||||
|
||||
|
|
|
@ -71,10 +71,10 @@ enum DISPLAY3D_FLG {
|
|||
FL_USE_COPPER_THICKNESS,
|
||||
FL_SHOW_BOARD_BODY,
|
||||
FL_USE_REALISTIC_MODE,
|
||||
FL_USE_MAXQUALITY_IN_REALISTIC_MODE,
|
||||
FL_LAST
|
||||
};
|
||||
|
||||
|
||||
class INFO3D_VISU
|
||||
{
|
||||
public:
|
||||
|
@ -95,11 +95,14 @@ public:
|
|||
// 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
|
||||
|
||||
double zpos_offset;
|
||||
|
||||
private:
|
||||
double m_LayerZcoord[NB_LAYERS]; // 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
|
||||
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)
|
||||
|
||||
public: INFO3D_VISU();
|
||||
|
@ -134,7 +137,7 @@ public: INFO3D_VISU();
|
|||
*/
|
||||
int GetLayerZcoordBIU( int aLayerId )
|
||||
{
|
||||
return KiROUND( m_LayerZcoord[aLayerId] / m_BiuTo3Dunits );
|
||||
return KiROUND( m_layerZcoord[aLayerId] / m_BiuTo3Dunits );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -148,11 +151,10 @@ public: INFO3D_VISU();
|
|||
*/
|
||||
int GetCopperThicknessBIU() const
|
||||
{
|
||||
bool use_thickness = GetFlag( FL_USE_COPPER_THICKNESS )
|
||||
// || GetFlag( FL_USE_REALISTIC_MODE )
|
||||
;
|
||||
bool use_thickness = GetFlag( FL_USE_COPPER_THICKNESS );
|
||||
|
||||
return use_thickness ?
|
||||
KiROUND( m_CopperThickness / m_BiuTo3Dunits )
|
||||
KiROUND( m_copperThickness / m_BiuTo3Dunits )
|
||||
: 0;
|
||||
}
|
||||
|
||||
|
@ -162,7 +164,7 @@ public: INFO3D_VISU();
|
|||
*/
|
||||
int GetEpoxyThicknessBIU() const
|
||||
{
|
||||
return KiROUND( m_EpoxyThickness / m_BiuTo3Dunits );
|
||||
return KiROUND( m_epoxyThickness / m_BiuTo3Dunits );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -178,7 +180,7 @@ public: INFO3D_VISU();
|
|||
// || GetFlag( FL_USE_REALISTIC_MODE )
|
||||
;
|
||||
return use_thickness ?
|
||||
KiROUND( m_NonCopperLayerThickness / m_BiuTo3Dunits )
|
||||
KiROUND( m_nonCopperLayerThickness / m_BiuTo3Dunits )
|
||||
: 0;
|
||||
}
|
||||
|
||||
|
@ -189,14 +191,16 @@ public: INFO3D_VISU();
|
|||
*
|
||||
* Note: if m_drawFlags[FL_USE_COPPER_THICKNESS] is not set, returns 0
|
||||
*/
|
||||
int GetLayerObjectThicknessBIU( int aLayerId) const
|
||||
int GetLayerObjectThicknessBIU( int aLayerId ) const
|
||||
{
|
||||
return aLayerId >= FIRST_NON_COPPER_LAYER ?
|
||||
GetNonCopperLayerThicknessBIU() :
|
||||
GetCopperThicknessBIU();
|
||||
return IsCopperLayer( aLayerId ) ?
|
||||
GetCopperThicknessBIU() :
|
||||
GetNonCopperLayerThicknessBIU()
|
||||
;
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
@ -32,13 +32,9 @@
|
|||
#include <map>
|
||||
#include <vector>
|
||||
#include <wx/string.h>
|
||||
|
||||
#include <3d_mesh_model.h>
|
||||
|
||||
class S3D_MASTER;
|
||||
class S3D_VERTEX;
|
||||
|
||||
extern void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
|
||||
|
||||
class S3D_MODEL_PARSER;
|
||||
class X3D_MODEL_PARSER;
|
||||
|
||||
|
@ -118,13 +114,17 @@ public:
|
|||
static void GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps );
|
||||
|
||||
/**
|
||||
* Return string representing x3d file in vrml format
|
||||
* Return string representing x3d file in vrml2 format
|
||||
* Function Load must be called before this function, otherwise empty
|
||||
* data set is returned.
|
||||
*/
|
||||
wxString VRML_representation();
|
||||
wxString VRML2_representation();
|
||||
|
||||
private:
|
||||
wxString m_Filename;
|
||||
S3D_MESH *m_model;
|
||||
std::vector<S3D_MESH *> childs;
|
||||
|
||||
std::vector< wxString > vrml_materials;
|
||||
std::vector< wxString > vrml_points;
|
||||
std::vector< wxString > vrml_coord_indexes;
|
||||
|
@ -137,8 +137,98 @@ private:
|
|||
void rotate( S3D_VERTEX& aCoordinate, S3D_VERTEX& aRotAxis, double angle );
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* class WRL_MODEL_PARSER
|
||||
* class VRML2_MODEL_PARSER
|
||||
* Parses
|
||||
*/
|
||||
class VRML2_MODEL_PARSER: public S3D_MODEL_PARSER
|
||||
{
|
||||
public:
|
||||
VRML2_MODEL_PARSER( S3D_MASTER* aMaster );
|
||||
~VRML2_MODEL_PARSER();
|
||||
void Load( const wxString aFilename );
|
||||
|
||||
/**
|
||||
* Return string representing VRML2 file in vrml2 format
|
||||
* Function Load must be called before this function, otherwise empty
|
||||
* data set is returned.
|
||||
*/
|
||||
wxString VRML2_representation();
|
||||
|
||||
private:
|
||||
int read_Transform();
|
||||
int read_DEF();
|
||||
int read_Shape();
|
||||
int read_Appearance();
|
||||
int read_material();
|
||||
int read_Material();
|
||||
int read_IndexedFaceSet();
|
||||
int read_Coordinate();
|
||||
int read_Normal();
|
||||
int read_NormalIndex();
|
||||
int read_Color();
|
||||
int read_coordIndex();
|
||||
int read_colorIndex();
|
||||
|
||||
bool m_normalPerVertex;
|
||||
bool colorPerVertex;
|
||||
S3D_MESH *m_model;
|
||||
std::vector<S3D_MESH *> childs;
|
||||
FILE *m_file;
|
||||
S3D_MATERIAL *m_Materials;
|
||||
wxString m_Filename;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* class VRML1_MODEL_PARSER
|
||||
* Parses
|
||||
*/
|
||||
class VRML1_MODEL_PARSER: public S3D_MODEL_PARSER
|
||||
{
|
||||
public:
|
||||
VRML1_MODEL_PARSER( S3D_MASTER* aMaster );
|
||||
~VRML1_MODEL_PARSER();
|
||||
void Load( const wxString aFilename );
|
||||
|
||||
/**
|
||||
* Return string representing VRML2 file in vrml2 format
|
||||
* Function Load must be called before this function, otherwise empty
|
||||
* data set is returned.
|
||||
*/
|
||||
wxString VRML2_representation();
|
||||
|
||||
private:
|
||||
int read_separator();
|
||||
int readMaterial();
|
||||
int readCoordinate3();
|
||||
int readIndexedFaceSet();
|
||||
|
||||
int readMaterial_ambientColor();
|
||||
int readMaterial_diffuseColor();
|
||||
int readMaterial_emissiveColor();
|
||||
int readMaterial_specularColor();
|
||||
int readMaterial_shininess();
|
||||
int readMaterial_transparency();
|
||||
|
||||
int readCoordinate3_point();
|
||||
|
||||
int readIndexedFaceSet_coordIndex();
|
||||
int readIndexedFaceSet_materialIndex();
|
||||
|
||||
bool m_normalPerVertex;
|
||||
bool colorPerVertex;
|
||||
S3D_MESH *m_model;
|
||||
std::vector<S3D_MESH *> childs;
|
||||
S3D_MATERIAL *m_Materials;
|
||||
FILE *m_file;
|
||||
wxString m_Filename;
|
||||
};
|
||||
|
||||
/**
|
||||
* class VRML_MODEL_PARSER
|
||||
* Parses
|
||||
*/
|
||||
class VRML_MODEL_PARSER: public S3D_MODEL_PARSER
|
||||
|
@ -149,45 +239,9 @@ public:
|
|||
void Load( const wxString aFilename );
|
||||
|
||||
private:
|
||||
/**
|
||||
* Function ReadMaterial
|
||||
* read the description of a 3D material definition in the form:
|
||||
* DEF yellow material Material (
|
||||
* DiffuseColor 1.00000 1.00000 0.00000e 0
|
||||
* EmissiveColor 0.00000e 0 0.00000e 0 0.00000e 0
|
||||
* SpecularColor 1.00000 1.00000 1.00000
|
||||
* AmbientIntensity 1.00000
|
||||
* Transparency 0.00000e 0
|
||||
* Shininess 1.00000
|
||||
*)
|
||||
* Or type:
|
||||
* USE yellow material
|
||||
*/
|
||||
int readMaterial( FILE* file, int* LineNum );
|
||||
int readChildren( FILE* file, int* LineNum );
|
||||
int readShape( FILE* file, int* LineNum );
|
||||
int readAppearance( FILE* file, int* LineNum );
|
||||
int readGeometry( FILE* file, int* LineNum );
|
||||
|
||||
/**
|
||||
* Function ReadCoordList
|
||||
* reads 3D coordinate lists like:
|
||||
* coord Coordinate { point [
|
||||
* -5.24489 6.57640e-3 -9.42129e-2,
|
||||
* -5.11821 6.57421e-3 0.542654,
|
||||
* -3.45868 0.256565 1.32000 ] }
|
||||
* or:
|
||||
* normal Normal { vector [
|
||||
* 0.995171 -6.08102e-6 9.81541e-2,
|
||||
* 0.923880 -4.09802e-6 0.382683,
|
||||
* 0.707107 -9.38186e-7 0.707107]
|
||||
* }
|
||||
*
|
||||
* text_buffer contains the first line of this node :
|
||||
* "coord Coordinate { point ["
|
||||
*/
|
||||
void readCoordsList( FILE* file, char* text_buffer, std::vector< double >& aList,
|
||||
int* LineNum );
|
||||
VRML1_MODEL_PARSER *vrml1_parser;
|
||||
VRML2_MODEL_PARSER *vrml2_parser;
|
||||
};
|
||||
|
||||
|
||||
#endif // MODELPARSERS_H
|
||||
|
|
|
@ -0,0 +1,922 @@
|
|||
/* 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",
|
||||
};
|
||||
|
|
@ -0,0 +1,922 @@
|
|||
/* 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",
|
||||
};
|
||||
|
|
@ -0,0 +1,206 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.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
|
||||
* 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 vrml_aux.cpp
|
||||
*/
|
||||
|
||||
#include "vrml_aux.h"
|
||||
|
||||
char SkipGetChar ( FILE* File )
|
||||
{
|
||||
char c;
|
||||
bool re_parse;
|
||||
|
||||
if( (c = fgetc( File )) == EOF )
|
||||
{
|
||||
//DBG( printf( "EOF\n" ) );
|
||||
return EOF;
|
||||
}
|
||||
|
||||
//DBG( printf( "c %c 0x%02X\n", c, c ) );
|
||||
|
||||
do
|
||||
{
|
||||
re_parse = false;
|
||||
|
||||
if ((c == ' ') || (c == '\t') || (c == '{') || (c == '['))
|
||||
{
|
||||
//DBG( printf( "Skipping space \\t or { or [\n" ) );
|
||||
do
|
||||
{
|
||||
if( (c = fgetc( File )) == EOF )
|
||||
{
|
||||
//DBG( printf( "EOF\n" ) );
|
||||
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
while((c == ' ') || (c == '\t') || (c == '{') || (c == '['));
|
||||
}
|
||||
|
||||
if ((c == '#') || (c == '\n') || (c == '\r') || (c == 0) || (c == ','))
|
||||
{
|
||||
if (c == '#')
|
||||
{
|
||||
//DBG( printf( "Skipping # \\n or \\r or 0, 0x%02X\n", c ) );
|
||||
do
|
||||
{
|
||||
if( (c = fgetc( File )) == EOF )
|
||||
{
|
||||
//DBG( printf( "EOF\n" ) );
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
while((c != '\n') && (c != '\r') && (c != 0) && (c != ','));
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (c = fgetc( File )) == EOF )
|
||||
{
|
||||
//DBG( printf( "EOF\n" ) );
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
|
||||
re_parse = true;
|
||||
}
|
||||
}while(re_parse == true);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
char* GetNextTag( FILE* File, char* tag )
|
||||
{
|
||||
|
||||
char c = SkipGetChar( File );
|
||||
|
||||
if (c == EOF)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
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))
|
||||
{
|
||||
if( (*dst == ' ') || (*dst == '[') || (*dst == '{') || (*dst == '\t') || (*dst == '\n')|| (*dst == '\r') )
|
||||
{
|
||||
*dst = 0;
|
||||
break;
|
||||
}
|
||||
dst++;
|
||||
}
|
||||
|
||||
|
||||
//DBG( printf( "tag %s\n", tag ) );
|
||||
c = SkipGetChar( File );
|
||||
|
||||
if (c != EOF)
|
||||
{
|
||||
// Puts again the read char in the buffer
|
||||
ungetc( c, File );
|
||||
}
|
||||
}
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
|
||||
int read_NotImplemented( FILE* File, char closeChar)
|
||||
{
|
||||
char c;
|
||||
//DBG( printf( "look for %c\n", closeChar) );
|
||||
while( (c = fgetc( File )) != EOF )
|
||||
{
|
||||
if( c == '{' )
|
||||
{
|
||||
//DBG( printf( "{\n") );
|
||||
read_NotImplemented( File, '}' );
|
||||
} else if( c == '[' )
|
||||
{
|
||||
//DBG( printf( "[\n") );
|
||||
read_NotImplemented( File, ']' );
|
||||
} else if( c == closeChar )
|
||||
{
|
||||
//DBG( printf( "%c\n", closeChar) );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
DBG( printf( " NotImplemented failed\n" ) );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int parseVertexList( FILE* File, std::vector< glm::vec3 > &dst_vector)
|
||||
{
|
||||
//DBG( printf( " parseVertexList\n" ) );
|
||||
|
||||
dst_vector.clear();
|
||||
|
||||
glm::vec3 vertex;
|
||||
while( parseVertex ( File, vertex ) == 3 )
|
||||
{
|
||||
dst_vector.push_back( vertex );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int parseVertex( FILE* File, glm::vec3 &dst_vertex )
|
||||
{
|
||||
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;
|
||||
|
||||
char s = SkipGetChar( File );
|
||||
|
||||
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) );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int parseFloat( FILE* File, float *dst_float )
|
||||
{
|
||||
float value;
|
||||
int ret = fscanf( File, "%e", &value );
|
||||
*dst_float = value;
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.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
|
||||
* 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 vrml_aux.h
|
||||
*/
|
||||
|
||||
#ifndef _VRML_AUX_H
|
||||
#define _VRML_AUX_H
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <common.h>
|
||||
#include <macros.h>
|
||||
#include <base_struct.h>
|
||||
#include <gal/opengl/glm/glm.hpp>
|
||||
#include <vector>
|
||||
#include <kicad_string.h>
|
||||
#include <info3d_visu.h>
|
||||
#ifdef __WXMAC__
|
||||
# ifdef __DARWIN__
|
||||
# include <OpenGL/glu.h>
|
||||
# else
|
||||
# include <glu.h>
|
||||
# endif
|
||||
#else
|
||||
# include <GL/glu.h>
|
||||
#endif
|
||||
#include <wx/glcanvas.h>
|
||||
|
||||
int read_NotImplemented( FILE* File, char closeChar);
|
||||
char SkipGetChar ( FILE* File );
|
||||
int parseVertexList( FILE* File, std::vector< glm::vec3 > &dst_vector);
|
||||
int parseVertex( FILE* File, glm::vec3 &dst_vertex );
|
||||
int parseFloat( FILE* File, float *dst_float );
|
||||
char* GetNextTag( FILE* File, char* tag );
|
||||
|
||||
#endif
|
|
@ -0,0 +1,444 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.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
|
||||
* 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 vrml_v1_modelparser.cpp
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <vector>
|
||||
#include <macros.h>
|
||||
#include <kicad_string.h>
|
||||
#include <info3d_visu.h>
|
||||
|
||||
#include "3d_struct.h"
|
||||
#include "modelparsers.h"
|
||||
#include "vrml_aux.h"
|
||||
|
||||
VRML1_MODEL_PARSER::VRML1_MODEL_PARSER( S3D_MASTER* aMaster ) :
|
||||
S3D_MODEL_PARSER( aMaster )
|
||||
{
|
||||
m_model = NULL;
|
||||
m_file = NULL;
|
||||
}
|
||||
|
||||
|
||||
VRML1_MODEL_PARSER::~VRML1_MODEL_PARSER()
|
||||
{
|
||||
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
||||
{
|
||||
delete childs[idx];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void VRML1_MODEL_PARSER::Load( const wxString aFilename )
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
|
||||
m_file = wxFopen( aFilename, wxT( "rt" ) );
|
||||
|
||||
if( m_file == NULL )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
glShadeModel( GL_SMOOTH );
|
||||
glEnable( GL_NORMALIZE );
|
||||
|
||||
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
|
||||
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 );
|
||||
|
||||
|
||||
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
|
||||
|
||||
//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 );
|
||||
|
||||
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
||||
SetLocaleTo_C_standard();
|
||||
|
||||
childs.clear();
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
|
||||
if ( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
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() ) );
|
||||
|
||||
if( GetMaster()->IsOpenGlAllowed() )
|
||||
{
|
||||
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
||||
{
|
||||
childs[idx]->openGL_RenderAllChilds();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int VRML1_MODEL_PARSER::read_separator()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( "Separator\n" ) );
|
||||
|
||||
while( GetNextTag( m_file, text) )
|
||||
{
|
||||
|
||||
if( strcmp( text, "Material" ) == 0 )
|
||||
{
|
||||
readMaterial( );
|
||||
} else if( strcmp( text, "Coordinate3" ) == 0 )
|
||||
{
|
||||
readCoordinate3();
|
||||
} else if( strcmp( text, "IndexedFaceSet" ) == 0 )
|
||||
{
|
||||
readIndexedFaceSet();
|
||||
} else if( strcmp( text, "Separator" ) == 0 )
|
||||
{
|
||||
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;
|
||||
|
||||
// recursive
|
||||
read_separator();
|
||||
|
||||
m_model = parent;
|
||||
}else if ( ( *text != '}' ) )
|
||||
{
|
||||
//DBG( printf( "read_NotImplemented %s\n", text ) );
|
||||
read_NotImplemented( m_file, '}');
|
||||
} else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readMaterial()
|
||||
{
|
||||
char text[128];
|
||||
S3D_MATERIAL* material = NULL;
|
||||
|
||||
//DBG( printf( " readMaterial\n" ) );
|
||||
|
||||
wxString mat_name;
|
||||
|
||||
material = new S3D_MATERIAL( GetMaster(), mat_name );
|
||||
|
||||
GetMaster()->Insert( material );
|
||||
|
||||
m_model->m_Materials = material;
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "ambientColor" ) == 0 )
|
||||
{
|
||||
readMaterial_ambientColor();
|
||||
} else if( strcmp( text, "diffuseColor" ) == 0 )
|
||||
{
|
||||
readMaterial_diffuseColor( );
|
||||
} else if( strcmp( text, "emissiveColor" ) == 0 )
|
||||
{
|
||||
readMaterial_emissiveColor( );
|
||||
}else if( strcmp( text, "specularColor" ) == 0 )
|
||||
{
|
||||
readMaterial_specularColor( );
|
||||
}else if( strcmp( text, "shininess" ) == 0 )
|
||||
{
|
||||
readMaterial_shininess( );
|
||||
}else if( strcmp( text, "transparency" ) == 0 )
|
||||
{
|
||||
readMaterial_transparency( );
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readCoordinate3( )
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " readCoordinate3\n" ) );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "point" ) == 0 )
|
||||
{
|
||||
readCoordinate3_point( );
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readIndexedFaceSet( )
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " readIndexedFaceSet\n" ) );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "coordIndex" ) == 0 )
|
||||
{
|
||||
readIndexedFaceSet_coordIndex( );
|
||||
} else if( strcmp( text, "materialIndex" ) == 0 )
|
||||
{
|
||||
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_diffuseColor( )
|
||||
{
|
||||
//DBG( printf( " readMaterial_diffuseColor\n" ) );
|
||||
|
||||
return parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor);
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readMaterial_emissiveColor( )
|
||||
{
|
||||
//DBG( printf( " readMaterial_emissiveColor\n" ) );
|
||||
|
||||
int ret = parseVertexList( m_file, m_model->m_Materials->m_EmissiveColor);
|
||||
|
||||
if( GetMaster()->m_use_modelfile_emissiveColor == false)
|
||||
{
|
||||
m_model->m_Materials->m_EmissiveColor.clear();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readMaterial_specularColor()
|
||||
{
|
||||
//DBG( printf( " readMaterial_specularColor\n" ) );
|
||||
|
||||
int ret = parseVertexList( m_file, m_model->m_Materials->m_SpecularColor );
|
||||
|
||||
if( GetMaster()->m_use_modelfile_specularColor == false)
|
||||
{
|
||||
m_model->m_Materials->m_SpecularColor.clear();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readMaterial_shininess( )
|
||||
{
|
||||
//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
|
||||
shininess_value = shininess_value * 128.0f;
|
||||
m_model->m_Materials->m_Shininess.push_back( shininess_value );
|
||||
}
|
||||
|
||||
if( GetMaster()->m_use_modelfile_shininess == false )
|
||||
{
|
||||
m_model->m_Materials->m_Shininess.clear();
|
||||
}
|
||||
|
||||
//DBG( printf( " m_Shininess.size: %ld\n", m_model->m_Materials->m_Shininess.size() ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readMaterial_transparency()
|
||||
{
|
||||
//DBG( printf( " readMaterial_transparency\n" ) );
|
||||
|
||||
m_model->m_Materials->m_Transparency.clear();
|
||||
|
||||
float tmp;
|
||||
while( fscanf (m_file, "%f,", &tmp) )
|
||||
{
|
||||
m_model->m_Materials->m_Transparency.push_back( tmp );
|
||||
}
|
||||
|
||||
if( GetMaster()->m_use_modelfile_transparency == false )
|
||||
{
|
||||
m_model->m_Materials->m_Transparency.clear();
|
||||
}
|
||||
|
||||
//DBG( printf( " m_Transparency.size: %ld\n", m_model->m_Materials->m_Transparency.size() ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readCoordinate3_point()
|
||||
{
|
||||
//DBG( printf( " readCoordinate3_point\n" ) );
|
||||
|
||||
if( parseVertexList( m_file, m_model->m_Point ) == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readIndexedFaceSet_coordIndex()
|
||||
{
|
||||
//DBG( printf( " readIndexedFaceSet_coordIndex\n" ) );
|
||||
|
||||
m_model->m_CoordIndex.clear();
|
||||
|
||||
glm::ivec3 coord;
|
||||
|
||||
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;
|
||||
|
||||
coord_list.resize( 3 );
|
||||
coord_list[0] = coord[0];
|
||||
coord_list[1] = coord[1];
|
||||
coord_list[2] = coord[2];
|
||||
|
||||
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 ) );
|
||||
}
|
||||
|
||||
if (dummy != -1)
|
||||
{
|
||||
//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() ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML1_MODEL_PARSER::readIndexedFaceSet_materialIndex()
|
||||
{
|
||||
//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() ) );
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,766 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
|
||||
* Copyright (C) 2013 Tuomas Vaherkoski <tuomasvaherkoski@gmail.com>
|
||||
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* 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 vrml_v2_modelparser.cpp
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <vector>
|
||||
#include <macros.h>
|
||||
#include <kicad_string.h>
|
||||
#include <info3d_visu.h>
|
||||
|
||||
#include "3d_struct.h"
|
||||
#include "modelparsers.h"
|
||||
#include "vrml_aux.h"
|
||||
|
||||
VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MASTER* aMaster ) :
|
||||
S3D_MODEL_PARSER( aMaster )
|
||||
{
|
||||
m_model = NULL;
|
||||
}
|
||||
|
||||
|
||||
VRML2_MODEL_PARSER::~VRML2_MODEL_PARSER()
|
||||
{
|
||||
for(unsigned int idx = 0; idx < childs.size(); idx++)
|
||||
{
|
||||
delete childs[idx];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void VRML2_MODEL_PARSER::Load( const wxString aFilename )
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
|
||||
m_file = wxFopen( aFilename, wxT( "rt" ) );
|
||||
|
||||
if( m_file == NULL )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
glShadeModel(GL_SMOOTH);
|
||||
glEnable(GL_NORMALIZE);
|
||||
|
||||
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
|
||||
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 );
|
||||
|
||||
|
||||
#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 );
|
||||
|
||||
glScalef( matScale.x, matScale.y, matScale.z );
|
||||
|
||||
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
||||
SetLocaleTo_C_standard();
|
||||
|
||||
childs.clear();
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
|
||||
if( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strcmp( text, "Transform" ) == 0 )
|
||||
{
|
||||
m_model = new S3D_MESH();
|
||||
|
||||
childs.push_back( m_model );
|
||||
|
||||
read_Transform();
|
||||
|
||||
} else if( strcmp( text, "DEF" ) == 0 )
|
||||
{
|
||||
m_model = new S3D_MESH();
|
||||
|
||||
childs.push_back( m_model );
|
||||
|
||||
read_DEF();
|
||||
}
|
||||
}
|
||||
|
||||
fclose( m_file );
|
||||
SetLocaleTo_Default(); // revert to the current locale
|
||||
|
||||
|
||||
//DBG( printf( "chils size:%lu\n", childs.size() ) );
|
||||
|
||||
if( GetMaster()->IsOpenGlAllowed() )
|
||||
{
|
||||
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
||||
{
|
||||
childs[idx]->openGL_RenderAllChilds();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Transform()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( "Transform\n" ) );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
//DBG( printf( " } Exit Transform\n" ) );
|
||||
break;
|
||||
}
|
||||
if( strcmp( text, "translation" ) == 0 )
|
||||
{
|
||||
parseVertex( m_file, m_model->m_translation );
|
||||
} 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 )
|
||||
{
|
||||
parseVertex( m_file, m_model->m_scale );
|
||||
} 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 )
|
||||
{
|
||||
parseVertex( m_file, m_model->m_center );
|
||||
} else if( strcmp( text, "children" ) == 0 )
|
||||
{
|
||||
// skip
|
||||
} else if( strcmp( text, "Switch" ) == 0 )
|
||||
{
|
||||
// skip
|
||||
} 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();
|
||||
|
||||
m_model->childs.push_back( new_mesh_model );
|
||||
|
||||
m_model = new_mesh_model;
|
||||
|
||||
read_Shape();
|
||||
|
||||
m_model = parent;
|
||||
|
||||
} else if( strcmp( text, "DEF" ) == 0 )
|
||||
{
|
||||
read_DEF();
|
||||
} else
|
||||
{
|
||||
DBG( printf( " %s NotImplemented\n", text ) );
|
||||
read_NotImplemented( m_file, '}' );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_DEF()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
GetNextTag( m_file, text);
|
||||
//DBG( printf( "DEF %s ", text ) );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
//DBG( printf( " skiping %c\n", *text) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( ( *text == '}' ) )
|
||||
{
|
||||
//DBG( printf( " } Exit DEF\n") );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "Transform" ) == 0 )
|
||||
{
|
||||
return read_Transform ();
|
||||
} else if( strcmp( text, "children" ) == 0 )
|
||||
{
|
||||
// skip
|
||||
} else if( strcmp( text, "Switch" ) == 0 )
|
||||
{
|
||||
// skip
|
||||
} else if( strcmp( text, "whichChoice" ) == 0 )
|
||||
{
|
||||
// skip
|
||||
} else if( strcmp( text, "choice" ) == 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 );
|
||||
|
||||
m_model = new_mesh_model;
|
||||
|
||||
read_Shape();
|
||||
|
||||
m_model = parent;
|
||||
}
|
||||
}
|
||||
|
||||
DBG( printf( " DEF failed\n" ) );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Shape()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " Shape\n") );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
//DBG( printf( " } Exit Shape\n") );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "appearance" ) == 0 )
|
||||
{
|
||||
//skip
|
||||
} else if( strcmp( text, "Appearance" ) == 0 )
|
||||
{
|
||||
read_Appearance();
|
||||
} else if( strcmp( text, "geometry" ) == 0 )
|
||||
{
|
||||
//skip
|
||||
} else if( strcmp( text, "IndexedFaceSet" ) == 0 )
|
||||
{
|
||||
read_IndexedFaceSet();
|
||||
} else
|
||||
{
|
||||
DBG( printf( " %s NotImplemented\n", text ) );
|
||||
read_NotImplemented( m_file, '}' );
|
||||
}
|
||||
}
|
||||
|
||||
DBG( printf( " Shape failed\n") );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Appearance()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " Appearance\n") );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "material" ) == 0 )
|
||||
{
|
||||
read_material();
|
||||
}
|
||||
}
|
||||
|
||||
DBG( printf( " Appearance failed\n") );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_material()
|
||||
{
|
||||
S3D_MATERIAL* material = NULL;
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " material ") );
|
||||
|
||||
if( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if( strcmp( text, "Material" ) == 0 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
//DBG( printf( "DEF") );
|
||||
|
||||
if( GetNextTag( m_file, text ) )
|
||||
{
|
||||
//DBG( printf( "%s", text ) );
|
||||
|
||||
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 ) )
|
||||
{
|
||||
if( strcmp( text, "Material" ) == 0 )
|
||||
{
|
||||
return read_Material();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if( strcmp( text, "USE" ) == 0 )
|
||||
{
|
||||
//DBG( printf( "USE") );
|
||||
|
||||
if( GetNextTag( m_file, text ) )
|
||||
{
|
||||
//DBG( printf( "%s\n", text ) );
|
||||
|
||||
wxString mat_name;
|
||||
mat_name = FROM_UTF8( text );
|
||||
|
||||
for( material = GetMaster()->m_Materials; material; material = material->Next() )
|
||||
{
|
||||
if( material->m_Name == mat_name )
|
||||
{
|
||||
m_model->m_Materials = material;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
DBG( printf( " read_material error: material not found\n" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DBG( printf( " failed material\n") );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Material()
|
||||
{
|
||||
char text[128];
|
||||
glm::vec3 vertex;
|
||||
|
||||
//DBG( printf( " Material\n") );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "diffuseColor" ) == 0 )
|
||||
{
|
||||
//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 )
|
||||
{
|
||||
//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 )
|
||||
{
|
||||
//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 )
|
||||
{
|
||||
float ambientIntensity;
|
||||
parseFloat( m_file, &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 ) );
|
||||
}
|
||||
} else if( strcmp( text, "transparency" ) == 0 )
|
||||
{
|
||||
float transparency;
|
||||
parseFloat( m_file, &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 )
|
||||
{
|
||||
float shininess;
|
||||
parseFloat( m_file, &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 )
|
||||
{
|
||||
shininess = shininess * 128.0f;
|
||||
m_model->m_Materials->m_Shininess.push_back( shininess );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DBG( printf( " Material failed\n") );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_IndexedFaceSet()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " IndexedFaceSet\n") );
|
||||
|
||||
m_normalPerVertex = false;
|
||||
colorPerVertex = false;
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
//DBG( printf( " } Exit IndexedFaceSet\n") );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "normalPerVertex" ) == 0 )
|
||||
{
|
||||
if( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if( strcmp( text, "TRUE" ) == 0 )
|
||||
{
|
||||
//DBG( printf( " m_normalPerVertex TRUE\n") );
|
||||
m_normalPerVertex = true;
|
||||
}
|
||||
}
|
||||
} else if( strcmp( text, "colorPerVertex" ) == 0 )
|
||||
{
|
||||
GetNextTag( m_file, text );
|
||||
if( strcmp( text, "TRUE" ) )
|
||||
{
|
||||
//DBG( printf( " colorPerVertex = true\n") );
|
||||
colorPerVertex = true;
|
||||
} else
|
||||
{
|
||||
colorPerVertex = false;
|
||||
}
|
||||
|
||||
} else if( strcmp( text, "Coordinate" ) == 0 )
|
||||
{
|
||||
read_Coordinate();
|
||||
} else if( strcmp( text, "Normal" ) == 0 )
|
||||
{
|
||||
read_Normal();
|
||||
} else if( strcmp( text, "normalIndex" ) == 0 )
|
||||
{
|
||||
read_NormalIndex();
|
||||
} else if( strcmp( text, "Color" ) == 0 )
|
||||
{
|
||||
read_Color();
|
||||
} else if( strcmp( text, "coordIndex" ) == 0 )
|
||||
{
|
||||
read_coordIndex();
|
||||
} else if( strcmp( text, "colorIndex" ) == 0 )
|
||||
{
|
||||
read_colorIndex();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
DBG( printf( " IndexedFaceSet failed %s\n", text) );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_colorIndex()
|
||||
{
|
||||
//DBG( printf( " read_colorIndex\n" ) );
|
||||
|
||||
m_model->m_MaterialIndex.clear();
|
||||
|
||||
if( colorPerVertex == true )
|
||||
{
|
||||
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
|
||||
{
|
||||
first_index = index;
|
||||
}
|
||||
}
|
||||
} 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() ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_NormalIndex()
|
||||
{
|
||||
//DBG( printf( " read_NormalIndex\n" ) );
|
||||
|
||||
m_model->m_NormalIndex.clear();
|
||||
|
||||
glm::ivec3 coord;
|
||||
|
||||
int dummy; // should be -1
|
||||
|
||||
std::vector<int> coord_list;
|
||||
coord_list.clear();
|
||||
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()) );
|
||||
coord_list.clear();
|
||||
} else
|
||||
{
|
||||
coord_list.push_back( dummy );
|
||||
//DBG( printf( "%d ", dummy) );
|
||||
}
|
||||
}
|
||||
|
||||
//DBG( printf( " m_NormalIndex.size: %ld\n", m_model->m_NormalIndex.size() ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_coordIndex()
|
||||
{
|
||||
//DBG( printf( " read_coordIndex\n" ) );
|
||||
|
||||
m_model->m_CoordIndex.clear();
|
||||
|
||||
glm::ivec3 coord;
|
||||
|
||||
int dummy; // should be -1
|
||||
|
||||
std::vector<int> coord_list;
|
||||
coord_list.clear();
|
||||
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()) );
|
||||
coord_list.clear();
|
||||
} else
|
||||
{
|
||||
coord_list.push_back( dummy );
|
||||
//DBG( printf( "%d ", dummy) );
|
||||
}
|
||||
}
|
||||
|
||||
//DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Color()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " read_Color\n") );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
//DBG( printf( " m_DiffuseColor.size: %ld\n", m_model->m_Materials->m_DiffuseColor.size() ) );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "color" ) == 0 )
|
||||
{
|
||||
parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor );
|
||||
}
|
||||
}
|
||||
|
||||
//DBG( printf( " read_Color failed\n") );
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Normal()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " Normal\n") );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
//DBG( printf( " m_PerFaceNormalsNormalized.size: %lu\n", m_model->m_PerFaceNormalsNormalized.size() ) );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( strcmp( text, "vector" ) == 0 )
|
||||
{
|
||||
if(m_normalPerVertex == false )
|
||||
{
|
||||
parseVertexList( m_file, m_model->m_PerFaceNormalsNormalized );
|
||||
} else
|
||||
{
|
||||
parseVertexList( m_file, m_model->m_PerVertexNormalsNormalized );
|
||||
|
||||
//DBG( printf( " m_PerVertexNormalsNormalized.size: %lu\n", m_model->m_PerVertexNormalsNormalized.size() ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML2_MODEL_PARSER::read_Coordinate()
|
||||
{
|
||||
char text[128];
|
||||
|
||||
//DBG( printf( " Coordinate\n") );
|
||||
|
||||
while( GetNextTag( m_file, text ) )
|
||||
{
|
||||
if ( ( text == NULL ) || ( *text == ']' ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ( *text == '}' ) )
|
||||
{
|
||||
//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);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
* Copyright (C) 2013 Tuomas Vaherkoski <tuomasvaherkoski@gmail.com>
|
||||
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
* 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
|
||||
|
@ -37,23 +37,34 @@
|
|||
#include "3d_struct.h"
|
||||
#include "modelparsers.h"
|
||||
|
||||
// separator chars
|
||||
static const char* sep_chars = " \t\n\r";
|
||||
|
||||
VRML_MODEL_PARSER::VRML_MODEL_PARSER( S3D_MASTER* aMaster ) :
|
||||
S3D_MODEL_PARSER( aMaster )
|
||||
{}
|
||||
{
|
||||
vrml1_parser = new VRML1_MODEL_PARSER( aMaster );
|
||||
vrml2_parser = new VRML2_MODEL_PARSER( aMaster );
|
||||
}
|
||||
|
||||
|
||||
VRML_MODEL_PARSER::~VRML_MODEL_PARSER()
|
||||
{}
|
||||
{
|
||||
if( vrml1_parser )
|
||||
{
|
||||
delete vrml1_parser;
|
||||
}
|
||||
if( vrml2_parser )
|
||||
{
|
||||
delete vrml2_parser;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void VRML_MODEL_PARSER::Load( const wxString aFilename )
|
||||
{
|
||||
char line[1024], * text;
|
||||
char line[12];
|
||||
FILE* file;
|
||||
int LineNum = 0;
|
||||
|
||||
//DBG( printf( "Load %s", static_cast<const char*>(aFilename.mb_str()) ) );
|
||||
|
||||
file = wxFopen( aFilename, wxT( "rt" ) );
|
||||
|
||||
|
@ -62,488 +73,29 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
|
|||
return;
|
||||
}
|
||||
|
||||
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
||||
SetLocaleTo_C_standard();
|
||||
|
||||
while( GetLine( file, line, &LineNum, 512 ) )
|
||||
if( fgets( line, 11, file ) == NULL )
|
||||
{
|
||||
text = strtok( line, sep_chars );
|
||||
if ( text == NULL )
|
||||
continue;
|
||||
|
||||
if( stricmp( text, "DEF" ) == 0 || stricmp( text, "Group" ) == 0 )
|
||||
{
|
||||
while( GetLine( file, line, &LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, sep_chars );
|
||||
|
||||
if( text == NULL )
|
||||
continue;
|
||||
|
||||
if( *text == '}' )
|
||||
break;
|
||||
|
||||
if( stricmp( text, "children" ) == 0 )
|
||||
{
|
||||
readChildren( file, &LineNum );
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose( file );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
fclose( file );
|
||||
SetLocaleTo_Default(); // revert to the current locale
|
||||
}
|
||||
|
||||
|
||||
int VRML_MODEL_PARSER::readMaterial( FILE* file, int* LineNum )
|
||||
{
|
||||
char line[512], * text, * command;
|
||||
wxString mat_name;
|
||||
S3D_MATERIAL* material = NULL;
|
||||
|
||||
command = strtok( NULL, sep_chars );
|
||||
text = strtok( NULL, sep_chars );
|
||||
mat_name = FROM_UTF8( text );
|
||||
|
||||
if( stricmp( command, "USE" ) == 0 )
|
||||
|
||||
|
||||
if( stricmp( line, "#VRML V2.0" ) == 0)
|
||||
{
|
||||
for( material = GetMaster()->m_Materials; material; material = material->Next() )
|
||||
{
|
||||
if( material->m_Name == mat_name )
|
||||
{
|
||||
material->SetMaterial();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
//DBG( printf( "About to parser a #VRML V2.0 file\n" ) );
|
||||
vrml2_parser->Load( aFilename );
|
||||
|
||||
return;
|
||||
}
|
||||
else if( stricmp( line, "#VRML V1.0" ) == 0)
|
||||
{
|
||||
//DBG( printf( "About to parser a #VRML V1.0 file\n" ) );
|
||||
vrml1_parser->Load( aFilename );
|
||||
|
||||
DBG( printf( "ReadMaterial error: material not found\n" ) );
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if( stricmp( command, "DEF" ) == 0 || stricmp( command, "Material") == 0)
|
||||
{
|
||||
material = new S3D_MATERIAL( GetMaster(), mat_name );
|
||||
|
||||
GetMaster()->Insert( material );
|
||||
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, sep_chars );
|
||||
|
||||
if( text == NULL )
|
||||
continue;
|
||||
|
||||
if( text[0] == '}' )
|
||||
{
|
||||
material->SetMaterial();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( stricmp( text, "diffuseColor" ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_DiffuseColor.x = atof( text );
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_DiffuseColor.y = atof( text );
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_DiffuseColor.z = atof( text );
|
||||
}
|
||||
else if( stricmp( text, "emissiveColor" ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_EmissiveColor.x = atof( text );
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_EmissiveColor.y = atof( text );
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_EmissiveColor.z = atof( text );
|
||||
}
|
||||
else if( strnicmp( text, "specularColor", 13 ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_SpecularColor.x = atof( text );
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_SpecularColor.y = atof( text );
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_SpecularColor.z = atof( text );
|
||||
}
|
||||
else if( strnicmp( text, "ambientIntensity", 16 ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_AmbientIntensity = atof( text );
|
||||
}
|
||||
else if( strnicmp( text, "transparency", 12 ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_Transparency = atof( text );
|
||||
}
|
||||
else if( strnicmp( text, "shininess", 9 ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, sep_chars );
|
||||
material->m_Shininess = atof( text );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int VRML_MODEL_PARSER::readChildren( FILE* file, int* LineNum )
|
||||
{
|
||||
char line[1024], * text;
|
||||
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, sep_chars );
|
||||
|
||||
if( *text == ']' )
|
||||
return 0;
|
||||
|
||||
if( *text == ',' )
|
||||
continue;
|
||||
|
||||
if( stricmp( text, "Shape" ) == 0 )
|
||||
{
|
||||
readShape( file, LineNum );
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG( printf( "ReadChildren error line %d <%s> \n", *LineNum, text ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int VRML_MODEL_PARSER::readShape( FILE* file, int* LineNum )
|
||||
{
|
||||
char line[1024], * text;
|
||||
int err = 1;
|
||||
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, sep_chars );
|
||||
|
||||
if( *text == '}' )
|
||||
{
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if( stricmp( text, "appearance" ) == 0 )
|
||||
{
|
||||
readAppearance( file, LineNum );
|
||||
}
|
||||
else if( stricmp( text, "geometry" ) == 0 )
|
||||
{
|
||||
readGeometry( file, LineNum );
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG( printf( "ReadShape error line %d <%s> \n", *LineNum, text ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
|
||||
{
|
||||
char line[1024], * text;
|
||||
int err = 1;
|
||||
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, sep_chars );
|
||||
|
||||
if( *text == '}' )
|
||||
{
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if( stricmp( text, "material" ) == 0 )
|
||||
{
|
||||
readMaterial( file, LineNum );
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG( printf( "ReadAppearance error line %d <%s> \n", *LineNum, text ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
void VRML_MODEL_PARSER::readCoordsList( FILE* file, char* text_buffer,
|
||||
std::vector< double >& aList, int* LineNum )
|
||||
{
|
||||
unsigned int ii = 0, jj = 0;
|
||||
char* text;
|
||||
bool HasData = false;
|
||||
bool StartData = false;
|
||||
bool EndNode = false;
|
||||
char string_num[512];
|
||||
|
||||
text = text_buffer;
|
||||
|
||||
while( !EndNode )
|
||||
{
|
||||
if( *text == 0 ) // Needs data !
|
||||
{
|
||||
text = text_buffer;
|
||||
GetLine( file, text_buffer, LineNum, 512 );
|
||||
}
|
||||
|
||||
while( !EndNode && *text )
|
||||
{
|
||||
switch( *text )
|
||||
{
|
||||
case '[':
|
||||
StartData = true;
|
||||
jj = 0;
|
||||
string_num[jj] = 0;
|
||||
break;
|
||||
|
||||
case '}':
|
||||
EndNode = true;
|
||||
break;
|
||||
|
||||
case ']':
|
||||
case '\t':
|
||||
case ' ':
|
||||
case ',':
|
||||
jj = 0;
|
||||
|
||||
if( !StartData || !HasData )
|
||||
break;
|
||||
|
||||
aList.push_back( atof( string_num ) );
|
||||
string_num[jj] = 0;
|
||||
ii++;
|
||||
|
||||
HasData = false;
|
||||
|
||||
if( *text == ']' )
|
||||
{
|
||||
StartData = false;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
if( !StartData )
|
||||
break;
|
||||
|
||||
if( jj >= sizeof( string_num ) )
|
||||
break;
|
||||
|
||||
string_num[jj] = *text;
|
||||
jj++;
|
||||
string_num[jj] = 0;
|
||||
HasData = true;
|
||||
break;
|
||||
}
|
||||
|
||||
text++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
|
||||
{
|
||||
char line[1024], buffer[1024], * text;
|
||||
int err = 1;
|
||||
std::vector< double > points;
|
||||
std::vector< double > list;
|
||||
double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
|
||||
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
strcpy( buffer, line );
|
||||
text = strtok( buffer, sep_chars );
|
||||
|
||||
if( text == NULL )
|
||||
continue;
|
||||
|
||||
if( *text == '}' )
|
||||
{
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if( stricmp( text, "normalPerVertex" ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, " ,\t\n\r" );
|
||||
|
||||
if( text && stricmp( text, "true" ) == 0 )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "colorPerVertex" ) == 0 )
|
||||
{
|
||||
text = strtok( NULL, " ,\t\n\r" );
|
||||
|
||||
if( text && stricmp( text, "true" ) == 0 )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "normal" ) == 0 )
|
||||
{
|
||||
readCoordsList( file, line, list, LineNum );
|
||||
list.clear();
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "normalIndex" ) == 0 )
|
||||
{
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, " ,\t\n\r" );
|
||||
|
||||
while( text )
|
||||
{
|
||||
if( *text == ']' )
|
||||
break;
|
||||
|
||||
text = strtok( NULL, " ,\t\n\r" );
|
||||
}
|
||||
|
||||
if( text && (*text == ']') )
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "color" ) == 0 )
|
||||
{
|
||||
readCoordsList( file, line, list, LineNum );
|
||||
list.clear();
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "solid" ) == 0 )
|
||||
{
|
||||
// ignore solid
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "colorIndex" ) == 0 )
|
||||
{
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
text = strtok( line, " ,\t\n\r" );
|
||||
|
||||
while( text )
|
||||
{
|
||||
if( *text == ']' )
|
||||
break;
|
||||
|
||||
text = strtok( NULL, " ,\t\n\r" );
|
||||
}
|
||||
|
||||
if( text && (*text == ']') )
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if( stricmp( text, "coord" ) == 0 )
|
||||
{
|
||||
readCoordsList( file, line, points, LineNum );
|
||||
}
|
||||
else if( stricmp( text, "coordIndex" ) == 0 )
|
||||
{
|
||||
if( points.size() < 3 || points.size() % 3 != 0 )
|
||||
{
|
||||
wxLogError( wxT( "3D geometry read error <%s> at line %d." ),
|
||||
GetChars( FROM_UTF8( text ) ), *LineNum );
|
||||
err = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
std::vector< int > coordIndex;
|
||||
std::vector< S3D_VERTEX > vertices;
|
||||
|
||||
while( GetLine( file, line, LineNum, 512 ) )
|
||||
{
|
||||
int jj;
|
||||
text = strtok( line, " ,\t\n\r" );
|
||||
|
||||
while( text )
|
||||
{
|
||||
if( *text == ']' )
|
||||
break;
|
||||
|
||||
jj = atoi( text );
|
||||
|
||||
if( jj < 0 )
|
||||
{
|
||||
for( jj = 0; jj < (int) coordIndex.size(); jj++ )
|
||||
{
|
||||
int kk = coordIndex[jj] * 3;
|
||||
|
||||
if( (kk < 0) || ((kk + 3) > (int)points.size()) )
|
||||
{
|
||||
wxLogError( wxT( "3D geometry index read error <%s> at line %d." ),
|
||||
GetChars( FROM_UTF8( text ) ), *LineNum );
|
||||
err = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
S3D_VERTEX vertex;
|
||||
vertex.x = points[kk];
|
||||
vertex.y = points[kk + 1];
|
||||
vertex.z = points[kk + 2];
|
||||
vertices.push_back( vertex );
|
||||
}
|
||||
|
||||
GetMaster()->Set_Object_Coords( vertices );
|
||||
Set_Object_Data( vertices, vrmlunits_to_3Dunits );
|
||||
vertices.clear();
|
||||
coordIndex.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
coordIndex.push_back( jj );
|
||||
}
|
||||
|
||||
text = strtok( NULL, " ,\t\n\r" );
|
||||
}
|
||||
|
||||
if( text && (*text == ']') )
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wxLogError( wxT( "3D geometry read error <%s> at line %d." ),
|
||||
GetChars( FROM_UTF8( text ) ), *LineNum );
|
||||
err = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
DBG( printf( "Unknown VRML file format: %s\n", line ) );
|
||||
}
|
||||
|
|
|
@ -66,6 +66,36 @@ 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;
|
||||
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 );
|
||||
|
||||
|
||||
#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 );
|
||||
|
||||
glScalef( matScale.x, matScale.y, matScale.z );
|
||||
|
||||
// Switch the locale to standard C (needed to print floating point numbers)
|
||||
LOCALE_IO toggle;
|
||||
|
||||
childs.clear();
|
||||
|
||||
// Shapes are inside of Transform nodes
|
||||
// Transform node contains information about
|
||||
// transition, scale and rotation of the shape
|
||||
|
@ -76,12 +106,25 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
|
|||
node_it != transforms.end();
|
||||
node_it++ )
|
||||
{
|
||||
m_model = new S3D_MESH();
|
||||
childs.push_back( m_model );
|
||||
|
||||
readTransform( *node_it );
|
||||
}
|
||||
|
||||
//DBG( printf( "chils size:%lu\n", childs.size() ) );
|
||||
|
||||
if( GetMaster()->IsOpenGlAllowed() )
|
||||
{
|
||||
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
||||
{
|
||||
childs[idx]->openGL_RenderAllChilds();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
wxString X3D_MODEL_PARSER::VRML_representation()
|
||||
wxString X3D_MODEL_PARSER::VRML2_representation()
|
||||
{
|
||||
wxString output;
|
||||
|
||||
|
@ -188,6 +231,8 @@ void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode )
|
|||
|
||||
void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
|
||||
{
|
||||
glm::vec3 color;
|
||||
|
||||
PROPERTY_MAP properties;
|
||||
GetNodeProperties( aMatNode, properties );
|
||||
|
||||
|
@ -199,30 +244,42 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
|
|||
S3D_MATERIAL* material = new S3D_MATERIAL( GetMaster(), properties[ wxT( "DEF" ) ] );
|
||||
GetMaster()->Insert( material );
|
||||
|
||||
m_model->m_Materials = material;
|
||||
|
||||
if( !parseDoubleTriplet( properties[ wxT( "diffuseColor" ) ],
|
||||
material->m_DiffuseColor ) )
|
||||
color ) )
|
||||
{
|
||||
DBG( printf("diffuseColor parsing error") );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_model->m_Materials->m_DiffuseColor.push_back( color );
|
||||
}
|
||||
|
||||
if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ],
|
||||
material->m_SpecularColor ) )
|
||||
if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ], color ) )
|
||||
{
|
||||
DBG( printf("specularColor parsing error") );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_model->m_Materials->m_SpecularColor.push_back( color );
|
||||
}
|
||||
|
||||
if( !parseDoubleTriplet( properties[ wxT( "emissiveColor" ) ],
|
||||
material->m_EmissiveColor ) )
|
||||
if( !parseDoubleTriplet( properties[ wxT( "emissiveColor" ) ], color ) )
|
||||
{
|
||||
DBG( printf("emissiveColor parsing error") );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_model->m_Materials->m_EmissiveColor.push_back( color );
|
||||
}
|
||||
|
||||
wxStringTokenizer values;
|
||||
values.SetString( properties[ wxT( "ambientIntensity" ) ] );
|
||||
|
||||
if( values.GetNextToken().ToDouble( &amb ) )
|
||||
{
|
||||
material->m_AmbientIntensity = amb;
|
||||
m_model->m_Materials->m_AmbientColor.push_back( glm::vec3( amb, amb, amb ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -233,7 +290,9 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
|
|||
|
||||
if( values.GetNextToken().ToDouble( &shine ) )
|
||||
{
|
||||
material->m_Shininess = shine;
|
||||
// VRML value is normalized and openGL expects a value 0 - 128
|
||||
shine = shine * 128.0f;
|
||||
m_model->m_Materials->m_Shininess.push_back( shine );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -244,15 +303,13 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
|
|||
|
||||
if( values.GetNextToken().ToDouble( &transp ) )
|
||||
{
|
||||
material->m_Transparency = transp;
|
||||
m_model->m_Materials->m_Transparency.push_back( transp );
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG( printf( "trans error") );
|
||||
}
|
||||
|
||||
material->SetMaterial();
|
||||
|
||||
// VRML
|
||||
wxString vrml_material;
|
||||
PROPERTY_MAP::const_iterator p = ++properties.begin(); // skip DEF
|
||||
|
@ -278,32 +335,33 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
|
|||
wxString vrml_material;
|
||||
|
||||
vrml_material.Append( wxString::Format( wxT( "specularColor %f %f %f\n" ),
|
||||
material->m_SpecularColor.x,
|
||||
material->m_SpecularColor.y,
|
||||
material->m_SpecularColor.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.x,
|
||||
material->m_DiffuseColor.y,
|
||||
material->m_DiffuseColor.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.x,
|
||||
material->m_EmissiveColor.y,
|
||||
material->m_EmissiveColor.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_AmbientIntensity ) );
|
||||
material->m_AmbientColor[0].x ) );
|
||||
|
||||
vrml_material.Append( wxString::Format( wxT( "shininess %f\n"),
|
||||
material->m_Shininess ) );
|
||||
material->m_Shininess[0] ) );
|
||||
|
||||
vrml_material.Append( wxString::Format( wxT( "transparency %f\n"),
|
||||
material->m_Transparency ) );
|
||||
material->m_Transparency[0] ) );
|
||||
|
||||
vrml_materials.push_back( vrml_material );
|
||||
|
||||
material->SetMaterial();
|
||||
m_model->m_Materials = material;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -318,9 +376,17 @@ bool X3D_MODEL_PARSER::parseDoubleTriplet( const wxString& aData,
|
|||
{
|
||||
wxStringTokenizer tokens(aData);
|
||||
|
||||
return tokens.GetNextToken().ToDouble( &aResult.x ) &&
|
||||
tokens.GetNextToken().ToDouble( &aResult.y ) &&
|
||||
tokens.GetNextToken().ToDouble( &aResult.z );
|
||||
double x,y,z;
|
||||
|
||||
bool ret = tokens.GetNextToken().ToDouble( &x ) &&
|
||||
tokens.GetNextToken().ToDouble( &y ) &&
|
||||
tokens.GetNextToken().ToDouble( &z );
|
||||
|
||||
aResult.x = x;
|
||||
aResult.y = y;
|
||||
aResult.z = z;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -373,16 +439,20 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
|
|||
double angle = 0.0;
|
||||
wxStringTokenizer tokens(aTransformProps[ wxT( "rotation" ) ]);
|
||||
|
||||
if( !(tokens.GetNextToken().ToDouble( &rotation.x ) &&
|
||||
tokens.GetNextToken().ToDouble( &rotation.y ) &&
|
||||
tokens.GetNextToken().ToDouble( &rotation.z ) &&
|
||||
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") );
|
||||
}
|
||||
|
||||
double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits *
|
||||
UNITS3D_TO_UNITSPCB;
|
||||
else
|
||||
{
|
||||
rotation.x = x;
|
||||
rotation.y = y;
|
||||
rotation.z = z;
|
||||
}
|
||||
|
||||
/* Step 2: Read all coordinate points
|
||||
* ---------------------------- */
|
||||
|
@ -439,7 +509,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
|
|||
point.y += translation.y;
|
||||
point.z += translation.z;
|
||||
|
||||
triplets.push_back(point);
|
||||
m_model->m_Point.push_back( point );
|
||||
|
||||
// VRML
|
||||
vrml_pointlist.Append( wxString::Format( wxT( "%f %f %f\n" ), point.x, point.y, point.z ) );
|
||||
|
@ -447,18 +517,71 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
|
|||
|
||||
vrml_points.push_back( vrml_pointlist );
|
||||
|
||||
|
||||
/* Step 3: Read all color points
|
||||
* ---------------------------- */
|
||||
std::vector< double > color_points;
|
||||
NODE_LIST color;
|
||||
GetChildsByName( aFaceNode, wxT( "Color" ), color);
|
||||
|
||||
// Some models lack color information, need to handle this safely
|
||||
if( !color.empty() )
|
||||
{
|
||||
PROPERTY_MAP color_properties;
|
||||
// IndexedFaceSet has one Coordinate child node
|
||||
GetNodeProperties( color[0], color_properties );
|
||||
|
||||
// Save points to vector as doubles
|
||||
wxStringTokenizer colorpoint_tokens( color_properties[ wxT("color") ] );
|
||||
double color_point = 0.0;
|
||||
|
||||
while( colorpoint_tokens.HasMoreTokens() )
|
||||
{
|
||||
if( colorpoint_tokens.GetNextToken().ToDouble( &color_point ) )
|
||||
{
|
||||
color_points.push_back( color_point );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxLogError( wxT( "Error converting to double" ) );
|
||||
}
|
||||
}
|
||||
|
||||
if( color_points.size() % 3 != 0 )
|
||||
{
|
||||
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 ] );
|
||||
|
||||
m_model->m_Materials->m_DiffuseColor.push_back( colorface );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* -- Read coordinate indexes -- */
|
||||
PROPERTY_MAP faceset_properties;
|
||||
GetNodeProperties( aFaceNode, faceset_properties );
|
||||
|
||||
std::vector< S3D_VERTEX > vertices;
|
||||
std::vector< int > coordIndex;
|
||||
|
||||
wxString coordIndex_str = faceset_properties[ wxT( "coordIndex" ) ];
|
||||
wxStringTokenizer index_tokens( coordIndex_str );
|
||||
|
||||
wxString vrml_coord_indx_list;
|
||||
|
||||
std::vector<int> coord_list;
|
||||
coord_list.clear();
|
||||
|
||||
while( index_tokens.HasMoreTokens() )
|
||||
{
|
||||
long index = 0;
|
||||
|
@ -470,25 +593,14 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
|
|||
{
|
||||
/* Step 4: Apply geometry to Master object
|
||||
* --------------------------------------- */
|
||||
std::vector<int>::const_iterator id;
|
||||
m_model->m_CoordIndex.push_back( coord_list );
|
||||
|
||||
for( id = coordIndex.begin();
|
||||
id != coordIndex.end();
|
||||
id++ )
|
||||
{
|
||||
vertices.push_back( triplets.at( *id ) );
|
||||
}
|
||||
|
||||
GetMaster()->Set_Object_Coords( vertices );
|
||||
Set_Object_Data( vertices, vrmlunits_to_3Dunits );
|
||||
|
||||
vertices.clear();
|
||||
coordIndex.clear();
|
||||
coord_list.clear();
|
||||
vrml_coord_indx_list.Append( wxT( "-1\n" ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
coordIndex.push_back( index );
|
||||
coord_list.push_back( index );
|
||||
vrml_coord_indx_list.Append( wxString::Format( wxT( "%u " ), index ) );
|
||||
}
|
||||
}
|
||||
|
|
127
CMakeLists.txt
|
@ -23,8 +23,9 @@ set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules )
|
|||
# reports.
|
||||
#
|
||||
|
||||
option( USE_KIWAY_DLLS
|
||||
"Build the major modules as KIFACE DLLs or DSOs, will soon be the norm." OFF )
|
||||
#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,
|
||||
|
@ -81,7 +82,7 @@ mark_as_advanced( KICAD_SKIP_BOOST ) # Normal builders should build Boost.
|
|||
# when not defined by user, the default is python.exe under Windows and python2 for others
|
||||
# python binary file should be is exec path.
|
||||
|
||||
option( BUILD_GITHUB_PLUGIN "Build the GITHUB_PLUGIN for pcbnew." OFF )
|
||||
option( BUILD_GITHUB_PLUGIN "Build the GITHUB_PLUGIN for pcbnew." ON )
|
||||
|
||||
# This can be set to a custom name to brag about a particular branch in the "About" dialog:
|
||||
set( KICAD_REPO_NAME "product" CACHE STRING "Name of the tree from which this build came." )
|
||||
|
@ -115,6 +116,12 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
|||
OUTPUT_VARIABLE GCC_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE )
|
||||
|
||||
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
||||
set( TO_LINKER -XLinker )
|
||||
else()
|
||||
set( TO_LINKER -Wl )
|
||||
endif()
|
||||
|
||||
# Establish -Wall early, so specialized relaxations of this may come
|
||||
# subsequently on the command line, such as in pcbnew/github/CMakeLists.txt
|
||||
set( CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}" )
|
||||
|
@ -149,6 +156,20 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
|||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden" )
|
||||
endif()
|
||||
|
||||
find_package( OpenMP QUIET )
|
||||
|
||||
if( OPENMP_FOUND )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}" )
|
||||
add_definitions( -DUSE_OPENMP )
|
||||
|
||||
# MinGW does not include the OpenMP link library and FindOpenMP.cmake does not
|
||||
# set it either. Not sure this is the most elegant solution but it works.
|
||||
if( MINGW )
|
||||
set( OPENMP_LIBRARIES gomp )
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if( MINGW )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "-s" )
|
||||
|
||||
|
@ -182,19 +203,20 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
|||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PIC_FLAG}" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PIC_FLAG}" )
|
||||
|
||||
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
||||
set( TO_LINKER -XLinker )
|
||||
else()
|
||||
set( TO_LINKER -Wl )
|
||||
endif()
|
||||
|
||||
# Thou shalt not link vaporware and tell us it's a valid DSO (apple ld doesn't support it)
|
||||
if( NOT APPLE )
|
||||
# Thou shalt not link vaporware and tell us it's a valid DSO (apple ld doesn't support it)
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "${TO_LINKER},--no-undefined" )
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "${TO_LINKER},--no-undefined" )
|
||||
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "-s" )
|
||||
|
||||
# Defeat ELF's ability to use the GOT to replace locally implemented functions
|
||||
# with ones from another module.
|
||||
# https://bugs.launchpad.net/kicad/+bug/1322354
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${TO_LINKER},-Bsymbolic" )
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${TO_LINKER},-Bsymbolic" )
|
||||
endif()
|
||||
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "-s" )
|
||||
endif()
|
||||
|
||||
# quiet GCC while in boost
|
||||
|
@ -208,16 +230,16 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
|||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__ASSERTMACROS__ -mmacosx-version-min=10.5" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__ASSERTMACROS__ -mmacosx-version-min=10.5" )
|
||||
|
||||
# Allows .dylib relocation in the future
|
||||
# Allows .dylib relocation in the future - needed by fixbundle
|
||||
set( CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -headerpad_max_install_names")
|
||||
|
||||
if( NOT CMAKE_CXX_COMPILER )
|
||||
EXEC_PROGRAM( wx-config ARGS --cc OUTPUT_VARIABLE CMAKE_C_COMPILER )
|
||||
endif( NOT CMAKE_CXX_COMPILER )
|
||||
endif()
|
||||
|
||||
if( NOT CMAKE_CXX_COMPILER )
|
||||
EXEC_PROGRAM( wx-config ARGS --cxx OUTPUT_VARIABLE CMAKE_CXX_COMPILER )
|
||||
endif( NOT CMAKE_CXX_COMPILER )
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
|
@ -333,7 +355,7 @@ include( ExternalProject )
|
|||
include( CheckFindPackageResult )
|
||||
|
||||
# Turn on wxWidgets compatibility mode for some classes
|
||||
add_definitions(-DWX_COMPATIBILITY)
|
||||
add_definitions( -DWX_COMPATIBILITY )
|
||||
|
||||
#######################
|
||||
# Find OpenGL library #
|
||||
|
@ -341,14 +363,20 @@ add_definitions(-DWX_COMPATIBILITY)
|
|||
find_package( OpenGL QUIET )
|
||||
check_find_package_result( OPENGL_FOUND "OpenGL" )
|
||||
|
||||
# Dick 5-Feb-2014:
|
||||
# Marco: We cannot use both ExternalProject_Add() add and find_package()
|
||||
# in the same CMake tree and have them both reference the same package:
|
||||
# http://stackoverflow.com/questions/6351609/cmake-linking-to-library-downloaded-from-externalproject-add
|
||||
# https://www.mail-archive.com/cmake@cmake.org/msg47501.html
|
||||
|
||||
# Handle target used to specify if a target needs wx-widgets or other libraries
|
||||
# Always defined, empty if no libraries are to be build
|
||||
# Always defined, empty if no libraries are to be built
|
||||
add_custom_target( lib-dependencies )
|
||||
|
||||
if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
|
||||
|
||||
# This should be build in all cases, if swig exec is not avaiable
|
||||
# will be impossible also enable SCRIPTING being for PCBNEW required immediatly
|
||||
# This should be built in all cases, if swig exec is not avaiable
|
||||
# will be impossible also enable SCRIPTING being for PCBNEW required immediately
|
||||
|
||||
include( download_pcre )
|
||||
include( download_swig )
|
||||
|
@ -373,8 +401,8 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
|
|||
|
||||
|
||||
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_WXPYTHON OR KICAD_SCRIPTING_MODULES )
|
||||
|
||||
message(STATUS "Scripting ENABLED")
|
||||
|
||||
message(STATUS "Scripting ENABLED")
|
||||
include( download_wxpython )
|
||||
|
||||
set( SWIG_EXECUTABLE ${SWIG_ROOT}/bin/swig )
|
||||
|
@ -424,7 +452,7 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
|
|||
|
||||
if( KICAD_BUILD_DYNAMIC AND APPLE )
|
||||
add_custom_target( osx_fix_bundles ALL DEPENDS cvpcb eeschema gerbview kicad pcbnew bitmap2component pcb_calculator pl_editor)
|
||||
add_custom_command(TARGET osx_fix_bundles POST_BUILD COMMAND scripts/osx_fixbundle.sh COMMENT "Migrating dylibs to bundles")
|
||||
add_custom_command(TARGET osx_fix_bundles POST_BUILD COMMAND ${PROJECT_SOURCE_DIR}/scripts/osx_fixbundle.sh ${PROJECT_SOURCE_DIR} COMMENT "Migrating dylibs to bundles")
|
||||
endif()
|
||||
|
||||
endif( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC)
|
||||
|
@ -432,14 +460,18 @@ endif( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC)
|
|||
#####################
|
||||
# Find GLEW library #
|
||||
#####################
|
||||
find_package(GLEW)
|
||||
check_find_package_result(GLEW_FOUND "GLEW")
|
||||
if( NOT GLEW_FOUND )
|
||||
find_package( GLEW )
|
||||
check_find_package_result( GLEW_FOUND "GLEW" )
|
||||
endif()
|
||||
|
||||
######################
|
||||
# Find Cairo library #
|
||||
######################
|
||||
find_package(Cairo 1.8.1 QUIET)
|
||||
check_find_package_result(CAIRO_FOUND "Cairo")
|
||||
if( NOT CAIRO_FOUND )
|
||||
find_package( Cairo 1.8.1 QUIET )
|
||||
check_find_package_result( CAIRO_FOUND "Cairo" )
|
||||
endif()
|
||||
|
||||
# Download boost and possibly build parts of it
|
||||
#################################################
|
||||
|
@ -451,6 +483,8 @@ if( KICAD_SKIP_BOOST )
|
|||
message( FATAL_ERROR "Boost 1.54+ libraries are required." )
|
||||
endif()
|
||||
|
||||
add_custom_target( boost ) # it is required to meet some further dependencies
|
||||
|
||||
message( WARNING "
|
||||
WARNING: You decided to skip building boost library.
|
||||
KiCad developers strongly advise you to build the bundled boost library, as it is known to work with KiCad.
|
||||
|
@ -466,6 +500,9 @@ endif()
|
|||
# application. You can figure out what libraries you need here;
|
||||
# http://www.wxwidgets.org/manuals/2.8/wx_librarieslist.html
|
||||
|
||||
# See line 41 of CMakeModules/FindwxWidgets.cmake
|
||||
set( wxWidgets_CONFIG_OPTIONS --static=no )
|
||||
|
||||
# On Apple only wxwidgets 2.9 or higher doesn't need to find aui part of base
|
||||
# Seems no more needed on wx-3
|
||||
if( APPLE AND ( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES OR KICAD_SCRIPTING_WXPYTHON) )
|
||||
|
@ -475,8 +512,8 @@ else()
|
|||
endif()
|
||||
|
||||
if( NOT (KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC) )
|
||||
check_find_package_result( wxWidgets_FOUND "wxWidgets" )
|
||||
endif( NOT (KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC) )
|
||||
check_find_package_result( wxWidgets_FOUND "wxWidgets" )
|
||||
endif()
|
||||
|
||||
# Include wxWidgets macros.
|
||||
include( ${wxWidgets_USE_FILE} )
|
||||
|
@ -524,15 +561,15 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
|
|||
set( PythonInterp_FIND_VERSION 2.6 )
|
||||
set( PythonLibs_FIND_VERSION 2.6 )
|
||||
endif()
|
||||
|
||||
|
||||
# force a python version < 3.0
|
||||
set( PythonInterp_FIND_VERSION 2.6)
|
||||
set( PythonLibs_FIND_VERSION 2.6 )
|
||||
|
||||
find_package( PythonInterp )
|
||||
|
||||
|
||||
check_find_package_result( PYTHONINTERP_FOUND "Python Interpreter" )
|
||||
|
||||
|
||||
if( NOT PYTHON_VERSION_MAJOR EQUAL 2 )
|
||||
message( FATAL_ERROR "Python 2.x is required." )
|
||||
endif()
|
||||
|
@ -595,7 +632,6 @@ add_subdirectory( 3d-viewer )
|
|||
add_subdirectory( cvpcb )
|
||||
add_subdirectory( eeschema )
|
||||
add_subdirectory( gerbview )
|
||||
add_subdirectory( kicad )
|
||||
add_subdirectory( lib_dxf )
|
||||
add_subdirectory( pcbnew )
|
||||
add_subdirectory( polygon )
|
||||
|
@ -603,9 +639,11 @@ add_subdirectory( pagelayout_editor )
|
|||
add_subdirectory( potrace )
|
||||
add_subdirectory( bitmap2component )
|
||||
add_subdirectory( pcb_calculator )
|
||||
add_subdirectory( kicad ) # should follow pcbnew, eeschema
|
||||
add_subdirectory( tools )
|
||||
add_subdirectory( utils )
|
||||
add_subdirectory( qa )
|
||||
|
||||
#add_subdirectory( new )
|
||||
|
||||
|
||||
|
@ -625,16 +663,16 @@ add_dependencies( pnsrouter boost )
|
|||
|
||||
|
||||
if ( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
|
||||
add_dependencies( pcbnew lib-dependencies )
|
||||
add_dependencies( eeschema lib-dependencies )
|
||||
add_dependencies( cvpcb lib-dependencies )
|
||||
add_dependencies( common lib-dependencies )
|
||||
add_dependencies( gal lib-dependencies )
|
||||
add_dependencies( pcbcommon lib-dependencies )
|
||||
add_dependencies( 3d-viewer lib-dependencies )
|
||||
add_dependencies( pcad2kicadpcb lib-dependencies )
|
||||
add_dependencies( pl_editor lib-dependencies )
|
||||
add_dependencies( pnsrouter lib-dependencies )
|
||||
add_dependencies( pcbnew lib-dependencies )
|
||||
add_dependencies( eeschema lib-dependencies )
|
||||
add_dependencies( cvpcb lib-dependencies )
|
||||
add_dependencies( common lib-dependencies )
|
||||
add_dependencies( gal lib-dependencies )
|
||||
add_dependencies( pcbcommon lib-dependencies )
|
||||
add_dependencies( 3d-viewer lib-dependencies )
|
||||
add_dependencies( pcad2kicadpcb lib-dependencies )
|
||||
add_dependencies( pl_editor lib-dependencies )
|
||||
add_dependencies( pnsrouter lib-dependencies )
|
||||
endif()
|
||||
|
||||
if ( KICAD_BUILD_DYNAMIC )
|
||||
|
@ -658,6 +696,13 @@ if( DOXYGEN_FOUND )
|
|||
DEPENDS Doxyfile
|
||||
COMMENT "building doxygen docs into directory Documentation/doxygen/html"
|
||||
)
|
||||
add_custom_target( dev-docs
|
||||
${CMAKE_COMMAND} -E remove_directory Documentation/development/doxygen
|
||||
COMMAND ${DOXYGEN_EXECUTABLE}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/development
|
||||
DEPENDS Doxyfile
|
||||
COMMENT "building developer's resource docs into directory Documentation/development/doxygen/html"
|
||||
)
|
||||
else()
|
||||
message( STATUS "WARNING: Doxygen not found - doxygen-docs (Source Docs) target not created" )
|
||||
endif()
|
||||
|
|
|
@ -38,6 +38,12 @@
|
|||
# Where the library is to be installed.
|
||||
set( PREFIX ${DOWNLOAD_DIR}/avhttp )
|
||||
|
||||
if( KICAD_SKIP_BOOST )
|
||||
set( AVHTTP_DEPEND "" )
|
||||
else()
|
||||
set( AVHTTP_DEPEND "boost" )
|
||||
endif()
|
||||
|
||||
|
||||
# Install the AVHTTP header only library ${PREFIX}
|
||||
ExternalProject_Add( avhttp
|
||||
|
@ -46,7 +52,7 @@ ExternalProject_Add( avhttp
|
|||
|
||||
# grab it from a local zip file for now, cmake caller's source dir
|
||||
URL ${CMAKE_CURRENT_SOURCE_DIR}/avhttp-master.zip
|
||||
DEPENDS boost
|
||||
DEPENDS ${AVHTTP_DEPEND}
|
||||
|
||||
CONFIGURE_COMMAND ""
|
||||
|
||||
|
|
|
@ -59,7 +59,9 @@ set( BOOST_LIBS_BUILT
|
|||
)
|
||||
#-----</configure>---------------------------------------------------------------
|
||||
|
||||
find_package( BZip2 REQUIRED )
|
||||
if( NOT BZIP2_FOUND )
|
||||
find_package( BZip2 REQUIRED )
|
||||
endif()
|
||||
|
||||
string( REGEX REPLACE "\\." "_" BOOST_VERS "${BOOST_RELEASE}" )
|
||||
set( PREFIX ${DOWNLOAD_DIR}/boost_${BOOST_VERS} )
|
||||
|
@ -99,7 +101,17 @@ else()
|
|||
endif()
|
||||
|
||||
|
||||
if( MINGW )
|
||||
find_program(patch_bin NAMES patch patch.exe)
|
||||
|
||||
if( "${patch_bin}" STREQUAL "patch_bin-NOTFOUND" )
|
||||
set( PATCH_STR_CMD ${PATCH_STR_CMD} )
|
||||
else()
|
||||
set( PATCH_STR_CMD ${patch_bin} -p0 -i )
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
if( MINGW AND NOT CMAKE_HOST_UNIX ) # building for MINGW on windows not UNIX
|
||||
if( MSYS )
|
||||
# The Boost system does not build properly on MSYS using bootstrap.sh. Running
|
||||
# bootstrap.bat with cmd.exe does. It's ugly but it works. At least for Boost
|
||||
|
@ -113,14 +125,16 @@ if( MINGW )
|
|||
set( b2_libs ${b2_libs} --with-${lib} )
|
||||
endforeach()
|
||||
unset( BOOST_CFLAGS )
|
||||
|
||||
else()
|
||||
string( REGEX REPLACE "\\;" "," libs_csv "${boost_libs_list}" )
|
||||
#message( STATUS "libs_csv:${libs_csv}" )
|
||||
|
||||
set( bootstrap ./bootstrap.sh --with-libraries=${libs_csv} )
|
||||
# pass to *both* C and C++ compilers
|
||||
set( BOOST_CFLAGS "cflags=${PIC_FLAG}" )
|
||||
set( BOOST_INCLUDE "${BOOST_ROOT}/include" )
|
||||
set( BOOST_CFLAGS "cflags=${PIC_FLAG}" )
|
||||
set( BOOST_CXXFLAGS "cxxflags=${PIC_FLAG}" )
|
||||
set( BOOST_INCLUDE "${BOOST_ROOT}/include" )
|
||||
unset( b2_libs )
|
||||
endif()
|
||||
|
||||
|
@ -173,7 +187,7 @@ ExternalProject_Add( boost
|
|||
|
||||
URL http://downloads.sourceforge.net/project/boost/boost/${BOOST_RELEASE}/boost_${BOOST_VERS}.tar.bz2
|
||||
DOWNLOAD_DIR "${DOWNLOAD_DIR}"
|
||||
TIMEOUT 600 # 10 minutes
|
||||
TIMEOUT 1200 # 20 minutes
|
||||
URL_MD5 ${BOOST_MD5}
|
||||
# If download fails, then enable "LOG_DOWNLOAD ON" and try again.
|
||||
# Upon a second failure with logging enabled, then look at these logs:
|
||||
|
@ -193,25 +207,25 @@ ExternalProject_Add( boost
|
|||
# bzr revert is insufficient to remove "added" files:
|
||||
COMMAND bzr clean-tree -q --force
|
||||
|
||||
COMMAND bzr patch -p0 "${PROJECT_SOURCE_DIR}/patches/boost_minkowski.patch"
|
||||
COMMAND bzr patch -p0 "${PROJECT_SOURCE_DIR}/patches/boost_cstdint.patch"
|
||||
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_minkowski.patch"
|
||||
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_cstdint.patch"
|
||||
|
||||
COMMAND bzr patch -p0 "${PROJECT_SOURCE_DIR}/patches/boost_macosx_x86.patch" #https://svn.boost.org/trac/boost/ticket/8266
|
||||
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_macosx_x86.patch" #https://svn.boost.org/trac/boost/ticket/8266
|
||||
# tell bzr about "added" files by last patch:
|
||||
COMMAND bzr add libs/context/src/asm/jump_i386_x86_64_sysv_macho_gas.S
|
||||
COMMAND bzr add libs/context/src/asm/make_i386_x86_64_sysv_macho_gas.S
|
||||
|
||||
COMMAND bzr patch -p0 "${PROJECT_SOURCE_DIR}/patches/boost_macosx_x86_build.patch" #https://svn.boost.org/trac/boost/ticket/8266
|
||||
COMMAND bzr patch -p0 "${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_macosx_x86_build.patch" #https://svn.boost.org/trac/boost/ticket/8266
|
||||
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_macosx_older_openssl.patch" #https://svn.boost.org/trac/boost/ticket/9273
|
||||
|
||||
COMMAND bzr patch -p0 "${PROJECT_SOURCE_DIR}/patches/boost_mingw.patch" #https://svn.boost.org/trac/boost/ticket/7262
|
||||
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/boost_mingw.patch" #https://svn.boost.org/trac/boost/ticket/7262
|
||||
# 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
|
||||
COMMAND bzr add libs/context/src/asm/make_x86_64_ms_pe_gas.S
|
||||
COMMAND bzr add libs/context/src/asm/jump_x86_64_ms_pe_gas.S
|
||||
|
||||
COMMAND bzr patch -p0 "${PROJECT_SOURCE_DIR}/patches/patch_macosx_context_ppc_v2.patch" #https://svn.boost.org/trac/boost/ticket/8266
|
||||
COMMAND ${PATCH_STR_CMD} "${PROJECT_SOURCE_DIR}/patches/patch_macosx_context_ppc_v2.patch" #https://svn.boost.org/trac/boost/ticket/8266
|
||||
COMMAND bzr add libs/context/build/Jamfile.v2
|
||||
COMMAND bzr add libs/context/build/architecture.jam
|
||||
COMMAND bzr add libs/context/src/asm/jump_combined_sysv_macho_gas.S
|
||||
|
|
|
@ -33,7 +33,9 @@ set( CAIRO_ROOT "${PROJECT_SOURCE_DIR}/cairo_root" )
|
|||
|
||||
#-----</configure>---------------------------------------------------------------
|
||||
|
||||
find_package( BZip2 REQUIRED )
|
||||
if( NOT BZIP2_FOUND )
|
||||
find_package( BZip2 REQUIRED )
|
||||
endif()
|
||||
|
||||
set( PREFIX ${DOWNLOAD_DIR}/cairo )
|
||||
|
||||
|
@ -42,7 +44,7 @@ if ( KICAD_BUILD_STATIC )
|
|||
endif( KICAD_BUILD_STATIC )
|
||||
|
||||
|
||||
if (APPLE)
|
||||
if (APPLE)
|
||||
|
||||
set( CAIRO_CFLAGS "CFLAGS=" )
|
||||
set( CAIRO_LDFLAGS "LDFLAGS=-framework CoreServices -framework Cocoa" )
|
||||
|
@ -94,8 +96,14 @@ ExternalProject_Add( cairo
|
|||
|
||||
#BINARY_DIR "${PREFIX}"
|
||||
|
||||
BUILD_COMMAND $(MAKE)
|
||||
BUILD_COMMAND $(MAKE)
|
||||
|
||||
INSTALL_DIR "${CAIRO_ROOT}"
|
||||
INSTALL_COMMAND $(MAKE) install
|
||||
)
|
||||
|
||||
# match these with whatever FindCairo.cmake sets
|
||||
# Dick i'vent set it because /lib and /lib64 issue in non multiarch binaries OSs
|
||||
#set( CAIRO_FOUND true )
|
||||
set( CAIRO_INCLUDE_DIR ${CAIRO_ROOT}/include )
|
||||
set( CAIRO_LIBRARIES ${CAIRO_ROOT}/lib )
|
||||
|
|
|
@ -33,11 +33,13 @@ set( GLEW_ROOT "${PROJECT_SOURCE_DIR}/glew_root" )
|
|||
|
||||
#-----</configure>---------------------------------------------------------------
|
||||
|
||||
find_package( BZip2 REQUIRED )
|
||||
if( NOT BZIP2_FOUND )
|
||||
find_package( BZip2 REQUIRED )
|
||||
endif()
|
||||
|
||||
set( PREFIX ${DOWNLOAD_DIR}/glew )
|
||||
|
||||
if (APPLE)
|
||||
if (APPLE)
|
||||
if( CMAKE_OSX_ARCHITECTURES )
|
||||
set( GLEW_CFLAGS "CFLAGS.EXTRA=-arch ${CMAKE_OSX_ARCHITECTURES} -mmacosx-version-min=10.5" )
|
||||
set( GLEW_LDFLAGS "LDFLAGS.EXTRA=-arch ${CMAKE_OSX_ARCHITECTURES} -mmacosx-version-min=10.5" )
|
||||
|
|
|
@ -42,6 +42,14 @@ if( CMAKE_TOOLCHAIN_FILE )
|
|||
set( TOOLCHAIN "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" )
|
||||
endif()
|
||||
|
||||
FIND_PROGRAM (patch_bin NAMES patch.exe patch)
|
||||
|
||||
if( "${patch_bin}" STREQUAL "patch_bin-NOTFOUND" )
|
||||
set( PATCH_STR_CMD bzr patch -p0 )
|
||||
else()
|
||||
set( PATCH_STR_CMD ${patch_bin} -p0 -i )
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(
|
||||
openssl
|
||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
|
@ -58,13 +66,13 @@ ExternalProject_Add(
|
|||
# PATCH_COMMAND patch -p0 < ${PROJECT_SOURCE_DIR}/patches/openssl-1.0.1e.patch
|
||||
|
||||
# This one requires the bzr commit below, since bzr patch only knows a working tree.
|
||||
|
||||
|
||||
# Revert the branch to pristine before applying patch sets as bzr patch
|
||||
# fails when applying a patch to the branch twice and doesn't have a switch
|
||||
# to ignore previously applied patches
|
||||
PATCH_COMMAND bzr revert
|
||||
# PATCH_COMMAND continuation (any *_COMMAND here can be continued with COMMAND):
|
||||
COMMAND bzr patch -p0 ${PROJECT_SOURCE_DIR}/patches/openssl-1.0.1e.patch
|
||||
COMMAND ${PATCH_STR_CMD} ${PROJECT_SOURCE_DIR}/patches/openssl-1.0.1e.patch
|
||||
|
||||
CONFIGURE_COMMAND
|
||||
${CMAKE_COMMAND}
|
||||
|
|
|
@ -33,13 +33,15 @@ set( PIXMAN_ROOT "${PROJECT_SOURCE_DIR}/pixman_root" )
|
|||
|
||||
#-----</configure>---------------------------------------------------------------
|
||||
|
||||
find_package( BZip2 REQUIRED )
|
||||
if( NOT BZIP2_FOUND )
|
||||
find_package( BZip2 REQUIRED )
|
||||
endif()
|
||||
|
||||
set( PREFIX ${DOWNLOAD_DIR}/pixman )
|
||||
|
||||
set(PIXMAN_CPPFLAGS "CFLAGS=")
|
||||
|
||||
if (APPLE)
|
||||
if (APPLE)
|
||||
if( CMAKE_OSX_ARCHITECTURES )
|
||||
set(PIXMAN_CPPFLAGS "${PIXMAN_CPPFLAGS} -arch ${CMAKE_OSX_ARCHITECTURES} -fno-common -mmacosx-version-min=10.5")
|
||||
else()
|
||||
|
|
|
@ -33,7 +33,9 @@ set( PKGCONFIG_ROOT "${PROJECT_SOURCE_DIR}/pkgconfig_root" )
|
|||
|
||||
#-----</configure>---------------------------------------------------------------
|
||||
|
||||
find_package( BZip2 REQUIRED )
|
||||
if( NOT BZIP2_FOUND )
|
||||
find_package( BZip2 REQUIRED )
|
||||
endif()
|
||||
|
||||
set( PREFIX ${DOWNLOAD_DIR}/pkgconfig )
|
||||
|
||||
|
|
|
@ -46,6 +46,10 @@ if (APPLE)
|
|||
STRING(REGEX REPLACE " -arch " "," LIBWXPYTHON_ARCHITECTURES ${CMAKE_OSX_ARCHITECTURES})
|
||||
SET( LIBWXPYTHON_OPTS ${LIBWXPYTHON_OPTS} --mac_arch=${LIBWXPYTHON_ARCHITECTURES})
|
||||
endif( CMAKE_OSX_ARCHITECTURES )
|
||||
|
||||
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
|
||||
SET( LIBWXPYTHON_PRECMD export CFLAGS=-Qunused-arguments && )
|
||||
endif()
|
||||
endif(APPLE)
|
||||
|
||||
if ( KICAD_BUILD_STATIC )
|
||||
|
@ -74,7 +78,7 @@ ExternalProject_Add( libwxpython
|
|||
UPDATE_COMMAND ${CMAKE_COMMAND} -E remove_directory "${LIBWXPYTHON_ROOT}"
|
||||
COMMAND ${LIBWXPYTHON_EXEC} wxPython/build-wxpython.py --clean
|
||||
|
||||
CONFIGURE_COMMAND ${LIBWXPYTHON_EXEC} wxPython/build-wxpython.py --prefix=${LIBWXPYTHON_ROOT} --unicode --install ${LIBWXPYTHON_OPTS}
|
||||
CONFIGURE_COMMAND ${LIBWXPYTHON_PRECMD} ${LIBWXPYTHON_EXEC} wxPython/build-wxpython.py --prefix=${LIBWXPYTHON_ROOT} --unicode --install ${LIBWXPYTHON_OPTS}
|
||||
|
||||
#BINARY_DIR "${PREFIX}"
|
||||
|
||||
|
|
|
@ -33,11 +33,13 @@ set( LIBWX_ROOT "${PROJECT_SOURCE_DIR}/libwx_root" )
|
|||
|
||||
#-----</configure>---------------------------------------------------------------
|
||||
|
||||
find_package( BZip2 REQUIRED )
|
||||
if( NOT BZIP2_FOUND )
|
||||
find_package( BZip2 REQUIRED )
|
||||
endif()
|
||||
|
||||
set( PREFIX ${DOWNLOAD_DIR}/libwx )
|
||||
|
||||
if (APPLE)
|
||||
if (APPLE)
|
||||
if( CMAKE_OSX_ARCHITECTURES )
|
||||
STRING(REGEX REPLACE " -arch " "," LIBWX_ARCHITECTURES ${CMAKE_OSX_ARCHITECTURES})
|
||||
SET( LIBWX_ARCHITECTURES --enable-universal_binary=${LIBWX_ARCHITECTURES})
|
||||
|
@ -80,7 +82,7 @@ ExternalProject_Add( libwx
|
|||
#SET directories
|
||||
set(wxWidgets_BIN_DIR ${LIBWX_ROOT}/bin)
|
||||
set(wxWidgets_CONFIG_EXECUTABLE ${LIBWX_ROOT}/bin/wx-config)
|
||||
set(wxWidgets_INCLUDE_DIRS ${LIBWX_ROOT}/include)
|
||||
set(wxWidgets_INCLUDE_DIRS ${LIBWX_ROOT}/include)
|
||||
set(wxWidgets_LIBRARY_DIRS ${LIBWX_ROOT}/lib)
|
||||
|
||||
|
||||
|
@ -110,7 +112,7 @@ ExternalProject_Add_Step( libwx bzr_init_libwx
|
|||
######
|
||||
|
||||
ExternalProject_Add_Step( libwx libwx_recursive_message
|
||||
COMMAND cmake .
|
||||
COMMAND cmake .
|
||||
COMMENT "*** RERUN CMAKE - wxWidgets built, now reissue a cmake to build Kicad"
|
||||
DEPENDEES install
|
||||
)
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
|
||||
KIWAY Build Symbols, Definitions and Intentions
|
||||
|
||||
|
||||
COMPILING_DLL:
|
||||
|
||||
This is a signal to import_export.h, and when present, toggles the
|
||||
interpretation of the #defines in that file. Its purpose should not be
|
||||
extended beyond this.
|
||||
|
||||
|
||||
USE_KIWAY_DLLS:
|
||||
|
||||
Comes from CMake as a user configuration variable, settable in the Cmake
|
||||
user interface. It decides if KiCad will be built with the *.kiface program
|
||||
modules.
|
||||
|
||||
|
||||
BUILD_KIWAY_DLL:
|
||||
|
||||
Comes from CMake, but at the 2nd tier, not the top tier. By 2nd tier,
|
||||
something like pcbnew/CMakeLists.txt, not /CMakeLists.txt is meant. It is
|
||||
not a user configuration variable. Instead, the 2nd tier CMakeLists.txt file
|
||||
looks at the top level USE_KIWAY_DLLS and decides how the object files under
|
||||
the 2nd tier's control will be built. If it decides it wants to march in
|
||||
lockstep with USE_KIWAY_DLLS, then this local CMakeLists.txt file may pass a
|
||||
defined BUILD_KIWAY_DLL (singular) on the compiler command line to the
|
||||
pertinent set of compilation steps under its control.
|
||||
|
|
@ -0,0 +1,761 @@
|
|||
# Road Map # {#mainpage}
|
||||
|
||||
This document is the KiCad Developer's road map document. It is a living
|
||||
document that should be maintained as the project progresses. The goal of
|
||||
this document is to provide an overview for developers of where the project
|
||||
is headed to prevent resource conflicts and endless rehashing of previously
|
||||
discussed topics. It is broken into sections for each major component of
|
||||
the KiCad source code and documentation. It defines tasks that developers
|
||||
an use to contribute to the project and provides updated status information.
|
||||
Tasks should define clear objective and avoid vague generalizations so that
|
||||
a new developer can complete the task. It is not a place for developers to
|
||||
add their own personal wish list It should only be updated with approval
|
||||
of the project manager after discussion with the lead developers.
|
||||
|
||||
Each entry in the road map is made up of four sections. The goal should
|
||||
be a brief description of the what the road map entry will accomplish. The
|
||||
task section should be a list of deliverable items that are specific enough
|
||||
hat they can be documented as completed. The dependencies sections is a list
|
||||
of requirements that must be completed before work can begin on any of the
|
||||
tasks. The status section should include a list of completed tasks or marked
|
||||
as complete as when the goal is met.
|
||||
|
||||
[TOC]
|
||||
|
||||
# Project # {#project}
|
||||
This section defines the tasks for the project related goals that are not
|
||||
related to coding or documentation. It is a catch all for issues such as
|
||||
developer and user relations, dissemination of information on websites,
|
||||
policies, etc.
|
||||
|
||||
## Stable Release ## {#stable_release}
|
||||
**Goal:**
|
||||
|
||||
Provide a lightweight stable release mechanism that is robust enough to meet
|
||||
the requirements of Linux packagers and corporate users but avoid the burden
|
||||
of back porting fixes to a maintenance branch to avoid the additional work for
|
||||
developers.
|
||||
|
||||
**Task:**
|
||||
- Devise a process to have some type of reasonably stable release protocol
|
||||
to provide "stable" releases for Linux distribution packagers and corporate
|
||||
users.
|
||||
- Document "stable" release procedure.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Initial planning stages.
|
||||
|
||||
|
||||
## Website Improvements ## {#website_improvements}
|
||||
**Goal:**
|
||||
|
||||
Make the website at www.kicad-pcb.org as the definitive resource for both
|
||||
users and developers which will provide a single point of reference instead
|
||||
of the many separate websites currently in used.
|
||||
|
||||
**Task:**
|
||||
- Define the content and design of the website.
|
||||
- Implement the new design.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
|
||||
# General # {#general}
|
||||
This section defines the tasks that affect all or most of KiCad or do not
|
||||
fit under as specific part of the code such as the board editor or the
|
||||
schematic editor.
|
||||
|
||||
## Convert to a Single Process Application. ## {#kiway}
|
||||
**Goal:**
|
||||
|
||||
Merge common schematic and board code into to separate dynamic objects to allow
|
||||
Eeschema and Pcbnew to run under a single process.
|
||||
|
||||
**Task:**
|
||||
- Convert the majority core code in Eeschema and Pcbnew into dynamic libraries.
|
||||
- Provide a robust method for communicating between code running under a single
|
||||
process.
|
||||
- Revise the schematic editor and board editor main windows run under a single
|
||||
process instead of multiple stand alone applications.
|
||||
- Design a method for passing information between the dynamic libraries running
|
||||
under the same process.
|
||||
- Remove inter-process communications between Eeschema and Pcbnew.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Stage 1 code released.
|
||||
- Stage 2 in process.
|
||||
|
||||
## User Interface Modernization ## {#wxaui}
|
||||
**Goal:**
|
||||
|
||||
Give KiCad a more modern user interface with dockable tool bars and windows.
|
||||
Create perspectives to allow users to arrange dockable windows as they prefer.
|
||||
|
||||
**Task:**
|
||||
- Take advantage of the advanced UI features in wxAui such as detaching and
|
||||
hiding.
|
||||
- Study ergonomics of various commercial/proprietary PCB applications (when
|
||||
in doubt about any particular UI solution, check how it has been done in a
|
||||
certain proprietary app that is very popular among OSHW folks and do exactly
|
||||
opposite).
|
||||
- Clean up menu structure. Menus must allow access to all features of the
|
||||
program in a clear and logical way. Currently some functions of Pcbnew are
|
||||
accessible only through tool bars
|
||||
- Redesign dialogs, make sure they are following same style rules.
|
||||
- Check quality of translations. Either fix or remove bad quality translations.
|
||||
- Develop a global shortcut manager that allows the user assign arbitrary
|
||||
shortcuts for any tool or action.
|
||||
|
||||
**Dependencies:**
|
||||
- [wxWidgets 3](#wxwidgets3)
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
|
||||
# Build Tools # {#build_tools}
|
||||
This section covers build tools for both the KiCad source as well as the
|
||||
custom dependency builds required to build KiCad.
|
||||
|
||||
## Create Separate Build Dependency Project ## {#depends_prj}
|
||||
**Goal:**
|
||||
|
||||
Move the library dependencies and their patches into a separate project to
|
||||
developers to build and install them as required instead of requiring them
|
||||
at build time. Give developers the flexibility to build and/or install
|
||||
library dependencies as they see fit. Remove them from the KiCad source code
|
||||
to reduce the build footprint.
|
||||
|
||||
**Task:**
|
||||
- Create a separate project to build all external dependency libraries that are
|
||||
currently build from source (Boost, OpenSSL, etc).
|
||||
- Use CMake to create a package configuration file for each library so the
|
||||
KiCad find package can pull in header paths, library dependencies, compile
|
||||
flags, and link flags to build KiCad.
|
||||
- Use CMake find package to pull external dependencies.
|
||||
- Remove all build from source dependencies for KiCad source code.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Initial concept discussions.
|
||||
|
||||
## Platform Binary Installers ## {#installers}
|
||||
**Goal:**
|
||||
|
||||
Provide quality installers for all supported platforms.
|
||||
|
||||
**Task:**
|
||||
- Bring OSX installer up to the level of the Window's and Linux installers.
|
||||
- Possible use of CPack to build platform specific installers as long as they
|
||||
are of the same or better quality than the current independent installers.
|
||||
|
||||
**Dependencies**
|
||||
- None
|
||||
|
||||
**Status**
|
||||
- No progress
|
||||
|
||||
|
||||
# Common Library # {#common_lib}
|
||||
This section covers the source code shared between all of the KiCad
|
||||
applications
|
||||
|
||||
## Unified Rendering Framework ## {#unified_rendering}
|
||||
**Goal:**
|
||||
|
||||
Provide a single framework for developing new tools. Port existing tools
|
||||
to the new framework and remove the legacy framework tools.
|
||||
|
||||
**Task:**
|
||||
- Port wxDC to GAL or get Cairo rendering to nearly the performance of the
|
||||
current wxDC rendering so that we have a single framework to develop new
|
||||
tools and we can continue to support systems that don't have a complete
|
||||
OpenGL stack.
|
||||
|
||||
**Dependencies**
|
||||
- [Tool framework](http://www.ohwr.org/projects/cern-kicad/wiki/WorkPackages)
|
||||
|
||||
**Status**
|
||||
- No progress
|
||||
|
||||
## Unified Geometry Library ## {#geometry_lib}
|
||||
**Goal:**
|
||||
|
||||
Select a single geometry library so that all applications share a common
|
||||
base for 2D objects. Remove any redundant geometry libraries and code to
|
||||
clean up code base.
|
||||
|
||||
**Task:**
|
||||
- Select the best geometry library (Boost, etc.) for the task.
|
||||
- Port all legacy geometry code to the selected library.
|
||||
- Remove any unused geometry library code.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- In progress as part of push and shove router.
|
||||
|
||||
## Conversion to wxWidgets 3 ## {#wxwidgets3}
|
||||
**Goal:**
|
||||
|
||||
Stop supporting the version 2 branch of wxWidgets so that newer features
|
||||
provided by version 3 can be utilized.
|
||||
|
||||
**Task:**
|
||||
- Make wxWidgets 3 a build requirement.
|
||||
- Remove all wxWidgets 2 specific code.
|
||||
|
||||
**Dependencies:**
|
||||
- wxWidgets 3 is widely available on Linux distributions.
|
||||
|
||||
**Status:**
|
||||
- No progress
|
||||
|
||||
## Linux Printing Improvements ## {#linux_print}
|
||||
**Goal:**
|
||||
|
||||
Bring printing on Linux up to par with printing on Windows.
|
||||
|
||||
**Task:**
|
||||
- Resolve Linux printing issues.
|
||||
|
||||
**Dependencies**
|
||||
- [wxWidgets 3](#wxwidgets3)
|
||||
|
||||
**Status**
|
||||
- No progress.
|
||||
|
||||
## Object Properties and Introspection ## {#object_props}
|
||||
**Goal:**
|
||||
|
||||
Provide an object introspection system using properties.
|
||||
|
||||
**Task:**
|
||||
- Select existing or develop property system.
|
||||
- Add definable properties to base objects.
|
||||
- Create introspection framework for manipulating object properties.
|
||||
- Serialization of properties to and from files and/or other I/O structures.
|
||||
- Create tool to edit property name/type/value table.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Dynamic Library Plugin ## {#plugin_base}
|
||||
**Goal:**
|
||||
|
||||
Create a base library plugin for handling external file I/O. This will allow
|
||||
plugins to be provided that are external to the project such as providing solid
|
||||
model file support (STEP, IGES, etc.) using OpenCascade without making it a
|
||||
project dependency.
|
||||
|
||||
**Task:**
|
||||
- Create a plugin to handle dynamically registered plugins for loading and
|
||||
saving file formats.
|
||||
- This object should be flexible enough to be extended for handling all file
|
||||
plugin types including schematic, board, footprint library, component
|
||||
library, etc.
|
||||
- See [blueprint](https://blueprints.launchpad.net/kicad/+spec/pluggable-file-io)
|
||||
on Launchpad for more information.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
|
||||
# KiCad: Application Launcher # {#kicad}
|
||||
This section applies to the source code for the KiCad application launcher.
|
||||
|
||||
|
||||
# Eeschema: Schematic Editor # {#eeschema}
|
||||
This section applies to the source code for the Eeschema schematic editor.
|
||||
|
||||
## Coherent SCHEMATIC Object ## {#sch_object}
|
||||
**Goal:**
|
||||
|
||||
Clean up the code related to the schematic object(s) into a coherent object for
|
||||
managing and manipulating the schematic.
|
||||
|
||||
**Task:**
|
||||
- Move most if not all of the code from SCH_SCREEN to the new SCHEMATIC object.
|
||||
- Add any missing functionality to the SCHEMATIC object.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Hierarchical Sheet Design ## {#hierarchy_fix}
|
||||
**Goal:**
|
||||
|
||||
Create a more robust sheet instance design rather than recreating them on the
|
||||
fly every time sheet information is required.
|
||||
|
||||
**Task:**
|
||||
- Choose a data structure to contain the sheet hierarchy.
|
||||
- Create helper class to manipulate the hierarchy data structure.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Schematic and Component Library Plugin ## {#sch_plugin}
|
||||
**Goal:**
|
||||
Create a plugin manager for loading and saving schematics and component
|
||||
libraries similar to the board plugin manager.
|
||||
|
||||
**Task:**
|
||||
- Design plugin manager for schematics and component libraries.
|
||||
- Port the current schematic and component library file formats to use the
|
||||
plugin.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#plugin_base)
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Graphics Abstraction Layer Conversion ## {#sch_gal}
|
||||
**Goal:**
|
||||
|
||||
Take advantage of advanced graphics rendering in Eeschema.
|
||||
|
||||
**Task:**
|
||||
- Port graphics rendering to GAL.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Port Editing Tools ## {#sch_tool_framework}
|
||||
**Goal:**
|
||||
|
||||
Use standard tool framework across all applications.
|
||||
|
||||
**Task:**
|
||||
- Rewrite editing tools using the new tool framework.
|
||||
|
||||
**Dependencies:**
|
||||
- [GAL port](#sch_gal).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## S-Expression File Format ## {#sch_sexpr}
|
||||
**Goal:**
|
||||
|
||||
Make schematic file format more readable, add new features, and take advantage
|
||||
of the s-expression capability used in Pcbnew.
|
||||
|
||||
**Task:**
|
||||
- Finalize feature set and file format.
|
||||
- Discuss the possibility of dropping the unit-less proposal temporarily to get
|
||||
the s-expression file format and SWEET library format implemented without
|
||||
completely rewriting Eeschema.
|
||||
- Add new s-expression file format to plugin.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#plugin_base).
|
||||
|
||||
**Status:**
|
||||
- File format document nearly complete.
|
||||
|
||||
## Implement Sweet Component Libraries ## {#sch_sweet}
|
||||
**Goal:**
|
||||
|
||||
Make component library design more robust and feature rich. Use s-expressions
|
||||
to make component library files more readable.
|
||||
|
||||
**Task:**
|
||||
- Use sweet component file format for component libraries.
|
||||
|
||||
**Dependencies:**
|
||||
- [S-expression file format](#sch_sexpr).
|
||||
|
||||
**Status:**
|
||||
- Initial SWEET library written.
|
||||
|
||||
## Component Library Editor Improvements ## {#lib_editor_usability}
|
||||
**Goal:**
|
||||
|
||||
Make editing components with multiple units and/or alternate graphical
|
||||
representations easier.
|
||||
|
||||
**Task:**
|
||||
- Determine usability improvements in the library editor for components with
|
||||
multiple units and/or alternate graphical representations.
|
||||
- Implement said useability improvements.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Component and Netlist Attributes ## {#netlist_attributes}
|
||||
**Goal:**
|
||||
Provide a method of passing information to other tools via the net list.
|
||||
|
||||
**Task:**
|
||||
- Add virtual components and attributes to netlist to define properties that
|
||||
can be used by other tools besides the board editor.
|
||||
|
||||
**Dependencies:**
|
||||
- [S-expression schematic file format](#sch_sexpr).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
|
||||
# CvPcb: Footprint Association Tool # {#cvpcb}
|
||||
This section covers the source code of the footprint assignment tool CvPcb.
|
||||
|
||||
## Footprint Assignment Tool ##
|
||||
**Goal:**
|
||||
|
||||
Merge the footprint assignment functionality of CvPcb into Eeschema so
|
||||
footprints can be assigned inside the schematic editor eliminating the need
|
||||
to launch an separate program.
|
||||
|
||||
**Task:**
|
||||
- Merge footprint assignment capability into Pcbnew shared library.
|
||||
- Remove CvPcb as a stand alone tool.
|
||||
- Add functionality to both the schematic and board editors so users can assign
|
||||
footprints as they prefer.
|
||||
|
||||
**Dependencies:**
|
||||
- [Convert to a single process application](#kiway).
|
||||
|
||||
**Status:**
|
||||
- Initial library conversion committed to product branch.
|
||||
|
||||
|
||||
# Pcbnew: Circuit Board Editor # {#pcbnew}
|
||||
This section covers the source code of the board editing application Pcbnew.
|
||||
|
||||
## Tool Framework ## {#pcb_tool_framework}
|
||||
**Goal:**
|
||||
|
||||
Unify all board editing tools under a single framework.
|
||||
|
||||
**Task:**
|
||||
- Complete porting of all board editing tools to new tool framework so they
|
||||
are available in the OpenGL and Cairo canvases.
|
||||
- Remove all duplicate legacy editing tools.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Initial porting work in progress.
|
||||
|
||||
## Linked Objects ## {#pcb_linked_objects}
|
||||
**Goal:**
|
||||
|
||||
Provide a way to allow external objects such as footprints to be externally
|
||||
linked in the board file so that changes in the footprint are automatically
|
||||
updated. This will all a one to many object relationship which can pave the
|
||||
way for real board modules.
|
||||
|
||||
**Task:**
|
||||
- Add externally and internally linked objects to the file format to allow for
|
||||
footprints and/or other board objects to be shared (one to many relationship)
|
||||
instead of only supporting embedded objects (one to one relationship) that
|
||||
can only be edited in place.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Modeling ## {#modeling}
|
||||
**Goal:**
|
||||
|
||||
Provide improved solid modeling support for KiCad including the file formats
|
||||
available in OpenCascade.
|
||||
|
||||
**Task:**
|
||||
- Design plugin architecture to handle loading and saving 3D models.
|
||||
- Back port existing 3D formats (IDF and S3D) to plugin
|
||||
- Add STEP 3D modeling capability.
|
||||
- Add IGES 3D modeling capability.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#plugin_base).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Push and Shove Router Improvements ## {#ps_router_improvements}
|
||||
**Goal:**
|
||||
Add features such as matched length and microwave tools to the P&S router.
|
||||
|
||||
**Task:**
|
||||
- Determine which features are feasible.
|
||||
- Look at the recently opened FreeRouter code at
|
||||
http://www.freerouting.net/fen/download/file.php?id=146 for inspiration.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Layer Improvements ## {#pcb_layers}
|
||||
**Goal:**
|
||||
|
||||
Increase the number of usable technical and user defined layers in Pcbnew.
|
||||
|
||||
**Task:**
|
||||
- Extend the number of copper and mechanical layers.
|
||||
- Develop a type safe flag set template or adapt something already available.
|
||||
- Refactor Pcbnew code to use new flag and remove the 32 layer limitation.
|
||||
- Extend the board file format to handle the additional layers.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Pin and Part Swapping ## {#pcb_drc}
|
||||
**Goal:**
|
||||
|
||||
Allow Pcbnew to perform pin and/or part swapping during layout so the user
|
||||
does not have to do it in Eeschema and re-import the net list.
|
||||
|
||||
**Task:**
|
||||
- Provide forward and back annotation between the schematic and board editors.
|
||||
- Define netlist file format changes required to handle pin/part swapping.
|
||||
- Update netlist file formatter and parser to handle file format changes.
|
||||
- Develop a netlist comparison engine that will produce a netlist diff that
|
||||
can be passed between the schematic and board editors.
|
||||
- Create pin/part swap dialog to manipulate swappable pins and parts.
|
||||
- Add support to handle net label back annotation changes.
|
||||
|
||||
**Dependencies:**
|
||||
- [S-expression schematic file format](#sch_sexpr).
|
||||
- [Convert to a single process application](#kiway).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Intelligent Selection Tool ## {#pcb_selection_tool}
|
||||
**Goal:**
|
||||
|
||||
Make the selection tool easier for the user to determine which object(s) are
|
||||
being selected.
|
||||
|
||||
**Task:**
|
||||
- Determine and define the actual desired behavior.
|
||||
- Improve ambiguous selections when multiple items are under the cursor or in
|
||||
the selection bounding box.
|
||||
|
||||
**Dependencies:**
|
||||
- Tool framework.
|
||||
- Unified geometry library.
|
||||
|
||||
**Status:**
|
||||
- Initial design committed to product branch.
|
||||
|
||||
## Clipboard Support ## {#fp_edit_clipboard}
|
||||
**Goal:**
|
||||
|
||||
Provide clipboard cut and paste for footprints..
|
||||
|
||||
**Task:**
|
||||
- Clipboard cut and paste to and from clipboard of footprints in footprint
|
||||
editor.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Design Rule Check (DRC) Improvements. ## {#drc_improvements}
|
||||
**Goal:**
|
||||
|
||||
Create additional DRC tests for improved error checking.
|
||||
|
||||
**Task:**
|
||||
- Replace geometry code with [unified geometry library](#geometry_lib).
|
||||
- Remove floating point code from clearance calculations to prevent rounding
|
||||
errors.
|
||||
- Add checks for component, silk screen, and mask clearances.
|
||||
- Remove DRC related limitations such as no arc or text on copper layers.
|
||||
- Add option for saving and loading DRC options.
|
||||
|
||||
**Dependencies:**
|
||||
- [Unified geometry library.](#geometry_lib)
|
||||
|
||||
**Progress:**
|
||||
- Planning
|
||||
|
||||
## Gerber File Attributes ## {#gerber_attributes}
|
||||
**Goal:**
|
||||
|
||||
Add file attributes to gerber files for defining layer stacks. See
|
||||
[this](http://www.ucamco.com/files/downloads/file/5/Extending_the_Gerber_Format_with_Attributes.pdf)
|
||||
document and [this](http://www.ucamco.com/files/downloads/file/22/Kick_Starting_a_Revolution_IPC-2581_Meets_Gerber.pdf)
|
||||
document for more information.
|
||||
|
||||
**Task:**
|
||||
- Implement gerber file attributes as an optional setting when plotting gerber
|
||||
files.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Progress:**
|
||||
- Under investigation.
|
||||
|
||||
|
||||
# GerbView: Gerber File Viewer # {#gerbview}
|
||||
|
||||
This section covers the source code for the GerbView gerber file viewer.
|
||||
|
||||
## Graphics Abstraction Layer ## {#gerbview_gal}
|
||||
**Goal:**
|
||||
|
||||
Graphics rendering unification.
|
||||
|
||||
**Task:**
|
||||
- Port graphics rendering layer to GAL.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status**
|
||||
- No progress.
|
||||
|
||||
# Documentation # {#documentation}
|
||||
This section defines the tasks for both the user and developer documentation.
|
||||
|
||||
## Conversion to Markup/down Format ## {#doc_format}
|
||||
**Goal:**
|
||||
|
||||
Make documentation more VCS friendly and separate document content and
|
||||
formatting for more uniform formatting across all user documentation.
|
||||
|
||||
**Task:**
|
||||
- Convert the documentation to a mark up/down language to reduce the VCS
|
||||
footprint, to be able to actually use the VCS to see what changed, and
|
||||
improve the formatting consistency.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- Started with this document.
|
||||
|
||||
## Grammar Check ## {#doc_grammar}
|
||||
**Goal:**
|
||||
|
||||
Improve user documentation readability and make life easier to for translators.
|
||||
|
||||
**Task:**
|
||||
- Review and revise all of the English documentation so that it is update with
|
||||
the current functionality of the code.
|
||||
- Translate the update documentation into other languages.
|
||||
|
||||
**Dependencies:**
|
||||
- None
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Maintenance ## {#doc_maintenance}
|
||||
**Task:**
|
||||
- Keep screen shots current with the source changes.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
## Convert Developer Documentation to Markup/down Format ## {#dev_doc_format}
|
||||
**Goal:**
|
||||
|
||||
Improve developers documentation to make life easier for new developers to get
|
||||
involved with the project.
|
||||
|
||||
**Task:**
|
||||
- Convert platform build instructions from plain text to new format to be
|
||||
merged with the developer documentation.
|
||||
- Convert how to contribute to KiCad instructions from plain text to the new
|
||||
format to merged with the developer documentation.
|
||||
|
||||
**Dependencies:**
|
||||
- None.
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
||||
|
||||
|
||||
# Unit Testing # {#unittest}
|
||||
**Goal:**
|
||||
|
||||
Improve the quality of KiCad and ensure changes do no break existing
|
||||
capabilities.
|
||||
|
||||
**Task:**
|
||||
- Explore the possibility of including a C++ unit test framework in addition
|
||||
to the existing Python framework.
|
||||
- Create robust enough test coverage to determine if code changes break any
|
||||
core functionality.
|
||||
|
||||
**Dependencies:**
|
||||
- Completion of the initial release of this document.
|
||||
|
||||
**Status:**
|
||||
- In progress.
|
||||
|
||||
|
||||
# Circuit Simulation # {#simulation}
|
||||
**Goal:**
|
||||
|
||||
Provide quality circuit simulation capabilities similar to commercial products.
|
||||
|
||||
**Task:**
|
||||
- Evaluate and select simulation library (spice, gnucap, qucs, etc).
|
||||
- Evaluate and select plotting library with wxWidgets support.
|
||||
- Confirm current spice netlist export is up to the task and add missing
|
||||
support for simulations.
|
||||
- Use plotting library to handle simulator output in a consistent manor similar
|
||||
to LTSpice.
|
||||
- Develop a tool that allows fine tuning of components on the fly.
|
||||
- Use plugin for the simulation code to allow support of different simulation
|
||||
libraries.
|
||||
- Create a library of simulation components such as voltage source, current
|
||||
source, current probe, etc.
|
||||
|
||||
**Dependencies:**
|
||||
- [Dynamic library plugin](#plugin_base).
|
||||
|
||||
**Status:**
|
||||
- No progress.
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
|
||||
pandoc -f markdown_mmd -t html interactive_router.mmd > interactive_router.html
|
||||
pandoc -f markdown_mmd -t latex interactive_router.mmd > tmp.tex
|
||||
pdflatex interactive_router.tex
|
|
@ -0,0 +1,73 @@
|
|||
# Interactive Router #
|
||||
|
||||
The Interactive Router lets you quickly and efficient route your PCBs by shoving off or walking around items on the PCB that collide with the trace you are currently drawing.
|
||||
|
||||
Following modes are supported:
|
||||
|
||||
- **Shove**, attempting to push and shove all items colliding with the currently routed track.
|
||||
- **Walk around**, trying to avoid obstacles by hugging/walking around them.
|
||||
- **Highlight collisions** which highlights all violating objects with a nice, shiny green color and shows violating clearance regions.
|
||||
|
||||
|
||||
## Setting up ##
|
||||
|
||||
Before using the Interactive Router, please set up these two things:
|
||||
- Clearance settings. To set the clearances, open the *Design Rules* dialog and make sure at least the default clearance
|
||||
value looks sensible.
|
||||
|
||||
- Enable OpenGL mode by selecting *View->Switch canvas to OpenGL* menu option or pressing **F11**.
|
||||
|
||||

|
||||
|
||||
## Laying out tracks ##
|
||||
|
||||
To activate the router tool press the *Interactive Router* button  or the **X** key.
|
||||
The cursor will turn into a cross and the tool name, will appear in the status bar.
|
||||
|
||||
To start a track, click on any item (a pad, track or a via) or press the **X** key again hovering the mouse over that item.
|
||||
The new track will use the net of the starting item. Clicking or pressing **X** on empty PCB space starts a track with no net assigned.
|
||||
|
||||
Move the mouse to define shape of the track. The router will try to follow mouse trail, hugging unmovable obstacles
|
||||
(such as pads) and shoving colliding traces/vias, depending on the mode. Retreating mouse cursor will cause the shoved items to spring back
|
||||
to their former locations.
|
||||
|
||||
Clicking on a pad/track/via in the same net finishes routing. Clicking in empty space fixes the segments routed so far and continues routing the trace.
|
||||
|
||||
In order to stop routing and undo all changes (shoved items, etc.), simply press **Esc**.
|
||||
|
||||
Pressing **V** or selecting *Place Through Via* from the context menu while routing a track attaches a via at the end of the trace being routed.
|
||||
Pressing **V** again disables via placement. Clicking in any spot establishes the via and continues routing.
|
||||
|
||||
Pressing **/** or selecting *Switch Track Posture* from the context menu toggles the direction of the initial track segment between straight or diagonal.
|
||||
|
||||
**Note**: By default, the router snaps to centers/axes of the items. Snapping can be disabled by holding **Shift** while routing or selecting items.
|
||||
|
||||
## Setting track widths and via sizes ##
|
||||
|
||||
There are several ways to pre-select a track width/via size or to change it during routing:
|
||||
- Use standard Kicad shortcuts.
|
||||
- Press **W** or select *Custom Track Width* from the context menu to type in a custom width/via size.
|
||||
- Pick a predefined width from the *Select Track Width* sub-menu of the context menu.
|
||||
- Select *Use the starting track width* in the *Select Track Width* menu to pick the width from the start item (or the traces already connected to it).
|
||||
|
||||
## Dragging ##
|
||||
|
||||
The router can drag track segments, corners and vias. To drag an item, click on it with **Ctrl** key pressed, hover the mouse and press **G** or select *Drag Track/Via* from the context menu.
|
||||
Finish dragging by clicking again or abort by pressing *Esc*.
|
||||
|
||||
## Options ##
|
||||
|
||||
The router behavior be configured by pressing *E* or selecting *Routing Options* from the context menu. It opens a window like the one below:
|
||||
|
||||

|
||||
|
||||
The options are:
|
||||
|
||||
- **Mode** - select how the router handles DRC violation (shoving, walking around, etc.)
|
||||
- **Shove vias** - when disabled, vias are treated as un-movable objects and hugged instead of shoved.
|
||||
- **Jump over obstacles** - when enabled, the router tries to move colliding traces behind solid obstacles (e.g. pads) instead of "reflecting" back the collision
|
||||
- **Remove redundant tracks** - removes loops while routing (e.g. if the new track ensures same connectivity as an already existing one, the old track is removed). Loop removal works locally (only between the start and end of the currently routed trace).
|
||||
- **Automatic neckdown** - when enabled, the router tries to break out pads/vias in a clean way, avoiding acute angles and jagged breakout traces.
|
||||
- **Smooth dragged segments** - when enabled, the router attempts to merge several jagged segments into a single straight one (dragging mode).
|
||||
- **Allow DRC violations** (*Highlight collisions* mode only) - allows to establish a track even if is violating the DRC rules.
|
||||
- **Optimizer effort** - defines how much time the router shall spend optimizing the routed/shoved traces. More effort means cleaner routing (but slower), less effort means faster routing but somewhat jagged traces.
|
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 547 B |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 58 KiB |
|
@ -1,11 +0,0 @@
|
|||
So, finally we've got an integrated interactive, push-and-sometimes-shove router, although with a very limited user interface:
|
||||
|
||||
- Edit->Interactive router launches the tool,
|
||||
- while routing: 'V' key places a via,
|
||||
- '+' and '-' keys cycle through available layers,
|
||||
- '/' key switches track posture.
|
||||
|
||||
Via/track dimensions are taken from the netclasses.
|
||||
There are no other options available for the time being - promise to add them soon :)
|
||||
|
||||
Tom
|
|
@ -5,8 +5,7 @@ Last Revised: 28-Feb-2010
|
|||
Kicad needs wxWidgets, the multi platform G.U.I.
|
||||
Known problems:
|
||||
wxMSW:
|
||||
*DO NOT* use wxMSW.2.8.1
|
||||
in fact: use wxWidgets >= 2.9.3
|
||||
use *only* wxWidgets >= 3.0
|
||||
|
||||
wxGTK
|
||||
Use wxWidgets 2.8.10 or later
|
||||
|
@ -21,15 +20,6 @@ So use a very recent version (>= 2.8.10 (that also solve other bugs)
|
|||
wxWidgets patch:
|
||||
|
||||
|
||||
wxMSW, version 2.8.x
|
||||
Some zoom values smaller than 3 to 5 create artifacts on screen, mainly values < 1.
|
||||
(corresponding to draw scale factor > 1 )
|
||||
|
||||
See http://trac.wxwidgets.org/ticket/9554 (and 11669).
|
||||
|
||||
This is fixed in version 2.9.3
|
||||
|
||||
|
||||
wxWidgets 2.9.1 (all platforms)
|
||||
Has a problem when using the built in string to double conversion:
|
||||
In countries using a comm instead of a point as floating number separator
|
||||
|
@ -41,7 +31,7 @@ Use a version >= 2.9.3
|
|||
|
||||
|
||||
*************************************************************************************
|
||||
wxGTK version: All
|
||||
wxGTK version: All before wxWidgets 3.0
|
||||
*************************************************************************************
|
||||
Patch for printing wide traces that were shown with missing rounded end caps.
|
||||
Without this patch, printing boards and schematics under Linux, and perhaps OSX
|
||||
|
@ -57,3 +47,10 @@ Add after this line:
|
|||
PsPrint( "1 setlinecap\n" );
|
||||
PsPrint("%%EndSetup\n");
|
||||
|
||||
|
||||
Known bug on Windows:
|
||||
Postscript printers print tracks like tin line.
|
||||
It happens only for PS drivers, and PDF printer.
|
||||
Other drivers (PCL for instance) work fine,
|
||||
so it is unlikely a bug inside Kicad/wxWidgets
|
||||
|
||||
|
|
7
Doxyfile
|
@ -338,7 +338,7 @@ TYPEDEF_HIDES_STRUCT = NO
|
|||
# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
|
||||
# corresponding to a cache size of 2^16 = 65536 symbols.
|
||||
|
||||
SYMBOL_CACHE_SIZE = 0
|
||||
SYMBOL_CACHE_SIZE = 4
|
||||
|
||||
# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
|
||||
# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
|
||||
|
@ -349,7 +349,7 @@ SYMBOL_CACHE_SIZE = 0
|
|||
# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
|
||||
# corresponding to a cache size of 2^16 = 65536 symbols.
|
||||
|
||||
LOOKUP_CACHE_SIZE = 0
|
||||
LOOKUP_CACHE_SIZE = 6
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
|
@ -661,7 +661,8 @@ WARN_LOGFILE =
|
|||
# directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = kicad \
|
||||
INPUT = Documentation/development/road-map.md \
|
||||
kicad \
|
||||
pcbnew \
|
||||
cvpcb \
|
||||
eeschema \
|
||||
|
|
21
TODO.txt
|
@ -60,9 +60,22 @@ PCBNew
|
|||
*) Paste (module ...) from clipboard into module editor.
|
||||
|
||||
|
||||
|
||||
|
||||
Dick's Final TODO List:
|
||||
======================
|
||||
*) 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
|
||||
*) 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
|
|
@ -1,53 +1,68 @@
|
|||
|
||||
include_directories(BEFORE ${INC_BEFORE})
|
||||
include_directories( BEFORE ${INC_BEFORE} )
|
||||
include_directories(
|
||||
../potrace
|
||||
../common
|
||||
${INC_AFTER}
|
||||
)
|
||||
|
||||
set(BITMAP2COMPONENT_SRCS
|
||||
set( BITMAP2COMPONENT_SRCS
|
||||
../common/single_top.cpp
|
||||
bitmap2component.cpp
|
||||
bitmap2cmp_gui_base
|
||||
bitmap2cmp_gui
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
if(MINGW)
|
||||
# BITMAP2COMPONENT_RESOURCES variable is set by the macro.
|
||||
mingw_resource_compiler(bitmap2component)
|
||||
else(MINGW)
|
||||
set(BITMAP2COMPONENT_RESOURCES bitmap2component.rc)
|
||||
endif(MINGW)
|
||||
endif(WIN32)
|
||||
set_source_files_properties( ../common/single_top.cpp PROPERTIES
|
||||
COMPILE_DEFINITIONS "TOP_FRAME=FRAME_BM2CMP"
|
||||
)
|
||||
set_source_files_properties( bitmap2cmp_gui.cpp PROPERTIES
|
||||
COMPILE_DEFINITIONS "COMPILING_DLL"
|
||||
)
|
||||
|
||||
add_executable( bitmap2component WIN32 MACOSX_BUNDLE
|
||||
${BITMAP2COMPONENT_SRCS}
|
||||
${BITMAP2COMPONENT_RESOURCES}
|
||||
)
|
||||
|
||||
target_link_libraries( bitmap2component
|
||||
common
|
||||
polygon
|
||||
bitmaps
|
||||
${wxWidgets_LIBRARIES}
|
||||
potrace
|
||||
)
|
||||
|
||||
install( TARGETS bitmap2component
|
||||
DESTINATION ${KICAD_BIN}
|
||||
COMPONENT binary
|
||||
)
|
||||
|
||||
|
||||
if(APPLE)
|
||||
set(BITMAP2COMPONENT_RESOURCES bitmap2component.icns)
|
||||
set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/bitmap2component.icns"
|
||||
PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||
set(MACOSX_BUNDLE_ICON_FILE bitmap2component.icns)
|
||||
set(MACOSX_BUNDLE_GUI_IDENTIFIER org.kicad-eda.bitmap2component)
|
||||
endif(APPLE)
|
||||
if( false ) # linker map with cross reference
|
||||
set_target_properties( bitmap2component PROPERTIES
|
||||
LINK_FLAGS "${TO_LINKER},-cref ${TO_LINKER},-Map=bitmap2component.map"
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
add_executable(bitmap2component WIN32 MACOSX_BUNDLE
|
||||
${BITMAP2COMPONENT_SRCS}
|
||||
${BITMAP2COMPONENT_RESOURCES})
|
||||
if( MINGW )
|
||||
# BITMAP2COMPONENT_RESOURCES variable is set by the macro.
|
||||
mingw_resource_compiler( bitmap2component )
|
||||
else()
|
||||
set( BITMAP2COMPONENT_RESOURCES bitmap2component.rc )
|
||||
endif()
|
||||
|
||||
|
||||
if(APPLE)
|
||||
set_target_properties(bitmap2component PROPERTIES MACOSX_BUNDLE_INFO_PLIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
||||
endif(APPLE)
|
||||
|
||||
target_link_libraries( bitmap2component common polygon bitmaps
|
||||
${wxWidgets_LIBRARIES}
|
||||
potrace
|
||||
)
|
||||
|
||||
install(TARGETS bitmap2component
|
||||
DESTINATION ${KICAD_BIN}
|
||||
COMPONENT binary)
|
||||
if( APPLE )
|
||||
set( BITMAP2COMPONENT_RESOURCES bitmap2component.icns )
|
||||
set_source_files_properties( "${CMAKE_CURRENT_SOURCE_DIR}/bitmap2component.icns" PROPERTIES
|
||||
MACOSX_PACKAGE_LOCATION Resources
|
||||
)
|
||||
set( MACOSX_BUNDLE_ICON_FILE bitmap2component.icns )
|
||||
set( MACOSX_BUNDLE_GUI_IDENTIFIER org.kicad-eda.bitmap2component )
|
||||
|
||||
set_target_properties( bitmap2component PROPERTIES
|
||||
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -21,16 +21,15 @@
|
|||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <macros.h>
|
||||
|
||||
#include <pgm_base.h>
|
||||
#include <wxstruct.h>
|
||||
#include <confirm.h>
|
||||
#include <gestfich.h>
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/config.h>
|
||||
#include <wx/filename.h>
|
||||
|
||||
#include <bitmap2cmp_gui_base.h>
|
||||
|
||||
#include <potracelib.h>
|
||||
|
@ -39,47 +38,57 @@
|
|||
#include <colors_selection.h>
|
||||
#include <build_version.h>
|
||||
#include <menus_helpers.h>
|
||||
#include <kiway.h>
|
||||
#include <kiface_i.h>
|
||||
|
||||
#define KEYWORD_FRAME_POSX wxT( "Bmconverter_Pos_x" )
|
||||
#define KEYWORD_FRAME_POSY wxT( "Bmconverter_Pos_y" )
|
||||
#define KEYWORD_FRAME_SIZEX wxT( "Bmconverter_Size_x" )
|
||||
#define KEYWORD_FRAME_SIZEY wxT( "Bmconverter_Size_y" )
|
||||
#define KEYWORD_LAST_INPUT_FILE wxT( "Last_input" )
|
||||
#define KEYWORD_LAST_OUTPUT_FILE wxT( "Last_output" )
|
||||
#define KEYWORD_LAST_FORMAT wxT( "Last_format" )
|
||||
#define KEYWORD_BINARY_THRESHOLD wxT( "Threshold" )
|
||||
#define KEYWORD_BW_NEGATIVE wxT( "Negative_choice" )
|
||||
#define KEYWORD_FRAME_POSX wxT( "Bmconverter_Pos_x" )
|
||||
#define KEYWORD_FRAME_POSY wxT( "Bmconverter_Pos_y" )
|
||||
#define KEYWORD_FRAME_SIZEX wxT( "Bmconverter_Size_x" )
|
||||
#define KEYWORD_FRAME_SIZEY wxT( "Bmconverter_Size_y" )
|
||||
#define KEYWORD_LAST_INPUT_FILE wxT( "Last_input" )
|
||||
#define KEYWORD_LAST_OUTPUT_FILE wxT( "Last_output" )
|
||||
#define KEYWORD_LAST_FORMAT wxT( "Last_format" )
|
||||
#define KEYWORD_BINARY_THRESHOLD wxT( "Threshold" )
|
||||
#define KEYWORD_BW_NEGATIVE wxT( "Negative_choice" )
|
||||
|
||||
extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFormat );
|
||||
#define DEFAULT_DPI 300 // Default resolution in Bit per inches
|
||||
|
||||
/* Class BM2CMP_FRAME_BASE
|
||||
This is the main frame for this application
|
||||
*/
|
||||
extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
|
||||
int aFormat, int aDpi_X, int aDpi_Y );
|
||||
|
||||
/**
|
||||
* Class BM2CMP_FRAME_BASE
|
||||
* is the main frame for this application
|
||||
*/
|
||||
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;
|
||||
wxString m_BitmapFileName;
|
||||
wxString m_ConvertedFileName;
|
||||
wxSize m_FrameSize;
|
||||
wxPoint m_FramePos;
|
||||
wxConfig * m_Config;
|
||||
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;
|
||||
|
||||
public:
|
||||
BM2CMP_FRAME();
|
||||
BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent );
|
||||
~BM2CMP_FRAME();
|
||||
|
||||
// overload KIWAY_PLAYER virtual
|
||||
bool OpenProjectFiles( const std::vector<wxString>& aFilenames, int aCtl=0 );
|
||||
|
||||
private:
|
||||
|
||||
// Event handlers
|
||||
void OnPaint( wxPaintEvent& event );
|
||||
void OnLoadFile( wxCommandEvent& event );
|
||||
bool LoadFile( wxString& aFullFileName );
|
||||
void OnExport( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
|
@ -109,30 +118,51 @@ private:
|
|||
void Binarize( double aThreshold ); // aThreshold = 0.0 (black level) to 1.0 (white level)
|
||||
void OnOptionsSelection( wxCommandEvent& event );
|
||||
void OnThresholdChange( wxScrollEvent& event );
|
||||
void OnResolutionChange( wxCommandEvent& event );
|
||||
|
||||
// called when texts controls which handle the image resolution
|
||||
// lose the focus, to ensure the rigyht vaules are displayed
|
||||
// because the m_imageDPI are clipped to acceptable values, and
|
||||
// the text displayed could be differ duringa text edition
|
||||
// We are using ChangeValue here to avoid generating a wxEVT_TEXT event.
|
||||
void UpdateDPITextValueX( wxMouseEvent& event )
|
||||
{
|
||||
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 updateImageInfo();
|
||||
};
|
||||
|
||||
|
||||
BM2CMP_FRAME::BM2CMP_FRAME() : BM2CMP_FRAME_BASE( NULL )
|
||||
BM2CMP_FRAME::BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||
BM2CMP_FRAME_BASE( aParent )
|
||||
{
|
||||
SetKiway( this, aKiway );
|
||||
|
||||
int tmp;
|
||||
m_Config = new wxConfig();
|
||||
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 );
|
||||
m_Config->Read( KEYWORD_FRAME_SIZEY, & m_FrameSize.y, -1 );
|
||||
m_Config->Read( KEYWORD_LAST_INPUT_FILE, &m_BitmapFileName );
|
||||
m_Config->Read( KEYWORD_LAST_OUTPUT_FILE, &m_ConvertedFileName );
|
||||
if( m_Config->Read( KEYWORD_BINARY_THRESHOLD, &tmp ) )
|
||||
m_config = new wxConfig();
|
||||
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 );
|
||||
m_config->Read( KEYWORD_FRAME_SIZEY, & m_frameSize.y, -1 );
|
||||
m_config->Read( KEYWORD_LAST_INPUT_FILE, &m_BitmapFileName );
|
||||
m_config->Read( KEYWORD_LAST_OUTPUT_FILE, &m_ConvertedFileName );
|
||||
|
||||
if( m_config->Read( KEYWORD_BINARY_THRESHOLD, &tmp ) )
|
||||
m_sliderThreshold->SetValue( tmp );
|
||||
if( m_Config->Read( KEYWORD_BW_NEGATIVE, &tmp ) )
|
||||
|
||||
if( m_config->Read( KEYWORD_BW_NEGATIVE, &tmp ) )
|
||||
m_rbOptions->SetSelection( tmp ? 1 : 0 );
|
||||
|
||||
m_Config->Read( KEYWORD_LAST_FORMAT, &tmp );
|
||||
m_config->Read( KEYWORD_LAST_FORMAT, &tmp );
|
||||
m_radioBoxFormat->SetSelection( tmp );
|
||||
|
||||
|
||||
// Give an icon
|
||||
wxIcon icon;
|
||||
icon.CopyFromBitmap( KiBitmap( icon_bitmap2component_xpm ) );
|
||||
|
@ -140,34 +170,36 @@ BM2CMP_FRAME::BM2CMP_FRAME() : BM2CMP_FRAME_BASE( NULL )
|
|||
|
||||
GetSizer()->SetSizeHints( this );
|
||||
|
||||
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
|
||||
SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y );
|
||||
|
||||
m_buttonExport->Enable( false );
|
||||
|
||||
if ( m_FramePos == wxDefaultPosition )
|
||||
m_imageDPI.x = m_imageDPI.y = DEFAULT_DPI; // Default resolution in Bit per inches
|
||||
|
||||
if ( m_framePos == wxDefaultPosition )
|
||||
Centre();
|
||||
}
|
||||
|
||||
|
||||
BM2CMP_FRAME::~BM2CMP_FRAME()
|
||||
{
|
||||
if( ( m_Config == NULL ) || IsIconized() )
|
||||
if( !m_config || IsIconized() )
|
||||
return;
|
||||
|
||||
m_FrameSize = GetSize();
|
||||
m_FramePos = GetPosition();
|
||||
m_frameSize = GetSize();
|
||||
m_framePos = GetPosition();
|
||||
|
||||
m_Config->Write( KEYWORD_FRAME_POSX, (long) m_FramePos.x );
|
||||
m_Config->Write( KEYWORD_FRAME_POSY, (long) m_FramePos.y );
|
||||
m_Config->Write( KEYWORD_FRAME_SIZEX, (long) m_FrameSize.x );
|
||||
m_Config->Write( KEYWORD_FRAME_SIZEY, (long) m_FrameSize.y );
|
||||
m_Config->Write( KEYWORD_LAST_INPUT_FILE, m_BitmapFileName );
|
||||
m_Config->Write( KEYWORD_LAST_OUTPUT_FILE, m_ConvertedFileName );
|
||||
m_Config->Write( KEYWORD_BINARY_THRESHOLD, m_sliderThreshold->GetValue() );
|
||||
m_Config->Write( KEYWORD_BW_NEGATIVE, m_rbOptions->GetSelection() );
|
||||
m_Config->Write( KEYWORD_LAST_FORMAT, m_radioBoxFormat->GetSelection() );
|
||||
m_config->Write( KEYWORD_FRAME_POSX, (long) m_framePos.x );
|
||||
m_config->Write( KEYWORD_FRAME_POSY, (long) m_framePos.y );
|
||||
m_config->Write( KEYWORD_FRAME_SIZEX, (long) m_frameSize.x );
|
||||
m_config->Write( KEYWORD_FRAME_SIZEY, (long) m_frameSize.y );
|
||||
m_config->Write( KEYWORD_LAST_INPUT_FILE, m_BitmapFileName );
|
||||
m_config->Write( KEYWORD_LAST_OUTPUT_FILE, m_ConvertedFileName );
|
||||
m_config->Write( KEYWORD_BINARY_THRESHOLD, m_sliderThreshold->GetValue() );
|
||||
m_config->Write( KEYWORD_BW_NEGATIVE, m_rbOptions->GetSelection() );
|
||||
m_config->Write( KEYWORD_LAST_FORMAT, m_radioBoxFormat->GetSelection() );
|
||||
|
||||
delete m_Config;
|
||||
delete m_config;
|
||||
|
||||
/* This needed for OSX: avoids further OnDraw processing after this
|
||||
* destructor and before the native window is destroyed
|
||||
|
@ -207,23 +239,24 @@ void BM2CMP_FRAME::OnPaint( wxPaintEvent& event )
|
|||
*/
|
||||
void BM2CMP_FRAME::OnLoadFile( wxCommandEvent& event )
|
||||
{
|
||||
wxFileName fn(m_BitmapFileName);
|
||||
wxString path = fn.GetPath();
|
||||
wxFileName fn( m_BitmapFileName );
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
path = wxGetCwd();
|
||||
|
||||
wxFileDialog FileDlg( this, _( "Choose Image" ), path, wxEmptyString,
|
||||
wxFileDialog fileDlg( this, _( "Choose Image" ), path, wxEmptyString,
|
||||
_( "Image Files " ) + wxImage::GetImageExtWildcard(),
|
||||
wxFD_OPEN );
|
||||
int diag = FileDlg.ShowModal();
|
||||
|
||||
int diag = fileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
wxString fullFilename = FileDlg.GetPath();
|
||||
wxString fullFilename = fileDlg.GetPath();
|
||||
|
||||
if( ! LoadFile( fullFilename ) )
|
||||
if( !OpenProjectFiles( std::vector<wxString>( 1, fullFilename ) ) )
|
||||
return;
|
||||
|
||||
m_buttonExport->Enable( true );
|
||||
|
@ -232,13 +265,22 @@ void BM2CMP_FRAME::OnLoadFile( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
bool BM2CMP_FRAME::LoadFile( wxString& aFullFileName )
|
||||
bool BM2CMP_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
|
||||
{
|
||||
m_BitmapFileName = aFullFileName;
|
||||
// Prj().MaybeLoadProjectSettings();
|
||||
|
||||
m_BitmapFileName = aFileSet[0];
|
||||
|
||||
if( !m_Pict_Image.LoadFile( m_BitmapFileName ) )
|
||||
{
|
||||
wxMessageBox( _( "Couldn't load image from <%s>" ), m_BitmapFileName.c_str() );
|
||||
/* 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 );
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -246,15 +288,32 @@ bool BM2CMP_FRAME::LoadFile( wxString& aFullFileName )
|
|||
|
||||
int h = m_Pict_Bitmap.GetHeight();
|
||||
int w = m_Pict_Bitmap.GetWidth();
|
||||
int nb = m_Pict_Bitmap.GetDepth();
|
||||
|
||||
wxString msg;
|
||||
msg.Printf( wxT( "%d" ), w );
|
||||
m_SizeXValue->SetLabel(msg);
|
||||
msg.Printf( wxT( "%d" ), h );
|
||||
m_SizeYValue->SetLabel(msg);
|
||||
msg.Printf( wxT( "%d" ), nb );
|
||||
m_BPPValue->SetLabel(msg);
|
||||
// Determine image resolution in DPI (does not existing in all formats).
|
||||
// the resolution can be given in bit per inches or bit per cm in file
|
||||
m_imageDPI.x = m_Pict_Image.GetOptionInt( wxIMAGE_OPTION_RESOLUTIONX );
|
||||
m_imageDPI.y = m_Pict_Image.GetOptionInt( wxIMAGE_OPTION_RESOLUTIONY );
|
||||
|
||||
if( m_imageDPI.x > 1 && m_imageDPI.y > 1 )
|
||||
{
|
||||
if( m_Pict_Image.GetOptionInt( wxIMAGE_OPTION_RESOLUTIONUNIT ) == wxIMAGE_RESOLUTION_CM )
|
||||
{
|
||||
// When the initial resolution is given in bits per cm,
|
||||
// experience shows adding 1.27 to the resolution converted in dpi
|
||||
// before convert to int value reduce the conversion error
|
||||
// but it is not perfect
|
||||
m_imageDPI.x = m_imageDPI.x * 2.54 + 1.27;
|
||||
m_imageDPI.y = m_imageDPI.y * 2.54 + 1.27;
|
||||
}
|
||||
}
|
||||
else // fallback to the default value
|
||||
m_imageDPI.x = m_imageDPI.y = DEFAULT_DPI;
|
||||
|
||||
// Display image info:
|
||||
// We are using ChangeValue here to avoid generating a wxEVT_TEXT event.
|
||||
m_DPIValueX->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.x ) );
|
||||
m_DPIValueY->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.y ) );
|
||||
updateImageInfo();
|
||||
|
||||
m_InitialPicturePanel->SetVirtualSize( w, h );
|
||||
m_GreyscalePicturePanel->SetVirtualSize( w, h );
|
||||
|
@ -262,16 +321,55 @@ bool BM2CMP_FRAME::LoadFile( wxString& aFullFileName )
|
|||
|
||||
m_Greyscale_Image.Destroy();
|
||||
m_Greyscale_Image = m_Pict_Image.ConvertToGreyscale( );
|
||||
|
||||
if( m_rbOptions->GetSelection() > 0 )
|
||||
NegateGreyscaleImage( );
|
||||
|
||||
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
||||
|
||||
m_NB_Image = m_Greyscale_Image;
|
||||
Binarize( (double)m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||
Binarize( (double) m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::updateImageInfo()
|
||||
{
|
||||
// Note: the image resolution text controls are not modified
|
||||
// here, to avoid a race between text change when entered by user and
|
||||
// a text change if it is modifed here.
|
||||
int h = m_Pict_Bitmap.GetHeight();
|
||||
int w = m_Pict_Bitmap.GetWidth();
|
||||
int nb = m_Pict_Bitmap.GetDepth();
|
||||
|
||||
m_SizeXValue->SetLabel( wxString::Format( wxT( "%d" ), w ) );
|
||||
m_SizeYValue->SetLabel( wxString::Format( wxT( "%d" ), h ) );
|
||||
m_BPPValue->SetLabel( wxString::Format( wxT( "%d" ), nb ) );
|
||||
|
||||
m_SizeXValue_mm->SetLabel( wxString::Format( wxT( "%.1f" ),
|
||||
(double) w / m_imageDPI.x * 25.4 ) );
|
||||
m_SizeYValue_mm->SetLabel( wxString::Format( wxT( "%.1f" ),
|
||||
(double) h / m_imageDPI.y * 25.4 ) );
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::OnResolutionChange( wxCommandEvent& event )
|
||||
{
|
||||
long tmp;
|
||||
|
||||
if( m_DPIValueX->GetValue().ToLong( &tmp ) )
|
||||
m_imageDPI.x = tmp;
|
||||
|
||||
if( m_DPIValueY->GetValue().ToLong( &tmp ) )
|
||||
m_imageDPI.y = tmp;
|
||||
|
||||
if( m_imageDPI.x < 32 )
|
||||
m_imageDPI.x = 32;
|
||||
|
||||
if( m_imageDPI.y < 32 )
|
||||
m_imageDPI.y = 32;
|
||||
|
||||
updateImageInfo();
|
||||
}
|
||||
|
||||
void BM2CMP_FRAME::Binarize( double aThreshold )
|
||||
{
|
||||
|
@ -297,11 +395,12 @@ void BM2CMP_FRAME::Binarize( double aThreshold )
|
|||
m_BN_Bitmap = wxBitmap( m_NB_Image );
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::NegateGreyscaleImage( )
|
||||
{
|
||||
unsigned char pix;
|
||||
int h = m_Greyscale_Image.GetHeight();
|
||||
int w = m_Greyscale_Image.GetWidth();
|
||||
int h = m_Greyscale_Image.GetHeight();
|
||||
int w = m_Greyscale_Image.GetWidth();
|
||||
|
||||
for( int y = 0; y < h; y++ )
|
||||
for( int x = 0; x < w; x++ )
|
||||
|
@ -321,58 +420,61 @@ void BM2CMP_FRAME::OnOptionsSelection( wxCommandEvent& event )
|
|||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::OnThresholdChange( wxScrollEvent& event )
|
||||
{
|
||||
Binarize( (double)m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::OnExport( wxCommandEvent& event )
|
||||
{
|
||||
int sel = m_radioBoxFormat->GetSelection();
|
||||
|
||||
switch( sel )
|
||||
{
|
||||
case 0:
|
||||
OnExportEeschema();
|
||||
break;
|
||||
case 0:
|
||||
OnExportEeschema();
|
||||
break;
|
||||
|
||||
case 1:
|
||||
OnExportPcbnew( true );
|
||||
break;
|
||||
case 1:
|
||||
OnExportPcbnew( true );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
OnExportPcbnew( false );
|
||||
break;
|
||||
case 2:
|
||||
OnExportPcbnew( false );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
OnExportPostScript();
|
||||
break;
|
||||
case 3:
|
||||
OnExportPostScript();
|
||||
break;
|
||||
|
||||
case 4:
|
||||
OnExportLogo();
|
||||
break;
|
||||
case 4:
|
||||
OnExportLogo();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::OnExportLogo()
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
wxFileName fn( m_ConvertedFileName );
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
path = ::wxGetCwd();
|
||||
|
||||
wxString msg = _( "Logo file (*.kicad_wks)|*.kicad_wks" );
|
||||
wxFileDialog FileDlg( this, _( "Create a logo file" ), path, wxEmptyString,
|
||||
wxFileDialog fileDlg( this, _( "Create a logo file" ), path, wxEmptyString,
|
||||
msg,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
|
||||
int diag = FileDlg.ShowModal();
|
||||
int diag = fileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
m_ConvertedFileName = FileDlg.GetPath();
|
||||
m_ConvertedFileName = fileDlg.GetPath();
|
||||
|
||||
FILE* outfile;
|
||||
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
|
@ -389,24 +491,26 @@ void BM2CMP_FRAME::OnExportLogo()
|
|||
fclose( outfile );
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::OnExportPostScript()
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
wxFileName fn( m_ConvertedFileName );
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
if( path.IsEmpty() || !wxDirExists( path ) )
|
||||
path = ::wxGetCwd();
|
||||
|
||||
wxString msg = _( "Postscript file (*.ps)|*.ps" );
|
||||
wxFileDialog FileDlg( this, _( "Create a Postscript file" ), path, wxEmptyString,
|
||||
wxFileDialog fileDlg( this, _( "Create a Postscript file" ), path, wxEmptyString,
|
||||
msg,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
|
||||
int diag = FileDlg.ShowModal();
|
||||
|
||||
int diag = fileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
m_ConvertedFileName = FileDlg.GetPath();
|
||||
m_ConvertedFileName = fileDlg.GetPath();
|
||||
|
||||
FILE* outfile;
|
||||
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
|
@ -423,27 +527,29 @@ void BM2CMP_FRAME::OnExportPostScript()
|
|||
fclose( outfile );
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::OnExportEeschema()
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
wxFileName fn( m_ConvertedFileName );
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
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,
|
||||
|
||||
wxFileDialog fileDlg( this, _( "Create a lib file for Eeschema" ), path, wxEmptyString,
|
||||
msg,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
|
||||
int diag = FileDlg.ShowModal();
|
||||
|
||||
int diag = fileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
m_ConvertedFileName = FileDlg.GetPath();
|
||||
m_ConvertedFileName = fileDlg.GetPath();
|
||||
|
||||
FILE* outfile;
|
||||
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
FILE* outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
|
||||
if( outfile == NULL )
|
||||
{
|
||||
|
@ -460,29 +566,29 @@ void BM2CMP_FRAME::OnExportEeschema()
|
|||
|
||||
void BM2CMP_FRAME::OnExportPcbnew( bool aLegacyFormat )
|
||||
{
|
||||
wxFileName fn(m_ConvertedFileName);
|
||||
wxString path = fn.GetPath();
|
||||
wxFileName fn( m_ConvertedFileName );
|
||||
wxString path = fn.GetPath();
|
||||
|
||||
if( path.IsEmpty() || !wxDirExists(path) )
|
||||
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" ),
|
||||
|
||||
wxFileDialog fileDlg( this, _( "Create a footprint file for PcbNew" ),
|
||||
path, wxEmptyString,
|
||||
msg,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
|
||||
int diag = FileDlg.ShowModal();
|
||||
|
||||
int diag = fileDlg.ShowModal();
|
||||
|
||||
if( diag != wxID_OK )
|
||||
return;
|
||||
|
||||
m_ConvertedFileName = FileDlg.GetPath();
|
||||
m_ConvertedFileName = fileDlg.GetPath();
|
||||
|
||||
|
||||
FILE* outfile;
|
||||
outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
FILE* outfile = wxFopen( m_ConvertedFileName, wxT( "w" ) );
|
||||
|
||||
if( outfile == NULL )
|
||||
{
|
||||
|
@ -496,6 +602,7 @@ void BM2CMP_FRAME::OnExportPcbnew( bool aLegacyFormat )
|
|||
fclose( outfile );
|
||||
}
|
||||
|
||||
|
||||
void BM2CMP_FRAME::ExportFile( FILE* aOutfile, int aFormat )
|
||||
{
|
||||
// Create a potrace bitmap
|
||||
|
@ -514,40 +621,93 @@ void BM2CMP_FRAME::ExportFile( FILE* aOutfile, int aFormat )
|
|||
/* fill the bitmap with data */
|
||||
for( int y = 0; y < h; y++ )
|
||||
{
|
||||
for( int x = 0; x<w; x++ )
|
||||
for( int x = 0; x < w; x++ )
|
||||
{
|
||||
unsigned char pix = m_NB_Image.GetGreen( x, y );
|
||||
BM_PUT( potrace_bitmap, x, y, pix ? 1 : 0 );
|
||||
}
|
||||
}
|
||||
|
||||
bitmap2component( potrace_bitmap, aOutfile, aFormat );
|
||||
bitmap2component( potrace_bitmap, aOutfile, aFormat, m_imageDPI.x, m_imageDPI.y );
|
||||
}
|
||||
|
||||
|
||||
// EDA_APP
|
||||
|
||||
IMPLEMENT_APP( EDA_APP )
|
||||
//-----<KIFACE>-----------------------------------------------------------------
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
// EDA_APP
|
||||
// main program
|
||||
//-----------------------------------------------------------------------------
|
||||
namespace BMP2CMP {
|
||||
|
||||
bool EDA_APP::OnInit()
|
||||
static struct IFACE : public KIFACE_I
|
||||
{
|
||||
wxInitAllImageHandlers();
|
||||
bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits );
|
||||
|
||||
InitEDA_Appl( wxT( "BMP2CMP" ) );
|
||||
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 )
|
||||
{
|
||||
switch( aClassId )
|
||||
{
|
||||
|
||||
wxFrame* frame = new BM2CMP_FRAME();
|
||||
SetTopWindow( frame );
|
||||
frame->Show( true );
|
||||
default:
|
||||
{
|
||||
KIWAY_PLAYER* frame = new BM2CMP_FRAME( aKiway, aParent );
|
||||
return frame;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Function IfaceOrAddress
|
||||
* return a pointer to the requested object. The safest way to use this
|
||||
* is to retrieve a pointer to a static instance of an interface, similar to
|
||||
* how the KIFACE interface is exported. But if you know what you are doing
|
||||
* use it to retrieve anything you want.
|
||||
*
|
||||
* @param aDataId identifies which object you want the address of.
|
||||
*
|
||||
* @return void* - and must be cast into the know type.
|
||||
*/
|
||||
void* IfaceOrAddress( int aDataId )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IFACE( const char* aDSOname, KIWAY::FACE_T aType ) :
|
||||
KIFACE_I( aDSOname, aType )
|
||||
{}
|
||||
|
||||
void EDA_APP::MacOpenFile( const wxString& aFileName )
|
||||
} kiface( "BMP2CMP", KIWAY::FACE_BMP2CMP );
|
||||
|
||||
} // namespace BMP2CMP
|
||||
|
||||
using namespace BMP2CMP;
|
||||
|
||||
static PGM_BASE* process;
|
||||
|
||||
KIFACE_I& Kiface()
|
||||
{
|
||||
return kiface;
|
||||
}
|
||||
|
||||
|
||||
// KIFACE_GETTER's actual spelling is a substitution macro found in kiway.h.
|
||||
// KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
|
||||
MY_API( KIFACE* ) KIFACE_GETTER( int* aKIFACEversion, int aKIWAYversion, PGM_BASE* aProgram )
|
||||
{
|
||||
process = (PGM_BASE*) aProgram;
|
||||
return &kiface;
|
||||
}
|
||||
|
||||
|
||||
#if defined(BUILD_KIWAY_DLLS)
|
||||
PGM_BASE& Pgm()
|
||||
{
|
||||
wxASSERT( process ); // KIFACE_GETTER has already been called.
|
||||
return *process;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
|
||||
{
|
||||
return start_common( aCtlBits );
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// C++ code generated with wxFormBuilder (version Nov 5 2013)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -9,7 +9,7 @@
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
|
||||
BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : KIWAY_PLAYER( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
|
@ -41,33 +41,43 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
|||
sbSizerInfo = new wxStaticBoxSizer( new wxStaticBox( m_panelRight, wxID_ANY, _("Bitmap Info:") ), wxVERTICAL );
|
||||
|
||||
wxFlexGridSizer* fgSizerInfo;
|
||||
fgSizerInfo = new wxFlexGridSizer( 3, 3, 0, 0 );
|
||||
fgSizerInfo = new wxFlexGridSizer( 0, 4, 0, 0 );
|
||||
fgSizerInfo->AddGrowableCol( 1 );
|
||||
fgSizerInfo->AddGrowableCol( 2 );
|
||||
fgSizerInfo->SetFlexibleDirection( wxBOTH );
|
||||
fgSizerInfo->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticTextSizeX = new wxStaticText( m_panelRight, wxID_ANY, _("Size X:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextSizeX->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextSizeX, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
m_staticTextSize = new wxStaticText( m_panelRight, wxID_ANY, _("Size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextSize->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextSize, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_SizeXValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeXValue->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeXValue, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_SizeXunits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeXunits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeXunits, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_staticTextSizeY = new wxStaticText( m_panelRight, wxID_ANY, _("Size Y:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextSizeY->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextSizeY, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
fgSizerInfo->Add( m_SizeXValue, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_SizeYValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeYValue->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeYValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
fgSizerInfo->Add( m_SizeYValue, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_SizeYunits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeYunits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeYunits, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
m_SizePixUnits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizePixUnits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizePixUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_staticTextSize1 = new wxStaticText( m_panelRight, wxID_ANY, _("Size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextSize1->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextSize1, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT, 5 );
|
||||
|
||||
m_SizeXValue_mm = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeXValue_mm->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeXValue_mm, 0, wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_SizeYValue_mm = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizeYValue_mm->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_SizeYValue_mm, 0, wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_Size_mmxUnits = new wxStaticText( m_panelRight, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_Size_mmxUnits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_Size_mmxUnits, 0, wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_staticTextBPP = new wxStaticText( m_panelRight, wxID_ANY, _("BPP:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextBPP->Wrap( -1 );
|
||||
|
@ -75,17 +85,38 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
|||
|
||||
m_BPPValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_BPPValue->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_BPPValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
fgSizerInfo->Add( m_BPPValue, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_BPPunits = new wxStaticText( m_panelRight, wxID_ANY, _("bits"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_BPPunits->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_BPPunits, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
fgSizerInfo->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticTextBPI = new wxStaticText( m_panelRight, wxID_ANY, _("Resolution:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextBPI->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_staticTextBPI, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_DPIValueX = new wxTextCtrl( m_panelRight, wxID_ANY, _("300"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_DPIValueX->SetMinSize( wxSize( 40,-1 ) );
|
||||
|
||||
fgSizerInfo->Add( m_DPIValueX, 0, wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_DPIValueY = new wxTextCtrl( m_panelRight, wxID_ANY, _("300"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_DPIValueY->SetMinSize( wxSize( 40,-1 ) );
|
||||
|
||||
fgSizerInfo->Add( m_DPIValueY, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
m_DPI_Units = new wxStaticText( m_panelRight, wxID_ANY, _("DPI"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_DPI_Units->Wrap( -1 );
|
||||
fgSizerInfo->Add( m_DPI_Units, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
|
||||
sbSizerInfo->Add( fgSizerInfo, 0, wxEXPAND|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
brightSizer->Add( sbSizerInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
brightSizer->Add( sbSizerInfo, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
m_buttonLoad = new wxButton( m_panelRight, wxID_ANY, _("Load Bitmap"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
brightSizer->Add( m_buttonLoad, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
@ -98,18 +129,18 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
|||
wxString m_radioBoxFormatChoices[] = { _("Eeschema"), _("Pcbnew old fmt (.emp)"), _("Pcbnew kicad_mod"), _("Postscript"), _("Logo for title block") };
|
||||
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( 4 );
|
||||
brightSizer->Add( m_radioBoxFormat, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
m_radioBoxFormat->SetSelection( 2 );
|
||||
brightSizer->Add( m_radioBoxFormat, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
wxString m_rbOptionsChoices[] = { _("Normal"), _("Negative") };
|
||||
int m_rbOptionsNChoices = sizeof( m_rbOptionsChoices ) / sizeof( wxString );
|
||||
m_rbOptions = new wxRadioBox( m_panelRight, wxID_ANY, _("Options"), wxDefaultPosition, wxDefaultSize, m_rbOptionsNChoices, m_rbOptionsChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_rbOptions->SetSelection( 0 );
|
||||
brightSizer->Add( m_rbOptions, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
brightSizer->Add( m_rbOptions, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
m_ThresholdText = new wxStaticText( m_panelRight, wxID_ANY, _("Threshold Value:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_ThresholdText->Wrap( -1 );
|
||||
brightSizer->Add( m_ThresholdText, 0, wxRIGHT|wxLEFT, 5 );
|
||||
brightSizer->Add( m_ThresholdText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_sliderThreshold = new wxSlider( m_panelRight, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL|wxSL_LABELS );
|
||||
m_sliderThreshold->SetToolTip( _("Adjust the level to convert the greyscale picture to a black and white picture.") );
|
||||
|
@ -131,6 +162,10 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS
|
|||
m_InitialPicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_GreyscalePicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_BNPicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_DPIValueX->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueX ), NULL, this );
|
||||
m_DPIValueX->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this );
|
||||
m_DPIValueY->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueY ), NULL, this );
|
||||
m_DPIValueY->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this );
|
||||
m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnLoadFile ), NULL, this );
|
||||
m_buttonExport->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExport ), NULL, this );
|
||||
m_rbOptions->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this );
|
||||
|
@ -143,6 +178,10 @@ BM2CMP_FRAME_BASE::~BM2CMP_FRAME_BASE()
|
|||
m_InitialPicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_GreyscalePicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_BNPicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this );
|
||||
m_DPIValueX->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueX ), NULL, this );
|
||||
m_DPIValueX->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this );
|
||||
m_DPIValueY->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueY ), NULL, this );
|
||||
m_DPIValueY->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this );
|
||||
m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnLoadFile ), NULL, this );
|
||||
m_buttonExport->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExport ), NULL, this );
|
||||
m_rbOptions->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this );
|
||||
|
|
|
@ -20,8 +20,10 @@
|
|||
<property name="path">.</property>
|
||||
<property name="precompiled_header"></property>
|
||||
<property name="relative_path">1</property>
|
||||
<property name="skip_lua_events">1</property>
|
||||
<property name="skip_php_events">1</property>
|
||||
<property name="skip_python_events">1</property>
|
||||
<property name="ui_table">UI</property>
|
||||
<property name="use_enum">0</property>
|
||||
<property name="use_microsoft_bom">0</property>
|
||||
<object class="Frame" expanded="1">
|
||||
|
@ -44,7 +46,7 @@
|
|||
<property name="pos"></property>
|
||||
<property name="size">527,470</property>
|
||||
<property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="subclass">KIWAY_PLAYER; kiway_player.h</property>
|
||||
<property name="title">Bitmap to Component Converter</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
|
@ -506,7 +508,7 @@
|
|||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<property name="id">wxID_ANY</property>
|
||||
|
@ -521,16 +523,16 @@
|
|||
<property name="flag">wxEXPAND|wxBOTTOM</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxFlexGridSizer" expanded="1">
|
||||
<property name="cols">3</property>
|
||||
<property name="cols">4</property>
|
||||
<property name="flexible_direction">wxBOTH</property>
|
||||
<property name="growablecols"></property>
|
||||
<property name="growablecols">1,2</property>
|
||||
<property name="growablerows"></property>
|
||||
<property name="hgap">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">fgSizerInfo</property>
|
||||
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
|
||||
<property name="permission">none</property>
|
||||
<property name="rows">3</property>
|
||||
<property name="rows">0</property>
|
||||
<property name="vgap">0</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
|
@ -564,7 +566,7 @@
|
|||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Size X:</property>
|
||||
<property name="label">Size:</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -572,7 +574,7 @@
|
|||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticTextSizeX</property>
|
||||
<property name="name">m_staticTextSize</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
|
@ -617,7 +619,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -700,173 +702,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">pixels</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_SizeXunits</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Size Y:</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticTextSizeY</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -949,7 +785,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -987,7 +823,339 @@
|
|||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_SizeYunits</property>
|
||||
<property name="name">m_SizePixUnits</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Size:</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticTextSize1</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">0000</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_SizeXValue_mm</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">0000</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_SizeYValue_mm</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">mm</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_Size_mmxUnits</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
|
@ -1115,7 +1283,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -1279,6 +1447,364 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="spacer" expanded="1">
|
||||
<property name="height">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">0</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Resolution:</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticTextBPI</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">40,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_DPIValueX</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value">300</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow">UpdatePPITextValueX</event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText">OnResolutionChange</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">40,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_DPIValueY</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value">300</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow">UpdatePPITextValueY</event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText">OnResolutionChange</event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">DPI</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_DPI_Units</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
@ -1461,7 +1987,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxRadioBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -1509,7 +2035,7 @@
|
|||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="selection">4</property>
|
||||
<property name="selection">2</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxRA_SPECIFY_COLS</property>
|
||||
|
@ -1551,7 +2077,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxRadioBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -1641,7 +2167,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxRIGHT|wxLEFT</property>
|
||||
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 8 2012)
|
||||
// C++ code generated with wxFormBuilder (version Nov 5 2013)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -11,6 +11,9 @@
|
|||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class KIWAY_PLAYER;
|
||||
|
||||
#include "kiway_player.h"
|
||||
#include <wx/scrolwin.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
|
@ -22,6 +25,7 @@
|
|||
#include <wx/icon.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/button.h>
|
||||
|
@ -37,7 +41,7 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class BM2CMP_FRAME_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class BM2CMP_FRAME_BASE : public wxFrame
|
||||
class BM2CMP_FRAME_BASE : public KIWAY_PLAYER
|
||||
{
|
||||
private:
|
||||
|
||||
|
@ -47,15 +51,21 @@ class BM2CMP_FRAME_BASE : public wxFrame
|
|||
wxScrolledWindow* m_GreyscalePicturePanel;
|
||||
wxScrolledWindow* m_BNPicturePanel;
|
||||
wxPanel* m_panelRight;
|
||||
wxStaticText* m_staticTextSizeX;
|
||||
wxStaticText* m_staticTextSize;
|
||||
wxStaticText* m_SizeXValue;
|
||||
wxStaticText* m_SizeXunits;
|
||||
wxStaticText* m_staticTextSizeY;
|
||||
wxStaticText* m_SizeYValue;
|
||||
wxStaticText* m_SizeYunits;
|
||||
wxStaticText* m_SizePixUnits;
|
||||
wxStaticText* m_staticTextSize1;
|
||||
wxStaticText* m_SizeXValue_mm;
|
||||
wxStaticText* m_SizeYValue_mm;
|
||||
wxStaticText* m_Size_mmxUnits;
|
||||
wxStaticText* m_staticTextBPP;
|
||||
wxStaticText* m_BPPValue;
|
||||
wxStaticText* m_BPPunits;
|
||||
wxStaticText* m_staticTextBPI;
|
||||
wxTextCtrl* m_DPIValueX;
|
||||
wxTextCtrl* m_DPIValueY;
|
||||
wxStaticText* m_DPI_Units;
|
||||
wxButton* m_buttonLoad;
|
||||
wxButton* m_buttonExport;
|
||||
wxRadioBox* m_radioBoxFormat;
|
||||
|
@ -66,6 +76,9 @@ class BM2CMP_FRAME_BASE : public wxFrame
|
|||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnPaint( wxPaintEvent& event ) { event.Skip(); }
|
||||
virtual void UpdatePPITextValueX( wxMouseEvent& event ) { event.Skip(); }
|
||||
virtual void OnResolutionChange( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void UpdatePPITextValueY( wxMouseEvent& event ) { event.Skip(); }
|
||||
virtual void OnLoadFile( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnExport( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnOptionsSelection( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
|
|
@ -138,12 +138,12 @@ BITMAPCONV_INFO::BITMAPCONV_INFO()
|
|||
}
|
||||
|
||||
|
||||
int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFormat )
|
||||
int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile,
|
||||
int aFormat, int aDpi_X, int aDpi_Y )
|
||||
{
|
||||
potrace_param_t* param;
|
||||
potrace_state_t* st;
|
||||
|
||||
|
||||
// set tracing parameters, starting from defaults
|
||||
param = potrace_param_default();
|
||||
if( !param )
|
||||
|
@ -171,8 +171,8 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFo
|
|||
{
|
||||
case 4:
|
||||
info.m_Format = KICAD_LOGO;
|
||||
info.m_ScaleX = 1e3 * 25.4 / 300; // the conversion scale from PPI to micro
|
||||
info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom
|
||||
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;
|
||||
|
||||
|
@ -186,22 +186,22 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFo
|
|||
|
||||
case 2:
|
||||
info.m_Format = EESCHEMA_FMT;
|
||||
info.m_ScaleX = 1000.0 / 300; // the conversion scale from PPI to UI
|
||||
info.m_ScaleY = -info.m_ScaleX; // Y axis is bottom to Top for components in libs
|
||||
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:
|
||||
info.m_Format = PCBNEW_KICAD_MOD;
|
||||
info.m_ScaleX = 1e6 * 25.4 / 300; // the conversion scale from PPI to UI
|
||||
info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom in modedit
|
||||
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 / 300; // the conversion scale
|
||||
info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom in modedit
|
||||
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;
|
||||
|
||||
|
@ -355,7 +355,7 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
|
|||
|
||||
case PCBNEW_LEGACY_EMP:
|
||||
{
|
||||
LAYER_NUM layer = SILKSCREEN_N_FRONT;
|
||||
LAYER_NUM layer = F_SilkS;
|
||||
int width = 1;
|
||||
fprintf( m_Outfile, "DP %d %d %d %d %d %d %d\n",
|
||||
0, 0, 0, 0,
|
||||
|
|
|
@ -176,6 +176,7 @@ set( BMAPS_MID
|
|||
copyblock
|
||||
copycomponent
|
||||
copy_button
|
||||
copy_library
|
||||
copper_layers_setup
|
||||
cursor_shape
|
||||
cursor
|
||||
|
@ -286,7 +287,6 @@ set( BMAPS_MID
|
|||
import
|
||||
info
|
||||
insert_module_board
|
||||
invert_module
|
||||
invisible_text
|
||||
kicad_icon_small
|
||||
label2glabel
|
||||
|
@ -334,6 +334,8 @@ set( BMAPS_MID
|
|||
mirepcb
|
||||
mirror_h
|
||||
mirror_v
|
||||
mirror_footprint_axisX
|
||||
mirror_footprint_axisY
|
||||
mode_module
|
||||
mode_track
|
||||
modratsnest
|
||||
|
@ -458,8 +460,8 @@ set( BMAPS_MID
|
|||
right
|
||||
rotate_field
|
||||
rotate_glabel
|
||||
rotate_module_neg
|
||||
rotate_module_pos
|
||||
rotate_module_cw
|
||||
rotate_module_ccw
|
||||
rotate_pin
|
||||
rotate_ccw
|
||||
rotate_cw
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
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, 0x06, 0x5f, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x79, 0x4c, 0x54,
|
||||
0x57, 0x14, 0xc6, 0x5f, 0x97, 0xa4, 0x8d, 0xd1, 0xf4, 0x0f, 0xd3, 0x58, 0x40, 0x23, 0x51, 0xb0,
|
||||
0x35, 0x30, 0x52, 0x53, 0xa0, 0x2a, 0x1a, 0x96, 0xaa, 0x65, 0x51, 0x89, 0x16, 0x6d, 0xad, 0xb5,
|
||||
0xd1, 0xba, 0x44, 0x45, 0xc4, 0xa5, 0x8a, 0x11, 0x11, 0x17, 0x6a, 0x1c, 0xd4, 0x26, 0xa2, 0xb6,
|
||||
0x01, 0xea, 0xda, 0x5a, 0xc5, 0x28, 0x08, 0x8c, 0x02, 0x65, 0x86, 0x19, 0x18, 0x66, 0x80, 0x61,
|
||||
0x19, 0x04, 0x59, 0x67, 0x5f, 0x90, 0x81, 0x41, 0x20, 0x08, 0xb3, 0xbd, 0x37, 0xef, 0xf4, 0xdc,
|
||||
0x67, 0xb5, 0xd8, 0x46, 0xaa, 0x4d, 0xd3, 0x97, 0x9c, 0x64, 0x66, 0x72, 0xef, 0xfd, 0x9d, 0xef,
|
||||
0x9c, 0xef, 0xdc, 0x37, 0x14, 0x00, 0x50, 0x24, 0x84, 0xbe, 0xbe, 0xfb, 0x44, 0xd3, 0xa7, 0x47,
|
||||
0x1c, 0xa6, 0xa8, 0xd7, 0x9f, 0xfe, 0xf6, 0x32, 0x51, 0x34, 0x61, 0xc2, 0xfb, 0xe2, 0x99, 0x33,
|
||||
0x93, 0x4b, 0x26, 0x4e, 0xfc, 0x60, 0xac, 0x75, 0x94, 0xb7, 0xb7, 0xf7, 0x2e, 0x5f, 0x5f, 0xdf,
|
||||
0x84, 0x5b, 0xa1, 0xa1, 0x97, 0x8c, 0x39, 0x39, 0x17, 0xa5, 0xf3, 0xe7, 0x9f, 0x40, 0xe8, 0xa2,
|
||||
0x9b, 0x14, 0xf5, 0xc6, 0x8b, 0x36, 0x89, 0x29, 0xea, 0xcd, 0xe2, 0xa9, 0x53, 0xc3, 0x85, 0x3c,
|
||||
0xde, 0x09, 0xc9, 0x8e, 0x1d, 0xd7, 0x85, 0x7c, 0x7e, 0x55, 0x9c, 0xa7, 0xe7, 0x4d, 0x2f, 0x2f,
|
||||
0xaf, 0x98, 0x17, 0x82, 0x02, 0x02, 0x02, 0x4e, 0x68, 0xb5, 0xda, 0x2b, 0x85, 0xeb, 0xd7, 0x37,
|
||||
0x8a, 0x44, 0xa2, 0x0e, 0x81, 0x40, 0xd0, 0x22, 0xcf, 0xca, 0x2a, 0x29, 0x0e, 0x0c, 0x3c, 0x9d,
|
||||
0x3f, 0x6e, 0x9c, 0xe7, 0x5f, 0x37, 0x94, 0x4e, 0x9e, 0xcc, 0xfb, 0x95, 0xc7, 0xfb, 0x45, 0x70,
|
||||
0xec, 0x58, 0x5d, 0x91, 0x40, 0xd0, 0x51, 0x5e, 0x5e, 0xae, 0x31, 0x8a, 0x44, 0x6a, 0x49, 0x7a,
|
||||
0x7a, 0x91, 0xa7, 0xa7, 0xe7, 0x17, 0x63, 0x82, 0xf0, 0xc3, 0x95, 0xb6, 0xe3, 0xc7, 0x1f, 0x0c,
|
||||
0x0e, 0x0e, 0x1a, 0xf0, 0x31, 0x49, 0x24, 0x12, 0x83, 0xa4, 0xb4, 0xb4, 0xfd, 0x52, 0x58, 0x98,
|
||||
0xf0, 0x7b, 0x0f, 0x8f, 0x05, 0xdc, 0x62, 0x8a, 0x7a, 0xed, 0xa7, 0x69, 0xd3, 0x12, 0xaf, 0xae,
|
||||
0x5c, 0xa9, 0x50, 0xd6, 0xd7, 0x77, 0xd6, 0xd5, 0xd5, 0x19, 0x31, 0x41, 0xd3, 0xc8, 0xc8, 0x88,
|
||||
0xbe, 0x47, 0x2a, 0xd5, 0x8a, 0x11, 0x84, 0x8a, 0x56, 0x8d, 0x05, 0xe2, 0x13, 0x90, 0x2a, 0x3d,
|
||||
0xbd, 0x79, 0x78, 0x78, 0x58, 0x8f, 0x9f, 0xd5, 0xfd, 0xfd, 0xfd, 0xc6, 0x86, 0x86, 0x86, 0xae,
|
||||
0x96, 0x07, 0x0f, 0x74, 0x97, 0xe2, 0xe2, 0x94, 0xc7, 0xbc, 0xbc, 0x92, 0x4f, 0xcd, 0x98, 0x71,
|
||||
0x4f, 0x78, 0xf6, 0x6c, 0x0b, 0x3e, 0x7a, 0x0c, 0x33, 0x59, 0xcb, 0xb2, 0xac, 0xc6, 0x6e, 0xb7,
|
||||
0xeb, 0x2c, 0xe5, 0xe5, 0x5a, 0x31, 0x9f, 0x7f, 0x0f, 0x41, 0x2b, 0x5f, 0x0a, 0x84, 0x9b, 0xb4,
|
||||
0xf5, 0xf5, 0xf5, 0x5d, 0x7d, 0x7d, 0x7d, 0x46, 0x72, 0x40, 0x47, 0x47, 0x87, 0xf9, 0xb6, 0xf4,
|
||||
0xb6, 0x65, 0x77, 0xd2, 0x7c, 0x47, 0x7d, 0x45, 0x89, 0xa1, 0xba, 0xba, 0xda, 0x6c, 0xb5, 0x5a,
|
||||
0x0d, 0x4e, 0xa7, 0x53, 0x3b, 0x30, 0x30, 0x60, 0x68, 0x6c, 0x6c, 0xec, 0xea, 0xee, 0xee, 0x36,
|
||||
0xf4, 0xcb, 0x64, 0xea, 0x32, 0x3e, 0xff, 0x2e, 0x82, 0xe2, 0x46, 0x1f, 0xee, 0x97, 0xe3, 0x17,
|
||||
0x12, 0x56, 0x30, 0x3f, 0x8d, 0x03, 0xf1, 0x78, 0xbc, 0x67, 0x20, 0x52, 0x3a, 0x54, 0x63, 0xb8,
|
||||
0x7f, 0xff, 0xbe, 0x49, 0x28, 0x14, 0x3e, 0xdc, 0xbe, 0x7d, 0xfb, 0xf0, 0x91, 0x9c, 0xd4, 0xc1,
|
||||
0xec, 0xca, 0xd3, 0xee, 0xb4, 0x9a, 0x54, 0xfb, 0xd9, 0xc6, 0x33, 0x83, 0xc6, 0x5e, 0x83, 0x09,
|
||||
0x01, 0x66, 0x54, 0x4c, 0xa0, 0x46, 0x04, 0x1a, 0x2d, 0x12, 0x89, 0x56, 0x94, 0x9e, 0x7e, 0xd7,
|
||||
0xc3, 0xc3, 0x63, 0x85, 0x4f, 0x86, 0xcf, 0x5b, 0x73, 0xef, 0x04, 0x7f, 0xfd, 0xa9, 0xe0, 0x93,
|
||||
0xd2, 0x53, 0xd5, 0x7c, 0x55, 0xf4, 0xd5, 0xc5, 0xe6, 0x49, 0x93, 0x26, 0x15, 0x53, 0xfe, 0xfe,
|
||||
0xfe, 0xe9, 0x4f, 0x41, 0x43, 0x43, 0x43, 0x7a, 0xa2, 0xc4, 0xe1, 0x70, 0xe8, 0x6e, 0xdc, 0xb8,
|
||||
0xd1, 0x93, 0x9a, 0x9a, 0x4a, 0x1f, 0xbe, 0x76, 0x88, 0x2e, 0x50, 0xe6, 0x82, 0xb4, 0xa2, 0x82,
|
||||
0x55, 0x68, 0x14, 0xee, 0xdd, 0xa5, 0xbb, 0x9c, 0xd9, 0xca, 0xac, 0x7e, 0xb2, 0x8e, 0x28, 0x23,
|
||||
0x7b, 0x7a, 0x24, 0x12, 0x4d, 0x29, 0x2a, 0x0a, 0x38, 0xc2, 0xcb, 0x8e, 0xbe, 0x11, 0xd9, 0xfa,
|
||||
0x73, 0xed, 0xd5, 0x21, 0x45, 0x9d, 0xc2, 0x61, 0x32, 0x99, 0x9c, 0x7b, 0xca, 0x76, 0xda, 0xa3,
|
||||
0xa3, 0xa3, 0xe5, 0x7f, 0x82, 0xf8, 0x7c, 0xd2, 0x23, 0x9d, 0x52, 0xa9, 0x34, 0x35, 0x35, 0x35,
|
||||
0x75, 0xe5, 0xe7, 0xe7, 0x5b, 0xb2, 0xb3, 0xb3, 0x5d, 0x22, 0xa3, 0x90, 0xa9, 0x30, 0x88, 0x61,
|
||||
0x64, 0x78, 0x18, 0xe4, 0x72, 0x39, 0x8b, 0xe5, 0x63, 0xb3, 0x65, 0x99, 0xee, 0x84, 0xdc, 0x78,
|
||||
0x5b, 0x6d, 0x43, 0xad, 0xf9, 0xd1, 0xa3, 0x47, 0x3a, 0x8d, 0x50, 0xa0, 0x5b, 0x91, 0xb9, 0xc8,
|
||||
0x7a, 0x5a, 0x74, 0xd2, 0x8e, 0xe5, 0x76, 0x29, 0x14, 0x0a, 0xba, 0xa7, 0xa7, 0x87, 0x76, 0xb9,
|
||||
0x5c, 0xf4, 0xc1, 0xea, 0x03, 0xf6, 0xa8, 0xa8, 0x28, 0x39, 0xe5, 0xe7, 0xe7, 0xf7, 0x0c, 0x44,
|
||||
0x94, 0x90, 0x52, 0x68, 0x34, 0x1a, 0xf3, 0xf9, 0xf3, 0xe7, 0xad, 0x99, 0x99, 0x99, 0x2e, 0xb1,
|
||||
0x59, 0xcc, 0x48, 0x4d, 0x12, 0x00, 0xec, 0x3c, 0x6e, 0x04, 0x74, 0x25, 0x54, 0xa0, 0xba, 0xdf,
|
||||
0xda, 0x4a, 0xd8, 0xb8, 0x0b, 0xcb, 0xe9, 0xeb, 0xd2, 0xeb, 0xbd, 0x4b, 0xb2, 0x16, 0x31, 0x55,
|
||||
0x2a, 0x99, 0x1b, 0x13, 0x71, 0xe3, 0x5e, 0x9a, 0x3c, 0x78, 0xa6, 0xcb, 0xed, 0x76, 0xd3, 0x87,
|
||||
0x14, 0xc9, 0xb6, 0xc5, 0x8b, 0x17, 0x3f, 0x0f, 0x32, 0x9b, 0xcd, 0xc6, 0xb6, 0xb6, 0x36, 0xce,
|
||||
0x51, 0x44, 0x11, 0xc2, 0x68, 0xb1, 0xa9, 0x8c, 0xa9, 0x30, 0x4b, 0x00, 0x33, 0x05, 0x8b, 0xc5,
|
||||
0x02, 0x04, 0x86, 0x96, 0x06, 0x9c, 0x39, 0xa8, 0x6e, 0xaf, 0x66, 0x17, 0xe5, 0x84, 0x43, 0x6b,
|
||||
0x67, 0x0b, 0x4b, 0x4a, 0x8b, 0xe5, 0x64, 0xf0, 0xa1, 0x6d, 0x36, 0x1b, 0x8d, 0x3d, 0x64, 0x88,
|
||||
0xa2, 0xd4, 0xda, 0x83, 0xb6, 0x85, 0x0b, 0x17, 0x3e, 0x01, 0x35, 0x37, 0x37, 0xe7, 0x15, 0xef,
|
||||
0xdc, 0xa9, 0x2a, 0x2a, 0x2c, 0xec, 0xbd, 0x75, 0xeb, 0x96, 0xf5, 0xf2, 0xe5, 0xcb, 0xd6, 0xa3,
|
||||
0x47, 0x8f, 0x0e, 0x64, 0x64, 0x64, 0xd0, 0x65, 0x06, 0x91, 0x5b, 0x6c, 0x14, 0x01, 0xaa, 0x05,
|
||||
0x5c, 0xc7, 0x95, 0xef, 0xf1, 0xe3, 0xc7, 0x04, 0xc8, 0xf6, 0xf4, 0xf6, 0xb0, 0x9f, 0xdd, 0x89,
|
||||
0x85, 0x3e, 0xab, 0x95, 0x75, 0x39, 0x9d, 0x2c, 0x26, 0xc0, 0xd4, 0xd4, 0xd4, 0x30, 0x58, 0x3a,
|
||||
0x06, 0x7b, 0xc7, 0x95, 0xee, 0x90, 0xe2, 0x80, 0x2d, 0x22, 0x22, 0x42, 0x4e, 0x05, 0x06, 0x06,
|
||||
0xb6, 0x60, 0xb3, 0x1c, 0xcb, 0x63, 0x63, 0x9d, 0xc1, 0x41, 0x41, 0x10, 0x16, 0x1a, 0xca, 0xc5,
|
||||
0xec, 0xd9, 0xb3, 0x01, 0xcd, 0x00, 0x85, 0x2d, 0x05, 0x20, 0x32, 0x08, 0x39, 0x10, 0xa9, 0xc8,
|
||||
0xf0, 0x93, 0x5e, 0x41, 0x7b, 0x7b, 0x3b, 0x6b, 0x1b, 0x19, 0x61, 0x97, 0xe7, 0x2d, 0x05, 0x02,
|
||||
0xc1, 0x24, 0xdc, 0x95, 0x95, 0x95, 0x6e, 0x84, 0xd1, 0x44, 0x15, 0x56, 0x9a, 0x7e, 0xa2, 0x28,
|
||||
0xd9, 0x16, 0x1a, 0x1a, 0x2a, 0xa7, 0xe6, 0xcc, 0x99, 0x63, 0x4c, 0x49, 0x49, 0xe1, 0x0e, 0x8d,
|
||||
0x8c, 0x8c, 0x84, 0x0d, 0x1b, 0x36, 0xc0, 0xba, 0x75, 0xeb, 0x20, 0x31, 0x31, 0x11, 0xce, 0x9d,
|
||||
0x3b, 0x07, 0x12, 0x34, 0x42, 0x99, 0x51, 0x08, 0x3a, 0x9d, 0x0e, 0x30, 0x5b, 0xf8, 0x43, 0x0d,
|
||||
0x18, 0xf4, 0x7a, 0xb6, 0xb3, 0xb3, 0x93, 0x8d, 0xcd, 0x5b, 0xc2, 0xa2, 0xdd, 0x19, 0x9c, 0x27,
|
||||
0x86, 0xf4, 0x04, 0x13, 0xa2, 0x71, 0xa0, 0x19, 0x9c, 0x47, 0x86, 0xc0, 0x0e, 0x62, 0x8f, 0x16,
|
||||
0x2c, 0x58, 0x20, 0xa7, 0xe6, 0xcd, 0x9b, 0xa7, 0x19, 0x0d, 0xda, 0xb2, 0x65, 0x0b, 0xec, 0xdd,
|
||||
0xbb, 0x17, 0x36, 0x6d, 0xda, 0xc4, 0x81, 0xca, 0x8d, 0x12, 0x10, 0x1a, 0x4a, 0x01, 0xeb, 0xce,
|
||||
0xa9, 0xc1, 0xac, 0xa1, 0xb5, 0xb5, 0x15, 0x48, 0x3f, 0xec, 0x0e, 0x3b, 0xbd, 0x2c, 0x37, 0xc6,
|
||||
0x4d, 0x9a, 0x4f, 0x00, 0x6a, 0xb5, 0x9a, 0xae, 0xaa, 0xaa, 0x62, 0x88, 0xe3, 0xc8, 0x77, 0xce,
|
||||
0x75, 0x08, 0x0a, 0x09, 0x09, 0x79, 0x1e, 0x14, 0x1e, 0x1e, 0xce, 0x41, 0x36, 0x6e, 0xdc, 0x08,
|
||||
0xfb, 0xf7, 0xef, 0x07, 0xec, 0x11, 0x07, 0x2a, 0xd1, 0x16, 0x81, 0x4a, 0xa5, 0x22, 0x87, 0x03,
|
||||
0xce, 0x0e, 0xa7, 0x0e, 0xef, 0x43, 0xf7, 0xc0, 0xe0, 0x00, 0xbd, 0x14, 0x41, 0xbd, 0xbd, 0xbd,
|
||||
0xb4, 0x54, 0x2a, 0x65, 0xf4, 0x7a, 0x3d, 0x77, 0x38, 0x09, 0x34, 0x16, 0x8d, 0xea, 0xe9, 0x14,
|
||||
0x04, 0xcd, 0x9d, 0x3b, 0xb7, 0xea, 0x39, 0xd0, 0xb6, 0x6d, 0xdb, 0x60, 0xd9, 0xb2, 0x65, 0x5c,
|
||||
0x60, 0x16, 0x80, 0x86, 0x80, 0xe2, 0xb6, 0x7b, 0x50, 0xa8, 0x2e, 0x00, 0xb4, 0x3d, 0x60, 0xb6,
|
||||
0x80, 0x6e, 0xe2, 0xd4, 0x11, 0x7b, 0x3d, 0xec, 0x7e, 0xc8, 0x81, 0xc8, 0xa1, 0x4f, 0xcb, 0x86,
|
||||
0xbd, 0x63, 0xf0, 0xc2, 0x65, 0xf0, 0xc2, 0xa5, 0x6d, 0x76, 0x1b, 0x9d, 0x54, 0xf5, 0xad, 0x2d,
|
||||
0x38, 0x38, 0xf8, 0x09, 0x28, 0x3e, 0x3e, 0x9e, 0xeb, 0xc9, 0xbe, 0x7d, 0xfb, 0x9e, 0xc5, 0xea,
|
||||
0xd5, 0xab, 0x21, 0x29, 0x29, 0x09, 0x34, 0x5d, 0x6a, 0x38, 0x59, 0xc7, 0x87, 0x23, 0x35, 0xa9,
|
||||
0x70, 0x57, 0x2d, 0x00, 0x43, 0x17, 0x37, 0x47, 0xc4, 0xea, 0x8c, 0xcd, 0x61, 0xa3, 0x97, 0xe6,
|
||||
0x45, 0x73, 0xa5, 0xc3, 0x1e, 0xd1, 0x32, 0x99, 0x8c, 0xd1, 0x1b, 0xf4, 0xb4, 0xcc, 0x54, 0x49,
|
||||
0x9f, 0x54, 0x9e, 0x70, 0xec, 0xac, 0xdc, 0x61, 0xcb, 0x90, 0x9d, 0xb1, 0xe2, 0xfb, 0xae, 0x9e,
|
||||
0x03, 0x91, 0x52, 0x91, 0xcd, 0xa3, 0xa3, 0xa8, 0xa8, 0x08, 0x12, 0x12, 0x12, 0x20, 0x36, 0x36,
|
||||
0x16, 0x56, 0xad, 0x5a, 0x05, 0x69, 0xc7, 0xd3, 0xe0, 0x87, 0x92, 0xf3, 0x70, 0xb8, 0x2a, 0x05,
|
||||
0x2e, 0x35, 0x5f, 0x60, 0x1b, 0x94, 0x0d, 0x8c, 0x4a, 0xa3, 0xa2, 0x97, 0xdc, 0x8e, 0x76, 0x13,
|
||||
0x33, 0x34, 0x35, 0x37, 0x31, 0x97, 0x5b, 0x2e, 0x3a, 0xbf, 0xcc, 0xfd, 0x7c, 0x24, 0x26, 0x2d,
|
||||
0xd2, 0x30, 0x2b, 0x7c, 0x56, 0xad, 0x8f, 0x8f, 0xcf, 0x3d, 0x8c, 0xd3, 0xe3, 0xc7, 0x8f, 0x8f,
|
||||
0x7a, 0x21, 0x68, 0x74, 0x90, 0xe1, 0xcc, 0xca, 0xca, 0x82, 0x3d, 0x7b, 0xf6, 0x00, 0x96, 0x01,
|
||||
0xd6, 0x1e, 0xfe, 0x8a, 0x49, 0x96, 0xed, 0x77, 0x58, 0x86, 0xbb, 0xe9, 0x25, 0xb9, 0xd1, 0x6e,
|
||||
0xfd, 0x90, 0xde, 0xb5, 0x36, 0x6f, 0xcd, 0x88, 0xff, 0x9a, 0x99, 0x6d, 0x78, 0x81, 0x7e, 0x43,
|
||||
0x51, 0xd4, 0x94, 0xbf, 0xbd, 0x26, 0x5e, 0x06, 0x34, 0x3a, 0x88, 0x59, 0xd0, 0xae, 0x83, 0xde,
|
||||
0x1f, 0x79, 0x97, 0x2d, 0xfc, 0x31, 0x62, 0x20, 0xe4, 0x5a, 0x30, 0xfb, 0xf1, 0x77, 0x41, 0x96,
|
||||
0xf7, 0xfc, 0xdf, 0xdd, 0x44, 0x8d, 0xf1, 0xfa, 0xff, 0x57, 0x20, 0x34, 0x4b, 0x5f, 0x50, 0x50,
|
||||
0xd0, 0x87, 0xe3, 0xa6, 0x8c, 0xf3, 0x7a, 0x27, 0x6a, 0xc2, 0xee, 0xb1, 0x00, 0xff, 0x09, 0xe8,
|
||||
0x55, 0xfe, 0x2d, 0xfd, 0xaf, 0x20, 0x35, 0xb1, 0xf6, 0xd6, 0xad, 0x5b, 0x39, 0x8b, 0xff, 0x53,
|
||||
0x6c, 0xde, 0xbc, 0x19, 0x62, 0x62, 0x62, 0x1e, 0xe1, 0x5d, 0x18, 0xf0, 0x4a, 0x20, 0xbc, 0xeb,
|
||||
0x36, 0xe2, 0xe4, 0x76, 0xe3, 0x80, 0x3e, 0x7c, 0xd9, 0xc0, 0xf5, 0xb2, 0xb0, 0xb0, 0xb0, 0xb7,
|
||||
0x5f, 0x05, 0xf4, 0x3b, 0xd6, 0xb8, 0x5a, 0x39, 0x98, 0x47, 0x6d, 0xf0, 0x00, 0x00, 0x00, 0x00,
|
||||
0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE copy_library_xpm[1] = {{ png, sizeof( png ), "copy_library_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -1,63 +0,0 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
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, 0x02, 0xde, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
|
||||
0x03, 0x3d, 0x30, 0xe9, 0x1a, 0x18, 0x18, 0x2c, 0x81, 0xd8, 0x9d, 0x1e, 0x16, 0x25, 0x00, 0x71,
|
||||
0xc5, 0xb0, 0xb2, 0x88, 0x07, 0x88, 0xf9, 0xc9, 0xb6, 0x08, 0x08, 0xf8, 0x80, 0x58, 0x00, 0x07,
|
||||
0xe6, 0x42, 0x52, 0x67, 0x00, 0xc4, 0x36, 0x48, 0x7c, 0x69, 0x20, 0x56, 0xc7, 0x81, 0xd5, 0x80,
|
||||
0x98, 0x09, 0xdd, 0xa2, 0x28, 0x20, 0x4e, 0xc1, 0x81, 0xbd, 0x71, 0x05, 0x5d, 0x69, 0x69, 0xe9,
|
||||
0xa1, 0xf3, 0xe7, 0xcf, 0x7f, 0x03, 0xe1, 0xe6, 0xe6, 0xe6, 0x6f, 0x87, 0x0e, 0x1d, 0xfa, 0xd6,
|
||||
0xd5, 0xd5, 0x05, 0xe6, 0x2f, 0x58, 0xb0, 0xe0, 0x13, 0x50, 0xad, 0x3c, 0x54, 0x1f, 0x83, 0x02,
|
||||
0x10, 0xeb, 0x00, 0x71, 0x2c, 0x1e, 0x8b, 0x42, 0xa0, 0x6a, 0x24, 0x60, 0x16, 0xc5, 0xe8, 0xb0,
|
||||
0xb8, 0x16, 0x98, 0x30, 0x15, 0xd4, 0xc4, 0xb9, 0xdc, 0xd8, 0xbf, 0xa4, 0xef, 0xd7, 0xe3, 0xbb,
|
||||
0xd7, 0xbe, 0xbf, 0x7c, 0xf9, 0xf2, 0xdb, 0xfa, 0xf5, 0xeb, 0xbf, 0xfd, 0xfe, 0xfd, 0xfb, 0xdb,
|
||||
0xae, 0x25, 0x93, 0x7e, 0xcd, 0x6f, 0xc9, 0xfd, 0x9e, 0xa8, 0xcb, 0xd4, 0x18, 0xa7, 0xcb, 0x94,
|
||||
0x03, 0xb2, 0xc8, 0x0d, 0x8f, 0x05, 0xe8, 0xd8, 0x02, 0x88, 0x45, 0x81, 0x58, 0x6a, 0xba, 0x3b,
|
||||
0xd3, 0xac, 0xbb, 0x79, 0x5c, 0xff, 0xe7, 0x15, 0x7a, 0xfe, 0xff, 0x57, 0xc1, 0xf0, 0x7f, 0xff,
|
||||
0xf2, 0x29, 0xbf, 0x80, 0x2e, 0xff, 0x06, 0xc3, 0x07, 0x32, 0x65, 0xff, 0xed, 0x2b, 0xd2, 0xff,
|
||||
0x0f, 0xc2, 0x3b, 0xc2, 0x19, 0x1f, 0x81, 0x2c, 0x72, 0x27, 0xd1, 0x22, 0x50, 0xd8, 0x1b, 0xf4,
|
||||
0xbb, 0x30, 0xcd, 0xbd, 0x9d, 0xc9, 0xf2, 0x7f, 0x69, 0x96, 0xe9, 0xff, 0xf7, 0x85, 0x0c, 0xff,
|
||||
0xf7, 0x2e, 0x9b, 0x8c, 0x62, 0xd1, 0xd6, 0x14, 0x99, 0x7f, 0x07, 0x72, 0x14, 0xff, 0x83, 0xf0,
|
||||
0x9a, 0x20, 0xc6, 0xc7, 0x0c, 0xd0, 0xc8, 0x06, 0x05, 0x49, 0x34, 0x1e, 0x0b, 0xfc, 0xa0, 0x6a,
|
||||
0xb8, 0x61, 0x41, 0x67, 0x21, 0xc1, 0xa0, 0x60, 0x2d, 0xcb, 0x62, 0x5b, 0x94, 0x99, 0x74, 0xfa,
|
||||
0xfc, 0x89, 0x83, 0x3f, 0x3e, 0xbe, 0x7b, 0xfb, 0x1d, 0xd9, 0xa2, 0x4b, 0x67, 0x8e, 0xff, 0x58,
|
||||
0x3c, 0x67, 0xda, 0x17, 0x2d, 0x51, 0xe6, 0x50, 0x63, 0x71, 0x56, 0x73, 0x90, 0x45, 0x66, 0xd0,
|
||||
0xe0, 0x4b, 0xc0, 0x63, 0x51, 0x0c, 0x54, 0x8d, 0x16, 0xcc, 0xa2, 0x22, 0x33, 0xa6, 0xf2, 0xa5,
|
||||
0xfe, 0x8c, 0x9b, 0xa6, 0x84, 0x2b, 0xbc, 0xd9, 0xdf, 0xec, 0xf3, 0xe7, 0xcc, 0xde, 0x8d, 0x3f,
|
||||
0x91, 0x2d, 0x5a, 0x5a, 0x11, 0xf8, 0x67, 0x65, 0x9e, 0xe5, 0xef, 0x69, 0xee, 0x8c, 0x7b, 0x6b,
|
||||
0xac, 0x19, 0xd7, 0x92, 0x13, 0x47, 0x72, 0x40, 0xac, 0x0a, 0x8a, 0xa3, 0xb3, 0xe9, 0xbc, 0xff,
|
||||
0x27, 0x57, 0xa5, 0xe0, 0x8c, 0xa3, 0xf5, 0x25, 0x8e, 0xff, 0x41, 0x18, 0x16, 0x47, 0xb6, 0x40,
|
||||
0x1c, 0x08, 0xc4, 0x49, 0x78, 0x2c, 0x00, 0xf9, 0x22, 0x00, 0x88, 0x0d, 0x81, 0x58, 0x11, 0x88,
|
||||
0x35, 0x4b, 0xcd, 0x99, 0xda, 0x81, 0x61, 0x7f, 0xba, 0x2f, 0x44, 0xe9, 0xeb, 0x81, 0x32, 0xd3,
|
||||
0xbf, 0x47, 0x37, 0x2f, 0x45, 0xf1, 0xd1, 0xbc, 0x6c, 0xdb, 0xbf, 0x4b, 0x52, 0xb4, 0xff, 0xce,
|
||||
0xf4, 0xe3, 0xb9, 0xde, 0x60, 0xcb, 0x78, 0x10, 0x64, 0x11, 0x0b, 0x10, 0xb3, 0x01, 0x71, 0x24,
|
||||
0x1e, 0x8b, 0x3c, 0xa1, 0x6a, 0x98, 0x61, 0x41, 0x07, 0xc4, 0x1c, 0xa0, 0xf8, 0xad, 0xab, 0xab,
|
||||
0xdb, 0xf7, 0xee, 0xdd, 0xbb, 0xef, 0xa0, 0x24, 0x8d, 0x6c, 0xd1, 0xc7, 0x8f, 0x1f, 0xbf, 0xed,
|
||||
0xdc, 0xb9, 0x13, 0x94, 0x8f, 0x74, 0xa1, 0x85, 0x01, 0x38, 0xd5, 0x81, 0x34, 0x27, 0xe3, 0xb2,
|
||||
0x88, 0x99, 0x99, 0x19, 0x44, 0xc7, 0x43, 0x4b, 0x6e, 0xb0, 0x45, 0xf5, 0x36, 0x4c, 0x73, 0x0f,
|
||||
0xc7, 0x32, 0x7d, 0x99, 0x1b, 0xa7, 0xf1, 0xf7, 0x7c, 0x06, 0xef, 0xff, 0xdd, 0x4b, 0x51, 0x83,
|
||||
0x6e, 0x7e, 0x8c, 0xe2, 0xbf, 0xcd, 0xc9, 0xb2, 0xff, 0x37, 0xc5, 0x8b, 0x7f, 0x9f, 0xe8, 0xca,
|
||||
0x78, 0x8f, 0x9c, 0x38, 0x02, 0x27, 0x6f, 0x50, 0x1c, 0x5d, 0xc9, 0xe2, 0xfe, 0x3f, 0xb1, 0x20,
|
||||
0x18, 0x67, 0x1c, 0x6d, 0x2a, 0xb4, 0xf8, 0x0f, 0xc2, 0xb0, 0x38, 0xd2, 0x04, 0x62, 0x53, 0xa8,
|
||||
0x8b, 0x71, 0x59, 0x10, 0x0e, 0x55, 0x23, 0x0f, 0x4d, 0xe6, 0x72, 0x19, 0x86, 0xcc, 0x11, 0x9d,
|
||||
0x0e, 0x4c, 0x1d, 0x9d, 0xb1, 0xe6, 0xf7, 0xf7, 0x4f, 0x2f, 0xfb, 0x7d, 0xeb, 0xe2, 0xf1, 0x1f,
|
||||
0xc8, 0x16, 0x6d, 0x9e, 0x52, 0xf9, 0x7b, 0x69, 0x6d, 0xf4, 0x8f, 0x1a, 0x2b, 0xa6, 0x69, 0xf9,
|
||||
0x66, 0x4c, 0xad, 0xc8, 0x65, 0x5d, 0x04, 0x1e, 0x8b, 0xdc, 0x71, 0x95, 0x75, 0xc0, 0x72, 0x6d,
|
||||
0x17, 0xb2, 0x05, 0xc8, 0xf8, 0xd8, 0xb1, 0x63, 0x1f, 0xe1, 0x65, 0x1d, 0x92, 0x01, 0x36, 0xd0,
|
||||
0x14, 0x88, 0x0d, 0x1b, 0xe0, 0xb2, 0x28, 0x24, 0x24, 0xa4, 0xb6, 0xa0, 0xa0, 0x60, 0x1a, 0x36,
|
||||
0x1c, 0x1f, 0x1f, 0x3f, 0x1b, 0x94, 0x10, 0xc8, 0xad, 0x8f, 0x40, 0xa9, 0xc8, 0x82, 0x1e, 0x15,
|
||||
0x1f, 0x3f, 0x10, 0x0b, 0x8d, 0xb6, 0x19, 0xc8, 0xb1, 0x08, 0x54, 0x08, 0x3b, 0xd3, 0xdc, 0x22,
|
||||
0x72, 0x31, 0x00, 0x9d, 0xf1, 0x4b, 0xb7, 0xf6, 0x3d, 0xa2, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x49,
|
||||
0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE invert_module_xpm[1] = {{ png, sizeof( png ), "invert_module_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -8,28 +8,23 @@
|
|||
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, 0x01, 0x3f, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0x78, 0xf6, 0xec, 0xd9,
|
||||
0x7f, 0x7a, 0x60, 0x86, 0x51, 0x8b, 0xc8, 0xb6, 0xe8, 0xe5, 0xcb, 0x97, 0xff, 0xdf, 0xbf, 0x7f,
|
||||
0x4f, 0x73, 0xcc, 0x00, 0x22, 0xe8, 0x01, 0x46, 0x2d, 0xa2, 0xb2, 0x45, 0x5f, 0xbf, 0xfe, 0xff,
|
||||
0x2f, 0x2f, 0x0f, 0xc1, 0x81, 0x81, 0xff, 0xff, 0x87, 0x85, 0x21, 0xf8, 0xcf, 0x9f, 0x93, 0x67,
|
||||
0xd1, 0x82, 0x65, 0x27, 0xfe, 0x5b, 0xb8, 0xcd, 0x45, 0xc1, 0x7d, 0x4d, 0x5b, 0x80, 0x32, 0x0c,
|
||||
0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0x3f, 0x7f, 0xfe, 0xff, 0xff, 0xcb, 0x96, 0xfd, 0xff, 0x1f,
|
||||
0x1a, 0x0a, 0x16, 0x9b, 0x55, 0xbb, 0x12, 0x43, 0x3d, 0x31, 0x98, 0x61, 0xea, 0xec, 0xc3, 0xff,
|
||||
0xf9, 0x15, 0xbb, 0x51, 0x70, 0x6b, 0xe1, 0x72, 0x84, 0x45, 0x25, 0x25, 0xff, 0xff, 0xd7, 0xd7,
|
||||
0xff, 0xff, 0x1f, 0x1c, 0x0c, 0x16, 0x9b, 0x9c, 0x37, 0x0f, 0x43, 0x3d, 0x31, 0x18, 0xab, 0x45,
|
||||
0xdd, 0x45, 0x4b, 0x21, 0x16, 0xcd, 0x9a, 0xf5, 0xff, 0xff, 0xba, 0x75, 0xff, 0xff, 0x6f, 0x01,
|
||||
0xfa, 0x70, 0xe1, 0x42, 0x88, 0x8f, 0xf2, 0xe7, 0x50, 0xcf, 0xa2, 0xd0, 0xf8, 0x55, 0xff, 0xff,
|
||||
0x73, 0x71, 0x81, 0x0d, 0x7e, 0x6b, 0x62, 0xf3, 0xff, 0xa5, 0x83, 0x17, 0xc4, 0x62, 0x26, 0xa6,
|
||||
0xff, 0x49, 0x49, 0xcb, 0xa9, 0x67, 0x91, 0x8c, 0xee, 0xc4, 0xff, 0x17, 0x83, 0xd2, 0xfe, 0x27,
|
||||
0x8a, 0xc5, 0xfc, 0xd7, 0x92, 0xad, 0xfe, 0xaf, 0x2c, 0xd7, 0xf0, 0x3f, 0x59, 0x34, 0xea, 0xff,
|
||||
0x69, 0xb7, 0xd8, 0xff, 0x0a, 0x86, 0x93, 0xc9, 0xb3, 0xe8, 0xd4, 0xdc, 0xb5, 0xff, 0xf7, 0x3a,
|
||||
0xc6, 0x60, 0xe0, 0x33, 0x39, 0x0d, 0xff, 0x03, 0xb5, 0xca, 0xe1, 0x0a, 0x7d, 0x34, 0xca, 0xff,
|
||||
0x9f, 0x2f, 0x68, 0xc1, 0xaa, 0x96, 0x18, 0xcc, 0xf0, 0xbe, 0xbf, 0x1f, 0x12, 0x2c, 0xd8, 0x30,
|
||||
0x30, 0x39, 0xcf, 0x0f, 0xa8, 0xfa, 0x3f, 0xcd, 0xa7, 0xea, 0xff, 0x3f, 0x35, 0x35, 0xdc, 0xea,
|
||||
0x88, 0xc0, 0xf8, 0x2d, 0x02, 0x61, 0x46, 0x46, 0x70, 0xdc, 0x50, 0x62, 0x09, 0x71, 0x16, 0x51,
|
||||
0x09, 0xd3, 0xd1, 0xa2, 0x19, 0x33, 0xfe, 0xff, 0x15, 0x15, 0xa5, 0x39, 0x1e, 0x6d, 0x33, 0x8c,
|
||||
0x5a, 0x04, 0xc7, 0x00, 0x6c, 0x3e, 0x11, 0x8b, 0x7d, 0x56, 0xa5, 0xec, 0x00, 0x00, 0x00, 0x00,
|
||||
0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
0xce, 0x00, 0x00, 0x00, 0xf4, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
|
||||
0x03, 0x3d, 0x30, 0xc3, 0xb0, 0xb4, 0xc8, 0x0c, 0x88, 0x2d, 0x68, 0x8d, 0x41, 0x16, 0xfd, 0xf8,
|
||||
0x4f, 0x07, 0x30, 0xb0, 0x16, 0xfd, 0xfe, 0xf3, 0xef, 0xff, 0xc5, 0x87, 0xaf, 0xff, 0xef, 0xbc,
|
||||
0xf4, 0xf8, 0xff, 0xab, 0x4f, 0x3f, 0x68, 0x67, 0x91, 0x71, 0xf9, 0x86, 0xff, 0x22, 0xe9, 0xd3,
|
||||
0xff, 0xab, 0x15, 0x76, 0xff, 0x67, 0x88, 0x5d, 0xf2, 0x7f, 0xd3, 0xce, 0xf3, 0xb4, 0xb1, 0xc8,
|
||||
0xa6, 0x7a, 0x13, 0xd8, 0x02, 0xf5, 0xb2, 0xf5, 0x60, 0x7a, 0xf7, 0xae, 0x73, 0x94, 0x5b, 0xd4,
|
||||
0xb9, 0xe5, 0xea, 0xef, 0xf6, 0xcd, 0x57, 0xfe, 0x23, 0x63, 0xdb, 0xaa, 0x0d, 0xff, 0xf7, 0x5c,
|
||||
0x79, 0xfe, 0xff, 0xde, 0xab, 0xcf, 0xff, 0xf3, 0x97, 0x9c, 0xf9, 0x5f, 0xdd, 0xbf, 0xe5, 0x3f,
|
||||
0xba, 0x1a, 0x52, 0x31, 0x03, 0x7b, 0xe2, 0x32, 0xb0, 0xab, 0x91, 0x71, 0x40, 0xdd, 0xfa, 0xff,
|
||||
0x1b, 0xce, 0x3e, 0xfe, 0xbf, 0xe9, 0xdc, 0x93, 0xff, 0xb3, 0xf6, 0xdd, 0xfa, 0xcf, 0x17, 0x39,
|
||||
0x07, 0x43, 0x0d, 0xc9, 0x18, 0x9b, 0x45, 0xfc, 0x40, 0x83, 0xab, 0x96, 0x9d, 0xfe, 0xbf, 0xef,
|
||||
0xda, 0x8b, 0xff, 0x36, 0x59, 0x0b, 0x29, 0xb7, 0x04, 0x97, 0x45, 0x20, 0xcc, 0x1d, 0x35, 0xef,
|
||||
0xbf, 0x42, 0xd8, 0x24, 0xea, 0x58, 0x82, 0xcf, 0x22, 0xaa, 0x63, 0xba, 0x59, 0xb4, 0x21, 0xae,
|
||||
0xf4, 0xdf, 0xba, 0x98, 0x92, 0xff, 0xb4, 0xc6, 0x0c, 0x6f, 0x95, 0xb4, 0xfe, 0xbf, 0x95, 0x51,
|
||||
0xa1, 0x39, 0x1e, 0xb5, 0x68, 0x28, 0x58, 0x34, 0x69, 0x12, 0xdf, 0xfb, 0xfe, 0x7e, 0x01, 0x5a,
|
||||
0x63, 0x86, 0xd1, 0x56, 0xd0, 0xa0, 0xb7, 0x08, 0x00, 0x49, 0xfd, 0x55, 0x27, 0xb8, 0xb7, 0x24,
|
||||
0x27, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE lang_sl_xpm[1] = {{ png, sizeof( png ), "lang_sl_xpm" }};
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
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, 0x02, 0xf6, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xdd, 0x94, 0x5d, 0x48, 0x93,
|
||||
0x51, 0x18, 0xc7, 0x77, 0x4a, 0xa7, 0x16, 0x6c, 0x19, 0xae, 0x95, 0x31, 0x15, 0xf3, 0x26, 0x2a,
|
||||
0x31, 0x8c, 0x3e, 0xdd, 0x10, 0x9d, 0x91, 0x5a, 0x2b, 0x12, 0xdb, 0x9c, 0xf3, 0xb3, 0xd0, 0x96,
|
||||
0x77, 0x96, 0x2b, 0xe8, 0xc3, 0x09, 0x11, 0x91, 0x10, 0x42, 0x31, 0x93, 0xb5, 0x51, 0x0b, 0x51,
|
||||
0x87, 0xb1, 0x44, 0xc1, 0xcb, 0x8a, 0x6e, 0x86, 0x5d, 0x34, 0x88, 0x1a, 0x14, 0x36, 0xd9, 0xd4,
|
||||
0x8a, 0x40, 0x52, 0x6a, 0x1f, 0xae, 0xbd, 0xa7, 0xf3, 0xbc, 0x3c, 0xd2, 0x2e, 0x52, 0x37, 0x41,
|
||||
0x89, 0x06, 0x7f, 0xc6, 0xef, 0x7f, 0x9e, 0xf3, 0xfc, 0xf7, 0x9e, 0xf7, 0xec, 0x11, 0x50, 0x4a,
|
||||
0x05, 0x7f, 0x13, 0xfb, 0x08, 0x3b, 0x14, 0x64, 0xdc, 0x51, 0x41, 0x7c, 0x57, 0x0e, 0x91, 0xe7,
|
||||
0xe0, 0xb5, 0xee, 0x27, 0x2e, 0xe0, 0xb6, 0x83, 0xe4, 0x2d, 0xf0, 0xc5, 0x03, 0xe4, 0x25, 0xb0,
|
||||
0x51, 0x4e, 0xc6, 0x59, 0xbd, 0x68, 0xb1, 0x5e, 0x7c, 0xbf, 0x45, 0x42, 0x44, 0x4c, 0x52, 0x87,
|
||||
0x56, 0x3c, 0xfb, 0xac, 0x55, 0x4e, 0x6d, 0x27, 0xc8, 0x18, 0x63, 0xb1, 0xf9, 0xb8, 0xf0, 0xd3,
|
||||
0x70, 0x5b, 0x21, 0x35, 0xab, 0x52, 0x7c, 0xc0, 0x0f, 0xcb, 0xc8, 0xeb, 0x91, 0x36, 0x39, 0x1d,
|
||||
0xd4, 0xa6, 0xce, 0x32, 0xce, 0x00, 0x8f, 0x29, 0x21, 0xa6, 0x20, 0x08, 0xd1, 0xeb, 0xf5, 0x1f,
|
||||
0x6d, 0x36, 0x9b, 0xaf, 0xaf, 0x4e, 0x16, 0x19, 0x6a, 0xaf, 0xa0, 0x8f, 0xea, 0x72, 0x82, 0xfd,
|
||||
0xfd, 0xfd, 0xde, 0x1e, 0xb5, 0x2c, 0x3c, 0x7a, 0x53, 0x43, 0x7b, 0x34, 0xb2, 0x5f, 0xc0, 0x16,
|
||||
0xdd, 0x8e, 0xd0, 0x30, 0x5b, 0xef, 0xad, 0xcf, 0x8a, 0x58, 0x2c, 0x96, 0x49, 0xf0, 0x14, 0x0a,
|
||||
0xc5, 0xd5, 0x58, 0x83, 0xc4, 0xb0, 0x21, 0x10, 0x08, 0xf8, 0x07, 0xd4, 0x9b, 0x38, 0x77, 0x93,
|
||||
0x80, 0x0e, 0xb4, 0xe4, 0x47, 0xd8, 0x9a, 0xdf, 0xaa, 0xcb, 0xe6, 0xd9, 0x5a, 0x25, 0xe3, 0x80,
|
||||
0x6d, 0xcd, 0x7b, 0x23, 0xfc, 0x3a, 0xab, 0x9b, 0x99, 0x99, 0x09, 0x80, 0x57, 0x52, 0x52, 0x72,
|
||||
0x23, 0xe6, 0x20, 0xa3, 0xd1, 0xf8, 0x39, 0x1c, 0x0e, 0xfb, 0x27, 0x26, 0x26, 0x02, 0x1e, 0x8f,
|
||||
0x27, 0x30, 0x3d, 0x3d, 0xcd, 0x37, 0xf1, 0xf9, 0x7c, 0x3c, 0x7b, 0xbd, 0x5e, 0x9e, 0xc1, 0x07,
|
||||
0x06, 0x01, 0xc7, 0x1d, 0x64, 0x32, 0x99, 0x26, 0xcd, 0x66, 0xb3, 0x7f, 0x61, 0x73, 0x3c, 0x8a,
|
||||
0x2b, 0xc8, 0x60, 0x30, 0x7c, 0xb1, 0xdb, 0xed, 0xab, 0x1f, 0x64, 0xb5, 0x5a, 0x7d, 0xb0, 0x29,
|
||||
0x18, 0x0c, 0xfa, 0xe1, 0x5d, 0xcd, 0xcf, 0xcf, 0xf3, 0x4d, 0x42, 0xa1, 0x10, 0xcf, 0xf0, 0x0d,
|
||||
0x0c, 0x3e, 0x30, 0xd4, 0xad, 0x28, 0x08, 0x2e, 0x03, 0x6c, 0xee, 0x56, 0x67, 0x72, 0x2f, 0x9a,
|
||||
0xa4, 0x9c, 0xa5, 0x45, 0xce, 0x5f, 0x86, 0x2e, 0xdd, 0xee, 0x08, 0x70, 0x97, 0x76, 0x27, 0xcf,
|
||||
0xdd, 0xcd, 0x47, 0x78, 0x86, 0xba, 0xb9, 0xb9, 0xb9, 0xf8, 0x83, 0x3a, 0x3b, 0x3b, 0xa7, 0x5c,
|
||||
0x2e, 0x97, 0xdf, 0xd1, 0xb0, 0x9d, 0x1b, 0xbc, 0x54, 0x4c, 0x9f, 0x5e, 0xc8, 0x8b, 0xb8, 0xdd,
|
||||
0x6e, 0xff, 0x93, 0xda, 0x6c, 0xce, 0x71, 0xf9, 0x28, 0x7d, 0x5c, 0x93, 0xc5, 0x01, 0x0f, 0x9c,
|
||||
0xcf, 0x8d, 0x0c, 0x19, 0x8a, 0xe9, 0x60, 0x7d, 0x06, 0xe7, 0x74, 0x3a, 0x03, 0xe0, 0x29, 0x95,
|
||||
0xca, 0xf6, 0x58, 0x83, 0x48, 0x7a, 0x7a, 0xfa, 0x61, 0xa9, 0x54, 0x5a, 0xd4, 0xa7, 0x95, 0xfc,
|
||||
0x18, 0xba, 0xa6, 0xa2, 0x0f, 0x4a, 0x13, 0xdf, 0x31, 0xaf, 0xe0, 0x5e, 0xf9, 0x86, 0xa9, 0xd1,
|
||||
0x8e, 0x0a, 0x6a, 0x52, 0x89, 0xbe, 0x02, 0xdf, 0x2f, 0x4d, 0x78, 0x3f, 0x72, 0x5d, 0x45, 0x7b,
|
||||
0xab, 0xb7, 0xfd, 0x94, 0x48, 0x24, 0xc7, 0xc0, 0x13, 0x89, 0x44, 0x9b, 0x63, 0x9e, 0x0c, 0x18,
|
||||
0x98, 0x64, 0x2e, 0x23, 0xdf, 0xde, 0x34, 0x92, 0xd0, 0x5d, 0x25, 0x71, 0x82, 0x77, 0xbb, 0x90,
|
||||
0x7c, 0x00, 0xbe, 0x53, 0x44, 0x3c, 0xc0, 0xb7, 0x0a, 0xc9, 0x18, 0x30, 0xd4, 0xc1, 0x49, 0xc4,
|
||||
0x3d, 0x82, 0xa2, 0xc2, 0xb6, 0x30, 0x6d, 0x65, 0x4a, 0x45, 0x4e, 0x43, 0x4e, 0x43, 0x4e, 0x45,
|
||||
0x96, 0x2e, 0xd5, 0x07, 0x6b, 0x05, 0xdf, 0xa3, 0x94, 0xc4, 0xa4, 0x8f, 0x62, 0x13, 0x16, 0x8d,
|
||||
0x45, 0x79, 0xfb, 0x98, 0x0a, 0xa2, 0xf8, 0x15, 0xd6, 0x58, 0xa2, 0xbc, 0x06, 0x9c, 0x7b, 0x7f,
|
||||
0x7a, 0x2f, 0xf3, 0x2b, 0x52, 0x50, 0x49, 0xc8, 0xc9, 0xc8, 0xc9, 0x0b, 0xc7, 0xbb, 0x50, 0xb3,
|
||||
0xec, 0x13, 0x2d, 0x11, 0xb2, 0x9e, 0x49, 0xc7, 0xd4, 0xc8, 0xa4, 0x42, 0xaf, 0x12, 0x59, 0x8d,
|
||||
0x7c, 0x12, 0x19, 0xea, 0x84, 0x71, 0x05, 0xc1, 0xad, 0x63, 0xda, 0xc5, 0x94, 0x8b, 0x47, 0x70,
|
||||
0x8e, 0x49, 0xc3, 0xb4, 0x87, 0xa9, 0x06, 0xb9, 0x16, 0x59, 0x83, 0x0c, 0x61, 0x79, 0xe8, 0x89,
|
||||
0x63, 0x0d, 0x12, 0x32, 0x55, 0x63, 0x83, 0x95, 0x28, 0xff, 0x9f, 0x0c, 0x6a, 0x58, 0xab, 0xa0,
|
||||
0xb3, 0x6b, 0x15, 0x54, 0xf7, 0xdf, 0xbd, 0x23, 0xdd, 0xaa, 0x07, 0x61, 0x58, 0x26, 0x53, 0x36,
|
||||
0x53, 0x3d, 0x6e, 0x86, 0x3f, 0x6a, 0x56, 0xd4, 0x93, 0xd6, 0x20, 0x57, 0x22, 0xc3, 0xe5, 0xc9,
|
||||
0x41, 0x6f, 0x63, 0xbc, 0x93, 0x61, 0x1d, 0xd3, 0x19, 0xa6, 0x2a, 0xa6, 0x32, 0xf4, 0x4e, 0x21,
|
||||
0x9f, 0x46, 0x2e, 0x47, 0x86, 0xba, 0xc4, 0xa5, 0x26, 0xc3, 0x6f, 0xb6, 0xf0, 0x43, 0xa9, 0x3d,
|
||||
0xc3, 0xa5, 0x58, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE mirror_footprint_axisX_xpm[1] = {{ png, sizeof( png ), "mirror_footprint_axisX_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,64 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
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, 0x02, 0xeb, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xed, 0x96, 0x5f, 0x48, 0x53,
|
||||
0x51, 0x1c, 0xc7, 0x77, 0xb6, 0xca, 0x86, 0x9a, 0xa6, 0xa5, 0x19, 0x65, 0xf6, 0x87, 0x0c, 0xd4,
|
||||
0xb2, 0x20, 0xc2, 0x14, 0x57, 0x2e, 0xff, 0x2e, 0x2b, 0xc2, 0x9c, 0x3a, 0xaf, 0x34, 0x8b, 0x1c,
|
||||
0xf8, 0x56, 0x42, 0xb3, 0x21, 0x83, 0x32, 0xea, 0xa5, 0x84, 0x5a, 0x98, 0xb1, 0x35, 0x72, 0x19,
|
||||
0x35, 0x03, 0xb7, 0x90, 0xf6, 0x10, 0xbe, 0xec, 0xa5, 0x41, 0xc4, 0xa0, 0x07, 0x21, 0x7a, 0x89,
|
||||
0x8a, 0xb9, 0xb5, 0x31, 0xff, 0x8d, 0xdd, 0x51, 0xee, 0x9e, 0x7e, 0x47, 0xee, 0xbd, 0x4c, 0x71,
|
||||
0xbb, 0x59, 0xb0, 0x97, 0x3a, 0xf0, 0x79, 0xd8, 0xe5, 0xfc, 0xf6, 0xd9, 0xef, 0x7c, 0x0f, 0xbf,
|
||||
0x3b, 0x11, 0xc6, 0x58, 0xf4, 0xbb, 0xc0, 0x5a, 0x0f, 0xe0, 0xd5, 0xd4, 0xf0, 0xb5, 0xff, 0xb6,
|
||||
0xe8, 0x6f, 0x88, 0xfd, 0xb5, 0xeb, 0x12, 0x80, 0xd8, 0x3d, 0x12, 0x40, 0x1b, 0x53, 0x83, 0x80,
|
||||
0xdc, 0x04, 0xe4, 0x2c, 0x11, 0xc1, 0xda, 0x0e, 0x74, 0x00, 0x14, 0x70, 0x1e, 0xb8, 0x00, 0x74,
|
||||
0xb2, 0x9f, 0x09, 0x25, 0x2b, 0x1d, 0x1d, 0xac, 0xe2, 0x81, 0x81, 0x01, 0x9f, 0xdd, 0x6e, 0xf7,
|
||||
0x58, 0xad, 0xd6, 0x29, 0x9d, 0x4e, 0xf7, 0xdd, 0x62, 0xb1, 0x4c, 0xf5, 0xf7, 0xf7, 0x2f, 0x3e,
|
||||
0xd3, 0xeb, 0xf5, 0x5f, 0xc9, 0x77, 0xb3, 0x7b, 0x45, 0x6b, 0x81, 0x5d, 0xc0, 0xc5, 0x04, 0x1c,
|
||||
0x62, 0x3b, 0xe3, 0x45, 0xb0, 0x32, 0x80, 0x72, 0xa7, 0xd3, 0x49, 0x4f, 0x4f, 0x4f, 0xd3, 0xf0,
|
||||
0x2c, 0x3c, 0x3e, 0x3e, 0x1e, 0x36, 0x9b, 0xcd, 0xe1, 0x48, 0x24, 0x12, 0x9e, 0x99, 0x99, 0xa1,
|
||||
0x6d, 0x36, 0x5b, 0x00, 0x21, 0x54, 0x22, 0x91, 0x48, 0xc8, 0x5e, 0x91, 0x12, 0x50, 0x0b, 0x88,
|
||||
0x3a, 0xd9, 0x8e, 0x33, 0x81, 0x87, 0x44, 0x62, 0xac, 0x47, 0x01, 0xab, 0x6a, 0x73, 0xe4, 0x65,
|
||||
0x47, 0x1e, 0x36, 0x35, 0xe7, 0x32, 0x9c, 0x8c, 0xe0, 0xf5, 0x7a, 0x69, 0x8b, 0x32, 0x9b, 0x79,
|
||||
0x4e, 0xe5, 0x31, 0xa3, 0x6d, 0x59, 0xf4, 0x1d, 0x39, 0xf2, 0x11, 0x51, 0xab, 0x80, 0x24, 0x56,
|
||||
0x96, 0xce, 0x76, 0x93, 0xf9, 0x5e, 0x8d, 0xe6, 0x5f, 0xf7, 0x29, 0xb0, 0x4d, 0x5b, 0x83, 0x5d,
|
||||
0x9a, 0x2c, 0x26, 0x18, 0x0c, 0xf2, 0x22, 0x8f, 0xc7, 0x43, 0xbb, 0x35, 0xe9, 0x8c, 0x5d, 0xa7,
|
||||
0xc0, 0x8e, 0x6b, 0xb5, 0xf8, 0x4d, 0x2b, 0x0a, 0x92, 0xa2, 0x7a, 0xa0, 0x49, 0x40, 0xd2, 0x02,
|
||||
0x34, 0xb2, 0x1d, 0x7d, 0x06, 0x52, 0xaf, 0x57, 0x22, 0xe7, 0xdd, 0xea, 0x35, 0x6e, 0x4b, 0xd7,
|
||||
0xc1, 0xa8, 0xb1, 0xbb, 0x32, 0x1a, 0x0a, 0x85, 0xc2, 0x9c, 0x88, 0x74, 0xf7, 0xb8, 0xbb, 0x22,
|
||||
0x6a, 0x52, 0x17, 0xfd, 0xb8, 0x57, 0x2d, 0x7e, 0xa7, 0x2d, 0x13, 0x3b, 0xb9, 0x50, 0xf3, 0x05,
|
||||
0x44, 0x07, 0xe2, 0x5c, 0x86, 0xfd, 0x6e, 0xb7, 0x9b, 0x17, 0x2c, 0x67, 0x62, 0x62, 0xc2, 0x0f,
|
||||
0x7b, 0x76, 0x70, 0x97, 0xe1, 0x2c, 0xd0, 0x2e, 0x20, 0x22, 0xf9, 0x34, 0x03, 0xd9, 0x44, 0x44,
|
||||
0x8e, 0xf0, 0xf6, 0x71, 0xf4, 0x69, 0xf0, 0xa4, 0x74, 0x6a, 0x98, 0x2a, 0x60, 0x0c, 0x6d, 0x85,
|
||||
0xcc, 0xdc, 0xdc, 0x1c, 0x2f, 0xf0, 0xfb, 0xfd, 0xf4, 0x90, 0x6a, 0x0f, 0x63, 0x6c, 0xd9, 0xb6,
|
||||
0x30, 0xd4, 0x28, 0xf5, 0xf4, 0x55, 0x88, 0x3f, 0xae, 0x36, 0xa3, 0x0d, 0x40, 0x29, 0x97, 0x91,
|
||||
0x43, 0x7f, 0x1a, 0x8f, 0x69, 0xeb, 0xe3, 0x66, 0x34, 0xa6, 0x6b, 0xc4, 0x8e, 0xbe, 0x06, 0x3e,
|
||||
0xa3, 0x33, 0x80, 0x4a, 0x40, 0x42, 0xb1, 0x39, 0xa6, 0x01, 0x75, 0xa4, 0xa3, 0x5b, 0xc7, 0xd0,
|
||||
0xa4, 0x41, 0x91, 0xfa, 0xcd, 0x4c, 0xed, 0x66, 0x0c, 0x54, 0x51, 0x34, 0xb6, 0xa3, 0x40, 0x20,
|
||||
0x40, 0x0f, 0x51, 0xfb, 0x18, 0xa3, 0x6a, 0xe7, 0xc2, 0x83, 0x06, 0xe9, 0x17, 0x5d, 0xb9, 0x78,
|
||||
0x32, 0xa9, 0x19, 0x35, 0x00, 0xe7, 0x04, 0x44, 0xe4, 0x78, 0x4f, 0x01, 0x1b, 0xd9, 0x8c, 0x52,
|
||||
0x6f, 0x54, 0x22, 0x97, 0xa1, 0x06, 0x7d, 0x78, 0x76, 0xa9, 0x38, 0xfa, 0xa8, 0xab, 0x6c, 0xc9,
|
||||
0xad, 0x23, 0xc7, 0x68, 0xd2, 0x1c, 0x89, 0x3e, 0x51, 0x17, 0xfe, 0x1c, 0xac, 0x43, 0xee, 0xde,
|
||||
0xa3, 0xe2, 0xb7, 0xab, 0xcd, 0x88, 0x5c, 0x06, 0x17, 0x97, 0x91, 0xbd, 0xb7, 0x0e, 0x8f, 0xf6,
|
||||
0xc8, 0xe3, 0x66, 0xf4, 0xa2, 0xa7, 0x16, 0xbf, 0xba, 0x7a, 0x82, 0xcf, 0xa8, 0x99, 0x9d, 0x6f,
|
||||
0x42, 0x12, 0x72, 0x33, 0xd3, 0xb8, 0xf1, 0x73, 0xbf, 0x06, 0x79, 0x87, 0x95, 0x39, 0xa1, 0x91,
|
||||
0xf6, 0x7c, 0x3c, 0xd8, 0xb4, 0x95, 0x99, 0x9d, 0x9d, 0xe5, 0x3b, 0xf2, 0xf9, 0x7c, 0xb4, 0x49,
|
||||
0xb9, 0x85, 0x19, 0x6e, 0xcf, 0x67, 0x9e, 0x2a, 0x37, 0xcd, 0xdf, 0x94, 0x21, 0x0f, 0x29, 0x12,
|
||||
0x03, 0x05, 0x02, 0xa2, 0x52, 0x76, 0x72, 0x93, 0xb9, 0x68, 0x63, 0x65, 0x29, 0xc0, 0x61, 0x97,
|
||||
0xcb, 0xb5, 0x38, 0xdb, 0x96, 0xe7, 0x43, 0x9e, 0x39, 0x1c, 0x0e, 0x32, 0xeb, 0xf6, 0xc2, 0xac,
|
||||
0x4b, 0x49, 0xde, 0x65, 0x60, 0x0b, 0xa4, 0xe4, 0xcb, 0x12, 0x90, 0x11, 0x47, 0x94, 0x5e, 0x55,
|
||||
0x55, 0xd5, 0x23, 0x97, 0xcb, 0xaf, 0xac, 0x84, 0x4c, 0x26, 0xbb, 0x4c, 0x6a, 0xfe, 0xe4, 0x55,
|
||||
0x4e, 0x8e, 0x4f, 0x93, 0x94, 0x57, 0x39, 0xb9, 0x71, 0xff, 0xff, 0x05, 0x25, 0x55, 0xf4, 0x0b,
|
||||
0x47, 0x10, 0x1b, 0x88, 0xb6, 0x78, 0xc3, 0xad, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
|
||||
0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE mirror_footprint_axisY_xpm[1] = {{ png, sizeof( png ), "mirror_footprint_axisY_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -86,6 +86,6 @@ static const unsigned char png[] = {
|
|||
0xb8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE rotate_module_neg_xpm[1] = {{ png, sizeof( png ), "rotate_module_neg_xpm" }};
|
||||
const BITMAP_OPAQUE rotate_module_ccw_xpm[1] = {{ png, sizeof( png ), "rotate_module_ccw_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -88,6 +88,6 @@ static const unsigned char png[] = {
|
|||
0x33, 0x99, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE rotate_module_pos_xpm[1] = {{ png, sizeof( png ), "rotate_module_pos_xpm" }};
|
||||
const BITMAP_OPAQUE rotate_module_cw_xpm[1] = {{ png, sizeof( png ), "rotate_module_cw_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,501 @@
|
|||
<?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"
|
||||
version="1.0"
|
||||
width="26"
|
||||
height="26"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="save_library.svg">
|
||||
<metadata
|
||||
id="metadata166">
|
||||
<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>
|
||||
</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="1280"
|
||||
inkscape:window-height="977"
|
||||
id="namedview164"
|
||||
showgrid="true"
|
||||
inkscape:zoom="13.906433"
|
||||
inkscape:cx="11.483952"
|
||||
inkscape:cy="24.158587"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3041"
|
||||
empspacing="1"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<clipPath
|
||||
id="ba">
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="m 0,96 v 60 H 96 V 96 H 0 z m 68,20 c 9.9411,0 18,8.0589 18,18 0,9.9411 -8.0589,18 -18,18 -9.9411,0 -18,-8.0589 -18,-18 0,-9.9411 8.0589,-18 18,-18 z"
|
||||
id="path125"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<linearGradient
|
||||
id="bl"
|
||||
y2="5.9782"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="69"
|
||||
gradientTransform="matrix(-0.2255,-0.071329,0.05452,-0.20327,7.6326,90.834)"
|
||||
y1="122"
|
||||
x1="69">
|
||||
<stop
|
||||
stop-color="#1e71ac"
|
||||
offset="0"
|
||||
id="stop128" />
|
||||
<stop
|
||||
stop-color="#81c1e9"
|
||||
offset="1"
|
||||
id="stop130" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="bm"
|
||||
y2="67.706001"
|
||||
xlink:href="#a"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="118.33"
|
||||
gradientTransform="matrix(0.39018,0.62586,-0.63862,0.30043,3.5817,-20.909)"
|
||||
y1="87.488998"
|
||||
x1="120.65" />
|
||||
<linearGradient
|
||||
id="a">
|
||||
<stop
|
||||
offset="0"
|
||||
id="stop15" />
|
||||
<stop
|
||||
stop-opacity="0"
|
||||
offset="1"
|
||||
id="stop17" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="bn"
|
||||
y2="5.9782"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="69"
|
||||
gradientTransform="matrix(-0.2255,-0.071329,0.05452,-0.20327,7.6018,90.825)"
|
||||
y1="122"
|
||||
x1="69">
|
||||
<stop
|
||||
stop-color="#cd2323"
|
||||
offset="0"
|
||||
id="stop134" />
|
||||
<stop
|
||||
stop-color="#ef7474"
|
||||
offset="1"
|
||||
id="stop136" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="ao"
|
||||
y2="67.706001"
|
||||
xlink:href="#a"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="118.33"
|
||||
y1="87.488998"
|
||||
x1="120.65" />
|
||||
<clipPath
|
||||
id="aq">
|
||||
<path
|
||||
style="fill:url(#linearGradient4033)"
|
||||
d="m 118,56 c -9.9411,0 -18,8.0589 -18,18 0,9.9411 8.0589,18 18,18 9.7305,0 17.637,-7.7253 17.969,-17.375 v -1.25 C 135.639,63.725 127.729,56 117.999,56 z m -6,10.75 c 5.9493,0.05747 10.832,4.9413 11.031,10.875 l 3.75,0.03125 -6,8.7188 -6.1562,-8.8125 3.9688,0.03125 c -0.25101,-4.9057 -4.4893,-9.9506 -11.719,-9.625 1.5223,-0.80073 3.2718,-1.2367 5.125,-1.2188 z"
|
||||
id="path122"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<linearGradient
|
||||
id="bo"
|
||||
y2="5.1837001"
|
||||
xlink:href="#an"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="84.360001"
|
||||
gradientTransform="matrix(0.21868,0.069171,-0.053262,0.19858,-13.124,56.327)"
|
||||
y1="79.417"
|
||||
x1="84.360001" />
|
||||
<linearGradient
|
||||
id="an">
|
||||
<stop
|
||||
stop-color="#fff"
|
||||
offset="0"
|
||||
id="stop65" />
|
||||
<stop
|
||||
stop-color="#fff"
|
||||
stop-opacity=".49804"
|
||||
offset=".43290"
|
||||
id="stop67" />
|
||||
<stop
|
||||
stop-color="#fff"
|
||||
stop-opacity="0"
|
||||
offset="1"
|
||||
id="stop69" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="bp"
|
||||
y2="67.706001"
|
||||
xlink:href="#a"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="118.33"
|
||||
gradientTransform="matrix(-0.39018,-0.62586,0.63862,-0.30043,-9.9736,166.82)"
|
||||
y1="87.488998"
|
||||
x1="120.65" />
|
||||
<linearGradient
|
||||
y2="67.706001"
|
||||
x2="118.33"
|
||||
y1="87.488998"
|
||||
x1="120.65"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient3263"
|
||||
xlink:href="#a"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="5.1837001"
|
||||
x2="84.360001"
|
||||
y1="79.417"
|
||||
x1="84.360001"
|
||||
gradientTransform="matrix(-0.21868,-0.069171,0.053262,-0.19858,6.7324,89.587)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient3265"
|
||||
xlink:href="#an"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<g
|
||||
id="g3990">
|
||||
<path
|
||||
style="opacity:0.62891002;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.70963186;stroke-linejoin:round"
|
||||
d="M 9.6596115,5.3159336 C 8.7156736,3.8303478 3.0884583,1.8780913 0.49605765,1.4843719 0.63286624,6.1106521 0.6354959,8.6438074 0.49418944,12.920355 c 3.38119706,0.417619 6.65007166,1.706376 9.23954246,2.980621 0,0.622176 -0.07398,-10.2117676 -0.07398,-10.5850424 z"
|
||||
id="path37"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.70963186;stroke-linejoin:round"
|
||||
d="M 9.6596115,5.2865056 C 12.083236,3.1557432 15.360122,2.2885383 19.136304,1.3375403 c -0.284772,4.9489073 -0.102455,7.511336 -0.07213,11.4946857 -3.418311,0.03634 -6.963207,1.559699 -9.3305721,3.068595 0,-0.02308 -0.07398,-10.2410411 -0.07398,-10.6143154 z"
|
||||
id="path39"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.14192638"
|
||||
d="m 17.62063,3.1873399 c 0,0 -3.815638,0.8838087 -6.848929,2.9595554"
|
||||
id="path49"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 17.394036,4.8012488 c 0,0 -3.511103,0.5173178 -6.620968,2.5038816"
|
||||
id="path51"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 17.272918,6.2311532 c 0,0 -3.27395,0.5096669 -6.50024,2.3370702"
|
||||
id="path53"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 17.274877,7.6866141 c 0,0 -3.172573,0.2684782 -6.502004,2.2116124"
|
||||
id="path55"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 17.231902,8.9007628 c -0.03698,0.00743 -2.876823,0.5090318 -6.459029,2.2830152"
|
||||
id="path57"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 17.392078,10.085174 c -0.03698,0.0074 -3.083882,0.550216 -6.6194,2.401967"
|
||||
id="path59"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 17.440915,11.350822 c 0,0 -3.334509,0.62075 -6.668628,2.435112"
|
||||
id="path61"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891001999999996;fill:#ffffff;fill-rule:evenodd;stroke:#b30808;stroke-width:0.66616368000000004;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 9.6857877,5.2775219 C 11.821476,2.9262027 14.709431,1.7611526 18.037104,0.46661814 17.786146,5.4413914 17.946825,7.9872467 17.973521,11.967809 c -3.012389,0.347254 -6.136318,2.193026 -8.2225848,3.917213 0,-0.02307 -0.065194,-10.2342253 -0.065194,-10.6076548 z"
|
||||
id="path63"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 16.702517,2.4541111 c 0,0 -3.362637,1.230861 -6.03552,3.5825057"
|
||||
id="path65"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 16.395829,5.5296759 c 0,0 -2.885024,0.8074347 -5.728246,2.9282685"
|
||||
id="path67"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 16.358716,8.2031579 c -0.0326,0.010797 -2.535167,0.7706957 -5.691915,2.8704961"
|
||||
id="path69"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 16.544293,10.634088 c 0,0 -2.938551,0.924033 -5.87671,3.041646"
|
||||
id="path71"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 2.7583286,3.1579116 c 0,0 3.36596,0.8838087 6.041577,2.9595557"
|
||||
id="path73"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 2.9593364,4.7719751 c 0,0 3.0971682,0.5173182 5.8403743,2.503882"
|
||||
id="path75"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.0659941,6.2018799 c 0,0 2.8879549,0.5096669 5.7339115,2.3370702"
|
||||
id="path77"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.0642361,7.6573407 c 0,0 2.7984881,0.2684787 5.7354746,2.211612"
|
||||
id="path79"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.1023281,8.8714891 c 0.032629,0.00743 2.5377046,0.5090322 5.6975775,2.2830149"
|
||||
id="path81"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 2.9607041,10.055745 c 0.032629,0.0074 2.7203506,0.550216 5.8392015,2.401967"
|
||||
id="path83"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 2.9173379,11.321502 c 0,0 2.9412841,0.620751 5.8825677,2.435112"
|
||||
id="path85"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891001999999996;fill:#ffffff;fill-rule:evenodd;stroke:#b30808;stroke-width:0.62566995999999997;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 9.7584553,5.2482486 C 7.8745648,2.8969293 5.3270927,1.7318792 2.3916691,0.43734473 2.6130319,5.4121176 2.4713087,7.9579739 2.4477345,11.938536 c 2.6572551,0.347238 5.4129623,2.193026 7.2532919,3.917213 0,-0.02308 0.057508,-10.2342256 0.057508,-10.6076551 z"
|
||||
id="path87"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.5691981,2.4248377 c 0,0 2.966093,1.2308611 5.3240818,3.5825058"
|
||||
id="path89"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.8401392,5.5004025 c 0,0 2.544933,0.8074348 5.0529453,2.9282686"
|
||||
id="path91"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.8723709,8.1738841 c 0.028751,0.010797 2.2362901,0.7706957 5.020909,2.8704959"
|
||||
id="path93"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.62891002;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 3.7092593,10.604815 c 0,0 2.5920103,0.924032 5.1840206,3.041645"
|
||||
id="path95"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g3956"
|
||||
transform="translate(-0.07190883,-0.14381829)">
|
||||
<g
|
||||
id="g221"
|
||||
transform="matrix(0.60926793,0,0,0.60018523,-14.556018,11.034576)">
|
||||
<path
|
||||
id="path223"
|
||||
d="m 25.961,2.2795 c -0.50881,0 -0.91843,0.40232 -0.91843,0.90206 v 20.226 c 0,0.49974 0.40962,0.90206 0.91843,0.90206 h 19.775 c 0.50881,0 0.91843,-0.40232 0.91843,-0.90206 v -18.154 l -3.0423,-2.974 h -17.651 z"
|
||||
style="fill:#7f7f7f;fill-rule:evenodd;stroke-width:1pt;stroke-linecap:round;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path225"
|
||||
d="m 29.647,2.3339 v 5.6378 c 0,0.57606 0.51531,1.0398 1.1554,1.0398 h 7.7628 c 0.64009,-4e-7 1.1554,-0.46376 1.1554,-1.0398 V 2.3339 h -10.074 z"
|
||||
style="fill:#bfbfbf;fill-rule:evenodd;stroke:#333333;stroke-width:1.34249997"
|
||||
inkscape:connector-curvature="0" />
|
||||
<rect
|
||||
id="rect227"
|
||||
x="31.209"
|
||||
y="3.7319"
|
||||
width="2.8554001"
|
||||
height="3.8492999"
|
||||
rx="0.60650003"
|
||||
style="fill:#7f7f7f;fill-rule:evenodd;stroke:#333333;stroke-width:0.80549997" />
|
||||
<path
|
||||
id="path229"
|
||||
d="m 25.961,2.2795 c -0.50881,0 -0.91843,0.40232 -0.91843,0.90206 v 20.226 c 0,0.49974 0.40962,0.90206 0.91843,0.90206 h 19.775 c 0.50881,0 0.91843,-0.40232 0.91843,-0.90206 v -18.154 l -3.0423,-2.974 h -17.651 z"
|
||||
style="fill:none;stroke:#333333;stroke-width:1.34249997;stroke-linecap:round;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0" />
|
||||
<rect
|
||||
id="rect231"
|
||||
x="26.805"
|
||||
y="10.573"
|
||||
width="18.097"
|
||||
height="12.181"
|
||||
rx="0.88217002"
|
||||
style="fill:#d9d9d9;fill-opacity:0.75;fill-rule:evenodd;stroke:#333333;stroke-width:0.80549997;stroke-linecap:round;stroke-linejoin:round" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3928"
|
||||
transform="translate(-16.682927,23.730025)">
|
||||
<path
|
||||
style="opacity:0.86666667;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.70963186;stroke-linejoin:round"
|
||||
d="m 32.922582,-13.273155 c -0.943938,-1.485586 -6.571153,-3.437843 -9.163554,-3.831562 0.136808,4.62628 0.139438,7.1594355 -0.0019,11.4359835 3.381197,0.4176189 6.650071,1.7063755 9.239542,2.9806206 0,0.6221756 -0.07398,-10.2117681 -0.07398,-10.5850421 z"
|
||||
id="path37-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.70963186;stroke-linejoin:round"
|
||||
d="m 32.922582,-13.302583 c 2.423624,-2.130763 5.70051,-2.997968 9.476692,-3.948966 -0.284772,4.948908 -0.102455,7.5113364 -0.07213,11.4946857 -3.418311,0.036338 -6.963207,1.5596995 -9.330572,3.0685957 0,-0.023077 -0.07398,-10.2410414 -0.07398,-10.6143154 z"
|
||||
id="path39-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.14192638"
|
||||
d="m 40.8836,-15.401749 c 0,0 -3.815638,0.883809 -6.848929,2.959555"
|
||||
id="path49-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 40.657006,-13.78784 c 0,0 -3.511102,0.517318 -6.620967,2.503882"
|
||||
id="path51-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 40.535889,-12.357936 c 0,0 -3.273951,0.509667 -6.500241,2.33707"
|
||||
id="path53-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 40.537847,-10.902475 c 0,0 -3.172573,0.268478 -6.502004,2.2116126"
|
||||
id="path55-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 40.494872,-9.6883261 c -0.03698,0.00743 -2.876823,0.5090318 -6.459029,2.2830147"
|
||||
id="path57-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 40.655048,-8.5039152 c -0.03698,0.00743 -3.083882,0.5502158 -6.6194,2.4019671"
|
||||
id="path59-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 40.703885,-7.2382672 c 0,0 -3.334508,0.6207506 -6.668628,2.4351127"
|
||||
id="path61-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:#ffffff;fill-rule:evenodd;stroke:#22a51e;stroke-width:0.66616368;stroke-linejoin:round;stroke-opacity:0.99019614"
|
||||
d="m 32.948758,-13.311567 c 2.135688,-2.351319 5.023643,-3.516369 8.351316,-4.810904 -0.250958,4.974773 -0.09028,7.520629 -0.06358,11.5011909 -3.012389,0.3472537 -6.136318,2.1930263 -8.222585,3.9172135 0,-0.023073 -0.06519,-10.2342254 -0.06519,-10.6076554 z"
|
||||
id="path63-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 39.965487,-16.134978 c 0,0 -3.362637,1.230861 -6.03552,3.582506"
|
||||
id="path65-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 39.658799,-13.059413 c 0,0 -2.885024,0.807435 -5.728246,2.928268"
|
||||
id="path67-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 39.621686,-10.385931 c -0.0326,0.0108 -2.535166,0.7706957 -5.691914,2.8704963"
|
||||
id="path69-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 39.807263,-7.9550005 c 0,0 -2.938551,0.9240323 -5.87671,3.0416451"
|
||||
id="path71-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.021299,-15.431177 c 0,0 3.36596,0.883808 6.041577,2.959555"
|
||||
id="path73-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.222307,-13.817114 c 0,0 3.097168,0.517318 5.840374,2.503882"
|
||||
id="path75-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.328964,-12.387209 c 0,0 2.887955,0.509667 5.733912,2.33707"
|
||||
id="path77-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.327206,-10.931748 c 0,0 2.798488,0.268478 5.735475,2.2116118"
|
||||
id="path79-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.365298,-9.7175999 c 0.03263,0.00743 2.537705,0.5090323 5.697578,2.2830152"
|
||||
id="path81-6"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.223674,-8.5333436 c 0.03263,0.00743 2.720351,0.5502158 5.839202,2.401967"
|
||||
id="path83-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.180308,-7.2675868 c 0,0 2.941284,0.6207511 5.882568,2.4351123"
|
||||
id="path85-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:#ffffff;fill-rule:evenodd;stroke:#22a51e;stroke-width:0.62566996;stroke-linejoin:round;stroke-opacity:0.99019614"
|
||||
d="m 33.021426,-13.34084 c -1.883891,-2.35132 -4.431363,-3.51637 -7.366787,-4.810904 0.221363,4.974773 0.07964,7.520629 0.05607,11.5011906 2.657255,0.3472383 5.412962,2.1930263 7.253292,3.917214 0,-0.023077 0.05751,-10.2342266 0.05751,-10.6076556 z"
|
||||
id="path87-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.832168,-16.164251 c 0,0 2.966093,1.230861 5.324082,3.582506"
|
||||
id="path89-3"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 27.103109,-13.088686 c 0,0 2.544933,0.807434 5.052946,2.928268"
|
||||
id="path91-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 27.135341,-10.415205 c 0.02875,0.0108 2.23629,0.7706959 5.020909,2.8704965"
|
||||
id="path93-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="opacity:0.86666667;fill:none;stroke:#000000;stroke-width:0.2174277"
|
||||
d="m 26.97223,-7.9842742 c 0,0 2.59201,0.9240326 5.18402,3.041645"
|
||||
id="path95-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 21 KiB |
|
@ -1,59 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.1" viewBox="0 0 48 48">
|
||||
<g transform="matrix(0,-2.0558,1.4629,0,25.92,42.873)">
|
||||
<rect fill-opacity="0" height="16" width="16" y="0" x="0"/>
|
||||
</g>
|
||||
<g opacity=".96484" stroke-linejoin="round" transform="matrix(0,-1.6938,1.4407,0,27.509,5.1795)" stroke="#000">
|
||||
<rect transform="rotate(90)" height="14.619" width="9.7086" y="3.4905" x="1.904" stroke-width="0.4" fill="#fff"/>
|
||||
<path d="m693.26 625.06a18.914 18.914 0 0 1 -37.828 0.11702" transform="matrix(0 .071482 -.071482 0 41.168 -41.24)" stroke-width="5.5958" fill="none"/>
|
||||
</g>
|
||||
<g stroke-linejoin="round" transform="matrix(0,-1.6938,1.4407,0,27.292,5.243)" stroke="#030303">
|
||||
<rect transform="rotate(90)" height="2.511" width="4.7176" y="13.332" x="-.31959" stroke-width="0.3" fill="#ff7800"/>
|
||||
<rect transform="rotate(90)" height="2.511" width="4.7176" y="5.3636" x="-.31959" stroke-width="0.3" fill="#ff7800"/>
|
||||
<path d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 46.083 -44.072)" stroke-width="4.1969" fill="#ffede0"/>
|
||||
<rect transform="rotate(90)" height="2.511" width="4.7176" y="9.3478" x="-.31959" stroke-width="0.3" fill="#ff7800"/>
|
||||
<path d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 42.08 -44.072)" stroke-width="4.1969" fill="#ffede0"/>
|
||||
<path d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 38.077 -44.072)" stroke-width="4.1969" fill="#ffede0"/>
|
||||
</g>
|
||||
<g transform="matrix(0,-1.6938,1.4407,0,41.377,5.243)">
|
||||
<rect stroke-linejoin="round" transform="rotate(90)" height="2.511" width="4.7176" stroke="#030303" y="13.332" x="-.31959" stroke-width="0.3" fill="#ff7800"/>
|
||||
<rect stroke-linejoin="round" transform="rotate(90)" height="2.511" width="4.7176" stroke="#030303" y="5.3636" x="-.31959" stroke-width="0.3" fill="#ff7800"/>
|
||||
<path stroke-linejoin="round" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 46.083 -44.072)" stroke="#030303" stroke-width="4.1969" fill="#ffede0"/>
|
||||
<rect stroke-linejoin="round" transform="rotate(90)" height="2.511" width="4.7176" stroke="#030303" y="9.3478" x="-.31959" stroke-width="0.3" fill="#ff7800"/>
|
||||
<path stroke-linejoin="round" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 42.08 -44.072)" stroke="#030303" stroke-width="4.1969" fill="#ffede0"/>
|
||||
<g stroke-width="0.3">
|
||||
<path stroke-linejoin="round" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 38.077 -44.072)" stroke="#030303" stroke-width="4.1969" fill="#ffede0"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(1.5378,0,0,2.5138,-73.197,-100.33)">
|
||||
<rect transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)" height="1" width="2" y="62.753" x="-48.952"/>
|
||||
<rect transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)" height="1" width="2" y="62.753" x="-51.952"/>
|
||||
<rect transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)" height="1" width="2" y="62.753" x="-54.952"/>
|
||||
<rect y="43.952" width="1" x="62.753" height="2"/>
|
||||
<rect y="40.952" width="1" x="62.753" height="2"/>
|
||||
<rect y="55.952" width="1" x="62.753" height="2"/>
|
||||
</g>
|
||||
<g opacity=".39453" transform="matrix(0,-1.6938,1.4021,0,1.3977,5.1795)">
|
||||
<g stroke-linejoin="round">
|
||||
<rect transform="rotate(90)" height="14.619" width="9.7086" stroke="#000" y="3.4905" x="1.904" stroke-width="0.4"/>
|
||||
<path d="m693.26 625.06a18.914 18.914 0 0 1 -37.828 0.11702" transform="matrix(0 .071482 -.071482 0 41.168 -41.24)" stroke="#030303" stroke-width="5.5958"/>
|
||||
</g>
|
||||
<g stroke-linejoin="round" transform="translate(-.0375 -.15)" stroke="#030303">
|
||||
<rect transform="rotate(90)" height="2.511" width="4.7176" y="13.332" x="-.31959" stroke-width="0.3"/>
|
||||
<rect transform="rotate(90)" height="2.511" width="4.7176" y="5.3636" x="-.31959" stroke-width="0.3"/>
|
||||
<path stroke-width="4.1969" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 46.083 -44.072)"/>
|
||||
<rect transform="rotate(90)" height="2.511" width="4.7176" y="9.3478" x="-.31959" stroke-width="0.3"/>
|
||||
<path stroke-width="4.1969" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 42.08 -44.072)"/>
|
||||
<path stroke-width="4.1969" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 38.077 -44.072)"/>
|
||||
</g>
|
||||
<g transform="translate(-.0375 9.6261)">
|
||||
<rect stroke-linejoin="round" transform="rotate(90)" height="2.511" width="4.7176" stroke="#030303" y="13.332" x="-.31959" stroke-width="0.3"/>
|
||||
<rect stroke-linejoin="round" transform="rotate(90)" height="2.511" width="4.7176" stroke="#030303" y="5.3636" x="-.31959" stroke-width="0.3"/>
|
||||
<path stroke-linejoin="round" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 46.083 -44.072)" stroke="#030303" stroke-width="4.1969"/>
|
||||
<rect stroke-linejoin="round" transform="rotate(90)" height="2.511" width="4.7176" stroke="#030303" y="9.3478" x="-.31959" stroke-width="0.3"/>
|
||||
<path stroke-linejoin="round" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 42.08 -44.072)" stroke="#030303" stroke-width="4.1969"/>
|
||||
<g stroke-width="0.3">
|
||||
<path stroke-linejoin="round" d="m654.65 737.28a9.5805 9.5805 0 1 1 -19.161 0 9.5805 9.5805 0 1 1 19.161 0z" transform="matrix(0 .071482 -.071482 0 38.077 -44.072)" stroke="#030303" stroke-width="4.1969"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.7 KiB |
|
@ -1,23 +1,96 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="256" width="256" version="1.1" viewBox="-2100 -1470 1493.3333 1493.3333">
|
||||
<title>Flag of Brazil</title>
|
||||
<defs>
|
||||
<clipPath id="a">
|
||||
<path d="m171.82 258.25c-26.762-12.893-65.044-38.479-65.044-89.094 0-50.614 2.42-73.633 2.42-73.633h125.25s2.422 23.019 2.422 73.633c-0.001 50.616-38.286 76.201-65.05 89.094z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<clipPath>
|
||||
<circle cy="0" cx="0" r="735" fill="#28166f"/>
|
||||
</clipPath>
|
||||
<rect fill-rule="evenodd" height="1516.7" width="1516.7" y="-1493.3" x="-2100" fill="#e6e6e6"/>
|
||||
<g transform="matrix(1.1905,0,0,1.2308,-1926.1,-225.26)">
|
||||
<rect height="252.78" width="1225" y="-540.56" x="-116.67" fill="#0f218b"/>
|
||||
<rect height="252.78" width="1225" y="-793.33" x="-116.67" fill="#fff"/>
|
||||
<rect height="252.78" width="1225" y="-287.78" x="-116.67" fill="#f00"/>
|
||||
<path fill-rule="evenodd" fill="#fff" d="m121.41-423.58c0-111.98 7.1462-174.77 7.1462-174.77h321.57s7.1486 62.786 7.1486 174.77c0 119.2-97.529 178.65-161.74 207.37l-6.1942 2.7706-6.1871-2.7706c-64.207-28.717-161.74-88.167-161.74-207.37z"/>
|
||||
<path fill="#f00" d="m289.34-228.14c-63.222-28.283-153.66-84.409-153.66-195.44s5.717-161.52 5.717-161.52h295.89s5.7217 50.495 5.7217 161.52c-0.002 111.03-90.446 167.16-153.67 195.44z"/>
|
||||
<path fill="#fff" d="m302.86-452.69c17.118 0.25665 50.522 0.87964 80.262-8.3622 0 0-0.78666 9.8824-0.78666 21.395 0 11.514 0.78666 21.397 0.78666 21.397-27.281-8.4762-60.971-8.6539-80.262-8.4258v61.325h-27.04v-61.325c-19.294-0.22801-52.979-0.0506-80.262 8.4258 0 0 0.78666-9.8824 0.78666-21.397 0-11.512-0.78666-21.395-0.78666-21.395 29.74 9.2418 63.142 8.6188 80.262 8.3622v-38.514c-15.604-0.12944-38.089 0.56377-63.51 8.4631 0 0 0.7867-9.8824 0.7867-21.397 0-11.512-0.7867-21.395-0.7867-21.395 25.386 7.8862 47.841 8.5903 63.439 8.4631-0.80085-24.389-8.4526-55.126-8.4526-55.126s15.748 1.1429 22.041 1.1429c6.3028 0 22.046-1.1429 22.046-1.1429s-7.6495 30.74-8.4526 55.126c15.601 0.1251 38.056-0.57694 63.442-8.4631 0 0-0.7867 9.8823-0.7867 21.395 0 11.514 0.7867 21.397 0.7867 21.397-25.424-7.8993-47.909-8.5925-63.513-8.4631v38.514z"/>
|
||||
<g transform="matrix(2.3624,0,0,2.1936,-116.57,-794.65)" clip-path="url(#a)">
|
||||
<path fill-rule="evenodd" fill="#0f218b" d="m170.64 274.85-55.454-49.43s7.089-22.927 20.927-22.927c10.996 0 15.009 8.865 15.009 8.865s7.22-18.689 20.696-18.689c13.479 0 20.699 18.689 20.699 18.689s4.013-8.865 15.01-8.865c13.838 0 20.927 22.927 20.927 22.927l-57.814 49.43z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
width="26"
|
||||
height="26"
|
||||
viewBox="0 0 6.5520289 12.549593"
|
||||
id="Layer_1"
|
||||
xml:space="preserve"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="lang_sl.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
||||
id="metadata2274"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
inkscape:window-height="736"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:zoom="21.500006"
|
||||
inkscape:cx="11.153739"
|
||||
inkscape:cy="12.000002"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:current-layer="Layer_1"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="0" /><defs
|
||||
id="defs3" /><g
|
||||
id="g3012"
|
||||
transform="matrix(0.02883723,0,0,0.02875969,0.01271393,9.7865102)"><rect
|
||||
id="rect3212"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
y="-277.0564"
|
||||
x="-103.804"
|
||||
height="289.60599"
|
||||
width="434.409" /><rect
|
||||
id="rect6123"
|
||||
style="fill:#ed1c24;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
y="-83.985741"
|
||||
x="-103.804"
|
||||
height="96.535332"
|
||||
width="434.409" /><rect
|
||||
id="rect4183"
|
||||
style="fill:#005da4;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
y="-180.52107"
|
||||
x="-103.804"
|
||||
height="96.535332"
|
||||
width="434.409" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path13"
|
||||
style="fill:#ed1c24;fill-opacity:1"
|
||||
d="m -18.170084,-221.38606 c -0.892,0.39333 -1.777333,0.80166 -2.656,1.22466 l 2.768,43.79933 c 0.754,11.94066 5.831999,23.241 14.341998,31.75066 5.819333,5.819 12.943332,10.034 20.684998,12.358 l 6.67e-4,0 c 7.741666,-2.32433 14.865998,-6.539 20.684998,-12.358 8.509666,-8.50966 13.587999,-19.81 14.341665,-31.75066 l 2.768333,-43.79933 c -0.879,-0.423 -1.763666,-0.83133 -2.656333,-1.22466 l 6.67e-4,3.3e-4 -2.833333,44.83632 c -0.709,11.28567 -5.507,21.96667 -13.549332,30.009 -5.3,5.30067 -11.746666,9.19133 -18.756332,11.43167 l -0.001,0 c -7.009999,-2.24034 -13.455998,-6.131 -18.755998,-11.43167 -8.042666,-8.04233 -12.840665,-18.72333 -13.549332,-30.009 l -2.833666,-44.83665 6.66e-4,0" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15"
|
||||
style="fill:#005da4;fill-opacity:1"
|
||||
d="m 52.108909,-221.38573 c -10.967666,-4.83567 -22.921331,-7.403 -35.139663,-7.403 -12.218666,0 -24.172331,2.56733 -35.139997,7.403 l 2.834,44.83632 c 0.708666,11.28567 5.506666,21.96667 13.549332,30.009 5.300333,5.30067 11.746332,9.19133 18.755998,11.43167 l 0.001,0 c 7.009666,-2.24034 13.456332,-6.131 18.755665,-11.43167 8.042999,-8.04233 12.840998,-18.72333 13.549332,-30.009" /><polyline
|
||||
transform="matrix(0.3333333,0,0,0.3333333,-20.826084,-228.78873)"
|
||||
points="119.764,62.917 124.434,56.539 116.574,57.394 113.386,50.161 110.197,57.394 102.338,56.539 107.008,62.917 102.338,69.295 110.197,68.44 113.386,75.673 116.574,68.44 124.434,69.295 "
|
||||
id="polyline17"
|
||||
style="fill:#ffdd00;fill-opacity:1" /><polyline
|
||||
transform="matrix(0.3333333,0,0,0.3333333,-20.826084,-228.78873)"
|
||||
points="90,23.232 94.669,16.854 86.811,17.709 83.622,10.476 80.433,17.709 72.575,16.854 77.244,23.232 72.575,29.61 80.433,28.755 83.622,35.988 86.811,28.755 94.669,29.61 "
|
||||
id="polyline19"
|
||||
style="fill:#ffdd00;fill-opacity:1" /><polyline
|
||||
transform="matrix(0.3333333,0,0,0.3333333,-20.826084,-228.78873)"
|
||||
points="149.527,23.232 154.195,16.854 146.338,17.709 143.148,10.476 139.959,17.709 132.102,16.854 136.771,23.232 132.102,29.61 139.959,28.755 143.148,35.988 146.338,28.755 154.195,29.61 "
|
||||
id="polyline21"
|
||||
style="fill:#ffdd00;fill-opacity:1" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path23"
|
||||
style="fill:#ffffff"
|
||||
d="m 45.315909,-170.02074 -14.173665,-18.89799 -5.669333,7.55933 -8.503999,-17.008 -8.503999,17.008 -5.669333,-7.55933 -14.173332,18.89799 c 0,2.506 0.995667,4.909 2.767667,6.681 1.772,1.77133 4.174999,2.76767 6.681332,2.76767 1.673334,0 3.301,-0.444 4.725,-1.26634 0.00933,-0.006 -0.011333,0.007 -0.00233,0.001 0.709666,-0.41 1.475333,-0.72934 2.280333,-0.94467 2.420666,-0.64833 4.999666,-0.30933 7.169999,0.94333 1.449,0.83667 3.080666,1.26634 4.725333,1.26634 0.007,0 -0.0087,0 -0.0017,0 1.645,0 3.276333,-0.42967 4.725666,-1.26634 2.17,-1.25266 4.749333,-1.59233 7.17,-0.94333 0.804666,0.21533 1.570333,0.53467 2.279999,0.94467 0.0097,0.005 -0.011,-0.007 -0.002,-0.001 1.424334,0.82234 3.051333,1.26634 4.724667,1.26634 2.506666,0 4.909666,-0.996 6.681666,-2.76767 1.771999,-1.772 2.767666,-4.175 2.767666,-6.681" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path25"
|
||||
style="fill:#ffffff"
|
||||
d="m -8.020085,-159.76041 c 0.650333,1.29234 1.365333,2.55334 2.142333,3.778 0,0 -3.33e-4,6.7e-4 0,10e-4 1.994666,0.91733 4.256333,1.11533 6.394666,0.54233 0.805333,-0.21533 1.570666,-0.535 2.280333,-0.94467 0.00933,-0.005 -0.011333,0.007 -0.002,0.001 1.424,-0.823 3.051666,-1.26634 4.724999,-1.26634 0.00333,0 -0.00433,0 -0.001,0 1.644667,-6.6e-4 3.276334,0.429 4.725333,1.26634 2.170333,1.25266 4.749333,1.59166 7.170333,0.94333 0.804667,-0.21533 1.570333,-0.535 2.28,-0.94467 0.0097,-0.005 -0.011,0.007 -0.002,10e-4 1.423666,-0.823 3.051333,-1.26634 4.725333,-1.26634 0.0033,0 -0.0047,0 -0.0013,0 1.644667,-6.6e-4 3.276667,0.429 4.725333,1.26634 2.170667,1.25266 4.749333,1.59166 7.169999,0.94333 0.519667,-0.13867 1.022,-0.32167 1.504,-0.543 l 0,0 c 0.777333,-1.22533 1.492334,-2.48633 2.142667,-3.778 0,-6.7e-4 0,0 0,0 -0.472,0.17967 -0.929667,0.397 -1.368334,0.65033 -0.009,0.005 0.01167,-0.007 0.0027,-0.001 -0.709666,0.40967 -1.475333,0.72867 -2.280666,0.94467 -2.420667,0.64833 -4.999333,0.30933 -7.17,-0.944 -1.448666,-0.83667 -3.080666,-1.26567 -4.725332,-1.26567 -0.0033,0 0.0047,0 0.0013,0 -1.673667,0 -3.301333,0.444 -4.725333,1.26633 -0.009,0.005 0.01167,-0.007 0.002,-0.001 -0.709667,0.41 -1.475333,0.72933 -2.28,0.94467 -2.420999,0.649 -4.999999,0.31 -7.170332,-0.94334 -1.449,-0.83666 -3.080667,-1.26633 -4.725333,-1.26633 -0.00367,0 0.00433,0 0.001,0 -1.673333,0 -3.301,0.444 -4.725,1.267 -0.00933,0.005 0.011334,-0.007 0.002,-10e-4 -0.709666,0.40966 -1.475,0.72866 -2.280333,0.94466 -2.420666,0.64834 -4.999666,0.30934 -7.169999,-0.944 -0.440333,-0.254 -0.897667,-0.47066 -1.367,-0.649 -3.33e-4,0 0,-6.6e-4 0,0" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path27"
|
||||
style="fill:#ffffff"
|
||||
d="m 37.368577,-152.50907 c -1.101,1.41066 -2.293,2.76099 -3.572333,4.03966 -4.78,4.78 -10.549332,8.34233 -16.827332,10.48833 l -3.33e-4,0 c -6.277999,-2.146 -12.047666,-5.70766 -16.827665,-10.48833 -1.279,-1.27867 -2.471,-2.629 -3.572,-4.03966 0,0 -3.33e-4,0 0,0 1.303,0.20966 2.648333,0.146 3.947667,-0.20167 0.805333,-0.216 1.570666,-0.535 2.280333,-0.94467 0.00933,-0.005 -0.011334,0.007 -0.002,10e-4 1.423999,-0.823 3.051666,-1.26634 4.724999,-1.26634 0.00333,0 -0.00433,0 -10e-4,0 1.644667,-6.6e-4 3.276333,0.429 4.725333,1.26567 2.170333,1.25333 4.749333,1.59233 7.169999,0.944 0.805334,-0.216 1.571,-0.535 2.280667,-0.94467 0.009,-0.005 -0.01167,0.007 -0.002,0.001 1.423666,-0.823 3.051333,-1.26634 4.724666,-1.26634 0.0033,0 -0.004,0 -6.67e-4,0 1.644667,-6.6e-4 3.276,0.429 4.725333,1.26567 1.89,1.09167 4.091,1.48967 6.226666,1.14533 6.67e-4,0 0,0 -6.66e-4,6.7e-4" /></g></svg>
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 8.0 KiB |
|
@ -0,0 +1,353 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
viewBox="0 0 26 26"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="mirror_footprint_axisX.svg">
|
||||
<metadata
|
||||
id="metadata100">
|
||||
<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>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs98" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="977"
|
||||
id="namedview96"
|
||||
showgrid="true"
|
||||
inkscape:zoom="28.392708"
|
||||
inkscape:cx="13.120654"
|
||||
inkscape:cy="11.517507"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3569"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<g
|
||||
transform="matrix(-1.2534861,0,0,-0.77869134,24.497945,12.448397)"
|
||||
id="g4">
|
||||
<rect
|
||||
style="fill-opacity:0"
|
||||
height="16"
|
||||
width="16"
|
||||
y="0"
|
||||
x="0"
|
||||
id="rect6" />
|
||||
</g>
|
||||
<g
|
||||
id="g3617"
|
||||
transform="matrix(1,0,0,1.061887,0,-0.74862645)">
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(-1.0327633,0,0,-0.76687444,1.515029,11.602584)"
|
||||
style="opacity:0.96483998;stroke:#000000;stroke-linejoin:round">
|
||||
<rect
|
||||
id="rect10"
|
||||
x="1.904"
|
||||
y="3.4905"
|
||||
width="9.7086"
|
||||
height="14.619"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ffffff;stroke-width:0.40000001" />
|
||||
<path
|
||||
id="path12"
|
||||
transform="matrix(0,0.071482,-0.071482,0,41.168,-41.24)"
|
||||
d="m 693.26,625.06 a 18.91409,18.91409 0 0 1 -37.828,0.11702"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke-width:5.59579992" />
|
||||
</g>
|
||||
<g
|
||||
id="g14"
|
||||
transform="matrix(-1.0327633,0,0,-0.76687444,1.553747,11.718091)"
|
||||
style="stroke:#030303;stroke-linejoin:round">
|
||||
<rect
|
||||
id="rect16"
|
||||
x="-0.31959"
|
||||
y="13.332"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke-width:0.30000001" />
|
||||
<rect
|
||||
id="rect18"
|
||||
x="-0.31959"
|
||||
y="5.3635998"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke-width:0.30000001" />
|
||||
<path
|
||||
id="path20"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke-width:4.19689989" />
|
||||
<rect
|
||||
id="rect22"
|
||||
x="-0.31959"
|
||||
y="9.3478003"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke-width:0.30000001" />
|
||||
<path
|
||||
id="path24"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke-width:4.19689989" />
|
||||
<path
|
||||
id="path26"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke-width:4.19689989" />
|
||||
</g>
|
||||
<g
|
||||
id="g28"
|
||||
transform="matrix(-1.0327633,0,0,-0.76687444,1.553747,4.220745)">
|
||||
<rect
|
||||
id="rect30"
|
||||
x="-0.31959"
|
||||
y="13.332"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round" />
|
||||
<rect
|
||||
id="rect32"
|
||||
x="-0.31959"
|
||||
y="5.3635998"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round" />
|
||||
<path
|
||||
id="path34"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round" />
|
||||
<rect
|
||||
id="rect36"
|
||||
x="-0.31959"
|
||||
y="9.3478003"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round" />
|
||||
<path
|
||||
id="path38"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round" />
|
||||
<g
|
||||
id="g40"
|
||||
style="stroke-width:0.30000001">
|
||||
<path
|
||||
id="path42"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0,-0.95944068,1.5327431,0,-62.817441,74.189237)"
|
||||
id="g44">
|
||||
<rect
|
||||
transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)"
|
||||
height="1"
|
||||
width="2"
|
||||
y="62.752998"
|
||||
x="-48.952"
|
||||
id="rect46" />
|
||||
<rect
|
||||
transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)"
|
||||
height="1"
|
||||
width="2"
|
||||
y="62.752998"
|
||||
x="-51.952"
|
||||
id="rect48" />
|
||||
<rect
|
||||
transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)"
|
||||
height="1"
|
||||
width="2"
|
||||
y="62.752998"
|
||||
x="-54.952"
|
||||
id="rect50" />
|
||||
<rect
|
||||
y="43.952"
|
||||
width="1"
|
||||
x="62.752998"
|
||||
height="2"
|
||||
id="rect52" />
|
||||
<rect
|
||||
y="40.952"
|
||||
width="1"
|
||||
x="62.752998"
|
||||
height="2"
|
||||
id="rect54" />
|
||||
<rect
|
||||
y="55.952"
|
||||
width="1"
|
||||
x="62.752998"
|
||||
height="2"
|
||||
id="rect56" />
|
||||
</g>
|
||||
<g
|
||||
style="opacity:0.39452999"
|
||||
transform="matrix(-1.0327633,0,0,-0.74632793,1.515029,25.501444)"
|
||||
id="g58">
|
||||
<g
|
||||
style="stroke-linejoin:round"
|
||||
id="g60">
|
||||
<rect
|
||||
style="stroke:#000000;stroke-width:0.40000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="14.619"
|
||||
width="9.7086"
|
||||
y="3.4905"
|
||||
x="1.904"
|
||||
id="rect62" />
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:5.59579992"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 693.26,625.06 a 18.91409,18.91409 0 0 1 -37.828,0.11702"
|
||||
transform="matrix(0,0.071482,-0.071482,0,41.168,-41.24)"
|
||||
id="path64" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke:#030303;stroke-linejoin:round"
|
||||
transform="translate(-0.0375,-0.15)"
|
||||
id="g66">
|
||||
<rect
|
||||
style="stroke-width:0.30000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="13.332"
|
||||
x="-0.31959"
|
||||
id="rect68" />
|
||||
<rect
|
||||
style="stroke-width:0.30000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="5.3635998"
|
||||
x="-0.31959"
|
||||
id="rect70" />
|
||||
<path
|
||||
style="stroke-width:4.19689989"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
id="path72" />
|
||||
<rect
|
||||
style="stroke-width:0.30000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="9.3478003"
|
||||
x="-0.31959"
|
||||
id="rect74" />
|
||||
<path
|
||||
style="stroke-width:4.19689989"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
id="path76" />
|
||||
<path
|
||||
style="stroke-width:4.19689989"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
id="path78" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-0.0375,9.6261)"
|
||||
id="g80">
|
||||
<rect
|
||||
style="stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="13.332"
|
||||
x="-0.31959"
|
||||
id="rect82" />
|
||||
<rect
|
||||
style="stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="5.3635998"
|
||||
x="-0.31959"
|
||||
id="rect84" />
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
id="path86" />
|
||||
<rect
|
||||
style="stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="9.3478003"
|
||||
x="-0.31959"
|
||||
id="rect88" />
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
id="path90" />
|
||||
<g
|
||||
style="stroke-width:0.30000001"
|
||||
id="g92">
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
id="path94" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
|
@ -0,0 +1,353 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
viewBox="0 0 26 26"
|
||||
id="svg3353"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="mirror_footprint_axisY.svg">
|
||||
<metadata
|
||||
id="metadata3451">
|
||||
<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>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3449" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="977"
|
||||
id="namedview3447"
|
||||
showgrid="true"
|
||||
inkscape:zoom="28.827087"
|
||||
inkscape:cx="12.909051"
|
||||
inkscape:cy="10.157649"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg3353">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3501"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<g
|
||||
transform="matrix(0,-1.2532577,0.77946185,0,13.569249,24.479187)"
|
||||
id="g3355">
|
||||
<rect
|
||||
style="fill-opacity:0"
|
||||
height="16"
|
||||
width="16"
|
||||
y="0"
|
||||
x="0"
|
||||
id="rect3357" />
|
||||
</g>
|
||||
<g
|
||||
id="g3549"
|
||||
transform="matrix(1.0639398,0,0,1,-0.8901316,0)">
|
||||
<g
|
||||
id="g3359"
|
||||
transform="matrix(0,-1.0325751,0.76763326,0,14.415899,1.5004589)"
|
||||
style="opacity:0.96483998;stroke:#000000;stroke-linejoin:round">
|
||||
<rect
|
||||
id="rect3361"
|
||||
x="1.904"
|
||||
y="3.4905"
|
||||
width="9.7086"
|
||||
height="14.619"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ffffff;stroke-width:0.40000001" />
|
||||
<path
|
||||
id="path3363"
|
||||
transform="matrix(0,0.071482,-0.071482,0,41.168,-41.24)"
|
||||
d="m 693.26,625.06 a 18.91409,18.91409 0 0 1 -37.828,0.11702"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke-width:5.59579992" />
|
||||
</g>
|
||||
<g
|
||||
id="g3365"
|
||||
transform="matrix(0,-1.0325751,0.76763326,0,14.300277,1.5391698)"
|
||||
style="stroke:#030303;stroke-linejoin:round">
|
||||
<rect
|
||||
id="rect3367"
|
||||
x="-0.31959"
|
||||
y="13.332"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke-width:0.30000001" />
|
||||
<rect
|
||||
id="rect3369"
|
||||
x="-0.31959"
|
||||
y="5.3635998"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke-width:0.30000001" />
|
||||
<path
|
||||
id="path3371"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke-width:4.19689989" />
|
||||
<rect
|
||||
id="rect3373"
|
||||
x="-0.31959"
|
||||
y="9.3478003"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke-width:0.30000001" />
|
||||
<path
|
||||
id="path3375"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke-width:4.19689989" />
|
||||
<path
|
||||
id="path3377"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke-width:4.19689989" />
|
||||
</g>
|
||||
<g
|
||||
id="g3379"
|
||||
transform="matrix(0,-1.0325751,0.76763326,0,21.805042,1.5391698)">
|
||||
<rect
|
||||
id="rect3381"
|
||||
x="-0.31959"
|
||||
y="13.332"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round" />
|
||||
<rect
|
||||
id="rect3383"
|
||||
x="-0.31959"
|
||||
y="5.3635998"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round" />
|
||||
<path
|
||||
id="path3385"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round" />
|
||||
<rect
|
||||
id="rect3387"
|
||||
x="-0.31959"
|
||||
y="9.3478003"
|
||||
width="4.7175999"
|
||||
height="2.5109999"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
style="fill:#ff7800;stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round" />
|
||||
<path
|
||||
id="path3389"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round" />
|
||||
<g
|
||||
id="g3391"
|
||||
style="stroke-width:0.30000001">
|
||||
<path
|
||||
id="path3393"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffede0;stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1.0275067,0,0,1.5324639,-52.51157,-62.82029)"
|
||||
id="g3395">
|
||||
<rect
|
||||
transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)"
|
||||
height="1"
|
||||
width="2"
|
||||
y="62.752998"
|
||||
x="-48.952"
|
||||
id="rect3397" />
|
||||
<rect
|
||||
transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)"
|
||||
height="1"
|
||||
width="2"
|
||||
y="62.752998"
|
||||
x="-51.952"
|
||||
id="rect3399" />
|
||||
<rect
|
||||
transform="matrix(8.316e-8,-1,1,9.4237e-8,0,0)"
|
||||
height="1"
|
||||
width="2"
|
||||
y="62.752998"
|
||||
x="-54.952"
|
||||
id="rect3401" />
|
||||
<rect
|
||||
y="43.952"
|
||||
width="1"
|
||||
x="62.752998"
|
||||
height="2"
|
||||
id="rect3403" />
|
||||
<rect
|
||||
y="40.952"
|
||||
width="1"
|
||||
x="62.752998"
|
||||
height="2"
|
||||
id="rect3405" />
|
||||
<rect
|
||||
y="55.952"
|
||||
width="1"
|
||||
x="62.752998"
|
||||
height="2"
|
||||
id="rect3407" />
|
||||
</g>
|
||||
<g
|
||||
style="opacity:0.39452999"
|
||||
transform="matrix(0,-1.0325751,0.74706642,0,0.50328559,1.5004589)"
|
||||
id="g3409">
|
||||
<g
|
||||
style="stroke-linejoin:round"
|
||||
id="g3411">
|
||||
<rect
|
||||
style="stroke:#000000;stroke-width:0.40000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="14.619"
|
||||
width="9.7086"
|
||||
y="3.4905"
|
||||
x="1.904"
|
||||
id="rect3413" />
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:5.59579992"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 693.26,625.06 a 18.91409,18.91409 0 0 1 -37.828,0.11702"
|
||||
transform="matrix(0,0.071482,-0.071482,0,41.168,-41.24)"
|
||||
id="path3415" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke:#030303;stroke-linejoin:round"
|
||||
transform="translate(-0.0375,-0.15)"
|
||||
id="g3417">
|
||||
<rect
|
||||
style="stroke-width:0.30000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="13.332"
|
||||
x="-0.31959"
|
||||
id="rect3419" />
|
||||
<rect
|
||||
style="stroke-width:0.30000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="5.3635998"
|
||||
x="-0.31959"
|
||||
id="rect3421" />
|
||||
<path
|
||||
style="stroke-width:4.19689989"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
id="path3423" />
|
||||
<rect
|
||||
style="stroke-width:0.30000001"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="9.3478003"
|
||||
x="-0.31959"
|
||||
id="rect3425" />
|
||||
<path
|
||||
style="stroke-width:4.19689989"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
id="path3427" />
|
||||
<path
|
||||
style="stroke-width:4.19689989"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
id="path3429" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-0.0375,9.6261)"
|
||||
id="g3431">
|
||||
<rect
|
||||
style="stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="13.332"
|
||||
x="-0.31959"
|
||||
id="rect3433" />
|
||||
<rect
|
||||
style="stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="5.3635998"
|
||||
x="-0.31959"
|
||||
id="rect3435" />
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,46.083,-44.072)"
|
||||
id="path3437" />
|
||||
<rect
|
||||
style="stroke:#030303;stroke-width:0.30000001;stroke-linejoin:round"
|
||||
transform="matrix(0,1,-1,0,0,0)"
|
||||
height="2.5109999"
|
||||
width="4.7175999"
|
||||
y="9.3478003"
|
||||
x="-0.31959"
|
||||
id="rect3439" />
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,42.08,-44.072)"
|
||||
id="path3441" />
|
||||
<g
|
||||
style="stroke-width:0.30000001"
|
||||
id="g3443">
|
||||
<path
|
||||
style="stroke:#030303;stroke-width:4.19689989;stroke-linejoin:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 654.65,737.28 a 9.5805,9.5805 0 1 1 -19.161,0 9.5805,9.5805 0 1 1 19.161,0 z"
|
||||
transform="matrix(0,0.071482,-0.071482,0,38.077,-44.072)"
|
||||
id="path3445" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
@ -29,7 +29,7 @@ add_custom_target(
|
|||
|
||||
set( GAL_SRCS
|
||||
# Common part
|
||||
drawpanel_gal.cpp
|
||||
draw_panel_gal.cpp
|
||||
painter.cpp
|
||||
worksheet_viewitem.cpp
|
||||
gal/graphics_abstraction_layer.cpp
|
||||
|
@ -66,6 +66,48 @@ if( WIN32 AND MSYS )
|
|||
add_definitions( -DGLEW_STATIC )
|
||||
endif()
|
||||
|
||||
|
||||
# A shared library subsetted from common which restricts what can go into
|
||||
# a single_top link image. By not linking to common, we control what does
|
||||
# statically go into single_top link images. My current thinking is that only
|
||||
# wxWidgets should be a shared link from single top, everything else should be
|
||||
# statically bound into it. Otherwise you will have DSO loading problems. After it
|
||||
# sets the LIB PATHS however, we want the *.kiface modules to use shared linking.
|
||||
add_library( singletop STATIC EXCLUDE_FROM_ALL
|
||||
confirm.cpp
|
||||
eda_doc.cpp
|
||||
kiway.cpp
|
||||
kiway_holder.cpp
|
||||
)
|
||||
|
||||
|
||||
# A shared library used by multiple *.kiface files and one or two program
|
||||
# launchers. Object files can migrate into here over time, but only if they are
|
||||
# surely needed and certainly used from more than one place without recompilation.
|
||||
# Functions and data all need to use the #include <import_export.h> and be declared
|
||||
# as APIEXPORT
|
||||
set( LIB_KICAD_SRCS
|
||||
colors.cpp
|
||||
dlist.cpp
|
||||
string.cpp
|
||||
)
|
||||
|
||||
if( future )
|
||||
add_library( lib_kicad SHARED
|
||||
)
|
||||
target_link_libraries( lib_kicad
|
||||
${wxWidgets_LIBRARIES}
|
||||
)
|
||||
set_target_properties( lib_kicad PROPERTIES
|
||||
OUTPUT_NAME ki
|
||||
)
|
||||
install( TARGETS lib_kicad
|
||||
DESTINATION ${KICAD_BIN}
|
||||
COMPONENT binary
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
set( COMMON_ABOUT_DLG_SRCS
|
||||
dialog_about/AboutDialog_main.cpp
|
||||
dialog_about/dialog_about.cpp
|
||||
|
@ -93,11 +135,13 @@ set( COMMON_PAGE_LAYOUT_SRCS
|
|||
)
|
||||
|
||||
set( COMMON_SRCS
|
||||
${LIB_KICAD_SRCS}
|
||||
${COMMON_ABOUT_DLG_SRCS}
|
||||
${COMMON_PAGE_LAYOUT_SRCS}
|
||||
base_struct.cpp
|
||||
basicframe.cpp
|
||||
bezier_curves.cpp
|
||||
bin_mod.cpp
|
||||
bitmap.cpp
|
||||
block_commande.cpp
|
||||
build_version.cpp
|
||||
|
@ -107,6 +151,7 @@ set( COMMON_SRCS
|
|||
class_marker_base.cpp
|
||||
class_plotter.cpp
|
||||
class_undoredo_container.cpp
|
||||
colors.cpp
|
||||
common.cpp
|
||||
common_plot_functions.cpp
|
||||
common_plotHPGL_functions.cpp
|
||||
|
@ -115,18 +160,20 @@ set( COMMON_SRCS
|
|||
common_plotGERBER_functions.cpp
|
||||
common_plotDXF_functions.cpp
|
||||
common_plotSVG_functions.cpp
|
||||
config_params.cpp
|
||||
confirm.cpp
|
||||
copy_to_clipboard.cpp
|
||||
convert_basic_shapes_to_polygon.cpp
|
||||
dialog_shim.cpp
|
||||
displlst.cpp
|
||||
dlist.cpp
|
||||
drawframe.cpp
|
||||
drawpanel.cpp
|
||||
draw_frame.cpp
|
||||
draw_panel.cpp
|
||||
drawtxt.cpp
|
||||
dsnlexer.cpp
|
||||
eda_dde.cpp
|
||||
eda_doc.cpp
|
||||
filter_reader.cpp
|
||||
# findkicadhelppath.cpp.notused deprecated, use searchhelpfilefullpath.cpp
|
||||
gestfich.cpp
|
||||
getrunningmicrosecs.cpp
|
||||
grid_tricks.cpp
|
||||
|
@ -134,28 +181,38 @@ set( COMMON_SRCS
|
|||
hotkeys_basic.cpp
|
||||
hotkey_grid_table.cpp
|
||||
html_messagebox.cpp
|
||||
kiface_i.cpp
|
||||
kiway.cpp
|
||||
kiway_express.cpp
|
||||
kiway_holder.cpp
|
||||
kiway_player.cpp
|
||||
msgpanel.cpp
|
||||
netlist_keywords.cpp
|
||||
newstroke_font.cpp
|
||||
projet_config.cpp
|
||||
prependpath.cpp
|
||||
project.cpp
|
||||
ptree.cpp
|
||||
reporter.cpp
|
||||
richio.cpp
|
||||
searchhelpfilefullpath.cpp
|
||||
search_stack.cpp
|
||||
selcolor.cpp
|
||||
string.cpp
|
||||
systemdirsappend.cpp
|
||||
trigo.cpp
|
||||
utf8.cpp
|
||||
wildcards_and_files_ext.cpp
|
||||
worksheet.cpp
|
||||
wxwineda.cpp
|
||||
wxunittext.cpp
|
||||
xnode.cpp
|
||||
zoom.cpp
|
||||
)
|
||||
|
||||
# We will not want edaappl.cpp linked into the KIFACE, only into the KIWAY.
|
||||
if( TRUE OR NOT USE_KIWAY_DLLS )
|
||||
list( APPEND COMMON_SRCS edaappl.cpp )
|
||||
#if( NOT USE_KIWAY_DLLS )
|
||||
# We DO NOT want pgm_base.cpp linked into the KIFACE, only into the KIWAY.
|
||||
# Check the map files to verify eda_pgm.o not being linked in.
|
||||
list( APPEND COMMON_SRCS pgm_base.cpp )
|
||||
endif()
|
||||
|
||||
if( NOT HAVE_STRTOKR )
|
||||
|
@ -171,6 +228,7 @@ set( COMMON_SRCS
|
|||
|
||||
math/math_util.cpp
|
||||
|
||||
tool/tool_action.cpp
|
||||
tool/tool_base.cpp
|
||||
tool/tool_manager.cpp
|
||||
tool/tool_dispatcher.cpp
|
||||
|
@ -184,17 +242,16 @@ set( COMMON_SRCS
|
|||
geometry/shape_collisions.cpp
|
||||
geometry/shape_index.cpp
|
||||
)
|
||||
|
||||
|
||||
add_library( common STATIC ${COMMON_SRCS} )
|
||||
add_dependencies( common lib-dependencies )
|
||||
|
||||
|
||||
set( PCB_COMMON_SRCS
|
||||
base_screen.cpp
|
||||
eda_text.cpp
|
||||
class_page_info.cpp
|
||||
convert_basic_shapes_to_polygon.cpp
|
||||
pcbcommon.cpp
|
||||
lset.cpp
|
||||
footprint_info.cpp
|
||||
../pcbnew/basepcbframe.cpp
|
||||
../pcbnew/class_board.cpp
|
||||
|
@ -219,6 +276,8 @@ set( PCB_COMMON_SRCS
|
|||
../pcbnew/class_zone.cpp
|
||||
../pcbnew/class_zone_settings.cpp
|
||||
../pcbnew/classpcb.cpp
|
||||
../pcbnew/ratsnest_data.cpp
|
||||
../pcbnew/ratsnest_viewitem.cpp
|
||||
../pcbnew/collectors.cpp
|
||||
../pcbnew/netlist_reader.cpp
|
||||
../pcbnew/legacy_netlist_reader.cpp
|
||||
|
|
|
@ -175,13 +175,6 @@ void BASE_SCREEN::SetGridList( GRIDS& gridlist )
|
|||
}
|
||||
|
||||
|
||||
void BASE_SCREEN::GetGrids( GRIDS& aList )
|
||||
{
|
||||
for( size_t i = 0; i < m_grids.size(); i++ )
|
||||
aList.push_back( m_grids[ i ] );
|
||||
}
|
||||
|
||||
|
||||
int BASE_SCREEN::SetGrid( const wxRealPoint& size )
|
||||
{
|
||||
wxASSERT( !m_grids.empty() );
|
||||
|
|
|
@ -197,7 +197,7 @@ void StripTrailingZeros( wxString& aStringValue, unsigned aTrailingZeroAllowed )
|
|||
* otherwise the actual value is rounded when read from dialog and converted
|
||||
* in internal units, and therefore modified.
|
||||
*/
|
||||
wxString ReturnStringFromValue( EDA_UNITS_T aUnit, int aValue, bool aAddUnitSymbol )
|
||||
wxString StringFromValue( EDA_UNITS_T aUnit, int aValue, bool aAddUnitSymbol )
|
||||
{
|
||||
double value_to_print = To_User_Unit( aUnit, aValue );
|
||||
|
||||
|
@ -257,7 +257,7 @@ wxString ReturnStringFromValue( EDA_UNITS_T aUnit, int aValue, bool aAddUnitSymb
|
|||
|
||||
void PutValueInLocalUnits( wxTextCtrl& aTextCtr, int aValue )
|
||||
{
|
||||
wxString msg = ReturnStringFromValue( g_UserUnit, aValue );
|
||||
wxString msg = StringFromValue( g_UserUnit, aValue );
|
||||
|
||||
aTextCtr.SetValue( msg );
|
||||
}
|
||||
|
@ -286,7 +286,7 @@ double From_User_Unit( EDA_UNITS_T aUnit, double aValue )
|
|||
}
|
||||
|
||||
|
||||
int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue )
|
||||
int ValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue )
|
||||
{
|
||||
double value;
|
||||
double dtmp = 0;
|
||||
|
@ -348,21 +348,21 @@ int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue )
|
|||
}
|
||||
|
||||
|
||||
int ReturnValueFromString( const wxString& aTextValue )
|
||||
int ValueFromString( const wxString& aTextValue )
|
||||
{
|
||||
int value;
|
||||
|
||||
value = ReturnValueFromString( g_UserUnit, aTextValue);
|
||||
value = ValueFromString( g_UserUnit, aTextValue);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
int ReturnValueFromTextCtrl( const wxTextCtrl& aTextCtr )
|
||||
int ValueFromTextCtrl( const wxTextCtrl& aTextCtr )
|
||||
{
|
||||
int value;
|
||||
wxString msg = aTextCtr.GetValue();
|
||||
|
||||
value = ReturnValueFromString( g_UserUnit, msg );
|
||||
value = ValueFromString( g_UserUnit, msg );
|
||||
|
||||
return value;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,8 @@
|
|||
|
||||
#include <build_version.h>
|
||||
#include <fctsys.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <pgm_base.h>
|
||||
#include <kiface_i.h>
|
||||
#include <online_help.h>
|
||||
#include <id.h>
|
||||
#include <eda_doc.h>
|
||||
|
@ -45,7 +46,7 @@
|
|||
#include <menus_helpers.h>
|
||||
|
||||
#include <boost/version.hpp>
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
/// The default auto save interval is 10 minutes.
|
||||
#define DEFAULT_AUTO_SAVE_INTERVAL 600
|
||||
|
@ -61,11 +62,9 @@ static const wxChar entryPerspective[] = wxT( "Perspective" );
|
|||
|
||||
|
||||
|
||||
EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent,
|
||||
ID_DRAWFRAME_TYPE aFrameType,
|
||||
const wxString& aTitle,
|
||||
const wxPoint& aPos, const wxSize& aSize,
|
||||
long aStyle, const wxString & aFrameName ) :
|
||||
EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
|
||||
const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
|
||||
long aStyle, const wxString& aFrameName ) :
|
||||
wxFrame( aParent, wxID_ANY, aTitle, aPos, aSize, aStyle, aFrameName )
|
||||
{
|
||||
wxSize minsize;
|
||||
|
@ -108,7 +107,10 @@ EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent,
|
|||
|
||||
void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
|
||||
{
|
||||
SaveSettings(); // virtual, wxFrame specific
|
||||
wxConfigBase* cfg = config();
|
||||
|
||||
if( cfg )
|
||||
SaveSettings( cfg ); // virtual, wxFrame specific
|
||||
|
||||
event.Skip(); // we did not "handle" the event, only eavesdropped on it.
|
||||
}
|
||||
|
@ -116,9 +118,6 @@ void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
|
|||
|
||||
EDA_BASE_FRAME::~EDA_BASE_FRAME()
|
||||
{
|
||||
if( wxGetApp().GetHtmlHelpController() )
|
||||
wxGetApp().SetHtmlHelpController( NULL );
|
||||
|
||||
delete m_autoSaveTimer;
|
||||
|
||||
// This is needed for OSX: avoids further OnDraw processing after this
|
||||
|
@ -152,6 +151,19 @@ bool EDA_BASE_FRAME::ProcessEvent( wxEvent& aEvent )
|
|||
}
|
||||
|
||||
|
||||
bool EDA_BASE_FRAME::Enable( bool enable )
|
||||
{
|
||||
// so we can do logging of this state change:
|
||||
|
||||
#if defined(DEBUG)
|
||||
const char* type_id = typeid( *this ).name();
|
||||
printf( "wxFrame %-28s: %s\n", type_id, enable ? "enabled" : "disabled" );
|
||||
#endif
|
||||
|
||||
return wxFrame::Enable( enable );
|
||||
}
|
||||
|
||||
|
||||
void EDA_BASE_FRAME::onAutoSaveTimer( wxTimerEvent& aEvent )
|
||||
{
|
||||
if( !doAutoSave() )
|
||||
|
@ -170,58 +182,45 @@ void EDA_BASE_FRAME::ReCreateMenuBar()
|
|||
}
|
||||
|
||||
|
||||
void EDA_BASE_FRAME::SetLanguage( wxCommandEvent& event )
|
||||
void EDA_BASE_FRAME::ShowChangedLanguage()
|
||||
{
|
||||
int id = event.GetId();
|
||||
|
||||
wxGetApp().SetLanguageIdentifier( id );
|
||||
wxGetApp().SetLanguage();
|
||||
ReCreateMenuBar();
|
||||
GetMenuBar()->Refresh();
|
||||
}
|
||||
|
||||
|
||||
void EDA_BASE_FRAME::LoadSettings()
|
||||
void EDA_BASE_FRAME::LoadSettings( wxConfigBase* aCfg )
|
||||
{
|
||||
wxString text;
|
||||
int Ypos_min;
|
||||
wxConfig* config;
|
||||
|
||||
config = wxGetApp().GetSettings();
|
||||
|
||||
int maximized = 0;
|
||||
|
||||
if( config )
|
||||
wxString text = m_FrameName + wxT( "Pos_x" );
|
||||
aCfg->Read( text, &m_FramePos.x );
|
||||
|
||||
text = m_FrameName + wxT( "Pos_y" );
|
||||
aCfg->Read( text, &m_FramePos.y );
|
||||
|
||||
text = m_FrameName + wxT( "Size_x" );
|
||||
aCfg->Read( text, &m_FrameSize.x, 600 );
|
||||
|
||||
text = m_FrameName + wxT( "Size_y" );
|
||||
aCfg->Read( text, &m_FrameSize.y, 400 );
|
||||
|
||||
text = m_FrameName + wxT( "Maximized" );
|
||||
aCfg->Read( text, &maximized, 0 );
|
||||
|
||||
if( m_hasAutoSave )
|
||||
{
|
||||
text = m_FrameName + wxT( "Pos_x" );
|
||||
config->Read( text, &m_FramePos.x );
|
||||
|
||||
text = m_FrameName + wxT( "Pos_y" );
|
||||
config->Read( text, &m_FramePos.y );
|
||||
|
||||
text = m_FrameName + wxT( "Size_x" );
|
||||
config->Read( text, &m_FrameSize.x, 600 );
|
||||
|
||||
text = m_FrameName + wxT( "Size_y" );
|
||||
config->Read( text, &m_FrameSize.y, 400 );
|
||||
|
||||
text = m_FrameName + wxT( "Maximized" );
|
||||
config->Read( text, &maximized, 0 );
|
||||
|
||||
if( m_hasAutoSave )
|
||||
{
|
||||
text = m_FrameName + entryAutoSaveInterval;
|
||||
config->Read( text, &m_autoSaveInterval, DEFAULT_AUTO_SAVE_INTERVAL );
|
||||
}
|
||||
text = m_FrameName + entryAutoSaveInterval;
|
||||
aCfg->Read( text, &m_autoSaveInterval, DEFAULT_AUTO_SAVE_INTERVAL );
|
||||
}
|
||||
|
||||
// Ensure Window title bar is visible
|
||||
#if defined( __WXMAC__ )
|
||||
// for macOSX, the window must be below system (macOSX) toolbar
|
||||
// Ypos_min = GetMBarHeight(); seems no more exist in new API (subject to change)
|
||||
Ypos_min = 20;
|
||||
// Ypos_min = GetMBarHeight(); seems no more exist in new API (subject to change)
|
||||
int Ypos_min = 20;
|
||||
#else
|
||||
Ypos_min = 0;
|
||||
int Ypos_min = 0;
|
||||
#endif
|
||||
if( m_FramePos.y < Ypos_min )
|
||||
m_FramePos.y = Ypos_min;
|
||||
|
@ -229,44 +228,39 @@ void EDA_BASE_FRAME::LoadSettings()
|
|||
if( maximized )
|
||||
Maximize();
|
||||
|
||||
// Once this is fully implemented, wxAuiManager will be used to maintain the persistance of
|
||||
// the main frame and all it's managed windows and all of the legacy frame persistence
|
||||
// position code can be removed.
|
||||
if( config )
|
||||
config->Read( m_FrameName + entryPerspective, &m_perspective );
|
||||
aCfg->Read( m_FrameName + entryPerspective, &m_perspective );
|
||||
}
|
||||
|
||||
|
||||
void EDA_BASE_FRAME::SaveSettings()
|
||||
void EDA_BASE_FRAME::SaveSettings( wxConfigBase* aCfg )
|
||||
{
|
||||
wxString text;
|
||||
wxConfig* config = wxGetApp().GetSettings();
|
||||
wxString text;
|
||||
|
||||
if( !config || IsIconized() )
|
||||
if( IsIconized() )
|
||||
return;
|
||||
|
||||
m_FrameSize = GetSize();
|
||||
m_FramePos = GetPosition();
|
||||
|
||||
text = m_FrameName + wxT( "Pos_x" );
|
||||
config->Write( text, (long) m_FramePos.x );
|
||||
aCfg->Write( text, (long) m_FramePos.x );
|
||||
|
||||
text = m_FrameName + wxT( "Pos_y" );
|
||||
config->Write( text, (long) m_FramePos.y );
|
||||
aCfg->Write( text, (long) m_FramePos.y );
|
||||
|
||||
text = m_FrameName + wxT( "Size_x" );
|
||||
config->Write( text, (long) m_FrameSize.x );
|
||||
aCfg->Write( text, (long) m_FrameSize.x );
|
||||
|
||||
text = m_FrameName + wxT( "Size_y" );
|
||||
config->Write( text, (long) m_FrameSize.y );
|
||||
aCfg->Write( text, (long) m_FrameSize.y );
|
||||
|
||||
text = m_FrameName + wxT( "Maximized" );
|
||||
config->Write( text, IsMaximized() );
|
||||
aCfg->Write( text, IsMaximized() );
|
||||
|
||||
if( m_hasAutoSave )
|
||||
{
|
||||
text = m_FrameName + entryAutoSaveInterval;
|
||||
config->Write( text, m_autoSaveInterval );
|
||||
aCfg->Write( text, m_autoSaveInterval );
|
||||
}
|
||||
|
||||
// Once this is fully implemented, wxAuiManager will be used to maintain
|
||||
|
@ -276,8 +270,28 @@ void EDA_BASE_FRAME::SaveSettings()
|
|||
|
||||
// printf( "perspective(%s): %s\n",
|
||||
// TO_UTF8( m_FrameName + entryPerspective ), TO_UTF8( perspective ) );
|
||||
aCfg->Write( m_FrameName + entryPerspective, perspective );
|
||||
}
|
||||
|
||||
config->Write( m_FrameName + entryPerspective, perspective );
|
||||
|
||||
wxConfigBase* EDA_BASE_FRAME::config()
|
||||
{
|
||||
// KICAD_MANAGER_FRAME overrides this
|
||||
wxConfigBase* ret = Kiface().KifaceSettings();
|
||||
//wxASSERT( ret );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
const SEARCH_STACK& EDA_BASE_FRAME::sys_search()
|
||||
{
|
||||
return Kiface().KifaceSearch();
|
||||
}
|
||||
|
||||
|
||||
wxString EDA_BASE_FRAME::help_name()
|
||||
{
|
||||
return Kiface().GetHelpFileName();
|
||||
}
|
||||
|
||||
|
||||
|
@ -288,12 +302,12 @@ void EDA_BASE_FRAME::PrintMsg( const wxString& text )
|
|||
|
||||
|
||||
void EDA_BASE_FRAME::UpdateFileHistory( const wxString& FullFileName,
|
||||
wxFileHistory * aFileHistory )
|
||||
wxFileHistory* aFileHistory )
|
||||
{
|
||||
wxFileHistory* fileHistory = aFileHistory;
|
||||
|
||||
if( fileHistory == NULL )
|
||||
fileHistory = & wxGetApp().GetFileHistory();
|
||||
if( !fileHistory )
|
||||
fileHistory = &Kiface().GetFileHistory();
|
||||
|
||||
fileHistory->AddFileToHistory( FullFileName );
|
||||
}
|
||||
|
@ -302,65 +316,63 @@ void EDA_BASE_FRAME::UpdateFileHistory( const wxString& FullFileName,
|
|||
wxString EDA_BASE_FRAME::GetFileFromHistory( int cmdId, const wxString& type,
|
||||
wxFileHistory* aFileHistory )
|
||||
{
|
||||
wxString fn, msg;
|
||||
size_t i;
|
||||
wxFileHistory* fileHistory = aFileHistory;
|
||||
|
||||
if( fileHistory == NULL )
|
||||
fileHistory = & wxGetApp().GetFileHistory();
|
||||
if( !fileHistory )
|
||||
fileHistory = &Kiface().GetFileHistory();
|
||||
|
||||
int baseId = fileHistory->GetBaseId();
|
||||
|
||||
wxASSERT( cmdId >= baseId && cmdId < baseId + ( int )fileHistory->GetCount() );
|
||||
wxASSERT( cmdId >= baseId && cmdId < baseId + (int) fileHistory->GetCount() );
|
||||
|
||||
i = ( size_t )( cmdId - baseId );
|
||||
unsigned i = cmdId - baseId;
|
||||
|
||||
if( i < fileHistory->GetCount() )
|
||||
{
|
||||
fn = fileHistory->GetHistoryFile( i );
|
||||
wxString fn = fileHistory->GetHistoryFile( i );
|
||||
|
||||
if( !wxFileName::FileExists( fn ) )
|
||||
if( wxFileName::FileExists( fn ) )
|
||||
return fn;
|
||||
else
|
||||
{
|
||||
msg.Printf( wxT( "file <%s> was not found." ), GetChars( fn ) );
|
||||
wxString msg = wxString::Format(
|
||||
wxT( "file '%s' was not found." ),
|
||||
GetChars( fn ) );
|
||||
|
||||
wxMessageBox( msg );
|
||||
|
||||
fileHistory->RemoveFileFromHistory( i );
|
||||
fn = wxEmptyString;
|
||||
}
|
||||
}
|
||||
|
||||
return fn;
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
|
||||
{
|
||||
wxString msg;
|
||||
const SEARCH_STACK& search = sys_search();
|
||||
|
||||
/* We have to get document for beginners,
|
||||
* or the the full specific doc
|
||||
* or the full specific doc
|
||||
* if event id is wxID_INDEX, we want the document for beginners.
|
||||
* else the specific doc file (its name is in wxGetApp().GetHelpFileName())
|
||||
* else the specific doc file (its name is in Kiface().GetHelpFileName())
|
||||
* The document for beginners is the same for all KiCad utilities
|
||||
*/
|
||||
if( event.GetId() == wxID_INDEX )
|
||||
{
|
||||
// Temporary change the help filename
|
||||
wxString tmp = wxGetApp().GetHelpFileName();
|
||||
|
||||
// Search for "getting_started_in_kicad.pdf" or "Getting_Started_in_KiCad.pdf"
|
||||
wxGetApp().SetHelpFileName( wxT( "getting_started_in_kicad.pdf" ) );
|
||||
wxString helpFile = wxGetApp().GetHelpFile();
|
||||
wxString helpFile = SearchHelpFileFullPath( search, wxT( "getting_started_in_kicad.pdf" ) );
|
||||
|
||||
if( !helpFile )
|
||||
{ // Try to find "Getting_Started_in_KiCad.pdf"
|
||||
wxGetApp().SetHelpFileName( wxT( "Getting_Started_in_KiCad.pdf" ) );
|
||||
helpFile = wxGetApp().GetHelpFile();
|
||||
}
|
||||
helpFile = SearchHelpFileFullPath( search, wxT( "Getting_Started_in_KiCad.pdf" ) );
|
||||
|
||||
if( !helpFile )
|
||||
{
|
||||
msg.Printf( _( "Help file %s could not be found." ),
|
||||
GetChars( wxGetApp().GetHelpFileName() ) );
|
||||
wxString msg = wxString::Format( _(
|
||||
"Help file '%s' could not be found." ),
|
||||
wxT( "getting_started_in_kicad.pdf" )
|
||||
);
|
||||
wxMessageBox( msg );
|
||||
}
|
||||
else
|
||||
|
@ -368,36 +380,36 @@ void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
|
|||
GetAssociatedDocument( this, helpFile );
|
||||
}
|
||||
|
||||
wxGetApp().SetHelpFileName( tmp );
|
||||
return;
|
||||
}
|
||||
|
||||
wxString base_name = help_name();
|
||||
|
||||
#if defined ONLINE_HELP_FILES_FORMAT_IS_HTML
|
||||
|
||||
if( wxGetApp().GetHtmlHelpController() == NULL )
|
||||
wxHtmlHelpController* hc = Pgm().GetHtmlHelpController();
|
||||
|
||||
wxString helpFile = SearchHelpFileFullPath( search, );
|
||||
|
||||
if( !!helpFile )
|
||||
{
|
||||
wxGetApp().InitOnLineHelp();
|
||||
hc->UseConfig( Pgm().CommonSettings() );
|
||||
hc->SetTitleFormat( wxT( "KiCad Help" ) );
|
||||
hc->AddBook( helpFile );
|
||||
}
|
||||
|
||||
|
||||
if( wxGetApp().GetHtmlHelpController() )
|
||||
{
|
||||
wxGetApp().GetHtmlHelpController()->DisplayContents();
|
||||
wxGetApp().GetHtmlHelpController()->Display( wxGetApp().GetHelpFileName() );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg.Printf( _( "Help file %s could not be found." ), GetChars( wxGetApp().GetHelpFileName() ) );
|
||||
wxMessageBox( msg );
|
||||
}
|
||||
hc->DisplayContents();
|
||||
hc->Display( helpFile );
|
||||
|
||||
#elif defined ONLINE_HELP_FILES_FORMAT_IS_PDF
|
||||
wxString helpFile = wxGetApp().GetHelpFile();
|
||||
wxString helpFile = SearchHelpFileFullPath( search, base_name );
|
||||
|
||||
if( !helpFile )
|
||||
{
|
||||
msg.Printf( _( "Help file %s could not be found." ),
|
||||
GetChars( wxGetApp().GetHelpFileName() ) );
|
||||
wxString msg = wxString::Format( _(
|
||||
"Help file '%s' could not be found." ),
|
||||
GetChars( base_name )
|
||||
);
|
||||
wxMessageBox( msg );
|
||||
}
|
||||
else
|
||||
|
@ -413,8 +425,8 @@ void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event )
|
|||
|
||||
void EDA_BASE_FRAME::OnSelectPreferredEditor( wxCommandEvent& event )
|
||||
{
|
||||
wxFileName fn = wxGetApp().GetEditorName();
|
||||
wxString wildcard( wxT( "*" ) );
|
||||
wxFileName fn = Pgm().GetEditorName();
|
||||
wxString wildcard( wxT( "*" ) );
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
wildcard += wxT( ".exe" );
|
||||
|
@ -430,18 +442,16 @@ void EDA_BASE_FRAME::OnSelectPreferredEditor( wxCommandEvent& event )
|
|||
if( dlg.ShowModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
||||
wxASSERT( wxGetApp().GetCommonSettings() );
|
||||
wxString editor = dlg.GetPath();
|
||||
|
||||
wxConfig* cfg = wxGetApp().GetCommonSettings();
|
||||
wxGetApp().SetEditorName( dlg.GetPath() );
|
||||
cfg->Write( wxT( "Editor" ), wxGetApp().GetEditorName() );
|
||||
Pgm().SetEditorName( editor );
|
||||
}
|
||||
|
||||
|
||||
void EDA_BASE_FRAME::GetKicadAbout( wxCommandEvent& event )
|
||||
{
|
||||
bool ShowAboutDialog(wxWindow * parent);
|
||||
ShowAboutDialog(this);
|
||||
ShowAboutDialog( this );
|
||||
}
|
||||
|
||||
|
||||
|
@ -535,7 +545,7 @@ void EDA_BASE_FRAME::CopyVersionInfoToClipboard( wxCommandEvent& event )
|
|||
wxString tmp;
|
||||
wxPlatformInfo info;
|
||||
|
||||
tmp = wxT( "Application: " ) + wxGetApp().GetTitle() + wxT( "\n" );
|
||||
tmp = wxT( "Application: " ) + Pgm().App().GetAppName() + wxT( "\n" );
|
||||
tmp << wxT( "Version: " ) << GetBuildVersion()
|
||||
#ifdef DEBUG
|
||||
<< wxT( " Debug" )
|
||||
|
@ -666,14 +676,14 @@ void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName,
|
|||
if( !autoSaveFileName.FileExists() )
|
||||
return;
|
||||
|
||||
wxString msg;
|
||||
wxString msg = wxString::Format( _(
|
||||
"Well this is potentially embarrassing! It appears that the last time "
|
||||
"you were editing the file '%s' it was not saved properly. Do you wish to restore the last "
|
||||
"edits you made?" ),
|
||||
GetChars( aFileName.GetFullName() )
|
||||
);
|
||||
|
||||
msg.Printf( _( "Well this is potentially embarrassing! It appears that the last time \
|
||||
you were editing the file <%s> it was not saved properly. Do you wish to restore the last \
|
||||
edits you made?" ),
|
||||
GetChars( aFileName.GetFullName() ) );
|
||||
|
||||
int response = wxMessageBox( msg, wxGetApp().GetAppName(), wxYES_NO | wxICON_QUESTION, this );
|
||||
int response = wxMessageBox( msg, Pgm().App().GetAppName(), wxYES_NO | wxICON_QUESTION, this );
|
||||
|
||||
// Make a backup of the current file, delete the file, and rename the auto save file to
|
||||
// the file name.
|
||||
|
@ -703,7 +713,7 @@ edits you made?" ),
|
|||
if( !wxRenameFile( autoSaveFileName.GetFullPath(), aFileName.GetFullPath() ) )
|
||||
{
|
||||
wxMessageBox( _( "The auto save file could not be renamed to the board file name." ),
|
||||
wxGetApp().GetAppName(), wxOK | wxICON_EXCLAMATION, this );
|
||||
Pgm().App().GetAppName(), wxOK | wxICON_EXCLAMATION, this );
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -716,35 +726,3 @@ edits you made?" ),
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SetModalMode
|
||||
* Disable or enable all other windows, to emulate a dialog behavior
|
||||
* Useful when the frame is used to show and selec items
|
||||
* (see FOOTPRINT_VIEWER_FRAME and LIB_VIEW_FRAME)
|
||||
*
|
||||
* @param aModal = true to disable all other opened windows (i.e.
|
||||
* this windows is in dialog mode
|
||||
* = false to enable other windows
|
||||
* This function is analog to MakeModal( aModal ), deprecated since wxWidgets 2.9.4
|
||||
*/
|
||||
void EDA_BASE_FRAME::SetModalMode( bool aModal )
|
||||
{
|
||||
// Disable all other windows
|
||||
#if wxCHECK_VERSION(2, 9, 4)
|
||||
if ( IsTopLevel() )
|
||||
{
|
||||
wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst();
|
||||
while (node)
|
||||
{
|
||||
wxWindow *win = node->GetData();
|
||||
if (win != this)
|
||||
win->Enable(!aModal);
|
||||
|
||||
node = node->GetNext();
|
||||
}
|
||||
}
|
||||
#else
|
||||
// Deprecated since wxWidgets 2.9.4
|
||||
MakeModal( aModal );
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
|
||||
|
||||
#include <wx/config.h>
|
||||
#include <bin_mod.h>
|
||||
#include <online_help.h>
|
||||
|
||||
|
||||
BIN_MOD::BIN_MOD( const char* aName ) :
|
||||
m_name( aName ),
|
||||
m_config( 0 )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
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_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
|
||||
}
|
||||
|
||||
|
||||
void BIN_MOD::End()
|
||||
{
|
||||
if( m_config )
|
||||
{
|
||||
m_history.Save( *m_config );
|
||||
|
||||
// Deleting a wxConfigBase writes its contents to disk if changed.
|
||||
// Might be NULL if called twice, in which case nothing happens.
|
||||
delete m_config;
|
||||
m_config = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BIN_MOD::~BIN_MOD()
|
||||
{
|
||||
End();
|
||||
}
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#include <fctsys.h>
|
||||
#include <gr_basic.h>
|
||||
#include <wxstruct.h>
|
||||
#include <draw_frame.h>
|
||||
#include <common.h>
|
||||
#include <macros.h>
|
||||
#include <base_struct.h>
|
||||
|
@ -71,6 +71,10 @@ void BLOCK_SELECTOR::SetMessageBlock( EDA_DRAW_FRAME* frame )
|
|||
msg = _( "Block Drag" );
|
||||
break;
|
||||
|
||||
case BLOCK_DRAG_ITEM: // Drag
|
||||
msg = _( "Drag item" );
|
||||
break;
|
||||
|
||||
case BLOCK_COPY: // Copy
|
||||
msg = _( "Block Copy" );
|
||||
break;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#endif
|
||||
|
||||
#ifndef KICAD_BUILD_VERSION
|
||||
# define KICAD_BUILD_VERSION "(2014-jan-25)"
|
||||
# define KICAD_BUILD_VERSION "(2014-jul-16 BZR unknown)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
@ -12,15 +12,21 @@
|
|||
* in Eeschema, Pcbnew and GerbView
|
||||
*/
|
||||
|
||||
/* Initial colors values: optimized for Pcbnew, but are also Ok for Eeschema
|
||||
/* Initial colors values: optimized for Pcbnew 64 layers.
|
||||
* The table is not actually used by Eeschema.
|
||||
* these values are superseded by config reading
|
||||
*/
|
||||
static const EDA_COLOR_T default_layer_color[LAYERSCOLORSBUFFERSIZE] =
|
||||
{
|
||||
GREEN, BLUE, LIGHTGRAY, BROWN,
|
||||
RED, MAGENTA, LIGHTGRAY, MAGENTA,
|
||||
DARKGRAY, BLUE, GREEN, CYAN,
|
||||
LIGHTRED, LIGHTMAGENTA, YELLOW, RED,
|
||||
static const EDA_COLOR_T default_layer_color[] = {
|
||||
RED, YELLOW, LIGHTMAGENTA, LIGHTRED,
|
||||
CYAN, GREEN, BLUE, DARKGRAY,
|
||||
MAGENTA, LIGHTGRAY, MAGENTA, RED,
|
||||
BROWN, LIGHTGRAY, BLUE, GREEN,
|
||||
|
||||
RED, YELLOW, LIGHTMAGENTA, LIGHTRED,
|
||||
CYAN, GREEN, BLUE, DARKGRAY,
|
||||
MAGENTA, LIGHTGRAY, MAGENTA, RED,
|
||||
BROWN, LIGHTGRAY, BLUE, GREEN,
|
||||
|
||||
BLUE, MAGENTA,
|
||||
LIGHTCYAN, RED,
|
||||
MAGENTA, CYAN,
|
||||
|
@ -34,8 +40,8 @@ static const EDA_COLOR_T default_layer_color[LAYERSCOLORSBUFFERSIZE] =
|
|||
DARKGRAY
|
||||
};
|
||||
|
||||
static const EDA_COLOR_T default_items_color[LAYERSCOLORSBUFFERSIZE] =
|
||||
{
|
||||
|
||||
static const EDA_COLOR_T default_items_color[] = {
|
||||
LIGHTGRAY, // unused
|
||||
CYAN, // VIA_MICROVIA_VISIBLE
|
||||
BROWN, // VIA_BBLIND_VISIBLE
|
||||
|
@ -56,13 +62,24 @@ static const EDA_COLOR_T default_items_color[LAYERSCOLORSBUFFERSIZE] =
|
|||
LIGHTGRAY, LIGHTGRAY, LIGHTGRAY
|
||||
};
|
||||
|
||||
|
||||
COLORS_DESIGN_SETTINGS::COLORS_DESIGN_SETTINGS()
|
||||
{
|
||||
for( unsigned ii = 0; ii < DIM(m_LayersColors); ii++ )
|
||||
m_LayersColors[ii] = default_layer_color[ii];
|
||||
for( unsigned src = 0, dst = 0; dst < DIM(m_LayersColors); ++dst )
|
||||
{
|
||||
m_LayersColors[dst] = default_layer_color[src++];
|
||||
|
||||
for( unsigned ii = 0; ii < DIM(m_ItemsColors); ii++ )
|
||||
m_ItemsColors[ii] = default_items_color[ii];
|
||||
if( src >= DIM( default_layer_color ) )
|
||||
src = 0; // wrap the source.
|
||||
}
|
||||
|
||||
for( unsigned src = 0, dst = 0; dst < DIM(m_ItemsColors); ++dst )
|
||||
{
|
||||
m_ItemsColors[dst] = default_items_color[src++];
|
||||
|
||||
if( src >= DIM( default_items_color ) )
|
||||
src = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -100,12 +117,13 @@ void COLORS_DESIGN_SETTINGS::SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor
|
|||
* @return the color for an item which is one of the item indices given
|
||||
* in pcbstruct.h, enum PCB_VISIBLE or in schematic
|
||||
*/
|
||||
EDA_COLOR_T COLORS_DESIGN_SETTINGS::GetItemColor( int aItemIdx )
|
||||
EDA_COLOR_T COLORS_DESIGN_SETTINGS::GetItemColor( int aItemIdx ) const
|
||||
{
|
||||
if( (unsigned) aItemIdx < DIM(m_ItemsColors) )
|
||||
if( (unsigned) aItemIdx < DIM( m_ItemsColors ) )
|
||||
{
|
||||
return m_ItemsColors[aItemIdx];
|
||||
}
|
||||
|
||||
return UNSPECIFIED_COLOR;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,19 +13,11 @@
|
|||
|
||||
LAYER_SELECTOR::LAYER_SELECTOR()
|
||||
{
|
||||
m_layerorder = true;
|
||||
m_layerhotkeys = true;
|
||||
m_hotkeys = NULL;
|
||||
}
|
||||
|
||||
|
||||
bool LAYER_SELECTOR::SetLayersOrdered( bool value )
|
||||
{
|
||||
m_layerorder = value;
|
||||
return m_layerorder;
|
||||
}
|
||||
|
||||
|
||||
bool LAYER_SELECTOR::SetLayersHotkeys( bool value )
|
||||
{
|
||||
m_layerhotkeys = value;
|
||||
|
@ -120,12 +112,15 @@ int LAYER_BOX_SELECTOR::SetLayerSelection( LAYER_NUM layer )
|
|||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void LAYER_BOX_SELECTOR::ResyncBitmapOnly()
|
||||
{
|
||||
LAYER_NUM elements = GetCount();
|
||||
for( LAYER_NUM i = FIRST_LAYER; i < elements; ++i )
|
||||
int elements = GetCount();
|
||||
|
||||
for( LAYER_NUM i = 0; i < elements; ++i )
|
||||
{
|
||||
wxBitmap layerbmp( 14, 14 );
|
||||
SetBitmapLayer( layerbmp, i );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
|
||||
// Default marquer shape:
|
||||
#define M_SHAPE_SCALE 6 // default scaling factor for MarkerShapeCorners coordinates
|
||||
#define CORNERS_COUNT 8
|
||||
const int M_SHAPE_SCALE = 6; // default scaling factor for MarkerShapeCorners coordinates
|
||||
const unsigned CORNERS_COUNT = 8;
|
||||
/* corners of the default shape
|
||||
* actual coordinates are these values * .m_ScalingFactor
|
||||
*/
|
||||
|
@ -46,10 +46,10 @@ void MARKER_BASE::init()
|
|||
m_Color = RED;
|
||||
wxPoint start = MarkerShapeCorners[0];
|
||||
wxPoint end = MarkerShapeCorners[0];
|
||||
|
||||
for( unsigned ii = 0; ii < CORNERS_COUNT; ii++ )
|
||||
{
|
||||
wxPoint corner = MarkerShapeCorners[ii];
|
||||
m_Corners.push_back( corner );
|
||||
start.x = std::min( start.x, corner.x);
|
||||
start.y = std::min( start.y, corner.y);
|
||||
end.x = std::max( end.x, corner.x);
|
||||
|
@ -64,7 +64,6 @@ void MARKER_BASE::init()
|
|||
MARKER_BASE::MARKER_BASE( const MARKER_BASE& aMarker )
|
||||
{
|
||||
m_Pos = aMarker.m_Pos;
|
||||
m_Corners = aMarker.m_Corners;
|
||||
m_MarkerType = aMarker.m_MarkerType;
|
||||
m_Color = aMarker.m_Color;
|
||||
m_ShapeBoundingBox = aMarker.m_ShapeBoundingBox;
|
||||
|
@ -154,9 +153,9 @@ void MARKER_BASE::DrawMarker( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDr
|
|||
|
||||
GRSetDrawMode( aDC, aDrawMode );
|
||||
|
||||
for( unsigned ii = 0; ii < m_Corners.size(); ii++ )
|
||||
for( unsigned ii = 0; ii < CORNERS_COUNT; ii++ )
|
||||
{
|
||||
corners[ii] = m_Corners[ii];
|
||||
corners[ii] = MarkerShapeCorners[ii];
|
||||
corners[ii].x *= m_ScalingFactor;
|
||||
corners[ii].y *= m_ScalingFactor;
|
||||
corners[ii] += m_Pos + aOffset;
|
||||
|
|
|
@ -38,21 +38,22 @@
|
|||
|
||||
|
||||
// Standard paper sizes nicknames.
|
||||
const wxString PAGE_INFO::A4( wxT( "A4" ) );
|
||||
const wxString PAGE_INFO::A3( wxT( "A3" ) );
|
||||
const wxString PAGE_INFO::A2( wxT( "A2" ) );
|
||||
const wxString PAGE_INFO::A1( wxT( "A1" ) );
|
||||
const wxString PAGE_INFO::A0( wxT( "A0" ) );
|
||||
const wxString PAGE_INFO::A( wxT( "A" ) );
|
||||
const wxString PAGE_INFO::B( wxT( "B" ) );
|
||||
const wxString PAGE_INFO::C( wxT( "C" ) );
|
||||
const wxString PAGE_INFO::D( wxT( "D" ) );
|
||||
const wxString PAGE_INFO::E( wxT( "E" ) );
|
||||
const wxString PAGE_INFO::GERBER( wxT( "GERBER" ) );
|
||||
const wxString PAGE_INFO::USLetter( wxT( "USLetter" ) );
|
||||
const wxString PAGE_INFO::USLegal( wxT( "USLegal" ) );
|
||||
const wxString PAGE_INFO::USLedger( wxT( "USLedger" ) );
|
||||
const wxString PAGE_INFO::Custom( wxT( "User" ) );
|
||||
const wxChar PAGE_INFO::A4[] = wxT( "A4" );
|
||||
const wxChar PAGE_INFO::A3[] = wxT( "A3" );
|
||||
const wxChar PAGE_INFO::A2[] = wxT( "A2" );
|
||||
const wxChar PAGE_INFO::A1[] = wxT( "A1" );
|
||||
const wxChar PAGE_INFO::A0[] = wxT( "A0" );
|
||||
const wxChar PAGE_INFO::A[] = wxT( "A" );
|
||||
const wxChar PAGE_INFO::B[] = wxT( "B" ) ;
|
||||
const wxChar PAGE_INFO::C[] = wxT( "C" );
|
||||
const wxChar PAGE_INFO::D[] = wxT( "D" );
|
||||
const wxChar PAGE_INFO::E[] = wxT( "E" );
|
||||
|
||||
const wxChar PAGE_INFO::GERBER[] = wxT( "GERBER" );
|
||||
const wxChar PAGE_INFO::USLetter[] = wxT( "USLetter" );
|
||||
const wxChar PAGE_INFO::USLegal[] = wxT( "USLegal" );
|
||||
const wxChar PAGE_INFO::USLedger[] = wxT( "USLedger" );
|
||||
const wxChar PAGE_INFO::Custom[] = wxT( "User" );
|
||||
|
||||
|
||||
// Standard page sizes in mils, all constants
|
||||
|
|
|
@ -50,7 +50,7 @@ PICKED_ITEMS_LIST::~PICKED_ITEMS_LIST()
|
|||
}
|
||||
|
||||
|
||||
void PICKED_ITEMS_LIST::PushItem( ITEM_PICKER& aItem )
|
||||
void PICKED_ITEMS_LIST::PushItem( const ITEM_PICKER& aItem )
|
||||
{
|
||||
m_ItemsList.push_back( aItem );
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ ITEM_PICKER PICKED_ITEMS_LIST::PopItem()
|
|||
}
|
||||
|
||||
|
||||
bool PICKED_ITEMS_LIST::ContainsItem( EDA_ITEM* aItem ) const
|
||||
bool PICKED_ITEMS_LIST::ContainsItem( const EDA_ITEM* aItem ) const
|
||||
{
|
||||
for( size_t i = 0; i < m_ItemsList.size(); i++ )
|
||||
{
|
||||
|
@ -82,6 +82,18 @@ bool PICKED_ITEMS_LIST::ContainsItem( EDA_ITEM* aItem ) const
|
|||
}
|
||||
|
||||
|
||||
int PICKED_ITEMS_LIST::FindItem( const EDA_ITEM* aItem ) const
|
||||
{
|
||||
for( size_t i = 0; i < m_ItemsList.size(); i++ )
|
||||
{
|
||||
if( m_ItemsList[i].GetItem() == aItem )
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void PICKED_ITEMS_LIST::ClearItemsList()
|
||||
{
|
||||
m_ItemsList.clear();
|
||||
|
@ -157,7 +169,7 @@ void PICKED_ITEMS_LIST::ClearListAndDeleteItems()
|
|||
}
|
||||
|
||||
|
||||
ITEM_PICKER PICKED_ITEMS_LIST::GetItemWrapper( unsigned int aIdx )
|
||||
ITEM_PICKER PICKED_ITEMS_LIST::GetItemWrapper( unsigned int aIdx ) const
|
||||
{
|
||||
ITEM_PICKER picker;
|
||||
|
||||
|
@ -168,7 +180,7 @@ ITEM_PICKER PICKED_ITEMS_LIST::GetItemWrapper( unsigned int aIdx )
|
|||
}
|
||||
|
||||
|
||||
EDA_ITEM* PICKED_ITEMS_LIST::GetPickedItem( unsigned int aIdx )
|
||||
EDA_ITEM* PICKED_ITEMS_LIST::GetPickedItem( unsigned int aIdx ) const
|
||||
{
|
||||
if( aIdx < m_ItemsList.size() )
|
||||
return m_ItemsList[aIdx].GetItem();
|
||||
|
@ -177,7 +189,7 @@ EDA_ITEM* PICKED_ITEMS_LIST::GetPickedItem( unsigned int aIdx )
|
|||
}
|
||||
|
||||
|
||||
EDA_ITEM* PICKED_ITEMS_LIST::GetPickedItemLink( unsigned int aIdx )
|
||||
EDA_ITEM* PICKED_ITEMS_LIST::GetPickedItemLink( unsigned int aIdx ) const
|
||||
{
|
||||
if( aIdx < m_ItemsList.size() )
|
||||
return m_ItemsList[aIdx].GetLink();
|
||||
|
@ -186,7 +198,7 @@ EDA_ITEM* PICKED_ITEMS_LIST::GetPickedItemLink( unsigned int aIdx )
|
|||
}
|
||||
|
||||
|
||||
UNDO_REDO_T PICKED_ITEMS_LIST::GetPickedItemStatus( unsigned int aIdx )
|
||||
UNDO_REDO_T PICKED_ITEMS_LIST::GetPickedItemStatus( unsigned int aIdx ) const
|
||||
{
|
||||
if( aIdx < m_ItemsList.size() )
|
||||
return m_ItemsList[aIdx].GetStatus();
|
||||
|
@ -195,7 +207,7 @@ UNDO_REDO_T PICKED_ITEMS_LIST::GetPickedItemStatus( unsigned int aIdx )
|
|||
}
|
||||
|
||||
|
||||
STATUS_FLAGS PICKED_ITEMS_LIST::GetPickerFlags( unsigned aIdx )
|
||||
STATUS_FLAGS PICKED_ITEMS_LIST::GetPickerFlags( unsigned aIdx ) const
|
||||
{
|
||||
if( aIdx < m_ItemsList.size() )
|
||||
return m_ItemsList[aIdx].GetFlags();
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
|
||||
#include <colors.h>
|
||||
|
||||
|
||||
/**
|
||||
* The predefined colors used in KiCad.
|
||||
* Please: if you change a value, remember these values are carefully chosen
|
||||
* to have good results in Pcbnew, that uses the ORed value of basic colors
|
||||
* when displaying superimposed objects
|
||||
* This list must have exactly NBCOLORS items
|
||||
*/
|
||||
const StructColors g_ColorRefs[NBCOLORS] =
|
||||
{
|
||||
{ 0, 0, 0, BLACK, wxT( "Black" ), DARKDARKGRAY },
|
||||
{ 72, 72, 72, DARKDARKGRAY, wxT( "Gray 1" ), DARKGRAY },
|
||||
{ 132, 132, 132, DARKGRAY, wxT( "Gray 2" ), LIGHTGRAY },
|
||||
{ 194, 194, 194, LIGHTGRAY, wxT( "Gray 3" ), WHITE },
|
||||
{ 255, 255, 255, WHITE, wxT( "White" ), WHITE },
|
||||
{ 194, 255, 255, LIGHTYELLOW, wxT( "L.Yellow" ), WHITE },
|
||||
{ 72, 0, 0, DARKBLUE, wxT( "Blue 1" ), BLUE },
|
||||
{ 0, 72, 0, DARKGREEN, wxT( "Green 1" ), GREEN },
|
||||
{ 72, 72, 0, DARKCYAN, wxT( "Cyan 1" ), CYAN },
|
||||
{ 0, 0, 72, DARKRED, wxT( "Red 1" ), RED },
|
||||
{ 72, 0, 72, DARKMAGENTA, wxT( "Magenta 1" ), MAGENTA },
|
||||
{ 0, 72, 72, DARKBROWN, wxT( "Brown 1" ), BROWN },
|
||||
{ 132, 0, 0, BLUE, wxT( "Blue 2" ), LIGHTBLUE },
|
||||
{ 0, 132, 0, GREEN, wxT( "Green 2" ), LIGHTGREEN },
|
||||
{ 132, 132, 0, CYAN, wxT( "Cyan 2" ), LIGHTCYAN },
|
||||
{ 0, 0, 132, RED, wxT( "Red 2" ), LIGHTRED },
|
||||
{ 132, 0, 132, MAGENTA, wxT( "Magenta 2" ), LIGHTMAGENTA },
|
||||
{ 0, 132, 132, BROWN, wxT( "Brown 2" ), YELLOW },
|
||||
{ 194, 0, 0, LIGHTBLUE, wxT( "Blue 3" ), PUREBLUE, },
|
||||
{ 0, 194, 0, LIGHTGREEN, wxT( "Green 3" ), PUREGREEN },
|
||||
{ 194, 194, 0, LIGHTCYAN, wxT( "Cyan 3" ), PURECYAN },
|
||||
{ 0, 0, 194, LIGHTRED, wxT( "Red 3" ), PURERED },
|
||||
{ 194, 0, 194, LIGHTMAGENTA, wxT( "Magenta 3" ), PUREMAGENTA },
|
||||
{ 0, 194, 194, YELLOW, wxT( "Yellow 3" ), PUREYELLOW },
|
||||
{ 255, 0, 0, PUREBLUE, wxT( "Blue 4" ), WHITE },
|
||||
{ 0, 255, 0, PUREGREEN, wxT( "Green 4" ), WHITE },
|
||||
{ 255, 255, 0, PURECYAN, wxT( "Cyan 4" ), WHITE },
|
||||
{ 0, 0, 255, PURERED, wxT( "Red 4" ), WHITE },
|
||||
{ 255, 0, 255, PUREMAGENTA, wxT( "Magenta 4" ), WHITE },
|
||||
{ 0, 255, 255, PUREYELLOW, wxT( "Yellow 4" ), WHITE },
|
||||
};
|
||||
|
||||
|
||||
EDA_COLOR_T ColorByName( const wxString& aName )
|
||||
{
|
||||
// look for a match in the palette itself
|
||||
for( EDA_COLOR_T trying = BLACK; trying < NBCOLORS; trying = NextColor(trying) )
|
||||
{
|
||||
if( 0 == aName.CmpNoCase( g_ColorRefs[trying].m_Name ) )
|
||||
return trying;
|
||||
}
|
||||
|
||||
// Not found, no idea...
|
||||
return UNSPECIFIED_COLOR;
|
||||
}
|
||||
|
||||
|
||||
bool ColorIsLight( EDA_COLOR_T aColor )
|
||||
{
|
||||
const StructColors &c = g_ColorRefs[ColorGetBase( aColor )];
|
||||
int r = c.m_Red;
|
||||
int g = c.m_Green;
|
||||
int b = c.m_Blue;
|
||||
return ((r * r) + (g * g) + (b * b)) > (128 * 128 * 3);
|
||||
}
|
||||
|
||||
|
||||
EDA_COLOR_T ColorFindNearest( const wxColour &aColor )
|
||||
{
|
||||
return ColorFindNearest( aColor.Red(), aColor.Green(), aColor.Blue() );
|
||||
}
|
||||
|
||||
|
||||
EDA_COLOR_T ColorFindNearest( int aR, int aG, int aB )
|
||||
{
|
||||
EDA_COLOR_T candidate = BLACK;
|
||||
|
||||
/* Find the 'nearest' color in the palette. This is fun. There is
|
||||
a gazilion of metrics for the color space and no one of the
|
||||
useful one is in the RGB color space. Who cares, this is a CAD,
|
||||
not a photosomething...
|
||||
|
||||
I hereby declare that the distance is the sum of the square of the
|
||||
component difference. Think about the RGB color cube. Now get the
|
||||
euclidean distance, but without the square root... for ordering
|
||||
purposes it's the same, obviously. Also each component can't be
|
||||
less of the target one, since I found this currently work better...
|
||||
*/
|
||||
int nearest_distance = 255 * 255 * 3 + 1; // Can't beat this
|
||||
|
||||
for( EDA_COLOR_T trying = BLACK; trying < NBCOLORS; trying = NextColor(trying) )
|
||||
{
|
||||
const StructColors &c = g_ColorRefs[trying];
|
||||
int distance = (aR - c.m_Red) * (aR - c.m_Red) +
|
||||
(aG - c.m_Green) * (aG - c.m_Green) +
|
||||
(aB - c.m_Blue) * (aB - c.m_Blue);
|
||||
if( distance < nearest_distance && c.m_Red >= aR &&
|
||||
c.m_Green >= aG && c.m_Blue >= aB )
|
||||
{
|
||||
nearest_distance = distance;
|
||||
candidate = trying;
|
||||
}
|
||||
}
|
||||
|
||||
return candidate;
|
||||
}
|
||||
|
||||
|
||||
EDA_COLOR_T ColorMix( EDA_COLOR_T aColor1, EDA_COLOR_T aColor2 )
|
||||
{
|
||||
/* Memoization storage. This could be potentially called for each
|
||||
* color merge so a cache is useful (there are few colours anyway) */
|
||||
static EDA_COLOR_T mix_cache[NBCOLORS][NBCOLORS];
|
||||
|
||||
// TODO how is alpha used? it's a mac only thing, I have no idea
|
||||
aColor1 = ColorGetBase( aColor1 );
|
||||
aColor2 = ColorGetBase( aColor2 );
|
||||
|
||||
// First easy thing: a black gives always the other colour
|
||||
if( aColor1 == BLACK )
|
||||
return aColor2;
|
||||
|
||||
if( aColor2 == BLACK)
|
||||
return aColor1;
|
||||
|
||||
/* Now we are sure that black can't occur, so the rule is:
|
||||
* BLACK means not computed yet. If we're lucky we already have
|
||||
* an answer */
|
||||
EDA_COLOR_T candidate = mix_cache[aColor1][aColor2];
|
||||
if( candidate != BLACK )
|
||||
return candidate;
|
||||
|
||||
// Blend the two colors (i.e. OR the RGB values)
|
||||
const StructColors &c1 = g_ColorRefs[aColor1];
|
||||
const StructColors &c2 = g_ColorRefs[aColor2];
|
||||
|
||||
// Ask the palette for the nearest color to the mix
|
||||
wxColour mixed( c1.m_Red | c2.m_Red,
|
||||
c1.m_Green | c2.m_Green,
|
||||
c1.m_Blue | c2.m_Blue );
|
||||
candidate = ColorFindNearest( mixed );
|
||||
|
||||
/* Here, BLACK is *not* a good answer, since it would recompute the next time.
|
||||
* Even theorically its not possible (with the current rules), but
|
||||
* maybe the metric will change in the future */
|
||||
if( candidate == BLACK)
|
||||
candidate = DARKDARKGRAY;
|
||||
|
||||
// Store the result in the cache. The operation is commutative, too
|
||||
mix_cache[aColor1][aColor2] = candidate;
|
||||
mix_cache[aColor2][aColor1] = candidate;
|
||||
return candidate;
|
||||
}
|
||||
|
|
@ -59,54 +59,11 @@
|
|||
*/
|
||||
|
||||
bool g_ShowPageLimits = true;
|
||||
wxString g_UserLibDirBuffer;
|
||||
|
||||
EDA_UNITS_T g_UserUnit;
|
||||
EDA_COLOR_T g_GhostColor;
|
||||
|
||||
|
||||
/**
|
||||
* The predefined colors used in KiCad.
|
||||
* Please: if you change a value, remember these values are carefully chosen
|
||||
* to have good results in Pcbnew, that uses the ORed value of basic colors
|
||||
* when displaying superimposed objects
|
||||
* This list must have exactly NBCOLORS items
|
||||
*/
|
||||
const StructColors g_ColorRefs[NBCOLORS] =
|
||||
{
|
||||
{ 0, 0, 0, BLACK, wxT( "Black" ), DARKDARKGRAY },
|
||||
{ 72, 72, 72, DARKDARKGRAY, wxT( "Gray 1" ), DARKGRAY },
|
||||
{ 132, 132, 132, DARKGRAY, wxT( "Gray 2" ), LIGHTGRAY },
|
||||
{ 194, 194, 194, LIGHTGRAY, wxT( "Gray 3" ), WHITE },
|
||||
{ 255, 255, 255, WHITE, wxT( "White" ), WHITE },
|
||||
{ 194, 255, 255, LIGHTYELLOW, wxT( "L.Yellow" ), WHITE },
|
||||
{ 72, 0, 0, DARKBLUE, wxT( "Blue 1" ), BLUE },
|
||||
{ 0, 72, 0, DARKGREEN, wxT( "Green 1" ), GREEN },
|
||||
{ 72, 72, 0, DARKCYAN, wxT( "Cyan 1" ), CYAN },
|
||||
{ 0, 0, 72, DARKRED, wxT( "Red 1" ), RED },
|
||||
{ 72, 0, 72, DARKMAGENTA, wxT( "Magenta 1" ), MAGENTA },
|
||||
{ 0, 72, 72, DARKBROWN, wxT( "Brown 1" ), BROWN },
|
||||
{ 132, 0, 0, BLUE, wxT( "Blue 2" ), LIGHTBLUE },
|
||||
{ 0, 132, 0, GREEN, wxT( "Green 2" ), LIGHTGREEN },
|
||||
{ 132, 132, 0, CYAN, wxT( "Cyan 2" ), LIGHTCYAN },
|
||||
{ 0, 0, 132, RED, wxT( "Red 2" ), LIGHTRED },
|
||||
{ 132, 0, 132, MAGENTA, wxT( "Magenta 2" ), LIGHTMAGENTA },
|
||||
{ 0, 132, 132, BROWN, wxT( "Brown 2" ), YELLOW },
|
||||
{ 194, 0, 0, LIGHTBLUE, wxT( "Blue 3" ), PUREBLUE, },
|
||||
{ 0, 194, 0, LIGHTGREEN, wxT( "Green 3" ), PUREGREEN },
|
||||
{ 194, 194, 0, LIGHTCYAN, wxT( "Cyan 3" ), PURECYAN },
|
||||
{ 0, 0, 194, LIGHTRED, wxT( "Red 3" ), PURERED },
|
||||
{ 194, 0, 194, LIGHTMAGENTA, wxT( "Magenta 3" ), PUREMAGENTA },
|
||||
{ 0, 194, 194, YELLOW, wxT( "Yellow 3" ), PUREYELLOW },
|
||||
{ 255, 0, 0, PUREBLUE, wxT( "Blue 4" ), WHITE },
|
||||
{ 0, 255, 0, PUREGREEN, wxT( "Green 4" ), WHITE },
|
||||
{ 255, 255, 0, PURECYAN, wxT( "Cyan 4" ), WHITE },
|
||||
{ 0, 0, 255, PURERED, wxT( "Red 4" ), WHITE },
|
||||
{ 255, 0, 255, PUREMAGENTA, wxT( "Magenta 4" ), WHITE },
|
||||
{ 0, 255, 255, PUREYELLOW, wxT( "Yellow 4" ), WHITE },
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Function to use local notation or C standard notation for floating point numbers
|
||||
* some countries use 1,5 and others (and C) 1.5
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <plot_common.h>
|
||||
#include <macros.h>
|
||||
#include <kicad_string.h>
|
||||
#include <convert_basic_shapes_to_polygon.h>
|
||||
|
||||
/**
|
||||
* Oblique angle for DXF native text
|
||||
|
@ -319,24 +320,115 @@ void DXF_PLOTTER::Circle( const wxPoint& centre, int diameter, FILL_T fill, int
|
|||
|
||||
/**
|
||||
* DXF polygon: doesn't fill it but at least it close the filled ones
|
||||
* DXF does not know thick outline.
|
||||
* It does not know thhick segments, therefore filled polygons with thick outline
|
||||
* are converted to inflated polygon by aWidth/2
|
||||
*/
|
||||
#include "clipper.hpp"
|
||||
void DXF_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
|
||||
FILL_T aFill, int aWidth)
|
||||
{
|
||||
if( aCornerList.size() <= 1 )
|
||||
return;
|
||||
|
||||
MoveTo( aCornerList[0] );
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
LineTo( aCornerList[ii] );
|
||||
unsigned last = aCornerList.size() - 1;
|
||||
|
||||
// Close polygon if 'fill' requested
|
||||
if( aFill )
|
||||
// Plot outlines with lines (thickness = 0) to define the polygon
|
||||
if( aWidth <= 0 )
|
||||
{
|
||||
unsigned ii = aCornerList.size() - 1;
|
||||
if( aCornerList[ii] != aCornerList[0] )
|
||||
LineTo( aCornerList[0] );
|
||||
MoveTo( aCornerList[0] );
|
||||
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
LineTo( aCornerList[ii] );
|
||||
|
||||
// Close polygon if 'fill' requested
|
||||
if( aFill )
|
||||
{
|
||||
if( aCornerList[last] != aCornerList[0] )
|
||||
LineTo( aCornerList[0] );
|
||||
}
|
||||
|
||||
PenFinish();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// if the polygon outline has thickness, and is not filled
|
||||
// (i.e. is a polyline) plot outlines with thick segments
|
||||
if( aWidth > 0 && !aFill )
|
||||
{
|
||||
MoveTo( aCornerList[0] );
|
||||
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
ThickSegment( aCornerList[ii-1], aCornerList[ii],
|
||||
aWidth, FILLED );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// The polygon outline has thickness, and is filled
|
||||
// Build and plot the polygon which contains the initial
|
||||
// polygon and its thick outline
|
||||
CPOLYGONS_LIST bufferOutline;
|
||||
CPOLYGONS_LIST bufferPolybase;
|
||||
const int circleToSegmentsCount = 16;
|
||||
|
||||
// enter outline as polygon:
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
{
|
||||
TransformRoundedEndsSegmentToPolygon( bufferOutline,
|
||||
aCornerList[ii-1], aCornerList[ii], circleToSegmentsCount, aWidth );
|
||||
}
|
||||
|
||||
// enter the initial polygon:
|
||||
for( unsigned ii = 0; ii < aCornerList.size(); ii++ )
|
||||
{
|
||||
CPolyPt polypoint( aCornerList[ii].x, aCornerList[ii].y );
|
||||
bufferPolybase.Append( polypoint );
|
||||
}
|
||||
|
||||
bufferPolybase.CloseLastContour();
|
||||
|
||||
// Merge polygons to build the polygon which contains the initial
|
||||
// polygon and its thick outline
|
||||
KI_POLYGON_SET polysBase; // Store the main outline and the final outline
|
||||
KI_POLYGON_SET polysOutline; // Store the thick segments to draw the outline
|
||||
bufferPolybase.ExportTo( polysBase );
|
||||
bufferOutline.ExportTo( polysOutline );
|
||||
|
||||
polysBase += polysOutline; // create the outline which contains thick outline
|
||||
|
||||
// We should have only one polygon in list, now.
|
||||
wxASSERT( polysBase.size() == 1 );
|
||||
|
||||
if( polysBase.size() < 1 ) // should not happen
|
||||
return;
|
||||
|
||||
KI_POLYGON poly = polysBase[0]; // Expected only one polygon here
|
||||
|
||||
if( poly.size() < 2 ) // should not happen
|
||||
return;
|
||||
|
||||
// Now, output the final polygon to DXF file:
|
||||
last = poly.size() - 1;
|
||||
KI_POLY_POINT point = *(poly.begin());
|
||||
wxPoint startPoint( point.x(), point.y() );
|
||||
MoveTo( startPoint );
|
||||
|
||||
for( unsigned ii = 1; ii < poly.size(); ii++ )
|
||||
{
|
||||
point = *( poly.begin() + ii );
|
||||
LineTo( wxPoint( point.x(), point.y() ) );
|
||||
}
|
||||
|
||||
// Close polygon, if needed
|
||||
point = *(poly.begin() + last);
|
||||
wxPoint endPoint( point.x(), point.y() );
|
||||
|
||||
if( endPoint != startPoint )
|
||||
LineTo( startPoint );
|
||||
|
||||
PenFinish();
|
||||
}
|
||||
|
||||
|
@ -570,12 +662,21 @@ void DXF_PLOTTER::Text( const wxPoint& aPos,
|
|||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||
int aWidth,
|
||||
bool aItalic,
|
||||
bool aBold )
|
||||
bool aBold,
|
||||
bool aMultilineAllowed )
|
||||
{
|
||||
if( textAsLines || containsNonAsciiChars( aText ) )
|
||||
/* output text as graphics */
|
||||
// Fix me: see how to use DXF text mode for multiline texts
|
||||
if( aMultilineAllowed && !aText.Contains( wxT( "\n" ) ) )
|
||||
aMultilineAllowed = false; // the text has only one line.
|
||||
|
||||
if( textAsLines || containsNonAsciiChars( aText ) || aMultilineAllowed )
|
||||
{
|
||||
// output text as graphics.
|
||||
// Perhaps miltiline texts could be handled as DXF text entity
|
||||
// but I do not want spend time about this (JPC)
|
||||
PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify,
|
||||
aWidth, aItalic, aBold );
|
||||
aWidth, aItalic, aBold, aMultilineAllowed );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Emit text as a text entity. This loses formatting and shape but it's
|
||||
|
|
|
@ -15,6 +15,22 @@
|
|||
|
||||
#include <build_version.h>
|
||||
|
||||
GERBER_PLOTTER::GERBER_PLOTTER()
|
||||
{
|
||||
workFile = 0;
|
||||
finalFile = 0;
|
||||
currentAperture = apertures.end();
|
||||
|
||||
// number of digits after the point (number of digits of the mantissa
|
||||
// Be carefull: the Gerber coordinates are stored in an integer
|
||||
// so 6 digits (inches) or 5 digits (mm) is a good value
|
||||
// To avoid overflow, 7 digits (inches) or 6 digits is a max.
|
||||
// with lower values than 6 digits (inches) or 5 digits (mm),
|
||||
// Creating self-intersecting polygons from non-intersecting polygons
|
||||
// happen easily.
|
||||
m_gerberUnitInch = false;
|
||||
m_gerberUnitFmt = 6;
|
||||
}
|
||||
|
||||
void GERBER_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
||||
double aScale, bool aMirror )
|
||||
|
@ -23,27 +39,43 @@ void GERBER_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
|||
wxASSERT( aMirror == false );
|
||||
m_plotMirror = false;
|
||||
plotOffset = aOffset;
|
||||
wxASSERT( aScale == 1 );
|
||||
plotScale = 1;
|
||||
wxASSERT( aScale == 1 ); // aScale parameter is not used in Gerber
|
||||
plotScale = 1; // Plot scale is *always* 1.0
|
||||
|
||||
m_IUsPerDecimil = aIusPerDecimil;
|
||||
iuPerDeviceUnit = 1.0 / aIusPerDecimil;
|
||||
/* We don't handle the filmbox, and it's more useful to keep the
|
||||
* origin at the origin */
|
||||
// gives now a default value to iuPerDeviceUnit (because the units of the caller is now known)
|
||||
// which could be modified later by calling SetGerberCoordinatesFormat()
|
||||
iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( m_IUsPerDecimil * 10000.0 );
|
||||
|
||||
// We don't handle the filmbox, and it's more useful to keep the
|
||||
// origin at the origin
|
||||
paperSize.x = 0;
|
||||
paperSize.y = 0;
|
||||
SetDefaultLineWidth( 100 * aIusPerDecimil ); // Arbitrary default
|
||||
}
|
||||
|
||||
void GERBER_PLOTTER::SetGerberCoordinatesFormat( int aResolution, bool aUseInches )
|
||||
{
|
||||
m_gerberUnitInch = aUseInches;
|
||||
m_gerberUnitFmt = aResolution;
|
||||
|
||||
iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( m_IUsPerDecimil * 10000.0 );
|
||||
|
||||
if( ! m_gerberUnitInch )
|
||||
iuPerDeviceUnit *= 25.4; // gerber output in mm
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Emit a D-Code record, using proper conversions
|
||||
* to format a leading zero omitted gerber coordinate
|
||||
* (for 4 decimal positions, see header generation in start_plot
|
||||
* (for n decimal positions, see header generation in start_plot
|
||||
*/
|
||||
void GERBER_PLOTTER::emitDcode( const DPOINT& pt, int dcode )
|
||||
{
|
||||
|
||||
fprintf( outputFile, "X%dY%dD%02d*\n",
|
||||
int( pt.x ), int( pt.y ), dcode );
|
||||
KiROUND( pt.x ), KiROUND( pt.y ), dcode );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -67,19 +99,38 @@ bool GERBER_PLOTTER::StartPlot()
|
|||
if( outputFile == NULL )
|
||||
return false;
|
||||
|
||||
/* Set coordinate format to 3.4 absolute, leading zero omitted */
|
||||
fputs( "%FSLAX34Y34*%\n", outputFile );
|
||||
fputs( "G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*\n", outputFile );
|
||||
if( ! m_attribFunction.IsEmpty() )
|
||||
{
|
||||
fprintf( outputFile, "%%TF.FileFunction,%s*%%\n",
|
||||
TO_UTF8( m_attribFunction ) );
|
||||
}
|
||||
|
||||
// Set coordinate format to 3.6 or 4.5 absolute, leading zero omitted
|
||||
// the number of digits for the integer part of coordintes is needed
|
||||
// in gerber format, but is not very important when omitting leading zeros
|
||||
// It is fixed here to 3 (inch) or 4 (mm), but is not actually used
|
||||
int leadingDigitCount = m_gerberUnitInch ? 3 : 4;
|
||||
|
||||
fprintf( outputFile, "%%FSLAX%d%dY%d%d*%%\n",
|
||||
leadingDigitCount, m_gerberUnitFmt,
|
||||
leadingDigitCount, m_gerberUnitFmt );
|
||||
fprintf( outputFile,
|
||||
"G04 Gerber Fmt %d.%d, Leading zero omitted, Abs format (unit %s)*\n",
|
||||
leadingDigitCount, m_gerberUnitFmt,
|
||||
m_gerberUnitInch ? "inch" : "mm" );
|
||||
|
||||
wxString Title = creator + wxT( " " ) + GetBuildVersion();
|
||||
fprintf( outputFile, "G04 (created by %s) date %s*\n",
|
||||
fprintf( outputFile, "G04 Created by KiCad (%s) date %s*\n",
|
||||
TO_UTF8( Title ), TO_UTF8( DateAndTime() ) );
|
||||
|
||||
/* Mass parameter: unit = INCHES */
|
||||
fputs( "%MOIN*%\n", outputFile );
|
||||
/* Mass parameter: unit = INCHES/MM */
|
||||
if( m_gerberUnitInch )
|
||||
fputs( "%MOIN*%\n", outputFile );
|
||||
else
|
||||
fputs( "%MOMM*%\n", outputFile );
|
||||
|
||||
/* Specify linear interpol (G01), unit = INCH (G70), abs format (G90) */
|
||||
fputs( "G01*\nG70*\nG90*\n", outputFile );
|
||||
/* Specify linear interpol (G01) */
|
||||
fputs( "G01*\n", outputFile );
|
||||
fputs( "G04 APERTURE LIST*\n", outputFile );
|
||||
/* Select the default aperture */
|
||||
SetCurrentLineWidth( -1 );
|
||||
|
@ -185,7 +236,7 @@ void GERBER_PLOTTER::selectAperture( const wxSize& size,
|
|||
{
|
||||
// Pick an existing aperture or create a new one
|
||||
currentAperture = getAperture( size, type );
|
||||
fprintf( outputFile, "G54D%d*\n", currentAperture->DCode );
|
||||
fprintf( outputFile, "D%d*\n", currentAperture->DCode );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -202,8 +253,13 @@ void GERBER_PLOTTER::writeApertureList()
|
|||
for( std::vector<APERTURE>::iterator tool = apertures.begin();
|
||||
tool != apertures.end(); tool++ )
|
||||
{
|
||||
const double fscale = 0.0001f * plotScale
|
||||
* iuPerDeviceUnit ;
|
||||
// apertude sizes are in inch or mm, regardless the
|
||||
// coordinates format
|
||||
double fscale = 0.0001 * plotScale / m_IUsPerDecimil; // inches
|
||||
|
||||
if(! m_gerberUnitInch )
|
||||
fscale *= 25.4; // size in mm
|
||||
|
||||
char* text = cbuf + sprintf( cbuf, "%%ADD%d", tool->DCode );
|
||||
|
||||
/* Please note: the Gerber specs for mass parameters say that
|
||||
|
@ -303,47 +359,57 @@ void GERBER_PLOTTER::Arc( const wxPoint& aCenter, double aStAngle, double aEndAn
|
|||
DPOINT devEnd = userToDeviceCoordinates( end );
|
||||
DPOINT devCenter = userToDeviceCoordinates( aCenter )
|
||||
- userToDeviceCoordinates( start );
|
||||
|
||||
fprintf( outputFile, "G75*\n" ); // Multiquadrant mode
|
||||
|
||||
if( aStAngle < aEndAngle )
|
||||
fprintf( outputFile, "G03" );
|
||||
else
|
||||
fprintf( outputFile, "G02" );
|
||||
fprintf( outputFile, "X%dY%dI%dJ%dD01*\n", int( devEnd.x ), int( devEnd.y ),
|
||||
int( devCenter.x ), int( devCenter.y ) );
|
||||
|
||||
fprintf( outputFile, "X%dY%dI%dJ%dD01*\n",
|
||||
KiROUND( devEnd.x ), KiROUND( devEnd.y ),
|
||||
KiROUND( devCenter.x ), KiROUND( devCenter.y ) );
|
||||
fprintf( outputFile, "G74*\nG01*\n" ); // Back to single quadrant and linear interp.
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gerber polygon: they can (and *should*) be filled with the
|
||||
* appropriate G36/G37 sequence (raster fills are deprecated)
|
||||
* appropriate G36/G37 sequence
|
||||
*/
|
||||
void GERBER_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
|
||||
void GERBER_PLOTTER:: PlotPoly( const std::vector< wxPoint >& aCornerList,
|
||||
FILL_T aFill, int aWidth )
|
||||
{
|
||||
if( aCornerList.size() <= 1 )
|
||||
return;
|
||||
|
||||
// Gerber format does not know filled polygons with thick outline
|
||||
// Therefore, to plot a filled polygon with outline having a thickness,
|
||||
// one should plot outline as thick segments
|
||||
|
||||
SetCurrentLineWidth( aWidth );
|
||||
|
||||
if( aFill )
|
||||
{
|
||||
fputs( "G36*\n", outputFile );
|
||||
|
||||
MoveTo( aCornerList[0] );
|
||||
MoveTo( aCornerList[0] );
|
||||
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
{
|
||||
LineTo( aCornerList[ii] );
|
||||
}
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
LineTo( aCornerList[ii] );
|
||||
|
||||
if( aFill )
|
||||
{
|
||||
FinishTo( aCornerList[0] );
|
||||
fputs( "G37*\n", outputFile );
|
||||
}
|
||||
else
|
||||
|
||||
if( aWidth > 0 )
|
||||
{
|
||||
MoveTo( aCornerList[0] );
|
||||
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
LineTo( aCornerList[ii] );
|
||||
|
||||
PenFinish();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -264,6 +264,8 @@ void HPGL_PLOTTER::PlotPoly( const std::vector<wxPoint>& aCornerList,
|
|||
if( aCornerList.size() <= 1 )
|
||||
return;
|
||||
|
||||
SetCurrentLineWidth( aWidth );
|
||||
|
||||
MoveTo( aCornerList[0] );
|
||||
|
||||
for( unsigned ii = 1; ii < aCornerList.size(); ii++ )
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <pgm_base.h>
|
||||
#include <trigo.h>
|
||||
#include <wxstruct.h>
|
||||
#include <base_struct.h>
|
||||
|
@ -79,6 +79,8 @@ void PDF_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
|||
// The CTM is set to 1 user unit per decimil
|
||||
iuPerDeviceUnit = 1.0 / aIusPerDecimil;
|
||||
|
||||
SetDefaultLineWidth( 100 / iuPerDeviceUnit ); // arbitrary default
|
||||
|
||||
/* The paper size in this engined is handled page by page
|
||||
Look in the StartPage function */
|
||||
}
|
||||
|
@ -511,7 +513,6 @@ void PDF_PLOTTER::StartPage()
|
|||
paperSize = pageInfo.GetSizeMils();
|
||||
paperSize.x *= 10.0 / iuPerDeviceUnit;
|
||||
paperSize.y *= 10.0 / iuPerDeviceUnit;
|
||||
SetDefaultLineWidth( 100 / iuPerDeviceUnit ); // arbitrary default
|
||||
|
||||
// Open the content stream; the page object will go later
|
||||
pageStreamHandle = startPdfStream();
|
||||
|
@ -723,7 +724,7 @@ bool PDF_PLOTTER::EndPlot()
|
|||
"<< /Size %lu /Root %d 0 R /Info %d 0 R >>\n"
|
||||
"startxref\n"
|
||||
"%ld\n" // The offset we saved before
|
||||
"%%EOF\n",
|
||||
"%%%%EOF\n",
|
||||
(unsigned long) xrefTable.size(), catalogHandle, infoDictHandle, xref_start );
|
||||
|
||||
fclose( outputFile );
|
||||
|
@ -741,10 +742,15 @@ void PDF_PLOTTER::Text( const wxPoint& aPos,
|
|||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||
int aWidth,
|
||||
bool aItalic,
|
||||
bool aBold )
|
||||
bool aBold,
|
||||
bool aMultilineAllowed )
|
||||
{
|
||||
// Fix me: see how to use PDF text mode for multiline texts
|
||||
if( aMultilineAllowed && !aText.Contains( wxT( "\n" ) ) )
|
||||
aMultilineAllowed = false; // the text has only one line.
|
||||
|
||||
// Emit native PDF text (if requested)
|
||||
if( m_textMode != PLOTTEXTMODE_STROKE )
|
||||
if( m_textMode != PLOTTEXTMODE_STROKE && !aMultilineAllowed )
|
||||
{
|
||||
const char *fontname = aItalic ? (aBold ? "/KicadFontBI" : "/KicadFontI")
|
||||
: (aBold ? "/KicadFontB" : "/KicadFont");
|
||||
|
@ -800,10 +806,10 @@ void PDF_PLOTTER::Text( const wxPoint& aPos,
|
|||
}
|
||||
|
||||
// Plot the stroked text (if requested)
|
||||
if( m_textMode != PLOTTEXTMODE_NATIVE )
|
||||
if( m_textMode != PLOTTEXTMODE_NATIVE || aMultilineAllowed )
|
||||
{
|
||||
PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify,
|
||||
aWidth, aItalic, aBold );
|
||||
aWidth, aItalic, aBold, aMultilineAllowed );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -211,34 +211,34 @@ void PSLIKE_PLOTTER::fputsPostscriptString(FILE *fout, const wxString& txt)
|
|||
putc( '(', fout );
|
||||
for( unsigned i = 0; i < txt.length(); i++ )
|
||||
{
|
||||
// Lazyness made me use stdio buffering yet another time...
|
||||
wchar_t ch = txt[i];
|
||||
if( ch < 256 )
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
// The ~ shouldn't reach the outside
|
||||
case '~':
|
||||
break;
|
||||
// These characters must be escaped
|
||||
case '(':
|
||||
case ')':
|
||||
case '\\':
|
||||
putc( '\\', fout );
|
||||
// Lazyness made me use stdio buffering yet another time...
|
||||
wchar_t ch = txt[i];
|
||||
if( ch < 256 )
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
// The ~ shouldn't reach the outside
|
||||
case '~':
|
||||
break;
|
||||
// These characters must be escaped
|
||||
case '(':
|
||||
case ')':
|
||||
case '\\':
|
||||
putc( '\\', fout );
|
||||
|
||||
// FALLTHRU
|
||||
default:
|
||||
putc( ch, fout );
|
||||
break;
|
||||
}
|
||||
}
|
||||
// FALLTHRU
|
||||
default:
|
||||
putc( ch, fout );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
putc( ')', fout );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sister function for the ReturnGraphicTextWidth in drawtxt.cpp
|
||||
* Sister function for the GraphicTextWidth in drawtxt.cpp
|
||||
* Does the same processing (i.e. calculates a text string width) but
|
||||
* using postscript metrics for the Helvetica font (optionally used for
|
||||
* PS and PDF plotting
|
||||
|
@ -303,7 +303,7 @@ void PSLIKE_PLOTTER::postscriptOverlinePositions( const wxString& aText, int aXS
|
|||
}
|
||||
|
||||
void PS_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
||||
double aScale, bool aMirror )
|
||||
double aScale, bool aMirror )
|
||||
{
|
||||
wxASSERT( !outputFile );
|
||||
m_plotMirror = aMirror;
|
||||
|
@ -354,31 +354,31 @@ void PSLIKE_PLOTTER::computeTextParameters( const wxPoint& aPos,
|
|||
switch( aH_justify )
|
||||
{
|
||||
case GR_TEXT_HJUSTIFY_CENTER:
|
||||
dx = -tw / 2;
|
||||
break;
|
||||
dx = -tw / 2;
|
||||
break;
|
||||
|
||||
case GR_TEXT_HJUSTIFY_RIGHT:
|
||||
dx = -tw;
|
||||
break;
|
||||
dx = -tw;
|
||||
break;
|
||||
|
||||
case GR_TEXT_HJUSTIFY_LEFT:
|
||||
dx = 0;
|
||||
break;
|
||||
dx = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
switch( aV_justify )
|
||||
{
|
||||
case GR_TEXT_VJUSTIFY_CENTER:
|
||||
dy = th / 2;
|
||||
break;
|
||||
dy = th / 2;
|
||||
break;
|
||||
|
||||
case GR_TEXT_VJUSTIFY_TOP:
|
||||
dy = th;
|
||||
break;
|
||||
break;
|
||||
|
||||
case GR_TEXT_VJUSTIFY_BOTTOM:
|
||||
dy = 0;
|
||||
break;
|
||||
dy = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
RotatePoint( &dx, &dy, aOrient );
|
||||
|
@ -620,7 +620,7 @@ void PS_PLOTTER::PenTo( const wxPoint& pos, char plume )
|
|||
}
|
||||
if( penState != plume || pos != penLastpos )
|
||||
{
|
||||
DPOINT pos_dev = userToDeviceCoordinates( pos );
|
||||
DPOINT pos_dev = userToDeviceCoordinates( pos );
|
||||
fprintf( outputFile, "%g %g %sto\n",
|
||||
pos_dev.x, pos_dev.y,
|
||||
( plume=='D' ) ? "line" : "move" );
|
||||
|
@ -650,39 +650,39 @@ bool PS_PLOTTER::StartPlot()
|
|||
|
||||
static const char* PSMacro[] =
|
||||
{
|
||||
"%%BeginProlog\n"
|
||||
"/line { newpath moveto lineto stroke } bind def\n",
|
||||
"/cir0 { newpath 0 360 arc stroke } bind def\n",
|
||||
"/cir1 { newpath 0 360 arc gsave fill grestore stroke } bind def\n",
|
||||
"/cir2 { newpath 0 360 arc gsave fill grestore stroke } bind def\n",
|
||||
"/arc0 { newpath arc stroke } bind def\n",
|
||||
"/arc1 { newpath 4 index 4 index moveto arc closepath gsave fill\n",
|
||||
" grestore stroke } bind def\n",
|
||||
"/arc2 { newpath 4 index 4 index moveto arc closepath gsave fill\n",
|
||||
" grestore stroke } bind def\n",
|
||||
"/poly0 { stroke } bind def\n",
|
||||
"/poly1 { closepath gsave fill grestore stroke } bind def\n",
|
||||
"/poly2 { closepath gsave fill grestore stroke } bind def\n",
|
||||
"/rect0 { rectstroke } bind def\n",
|
||||
"/rect1 { rectfill } bind def\n",
|
||||
"/rect2 { rectfill } bind def\n",
|
||||
"/linemode0 { 0 setlinecap 0 setlinejoin 0 setlinewidth } bind def\n",
|
||||
"/linemode1 { 1 setlinecap 1 setlinejoin } bind def\n",
|
||||
"/dashedline { [200] 100 setdash } bind def\n",
|
||||
"/solidline { [] 0 setdash } bind def\n",
|
||||
"%%BeginProlog\n"
|
||||
"/line { newpath moveto lineto stroke } bind def\n",
|
||||
"/cir0 { newpath 0 360 arc stroke } bind def\n",
|
||||
"/cir1 { newpath 0 360 arc gsave fill grestore stroke } bind def\n",
|
||||
"/cir2 { newpath 0 360 arc gsave fill grestore stroke } bind def\n",
|
||||
"/arc0 { newpath arc stroke } bind def\n",
|
||||
"/arc1 { newpath 4 index 4 index moveto arc closepath gsave fill\n",
|
||||
" grestore stroke } bind def\n",
|
||||
"/arc2 { newpath 4 index 4 index moveto arc closepath gsave fill\n",
|
||||
" grestore stroke } bind def\n",
|
||||
"/poly0 { stroke } bind def\n",
|
||||
"/poly1 { closepath gsave fill grestore stroke } bind def\n",
|
||||
"/poly2 { closepath gsave fill grestore stroke } bind def\n",
|
||||
"/rect0 { rectstroke } bind def\n",
|
||||
"/rect1 { rectfill } bind def\n",
|
||||
"/rect2 { rectfill } bind def\n",
|
||||
"/linemode0 { 0 setlinecap 0 setlinejoin 0 setlinewidth } bind def\n",
|
||||
"/linemode1 { 1 setlinecap 1 setlinejoin } bind def\n",
|
||||
"/dashedline { [200] 100 setdash } bind def\n",
|
||||
"/solidline { [] 0 setdash } bind def\n",
|
||||
|
||||
// This is for 'hidden' text (search anchors for PDF)
|
||||
// This is for 'hidden' text (search anchors for PDF)
|
||||
"/phantomshow { moveto\n",
|
||||
" /KicadFont findfont 0.000001 scalefont setfont\n",
|
||||
" show } bind def\n",
|
||||
" show } bind def\n",
|
||||
|
||||
// This is for regular postscript text
|
||||
"/textshow { gsave\n",
|
||||
" findfont exch scalefont setfont concat 1 scale 0 0 moveto show\n",
|
||||
" } bind def\n",
|
||||
|
||||
// Utility for getting Latin1 encoded fonts
|
||||
"/reencodefont {\n",
|
||||
// Utility for getting Latin1 encoded fonts
|
||||
"/reencodefont {\n",
|
||||
" findfont dup length dict begin\n",
|
||||
" { 1 index /FID ne\n",
|
||||
" { def }\n",
|
||||
|
@ -692,13 +692,13 @@ bool PS_PLOTTER::StartPlot()
|
|||
" currentdict\n",
|
||||
" end } bind def\n"
|
||||
|
||||
// Remap AdobeStandard fonts to Latin1
|
||||
"/KicadFont /Helvetica reencodefont definefont pop\n",
|
||||
"/KicadFont-Bold /Helvetica-Bold reencodefont definefont pop\n",
|
||||
"/KicadFont-Oblique /Helvetica-Oblique reencodefont definefont pop\n",
|
||||
"/KicadFont-BoldOblique /Helvetica-BoldOblique reencodefont definefont pop\n",
|
||||
"%%EndProlog\n",
|
||||
NULL
|
||||
// Remap AdobeStandard fonts to Latin1
|
||||
"/KicadFont /Helvetica reencodefont definefont pop\n",
|
||||
"/KicadFont-Bold /Helvetica-Bold reencodefont definefont pop\n",
|
||||
"/KicadFont-Oblique /Helvetica-Oblique reencodefont definefont pop\n",
|
||||
"/KicadFont-BoldOblique /Helvetica-BoldOblique reencodefont definefont pop\n",
|
||||
"%%EndProlog\n",
|
||||
NULL
|
||||
};
|
||||
|
||||
time_t time1970 = time( NULL );
|
||||
|
@ -726,8 +726,8 @@ bool PS_PLOTTER::StartPlot()
|
|||
psPaperSize.Set( pageInfo.GetHeightMils(), pageInfo.GetWidthMils() );
|
||||
|
||||
fprintf( outputFile, "%%%%BoundingBox: 0 0 %d %d\n",
|
||||
(int) ceil( psPaperSize.x * BIGPTsPERMIL ),
|
||||
(int) ceil( psPaperSize.y * BIGPTsPERMIL ) );
|
||||
(int) ceil( psPaperSize.x * BIGPTsPERMIL ),
|
||||
(int) ceil( psPaperSize.y * BIGPTsPERMIL ) );
|
||||
|
||||
// Specify the size of the sheet and the name associated with that size.
|
||||
// (If the "User size" option has been selected for the sheet size,
|
||||
|
@ -775,9 +775,9 @@ bool PS_PLOTTER::StartPlot()
|
|||
// within the Document Structuring Convention.
|
||||
fputs( "%%Page: 1 1\n"
|
||||
"%%BeginPageSetup\n"
|
||||
"gsave\n"
|
||||
"0.0072 0.0072 scale\n" // Configure postscript for decimils coordinates
|
||||
"linemode1\n", outputFile );
|
||||
"gsave\n"
|
||||
"0.0072 0.0072 scale\n" // Configure postscript for decimils coordinates
|
||||
"linemode1\n", outputFile );
|
||||
|
||||
|
||||
// Rototranslate the coordinate to achieve the landscape layout
|
||||
|
@ -803,7 +803,7 @@ bool PS_PLOTTER::EndPlot()
|
|||
wxASSERT( outputFile );
|
||||
fputs( "showpage\n"
|
||||
"grestore\n"
|
||||
"%%EOF\n", outputFile );
|
||||
"%%EOF\n", outputFile );
|
||||
fclose( outputFile );
|
||||
outputFile = NULL;
|
||||
|
||||
|
@ -812,27 +812,32 @@ bool PS_PLOTTER::EndPlot()
|
|||
|
||||
|
||||
|
||||
void PS_PLOTTER::Text( const wxPoint& aPos,
|
||||
enum EDA_COLOR_T aColor,
|
||||
const wxString& aText,
|
||||
double aOrient,
|
||||
const wxSize& aSize,
|
||||
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
||||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||
int aWidth,
|
||||
bool aItalic,
|
||||
bool aBold )
|
||||
void PS_PLOTTER::Text( const wxPoint& aPos,
|
||||
enum EDA_COLOR_T aColor,
|
||||
const wxString& aText,
|
||||
double aOrient,
|
||||
const wxSize& aSize,
|
||||
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
||||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||
int aWidth,
|
||||
bool aItalic,
|
||||
bool aBold,
|
||||
bool aMultilineAllowed )
|
||||
{
|
||||
SetCurrentLineWidth( aWidth );
|
||||
SetColor( aColor );
|
||||
|
||||
// Fix me: see how to use PS text mode for multiline texts
|
||||
if( aMultilineAllowed && !aText.Contains( wxT( "\n" ) ) )
|
||||
aMultilineAllowed = false; // the text has only one line.
|
||||
|
||||
// Draw the native postscript text (if requested)
|
||||
if( m_textMode == PLOTTEXTMODE_NATIVE )
|
||||
if( m_textMode == PLOTTEXTMODE_NATIVE && !aMultilineAllowed )
|
||||
{
|
||||
const char *fontname = aItalic ? (aBold ? "/KicadFont-BoldOblique"
|
||||
: "/KicadFont-Oblique")
|
||||
: (aBold ? "/KicadFont-Bold"
|
||||
: "/KicadFont");
|
||||
: (aBold ? "/KicadFont-Bold"
|
||||
: "/KicadFont");
|
||||
|
||||
// Compute the copious tranformation parameters
|
||||
double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f;
|
||||
|
@ -874,16 +879,16 @@ void PS_PLOTTER::Text( const wxPoint& aPos,
|
|||
if( m_textMode == PLOTTEXTMODE_PHANTOM )
|
||||
{
|
||||
fputsPostscriptString( outputFile, aText );
|
||||
DPOINT pos_dev = userToDeviceCoordinates( aPos );
|
||||
DPOINT pos_dev = userToDeviceCoordinates( aPos );
|
||||
fprintf( outputFile, " %g %g phantomshow\n",
|
||||
pos_dev.x, pos_dev.y );
|
||||
}
|
||||
|
||||
// Draw the stroked text (if requested)
|
||||
if( m_textMode != PLOTTEXTMODE_NATIVE )
|
||||
if( m_textMode != PLOTTEXTMODE_NATIVE || aMultilineAllowed )
|
||||
{
|
||||
PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify,
|
||||
aWidth, aItalic, aBold );
|
||||
aWidth, aItalic, aBold, aMultilineAllowed );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -346,7 +346,7 @@ void SVG_PLOTTER::Arc( const wxPoint& centre, double StAngle, double EndAngle, i
|
|||
DPOINT centre_dev = userToDeviceCoordinates( centre );
|
||||
double radius_dev = userToDeviceSize( radius );
|
||||
|
||||
if( m_yaxisReversed ) // Should be always the case
|
||||
if( !m_yaxisReversed ) // Should be never the case
|
||||
{
|
||||
double tmp = StAngle;
|
||||
StAngle = -EndAngle;
|
||||
|
@ -420,14 +420,14 @@ void SVG_PLOTTER::PlotPoly( const std::vector<wxPoint>& aCornerList,
|
|||
|
||||
switch( aFill )
|
||||
{
|
||||
case NO_FILL:
|
||||
fprintf( outputFile, "<polyline fill=\"none;\"\n" );
|
||||
break;
|
||||
case NO_FILL:
|
||||
fprintf( outputFile, "<polyline fill=\"none;\"\n" );
|
||||
break;
|
||||
|
||||
case FILLED_WITH_BG_BODYCOLOR:
|
||||
case FILLED_SHAPE:
|
||||
fprintf( outputFile, "<polyline style=\"fill-rule:evenodd;\"\n" );
|
||||
break;
|
||||
case FILLED_WITH_BG_BODYCOLOR:
|
||||
case FILLED_SHAPE:
|
||||
fprintf( outputFile, "<polyline style=\"fill-rule:evenodd;\"\n" );
|
||||
break;
|
||||
}
|
||||
|
||||
DPOINT pos = userToDeviceCoordinates( aCornerList[0] );
|
||||
|
@ -478,6 +478,15 @@ void SVG_PLOTTER::PenTo( const wxPoint& pos, char plume )
|
|||
if( penState == 'Z' ) // here plume = 'D' or 'U'
|
||||
{
|
||||
DPOINT pos_dev = userToDeviceCoordinates( pos );
|
||||
|
||||
// Ensure we do not use a fill mode when moving tne pen,
|
||||
// in SVG mode (i;e. we are plotting only basic lines, not a filled area
|
||||
if( m_fillMode != NO_FILL )
|
||||
{
|
||||
setFillMode( NO_FILL );
|
||||
setSVGPlotStyle();
|
||||
}
|
||||
|
||||
fprintf( outputFile, "<path d=\"M%d %d\n",
|
||||
(int) pos_dev.x, (int) pos_dev.y );
|
||||
}
|
||||
|
@ -572,7 +581,8 @@ void SVG_PLOTTER::Text( const wxPoint& aPos,
|
|||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||
int aWidth,
|
||||
bool aItalic,
|
||||
bool aBold )
|
||||
bool aBold,
|
||||
bool aMultilineAllowed )
|
||||
{
|
||||
setFillMode( NO_FILL );
|
||||
SetColor( aColor );
|
||||
|
@ -581,5 +591,5 @@ void SVG_PLOTTER::Text( const wxPoint& aPos,
|
|||
// TODO: see if the postscript native text code can be used in SVG plotter
|
||||
|
||||
PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify,
|
||||
aWidth, aItalic, aBold );
|
||||
aWidth, aItalic, aBold, aMultilineAllowed );
|
||||
}
|
||||
|
|
|
@ -1,15 +1,36 @@
|
|||
/*********************/
|
||||
/* projet_config.cpp */
|
||||
/*********************/
|
||||
/*
|
||||
* 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) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 1992-2011 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
|
||||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <gr_basic.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <pgm_base.h>
|
||||
#include <common.h>
|
||||
#include <kicad_string.h>
|
||||
#include <gestfich.h>
|
||||
#include <wxstruct.h>
|
||||
#include <param_config.h>
|
||||
#include <config_params.h>
|
||||
|
||||
#include <wx/apptrait.h>
|
||||
#include <wx/stdpaths.h>
|
||||
|
@ -19,8 +40,89 @@
|
|||
#include <boost/foreach.hpp>
|
||||
|
||||
|
||||
#define CONFIG_VERSION 1
|
||||
#define FORCE_LOCAL_CONFIG true
|
||||
void wxConfigSaveParams( 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;
|
||||
|
||||
if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
|
||||
{
|
||||
if( !!param.m_Ident )
|
||||
aCfg->DeleteGroup( param.m_Ident );
|
||||
}
|
||||
else
|
||||
{
|
||||
param.SaveParam( 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 );
|
||||
|
||||
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
|
||||
{
|
||||
if( !param.m_Setup )
|
||||
continue;
|
||||
|
||||
if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
|
||||
{
|
||||
if( !!param.m_Ident )
|
||||
aCfg->DeleteGroup( param.m_Ident );
|
||||
}
|
||||
else
|
||||
{
|
||||
param.SaveParam( 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 ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double aValue )
|
||||
|
@ -35,221 +137,7 @@ void ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double
|
|||
}
|
||||
|
||||
|
||||
bool EDA_APP::ReCreatePrjConfig( const wxString& fileName,
|
||||
const wxString& GroupName,
|
||||
bool ForceUseLocalConfig )
|
||||
{
|
||||
wxFileName fn = fileName;
|
||||
|
||||
// Free old config file.
|
||||
if( m_projectSettings )
|
||||
{
|
||||
delete m_projectSettings;
|
||||
m_projectSettings = NULL;
|
||||
}
|
||||
|
||||
/* Force the file extension.
|
||||
* This allows the user to enter a filename without extension
|
||||
* or use an existing name to create the project file
|
||||
*/
|
||||
if( fn.GetExt() != ProjectFileExtension )
|
||||
{
|
||||
fn.SetExt( ProjectFileExtension );
|
||||
}
|
||||
|
||||
/* Update the library search path list if a new project file is loaded. */
|
||||
if( m_projectFileName != fn )
|
||||
{
|
||||
RemoveLibraryPath( m_projectFileName.GetPath() );
|
||||
InsertLibraryPath( fn.GetPath(), 0 );
|
||||
m_projectFileName = fn;
|
||||
}
|
||||
|
||||
// Init local config filename
|
||||
if( ForceUseLocalConfig || fn.FileExists() )
|
||||
{
|
||||
m_CurrentOptionFile = fn.GetFullPath();
|
||||
m_projectSettings = new wxFileConfig( wxEmptyString, wxEmptyString,
|
||||
m_CurrentOptionFile, wxEmptyString );
|
||||
m_projectSettings->DontCreateOnDemand();
|
||||
|
||||
if( ForceUseLocalConfig )
|
||||
return true;
|
||||
|
||||
/* 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).
|
||||
*/
|
||||
int version = -1;
|
||||
int def_version = 0;
|
||||
|
||||
m_projectSettings->SetPath( GroupName );
|
||||
version = m_projectSettings->Read( wxT( "version" ), def_version );
|
||||
m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR );
|
||||
|
||||
if( version > 0 )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
delete m_projectSettings; // Version incorrect
|
||||
}
|
||||
}
|
||||
|
||||
wxString defaultFileName;
|
||||
defaultFileName = m_libSearchPaths.FindValidPath( wxT( "kicad.pro" ) );
|
||||
|
||||
if( defaultFileName.IsEmpty() )
|
||||
{
|
||||
wxLogDebug( wxT( "Template file <kicad.pro> not found." ) );
|
||||
fn = wxFileName( GetTraits()->GetStandardPaths().GetDocumentsDir(),
|
||||
wxT( "kicad" ), ProjectFileExtension );
|
||||
}
|
||||
else
|
||||
{
|
||||
fn = defaultFileName;
|
||||
}
|
||||
|
||||
// Create new project file using the default name.
|
||||
m_CurrentOptionFile = fn.GetFullPath();
|
||||
m_projectSettings = new wxFileConfig( wxEmptyString, wxEmptyString,
|
||||
wxEmptyString, fn.GetFullPath() );
|
||||
m_projectSettings->DontCreateOnDemand();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void EDA_APP::WriteProjectConfig( const wxString& fileName,
|
||||
const wxString& GroupName,
|
||||
const PARAM_CFG_ARRAY& params )
|
||||
{
|
||||
ReCreatePrjConfig( fileName, GroupName, FORCE_LOCAL_CONFIG );
|
||||
|
||||
/* Write date ( surtout pour eviter bug de wxFileConfig
|
||||
* qui se trompe de rubrique si declaration [xx] en premiere ligne
|
||||
* (en fait si groupe vide) */
|
||||
m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR );
|
||||
|
||||
m_projectSettings->Write( wxT( "update" ), DateAndTime() );
|
||||
m_projectSettings->Write( wxT( "last_client" ), GetAppName() );
|
||||
|
||||
/* Save parameters */
|
||||
m_projectSettings->DeleteGroup( GroupName ); // Erase all data
|
||||
m_projectSettings->Flush();
|
||||
|
||||
m_projectSettings->SetPath( GroupName );
|
||||
m_projectSettings->Write( wxT( "version" ), CONFIG_VERSION );
|
||||
m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR );
|
||||
|
||||
BOOST_FOREACH( const PARAM_CFG_BASE& param, params )
|
||||
{
|
||||
if( param.m_Group )
|
||||
m_projectSettings->SetPath( param.m_Group );
|
||||
else
|
||||
m_projectSettings->SetPath( GroupName );
|
||||
|
||||
if( param.m_Setup )
|
||||
continue;
|
||||
|
||||
if ( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
|
||||
{
|
||||
if( param.m_Ident )
|
||||
m_projectSettings->DeleteGroup( param.m_Ident );
|
||||
}
|
||||
else
|
||||
{
|
||||
param.SaveParam( m_projectSettings );
|
||||
}
|
||||
}
|
||||
|
||||
m_projectSettings->SetPath( UNIX_STRING_DIR_SEP );
|
||||
|
||||
delete m_projectSettings;
|
||||
m_projectSettings = NULL;
|
||||
}
|
||||
|
||||
void EDA_APP::SaveCurrentSetupValues( const PARAM_CFG_ARRAY& List )
|
||||
{
|
||||
if( m_settings == NULL )
|
||||
return;
|
||||
|
||||
unsigned count = List.size();
|
||||
for( unsigned i=0; i<count; ++i )
|
||||
{
|
||||
const PARAM_CFG_BASE& param = List[i];
|
||||
|
||||
if( param.m_Setup == false )
|
||||
continue;
|
||||
|
||||
if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
|
||||
{
|
||||
if( param.m_Ident )
|
||||
m_settings->DeleteGroup( param.m_Ident );
|
||||
}
|
||||
else
|
||||
{
|
||||
param.SaveParam( m_settings );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool EDA_APP::ReadProjectConfig( const wxString& local_config_filename,
|
||||
const wxString& GroupName,
|
||||
const PARAM_CFG_ARRAY& params,
|
||||
bool Load_Only_if_New )
|
||||
{
|
||||
ReCreatePrjConfig( local_config_filename, GroupName, false );
|
||||
|
||||
m_projectSettings->SetPath( wxCONFIG_PATH_SEPARATOR );
|
||||
wxString timestamp = m_projectSettings->Read( wxT( "update" ) );
|
||||
|
||||
if( Load_Only_if_New && ( !timestamp.IsEmpty() )
|
||||
&& (timestamp == m_CurrentOptionFileDateAndTime) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_CurrentOptionFileDateAndTime = timestamp;
|
||||
|
||||
BOOST_FOREACH( const PARAM_CFG_BASE& param, params )
|
||||
{
|
||||
if( param.m_Group )
|
||||
m_projectSettings->SetPath( param.m_Group );
|
||||
else
|
||||
m_projectSettings->SetPath( GroupName );
|
||||
|
||||
if( param.m_Setup )
|
||||
continue;
|
||||
|
||||
param.ReadParam( m_projectSettings );
|
||||
}
|
||||
|
||||
delete m_projectSettings;
|
||||
m_projectSettings = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void EDA_APP::ReadCurrentSetupValues( const PARAM_CFG_ARRAY& List )
|
||||
{
|
||||
BOOST_FOREACH( const PARAM_CFG_BASE& param, List )
|
||||
{
|
||||
if( param.m_Setup == false )
|
||||
continue;
|
||||
|
||||
param.ReadParam( m_settings );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PARAM_CFG_BASE::PARAM_CFG_BASE( const wxChar* ident, const paramcfg_id type,
|
||||
PARAM_CFG_BASE::PARAM_CFG_BASE( const wxString& ident, const paramcfg_id type,
|
||||
const wxChar* group )
|
||||
{
|
||||
m_Ident = ident;
|
||||
|
@ -259,7 +147,7 @@ PARAM_CFG_BASE::PARAM_CFG_BASE( const wxChar* ident, const paramcfg_id type,
|
|||
}
|
||||
|
||||
|
||||
PARAM_CFG_INT::PARAM_CFG_INT( const wxChar* ident, int* ptparam,
|
||||
PARAM_CFG_INT::PARAM_CFG_INT( const wxString& ident, int* ptparam,
|
||||
int default_val, int min, int max,
|
||||
const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_INT, group )
|
||||
|
@ -271,7 +159,7 @@ PARAM_CFG_INT::PARAM_CFG_INT( const wxChar* ident, int* ptparam,
|
|||
}
|
||||
|
||||
|
||||
PARAM_CFG_INT::PARAM_CFG_INT( bool Insetup, const wxChar* ident, int* ptparam,
|
||||
PARAM_CFG_INT::PARAM_CFG_INT( bool Insetup, const wxString& ident, int* ptparam,
|
||||
int default_val, int min, int max,
|
||||
const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_INT, group )
|
||||
|
@ -286,7 +174,7 @@ PARAM_CFG_INT::PARAM_CFG_INT( bool Insetup, const wxChar* ident, int* ptparam,
|
|||
|
||||
void PARAM_CFG_INT::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
int itmp = aConfig->Read( m_Ident, m_Default );
|
||||
|
@ -300,14 +188,14 @@ void PARAM_CFG_INT::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_INT::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
aConfig->Write( m_Ident, *m_Pt_param );
|
||||
}
|
||||
|
||||
|
||||
PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxChar* ident, int* ptparam,
|
||||
PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxString& ident, int* ptparam,
|
||||
int default_val, int min, int max,
|
||||
const wxChar* group, double aBiu2cfgunit ) :
|
||||
PARAM_CFG_INT( ident, ptparam, default_val, min, max, group )
|
||||
|
@ -318,7 +206,7 @@ PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxChar* ident, int* pt
|
|||
|
||||
|
||||
PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( bool Insetup,
|
||||
const wxChar* ident, int* ptparam,
|
||||
const wxString& ident, int* ptparam,
|
||||
int default_val, int min, int max,
|
||||
const wxChar* group, double aBiu2cfgunit ) :
|
||||
PARAM_CFG_INT( Insetup, ident, ptparam, default_val, min, max, group )
|
||||
|
@ -330,7 +218,7 @@ PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( bool Insetup,
|
|||
|
||||
void PARAM_CFG_INT_WITH_SCALE::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
double dtmp = (double) m_Default * m_BIU_to_cfgunit;
|
||||
|
@ -347,7 +235,7 @@ void PARAM_CFG_INT_WITH_SCALE::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_INT_WITH_SCALE::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
// We cannot use aConfig->Write for a double, because
|
||||
|
@ -358,7 +246,7 @@ void PARAM_CFG_INT_WITH_SCALE::SaveParam( wxConfigBase* aConfig ) const
|
|||
}
|
||||
|
||||
|
||||
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxChar* ident, EDA_COLOR_T* ptparam,
|
||||
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxString& ident, EDA_COLOR_T* ptparam,
|
||||
EDA_COLOR_T default_val,
|
||||
const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_SETCOLOR, group )
|
||||
|
@ -369,7 +257,7 @@ PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxChar* ident, EDA_COLOR_T* ptpara
|
|||
|
||||
|
||||
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( bool Insetup,
|
||||
const wxChar* ident,
|
||||
const wxString& ident,
|
||||
EDA_COLOR_T* ptparam,
|
||||
EDA_COLOR_T default_val,
|
||||
const wxChar* group ) :
|
||||
|
@ -383,8 +271,9 @@ PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( bool Insetup,
|
|||
|
||||
void PARAM_CFG_SETCOLOR::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
EDA_COLOR_T itmp = ColorByName( aConfig->Read( m_Ident, wxT("NONE") ) );
|
||||
|
||||
if( itmp == UNSPECIFIED_COLOR )
|
||||
|
@ -395,14 +284,14 @@ void PARAM_CFG_SETCOLOR::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_SETCOLOR::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
aConfig->Write( m_Ident, ColorGetName( *m_Pt_param ) );
|
||||
}
|
||||
|
||||
|
||||
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxChar* ident, double* ptparam,
|
||||
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxString& ident, double* ptparam,
|
||||
double default_val, double min, double max,
|
||||
const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_DOUBLE, group )
|
||||
|
@ -415,7 +304,7 @@ PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxChar* ident, double* ptparam,
|
|||
|
||||
|
||||
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( bool Insetup,
|
||||
const wxChar* ident,
|
||||
const wxString& ident,
|
||||
double* ptparam,
|
||||
double default_val,
|
||||
double min,
|
||||
|
@ -433,7 +322,7 @@ PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( bool Insetup,
|
|||
|
||||
void PARAM_CFG_DOUBLE::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
double dtmp = m_Default;
|
||||
|
@ -448,7 +337,7 @@ void PARAM_CFG_DOUBLE::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_DOUBLE::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
// We cannot use aConfig->Write for a double, because
|
||||
|
@ -459,7 +348,7 @@ void PARAM_CFG_DOUBLE::SaveParam( wxConfigBase* aConfig ) const
|
|||
}
|
||||
|
||||
|
||||
PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxChar* ident, bool* ptparam,
|
||||
PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxString& ident, bool* ptparam,
|
||||
int default_val, const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_BOOL, group )
|
||||
{
|
||||
|
@ -469,7 +358,7 @@ PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxChar* ident, bool* ptparam,
|
|||
|
||||
|
||||
PARAM_CFG_BOOL::PARAM_CFG_BOOL( bool Insetup,
|
||||
const wxChar* ident,
|
||||
const wxString& ident,
|
||||
bool* ptparam,
|
||||
int default_val,
|
||||
const wxChar* group ) :
|
||||
|
@ -483,7 +372,7 @@ PARAM_CFG_BOOL::PARAM_CFG_BOOL( bool Insetup,
|
|||
|
||||
void PARAM_CFG_BOOL::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
int itmp = aConfig->Read( m_Ident, (int) m_Default );
|
||||
|
@ -494,14 +383,14 @@ void PARAM_CFG_BOOL::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_BOOL::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
aConfig->Write( m_Ident, *m_Pt_param );
|
||||
}
|
||||
|
||||
|
||||
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxChar* ident,
|
||||
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxString& ident,
|
||||
wxString* ptparam,
|
||||
const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_WXSTRING, group )
|
||||
|
@ -510,7 +399,7 @@ PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxChar* ident,
|
|||
}
|
||||
|
||||
|
||||
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxChar* ident,
|
||||
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxString& ident,
|
||||
wxString* ptparam,
|
||||
const wxString& default_val,
|
||||
const wxChar* group ) :
|
||||
|
@ -518,29 +407,29 @@ PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxChar* ident,
|
|||
{
|
||||
m_Pt_param = ptparam;
|
||||
m_Setup = Insetup;
|
||||
m_default = default_val;
|
||||
m_default = default_val;
|
||||
}
|
||||
|
||||
|
||||
void PARAM_CFG_WXSTRING::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
*m_Pt_param = aConfig->Read( m_Ident, m_default );
|
||||
}
|
||||
|
||||
|
||||
void PARAM_CFG_WXSTRING::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
aConfig->Write( m_Ident, *m_Pt_param );
|
||||
}
|
||||
|
||||
|
||||
|
||||
PARAM_CFG_FILENAME::PARAM_CFG_FILENAME( const wxChar* ident,
|
||||
PARAM_CFG_FILENAME::PARAM_CFG_FILENAME( const wxString& ident,
|
||||
wxString* ptparam,
|
||||
const wxChar* group ) :
|
||||
PARAM_CFG_BASE( ident, PARAM_FILENAME, group )
|
||||
|
@ -551,7 +440,7 @@ PARAM_CFG_FILENAME::PARAM_CFG_FILENAME( const wxChar* ident,
|
|||
|
||||
void PARAM_CFG_FILENAME::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
wxString prm = aConfig->Read( m_Ident );
|
||||
|
@ -567,7 +456,7 @@ void PARAM_CFG_FILENAME::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_FILENAME::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
wxString prm = *m_Pt_param;
|
||||
|
@ -588,7 +477,7 @@ PARAM_CFG_LIBNAME_LIST::PARAM_CFG_LIBNAME_LIST( const wxChar* ident,
|
|||
|
||||
void PARAM_CFG_LIBNAME_LIST::ReadParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
int indexlib = 1; // We start indexlib to 1 because first
|
||||
|
@ -617,15 +506,15 @@ void PARAM_CFG_LIBNAME_LIST::ReadParam( wxConfigBase* aConfig ) const
|
|||
|
||||
void PARAM_CFG_LIBNAME_LIST::SaveParam( wxConfigBase* aConfig ) const
|
||||
{
|
||||
if( m_Pt_param == NULL || aConfig == NULL )
|
||||
if( !m_Pt_param || !aConfig )
|
||||
return;
|
||||
|
||||
wxArrayString* libname_list = m_Pt_param;
|
||||
|
||||
unsigned indexlib = 0;
|
||||
wxString configkey;
|
||||
wxString libname;
|
||||
|
||||
for( ; indexlib < libname_list->GetCount(); indexlib++ )
|
||||
for( unsigned indexlib = 0; indexlib < libname_list->GetCount(); indexlib++ )
|
||||
{
|
||||
configkey = m_Ident;
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
#include <class_drawpanel.h>
|
||||
#include <class_base_screen.h>
|
||||
#include <confirm.h>
|
||||
#include <wxstruct.h>
|
||||
#include <draw_frame.h>
|
||||
|
||||
static bool DrawPageOnClipboard( EDA_DRAW_FRAME* aFrame );
|
||||
|
||||
|
@ -109,7 +109,8 @@ bool DrawPageOnClipboard( EDA_DRAW_FRAME* aFrame )
|
|||
dc.SetClippingRegion( DrawArea );
|
||||
}
|
||||
|
||||
aFrame->PrintPage( &dc, FULL_LAYERS, false );
|
||||
const LSET allLayersMask = LSET().set();
|
||||
aFrame->PrintPage( &dc, allLayersMask, false );
|
||||
screen->m_IsPrinting = false;
|
||||
aFrame->GetCanvas()->SetClipBox( tmp );
|
||||
wxMetafile* mf = dc.Close();
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#include <bitmaps.h>
|
||||
#include <wxstruct.h>
|
||||
#include <common.h>
|
||||
#include <appl_wxstruct.h>
|
||||
#include <pgm_base.h>
|
||||
#include <build_version.h>
|
||||
|
||||
|
||||
|
@ -41,7 +41,7 @@ static wxString HtmlNewline( const unsigned int amount = 1 );
|
|||
static void InitKiCadAboutNew( AboutAppInfo& info )
|
||||
{
|
||||
// Set application specific icon
|
||||
const wxTopLevelWindow * const tlw = wxDynamicCast(::wxGetApp().GetTopWindow(), wxTopLevelWindow);
|
||||
const wxTopLevelWindow* const tlw = wxDynamicCast( Pgm().App().GetTopWindow(), wxTopLevelWindow);
|
||||
|
||||
if( tlw )
|
||||
info.SetIcon( tlw->GetIcon() );
|
||||
|
@ -56,10 +56,10 @@ static void InitKiCadAboutNew( AboutAppInfo& info )
|
|||
}
|
||||
|
||||
/* Set title */
|
||||
info.SetAppName( wxT( ".: " ) + wxGetApp().GetTitle() + wxT( " :." ) );
|
||||
info.SetAppName( wxT( ".: " ) + Pgm().App().GetAppName() + wxT( " :." ) );
|
||||
|
||||
/* Copyright information */
|
||||
info.SetCopyright( wxT( "(C) 1992-2013 KiCad Developers Team" ) );
|
||||
info.SetCopyright( wxT( "(C) 1992-2014 KiCad Developers Team" ) );
|
||||
|
||||
/* KiCad build version */
|
||||
wxString version;
|
||||
|
|
|
@ -29,16 +29,9 @@ dialog_about::dialog_about(wxWindow *parent, AboutAppInfo& appInfo)
|
|||
m_staticTextBuildVersion->SetLabel( info.GetBuildVersion() );
|
||||
m_staticTextLibVersion->SetLabel( info.GetLibVersion() );
|
||||
|
||||
/* Affects m_titlepanel the parent of some wxStaticText.
|
||||
* Changing the text afterwards makes it under Windows necessary to call 'Layout()'
|
||||
* so that the new text gets properly layout.
|
||||
*/
|
||||
/* m_staticTextCopyright->GetParent()->Layout();
|
||||
m_staticTextBuildVersion->GetParent()->Layout();
|
||||
m_staticTextLibVersion->GetParent()->Layout();
|
||||
*/
|
||||
DeleteNotebooks();
|
||||
CreateNotebooks();
|
||||
|
||||
GetSizer()->SetSizeHints(this);
|
||||
m_auiNotebook->Update();
|
||||
SetFocus();
|
||||
|
|