Merged upstream.

This commit is contained in:
Maciej Suminski 2014-03-06 09:42:16 +01:00
commit 5ed0980dd5
71 changed files with 1149 additions and 485 deletions

View File

@ -84,7 +84,7 @@ public:
GLuint DisplayCubeforTest(); // Just a test function GLuint DisplayCubeforTest(); // Just a test function
void SetView3D( int keycode ); void SetView3D( int keycode );
void DisplayStatus(); void DisplayStatus();
void Redraw( bool finish = false ); void Redraw();
void Render(); void Render();
/** /**

View File

@ -52,8 +52,15 @@ void S3D_MATERIAL::SetMaterial()
#if 0 #if 0
glColorMaterial( GL_FRONT_AND_BACK, GL_SPECULAR ); glColorMaterial( GL_FRONT_AND_BACK, GL_SPECULAR );
glColor3f( m_SpecularColor.x, m_SpecularColor.y, m_SpecularColor.z ); glColor3f( m_SpecularColor.x, m_SpecularColor.y, m_SpecularColor.z );
#endif
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
#endif
}
void S3D_MASTER::Insert( S3D_MATERIAL* aMaterial )
{
aMaterial->SetNext( m_Materials );
m_Materials = aMaterial;
} }

View File

@ -50,7 +50,6 @@
#include <3d_draw_basic_functions.h> #include <3d_draw_basic_functions.h>
// Imported function: // Imported function:
extern void Set_Object_Data( std::vector<S3D_VERTEX>& aVertices, double aBiuTo3DUnits );
extern void CheckGLError(); extern void CheckGLError();
/* returns true if aLayer should be displayed, false otherwise /* returns true if aLayer should be displayed, false otherwise
@ -99,7 +98,7 @@ static void BuildPadShapeThickOutlineAsPolygon( D_PAD* aPad,
} }
void EDA_3D_CANVAS::Redraw( bool finish ) void EDA_3D_CANVAS::Redraw()
{ {
// SwapBuffer requires the window to be shown before calling // SwapBuffer requires the window to be shown before calling
if( !IsShown() ) if( !IsShown() )
@ -139,11 +138,6 @@ void EDA_3D_CANVAS::Redraw( bool finish )
else else
CreateDrawGL_List(); CreateDrawGL_List();
glFlush();
if( finish )
glFinish();
SwapBuffers(); SwapBuffers();
} }
@ -593,8 +587,11 @@ void EDA_3D_CANVAS::BuildBoard3DView()
} }
// draw modules 3D shapes // draw modules 3D shapes
for( MODULE* module = pcb->m_Modules; module != NULL; module = module->Next() ) if( g_Parm_3D_Visu.GetFlag( FL_MODULE ) )
module->ReadAndInsert3DComponentShape( this ); {
for( MODULE* module = pcb->m_Modules; module; module = module->Next() )
module->ReadAndInsert3DComponentShape( this );
}
} }
@ -831,41 +828,32 @@ void EDA_3D_CANVAS::Draw3DViaHole( SEGVIA* aVia )
void MODULE::ReadAndInsert3DComponentShape( EDA_3D_CANVAS* glcanvas ) void MODULE::ReadAndInsert3DComponentShape( EDA_3D_CANVAS* glcanvas )
{ {
// Draw module shape: 3D shape if exists (or module outlines if not exists) // Read from disk and draws the footprint 3D shapes if exists
S3D_MASTER* struct3D = m_3D_Drawings; S3D_MASTER* shape3D = m_3D_Drawings;
double zpos = g_Parm_3D_Visu.GetModulesZcoord3DIU( IsFlipped() );
if( g_Parm_3D_Visu.GetFlag( FL_MODULE ) ) glPushMatrix();
glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BiuTo3Dunits,
-m_Pos.y * g_Parm_3D_Visu.m_BiuTo3Dunits,
zpos );
if( m_Orient )
glRotatef( (double) m_Orient / 10, 0.0, 0.0, 1.0 );
if( IsFlipped() )
{ {
double zpos; glRotatef( 180.0, 0.0, 1.0, 0.0 );
glRotatef( 180.0, 0.0, 0.0, 1.0 );
if( IsFlipped() )
zpos = g_Parm_3D_Visu.GetModulesZcoord3DIU( true );
else
zpos = g_Parm_3D_Visu.GetModulesZcoord3DIU( false );
glPushMatrix();
glTranslatef( m_Pos.x * g_Parm_3D_Visu.m_BiuTo3Dunits,
-m_Pos.y * g_Parm_3D_Visu.m_BiuTo3Dunits,
zpos );
if( m_Orient )
glRotatef( (double) m_Orient / 10, 0.0, 0.0, 1.0 );
if( IsFlipped() )
{
glRotatef( 180.0, 0.0, 1.0, 0.0 );
glRotatef( 180.0, 0.0, 0.0, 1.0 );
}
for( ; struct3D != NULL; struct3D = struct3D->Next() )
{
if( struct3D->Is3DType( S3D_MASTER::FILE3D_VRML ) )
struct3D->ReadData();
}
glPopMatrix();
} }
for( ; shape3D != NULL; shape3D = shape3D->Next() )
{
if( shape3D->Is3DType( S3D_MASTER::FILE3D_VRML ) )
shape3D->ReadData();
}
glPopMatrix();
} }

View File

@ -38,9 +38,6 @@
#include "3d_struct.h" #include "3d_struct.h"
#include "modelparsers.h" #include "modelparsers.h"
// Imported function:
extern void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster, S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster,
const wxString aExtension ) const wxString aExtension )
@ -96,9 +93,7 @@ const wxString S3D_MASTER::GetShape3DFullFilename()
int S3D_MASTER::ReadData() int S3D_MASTER::ReadData()
{ {
if( m_Shape3DName.IsEmpty() ) if( m_Shape3DName.IsEmpty() )
{
return 1; return 1;
}
wxString filename = GetShape3DFullFilename(); wxString filename = GetShape3DFullFilename();
@ -135,15 +130,3 @@ int S3D_MASTER::ReadData()
return -1; return -1;
} }
int STRUCT_3D_SHAPE::ReadData( FILE* file, int* LineNum )
{
char line[512];
while( GetLine( file, line, LineNum, 512 ) )
{
}
return -1;
}

View File

@ -117,12 +117,7 @@ public:
S3D_MASTER* Next() const { return (S3D_MASTER*) Pnext; } S3D_MASTER* Next() const { return (S3D_MASTER*) Pnext; }
S3D_MASTER* Back() const { return (S3D_MASTER*) Pback; } S3D_MASTER* Back() const { return (S3D_MASTER*) Pback; }
void Insert( S3D_MATERIAL* aMaterial ) void Insert( S3D_MATERIAL* aMaterial );
{
aMaterial->SetNext( m_Materials );
m_Materials = aMaterial;
}
void Copy( S3D_MASTER* pattern ); void Copy( S3D_MASTER* pattern );
int ReadData(); int ReadData();
@ -171,8 +166,6 @@ public:
STRUCT_3D_SHAPE* Next() const { return (STRUCT_3D_SHAPE*) Pnext; } STRUCT_3D_SHAPE* Next() const { return (STRUCT_3D_SHAPE*) Pnext; }
STRUCT_3D_SHAPE* Back() const { return (STRUCT_3D_SHAPE*) Pback; } STRUCT_3D_SHAPE* Back() const { return (STRUCT_3D_SHAPE*) Pback; }
int ReadData( FILE* file, int* LineNum );
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
#endif #endif

View File

@ -88,8 +88,8 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
if( bbbox.GetWidth() == 0 && bbbox.GetHeight() == 0 ) if( bbbox.GetWidth() == 0 && bbbox.GetHeight() == 0 )
{ {
bbbox.SetWidth( 100 * IU_PER_MM ); bbbox.SetWidth( Millimeter2iu( 100 ) );
bbbox.SetHeight( 100 * IU_PER_MM ); bbbox.SetHeight( Millimeter2iu( 100 ) );
} }
m_BoardSettings = &aBoard->GetDesignSettings(); m_BoardSettings = &aBoard->GetDesignSettings();
@ -131,6 +131,7 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
// Fill remaining unused copper layers and front layer zpos // Fill remaining unused copper layers and front layer zpos
// with m_EpoxyThickness // with m_EpoxyThickness
// Solder mask and Solder paste have the same Z position
for( ; layer <= LAST_COPPER_LAYER; layer++ ) for( ; layer <= LAST_COPPER_LAYER; layer++ )
{ {
m_LayerZcoord[layer] = m_EpoxyThickness; m_LayerZcoord[layer] = m_EpoxyThickness;
@ -144,21 +145,21 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
switch( layer_id ) switch( layer_id )
{ {
case ADHESIVE_N_BACK: case ADHESIVE_N_BACK:
zpos = zpos_copper_back - 4 * zpos_offset;
break;
case ADHESIVE_N_FRONT:
zpos = zpos_copper_front + 4 * zpos_offset;
break;
case SOLDERPASTE_N_BACK:
zpos = zpos_copper_back - 3 * zpos_offset; zpos = zpos_copper_back - 3 * zpos_offset;
break; break;
case SOLDERPASTE_N_FRONT: case ADHESIVE_N_FRONT:
zpos = zpos_copper_front + 3 * zpos_offset; zpos = zpos_copper_front + 3 * zpos_offset;
break; break;
case SOLDERPASTE_N_BACK:
zpos = zpos_copper_back - 1 * zpos_offset;
break;
case SOLDERPASTE_N_FRONT:
zpos = zpos_copper_front + 1 * zpos_offset;
break;
case SOLDERMASK_N_BACK: case SOLDERMASK_N_BACK:
zpos = zpos_copper_back - 1 * zpos_offset; zpos = zpos_copper_back - 1 * zpos_offset;
break; break;
@ -177,7 +178,7 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
default: default:
zpos = zpos_copper_front + zpos = zpos_copper_front +
(layer_id - FIRST_NON_COPPER_LAYER + 5) * zpos_offset; (layer_id - FIRST_NON_COPPER_LAYER + 4) * zpos_offset;
break; break;
} }

View File

@ -148,9 +148,10 @@ public: INFO3D_VISU();
*/ */
int GetCopperThicknessBIU() const int GetCopperThicknessBIU() const
{ {
bool use_copper_thickness = GetFlag( FL_USE_COPPER_THICKNESS ) || bool use_thickness = GetFlag( FL_USE_COPPER_THICKNESS )
GetFlag( FL_USE_REALISTIC_MODE ); // || GetFlag( FL_USE_REALISTIC_MODE )
return use_copper_thickness ? ;
return use_thickness ?
KiROUND( m_CopperThickness / m_BiuTo3Dunits ) KiROUND( m_CopperThickness / m_BiuTo3Dunits )
: 0; : 0;
} }
@ -173,9 +174,10 @@ public: INFO3D_VISU();
*/ */
int GetNonCopperLayerThicknessBIU() const int GetNonCopperLayerThicknessBIU() const
{ {
bool use_copper_thickness = GetFlag( FL_USE_COPPER_THICKNESS ) || bool use_thickness = GetFlag( FL_USE_COPPER_THICKNESS )
GetFlag( FL_USE_REALISTIC_MODE ); // || GetFlag( FL_USE_REALISTIC_MODE )
return use_copper_thickness ? ;
return use_thickness ?
KiROUND( m_NonCopperLayerThickness / m_BiuTo3Dunits ) KiROUND( m_NonCopperLayerThickness / m_BiuTo3Dunits )
: 0; : 0;
} }

View File

