This is *a work in progress*, so some features are missing, and/or could be modified.
Mainly keepout zones are not yet exported to autorouters, and pads are not taken in account.
Some code cleanup in polygon.*
* Add s-expression file parser object and keyword files.
* Fix minor issues with s-expression file formatting.
* Fix a minor bug the zone container fill state parsing in the legacy plugin.
* Move EDA_TEXT visibility definition to eda_text.h.
* Add minor BOARD_ITEM object improvements to support s-expression file
parser.
This may have been an undocumented bug from more than a year ago, which manifested itself in *.mod files containing duplicate names.
LEGACY_PLUGIN loads those now quietly, but appends "_v2", "_v3", etc. to each succeeding duplicate sharing the same name.
base on expected text and current window font.
Expand the virtual world to 2.14 meters in the nanometer build of PCBNEW.
This seems to be holding up for now.
Delete LEGACY_PLUGIN cache after deleting library of same name.
Remove automatically generted freerouter help header.
Add Normalize() to BOX2.
Clamp some values in the virtual space of drawframe.cpp
Should allow Pcbnew code easier to change and Gerbview code more understandable and easier to maintain.
Code cleaning (remove dead code, add comments).
Minor other enhancements.
Other scaling factors (MILS_TO_IU_SCALING_FACTOR and DECIMILS_TO_IU_SCALING_FACTOR)
also defined only in convert_to_biu.h.
Allows different scaling value for Gerbview.
Needs more tests.
solution to see that it was not pre-computing constants when used in static initializers.
So we have two use cases, and need two solutions to be optimal, since the compiler
is too stupid to do the right thing.
I think we need something else for compile time computable constants, to be optimal
in both use cases. There is quite a bit of code savings by using a macro for that
situation from my testing. To fully capitalize on this, we need to go back and make
Mm2mils() and what not macros also, or have MACRO versions of them too.
as a starting point
* Make double Distance() take double arguments and remove internal range checking.
* Start on EDA_DRAW_FRAME::AdjustScrollBars() and use "double" for most all calculations
in anticipation of setting INT_MAX INT_MIN limits eventually.
* Move board item object Format() functions into PCB_IO object.
* Change file format to use layer names instead of numbers.
* Change file extension to kicad_pcb.
// This provides better project control over rounding to int from double
// than wxRound() did. This scheme provides better logging in Debug builds
// and it provides for compile time calculation of constants.
#include <stdio.h>
#include <assert.h>
#include <limits.h>
//-----<KiROUND KIT>------------------------------------------------------------
/**
* KiROUND
* rounds a floating point number to an int using
* "round halfway cases away from zero".
* In Debug build an assert fires if will not fit into an int.
*/
#if defined( DEBUG )
// DEBUG: a macro to capture line and file, then calls this inline
static inline int KiRound( double v, int line, const char* filename )
{
v = v < 0 ? v - 0.5 : v + 0.5;
if( v > INT_MAX + 0.5 )
{
printf( "%s: in file %s on line %d, val: %.16g too ' > 0 ' for int\n", __FUNCTION__, filename, line, v );
}
else if( v < INT_MIN - 0.5 )
{
printf( "%s: in file %s on line %d, val: %.16g too ' < 0 ' for int\n", __FUNCTION__, filename, line, v );
}
return int( v );
}
#define KiROUND( v ) KiRound( v, __LINE__, __FILE__ )
#else
// RELEASE: a macro so compile can pre-compute constants.
#define KiROUND( v ) int( (v) < 0 ? (v) - 0.5 : (v) + 0.5 )
#endif
//-----</KiROUND KIT>-----------------------------------------------------------
// Only a macro is compile time calculated, an inline function causes a static constructor
// in a situation like this.
// Therefore the Release build is best done with a MACRO not an inline function.
int Computed = KiROUND( 14.3 * 8 );
int main( int argc, char** argv )
{
for( double d = double(INT_MAX)-1; d < double(INT_MAX)+8; d += 2.0 )
{
int i = KiROUND( d );
printf( "t: %d %.16g\n", i, d );
}
return 0;
}
*) for footprint access into *.mod files and
*) BOARD save/load
The item_io.cpp and ioascii.cpp have been set off to the side for reference
as *.notused, for awhile.
The CMake options USE_NEW_PCBNEW_LOAD and USE_NEW_PCBNEW_SAVE are gone,
this is now the mandatory usage of the LEGACY_PLUGIN. This should reduce
code maintenance for awhile until the s-expression plugin comes into
play. But at least for legacy format, there is not two code bodies
to maintain any more.
A new LEGACY_PLUGIN footprint library caching scheme is in place which
needs some testing. It should not be any faster, but might give better
results in a networked environment if there is *.mod files on the server.
* Remove internal units from BASE_SCREEN and it's derivatives.
* Remove internal units from EDA_DRAW_FRAME and it's derivatives.
* Use build time code to replace internal units conversions.
* Fix scaling bug in page layout sample window that I created in my
last commit.
* Move all convert from user to internal units into base_units.cpp.
* Remove internal units parameters from all moved conversion functions.
* Revise all source code that calls the moved conversion functions.
* Remove internal units from all dialog text control helper classes.
* Move all convert from internal to user units functions into separate file.
* Remove internal units parameter from all moved conversion functions.
* Revise all source code that calls the moved conversion functions.
* Compile these conversion routines separately for the appropriate pcb or
schematic internal units.
* Move internal units specific status bar update code into the appropriate
application for updating the status bar.
* Move millimeter user units rounding function to common.cpp.
* Move EDA_TEXT object into separate header and source file.
* Compile EDA_TEXT class separately for BOARD_ITEM and SCH_ITEM units.
* Compile PAGE_INFO class separately for BOARD_ITEM and SCH_ITEM units.
* Minor formatting tweaks to Pcbnew s-expression file.
* Move internal unit formatting functions into BOARD_ITEM and SCH_ITEM.
* Save dialog now supports saving boards to new file format.
* Add CMake option to build s-expression file save.
* Add check to main CMakeList.txt file to make sure nanometers are
enables when the new file format is built.
* Minor tweaks to object format functions for improved output.
* Rename kicad_plugin.h/cpp to legacy_plugin.h/cpp.
* Add s-expression Format() function to all objects derived from
BOARD_ITEM.
* Add s-expression Format() function to base objects as required.
* Add functions to convert coordinates from base internal units
(nanometers) to millimeter string for writing to s-expression
file.
* Add temporary dummy conversion functions to prevent link errors
until schematic and board object and action code can be separated
into DSO/DLL.
* Add CMake build option to build Pcbnew with nanometer internal
units.
* BLOCK_SELECTOR class is not longer derived from EDA_ITEM.
* Encapsulate BLOCK_SELECTOR class member variables and add access methods.
* Move HandleBlockBegin() function from block_commande.cpp to drawframe.cpp.
* Remove virtual methods from top level derived objects per future
coding policy change.
* Remove Doxygen copydoc statement from objects derived from EDA_ITEM
since the comments are automatically copied to the derived object.
* Removed copy and pasted Doxygen comments from objects derived from
EDA_ITEM.
issue in cast to wxRect fixed (EDA_RECT accepts negative size, but not wxRect, so the wxRectcast is normalized now).
This fixes some bugs.
A minor other bug fix in Pcbnew.
This works, but in my version of wxformbuilder there is a bug which does not properly show the
subclass property, even though it is still in play. This happens after saving then loading the *.fbp file.
So it is a nuisance bug, but does not affect functionality.
* All objects derived from EDA_ITEM now have consistent hit test method
definitions.
* Remove double function calls from all classes derived from SCH_ITEM.
* Lots of Doxygen comment fixes.
* make 2 bitmaps more visible.
* fix incorrect screen redraw when rotating a component.
* netlist : the pcbnew advanced format can be now stored (persistant option) in project config.
Pcbnew:
* graphic_item_properties_base.fbp * dialog pad edit: make some strings more easier to translate.
* global pad edition: fix a bug that change pad position instead of pad size (round pas only).
Eeschema:
* fix a bug: new created wires were not alwaes shows until the screen was redrawn.
wxWidgets 2.9 knows wxSVGFILEDC device context.
Unfortunately, arcs are drawn as pies (this is a feature, not a bug).
This is not correct for Kicad.
So Kicad has its own wxSVGFILEDC (named KicadSVGFileDC) that is basically the same as wxSVGFILEDC,
but with arcs drawn as arcs, not pies.
Note also under wxWidgets 2.8 does not know wxSVGFILEDC , so kicad had already its own SVG device context.
* Convert Eeschema from manually linked list to DLIST for storing
SCH_ITEM objects.
* Add helper functions to SCH_SCREEN for appending list of SCH_ITEM
objects.
* Fix bug in wire editing code for accurate undo/redo behavior.
* Add member to DLIST to append another DLIST.
* Other minor code cleaning.
derived classes' implementations of these functions become non virtual and
can be truly _inlined_ for speed! All GetPosition() in derived classes were also
changed to return const wxPoint&, that is, a reference rather than a
full copy of the position wxPoint. There was no need for polymorphism in
{Get,Set}Position() since we never call these functions via generic pointer.
* Remove BOARD::{Get,Set}Position() since they were only there to satisfy
the pure virtuals established in BOARD_ITEM, which are now gone.
* Added const wxPoint& CPolyLine::GetPos(), made CPolyLine::Get{X,Y}() inline.
* Derive CPolyPt from wxPoint so we can return "const wxPoint&" fromt
CPolyLine::GetPos().
Eeschema: Viewlib is now accessible from Libedit (to browse libs or load a component to edit)
Libedit: uses now the same dialog as the schematic editor to load a component
Some code cleaning.
which is in turn already within BOARD.
* encapsulate class D_PAD with accessors, making data private.
* make D_PAD::GetBoundingRadius() do its longer calculation lazily, based on
m_boundingRadius == -1.