@ -68,6 +68,8 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
while( GetLine( file, line, &LineNum, 512 ) ) while( GetLine( file, line, &LineNum, 512 ) )
{ {
text = strtok( line, sep_chars ); text = strtok( line, sep_chars );
if ( text == NULL )
continue;
if( stricmp( text, "DEF" ) == 0 || stricmp( text, "Group" ) == 0 ) if( stricmp( text, "DEF" ) == 0 || stricmp( text, "Group" ) == 0 )
{ {
@ -280,8 +282,6 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
} }
#define BUFSIZE 2000
void VRML_MODEL_PARSER::readCoordsList( FILE* file, char* text_buffer, void VRML_MODEL_PARSER::readCoordsList( FILE* file, char* text_buffer,
std::vector< double >& aList, int* LineNum ) std::vector< double >& aList, int* LineNum )
{ {
@ -371,6 +371,9 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
strcpy( buffer, line ); strcpy( buffer, line );
text = strtok( buffer, sep_chars ); text = strtok( buffer, sep_chars );
if( text == NULL )
continue;
if( *text == '}' ) if( *text == '}' )
{ {
err = 0; err = 0;
@ -381,7 +384,7 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
{ {
text = strtok( NULL, " ,\t\n\r" ); text = strtok( NULL, " ,\t\n\r" );
if( stricmp( text, "true" ) == 0 ) if( text && stricmp( text, "true" ) == 0 )
{ {
} }
else else
@ -395,7 +398,7 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
{ {
text = strtok( NULL, " ,\t\n\r" ); text = strtok( NULL, " ,\t\n\r" );
if( stricmp( text, "true" ) == 0 ) if( text && stricmp( text, "true" ) == 0 )
{ {
} }
else else

View File

@ -66,8 +66,6 @@ option( KICAD_BUILD_DYNAMIC
) )
# WARNING: KiCad developers strongly advise you to build Boost with supplied patches,
# as it is known to work with KiCad. Other versions may contain bugs that may result
# WARNING: KiCad developers strongly advise you to build Boost with supplied patches, # WARNING: KiCad developers strongly advise you to build Boost with supplied patches,
# as it is known to work with KiCad. Other versions may contain bugs that may result # as it is known to work with KiCad. Other versions may contain bugs that may result
# in KiCad errors. # in KiCad errors.
@ -100,9 +98,9 @@ set( DOWNLOAD_DIR ${PROJECT_SOURCE_DIR}/.downloads-by-cmake
LINK_DIRECTORIES( ${LINK_DIRECTORIES_PATH} ) LINK_DIRECTORIES( ${LINK_DIRECTORIES_PATH} )
if( UNIX ) if( UNIX )
set( KICAD_USER_CONFIG_DIR $ENV{HOME} CACHE PATH "Location of user specifig KiCad config files" ) set( KICAD_USER_CONFIG_DIR $ENV{HOME} CACHE PATH "Location of user specific KiCad config files" )
elseif( MINGW ) elseif( MINGW )
set( KICAD_USER_CONFIG_DIR $ENV{%APPDATA%} CACHE PATH "Location of user specifig KiCad config files" ) set( KICAD_USER_CONFIG_DIR $ENV{%APPDATA%} CACHE PATH "Location of user specific KiCad config files" )
endif() endif()
mark_as_advanced( KICAD_USER_CONFIG_DIR ) mark_as_advanced( KICAD_USER_CONFIG_DIR )

View File

@ -212,4 +212,5 @@ Make the Debug binaries:
make make
See ./cmake_config.txt for customizing the KiCad build setting. See Documentation/compiling/build-config.txt for a list of all CMake options
available when compiling KiCad.

View File

@ -1,5 +1,6 @@
Bazaar Bazaar
------ ======
KiCad uses the Bazaar version control system to track source code changes, KiCad uses the Bazaar version control system to track source code changes,
and download the boost libraries needed by Kicad. and download the boost libraries needed by Kicad.
The easiest way to get a copy of the KiCad source is to use Bazaar. The easiest way to get a copy of the KiCad source is to use Bazaar.
@ -11,7 +12,8 @@ Be sure bzrtools is also installed.
boost libraries will be downloaded the first time you build Kicad. boost libraries will be downloaded the first time you build Kicad.
CMake CMake
----- =====
KiCad uses CMake to generate the build files specific for the target platform KiCad uses CMake to generate the build files specific for the target platform
specified by the developer. This document attempts to define some of the more specified by the developer. This document attempts to define some of the more
common CMake and KiCad build configuration settings. You can use CMake either common CMake and KiCad build configuration settings. You can use CMake either
@ -23,7 +25,8 @@ http://www.cmake.org/cmake/help/documentation.html.
Useful CMake Build Settings. Useful CMake Build Settings.
---------------------------- ============================
This section defines some of the more common CMake build configuration setting This section defines some of the more common CMake build configuration setting
used when configuring KiCad. These settings are valid for all projects that used when configuring KiCad. These settings are valid for all projects that
use CMake. use CMake.
@ -39,14 +42,18 @@ switch on the command line. Please note, only a small subset of these project
generators are supported. If you want to use Eclipse on Linux to build KiCad, generators are supported. If you want to use Eclipse on Linux to build KiCad,
you may be in for a lot of work. you may be in for a lot of work.
CMAKE_BUILD_TYPE (Release/Debug/RelWithDebInfo/MinSizeRel) CMAKE_BUILD_TYPE (Release/Debug/RelWithDebInfo/MinSizeRel)
---------------------------------------------------------- ----------------------------------------------------------
Default: Release
When configuring the KiCad build for the command line you must specify build When configuring the KiCad build for the command line you must specify build
type. To create a debug build, set CMAKE_BUILD_TYPE to Debug. To create a type. To create a debug build, set CMAKE_BUILD_TYPE to Debug. To create a
release build, set CMAKE_BUILD_TYPE to Release. See the CMake documentation release build, set CMAKE_BUILD_TYPE to Release. See the CMake documentation
for other build types. For IDE project files, the build type can be selected for other build types. For IDE project files, the build type can be selected
by the IDE configuration manager. by the IDE configuration manager.
CMAKE_INSTALL_PATH (InstallPath) CMAKE_INSTALL_PATH (InstallPath)
-------------------------------- --------------------------------
By default CMake will select the correct install path for your platform. If By default CMake will select the correct install path for your platform. If
@ -57,7 +64,8 @@ installed on your system.
wxWidgets Library Configuration. wxWidgets Library Configuration.
-------------------------------- ================================
KiCad is built using the wxWidgets library. The following options allow you KiCad is built using the wxWidgets library. The following options allow you
to specifically tailor the wxWidgets library configuration. For the complete to specifically tailor the wxWidgets library configuration. For the complete
list of wxWidgets setting see CMakeModules/FindwxWidgets.cmake in the KiCad list of wxWidgets setting see CMakeModules/FindwxWidgets.cmake in the KiCad
@ -69,85 +77,147 @@ CMake looks in the standard platform locations to find the default version of
the wxWidgets library. If you wish to use a custom built wxWidgets library, the wxWidgets library. If you wish to use a custom built wxWidgets library,
set wxWidgets_ROOT_DIR to the correct path. set wxWidgets_ROOT_DIR to the correct path.
wxWidgets_USE_DEBUG (ON/OFF) wxWidgets_USE_DEBUG (ON/OFF)
---------------------------- ----------------------------
Default: OFF
When creating a debug build of KiCad, it is often useful to link against the When creating a debug build of KiCad, it is often useful to link against the
debug build of the wxWidgets. To use the debug build of wxWidgets, set debug build of the wxWidgets. To use the debug build of wxWidgets, set
wxWidgets_USE_DEBUG to ON. wxWidgets_USE_DEBUG to ON.
wxWidgets_USE_UNICODE (ON/OFF) wxWidgets_USE_UNICODE (ON/OFF)
------------------------------ ------------------------------
Default: ON (wxWidgets 2.9 or later), OFF (older versions)
If your platform supports Unicode and you wish to build KiCad with Unicode If your platform supports Unicode and you wish to build KiCad with Unicode
support, set wxWidgets_USE_UNICODE to ON. Please note as of the 2.9 branch support, set wxWidgets_USE_UNICODE to ON. Please note as of the 2.9 branch
this option is not required. this option is not required.
KiCad Specific Options KiCad Specific Options
---------------------- ======================
All of the configuration settings below are specific to the KiCad project. All of the configuration settings below are specific to the KiCad project.
If for any reason you add or remove a build option to the KiCad CMake files, If for any reason you add or remove a build option to the KiCad CMake files,
please update the list below. please update the list below.
KICAD_SKIP_BOOST (ON/OFF) KICAD_SKIP_BOOST (ON/OFF)
-------------------------- --------------------------
Skips building the required boost library components. Default: OFF
WARNING: KiCad developers strongly advise you to build the bundled boost library, as it is
known to work with KiCad. Other versions may contain bugs that may result in KiCad errors. Use the version of the Boost library installed on the system rather than
building a local copy.
WARNING: The KiCad developers strongly advise you to build the bundled copy of
the Boost library, as it is known to work with KiCad. Other versions may
contain bugs that may result in KiCad errors.
USE_WX_GRAPHICS_CONTEXT (ON/OFF) USE_WX_GRAPHICS_CONTEXT (ON/OFF)
-------------------------------- --------------------------------
This option is *Experimental* and used the advanced drawing library code Default: OFF
using wxGraphicsContext and should only be used for testing purposes.
Under Windows, a very recent version of mingw is needed. It also requires This option is *Experimental*. It enables advanced drawing library code using
wxWidgets to be built with the --enable-graphics_ctx configuration switch. wxGraphicsContext and should only be used for testing purposes. Under Windows,
a very recent version of mingw is needed. It also requires wxWidgets to be
built with the --enable-graphics_ctx configuration switch.
USE_IMAGES_IN_MENUS (ON/OFF) USE_IMAGES_IN_MENUS (ON/OFF)
---------------------------- ----------------------------
Default: OFF for OSX, ON for other platforms.
This option is used to enable or disable building KiCad with images in menu This option is used to enable or disable building KiCad with images in menu
items. If this is not defined when CMake is used to create the build files, items. If this is not defined when CMake is used to create the build files,
images will be included in menu items on all platforms except OSX. images will be included in menu items on all platforms except OSX.
DOWNLOAD_DIR (PATH)
-------------------
Default: <source directory>/.downloads-by-cmake
Some external dependencies are automatically download and built when you
compile KiCad. This option specifies which directory they are stored in. If you
are building multiple copies of KiCad (e.g., to test different features or your
own modifications), it is recommended you set this option to a global directory
to avoid download and building the dependencies multiple times.
KICAD_USER_CONFIG_DIR (PATH)
----------------------------
Default: Home directory (Unix-based systems), Application data directory (Windows)
This option specifies where to store user-specific configuration information.
KICAD_KEEPCASE (ON/OFF) KICAD_KEEPCASE (ON/OFF)
----------------------- -----------------------
This option enables or disables turning off the automatic component name Default: ON
conversion to uppercase. The default is OFF which means component names will
be converted to upper case. If this is OFF, component names are automatically converted to uppercase meaning
they are case insensitive. If it is ON, component names are not changed and
are therefore case sensitive.
USE_WX_OVERLAY (ON/OFF) USE_WX_OVERLAY (ON/OFF)
----------------------- -----------------------
This option enables or disables wxOverlay for drawing operation on OSX. It is Default: ON for OSX, OFF for other platforms.
OFF by default on all platforms except OSX. Warning, this is experimental!
This option enables or disables the use of wxOverlay for drawing operations.
Warning, this is experimental!
KICAD_SCRIPTING (ON/OFF) KICAD_SCRIPTING (ON/OFF)
------------------------ ------------------------
This option enables or disables building Python scripting support for KiCad. Default: OFF
The default is OFF. Currently only Pcbnew is supported. This option requires
that SWIG and Python are installed on the system. This option enables or disables building Python scripting support within KiCad.
Currently only Pcbnew is supported. This option requires SWIG and Python to be
installed on the system.
KICAD_SCRIPTING_MODULES (ON/OFF) KICAD_SCRIPTING_MODULES (ON/OFF)
-------------------------------- --------------------------------
This option enables or disables building the KiCad modules that can be used Default: OFF
from scripting languages. The default is OFF. Currently only Pcbnew is
supported. This option requires that SWIG and Python are installed on the This option enables or disables building KiCad Python modules that can be used
system. externally by Python. Currently only Pcbnew is supported. This option
requires SWIG and Python to be installed on the system.
KICAD_SCRIPTING_WXPYTHON (ON/OFF) KICAD_SCRIPTING_WXPYTHON (ON/OFF)
--------------------------------- ---------------------------------
This option enables or disables building wxPython support into KiCad for Default: OFF
python and py.shell. The default is OFF. Currently only Pcbnew is
supported. This option requires that SWIG, Python, and wxPython are This option enables or disables building wxPython support into the KiCad
installed on the system. scripting support. Currently only Pcbnew is supported. This option requires
SWIG, Python, and wxPython to be installed on the system.
PYTHON_SITE_PACKAGE_PATH (PATH) PYTHON_SITE_PACKAGE_PATH (PATH)
------------------------------- -------------------------------
Default: System site library path
When building KiCad with Python scripting enable, the Python site library path When building KiCad with Python scripting enable, the Python site library path
is used by default. If you want to install the KiCad Python extension in a is used by default. If you want to install the KiCad Python extension in a
different path, set this variable to the desired path. different path, set this variable to the desired path.
USE_FP_LIB_TABLE (ON/OFF) BUILD_GITHUB_PLUGIN (ON/OFF)
------------------------- ----------------------------
This option enable or disables building KiCad with the new footprint library Default: OFF
table support. The default setting (OFF) builds KiCad with the legacy library
path support. This option is experimental until the library table support is This option enables or disables building KiCad with a pcbnew plugin for loading
ready for release. footprints from a GitHub repository.
KICAD_REPO_NAME (STRING)
------------------------
Default: "product"
The name of the repository this copy of KiCad was compiled from. This is
reported in the "About" dialog and is useful for people who are working with
multiple copies of the code from different sources. The default value is
"product", the name of the main development branch on Launchpad.

View File

@ -170,6 +170,9 @@ build directory.
Important parameters to cmake Important parameters to cmake
----------------------------- -----------------------------
See Documentation/compiling/build-config.txt for a list of all CMake options
available when compiling KiCad.
-DCMAKE_BUILD_TYPE=<buildtype> -DCMAKE_BUILD_TYPE=<buildtype>
<buildtype> may current one of "Debug" and "Release". <buildtype> may current one of "Debug" and "Release".

View File

@ -119,7 +119,7 @@ void DIALOG_PAGES_SETTINGS::initDialog()
// The first shows translated strings, the second contains not translated strings // The first shows translated strings, the second contains not translated strings
m_paperSizeComboBox->Clear(); m_paperSizeComboBox->Clear();
for( unsigned ii = 0; ii<DIM(pageFmts); ii++ ) for( unsigned ii = 0; ii < DIM(pageFmts); ii++ )
{ {
m_pageFmt.Add( pageFmts[ii] ); m_pageFmt.Add( pageFmts[ii] );
m_paperSizeComboBox->Append( wxGetTranslation( pageFmts[ii] ) ); m_paperSizeComboBox->Append( wxGetTranslation( pageFmts[ii] ) );

View File

@ -35,7 +35,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind
wxString m_paperSizeComboBoxChoices[] = { _("dummy text") }; wxString m_paperSizeComboBoxChoices[] = { _("dummy text") };
int m_paperSizeComboBoxNChoices = sizeof( m_paperSizeComboBoxChoices ) / sizeof( wxString ); int m_paperSizeComboBoxNChoices = sizeof( m_paperSizeComboBoxChoices ) / sizeof( wxString );
m_paperSizeComboBox = new wxChoice( this, ID_CHICE_PAGE_SIZE, wxDefaultPosition, wxDefaultSize, m_paperSizeComboBoxNChoices, m_paperSizeComboBoxChoices, 0 ); m_paperSizeComboBox = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_paperSizeComboBoxNChoices, m_paperSizeComboBoxChoices, 0 );
m_paperSizeComboBox->SetSelection( 0 ); m_paperSizeComboBox->SetSelection( 0 );
bleftSizer->Add( m_paperSizeComboBox, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); bleftSizer->Add( m_paperSizeComboBox, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );

View File

@ -390,7 +390,7 @@
<property name="font"></property> <property name="font"></property>
<property name="gripper">0</property> <property name="gripper">0</property>
<property name="hidden">0</property> <property name="hidden">0</property>
<property name="id">ID_CHICE_PAGE_SIZE</property> <property name="id">wxID_ANY</property>
<property name="max_size"></property> <property name="max_size"></property>
<property name="maximize_button">0</property> <property name="maximize_button">0</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>

View File

@ -37,27 +37,26 @@ class DIALOG_SHIM;
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#define ID_CHICE_PAGE_SIZE 1000 #define ID_CHOICE_PAGE_ORIENTATION 1000
#define ID_CHOICE_PAGE_ORIENTATION 1001 #define ID_TEXTCTRL_USER_PAGE_SIZE_Y 1001
#define ID_TEXTCTRL_USER_PAGE_SIZE_Y 1002 #define ID_TEXTCTRL_USER_PAGE_SIZE_X 1002
#define ID_TEXTCTRL_USER_PAGE_SIZE_X 1003 #define ID_TEXTCTRL_DATE 1003
#define ID_TEXTCTRL_DATE 1004 #define ID_BTN_APPLY_DATE 1004
#define ID_BTN_APPLY_DATE 1005 #define ID_PICKER_DATE 1005
#define ID_PICKER_DATE 1006 #define ID_CHECKBOX_DATE 1006
#define ID_CHECKBOX_DATE 1007 #define ID_TEXTCTRL_REVISION 1007
#define ID_TEXTCTRL_REVISION 1008 #define ID_CHECKBOX_REVISION 1008
#define ID_CHECKBOX_REVISION 1009 #define ID_TEXTCTRL_TITLE 1009
#define ID_TEXTCTRL_TITLE 1010 #define ID_TEXTCTRL_COMPANY 1010
#define ID_TEXTCTRL_COMPANY 1011 #define ID_CHECKBOX_COMPANY 1011
#define ID_CHECKBOX_COMPANY 1012 #define ID_TEXTCTRL_COMMENT1 1012
#define ID_TEXTCTRL_COMMENT1 1013 #define ID_CHECKBOX_COMMENT1 1013
#define ID_CHECKBOX_COMMENT1 1014 #define ID_TEXTCTRL_COMMENT2 1014
#define ID_TEXTCTRL_COMMENT2 1015 #define ID_CHECKBOX_COMMENT2 1015
#define ID_CHECKBOX_COMMENT2 1016 #define ID_TEXTCTRL_COMMENT3 1016
#define ID_TEXTCTRL_COMMENT3 1017 #define ID_CHECKBOX_COMMENT3 1017
#define ID_CHECKBOX_COMMENT3 1018 #define ID_TEXTCTRL_COMMENT4 1018
#define ID_TEXTCTRL_COMMENT4 1019 #define ID_CHECKBOX_COMMENT4 1019
#define ID_CHECKBOX_COMMENT4 1020
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_PAGES_SETTINGS_BASE /// Class DIALOG_PAGES_SETTINGS_BASE

View File

@ -799,10 +799,13 @@ bool FP_LIB_TABLE::ConvertFromLegacy( NETLIST& aNetList, const wxArrayString& aL
wxString uri = cur->rows[i].GetFullURI( true ); wxString uri = cur->rows[i].GetFullURI( true );
if( wxFileName::GetPathSeparator() == wxChar( '\\' ) if( wxFileName::GetPathSeparator() == wxChar( '\\' )
&& uri.Find( wxChar( '/' ) ) >= 0 ) && uri.Find( wxChar( '/' ) ) >= 0 )
uri.Replace( wxT( "/"), wxT( "\\" ) ); uri.Replace( wxT( "/"), wxT( "\\" ) );
#ifdef __WINDOWS__
if( uri.CmpNoCase( libPath ) )
#else
if( uri == libPath ) if( uri == libPath )
#endif
{ {
libNickname = cur->rows[i].GetNickName(); libNickname = cur->rows[i].GetNickName();
break; break;
@ -827,7 +830,6 @@ bool FP_LIB_TABLE::ConvertFromLegacy( NETLIST& aNetList, const wxArrayString& aL
else else
{ {
FPID newFPID = lastFPID; FPID newFPID = lastFPID;
newFPID.SetLibNickname( libNickname ); newFPID.SetLibNickname( libNickname );
if( !newFPID.IsValid() ) if( !newFPID.IsValid() )

View File

@ -1,8 +1,8 @@
#ifndef HELP_MESSAGE_FILE_H #ifndef HELP_MESSAGE_FILE_H
#define HELP_MESSAGE_FILE_H #define HELP_MESSAGE_FILE_H
#define LOAD_FILE_HELP _( "Open a net list file" ) #define LOAD_FILE_HELP _( "Open netlist file" )
#define SAVE_HLP_MSG _( "Save the component/footprint link file (.cmp file)" ) #define SAVE_HLP_MSG _( "Save component/footprint link file (.cmp file)" )
#define SAVE_AS_HLP_MSG _( "Save the component/footprint link file (.cmp file) with a new name" ) #define SAVE_AS_HLP_MSG _( "Save component/footprint link file (.cmp file) with new name" )
#endif // HELP_MESSAGE_FILE_H #endif // HELP_MESSAGE_FILE_H

View File

@ -606,6 +606,9 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
libraryName = m_LibraryList->GetSelectedLibrary(); libraryName = m_LibraryList->GetSelectedLibrary();
m_FootprintList->SetFootprints( m_footprints, libraryName, component, filter ); m_FootprintList->SetFootprints( m_footprints, libraryName, component, filter );
// Tell AuiMgr that objects are changed !
m_auimgr.Update();
if( component == NULL ) if( component == NULL )
return; return;

View File

@ -66,7 +66,7 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
// Open // Open
AddMenuItem( filesMenu, AddMenuItem( filesMenu,
ID_LOAD_PROJECT, ID_LOAD_PROJECT,
_( "&Open" ), LOAD_FILE_HELP, KiBitmap( open_document_xpm ) ); _( "&Open Netlist" ), LOAD_FILE_HELP, KiBitmap( open_document_xpm ) );
// Open Recent submenu // Open Recent submenu
static wxMenu* openRecentMenu; static wxMenu* openRecentMenu;
@ -81,7 +81,7 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
wxGetApp().GetFileHistory().AddFilesToMenu(); wxGetApp().GetFileHistory().AddFilesToMenu();
AddMenuItem( filesMenu, openRecentMenu, -1, AddMenuItem( filesMenu, openRecentMenu, -1,
_( "Open &Recent" ), _( "Open &Recent" ),
_( "Open a recent opened netlist document" ), _( "Open recent netlist" ),
KiBitmap( open_project_xpm ) ); KiBitmap( open_project_xpm ) );
// Separator // Separator
@ -111,7 +111,7 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
wxMenu* preferencesMenu = new wxMenu; wxMenu* preferencesMenu = new wxMenu;
AddMenuItem( preferencesMenu, ID_CVPCB_LIB_TABLE_EDIT, AddMenuItem( preferencesMenu, ID_CVPCB_LIB_TABLE_EDIT,
_( "Li&brary Tables" ), _( "Setup footprint libraries" ), _( "Edit Li&brary Table" ), _( "Setup footprint libraries" ),
KiBitmap( library_table_xpm ) ); KiBitmap( library_table_xpm ) );
// Language submenu // Language submenu
@ -134,7 +134,7 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
AddMenuItem( preferencesMenu, ID_SAVE_PROJECT_AS, AddMenuItem( preferencesMenu, ID_SAVE_PROJECT_AS,
_( "&Save Project File As" ), _( "&Save Project File As" ),
_( "Save changes to the project configuration to a new file" ), _( "Save changes to a new project configuration file" ),
KiBitmap( save_setup_xpm ) ); KiBitmap( save_setup_xpm ) );
// Menu Help: // Menu Help:
@ -143,12 +143,12 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
// Version info // Version info
AddHelpVersionInfoMenuEntry( helpMenu ); AddHelpVersionInfoMenuEntry( helpMenu );
// Contents // Manual Contents
AddMenuItem( helpMenu, wxID_HELP, _( "&Contents" ), AddMenuItem( helpMenu, wxID_HELP, _( "&CvPcb Manual" ),
_( "Open the CvPcb handbook" ), _( "Open CvPcb manual" ),
KiBitmap( online_help_xpm ) ); KiBitmap( online_help_xpm ) );
// About // About CvPcb
AddMenuItem( helpMenu, wxID_ABOUT, AddMenuItem( helpMenu, wxID_ABOUT,
_( "&About CvPcb" ), _( "&About CvPcb" ),
_( "About CvPcb footprint selector" ), _( "About CvPcb footprint selector" ),

View File

@ -58,7 +58,7 @@ void CVPCB_MAINFRAME::ReCreateHToolbar()
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_CVPCB_CREATE_CONFIGWINDOW, wxEmptyString, m_mainToolBar->AddTool( ID_CVPCB_CREATE_CONFIGWINDOW, wxEmptyString,
KiBitmap( config_xpm ), KiBitmap( config_xpm ),
_( "Configuration" ) ); _( "Set CvPcb config (paths and equ files)" ) );
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_CVPCB_CREATE_SCREENCMP, wxEmptyString, m_mainToolBar->AddTool( ID_CVPCB_CREATE_SCREENCMP, wxEmptyString,
@ -72,21 +72,21 @@ void CVPCB_MAINFRAME::ReCreateHToolbar()
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_CVPCB_GOTO_PREVIOUSNA, wxEmptyString, m_mainToolBar->AddTool( ID_CVPCB_GOTO_PREVIOUSNA, wxEmptyString,
KiBitmap( left_xpm ), KiBitmap( left_xpm ),
_( "Select previous free component" ) ); _( "Select previous unlinked component" ) );
m_mainToolBar->AddTool( ID_CVPCB_GOTO_FIRSTNA, wxEmptyString, m_mainToolBar->AddTool( ID_CVPCB_GOTO_FIRSTNA, wxEmptyString,
KiBitmap( right_xpm ), KiBitmap( right_xpm ),
_( "Select next free component" ) ); _( "Select next unlinked component" ) );
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_CVPCB_DEL_ASSOCIATIONS, wxEmptyString, m_mainToolBar->AddTool( ID_CVPCB_DEL_ASSOCIATIONS, wxEmptyString,
KiBitmap( delete_association_xpm ), KiBitmap( delete_association_xpm ),
_( "Delete all associations" ) ); _( "Delete all associations (links)" ) );
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_PCB_DISPLAY_FOOTPRINT_DOC, wxEmptyString, m_mainToolBar->AddTool( ID_PCB_DISPLAY_FOOTPRINT_DOC, wxEmptyString,
KiBitmap( datasheet_xpm ), KiBitmap( datasheet_xpm ),
_( "Display footprints list documentation" ) ); _( "Display footprint documentation" ) );
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
@ -94,20 +94,20 @@ void CVPCB_MAINFRAME::ReCreateHToolbar()
KiBitmap( module_filtered_list_xpm ), KiBitmap( module_filtered_list_xpm ),
wxNullBitmap, wxNullBitmap,
true, NULL, true, NULL,
_( "Filter the footprint list for the current component key words" ), _( "Filter footprint list by keywords" ),
wxEmptyString ); wxEmptyString );
m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST, m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST,
KiBitmap( module_pin_filtered_list_xpm ), KiBitmap( module_pin_filtered_list_xpm ),
wxNullBitmap, wxNullBitmap,
true, NULL, true, NULL,
_( "Filter the footprint list by pin count for the current component" ), _( "Filter footprint list by pin count" ),
wxEmptyString ); wxEmptyString );
m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST, m_mainToolBar->AddTool( ID_CVPCB_FOOTPRINT_DISPLAY_BY_LIBRARY_LIST,
KiBitmap( module_library_list_xpm ), KiBitmap( module_library_list_xpm ),
wxNullBitmap, true, NULL, wxNullBitmap, true, NULL,
_( "Filter the footprint list by the selected library" ), _( "Filter footprint list by library" ),
wxEmptyString ); wxEmptyString );
if( config ) if( config )

View File

@ -141,8 +141,6 @@ void COMPONENT_TREE_SEARCH_CONTAINER::AddAliasList( const wxString& aNodeName,
const wxArrayString& aAliasNameList, const wxArrayString& aAliasNameList,
CMP_LIBRARY* aOptionalLib ) CMP_LIBRARY* aOptionalLib )
{ {
static const wxChar unitLetter[] = wxT( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
TREE_NODE* const lib_node = new TREE_NODE( TREE_NODE::TYPE_LIB, NULL, NULL, TREE_NODE* const lib_node = new TREE_NODE( TREE_NODE::TYPE_LIB, NULL, NULL,
aNodeName, wxEmptyString, wxEmptyString ); aNodeName, wxEmptyString, wxEmptyString );
nodes.push_back( lib_node ); nodes.push_back( lib_node );
@ -168,9 +166,20 @@ void COMPONENT_TREE_SEARCH_CONTAINER::AddAliasList( const wxString& aNodeName,
if( !a->GetDescription().empty() ) if( !a->GetDescription().empty() )
{ {
// Preformatting. Unfortunately, the tree widget doesn't have columns // Preformatting. Unfortunately, the tree widget doesn't have columns
display_info.Printf( wxT(" %s[ %s ]"), // and using tabs does not work very well or does not work at all
( a->GetName().length() <= 8 ) ? wxT("\t\t") : wxT("\t"), // (depending on OS versions). So indent with spaces in fixed-font width.
GetChars( a->GetDescription() ) );
// The 98%-ile of length of strings found in the standard library is 15
// characters. Use this as a reasonable cut-off point for aligned indentation.
// For the few component names longer than that, the description is indented a
// bit more.
// The max found in the default lib would be 20 characters, but that creates too
// much visible whitespace for the less extreme component names.
const int COLUMN_DESCR_POS = 15;
const int indent_len = COLUMN_DESCR_POS - a->GetName().length();
display_info = wxString::Format( wxT( " %*s [ %s ]" ),
indent_len > 0 ? indent_len : 0, wxT( "" ),
GetChars( a->GetDescription() ) );
} }
TREE_NODE* alias_node = new TREE_NODE( TREE_NODE::TYPE_ALIAS, lib_node, TREE_NODE* alias_node = new TREE_NODE( TREE_NODE::TYPE_ALIAS, lib_node,
@ -178,21 +187,28 @@ void COMPONENT_TREE_SEARCH_CONTAINER::AddAliasList( const wxString& aNodeName,
nodes.push_back( alias_node ); nodes.push_back( alias_node );
if( a->GetComponent()->IsMulti() ) // Add all units as sub-nodes. if( a->GetComponent()->IsMulti() ) // Add all units as sub-nodes.
for ( int u = 0; u < a->GetComponent()->GetPartCount(); ++u ) {
for( int u = 1; u <= a->GetComponent()->GetPartCount(); ++u )
{ {
const wxString unitName = unitLetter[u]; wxString unitName = _("Unit");
TREE_NODE* unit_node = new TREE_NODE(TREE_NODE::TYPE_UNIT, alias_node, a, unitName += wxT( " " ) + LIB_COMPONENT::ReturnSubReference( u, false );
_("Unit ") + unitName, TREE_NODE* unit_node = new TREE_NODE( TREE_NODE::TYPE_UNIT,
wxEmptyString, wxEmptyString ); alias_node, a,
unit_node->Unit = u + 1; unitName,
wxEmptyString, wxEmptyString );
unit_node->Unit = u;
nodes.push_back( unit_node ); nodes.push_back( unit_node );
} }
}
} }
} }
LIB_ALIAS* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedAlias( int* aUnit ) LIB_ALIAS* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedAlias( int* aUnit )
{ {
if( tree == NULL )
return NULL;
const wxTreeItemId& select_id = tree->GetSelection(); const wxTreeItemId& select_id = tree->GetSelection();
BOOST_FOREACH( TREE_NODE* node, nodes ) BOOST_FOREACH( TREE_NODE* node, nodes )

View File

@ -97,7 +97,7 @@ public:
/** Function GetSelectedAlias /** Function GetSelectedAlias
* *
* @param if not-NULL, the selected sub-unit is set here. * @param if not-NULL, the selected sub-unit is set here.
* @return the selected alias or NULL if there is none. * @return the selected alias or NULL if there is none, or there is no tree.
*/ */
LIB_ALIAS* GetSelectedAlias( int* aUnit ); LIB_ALIAS* GetSelectedAlias( int* aUnit );

View File

@ -47,19 +47,29 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr
m_search_container->SetTree( m_libraryComponentTree ); m_search_container->SetTree( m_libraryComponentTree );
m_searchBox->SetFocus(); m_searchBox->SetFocus();
m_componentDetails->SetEditable( false ); m_componentDetails->SetEditable( false );
#if wxCHECK_VERSION( 3, 0, 0 )
m_libraryComponentTree->ScrollTo( m_libraryComponentTree->GetFocusedItem() );
#endif
// The tree showing libs and component uses a fixed font,
// because we want controle the position of some info when drawing the
// tree. Using tabs does not work very well (does not work on Windows)
wxFont font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
m_libraryComponentTree->SetFont( wxFont( font.GetPointSize(),
wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ) );
} }
// After this dialog is done: return the alias that has been selected, or an DIALOG_CHOOSE_COMPONENT::~DIALOG_CHOOSE_COMPONENT()
// empty string if there is none.
wxString DIALOG_CHOOSE_COMPONENT::GetSelectedAliasName( int* aUnit ) const
{ {
LIB_ALIAS *alias = m_search_container->GetSelectedAlias( aUnit ); m_search_container->SetTree( NULL );
}
if( alias )
return alias->GetName();
return wxEmptyString; LIB_ALIAS* DIALOG_CHOOSE_COMPONENT::GetSelectedAlias( int* aUnit ) const
{
return m_search_container->GetSelectedAlias( aUnit );
} }
@ -131,7 +141,11 @@ void DIALOG_CHOOSE_COMPONENT::OnTreeSelect( wxTreeEvent& aEvent )
} }
void DIALOG_CHOOSE_COMPONENT::OnDoubleClickTreeSelect( wxTreeEvent& aEvent ) // Test strategy for OnDoubleClickTreeActivation()/OnTreeMouseUp() work around wxWidgets bug:
// - search for an item.
// - use the mouse to double-click on an item in the tree.
// -> The dialog should close, and the component should _not_ be immediately placed
void DIALOG_CHOOSE_COMPONENT::OnDoubleClickTreeActivation( wxTreeEvent& aEvent )
{ {
if( !updateSelection() ) if( !updateSelection() )
return; return;
@ -152,6 +166,27 @@ void DIALOG_CHOOSE_COMPONENT::OnTreeMouseUp( wxMouseEvent& aMouseEvent )
aMouseEvent.Skip(); // Let upstream handle it. aMouseEvent.Skip(); // Let upstream handle it.
} }
// Test strategy to see if OnInterceptTreeEnter() works:
// - search for an item.
// - click into the tree once to set focus on tree; navigate. Press 'Enter'
// -> The dialog should close and the component be available to place.
void DIALOG_CHOOSE_COMPONENT::OnInterceptTreeEnter( wxKeyEvent& aEvent )
{
// We have to do some special handling for double-click on a tree-item because
// of some superfluous event delivery bug in wxWidgets (see OnDoubleClickTreeActivation()).
// In tree-activation, we assume we got a double-click and need to take special precaution
// that the mouse-up event is not delivered to the window one level up by going through
// a state-sequence OnDoubleClickTreeActivation() -> OnTreeMouseUp().
// Pressing 'Enter' within a tree will also call OnDoubleClickTreeActivation(),
// but since this is not due to the double-click and we have no way of knowing that it is
// not, we need to intercept the 'Enter' key before that to know that it is time to exit.
if( aEvent.GetKeyCode() == WXK_RETURN )
EndModal( wxID_OK ); // Dialog is done.
else
aEvent.Skip(); // Let tree handle that key for navigation.
}
void DIALOG_CHOOSE_COMPONENT::OnStartComponentBrowser( wxMouseEvent& aEvent ) void DIALOG_CHOOSE_COMPONENT::OnStartComponentBrowser( wxMouseEvent& aEvent )
{ {

View File

@ -27,27 +27,39 @@
#include <dialog_choose_component_base.h> #include <dialog_choose_component_base.h>
class COMPONENT_TREE_SEARCH_CONTAINER; class COMPONENT_TREE_SEARCH_CONTAINER;
class LIB_ALIAS;
class LIB_COMPONENT; class LIB_COMPONENT;
class wxTreeItemId; class wxTreeItemId;
class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE
{ {
public: public:
/**
* Create dialog to choose component.
*
* @param aParent Parent window.
* @param aTitle Dialog title.
* @param aSearchContainer The tree selection search container. Needs to be pre-populated
* This dialog does not take over ownership of this object.
* @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog)
*/
DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aSearch_container, COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer,
int aDeMorganConvert ); int aDeMorganConvert );
virtual ~DIALOG_CHOOSE_COMPONENT();
/** Function GetSelectedAliasName /** Function GetSelectedAlias
* To be called after this dialog returns from ShowModal(). * To be called after this dialog returns from ShowModal().
* *
* @param aUnit if not NULL, the selected unit is filled in here. * @param aUnit if not NULL, the selected unit is filled in here.
* @return the alias that has been selected, or an empty string if there is none. * @return the alias that has been selected, or NULL if there is none.
*/ */
wxString GetSelectedAliasName( int* aUnit ) const; LIB_ALIAS* GetSelectedAlias( int* aUnit ) const;
/** Function IsExternalBrowserSelected /** Function IsExternalBrowserSelected
* *
* @return true, iff the browser pressed the browsing button. * @return true, iff the user pressed the thumbnail view of the component to
* launch the component browser.
*/ */
bool IsExternalBrowserSelected() const { return m_external_browser_requested; } bool IsExternalBrowserSelected() const { return m_external_browser_requested; }
@ -57,7 +69,8 @@ protected:
virtual void OnInterceptSearchBoxKey( wxKeyEvent& aEvent ); virtual void OnInterceptSearchBoxKey( wxKeyEvent& aEvent );
virtual void OnTreeSelect( wxTreeEvent& aEvent ); virtual void OnTreeSelect( wxTreeEvent& aEvent );
virtual void OnDoubleClickTreeSelect( wxTreeEvent& aEvent ); virtual void OnDoubleClickTreeActivation( wxTreeEvent& aEvent );
virtual void OnInterceptTreeEnter( wxKeyEvent& aEvent );
virtual void OnTreeMouseUp( wxMouseEvent& aMouseEvent ); virtual void OnTreeMouseUp( wxMouseEvent& aMouseEvent );
virtual void OnStartComponentBrowser( wxMouseEvent& aEvent ); virtual void OnStartComponentBrowser( wxMouseEvent& aEvent );

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 6 2013) // C++ code generated with wxFormBuilder (version Feb 22 2014)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -75,8 +75,9 @@ DIALOG_CHOOSE_COMPONENT_BASE::DIALOG_CHOOSE_COMPONENT_BASE( wxWindow* parent, wx
m_searchBox->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this ); m_searchBox->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this );
m_searchBox->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this ); m_searchBox->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this );
m_searchBox->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this ); m_searchBox->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_KEY_UP, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptTreeEnter ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this ); m_libraryComponentTree->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeSelect ), NULL, this ); m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeActivation ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this ); m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this );
m_componentView->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this ); m_componentView->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this );
m_componentView->Connect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnHandlePreviewRepaint ), NULL, this ); m_componentView->Connect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnHandlePreviewRepaint ), NULL, this );
@ -88,8 +89,9 @@ DIALOG_CHOOSE_COMPONENT_BASE::~DIALOG_CHOOSE_COMPONENT_BASE()
m_searchBox->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this ); m_searchBox->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this );
m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this ); m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this );
m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this ); m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_KEY_UP, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptTreeEnter ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this ); m_libraryComponentTree->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeSelect ), NULL, this ); m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeActivation ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this ); m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this );
m_componentView->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this ); m_componentView->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this );
m_componentView->Disconnect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnHandlePreviewRepaint ), NULL, this ); m_componentView->Disconnect( wxEVT_PAINT, wxPaintEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnHandlePreviewRepaint ), NULL, this );

View File

@ -338,7 +338,7 @@
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
<event name="OnKeyUp"></event> <event name="OnKeyUp">OnInterceptTreeEnter</event>
<event name="OnKillFocus"></event> <event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event> <event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event> <event name="OnLeftDClick"></event>
@ -363,7 +363,7 @@
<event name="OnTreeEndDrag"></event> <event name="OnTreeEndDrag"></event>
<event name="OnTreeEndLabelEdit"></event> <event name="OnTreeEndLabelEdit"></event>
<event name="OnTreeGetInfo"></event> <event name="OnTreeGetInfo"></event>
<event name="OnTreeItemActivated">OnDoubleClickTreeSelect</event> <event name="OnTreeItemActivated">OnDoubleClickTreeActivation</event>
<event name="OnTreeItemCollapsed"></event> <event name="OnTreeItemCollapsed"></event>
<event name="OnTreeItemCollapsing"></event> <event name="OnTreeItemCollapsing"></event>
<event name="OnTreeItemExpanded"></event> <event name="OnTreeItemExpanded"></event>

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 6 2013) // C++ code generated with wxFormBuilder (version Feb 22 2014)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -50,8 +50,9 @@ class DIALOG_CHOOSE_COMPONENT_BASE : public DIALOG_SHIM
virtual void OnInterceptSearchBoxKey( wxKeyEvent& event ) { event.Skip(); } virtual void OnInterceptSearchBoxKey( wxKeyEvent& event ) { event.Skip(); }
virtual void OnSearchBoxChange( wxCommandEvent& event ) { event.Skip(); } virtual void OnSearchBoxChange( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchBoxEnter( wxCommandEvent& event ) { event.Skip(); } virtual void OnSearchBoxEnter( wxCommandEvent& event ) { event.Skip(); }
virtual void OnInterceptTreeEnter( wxKeyEvent& event ) { event.Skip(); }
virtual void OnTreeMouseUp( wxMouseEvent& event ) { event.Skip(); } virtual void OnTreeMouseUp( wxMouseEvent& event ) { event.Skip(); }
virtual void OnDoubleClickTreeSelect( wxTreeEvent& event ) { event.Skip(); } virtual void OnDoubleClickTreeActivation( wxTreeEvent& event ) { event.Skip(); }
virtual void OnTreeSelect( wxTreeEvent& event ) { event.Skip(); } virtual void OnTreeSelect( wxTreeEvent& event ) { event.Skip(); }
virtual void OnStartComponentBrowser( wxMouseEvent& event ) { event.Skip(); } virtual void OnStartComponentBrowser( wxMouseEvent& event ) { event.Skip(); }
virtual void OnHandlePreviewRepaint( wxPaintEvent& event ) { event.Skip(); } virtual void OnHandlePreviewRepaint( wxPaintEvent& event ) { event.Skip(); }

View File

@ -52,8 +52,8 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
// TODO(hzeller): would be good if we could give a pre-selected component. wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedAlias,
wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) int* aUnit, int* aConvert )
{ {
wxSemaphore semaphore( 0, 1 ); wxSemaphore semaphore( 0, 1 );
wxString cmpname; wxString cmpname;
@ -64,7 +64,21 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
viewlibFrame->Destroy(); viewlibFrame->Destroy();
viewlibFrame = new LIB_VIEW_FRAME( this, NULL, &semaphore, viewlibFrame = new LIB_VIEW_FRAME( this, NULL, &semaphore,
KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT ); KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT );
if ( aPreselectedAlias )
{
viewlibFrame->SetSelectedLibrary( aPreselectedAlias->GetLibraryName() );
viewlibFrame->SetSelectedComponent( aPreselectedAlias->GetName() );
}
if( aUnit && *aUnit > 0 )
viewlibFrame->SetUnit( *aUnit );
if( aConvert && *aConvert > 0 )
viewlibFrame->SetConvert( *aConvert );
viewlibFrame->Refresh();
// Show the library viewer frame until it is closed // Show the library viewer frame until it is closed
// Wait for viewer closing event: // Wait for viewer closing event:
while( semaphore.TryWait() == wxSEMA_BUSY ) while( semaphore.TryWait() == wxSEMA_BUSY )
@ -74,6 +88,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
} }
cmpname = viewlibFrame->GetSelectedComponent(); cmpname = viewlibFrame->GetSelectedComponent();
if( aUnit )
*aUnit = viewlibFrame->GetUnit();
if( aConvert )
*aConvert = viewlibFrame->GetConvert();
viewlibFrame->Destroy(); viewlibFrame->Destroy();
return cmpname; return cmpname;
@ -114,7 +135,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname,
{ {
// This is good for a transition for experineced users: giving them a History. Ideally, // This is good for a transition for experineced users: giving them a History. Ideally,
// we actually make this part even faster to access with a popup on ALT-a or something. // we actually make this part even faster to access with a popup on ALT-a or something.
search_container.AddAliasList( _("-- History --"), aHistoryList, NULL ); // the history is under a node named "-- History --"
// However, because it is translatable, and we need to have a node name starting by "-- "
// because we (later) sort all node names alphabetically and this node should be the first,
// we build it with only with "History" string translatable
wxString nodename;
nodename << wxT("-- ") << _("History") << wxT(" --");
search_container.AddAliasList( nodename, aHistoryList, NULL );
search_container.SetPreselectNode( aHistoryList[0], aHistoryLastUnit ); search_container.SetPreselectNode( aHistoryList[0], aHistoryLastUnit );
} }
@ -125,18 +152,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname,
if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL )
return wxEmptyString; return wxEmptyString;
wxString cmpName = dlg.GetSelectedAliasName( aUnit ); wxString cmpName;
LIB_ALIAS* const alias = dlg.GetSelectedAlias( aUnit );
if ( alias )
cmpName = alias->GetName();
if( dlg.IsExternalBrowserSelected() ) if( dlg.IsExternalBrowserSelected() ) // User requested big component browser.
{ cmpName = SelectComponentFromLibBrowser( alias, aUnit, aConvert);
cmpName = SelectComponentFromLibBrowser(); // Would be good if we could pre-select.
if( aUnit )
*aUnit = LIB_VIEW_FRAME::GetUnit();
if( aConvert )
*aConvert = LIB_VIEW_FRAME::GetConvert();
}
if ( !cmpName.empty() ) if ( !cmpName.empty() )
{ {

View File

@ -47,7 +47,7 @@
"Place hierarchical pin imported from the corresponding hierarchical label" ) "Place hierarchical pin imported from the corresponding hierarchical label" )
#define HELP_PLACE_SHEETPIN _( "Place hierarchical pin in sheet" ) #define HELP_PLACE_SHEETPIN _( "Place hierarchical pin in sheet" )
#define HELP_PLACE_GRAPHICLINES _( "Place graphic lines or polygons" ) #define HELP_PLACE_GRAPHICLINES _( "Place graphic lines or polygons" )
#define HELP_PLACE_GRAPHICTEXTS _( "Place graphic text/comment" ) #define HELP_PLACE_GRAPHICTEXTS _( "Place text" )
#define HELP_ANNOTATE _( "Annotate schematic components" ) #define HELP_ANNOTATE _( "Annotate schematic components" )
#define HELP_RUN_LIB_EDITOR _( "Library Editor - Create/edit components" ) #define HELP_RUN_LIB_EDITOR _( "Library Editor - Create/edit components" )

View File

@ -221,6 +221,13 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( SCH_EDIT_FRAME* aParent,
LoadSettings(); LoadSettings();
// Ensure m_LastGridSizeId is an offset inside the allowed schematic range
if( m_LastGridSizeId < ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000 )
m_LastGridSizeId = ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000;
if( m_LastGridSizeId > ID_POPUP_GRID_LEVEL_1 - ID_POPUP_GRID_LEVEL_1000 )
m_LastGridSizeId = ID_POPUP_GRID_LEVEL_1 - ID_POPUP_GRID_LEVEL_1000;
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 );
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );

View File

@ -71,10 +71,10 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
KiBitmap( new_xpm ) ); KiBitmap( new_xpm ) );
// Open // Open
text = AddHotkeyName( _( "&Open Schematic Sheet" ), s_Schematic_Hokeys_Descr, HK_LOAD_SCH ); text = AddHotkeyName( _( "&Open Schematic Project" ), s_Schematic_Hokeys_Descr, HK_LOAD_SCH );
AddMenuItem( fileMenu, AddMenuItem( fileMenu,
ID_LOAD_PROJECT, text, ID_LOAD_PROJECT, text,
_( "Open an existing schematic sheet" ), _( "Open an existing schematic hierarchy" ),
KiBitmap( open_document_xpm ) ); KiBitmap( open_document_xpm ) );
// Open Recent submenu // Open Recent submenu
@ -399,8 +399,8 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
// Library // Library
AddMenuItem( preferencesMenu, AddMenuItem( preferencesMenu,
ID_CONFIG_REQ, ID_CONFIG_REQ,
_( "Set &Library Path" ), _( "Set Active &Libraries" ),
_( "Set library preferences" ), _( "Set active library list and library paths" ),
KiBitmap( library_xpm ) ); KiBitmap( library_xpm ) );
// Colors // Colors
@ -497,7 +497,7 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
//Run CvPcb //Run CvPcb
AddMenuItem( toolsMenu, AddMenuItem( toolsMenu,
ID_TO_CVPCB, ID_TO_CVPCB,
_( "A&ssign Component Footprints" ), _( "A&ssign Component Footprint" ),
_( "Run CvPcb" ), _( "Run CvPcb" ),
KiBitmap( cvpcb_xpm ) ); KiBitmap( cvpcb_xpm ) );

View File

@ -59,11 +59,6 @@ void RotateListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& rotationPoint )
} }
void DeleteItemsInList( EDA_DRAW_PANEL* panel, PICKED_ITEMS_LIST& aItemsList );
void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList,
const wxPoint aMoveVector );
void MirrorY( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint ) void MirrorY( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint )
{ {
for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ )

View File

@ -764,14 +764,14 @@ void SCH_COMPONENT::SetOrientation( int aOrientation )
m_transform.x2 = m_transform.y1 = 0; m_transform.x2 = m_transform.y1 = 0;
break; break;
case CMP_ROTATE_CLOCKWISE: // Rotate + (incremental rotation) case CMP_ROTATE_COUNTERCLOCKWISE: // Rotate + (incremental rotation)
temp.x1 = temp.y2 = 0; temp.x1 = temp.y2 = 0;
temp.y1 = 1; temp.y1 = 1;
temp.x2 = -1; temp.x2 = -1;
transform = true; transform = true;
break; break;
case CMP_ROTATE_COUNTERCLOCKWISE: // Rotate - (incremental rotation) case CMP_ROTATE_CLOCKWISE: // Rotate - (incremental rotation)
temp.x1 = temp.y2 = 0; temp.x1 = temp.y2 = 0;
temp.y1 = -1; temp.y1 = -1;
temp.x2 = 1; temp.x2 = 1;
@ -1534,8 +1534,7 @@ void SCH_COMPONENT::Rotate( wxPoint aPosition )
RotatePoint( &m_Pos, aPosition, 900 ); RotatePoint( &m_Pos, aPosition, 900 );
//SetOrientation( CMP_ROTATE_COUNTERCLOCKWISE ); SetOrientation( CMP_ROTATE_COUNTERCLOCKWISE );
SetOrientation( CMP_ROTATE_CLOCKWISE );
for( int ii = 0; ii < GetFieldCount(); ii++ ) for( int ii = 0; ii < GetFieldCount(); ii++ )
{ {

View File

@ -215,6 +215,13 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( wxWindow* aParent, const wxString& aTitle,
/* Get config */ /* Get config */
LoadSettings(); LoadSettings();
// Ensure m_LastGridSizeId is an offset inside the allowed schematic range
if( m_LastGridSizeId < ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000 )
m_LastGridSizeId = ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000;
if( m_LastGridSizeId > ID_POPUP_GRID_LEVEL_1 - ID_POPUP_GRID_LEVEL_1000 )
m_LastGridSizeId = ID_POPUP_GRID_LEVEL_1 - ID_POPUP_GRID_LEVEL_1000;
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 );
if( m_canvas ) if( m_canvas )

View File

@ -195,7 +195,7 @@ void SCH_EDIT_FRAME::ReCreateVToolbar()
m_drawToolBar->AddTool( ID_HIERARCHY_PUSH_POP_BUTT, wxEmptyString, m_drawToolBar->AddTool( ID_HIERARCHY_PUSH_POP_BUTT, wxEmptyString,
KiBitmap( hierarchy_cursor_xpm ), KiBitmap( hierarchy_cursor_xpm ),
_( "Ascend or descend hierarchy" ), wxITEM_CHECK ); _( "Ascend/descend hierarchy" ), wxITEM_CHECK );
m_drawToolBar->AddTool( ID_SCH_PLACE_COMPONENT, wxEmptyString, KiBitmap( add_component_xpm ), m_drawToolBar->AddTool( ID_SCH_PLACE_COMPONENT, wxEmptyString, KiBitmap( add_component_xpm ),
HELP_PLACE_COMPONENTS, wxITEM_CHECK ); HELP_PLACE_COMPONENTS, wxITEM_CHECK );
@ -251,7 +251,7 @@ void SCH_EDIT_FRAME::ReCreateVToolbar()
HELP_PLACE_GRAPHICTEXTS, wxITEM_CHECK ); HELP_PLACE_GRAPHICTEXTS, wxITEM_CHECK );
m_drawToolBar->AddTool( ID_ADD_IMAGE_BUTT, wxEmptyString, KiBitmap( image_xpm ), m_drawToolBar->AddTool( ID_ADD_IMAGE_BUTT, wxEmptyString, KiBitmap( image_xpm ),
_("Add a bitmap image"), wxITEM_CHECK ); _("Add bitmap image"), wxITEM_CHECK );
m_drawToolBar->AddTool( ID_SCHEMATIC_DELETE_ITEM_BUTT, wxEmptyString, m_drawToolBar->AddTool( ID_SCHEMATIC_DELETE_ITEM_BUTT, wxEmptyString,
KiBitmap( delete_xpm ), KiBitmap( delete_xpm ),
@ -282,11 +282,11 @@ void SCH_EDIT_FRAME::ReCreateOptToolbar()
m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString, m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString,
KiBitmap( unit_inch_xpm ), KiBitmap( unit_inch_xpm ),
_( "Units in inches" ), wxITEM_CHECK ); _( "Set unit to inch" ), wxITEM_CHECK );
m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString, m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString,
KiBitmap( unit_mm_xpm ), KiBitmap( unit_mm_xpm ),
_( "Units in millimeters" ), wxITEM_CHECK ); _( "Set unit to mm" ), wxITEM_CHECK );
m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString, m_optionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString,
KiBitmap( cursor_shape_xpm ), KiBitmap( cursor_shape_xpm ),

View File

@ -402,16 +402,24 @@ void LIB_VIEW_FRAME::ClickOnLibList( wxCommandEvent& event )
if( ii < 0 ) if( ii < 0 )
return; return;
wxString name = m_libList->GetString( ii ); SetSelectedLibrary( m_libList->GetString( ii ) );
}
if( m_libraryName == name )
void LIB_VIEW_FRAME::SetSelectedLibrary( const wxString& aLibraryName )
{
if( m_libraryName == aLibraryName )
return; return;
m_libraryName = name; m_libraryName = aLibraryName;
ReCreateListCmp(); ReCreateListCmp();
m_canvas->Refresh(); m_canvas->Refresh();
DisplayLibInfos(); DisplayLibInfos();
ReCreateHToolbar(); ReCreateHToolbar();
// Ensure the corresponding line in m_libList is selected
// (which is not necessary the case if SetSelectedLibrary is called
// by an other caller than ClickOnLibList.
m_libList->SetStringSelection( m_libraryName, true );
} }
@ -422,11 +430,19 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event )
if( ii < 0 ) if( ii < 0 )
return; return;
wxString name = m_cmpList->GetString( ii ); SetSelectedComponent( m_cmpList->GetString( ii ) );
}
if( m_entryName.CmpNoCase( name ) != 0 )
void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
{
if( m_entryName.CmpNoCase( aComponentName ) != 0 )
{ {
m_entryName = name; m_entryName = aComponentName;
// Ensure the corresponding line in m_cmpList is selected
// (which is not necessary the case if SetSelectedComponent is called
// by an other caller than ClickOnCmpList.
m_cmpList->SetStringSelection( aComponentName, true );
DisplayLibInfos(); DisplayLibInfos();
m_unit = 1; m_unit = 1;
m_convert = 1; m_convert = 1;
@ -436,6 +452,7 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event )
} }
} }
void LIB_VIEW_FRAME::DClickOnCmpList( wxCommandEvent& event ) void LIB_VIEW_FRAME::DClickOnCmpList( wxCommandEvent& event )
{ {
if( m_semaphore ) if( m_semaphore )
@ -480,10 +497,10 @@ void LIB_VIEW_FRAME::LoadSettings( )
cfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 100 ); cfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 100 );
// Set parameters to a reasonable value. // Set parameters to a reasonable value.
if ( m_libListWidth > m_FrameSize.x/2 ) if( m_libListWidth > m_FrameSize.x/2 )
m_libListWidth = m_FrameSize.x/2; m_libListWidth = m_FrameSize.x/2;
if ( m_cmpListWidth > m_FrameSize.x/2 ) if( m_cmpListWidth > m_FrameSize.x/2 )
m_cmpListWidth = m_FrameSize.x/2; m_cmpListWidth = m_FrameSize.x/2;
} }

View File

@ -47,29 +47,6 @@ class CMP_LIBRARY;
*/ */
class LIB_VIEW_FRAME : public SCH_BASE_FRAME class LIB_VIEW_FRAME : public SCH_BASE_FRAME
{ {
private:
wxComboBox* m_selpartBox;
// List of libraries (for selection )
wxListBox* m_libList; // The list of libs
int m_libListWidth; // Last width of the window
// List of components in the selected library
wxListBox* m_cmpList; // The list of components
int m_cmpListWidth; // Last width of the window
// Flags
wxSemaphore* m_semaphore; // != NULL if the frame must emulate a modal dialog
wxString m_configPath; // subpath for configuration
protected:
static wxString m_libraryName;
static wxString m_entryName;
static wxString m_exportToEeschemaCmpName; // When the viewer is used to select a component
// in schematic, the selected component is here
static int m_unit;
static int m_convert;
public: public:
LIB_VIEW_FRAME( SCH_BASE_FRAME* aParent, CMP_LIBRARY* aLibrary = NULL, LIB_VIEW_FRAME( SCH_BASE_FRAME* aParent, CMP_LIBRARY* aLibrary = NULL,
wxSemaphore* aSemaphore = NULL, wxSemaphore* aSemaphore = NULL,
@ -134,11 +111,26 @@ public:
*/ */
void SaveSettings(); void SaveSettings();
wxString& GetEntryName( void ) const { return m_entryName; } /**
wxString& GetSelectedComponent( void ) const { return m_exportToEeschemaCmpName; } * Set the selected library in the library window.
*
* @param aLibName name of the library to be selected.
*/
void SetSelectedLibrary( const wxString& aLibName );
static int GetUnit( void ) { return m_unit; } /**
static int GetConvert( void ) { return m_convert; } * Set the selected component.
*
* @param the alias name of the component to be selected.
*/
void SetSelectedComponent( const wxString& aComponentName );
const wxString& GetSelectedComponent( void ) const { return m_exportToEeschemaCmpName; }
void SetUnit( int aUnit ) { m_unit = aUnit; }
int GetUnit( void ) { return m_unit; }
void SetConvert( int aConvert ) { m_convert = aConvert; }
int GetConvert( void ) { return m_convert; }
private: private:
/** /**
@ -160,6 +152,33 @@ private:
bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu );
void DClickOnCmpList( wxCommandEvent& event ); void DClickOnCmpList( wxCommandEvent& event );
wxComboBox* m_selpartBox;
// List of libraries (for selection )
wxListBox* m_libList; // The list of libs
int m_libListWidth; // Last width of the window
// List of components in the selected library
wxListBox* m_cmpList; // The list of components
int m_cmpListWidth; // Last width of the window
// Flags
wxSemaphore* m_semaphore; // != NULL if the frame must emulate a modal dialog
wxString m_configPath; // subpath for configuration
// TODO(hzeller): looks like these members were chosen to be static to survive different
// instances of this browser and communicate it to the next instance. This looks like an
// ugly hack, and should be solved differently.
static wxString m_libraryName;
// TODO(hzeller): figure out what the difference between these is and the motivation to
// have this distinction. Shouldn't these essentially be the same ?
static wxString m_entryName;
static wxString m_exportToEeschemaCmpName; // When the viewer is used to select a component
// in schematic, the selected component is here
static int m_unit;
static int m_convert;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };

View File

@ -31,7 +31,7 @@ class PAGE_INFO;
class TITLE_BLOCK; class TITLE_BLOCK;
class LIB_VIEW_FRAME; class LIB_VIEW_FRAME;
class LIB_EDIT_FRAME; class LIB_EDIT_FRAME;
class LIB_ALIAS;
/** /**
* Class SCH_BASE_FRAME * Class SCH_BASE_FRAME
@ -80,9 +80,15 @@ protected:
* Calls the library viewer to select component to import into schematic. * Calls the library viewer to select component to import into schematic.
* if the library viewer is currently running, it is closed and reopened * if the library viewer is currently running, it is closed and reopened
* in modal mode. * in modal mode.
* @param aPreslectedAlias Preselected component alias. NULL if none.
* @param aUnit Pointer to Unit-number. Input is the pre-selected unit, output
* is the finally selected unit by the user. Can be NULL.
* @param aConvert Pointer to deMorgan conversion. Input is what is pre-selected,
* output is the finally selected deMorgan type by the user.
* @return the component name * @return the component name
*/ */
wxString SelectComponentFromLibBrowser( void ); wxString SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedAlias,
int* aUnit, int* aConvert );
/** /**
* Function SelectComponentFromLib * Function SelectComponentFromLib

View File

@ -279,6 +279,7 @@ public:
void OnUpdateSelectAutoTrackWidth( wxUpdateUIEvent& aEvent ); void OnUpdateSelectAutoTrackWidth( wxUpdateUIEvent& aEvent );
void OnUpdateAutoPlaceModulesMode( wxUpdateUIEvent& aEvent ); void OnUpdateAutoPlaceModulesMode( wxUpdateUIEvent& aEvent );
void OnUpdateAutoPlaceTracksMode( wxUpdateUIEvent& aEvent ); void OnUpdateAutoPlaceTracksMode( wxUpdateUIEvent& aEvent );
void OnUpdateMuWaveToolbar( wxUpdateUIEvent& aEvent );
/** /**
* Function RecordMacros. * Function RecordMacros.

View File

@ -78,7 +78,7 @@ void LAUNCHER_PANEL::CreateCommandToolbar( void )
btn = AddBitmapButton( ID_TO_BITMAP_CONVERTER, KiBitmap( icon_bitmap2component_xpm ) ); btn = AddBitmapButton( ID_TO_BITMAP_CONVERTER, KiBitmap( icon_bitmap2component_xpm ) );
btn->SetToolTip( _( btn->SetToolTip( _(
"Bitmap2Component - Convert bitmap images to Eeschema\n" "Bitmap2Component - Convert bitmap images to Eeschema\n"
"or Pcbnew elements." ) ); "or Pcbnew elements" ) );
btn = AddBitmapButton( ID_TO_PCB_CALCULATOR, KiBitmap( icon_pcbcalculator_xpm ) ); btn = AddBitmapButton( ID_TO_PCB_CALCULATOR, KiBitmap( icon_pcbcalculator_xpm ) );
btn->SetToolTip( _( "Pcb calculator - Calculator for components, track width, etc." ) ); btn->SetToolTip( _( "Pcb calculator - Calculator for components, track width, etc." ) );

View File

@ -17,27 +17,31 @@
; General Product Description Definitions ; General Product Description Definitions
!define PRODUCT_NAME "KiCad" !define PRODUCT_NAME "KiCad"
!define PRODUCT_VERSION "2013.03.13" !define PRODUCT_VERSION "2014.03.05"
!define PRODUCT_WEB_SITE "http://iut-tice.ujf-grenoble.fr/kicad/" !define ALT_DOWNLOAD_WEB_SITE "http://iut-tice.ujf-grenoble.fr/kicad/"
!define SOURCEFORGE_WEB_SITE "http://kicad.sourceforge.net/" !define LIBRARIES_WEB_SITE "https://github.com/KiCad/"
!define KICAD_MAIN_SITE "www.kicad-pcb.org/"
!define COMPANY_NAME "" !define COMPANY_NAME ""
!define TRADE_MARKS "" !define TRADE_MARKS ""
!define COPYRIGHT "Kicad Developers Team" !define COPYRIGHT "Kicad Developers Team"
!define COMMENTS "" !define COMMENTS ""
!define HELP_WEB_SITE "http://groups.yahoo.com/group/kicad-users/" !define HELP_WEB_SITE "http://groups.yahoo.com/group/kicad-users/"
!define DEVEL_WEB_SITE "https://launchpad.net/~kicad-developers/" !define DEVEL_WEB_SITE "https://launchpad.net/kicad/"
!define WINGS3D_WEB_SITE "http://www.wings3d.com" !define WINGS3D_WEB_SITE "http://www.wings3d.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define UNINST_ROOT "HKLM" !define UNINST_ROOT "HKLM"
;Comment out the following SetCompressor command while testing this script ;Comment out the following SetCompressor command while testing this script
SetCompressor /final /solid lzma ;SetCompressor /final /solid lzma
CRCCheck force CRCCheck force
XPStyle on XPStyle on
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}_stable-${PRODUCT_VERSION}-BZR4000_Win_full_version.exe" OutFile "${PRODUCT_NAME}_stable-${PRODUCT_VERSION}-BZR4xxx_Win_full_version.exe"
InstallDir "$PROGRAMFILES\KiCad" ;InstallDir "$PROGRAMFILES\KiCad"
InstallDir "C:\KiCad"
ShowInstDetails hide ShowInstDetails hide
ShowUnInstDetails hide ShowUnInstDetails hide
@ -72,21 +76,25 @@ ShowUnInstDetails hide
!insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_INSTFILES
; Language files ; Language files
; - To add another language; add an insert macro line here and inlcude a language file as below ; - To add another language; add an insert macro line here and include a language file as below
; - This must be after all page macros have been inserted ; - This must be after all page macros have been inserted
!insertmacro MUI_LANGUAGE "English" ;first language is the default language !insertmacro MUI_LANGUAGE "English" ;first language is the default language
!insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "Italian"
!insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Polish"
!insertmacro MUI_LANGUAGE "Portuguese"
!insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "Dutch"
!insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Japanese" !insertmacro MUI_LANGUAGE "Japanese"
!include "English.nsh" !include "English.nsh"
!include "French.nsh" !include "French.nsh"
!include "Polish.nsh"
!include "Dutch.nsh" !include "Dutch.nsh"
!include "Russian.nsh" !include "Italian.nsh"
!include "Japanese.nsh" !include "Japanese.nsh"
!include "Polish.nsh"
!include "Portuguese.nsh"
!include "Russian.nsh"
; MUI end ------ ; MUI end ------
@ -150,20 +158,22 @@ SectionEnd
Section -CreateShortcuts Section -CreateShortcuts
SetOutPath $INSTDIR SetOutPath $INSTDIR
WriteIniStr "$INSTDIR\HomePage.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" WriteIniStr "$INSTDIR\HomePage.url" "InternetShortcut" "URL" "${KICAD_MAIN_SITE}"
WriteIniStr "$INSTDIR\SourceForge.url" "InternetShortcut" "URL" "${SOURCEFORGE_WEB_SITE}" WriteIniStr "$INSTDIR\AltDownloadSite.url" "InternetShortcut" "URL" "${ALT_DOWNLOAD_WEB_SITE}"
WriteIniStr "$INSTDIR\UserGroup.url" "InternetShortcut" "URL" "${HELP_WEB_SITE}" WriteIniStr "$INSTDIR\UserGroup.url" "InternetShortcut" "URL" "${HELP_WEB_SITE}"
WriteIniStr "$INSTDIR\DevelGroup.url" "InternetShortcut" "URL" "${DEVEL_WEB_SITE}" WriteIniStr "$INSTDIR\DevelGroup.url" "InternetShortcut" "URL" "${DEVEL_WEB_SITE}"
WriteIniStr "$INSTDIR\Wings3D.url" "InternetShortcut" "URL" "${WINGS3D_WEB_SITE}" WriteIniStr "$INSTDIR\LibrariesGroup.url" "InternetShortcut" "URL" "${LIBRARIES_WEB_SITE}"
WriteIniStr "$INSTDIR\Wings3D.url" "InternetShortcut" "URL" "${WINGS3D_WEB_SITE}"
SetShellVarContext all SetShellVarContext all
CreateDirectory "$SMPROGRAMS\KiCad" CreateDirectory "$SMPROGRAMS\KiCad"
CreateShortCut "$SMPROGRAMS\KiCad\Home Page.lnk" "$INSTDIR\HomePage.url" CreateShortCut "$SMPROGRAMS\KiCad\Home Page.lnk" "$INSTDIR\HomePage.url"
CreateShortCut "$SMPROGRAMS\KiCad\Kicad SourceForge.lnk" "$INSTDIR\SourceForge.url" CreateShortCut "$SMPROGRAMS\KiCad\Kicad Alternate Download.lnk" "$INSTDIR\AltDownloadSite.url"
CreateShortCut "$SMPROGRAMS\KiCad\Kicad Libraries.lnk" "$INSTDIR\LibrariesGroup.url"
CreateShortCut "$SMPROGRAMS\KiCad\Wings3D.lnk" "$INSTDIR\Wings3D.url"
CreateShortCut "$SMPROGRAMS\KiCad\User Group.lnk" "$INSTDIR\UserGroup.url" CreateShortCut "$SMPROGRAMS\KiCad\User Group.lnk" "$INSTDIR\UserGroup.url"
CreateShortCut "$SMPROGRAMS\KiCad\Devel Group.lnk" "$INSTDIR\DevelGroup.url" CreateShortCut "$SMPROGRAMS\KiCad\Devel Group.lnk" "$INSTDIR\DevelGroup.url"
CreateShortCut "$SMPROGRAMS\KiCad\Uninstall.lnk" "$INSTDIR\uninstaller.exe" CreateShortCut "$SMPROGRAMS\KiCad\Uninstall.lnk" "$INSTDIR\uninstaller.exe"
CreateShortCut "$SMPROGRAMS\KiCad\KiCad.lnk" "$INSTDIR\bin\kicad.exe" CreateShortCut "$SMPROGRAMS\KiCad\KiCad.lnk" "$INSTDIR\bin\kicad.exe"
CreateShortCut "$SMPROGRAMS\KiCad\Wings3D.lnk" "$INSTDIR\Wings3D.url"
CreateShortCut "$DESKTOP\KiCad.lnk" "$INSTDIR\bin\kicad.exe" CreateShortCut "$DESKTOP\KiCad.lnk" "$INSTDIR\bin\kicad.exe"
SectionEnd SectionEnd
@ -172,13 +182,13 @@ Section -CreateAddRemoveEntry
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "Publisher" "${COMPANY_NAME}" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "Publisher" "${COMPANY_NAME}"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstaller.exe" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstaller.exe"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${KICAD_MAIN_SITE}"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\bin\kicad.exe" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\bin\kicad.exe"
WriteRegDWORD ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "NoModify" "1" WriteRegDWORD ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "NoModify" "1"
WriteRegDWORD ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "NoRepair" "1" WriteRegDWORD ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "NoRepair" "1"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "Comments" "${COMMENTS}" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "Comments" "${COMMENTS}"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "HelpLink" "${HELP_WEB_SITE}" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "HelpLink" "${HELP_WEB_SITE}"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "${PRODUCT_WEB_SITE}" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "${KICAD_MAIN_SITE}"
WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" WriteRegStr ${UNINST_ROOT} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR"
WriteUninstaller "$INSTDIR\uninstaller.exe" WriteUninstaller "$INSTDIR\uninstaller.exe"
@ -213,6 +223,9 @@ Section Uninstall
;remove start menu shortcuts and web page links ;remove start menu shortcuts and web page links
SetShellVarContext all SetShellVarContext all
Delete "$SMPROGRAMS\KiCad\Home Page.lnk" Delete "$SMPROGRAMS\KiCad\Home Page.lnk"
Delete "$SMPROGRAMS\KiCad\Kicad Libraries.lnk"
Delete "$SMPROGRAMS\KiCad\Kicad Alternate Download.lnk"
Delete "$SMPROGRAMS\KiCad\Devel Group.lnk"
Delete "$SMPROGRAMS\KiCad\User Group.lnk" Delete "$SMPROGRAMS\KiCad\User Group.lnk"
Delete "$SMPROGRAMS\KiCad\Uninstall.lnk" Delete "$SMPROGRAMS\KiCad\Uninstall.lnk"
Delete "$SMPROGRAMS\KiCad\KiCad.lnk" Delete "$SMPROGRAMS\KiCad\KiCad.lnk"
@ -221,6 +234,9 @@ Section Uninstall
Delete "$INSTDIR\Wings3D.url" Delete "$INSTDIR\Wings3D.url"
Delete "$INSTDIR\HomePage.url" Delete "$INSTDIR\HomePage.url"
Delete "$INSTDIR\UserGroup.url" Delete "$INSTDIR\UserGroup.url"
Delete "$INSTDIR\AltDownloadSite.url"
Delete "$INSTDIR\DevelGroup.url"
Delete "$INSTDIR\LibrariesGroup.url"
RMDir "$SMPROGRAMS\KiCad" RMDir "$SMPROGRAMS\KiCad"
;remove all program files now ;remove all program files now

View File

@ -4,6 +4,10 @@ set( MAKE_LINK_MAPS false )
add_definitions( -DPCBNEW ) add_definitions( -DPCBNEW )
add_subdirectory(router) add_subdirectory(router)
# psnrouter depends on make_lexer outputs in common (bug # 1285878 )
add_dependencies( pnsrouter pcbcommon )
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripting ) file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripting )
find_package( SWIG REQUIRED ) find_package( SWIG REQUIRED )
@ -617,6 +621,13 @@ if( KICAD_SCRIPTING )
# fix bundle after copying wxpython, fixing and copying # fix bundle after copying wxpython, fixing and copying
add_dependencies( osx_fix_bundles pcbnew_copy_wxpython_scripting ) add_dependencies( osx_fix_bundles pcbnew_copy_wxpython_scripting )
if ( KICAD_SCRIPTING_MODULES )
#they do more or less the same job, avoid race between them
#Cmake copy goes in error otherwise
add_dependencies( pcbnew_copy_wxpython_scripting pcbnew_copy_wxpython_module )
endif()
endif() endif()
endif() endif()

View File

@ -184,23 +184,23 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
// Build candidate list // Build candidate list
// calculate also the area needed by these footprints // calculate also the area needed by these footprints
MODULE* Module = GetBoard()->m_Modules; MODULE* module = GetBoard()->m_Modules;
std::vector <MODULE*> moduleList; std::vector <MODULE*> moduleList;
for( ; Module != NULL; Module = Module->Next() ) for( ; module != NULL; module = module->Next() )
{ {
Module->CalculateBoundingBox(); module->CalculateBoundingBox();
if( outsideBrdFilter ) if( outsideBrdFilter )
{ {
if( bbox.Contains( Module->GetPosition() ) ) if( bbox.Contains( module->GetPosition() ) )
continue; continue;
} }
if( Module->IsLocked() ) if( module->IsLocked() )
continue; continue;
moduleList.push_back(Module); moduleList.push_back(module);
} }
if( moduleList.size() == 0 ) // Nothing to do if( moduleList.size() == 0 ) // Nothing to do
@ -216,18 +216,17 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
for( unsigned ii = 0; ii < moduleList.size(); ii++ ) for( unsigned ii = 0; ii < moduleList.size(); ii++ )
{ {
Module = moduleList[ii]; module = moduleList[ii];
// Undo: add copy of module to undo list // Undo: add copy of module to undo list
picker.SetItem( Module ); picker.SetItem( module );
picker.SetLink( Module->Clone() ); picker.SetLink( module->Clone() );
undoList.PushItem( picker ); undoList.PushItem( picker );
} }
// Extract and place footprints by sheet // Extract and place footprints by sheet
std::vector <MODULE*> moduleListBySheet; std::vector <MODULE*> moduleListBySheet;
std::vector <EDA_RECT> placementSheetAreas; std::vector <EDA_RECT> placementSheetAreas;
wxString curr_sheetPath ;
double subsurface; double subsurface;
double placementsurface = 0.0; double placementsurface = 0.0;
@ -253,22 +252,23 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
for( int pass = 0; pass < 2; pass++ ) for( int pass = 0; pass < 2; pass++ )
{ {
int subareaIdx = 0; int subareaIdx = 0;
curr_sheetPath = moduleList[0]->GetPath().BeforeLast( '/' );
moduleListBySheet.clear(); moduleListBySheet.clear();
subsurface = 0.0; subsurface = 0.0;
for( unsigned ii = 0; ii < moduleList.size(); ii++ ) for( unsigned ii = 0; ii < moduleList.size(); ii++ )
{ {
Module = moduleList[ii]; module = moduleList[ii];
bool iscurrPath = curr_sheetPath == moduleList[ii]->GetPath().BeforeLast( '/' ); bool islastItem = false;
if( iscurrPath ) if( ii == moduleList.size() - 1 ||
{ ( moduleList[ii]->GetPath().BeforeLast( '/' ) !=
moduleListBySheet.push_back( Module ); moduleList[ii+1]->GetPath().BeforeLast( '/' ) ) )
subsurface += Module->GetArea(); islastItem = true;
}
if( !iscurrPath || (ii == moduleList.size()-1) ) moduleListBySheet.push_back( module );
subsurface += module->GetArea();
if( islastItem )
{ {
// end of the footprint sublist relative to the same sheet path // end of the footprint sublist relative to the same sheet path
// calculate placement of the current sublist // calculate placement of the current sublist
@ -306,14 +306,9 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
sub_area.GetHeight(); sub_area.GetHeight();
} }
curr_sheetPath = moduleList[ii]->GetPath().BeforeLast( '/' ); // Prepare buffers for next sheet
subsurface = 0.0; subsurface = 0.0;
moduleListBySheet.clear(); moduleListBySheet.clear();
// Enter first module of next sheet
moduleListBySheet.push_back( Module );
subsurface += Module->GetArea();
subareaIdx++; subareaIdx++;
} }
} }
@ -350,7 +345,14 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
} }
// Sort function, used to group footprints by sheet.
// Footprints are sorted by their sheet path.
// (the full sheet path restricted to the time stamp of the sheet itself,
// without the time stamp of the footprint ).
static bool sortModulesbySheetPath( MODULE* ref, MODULE* compare ) static bool sortModulesbySheetPath( MODULE* ref, MODULE* compare )
{ {
return compare->GetPath().Cmp( ref->GetPath() ) < 0; if( ref->GetPath().Length() == compare->GetPath().Length() )
return ref->GetPath().BeforeLast( '/' ).Cmp( compare->GetPath().BeforeLast( '/' ) ) < 0;
return ref->GetPath().Length() < compare->GetPath().Length();
} }

View File

@ -23,6 +23,21 @@
#include <class_edge_mod.h> #include <class_edge_mod.h>
#include <convert_basic_shapes_to_polygon.h> #include <convert_basic_shapes_to_polygon.h>
// These variables are parameters used in addTextSegmToPoly.
// But addTextSegmToPoly is a call-back function,
// so we cannot send them as arguments.
int s_textWidth;
int s_textCircle2SegmentCount;
CPOLYGONS_LIST* s_cornerBuffer;
// This is a call back function, used by DrawGraphicText to draw the 3D text shape:
static void addTextSegmToPoly( int x0, int y0, int xf, int yf )
{
TransformRoundedEndsSegmentToPolygon( *s_cornerBuffer,
wxPoint( x0, y0), wxPoint( xf, yf ),
s_textCircle2SegmentCount, s_textWidth );
}
/* generate pads shapes on layer aLayer as polygons, /* generate pads shapes on layer aLayer as polygons,
* and adds these polygons to aCornerBuffer * and adds these polygons to aCornerBuffer
* aCornerBuffer = the buffer to store polygons * aCornerBuffer = the buffer to store polygons
@ -91,12 +106,16 @@ void MODULE::TransformGraphicShapesWithClearanceToPolygonSet(
int aCircleToSegmentsCount, int aCircleToSegmentsCount,
double aCorrectionFactor ) double aCorrectionFactor )
{ {
std::vector<TEXTE_MODULE *> texts; // List of TEXTE_MODULE to convert
EDGE_MODULE* outline; EDGE_MODULE* outline;
for( EDA_ITEM* item = GraphicalItems(); item != NULL; item = item->Next() ) for( EDA_ITEM* item = GraphicalItems(); item != NULL; item = item->Next() )
{ {
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
if( ((TEXTE_MODULE*)item)->GetLayer() == aLayer )
texts.push_back( (TEXTE_MODULE *) item );
break; break;
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
@ -153,6 +172,33 @@ void MODULE::TransformGraphicShapesWithClearanceToPolygonSet(
break; break;
} }
} }
// Convert texts sur modules
if( Reference().GetLayer() == aLayer && Reference().IsVisible() )
texts.push_back( &Reference() );
if( Value().GetLayer() == aLayer && Value().IsVisible() )
texts.push_back( &Value() );
s_cornerBuffer = &aCornerBuffer;
s_textCircle2SegmentCount = aCircleToSegmentsCount;
for( unsigned ii = 0; ii < texts.size(); ii++ )
{
TEXTE_MODULE *textmod = texts[ii];
s_textWidth = textmod->GetThickness() + ( 2 * aInflateValue );
wxSize size = textmod->GetSize();
if( textmod->IsMirrored() )
NEGATE( size.x );
DrawGraphicText( NULL, NULL, textmod->GetTextPosition(), BLACK,
textmod->GetText(), textmod->GetDrawRotation(), size,
textmod->GetHorizJustify(), textmod->GetVertJustify(),
textmod->GetThickness(), textmod->IsItalic(),
true, addTextSegmToPoly );
}
} }
/* Function TransformSolidAreasShapesToPolygonSet /* Function TransformSolidAreasShapesToPolygonSet
@ -257,20 +303,6 @@ void TEXTE_PCB::TransformBoundingBoxWithClearanceToPolygon(
* clearance when the circle is approximated by segment bigger or equal * clearance when the circle is approximated by segment bigger or equal
* to the real clearance value (usually near from 1.0) * to the real clearance value (usually near from 1.0)
*/ */
// These variables are parameters used in addTextSegmToPoly.
// But addTextSegmToPoly is a call-back function,
// so we cannot send them as arguments.
int s_textWidth;
int s_textCircle2SegmentCount;
CPOLYGONS_LIST* s_cornerBuffer;
// This is a call back function, used by DrawGraphicText to draw the 3D text shape:
static void addTextSegmToPoly( int x0, int y0, int xf, int yf )
{
TransformRoundedEndsSegmentToPolygon( *s_cornerBuffer,
wxPoint( x0, y0), wxPoint( xf, yf ),
s_textCircle2SegmentCount, s_textWidth );
}
void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet( void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet(
CPOLYGONS_LIST& aCornerBuffer, CPOLYGONS_LIST& aCornerBuffer,
@ -309,7 +341,7 @@ void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet(
} }
else else
{ {
DrawGraphicText( NULL, NULL, GetTextPosition(), (EDA_COLOR_T) color, DrawGraphicText( NULL, NULL, GetTextPosition(), color,
GetText(), GetOrientation(), size, GetText(), GetOrientation(), size,
GetHorizJustify(), GetVertJustify(), GetHorizJustify(), GetVertJustify(),
GetThickness(), IsItalic(), GetThickness(), IsItalic(),

View File

@ -47,6 +47,7 @@
#define PrecisionKey wxT( "DrilltPrecisionOpt" ) #define PrecisionKey wxT( "DrilltPrecisionOpt" )
#define MirrorKey wxT( "DrillMirrorYOpt" ) #define MirrorKey wxT( "DrillMirrorYOpt" )
#define MinimalHeaderKey wxT( "DrillMinHeader" ) #define MinimalHeaderKey wxT( "DrillMinHeader" )
#define MergePTHNPTHKey wxT( "DrillMergePTHNPTH" )
#define UnitDrillInchKey wxT( "DrillUnit" ) #define UnitDrillInchKey wxT( "DrillUnit" )
#define DrillOriginIsAuxAxisKey wxT( "DrillAuxAxis" ) #define DrillOriginIsAuxAxisKey wxT( "DrillAuxAxis" )
#define DrillMapFileTypeKey wxT( "DrillMapFileType" ) #define DrillMapFileTypeKey wxT( "DrillMapFileType" )
@ -68,7 +69,6 @@ void PCB_EDIT_FRAME::InstallDrillFrame( wxCommandEvent& event )
} }
DIALOG_GENDRILL::DIALOG_GENDRILL( PCB_EDIT_FRAME* parent ) : DIALOG_GENDRILL::DIALOG_GENDRILL( PCB_EDIT_FRAME* parent ) :
DIALOG_GENDRILL_BASE( parent ) DIALOG_GENDRILL_BASE( parent )
{ {
@ -88,6 +88,7 @@ int DIALOG_GENDRILL::m_UnitDrillIsInch = true;
int DIALOG_GENDRILL::m_ZerosFormat = EXCELLON_WRITER::DECIMAL_FORMAT; int DIALOG_GENDRILL::m_ZerosFormat = EXCELLON_WRITER::DECIMAL_FORMAT;
bool DIALOG_GENDRILL::m_MinimalHeader = false; bool DIALOG_GENDRILL::m_MinimalHeader = false;
bool DIALOG_GENDRILL::m_Mirror = false; bool DIALOG_GENDRILL::m_Mirror = false;
bool DIALOG_GENDRILL::m_Merge_PTH_NPTH = false;
bool DIALOG_GENDRILL::m_DrillOriginIsAuxAxis = false; bool DIALOG_GENDRILL::m_DrillOriginIsAuxAxis = false;
int DIALOG_GENDRILL::m_mapFileType = 1; int DIALOG_GENDRILL::m_mapFileType = 1;
@ -102,6 +103,7 @@ void DIALOG_GENDRILL::initDialog()
{ {
m_config->Read( ZerosFormatKey, &m_ZerosFormat ); m_config->Read( ZerosFormatKey, &m_ZerosFormat );
m_config->Read( MirrorKey, &m_Mirror ); m_config->Read( MirrorKey, &m_Mirror );
m_config->Read( MergePTHNPTHKey, &m_Merge_PTH_NPTH );
m_config->Read( MinimalHeaderKey, &m_MinimalHeader ); m_config->Read( MinimalHeaderKey, &m_MinimalHeader );
m_config->Read( UnitDrillInchKey, &m_UnitDrillIsInch ); m_config->Read( UnitDrillInchKey, &m_UnitDrillIsInch );
m_config->Read( DrillOriginIsAuxAxisKey, &m_DrillOriginIsAuxAxis ); m_config->Read( DrillOriginIsAuxAxisKey, &m_DrillOriginIsAuxAxis );
@ -124,6 +126,7 @@ void DIALOG_GENDRILL::InitDisplayParams()
m_Choice_Drill_Offset->SetSelection( 1 ); m_Choice_Drill_Offset->SetSelection( 1 );
m_Check_Mirror->SetValue( m_Mirror ); m_Check_Mirror->SetValue( m_Mirror );
m_Check_Merge_PTH_NPTH->SetValue( m_Merge_PTH_NPTH );
m_Choice_Drill_Map->SetSelection( m_mapFileType ); m_Choice_Drill_Map->SetSelection( m_mapFileType );
m_ViaDrillValue->SetLabel( _( "Use Netclasses values" ) ); m_ViaDrillValue->SetLabel( _( "Use Netclasses values" ) );
m_MicroViaDrillValue->SetLabel( _( "Use Netclasses values" ) ); m_MicroViaDrillValue->SetLabel( _( "Use Netclasses values" ) );
@ -213,6 +216,7 @@ void DIALOG_GENDRILL::UpdateConfig()
m_config->Write( ZerosFormatKey, m_ZerosFormat ); m_config->Write( ZerosFormatKey, m_ZerosFormat );
m_config->Write( MirrorKey, m_Mirror ); m_config->Write( MirrorKey, m_Mirror );
m_config->Write( MinimalHeaderKey, m_MinimalHeader ); m_config->Write( MinimalHeaderKey, m_MinimalHeader );
m_config->Write( MergePTHNPTHKey, m_Merge_PTH_NPTH );
m_config->Write( UnitDrillInchKey, m_UnitDrillIsInch ); m_config->Write( UnitDrillInchKey, m_UnitDrillIsInch );
m_config->Write( DrillOriginIsAuxAxisKey, m_DrillOriginIsAuxAxis ); m_config->Write( DrillOriginIsAuxAxisKey, m_DrillOriginIsAuxAxis );
m_config->Write( DrillMapFileTypeKey, m_mapFileType ); m_config->Write( DrillMapFileTypeKey, m_mapFileType );
@ -229,6 +233,7 @@ void DIALOG_GENDRILL::OnGenMapFile( wxCommandEvent& event )
GenDrillAndMapFiles( false, true); GenDrillAndMapFiles( false, true);
} }
void DIALOG_GENDRILL::OnGenDrillFile( wxCommandEvent& event ) void DIALOG_GENDRILL::OnGenDrillFile( wxCommandEvent& event )
{ {
GenDrillAndMapFiles(true, false); GenDrillAndMapFiles(true, false);
@ -264,6 +269,7 @@ void DIALOG_GENDRILL::UpdatePrecisionOptions()
m_staticTextPrecision->Enable( true ); m_staticTextPrecision->Enable( true );
} }
void DIALOG_GENDRILL::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) void DIALOG_GENDRILL::OnOutputDirectoryBrowseClicked( wxCommandEvent& event )
{ {
// Build the absolute path of current output plot directory // Build the absolute path of current output plot directory
@ -292,14 +298,14 @@ void DIALOG_GENDRILL::OnOutputDirectoryBrowseClicked( wxCommandEvent& event )
wxString boardFilePath = ( (wxFileName) m_parent->GetBoard()->GetFileName() ).GetPath(); wxString boardFilePath = ( (wxFileName) m_parent->GetBoard()->GetFileName() ).GetPath();
if( !dirName.MakeRelativeTo( boardFilePath ) ) if( !dirName.MakeRelativeTo( boardFilePath ) )
wxMessageBox( _( wxMessageBox( _( "Cannot make path relative. The target volume is different from board file volume!" ),
"Cannot make path relative (target volume different from board file volume)!" ),
_( "Plot Output Directory" ), wxOK | wxICON_ERROR ); _( "Plot Output Directory" ), wxOK | wxICON_ERROR );
} }
m_outputDirectoryName->SetValue( dirName.GetFullPath() ); m_outputDirectoryName->SetValue( dirName.GetFullPath() );
} }
void DIALOG_GENDRILL::SetParams() void DIALOG_GENDRILL::SetParams()
{ {
wxString msg; wxString msg;
@ -315,6 +321,7 @@ void DIALOG_GENDRILL::SetParams()
m_UnitDrillIsInch = (m_Choice_Unit->GetSelection() == 0) ? false : true; m_UnitDrillIsInch = (m_Choice_Unit->GetSelection() == 0) ? false : true;
m_MinimalHeader = m_Check_Minimal->IsChecked(); m_MinimalHeader = m_Check_Minimal->IsChecked();
m_Mirror = m_Check_Mirror->IsChecked(); m_Mirror = m_Check_Mirror->IsChecked();
m_Merge_PTH_NPTH = m_Check_Merge_PTH_NPTH->IsChecked();
m_ZerosFormat = m_Choice_Zeros_Format->GetSelection(); m_ZerosFormat = m_Choice_Zeros_Format->GetSelection();
m_DrillOriginIsAuxAxis = m_Choice_Drill_Offset->GetSelection(); m_DrillOriginIsAuxAxis = m_Choice_Drill_Offset->GetSelection();
@ -331,16 +338,7 @@ void DIALOG_GENDRILL::SetParams()
m_board->SetPlotOptions( m_plotOpts ); m_board->SetPlotOptions( m_plotOpts );
} }
/**
* Function GenDrillAndMapFiles
* Calls the functions to create EXCELLON drill files and/or drill map files
* >When all holes are through holes, only one excellon file is created.
* >When there are some partial holes (some blind or buried vias),
* one excellon file is created, for all plated through holes,
* and one file per layer pair, which have one or more holes, excluding
* through holes, already in the first file.
* one file for all Not Plated through holes
*/
void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap) void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap)
{ {
wxString layer_extend; /* added to the Board FileName to wxString layer_extend; /* added to the Board FileName to
@ -369,14 +367,14 @@ void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap)
excellonWriter.SetFormat( !m_UnitDrillIsInch, excellonWriter.SetFormat( !m_UnitDrillIsInch,
(EXCELLON_WRITER::zeros_fmt) m_ZerosFormat, (EXCELLON_WRITER::zeros_fmt) m_ZerosFormat,
m_Precision.m_lhs, m_Precision.m_rhs ); m_Precision.m_lhs, m_Precision.m_rhs );
excellonWriter.SetOptions( m_Mirror, m_MinimalHeader, m_FileDrillOffset ); excellonWriter.SetOptions( m_Mirror, m_MinimalHeader, m_FileDrillOffset, m_Merge_PTH_NPTH );
wxFileName fn; wxFileName fn;
for( ; ; ) for( ; ; )
{ {
excellonWriter.BuildHolesList( layer1, layer2, excellonWriter.BuildHolesList( layer1, layer2, gen_through_holes ? false : true,
gen_through_holes ? false : true, gen_NPTH_holes ); gen_NPTH_holes, m_Merge_PTH_NPTH );
if( excellonWriter.GetHolesCount() > 0 ) // has holes? if( excellonWriter.GetHolesCount() > 0 ) // has holes?
{ {
@ -393,6 +391,7 @@ void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap)
layer_extend << wxT( "-back" ); layer_extend << wxT( "-back" );
else else
layer_extend << wxT( "-inner" ) << layer1; layer_extend << wxT( "-inner" ) << layer1;
if( layer2 == LAYER_N_FRONT ) if( layer2 == LAYER_N_FRONT )
layer_extend << wxT( "-front" ); layer_extend << wxT( "-front" );
else else
@ -401,6 +400,7 @@ void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap)
fn.SetName( fn.GetName() + layer_extend ); fn.SetName( fn.GetName() + layer_extend );
wxString defaultPath = m_plotOpts.GetOutputDirectory(); wxString defaultPath = m_plotOpts.GetOutputDirectory();
if( defaultPath.IsEmpty() ) if( defaultPath.IsEmpty() )
defaultPath = ::wxGetCwd(); defaultPath = ::wxGetCwd();
@ -466,6 +466,7 @@ void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap)
gen_NPTH_holes = true; gen_NPTH_holes = true;
continue; continue;
} }
layer1++; layer1++;
layer2++; // use next layer pair layer2++; // use next layer pair
@ -482,11 +483,6 @@ void DIALOG_GENDRILL::GenDrillAndMapFiles(bool aGenDrill, bool aGenMap)
} }
/*
* Create a plain text report file giving a list of drill values and drill count
* for through holes, oblong holes, and for buried vias,
* drill values and drill count per layer pair
*/
void DIALOG_GENDRILL::OnGenReportFile( wxCommandEvent& event ) void DIALOG_GENDRILL::OnGenReportFile( wxCommandEvent& event )
{ {
UpdateConfig(); // set params and Save drill options UpdateConfig(); // set params and Save drill options
@ -497,6 +493,7 @@ void DIALOG_GENDRILL::OnGenReportFile( wxCommandEvent& event )
fn.SetExt( ReportFileExtension ); fn.SetExt( ReportFileExtension );
wxString defaultPath = m_plotOpts.GetOutputDirectory(); wxString defaultPath = m_plotOpts.GetOutputDirectory();
if( defaultPath.IsEmpty() ) if( defaultPath.IsEmpty() )
defaultPath = ::wxGetCwd(); defaultPath = ::wxGetCwd();
@ -512,7 +509,7 @@ void DIALOG_GENDRILL::OnGenReportFile( wxCommandEvent& event )
excellonWriter.SetFormat( !m_UnitDrillIsInch, excellonWriter.SetFormat( !m_UnitDrillIsInch,
(EXCELLON_WRITER::zeros_fmt) m_ZerosFormat, (EXCELLON_WRITER::zeros_fmt) m_ZerosFormat,
m_Precision.m_lhs, m_Precision.m_rhs ); m_Precision.m_lhs, m_Precision.m_rhs );
excellonWriter.SetOptions( m_Mirror, m_MinimalHeader, m_FileDrillOffset ); excellonWriter.SetOptions( m_Mirror, m_MinimalHeader, m_FileDrillOffset, m_Merge_PTH_NPTH );
bool success = excellonWriter.GenDrillReportFile( dlg.GetPath() ); bool success = excellonWriter.GenDrillReportFile( dlg.GetPath() );
@ -572,7 +569,7 @@ void DIALOG_GENDRILL::GenDrillMap( const wxString aFullFileNameWithoutExt,
break; break;
default: default:
wxLogMessage( wxT( "DIALOG_GENDRILL::GenDrillMap() error, fmt % unkown" ), format ); wxLogMessage( wxT( "DIALOG_GENDRILL::GenDrillMap() error, fmt % unknown" ), format );
return; return;
} }
@ -581,15 +578,14 @@ void DIALOG_GENDRILL::GenDrillMap( const wxString aFullFileNameWithoutExt,
fullFilename << wxT(".") << ext; fullFilename << wxT(".") << ext;
bool success = aExcellonWriter.GenDrillMapFile( fullFilename, bool success = aExcellonWriter.GenDrillMapFile( fullFilename,
m_parent->GetPageSettings(), m_parent->GetPageSettings(),
format ); format );
wxString msg; wxString msg;
if( ! success ) if( ! success )
{ {
msg.Printf( _( "** Unable to create %s **\n" ), msg.Printf( _( "** Unable to create %s **\n" ), GetChars( fullFilename ) );
GetChars( fullFilename ) );
m_messagesBox->AppendText( msg ); m_messagesBox->AppendText( msg );
return; return;
} }
@ -598,5 +594,4 @@ void DIALOG_GENDRILL::GenDrillMap( const wxString aFullFileNameWithoutExt,
msg.Printf( _( "Plot: %s OK\n" ), GetChars( fullFilename ) ); msg.Printf( _( "Plot: %s OK\n" ), GetChars( fullFilename ) );
m_messagesBox->AppendText( msg ); m_messagesBox->AppendText( msg );
} }
} }

View File

@ -41,6 +41,7 @@ public:
static int m_ZerosFormat; static int m_ZerosFormat;
static bool m_MinimalHeader; static bool m_MinimalHeader;
static bool m_Mirror; static bool m_Mirror;
static bool m_Merge_PTH_NPTH;
static bool m_DrillOriginIsAuxAxis; /* Axis selection (main / auxiliary) static bool m_DrillOriginIsAuxAxis; /* Axis selection (main / auxiliary)
* for drill origin coordinates */ * for drill origin coordinates */
DRILL_PRECISION m_Precision; // Selected precision for drill files DRILL_PRECISION m_Precision; // Selected precision for drill files
@ -69,15 +70,34 @@ private:
// event functions // event functions
void OnSelDrillUnitsSelected( wxCommandEvent& event ); void OnSelDrillUnitsSelected( wxCommandEvent& event );
void OnSelZerosFmtSelected( wxCommandEvent& event ); void OnSelZerosFmtSelected( wxCommandEvent& event );
void OnGenDrillFile( wxCommandEvent& event ); void OnGenDrillFile( wxCommandEvent& event );
void OnGenMapFile( wxCommandEvent& event ); void OnGenMapFile( wxCommandEvent& event );
void OnGenReportFile( wxCommandEvent& event );
/*
* Create a plain text report file giving a list of drill values and drill count
* for through holes, oblong holes, and for buried vias,
* drill values and drill count per layer pair
*/
void OnGenReportFile( wxCommandEvent& event );
void OnCancelClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event );
void OnOutputDirectoryBrowseClicked( wxCommandEvent& event ); void OnOutputDirectoryBrowseClicked( wxCommandEvent& event );
// Specific functions: // Specific functions:
void SetParams( void ); void SetParams( void );
void GenDrillAndMapFiles(bool aGenDrill, bool aGenMap);
/**
* Function GenDrillAndMapFiles
* Calls the functions to create EXCELLON drill files and/or drill map files
* >When all holes are through holes, only one excellon file is created.
* >When there are some partial holes (some blind or buried vias),
* one excellon file is created, for all plated through holes,
* and one file per layer pair, which have one or more holes, excluding
* through holes, already in the first file.
* one file for all Not Plated through holes
*/
void GenDrillAndMapFiles( bool aGenDrill, bool aGenMap );
void GenDrillMap( const wxString aFileName, void GenDrillMap( const wxString aFileName,
EXCELLON_WRITER& aExcellonWriter, EXCELLON_WRITER& aExcellonWriter,
PlotFormat format ); PlotFormat format );

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Oct 8 2012) // C++ code generated with wxFormBuilder (version Feb 26 2014)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -88,6 +88,9 @@ DIALOG_GENDRILL_BASE::DIALOG_GENDRILL_BASE( wxWindow* parent, wxWindowID id, con
m_Check_Minimal = new wxCheckBox( this, wxID_ANY, _("Minimal header"), wxDefaultPosition, wxDefaultSize, 0 ); m_Check_Minimal = new wxCheckBox( this, wxID_ANY, _("Minimal header"), wxDefaultPosition, wxDefaultSize, 0 );
sbOptSizer->Add( m_Check_Minimal, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); sbOptSizer->Add( m_Check_Minimal, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_Check_Merge_PTH_NPTH = new wxCheckBox( this, wxID_ANY, _("Merge PTH and NPTH holes into one file"), wxDefaultPosition, wxDefaultSize, 0 );
sbOptSizer->Add( m_Check_Merge_PTH_NPTH, 0, wxALL, 5 );
bMiddleBoxSizer->Add( sbOptSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); bMiddleBoxSizer->Add( sbOptSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );

View File

@ -20,8 +20,10 @@
<property name="path">.</property> <property name="path">.</property>
<property name="precompiled_header"></property> <property name="precompiled_header"></property>
<property name="relative_path">1</property> <property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property> <property name="skip_php_events">1</property>
<property name="skip_python_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_enum">0</property>
<property name="use_microsoft_bom">0</property> <property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1"> <object class="Dialog" expanded="1">
@ -879,6 +881,94 @@
<event name="OnUpdateUI"></event> <event name="OnUpdateUI"></event>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxCheckBox" 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="checked">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">Merge PTH and NPTH holes into one file</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_Check_Merge_PTH_NPTH</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="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCheckBox"></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> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Oct 8 2012) // C++ code generated with wxFormBuilder (version Feb 26 2014)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -48,6 +48,7 @@ class DIALOG_GENDRILL_BASE : public DIALOG_SHIM
wxRadioBox* m_Choice_Drill_Map; wxRadioBox* m_Choice_Drill_Map;
wxCheckBox* m_Check_Mirror; wxCheckBox* m_Check_Mirror;
wxCheckBox* m_Check_Minimal; wxCheckBox* m_Check_Minimal;
wxCheckBox* m_Check_Merge_PTH_NPTH;
wxRadioBox* m_Choice_Drill_Offset; wxRadioBox* m_Choice_Drill_Offset;
wxStaticBoxSizer* m_DefaultViasDrillSizer; wxStaticBoxSizer* m_DefaultViasDrillSizer;
wxStaticText* m_ViaDrillValue; wxStaticText* m_ViaDrillValue;

View File

@ -237,6 +237,10 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
m_show_microwave_tools = state; m_show_microwave_tools = state;
m_auimgr.GetPane( wxT( "m_microWaveToolBar" ) ).Show( m_show_microwave_tools ); m_auimgr.GetPane( wxT( "m_microWaveToolBar" ) ).Show( m_show_microwave_tools );
m_auimgr.Update(); m_auimgr.Update();
GetMenuBar()->SetLabel( ID_MENU_PCB_SHOW_HIDE_MUWAVE_TOOLBAR,
m_show_microwave_tools ?
_( "Hide Microwave Toolbar" ): _( "Show Microwave Toolbar" ));
break; break;
case ID_TB_OPTIONS_SHOW_MANAGE_LAYERS_VERTICAL_TOOLBAR: case ID_TB_OPTIONS_SHOW_MANAGE_LAYERS_VERTICAL_TOOLBAR:

View File

@ -27,9 +27,11 @@ DIALOG_GLOBAL_DELETION::DIALOG_GLOBAL_DELETION( PCB_EDIT_FRAME* parent )
m_TrackFilterLocked->Enable( m_DelTracks->GetValue() ); m_TrackFilterLocked->Enable( m_DelTracks->GetValue() );
m_TrackFilterNormal->Enable( m_DelTracks->GetValue() ); m_TrackFilterNormal->Enable( m_DelTracks->GetValue() );
m_TrackFilterVias->Enable( m_DelTracks->GetValue() ); m_TrackFilterVias->Enable( m_DelTracks->GetValue() );
m_ModuleFilterLocked->Enable( m_DelModules->GetValue() );
m_ModuleFilterNormal->Enable( m_DelModules->GetValue() );
SetFocus(); SetFocus();
GetSizer()->SetSizeHints(this); GetSizer()->SetSizeHints( this );
Centre(); Centre();
} }
@ -42,12 +44,14 @@ void PCB_EDIT_FRAME::InstallPcbGlobalDeleteFrame( const wxPoint& pos )
dlg.ShowModal(); dlg.ShowModal();
} }
void DIALOG_GLOBAL_DELETION::SetCurrentLayer( LAYER_NUM aLayer ) void DIALOG_GLOBAL_DELETION::SetCurrentLayer( LAYER_NUM aLayer )
{ {
m_currentLayer = aLayer; m_currentLayer = aLayer;
m_textCtrlCurrLayer->SetValue( m_Parent->GetBoard()->GetLayerName( aLayer ) ); m_textCtrlCurrLayer->SetValue( m_Parent->GetBoard()->GetLayerName( aLayer ) );
} }
void DIALOG_GLOBAL_DELETION::OnCheckDeleteTracks( wxCommandEvent& event ) void DIALOG_GLOBAL_DELETION::OnCheckDeleteTracks( wxCommandEvent& event )
{ {
m_TrackFilterAR->Enable( m_DelTracks->GetValue() ); m_TrackFilterAR->Enable( m_DelTracks->GetValue() );
@ -56,6 +60,14 @@ void DIALOG_GLOBAL_DELETION::OnCheckDeleteTracks( wxCommandEvent& event )
m_TrackFilterVias->Enable( m_DelTracks->GetValue() ); m_TrackFilterVias->Enable( m_DelTracks->GetValue() );
} }
void DIALOG_GLOBAL_DELETION::OnCheckDeleteModules( wxCommandEvent& event )
{
m_ModuleFilterLocked->Enable( m_DelModules->GetValue() );
m_ModuleFilterNormal->Enable( m_DelModules->GetValue() );
}
void DIALOG_GLOBAL_DELETION::AcceptPcbDelete( ) void DIALOG_GLOBAL_DELETION::AcceptPcbDelete( )
{ {
bool gen_rastnest = false; bool gen_rastnest = false;
@ -68,72 +80,102 @@ void DIALOG_GLOBAL_DELETION::AcceptPcbDelete( )
} }
else else
{ {
if( !IsOK( this, _( "OK to delete selected items ?" ) ) )
if( !IsOK( this, _( "Are you sure you want to delete the selected items?" ) ) )
return; return;
BOARD * pcb = m_Parent->GetBoard(); BOARD* pcb = m_Parent->GetBoard();
PICKED_ITEMS_LIST pickersList; PICKED_ITEMS_LIST pickersList;
ITEM_PICKER itemPicker( NULL, UR_DELETED ); ITEM_PICKER itemPicker( NULL, UR_DELETED );
BOARD_ITEM* item, * nextitem; BOARD_ITEM* item, * nextitem;
if( m_DelZones->GetValue() )
{
gen_rastnest = true;
/* SEG_ZONE items used in Zone filling selection are now deprecated :
* and are deleted but not put in undo buffer if exist
*/
pcb->m_Zone.DeleteAll();
while( pcb->GetAreaCount() )
{
item = pcb->GetArea( 0 );
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker );
pcb->Remove( item );
}
}
LAYER_MSK masque_layer = NO_LAYERS;
LAYER_MSK layers_filter = ALL_LAYERS; LAYER_MSK layers_filter = ALL_LAYERS;
if( m_rbLayersOption->GetSelection() != 0 ) // Use current layer only if( m_rbLayersOption->GetSelection() != 0 ) // Use current layer only
layers_filter = GetLayerMask( m_currentLayer ); layers_filter = GetLayerMask( m_currentLayer );
if( m_DelZones->GetValue() )
if( m_DelDrawings->GetValue() )
masque_layer = (~EDGE_LAYER) & ALL_NO_CU_LAYERS;
if( m_DelBoardEdges->GetValue() )
masque_layer |= EDGE_LAYER;
layers_filter &= layers_filter;
for( item = pcb->m_Drawings; item != NULL; item = nextitem )
{ {
nextitem = item->Next(); int area_index = 0;
bool removeme = GetLayerMask( item->GetLayer() ) & masque_layer; item = pcb->GetArea( area_index );
if( ( item->Type() == PCB_TEXT_T ) && m_DelTexts->GetValue() ) while( item != NULL )
removeme = true;
if( removeme )
{ {
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker ); if( GetLayerMask( item->GetLayer() ) & layers_filter )
item->UnLink(); {
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker );
pcb->Remove( item );
gen_rastnest = true;
}
else
{
area_index++;
}
item = pcb->GetArea( area_index );
}
}
if( m_DelDrawings->GetValue() || m_DelBoardEdges->GetValue() )
{
LAYER_MSK masque_layer = NO_LAYERS;
if( m_DelDrawings->GetValue() )
masque_layer = (~EDGE_LAYER) & ALL_NO_CU_LAYERS;
if( m_DelBoardEdges->GetValue() )
masque_layer |= EDGE_LAYER;
masque_layer &= layers_filter;
for( item = pcb->m_Drawings; item != NULL; item = nextitem )
{
nextitem = item->Next();
if( ( item->Type() == PCB_LINE_T ) && ( GetLayerMask( item->GetLayer() ) & masque_layer) )
{
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker );
item->UnLink();
}
}
}
if( m_DelTexts->GetValue() )
{
LAYER_MSK del_text_layers = ALL_LAYERS & layers_filter;
for( item = pcb->m_Drawings; item != NULL; item = nextitem )
{
nextitem = item->Next();
if( ( item->Type() == PCB_TEXT_T ) && ( GetLayerMask( item->GetLayer() ) & del_text_layers ) )
{
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker );
item->UnLink();
}
} }
} }
if( m_DelModules->GetValue() ) if( m_DelModules->GetValue() )
{ {
gen_rastnest = true;
for( item = pcb->m_Modules; item; item = nextitem ) for( item = pcb->m_Modules; item; item = nextitem )
{ {
nextitem = item->Next(); nextitem = item->Next();
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker ); if( ( GetLayerMask( item->GetLayer() ) & layers_filter ) &&
item->UnLink(); ( ( m_ModuleFilterNormal->GetValue() && !item->IsLocked() ) ||
( m_ModuleFilterLocked->GetValue() && item->IsLocked() ) ) )
{
itemPicker.SetItem( item );
pickersList.PushItem( itemPicker );
item->UnLink();
gen_rastnest = true;
}
} }
} }
@ -148,6 +190,7 @@ void DIALOG_GLOBAL_DELETION::AcceptPcbDelete( )
track_mask_filter |= TRACK_AR; track_mask_filter |= TRACK_AR;
TRACK * nexttrack; TRACK * nexttrack;
for( TRACK *track = pcb->m_Track; track != NULL; track = nexttrack ) for( TRACK *track = pcb->m_Track; track != NULL; track = nexttrack )
{ {
nexttrack = track->Next(); nexttrack = track->Next();
@ -180,6 +223,7 @@ void DIALOG_GLOBAL_DELETION::AcceptPcbDelete( )
if( gen_rastnest ) if( gen_rastnest )
m_Parent->Compile_Ratsnest( NULL, true ); m_Parent->Compile_Ratsnest( NULL, true );
} }
m_Parent->GetCanvas()->Refresh(); m_Parent->GetCanvas()->Refresh();
@ -187,4 +231,3 @@ void DIALOG_GLOBAL_DELETION::AcceptPcbDelete( )
EndModal( 1 ); EndModal( 1 );
} }

View File

@ -30,6 +30,7 @@ private:
void AcceptPcbDelete(); void AcceptPcbDelete();
void OnCheckDeleteTracks( wxCommandEvent& event ); void OnCheckDeleteTracks( wxCommandEvent& event );
void OnCheckDeleteModules( wxCommandEvent& event );
}; };
#endif // _DIALOG_GLOBAL_DELETION_H_ #endif // _DIALOG_GLOBAL_DELETION_H_

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Oct 8 2012) // C++ code generated with wxFormBuilder (version Feb 26 2014)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -52,25 +52,32 @@ DIALOG_GLOBAL_DELETION_BASE::DIALOG_GLOBAL_DELETION_BASE( wxWindow* parent, wxWi
wxBoxSizer* bSizerRight; wxBoxSizer* bSizerRight;
bSizerRight = new wxBoxSizer( wxVERTICAL ); bSizerRight = new wxBoxSizer( wxVERTICAL );
sbTrackFilter = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Track Filter") ), wxVERTICAL ); sbFilter = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Filter Settings") ), wxVERTICAL );
m_TrackFilterAR = new wxCheckBox( this, wxID_ANY, _("Automatically routed tracks"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackFilterAR = new wxCheckBox( this, wxID_ANY, _("Automatically routed tracks"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackFilterAR->SetValue(true); m_TrackFilterAR->SetValue(true);
sbTrackFilter->Add( m_TrackFilterAR, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); sbFilter->Add( m_TrackFilterAR, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_TrackFilterLocked = new wxCheckBox( this, wxID_ANY, _("Locked tracks"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackFilterLocked = new wxCheckBox( this, wxID_ANY, _("Locked tracks"), wxDefaultPosition, wxDefaultSize, 0 );
sbTrackFilter->Add( m_TrackFilterLocked, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); sbFilter->Add( m_TrackFilterLocked, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_TrackFilterNormal = new wxCheckBox( this, wxID_ANY, _("Normal tracks"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackFilterNormal = new wxCheckBox( this, wxID_ANY, _("Unlocked tracks"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackFilterNormal->SetValue(true); m_TrackFilterNormal->SetValue(true);
sbTrackFilter->Add( m_TrackFilterNormal, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); sbFilter->Add( m_TrackFilterNormal, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_TrackFilterVias = new wxCheckBox( this, wxID_ANY, _("Vias"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackFilterVias = new wxCheckBox( this, wxID_ANY, _("Vias"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackFilterVias->SetValue(true); m_TrackFilterVias->SetValue(true);
sbTrackFilter->Add( m_TrackFilterVias, 0, wxALL, 5 ); sbFilter->Add( m_TrackFilterVias, 0, wxALL, 5 );
m_ModuleFilterLocked = new wxCheckBox( this, wxID_ANY, _("Locked footprints"), wxDefaultPosition, wxDefaultSize, 0 );
sbFilter->Add( m_ModuleFilterLocked, 0, wxALL, 5 );
m_ModuleFilterNormal = new wxCheckBox( this, wxID_ANY, _("Unlocked footprints"), wxDefaultPosition, wxDefaultSize, 0 );
m_ModuleFilterNormal->SetValue(true);
sbFilter->Add( m_ModuleFilterNormal, 0, wxALL, 5 );
bSizerRight->Add( sbTrackFilter, 0, wxALL|wxEXPAND, 5 ); bSizerRight->Add( sbFilter, 0, wxALL|wxEXPAND, 5 );
wxString m_rbLayersOptionChoices[] = { _("All layers"), _("Current layer only") }; wxString m_rbLayersOptionChoices[] = { _("All layers"), _("Current layer only") };
int m_rbLayersOptionNChoices = sizeof( m_rbLayersOptionChoices ) / sizeof( wxString ); int m_rbLayersOptionNChoices = sizeof( m_rbLayersOptionChoices ) / sizeof( wxString );
@ -112,6 +119,7 @@ DIALOG_GLOBAL_DELETION_BASE::DIALOG_GLOBAL_DELETION_BASE( wxWindow* parent, wxWi
this->Centre( wxBOTH ); this->Centre( wxBOTH );
// Connect Events // Connect Events
m_DelModules->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCheckDeleteModules ), NULL, this );
m_DelTracks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCheckDeleteTracks ), NULL, this ); m_DelTracks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCheckDeleteTracks ), NULL, this );
m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCancelClick ), NULL, this ); m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCancelClick ), NULL, this );
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnOkClick ), NULL, this ); m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnOkClick ), NULL, this );
@ -120,6 +128,7 @@ DIALOG_GLOBAL_DELETION_BASE::DIALOG_GLOBAL_DELETION_BASE( wxWindow* parent, wxWi
DIALOG_GLOBAL_DELETION_BASE::~DIALOG_GLOBAL_DELETION_BASE() DIALOG_GLOBAL_DELETION_BASE::~DIALOG_GLOBAL_DELETION_BASE()
{ {
// Disconnect Events // Disconnect Events
m_DelModules->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCheckDeleteModules ), NULL, this );
m_DelTracks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCheckDeleteTracks ), NULL, this ); m_DelTracks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCheckDeleteTracks ), NULL, this );
m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCancelClick ), NULL, this ); m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnCancelClick ), NULL, this );
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnOkClick ), NULL, this ); m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GLOBAL_DELETION_BASE::OnOkClick ), NULL, this );

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project> <wxFormBuilder_Project>
<FileVersion major="1" minor="11" /> <FileVersion major="1" minor="12" />
<object class="Project" expanded="1"> <object class="Project" expanded="1">
<property name="class_decoration"></property> <property name="class_decoration"></property>
<property name="code_generation">C++</property> <property name="code_generation">C++</property>
@ -20,8 +20,10 @@
<property name="path">.</property> <property name="path">.</property>
<property name="precompiled_header"></property> <property name="precompiled_header"></property>
<property name="relative_path">1</property> <property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property> <property name="skip_php_events">1</property>
<property name="skip_python_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_enum">0</property>
<property name="use_microsoft_bom">0</property> <property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1"> <object class="Dialog" expanded="1">
@ -527,7 +529,7 @@
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style"></property> <property name="window_style"></property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnCheckBox"></event> <event name="OnCheckBox">OnCheckDeleteModules</event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event> <event name="OnKeyDown"></event>
@ -833,9 +835,9 @@
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="1"> <object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="label">Track Filter</property> <property name="label">Filter Settings</property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">sbTrackFilter</property> <property name="name">sbFilter</property>
<property name="orient">wxVERTICAL</property> <property name="orient">wxVERTICAL</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<event name="OnUpdateUI"></event> <event name="OnUpdateUI"></event>
@ -1048,7 +1050,7 @@
<property name="gripper">0</property> <property name="gripper">0</property>
<property name="hidden">0</property> <property name="hidden">0</property>
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="label">Normal tracks</property> <property name="label">Unlocked tracks</property>
<property name="max_size"></property> <property name="max_size"></property>
<property name="maximize_button">0</property> <property name="maximize_button">0</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
@ -1191,6 +1193,182 @@
<event name="OnUpdateUI"></event> <event name="OnUpdateUI"></event>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxCheckBox" 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="checked">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">Locked footprints</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_ModuleFilterLocked</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="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCheckBox"></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">wxALL</property>
<property name="proportion">0</property>
<object class="wxCheckBox" 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="checked">1</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">Unlocked footprints</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_ModuleFilterNormal</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="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCheckBox"></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> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Oct 8 2012) // C++ code generated with wxFormBuilder (version Feb 26 2014)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -48,11 +48,13 @@ class DIALOG_GLOBAL_DELETION_BASE : public DIALOG_SHIM
wxCheckBox* m_DelTracks; wxCheckBox* m_DelTracks;
wxCheckBox* m_DelMarkers; wxCheckBox* m_DelMarkers;
wxCheckBox* m_DelAlls; wxCheckBox* m_DelAlls;
wxStaticBoxSizer* sbTrackFilter; wxStaticBoxSizer* sbFilter;
wxCheckBox* m_TrackFilterAR; wxCheckBox* m_TrackFilterAR;
wxCheckBox* m_TrackFilterLocked; wxCheckBox* m_TrackFilterLocked;
wxCheckBox* m_TrackFilterNormal; wxCheckBox* m_TrackFilterNormal;
wxCheckBox* m_TrackFilterVias; wxCheckBox* m_TrackFilterVias;
wxCheckBox* m_ModuleFilterLocked;
wxCheckBox* m_ModuleFilterNormal;
wxRadioBox* m_rbLayersOption; wxRadioBox* m_rbLayersOption;
wxStaticText* m_staticText1; wxStaticText* m_staticText1;
wxTextCtrl* m_textCtrlCurrLayer; wxTextCtrl* m_textCtrlCurrLayer;
@ -62,6 +64,7 @@ class DIALOG_GLOBAL_DELETION_BASE : public DIALOG_SHIM
wxButton* m_sdbSizer1Cancel; wxButton* m_sdbSizer1Cancel;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnCheckDeleteModules( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCheckDeleteTracks( wxCommandEvent& event ) { event.Skip(); } virtual void OnCheckDeleteTracks( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }

View File

@ -294,6 +294,7 @@ DIALOG_LAYERS_SETUP::DIALOG_LAYERS_SETUP( PCB_EDIT_FRAME* parent ) :
m_TitlePanel->SetMinSize( wxSize( -1, m_AdhesFrontName->GetSize().y+10 ) ); m_TitlePanel->SetMinSize( wxSize( -1, m_AdhesFrontName->GetSize().y+10 ) );
Layout(); Layout();
Fit();
Center(); Center();

View File

@ -681,13 +681,14 @@ bool DIALOG_PAD_PROPERTIES::padValuesOK()
{ {
if( m_dummyPad->GetDrillSize().x || m_dummyPad->GetDrillSize().y ) if( m_dummyPad->GetDrillSize().x || m_dummyPad->GetDrillSize().y )
{ {
msg = _( "Error: pad is not on a copper layer and has a hole" ); // Note: he message is shown in an HTML window
msg = _( "Error: the pad is not on a copper layer and has a hole" );
if( m_dummyPad->GetAttribute() == PAD_HOLE_NOT_PLATED ) if( m_dummyPad->GetAttribute() == PAD_HOLE_NOT_PLATED )
{ {
msg += wxT("\n"); msg += wxT("<br><br><i>");
msg += _( "For NPTH pad, set pad drill value to pad size value,\n" msg += _( "For NPTH pad, set pad size value to pad drill value,"
"if you do not want this pad plotted in gerber files" " if you do not want this pad plotted in gerber files"
); );
} }

View File

@ -360,7 +360,7 @@ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName )
for( ; ; ) for( ; ; )
{ {
BuildHolesList( layer1, layer2, BuildHolesList( layer1, layer2,
gen_through_holes ? false : true, gen_NPTH_holes ); gen_through_holes ? false : true, gen_NPTH_holes, false);
totalHoleCount = 0; totalHoleCount = 0;

View File

@ -442,11 +442,13 @@ static bool CmpHoleDiameterValue( const HOLE_INFO& a, const HOLE_INFO& b )
* param aGenerateNPTH_list : * param aGenerateNPTH_list :
* true to create NPTH only list (with no plated holes) * true to create NPTH only list (with no plated holes)
* false to created plated holes list (with no NPTH ) * false to created plated holes list (with no NPTH )
* param aMergePTHNPTH : if true, merge PTH and NPTH holes into one file by treating all holes as PTH
*/ */
void EXCELLON_WRITER::BuildHolesList( int aFirstLayer, void EXCELLON_WRITER::BuildHolesList( int aFirstLayer,
int aLastLayer, int aLastLayer,
bool aExcludeThroughHoles, bool aExcludeThroughHoles,
bool aGenerateNPTH_list ) bool aGenerateNPTH_list,
bool aMergePTHNPTH )
{ {
HOLE_INFO new_hole; HOLE_INFO new_hole;
int hole_value; int hole_value;
@ -460,6 +462,11 @@ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer,
EXCHG( aFirstLayer, aLastLayer ); EXCHG( aFirstLayer, aLastLayer );
} }
if ( aGenerateNPTH_list && aMergePTHNPTH )
{
return;
}
/* build hole list for vias /* build hole list for vias
*/ */
if( ! aGenerateNPTH_list ) // vias are always plated ! if( ! aGenerateNPTH_list ) // vias are always plated !
@ -507,7 +514,7 @@ void EXCELLON_WRITER::BuildHolesList( int aFirstLayer,
// Read and analyse pads // Read and analyse pads
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
if( ! aGenerateNPTH_list && pad->GetAttribute() == PAD_HOLE_NOT_PLATED ) if( ! aGenerateNPTH_list && pad->GetAttribute() == PAD_HOLE_NOT_PLATED && ! aMergePTHNPTH )
continue; continue;
if( aGenerateNPTH_list && pad->GetAttribute() != PAD_HOLE_NOT_PLATED ) if( aGenerateNPTH_list && pad->GetAttribute() != PAD_HOLE_NOT_PLATED )

View File

@ -135,6 +135,7 @@ private:
// (i.e inches or mm) // (i.e inches or mm)
bool m_mirror; bool m_mirror;
wxPoint m_offset; // Drill offset ooordinates wxPoint m_offset; // Drill offset ooordinates
bool m_mergePTHNPTH;
std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes std::vector<HOLE_INFO> m_holeListBuffer; // Buffer containing holes
std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools std::vector<DRILL_TOOL> m_toolListBuffer; // Buffer containing tools
@ -146,6 +147,7 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset )
m_conversionUnits = 0.0001; m_conversionUnits = 0.0001;
m_unitsDecimal = false; m_unitsDecimal = false;
m_mirror = false; m_mirror = false;
m_mergePTHNPTH = false;
m_minimalHeader = false; m_minimalHeader = false;
} }
@ -177,11 +179,12 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset )
* @param aMinimalHeader = true to use a minimal header (no comments, no info) * @param aMinimalHeader = true to use a minimal header (no comments, no info)
* @param aOffset = drill coordinates offset * @param aOffset = drill coordinates offset
*/ */
void SetOptions( bool aMirror, bool aMinimalHeader, wxPoint aOffset ) void SetOptions( bool aMirror, bool aMinimalHeader, wxPoint aOffset, bool aMergePTHNPTH )
{ {
m_mirror = aMirror; m_mirror = aMirror;
m_offset = aOffset; m_offset = aOffset;
m_minimalHeader = aMinimalHeader; m_minimalHeader = aMinimalHeader;
m_mergePTHNPTH = aMergePTHNPTH;
} }
/** /**
@ -199,7 +202,8 @@ public: EXCELLON_WRITER( BOARD* aPcb, wxPoint aOffset )
*/ */
void BuildHolesList( int aFirstLayer, int aLastLayer, void BuildHolesList( int aFirstLayer, int aLastLayer,
bool aExcludeThroughHoles, bool aExcludeThroughHoles,
bool aGenerateNPTH_list ); bool aGenerateNPTH_list,
bool aMergePTHNPTH );
int GetHolesCount() const { return m_holeListBuffer.size(); } int GetHolesCount() const { return m_holeListBuffer.size(); }

View File

@ -22,3 +22,5 @@
#define HELP_ZOOM_REDRAW _( "Redraw the screen of the board" ) #define HELP_ZOOM_REDRAW _( "Redraw the screen of the board" )
#define HELP_SHOW_HIDE_LAYERMANAGER _( "Show/hide the layers manager toolbar" ) #define HELP_SHOW_HIDE_LAYERMANAGER _( "Show/hide the layers manager toolbar" )
#define HELP_SHOW_HIDE_MICROWAVE_TOOLS _( "Show/hide the toolbar for microwave tools\nThis is a experimental feature (under development)" )

View File

@ -62,7 +62,7 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
wxMenu* fileMenu = new wxMenu; wxMenu* fileMenu = new wxMenu;
// Active library selection // Active library selection
AddMenuItem( fileMenu, ID_MODEDIT_SELECT_CURRENT_LIB, _("Current Library"), AddMenuItem( fileMenu, ID_MODEDIT_SELECT_CURRENT_LIB, _("Set Active Library"),
_( "Select active library" ), _( "Select active library" ),
KiBitmap( open_library_xpm ) ); KiBitmap( open_library_xpm ) );
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
@ -77,32 +77,32 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// from File // from File
AddMenuItem( openSubmenu, ID_MODEDIT_IMPORT_PART, AddMenuItem( openSubmenu, ID_MODEDIT_IMPORT_PART,
_( "&Import Module from File" ), _( "&Import Module From File" ),
_( "Import a footprint from an existing file" ), _( "Import footprint from an existing file" ),
KiBitmap( import_module_xpm ) ); KiBitmap( import_module_xpm ) );
// from Library // from Library
AddMenuItem( openSubmenu, ID_MODEDIT_LOAD_MODULE, AddMenuItem( openSubmenu, ID_MODEDIT_LOAD_MODULE,
_( "Load Module from Current Li&brary" ), _( "Load Module From Current Li&brary" ),
_( "Open a footprint module from a Library" ), _( "Open a footprint module from library" ),
KiBitmap( module_xpm ) ); KiBitmap( module_xpm ) );
// from current Board // from current Board
AddMenuItem( openSubmenu, ID_MODEDIT_LOAD_MODULE_FROM_BOARD, AddMenuItem( openSubmenu, ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
_( "Load Module from &Current Board" ), _( "Load Module From &Current Board" ),
_( "Load a footprint module from the current loaded board" ), _( "Load a footprint module from the current board" ),
KiBitmap( load_module_board_xpm ) ); KiBitmap( load_module_board_xpm ) );
/* Append openSubmenu to fileMenu */ /* Append openSubmenu to fileMenu */
AddMenuItem( fileMenu, openSubmenu, -1, AddMenuItem( fileMenu, openSubmenu, -1,
_( "&Load Module" ), _( "&Load Module" ),
_( "Load a footprint module" ), _( "Load footprint module" ),
KiBitmap( open_document_xpm ) ); KiBitmap( open_document_xpm ) );
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
// Save the currently loaded legacy library as an s-expression library. // Save the currently loaded legacy library as an s-expression library.
AddMenuItem( fileMenu, ID_MODEDIT_SAVE_LIBRARY_AS, AddMenuItem( fileMenu, ID_MODEDIT_SAVE_LIBRARY_AS,
_( "Save Current Library as ..." ), _( "Save Current Library As..." ),
_( "Save entire current library under a new name." ), _( "Save entire current library under a new name." ),
wxNullBitmap ); wxNullBitmap );
@ -116,21 +116,21 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Save module in new lib // Save module in new lib
AddMenuItem( fileMenu, ID_MODEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART, AddMenuItem( fileMenu, ID_MODEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART,
_( "S&ave Module into a New Library" ), _( "S&ave Module in New Library" ),
_( "Create a new library and save current module into it" ), _( "Create a new library and save current module into it" ),
KiBitmap( new_library_xpm ) ); KiBitmap( new_library_xpm ) );
// Export module // Export module
AddMenuItem( fileMenu, ID_MODEDIT_EXPORT_PART, AddMenuItem( fileMenu, ID_MODEDIT_EXPORT_PART,
_( "&Export Module" ), _( "&Export Module" ),
_( "Save the current loaded module to a file" ), _( "Save current loaded module into file" ),
KiBitmap( export_module_xpm ) ); KiBitmap( export_module_xpm ) );
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
// Print // Print
AddMenuItem( fileMenu, wxID_PRINT, AddMenuItem( fileMenu, wxID_PRINT,
_( "&Print" ), _( "&Print" ),
_( "Print the current module" ), _( "Print current module" ),
KiBitmap( plot_xpm ) ); KiBitmap( plot_xpm ) );
// Separator // Separator
@ -139,7 +139,7 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Close editor // Close editor
AddMenuItem( fileMenu, wxID_EXIT, AddMenuItem( fileMenu, wxID_EXIT,
_( "Cl&ose" ), _( "Cl&ose" ),
_( "Close the footprint editor" ), _( "Close footprint editor" ),
KiBitmap( exit_xpm ) ); KiBitmap( exit_xpm ) );
// Menu Edit: // Menu Edit:
@ -148,18 +148,18 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Undo // Undo
text = AddHotkeyName( _( "&Undo" ), g_Module_Editor_Hokeys_Descr, HK_UNDO ); text = AddHotkeyName( _( "&Undo" ), g_Module_Editor_Hokeys_Descr, HK_UNDO );
AddMenuItem( editMenu, wxID_UNDO, AddMenuItem( editMenu, wxID_UNDO,
text, _( "Undo last edit" ), text, _( "Undo last action" ),
KiBitmap( undo_xpm ) ); KiBitmap( undo_xpm ) );
// Redo // Redo
text = AddHotkeyName( _( "&Redo" ), g_Module_Editor_Hokeys_Descr, HK_REDO ); text = AddHotkeyName( _( "&Redo" ), g_Module_Editor_Hokeys_Descr, HK_REDO );
AddMenuItem( editMenu, wxID_REDO, AddMenuItem( editMenu, wxID_REDO,
text, _( "Redo the last undo action" ), text, _( "Redo last action" ),
KiBitmap( redo_xpm ) ); KiBitmap( redo_xpm ) );
// Delete items // Delete items
AddMenuItem( editMenu, ID_MODEDIT_DELETE_TOOL, AddMenuItem( editMenu, ID_MODEDIT_DELETE_TOOL,
_( "&Delete" ), _( "Delete objects with the eraser" ), _( "&Delete" ), _( "Delete objects with eraser" ),
KiBitmap( delete_xpm ) ); KiBitmap( delete_xpm ) );
// Separator // Separator
@ -167,7 +167,7 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Properties // Properties
AddMenuItem( editMenu, ID_MODEDIT_EDIT_MODULE_PROPERTIES, AddMenuItem( editMenu, ID_MODEDIT_EDIT_MODULE_PROPERTIES,
_( "&Properties" ), _( "Edit &Properties" ),
_( "Edit module properties" ), _( "Edit module properties" ),
KiBitmap( module_options_xpm ) ); KiBitmap( module_options_xpm ) );
@ -176,13 +176,13 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Sizes and Widths // Sizes and Widths
AddMenuItem( dimensions_Submenu, ID_PCB_DRAWINGS_WIDTHS_SETUP, AddMenuItem( dimensions_Submenu, ID_PCB_DRAWINGS_WIDTHS_SETUP,
_( "&Sizes and Widths" ), _( "&Size and Width" ),
_( "Adjust width for texts and drawings" ), _( "Adjust width for texts and drawings" ),
KiBitmap( options_text_xpm ) ); KiBitmap( options_text_xpm ) );
// Pad settings // Pad settings
AddMenuItem( dimensions_Submenu, ID_MODEDIT_PAD_SETTINGS, AddMenuItem( dimensions_Submenu, ID_MODEDIT_PAD_SETTINGS,
_( "&Pad Settings" ), _( "Edit the settings for new pads" ), _( "&Pad Setting" ), _( "Edit settings for new pads" ),
KiBitmap( pad_dimensions_xpm ) ); KiBitmap( pad_dimensions_xpm ) );
// User grid size // User grid size
@ -195,25 +195,25 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Zoom In // Zoom In
AddMenuItem( viewMenu, ID_ZOOM_IN, AddMenuItem( viewMenu, ID_ZOOM_IN,
_( "Zoom &In" ), _( "Zoom in on the module" ), _( "Zoom &In" ), _( "Zoom in" ),
KiBitmap( zoom_in_xpm ) ); KiBitmap( zoom_in_xpm ) );
// Zoom Out // Zoom Out
AddMenuItem( viewMenu, ID_ZOOM_OUT, AddMenuItem( viewMenu, ID_ZOOM_OUT,
_( "Zoom &Out" ), _( "Zoom out on the module" ), _( "Zoom &Out" ), _( "Zoom out" ),
KiBitmap( zoom_out_xpm ) ); KiBitmap( zoom_out_xpm ) );
// Fit on Screen // Fit on Screen
AddMenuItem( viewMenu, ID_ZOOM_PAGE, AddMenuItem( viewMenu, ID_ZOOM_PAGE,
_( "&Fit on Screen" ), _( "&Fit on Screen" ),
_( "Zoom and fit the module in the window" ), _( "Zoom to fit the module in the window" ),
KiBitmap( zoom_fit_in_page_xpm ) ); KiBitmap( zoom_fit_in_page_xpm ) );
viewMenu->AppendSeparator(); viewMenu->AppendSeparator();
// Redraw // Redraw
AddMenuItem( viewMenu, ID_ZOOM_REDRAW, AddMenuItem( viewMenu, ID_ZOOM_REDRAW,
_( "&Redraw" ), _( "Redraw the window's viewport" ), _( "&Redraw" ), _( "Redraw window's viewport" ),
KiBitmap( zoom_redraw_xpm ) ); KiBitmap( zoom_redraw_xpm ) );
// 3D view // 3D view
@ -258,7 +258,7 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Anchor // Anchor
AddMenuItem( placeMenu, ID_MODEDIT_ANCHOR_TOOL, AddMenuItem( placeMenu, ID_MODEDIT_ANCHOR_TOOL,
_( "A&nchor" ), _( "A&nchor" ),
_( "Place the footprint module reference anchor" ), _( "Place footprint module reference anchor" ),
KiBitmap( anchor_xpm ) ); KiBitmap( anchor_xpm ) );
// Menu Help: // Menu Help:
@ -269,8 +269,8 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
// Contents // Contents
AddMenuItem( helpMenu, wxID_HELP, AddMenuItem( helpMenu, wxID_HELP,
_( "&Contents" ), _( "P&cbnew Manual" ),
_( "Open the Pcbnew handbook" ), _( "Open the Pcbnew manual" ),
KiBitmap( online_help_xpm ) ); KiBitmap( online_help_xpm ) );
AddMenuItem( helpMenu, wxID_INDEX, AddMenuItem( helpMenu, wxID_INDEX,

View File

@ -477,6 +477,13 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
HELP_SHOW_HIDE_LAYERMANAGER, HELP_SHOW_HIDE_LAYERMANAGER,
KiBitmap( layers_manager_xpm ) ); KiBitmap( layers_manager_xpm ) );
AddMenuItem( configmenu, ID_MENU_PCB_SHOW_HIDE_MUWAVE_TOOLBAR,
m_show_microwave_tools ?
_( "Hide Microwave Toolbar" ): _( "Show Microwave Toolbar" ),
HELP_SHOW_HIDE_MICROWAVE_TOOLS,
KiBitmap( mw_toolbar_xpm ) );
// General // General
#ifdef __WXMAC__ #ifdef __WXMAC__
configmenu->Append(wxID_PREFERENCES); configmenu->Append(wxID_PREFERENCES);

View File

@ -121,6 +121,8 @@ void PCB_BASE_FRAME::Import_Pad_Settings( D_PAD* aPad, bool aDraw )
m_canvas->RefreshDrawingRect( aPad->GetBoundingBox() ); m_canvas->RefreshDrawingRect( aPad->GetBoundingBox() );
aPad->GetParent()->SetLastEditTime(); aPad->GetParent()->SetLastEditTime();
OnModify();
} }
/** Compute the 'next' pad number for autoincrement /** Compute the 'next' pad number for autoincrement
@ -132,8 +134,8 @@ static wxString GetNextPadName( wxString aPadName )
int ponder = 1; int ponder = 1;
// Trim and extract the trailing numeric part // Trim and extract the trailing numeric part
while( aPadName.Len() while( aPadName.Len()
&& aPadName.Last() >= '0' && aPadName.Last() >= '0'
&& aPadName.Last() <= '9' ) && aPadName.Last() <= '9' )
{ {
num += ( aPadName.Last() - '0' ) * ponder; num += ( aPadName.Last() - '0' ) * ponder;

View File

@ -139,6 +139,7 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END, EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END,
PCB_EDIT_FRAME::Process_Config ) PCB_EDIT_FRAME::Process_Config )
EVT_MENU( ID_MENU_PCB_SHOW_HIDE_LAYERS_MANAGER_DIALOG, PCB_EDIT_FRAME::Process_Config ) EVT_MENU( ID_MENU_PCB_SHOW_HIDE_LAYERS_MANAGER_DIALOG, PCB_EDIT_FRAME::Process_Config )
EVT_MENU( ID_MENU_PCB_SHOW_HIDE_MUWAVE_TOOLBAR, PCB_EDIT_FRAME::Process_Config )
EVT_MENU( wxID_PREFERENCES, PCB_EDIT_FRAME::Process_Config ) EVT_MENU( wxID_PREFERENCES, PCB_EDIT_FRAME::Process_Config )
EVT_MENU( ID_PCB_LAYERS_SETUP, PCB_EDIT_FRAME::Process_Config ) EVT_MENU( ID_PCB_LAYERS_SETUP, PCB_EDIT_FRAME::Process_Config )
EVT_MENU( ID_PCB_MASK_CLEARANCE, PCB_EDIT_FRAME::Process_Config ) EVT_MENU( ID_PCB_MASK_CLEARANCE, PCB_EDIT_FRAME::Process_Config )
@ -290,6 +291,8 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
PCB_EDIT_FRAME::OnUpdateVerticalToolbar ) PCB_EDIT_FRAME::OnUpdateVerticalToolbar )
EVT_UPDATE_UI_RANGE( ID_TB_OPTIONS_SHOW_ZONES, ID_TB_OPTIONS_SHOW_ZONES_OUTLINES_ONLY, EVT_UPDATE_UI_RANGE( ID_TB_OPTIONS_SHOW_ZONES, ID_TB_OPTIONS_SHOW_ZONES_OUTLINES_ONLY,
PCB_EDIT_FRAME::OnUpdateZoneDisplayStyle ) PCB_EDIT_FRAME::OnUpdateZoneDisplayStyle )
EVT_UPDATE_UI_RANGE( ID_PCB_MUWAVE_START_CMD, ID_PCB_MUWAVE_END_CMD,
PCB_EDIT_FRAME::OnUpdateMuWaveToolbar )
END_EVENT_TABLE() END_EVENT_TABLE()

View File

@ -77,6 +77,17 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event )
_("Hide &Layers Manager" ) : _("Show &Layers Manager" )); _("Hide &Layers Manager" ) : _("Show &Layers Manager" ));
break; break;
case ID_MENU_PCB_SHOW_HIDE_MUWAVE_TOOLBAR:
m_show_microwave_tools = ! m_show_microwave_tools;
m_auimgr.GetPane( wxT( "m_microWaveToolBar" ) ).Show( m_show_microwave_tools );
m_auimgr.Update();
GetMenuBar()->SetLabel( ID_MENU_PCB_SHOW_HIDE_MUWAVE_TOOLBAR,
m_show_microwave_tools ?
_( "Hide Microwave Toolbar" ): _( "Show Microwave Toolbar" ));
break;
case ID_PCB_LAYERS_SETUP: case ID_PCB_LAYERS_SETUP:
InstallDialogLayerSetup(); InstallDialogLayerSetup();
break; break;

View File

@ -280,6 +280,7 @@ enum pcbnew_ids
ID_PCB_LIB_TABLE_EDIT, ID_PCB_LIB_TABLE_EDIT,
ID_MENU_PCB_SHOW_DESIGN_RULES_DIALOG, ID_MENU_PCB_SHOW_DESIGN_RULES_DIALOG,
ID_MENU_PCB_SHOW_HIDE_LAYERS_MANAGER_DIALOG, ID_MENU_PCB_SHOW_HIDE_LAYERS_MANAGER_DIALOG,
ID_MENU_PCB_SHOW_HIDE_MUWAVE_TOOLBAR,
ID_TB_OPTIONS_SHOW_MANAGE_LAYERS_VERTICAL_TOOLBAR, ID_TB_OPTIONS_SHOW_MANAGE_LAYERS_VERTICAL_TOOLBAR,
ID_TB_OPTIONS_SHOW_ZONES, ID_TB_OPTIONS_SHOW_ZONES,

View File

@ -40,7 +40,6 @@
#include <class_zone.h> #include <class_zone.h>
#include <boost/range/adaptor/map.hpp> #include <boost/range/adaptor/map.hpp>
#include <boost/pointer_cast.hpp>
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
#include <boost/make_shared.hpp> #include <boost/make_shared.hpp>
#include <boost/bind.hpp> #include <boost/bind.hpp>
@ -953,26 +952,40 @@ void RN_DATA::ProcessBoard()
{ {
m_nets.clear(); m_nets.clear();
m_nets.resize( m_board->GetNetCount() ); m_nets.resize( m_board->GetNetCount() );
int netCode;
// Iterate over all items that may need to be connected // Iterate over all items that may need to be connected
for( MODULE* module = m_board->m_Modules; module; module = module->Next() ) for( MODULE* module = m_board->m_Modules; module; module = module->Next() )
{ {
for( D_PAD* pad = module->Pads().GetFirst(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads().GetFirst(); pad; pad = pad->Next() )
m_nets[pad->GetNetCode()].AddItem( pad ); {
netCode = pad->GetNetCode();
if( netCode > 0 )
m_nets[netCode].AddItem( pad );
}
} }
for( TRACK* track = m_board->m_Track; track; track = track->Next() ) for( TRACK* track = m_board->m_Track; track; track = track->Next() )
{ {
if( track->Type() == PCB_VIA_T ) netCode = track->GetNetCode();
m_nets[track->GetNetCode()].AddItem( static_cast<SEGVIA*>( track ) );
else if( track->Type() == PCB_TRACE_T ) if( netCode > 0 )
m_nets[track->GetNetCode()].AddItem( track ); {
if( track->Type() == PCB_VIA_T )
m_nets[netCode].AddItem( static_cast<SEGVIA*>( track ) );
else if( track->Type() == PCB_TRACE_T )
m_nets[netCode].AddItem( track );
}
} }
for( int i = 0; i < m_board->GetAreaCount(); ++i ) for( int i = 0; i < m_board->GetAreaCount(); ++i )
{ {
ZONE_CONTAINER* zone = m_board->GetArea( i ); ZONE_CONTAINER* zone = m_board->GetArea( i );
m_nets[zone->GetNetCode()].AddItem( zone ); netCode = zone->GetNetCode();
if( netCode > 0 )
m_nets[netCode].AddItem( zone );
} }
} }

View File

@ -398,7 +398,7 @@ void PCB_EDIT_FRAME::ReCreateOptToolbar()
m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_EXTRA_VERTICAL_TOOLBAR_MICROWAVE, m_optionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_EXTRA_VERTICAL_TOOLBAR_MICROWAVE,
wxEmptyString, wxEmptyString,
KiBitmap( mw_toolbar_xpm ), KiBitmap( mw_toolbar_xpm ),
_( "Show/hide the toolbar for microwaves tools\n This is a experimental feature (under development)" ), HELP_SHOW_HIDE_MICROWAVE_TOOLS,
wxITEM_CHECK ); wxITEM_CHECK );
@ -500,25 +500,30 @@ void PCB_EDIT_FRAME::ReCreateMicrowaveVToolbar()
// Set up toolbar // Set up toolbar
m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_SELF_CMD, wxEmptyString, m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_SELF_CMD, wxEmptyString,
KiBitmap( mw_add_line_xpm ), KiBitmap( mw_add_line_xpm ),
_( "Create line of specified length for microwave applications" ) ); _( "Create line of specified length for microwave applications" ),
wxITEM_CHECK );
m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_GAP_CMD, wxEmptyString, m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_GAP_CMD, wxEmptyString,
KiBitmap( mw_add_gap_xpm ), KiBitmap( mw_add_gap_xpm ),
_( "Create gap of specified length for microwave applications" ) ); _( "Create gap of specified length for microwave applications" ),
wxITEM_CHECK );
m_microWaveToolBar->AddSeparator(); m_microWaveToolBar->AddSeparator();
m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_STUB_CMD, wxEmptyString, m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_STUB_CMD, wxEmptyString,
KiBitmap( mw_add_stub_xpm ), KiBitmap( mw_add_stub_xpm ),
_( "Create stub of specified length for microwave applications" ) ); _( "Create stub of specified length for microwave applications" ),
wxITEM_CHECK );
m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_STUB_ARC_CMD, wxEmptyString, m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_STUB_ARC_CMD, wxEmptyString,
KiBitmap( mw_add_stub_arc_xpm ), KiBitmap( mw_add_stub_arc_xpm ),
_( "Create stub (arc) of specified length for microwave applications" ) ); _( "Create stub (arc) of specified length for microwave applications" ),
wxITEM_CHECK );
m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_FUNCTION_SHAPE_CMD, wxEmptyString, m_microWaveToolBar->AddTool( ID_PCB_MUWAVE_TOOL_FUNCTION_SHAPE_CMD, wxEmptyString,
KiBitmap( mw_add_shape_xpm ), KiBitmap( mw_add_shape_xpm ),
_( "Create a polynomial shape for microwave applications" ) ); _( "Create a polynomial shape for microwave applications" ),
wxITEM_CHECK );
m_microWaveToolBar->Realize(); m_microWaveToolBar->Realize();
} }

View File

@ -204,6 +204,12 @@ void PCB_EDIT_FRAME::OnUpdateVerticalToolbar( wxUpdateUIEvent& aEvent )
aEvent.Check( GetToolId() == aEvent.GetId() ); aEvent.Check( GetToolId() == aEvent.GetId() );
} }
void PCB_EDIT_FRAME::OnUpdateMuWaveToolbar( wxUpdateUIEvent& aEvent )
{
if( aEvent.GetEventObject() == m_microWaveToolBar )
aEvent.Check( GetToolId() == aEvent.GetId() );
}
void PCB_EDIT_FRAME::OnUpdateAutoPlaceTracksMode( wxUpdateUIEvent& aEvent ) void PCB_EDIT_FRAME::OnUpdateAutoPlaceTracksMode( wxUpdateUIEvent& aEvent )
{ {