Merged with testing

This commit is contained in:
Miguel Angel Ajo 2012-07-15 22:38:25 +02:00
commit 863c1b4823
98 changed files with 15373 additions and 13033 deletions

View File

@ -48,37 +48,30 @@ E6) Start initial work for changing component library file format to use Dick's
PCBNew PCBNew
------ ------
* Make the zone hit testing be done in screen coordinates, not internal units. *) Make the zone hit testing be done in screen coordinates, not internal units.
See the @todos in class_zone.cpp See the @todos in class_zone.cpp. A fixed distance in internal units becomes
a variable distance based on zoom factor, leading to inconsistent results at
various zoom factors. I believe that a fixed distance in pixels might make
for a friendlier UI.
*) Check that the new load visibility BOARD settings is properly setting the toolbar
Dick's Peronal TODO Items (Last Update: 24-April-2012)
-----------------------------------------------------
1) Work through some scroll, pan, zoom overflows in PCBNEW's nanometer build mode.
It is thought that if we can constrain the virtual IU space to within
INT_MIN to INT_MAX then a whole host of other problems will go away. Most
of the evil is in EDA_DRAW_FRAME::AdjustScrollBars() which assumes the
virtual IU space is infinite. This function triggers a movement of the
viewport within the virtual IU space and also a change in size of the virtual
IU space. Once this happens, you can end up thinking there are problems in
functions like EDA_DRAW_PANE::DrawCrossHair(), but this may be an artifact
of having traveled outside a limited virtual IU space.
2) Check that the new load visibility BOARD settings is properly setting the toolbar
buttons like show grid or ratsnest. Add PCB_EDIT_FRAME::SetVisibleElements() so buttons like show grid or ratsnest. Add PCB_EDIT_FRAME::SetVisibleElements() so
toolbar crap is not known to a BOARD. toolbar crap is not known to a BOARD.
3) Finish removing global access requirements from KICAD_PLUGIN, so that: *) Finish removing global access requirements from PLUGINs, so that:
*) a BOARD is a fully self contained document description. *) a BOARD is a fully self contained document description.
*) plugin developers do not have to access globals, since a plugin could *) plugin developers do not have to access globals, since a plugin could
very well be a dynamically loaded DLL/DSO. very well be a dynamically loaded DLL/DSO in the future.
One final problem remains with BASE_SCREEN's grid origin, easy solution is to One final problem remains is the BASE_SCREEN's grid origin. An easy
move just that one field into the BOARD. solution is to move just that one field into the BOARD.
*) Add ::Footprint*() functions to EAGLE_PLUGIN, so that Eagle footprint libraries
can be used in situ.
*) Add a library table for Pcbnew like that in the sweet library and get rid of the
damn search path strategy. This will enable concurrent usage of various types
of PLUGIN::Footprint*() functions. At least LEGACY and KICAD are both needed
concurrently.
4) Do an EAGLE XML import PCBNEW PLUGIN, and possibly add export support to it.
This is PLUGIN::Load() and maybe PLUGIN::Save().
5) Get back to the SWEET work.

View File

@ -109,6 +109,8 @@ set( BMAPS_SMALL
pintype_opencoll pintype_opencoll
pintype_openemit pintype_openemit
pintype_noconnect pintype_noconnect
tree_nosel
tree_sel
) )
# image basenames that go into the toolbar sized destinations, i.e. 26x26 # image basenames that go into the toolbar sized destinations, i.e. 26x26
@ -127,6 +129,7 @@ set( BMAPS_MID
add_hierar_pin add_hierar_pin
add_hierarchical_subsheet add_hierarchical_subsheet
add_junction add_junction
add_keepout_area
add_line2bus add_line2bus
add_line_label add_line_label
add_line add_line
@ -473,8 +476,6 @@ set( BMAPS_MID
track_sketch track_sketch
track_unlocked track_unlocked
transistor transistor
tree_nosel
tree_sel
undelete undelete
undo undo
unit_inch unit_inch

View File

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

View File

@ -0,0 +1,54 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff,
0x61, 0x00, 0x00, 0x02, 0x4a, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x32, 0x9e, 0x37, 0xaf, 0x52, 0x74, 0xee, 0xdc, 0x1a, 0xf5, 0x99, 0x33, 0x1b, 0x44, 0xd0,
0xe5, 0xb0, 0x61, 0x38, 0x03, 0xa4, 0x69, 0xc1, 0xbc, 0xba, 0x65, 0x33, 0x56, 0x14, 0xbe, 0x9f,
0xb9, 0xac, 0xe8, 0xfd, 0xfc, 0x79, 0xb5, 0xaf, 0x80, 0x78, 0xc3, 0xbc, 0x79, 0x0d, 0x4a, 0x04,
0x0d, 0x98, 0x3f, 0xbf, 0x41, 0x01, 0xa8, 0xf9, 0x70, 0xc1, 0x61, 0xfb, 0x57, 0xee, 0x57, 0x84,
0x7f, 0xb9, 0x5c, 0x12, 0xfc, 0xed, 0x7d, 0x45, 0xec, 0x67, 0xd2, 0x19, 0xfd, 0x0f, 0xf3, 0xe6,
0xd5, 0x1e, 0xeb, 0xe9, 0x6b, 0x2e, 0x5d, 0xb0, 0x68, 0xde, 0xb1, 0xce, 0xce, 0xb6, 0x10, 0xac,
0x06, 0x2c, 0x98, 0x57, 0xdb, 0x1c, 0xb1, 0x4f, 0xf7, 0x85, 0xc9, 0x01, 0x8e, 0x3f, 0x1a, 0xbb,
0x19, 0xfe, 0xc3, 0xb0, 0xe9, 0x7e, 0xae, 0x3f, 0xb5, 0x4b, 0xd3, 0xdf, 0x9c, 0x3a, 0x7d, 0xe2,
0xe7, 0xee, 0x3d, 0xbb, 0x5e, 0x34, 0x37, 0xd7, 0x68, 0x82, 0xd4, 0x37, 0x34, 0x34, 0xf0, 0xc0,
0x0d, 0x98, 0x34, 0x29, 0x97, 0x7d, 0xf6, 0xfc, 0xca, 0x25, 0x56, 0x9b, 0x44, 0x3f, 0xa9, 0x6d,
0x62, 0xf8, 0x8f, 0x8e, 0x67, 0x6d, 0x9c, 0xf8, 0xe7, 0xed, 0xdb, 0xb7, 0xff, 0x17, 0x2f, 0x59,
0x78, 0x0c, 0xac, 0x81, 0x81, 0x81, 0x71, 0xf6, 0xdc, 0x59, 0xa7, 0xa6, 0x4c, 0x9b, 0x38, 0x0d,
0xcc, 0x07, 0x9a, 0xc6, 0x32, 0x67, 0x5e, 0x55, 0x9f, 0xfe, 0x02, 0xe1, 0x8f, 0x2a, 0x2b, 0x19,
0xfe, 0xa3, 0xe3, 0xfe, 0xa5, 0xed, 0xbf, 0x3f, 0x7c, 0xf8, 0xf0, 0x7f, 0xff, 0xfe, 0x7d, 0xaf,
0xa6, 0x4e, 0x9f, 0x3c, 0x7f, 0xf2, 0x94, 0x09, 0xbb, 0x2e, 0x5d, 0xba, 0xf8, 0x73, 0xc1, 0xc2,
0x79, 0xc7, 0xe1, 0x5e, 0x00, 0xfa, 0x33, 0xc5, 0xa4, 0x5b, 0xf9, 0xb2, 0xe2, 0x1c, 0x96, 0xbf,
0x4a, 0x0b, 0x19, 0xfe, 0xc3, 0xf1, 0x7c, 0xc6, 0xff, 0xe1, 0x5d, 0x7e, 0x2f, 0x6f, 0xdf, 0xbe,
0xfd, 0xf7, 0xd1, 0xa3, 0x47, 0xff, 0x5f, 0xbe, 0x7c, 0xf9, 0x1f, 0x44, 0x03, 0x0d, 0xf8, 0xdd,
0xdb, 0xdf, 0xdd, 0x8a, 0x12, 0x88, 0x93, 0x67, 0x94, 0x24, 0xca, 0x97, 0x4a, 0xde, 0x93, 0xe9,
0xe0, 0xf8, 0x25, 0xdb, 0xc7, 0xf2, 0x5f, 0xb6, 0x8b, 0xfd, 0xa7, 0x56, 0x99, 0xea, 0x8d, 0x35,
0xeb, 0x57, 0xbe, 0x7e, 0xf6, 0xec, 0xd9, 0xff, 0x3b, 0x77, 0xee, 0xfc, 0xdf, 0xba, 0x6d, 0xf3,
0xd3, 0xb5, 0xeb, 0x56, 0x5f, 0x9f, 0x30, 0xa9, 0xa7, 0x2b, 0x34, 0x34, 0x94, 0x19, 0x25, 0x1a,
0xe7, 0xcd, 0xab, 0x96, 0x6d, 0x99, 0x94, 0xe5, 0xeb, 0x55, 0xe8, 0x56, 0xa8, 0x9f, 0xa5, 0x3f,
0xd1, 0x28, 0xcb, 0xa8, 0x6f, 0xee, 0x82, 0x99, 0xe7, 0x1f, 0x3f, 0x7e, 0xfc, 0xff, 0xd5, 0xab,
0x57, 0xff, 0xb7, 0x6d, 0xdf, 0xfa, 0xb4, 0xa6, 0xb9, 0x46, 0x1d, 0x67, 0x3a, 0x00, 0xe1, 0x99,
0x33, 0xd3, 0x58, 0xe7, 0xcc, 0x69, 0x10, 0x5a, 0xb4, 0xa8, 0x41, 0x6c, 0xd2, 0xa4, 0x9e, 0xe6,
0xcb, 0x97, 0x2f, 0x7d, 0x03, 0x39, 0xfb, 0xc2, 0xc5, 0xf3, 0x1f, 0xfa, 0x26, 0xf6, 0xa6, 0xe2,
0x4d, 0x48, 0xc8, 0xb8, 0xa1, 0xb5, 0x41, 0x67, 0xd7, 0xae, 0x1d, 0xcf, 0x9f, 0x3c, 0x79, 0xf2,
0xff, 0xc1, 0x83, 0xfb, 0x7f, 0x66, 0xcf, 0x99, 0xbe, 0x92, 0x60, 0x4a, 0x84, 0xe1, 0xdc, 0xdc,
0x5c, 0xf6, 0xc5, 0x8b, 0x17, 0x5c, 0x06, 0xf9, 0x19, 0x64, 0xc0, 0x92, 0x65, 0x8b, 0x2e, 0x02,
0x63, 0x8a, 0x8d, 0x68, 0x03, 0xa6, 0x4c, 0x9b, 0xb4, 0xec, 0xc2, 0x85, 0xf3, 0x7f, 0xee, 0xdd,
0xbb, 0xf7, 0x7f, 0xcb, 0xd6, 0x4d, 0x8f, 0x1b, 0x1a, 0x2a, 0x14, 0x88, 0xca, 0x0b, 0x20, 0xdc,
0xdc, 0xdc, 0xe0, 0xb2, 0x7d, 0xfb, 0xd6, 0x4f, 0x67, 0xcf, 0x9e, 0xfd, 0x7f, 0xe8, 0xf0, 0xa1,
0x77, 0x3d, 0xfd, 0x9d, 0x31, 0x44, 0x67, 0x26, 0x10, 0x6e, 0xef, 0x6c, 0x2d, 0xda, 0xb3, 0x77,
0xcf, 0x9f, 0xfd, 0x07, 0xf6, 0xfd, 0x9a, 0x3e, 0x73, 0xca, 0x3c, 0x92, 0x72, 0x23, 0x34, 0x8d,
0x33, 0xf5, 0xf4, 0x75, 0xd5, 0xf7, 0x4d, 0xe8, 0x2e, 0x22, 0x46, 0x33, 0x08, 0x03, 0x00, 0xa3,
0x36, 0xa6, 0x81, 0xc6, 0x70, 0x96, 0x32, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE tree_sel_xpm[1] = {{ png, sizeof( png ), "tree_sel_xpm" }};
//EOF

View File

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

View File

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

View File

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

View File

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.1 "
sodipodi:docname="add_keepout_area.svg">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3165"
id="linearGradient3147"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0243903,0,0,1.0355608,-35.845375,-31.825111)"
x1="10"
y1="2.5"
x2="15.409858"
y2="21.491209" />
<linearGradient
id="linearGradient3165">
<stop
id="stop5217"
offset="0"
style="stop-color:#f48e86;stop-opacity:0.99607843;" />
<stop
style="stop-color:#bf2c21;stop-opacity:0.99607843;"
offset="0.5"
id="stop5223" />
<stop
style="stop-color:#48130f;stop-opacity:0.99607843;"
offset="1"
id="stop5221" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3165"
id="linearGradient3149"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0243903,0,0,1.0355608,-35.33318,-31.825111)"
x1="9.5"
y1="2.5"
x2="14.909858"
y2="21.491209" />
<linearGradient
id="linearGradient8262">
<stop
style="stop-color:#f68273;stop-opacity:1;"
offset="0"
id="stop8264" />
<stop
id="stop8266"
offset="0.5"
style="stop-color:#cd2923;stop-opacity:1;" />
<stop
style="stop-color:#8c0000;stop-opacity:1"
offset="1"
id="stop8268" />
</linearGradient>
<linearGradient
y2="21.491209"
x2="14.909858"
y1="2.5"
x1="9.5"
gradientTransform="matrix(1.0243903,0,0,1.0355608,-35.33318,-31.825111)"
gradientUnits="userSpaceOnUse"
id="linearGradient8273"
xlink:href="#linearGradient3165"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3165"
id="linearGradient5212"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96823216,0,0,0.98360286,21.081824,17.367375)"
x1="9.5"
y1="2.5"
x2="14.909858"
y2="21.491209" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3165"
id="linearGradient5215"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96823216,0,0,0.98360286,21.903889,16.869782)"
x1="10"
y1="2.5"
x2="15.409858"
y2="21.491209" />
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="968"
id="namedview10"
showgrid="true"
inkscape:snap-grids="false"
inkscape:snap-to-guides="false"
inkscape:zoom="31.197274"
inkscape:cx="12.755157"
inkscape:cy="13.257277"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
<inkscape:grid
type="xygrid"
id="grid2822"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<rect
style="fill:#a8c9c5;fill-opacity:1;stroke:#1a2200;stroke-width:1.04457009;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect3767"
width="22.751417"
height="23.217913"
x="1.7035706"
y="1.551699" />
<path
d="m 11.388353,4.7619742 3.570662,-0.080905 10.013099,10.7534978 c 0.05305,1.027595 -0.0071,1.109722 0.04199,3.98885 L 14.971765,8.5777429 l -3.583953,-0.01462 -0.01801,-2.0063721 0.01856,-1.7947794 z"
id="path6"
style="fill:#037600;fill-opacity:1"
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0" />
<path
d="M 7.1933422,1.0463663 C 3.8459678,0.99480061 1.2607574,3.4092055 1.2343849,6.6456504 1.212037,9.3663522 3.7139513,12.43648 7.1669697,12.476979 10.355862,12.51438 12.921899,9.9848585 12.914948,6.6972161 12.90832,3.5634848 10.382485,0.99480061 7.1933422,1.0463663 z M 7.1405977,3.8886568 C 8.9745023,3.8628747 10.089243,5.3767725 10.097572,6.6456504 10.108967,8.3791437 8.6844134,9.6131959 7.1142253,9.5831254 5.4124574,9.5505334 4.2062509,8.276423 4.1836256,6.7487817 4.1598941,5.1194121 5.4120948,3.8886568 7.1405976,3.8886568 z"
id="path8"
style="fill:#797800;fill-opacity:1"
sodipodi:nodetypes="csssccsssc"
inkscape:connector-curvature="0" />
<g
id="g3004"
transform="matrix(0.82726961,0,0,0.80467364,-17.473303,-6.3485938)"
style="fill:#cd0404;fill-opacity:1">
<path
inkscape:connector-curvature="0"
style="opacity:0.85321099;fill:#cd0404;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 40.727806,39.169139 c 0,0 -5.138993,-13.201066 -18.02601,-17.485067 l 2.088731,-3.121414 c 12.777976,4.18237 17.994777,19.284892 17.994777,19.284892 z"
id="path3006"
sodipodi:nodetypes="ccccc" />
<path
inkscape:connector-curvature="0"
style="opacity:0.85321099;fill:#cd0404;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 22.933897,35.970958 3.852963,3.290103 C 32.515122,24.39248 42.867046,20.959903 42.867046,20.959903 l -1.890358,-1.119465 c 0,0 -11.064955,2.012207 -18.042791,16.13052 z"
id="path3008"
sodipodi:nodetypes="ccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -188,7 +188,7 @@ double From_User_Unit( EDA_UNITS_T aUnit, double aValue )
int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue ) int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue )
{ {
int Value; double value;
double dtmp = 0; double dtmp = 0;
// Acquire the 'right' decimal point separator // Acquire the 'right' decimal point separator
@ -239,9 +239,9 @@ int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue )
dtmp /= 1000; dtmp /= 1000;
} }
Value = From_User_Unit( aUnits, dtmp ); value = From_User_Unit( aUnits, dtmp );
return Value; return KiROUND( value );
} }

View File

@ -250,12 +250,14 @@ void PAGE_INFO::SetPortrait( bool isPortrait )
static int clampWidth( int aWidthInMils ) static int clampWidth( int aWidthInMils )
{ {
/* was giving EESCHEMA single component SVG plotter grief /* was giving EESCHEMA single component SVG plotter grief
However a minimal test is made to avoid values that crashes Kicad
if( aWidthInMils < 4000 ) // 4" is about a baseball card if( aWidthInMils < 4000 ) // 4" is about a baseball card
aWidthInMils = 4000; aWidthInMils = 4000;
else if( aWidthInMils > 44000 ) //44" is plotter size else if( aWidthInMils > 44000 ) //44" is plotter size
aWidthInMils = 44000; aWidthInMils = 44000;
*/ */
if( aWidthInMils < 10 )
aWidthInMils = 10;
return aWidthInMils; return aWidthInMils;
} }
@ -264,11 +266,14 @@ static int clampHeight( int aHeightInMils )
{ {
/* was giving EESCHEMA single component SVG plotter grief /* was giving EESCHEMA single component SVG plotter grief
clamping is best done at the UI, i.e. dialog, levels clamping is best done at the UI, i.e. dialog, levels
However a minimal test is made to avoid values that crashes Kicad
if( aHeightInMils < 4000 ) if( aHeightInMils < 4000 )
aHeightInMils = 4000; aHeightInMils = 4000;
else if( aHeightInMils > 44000 ) else if( aHeightInMils > 44000 )
aHeightInMils = 44000; aHeightInMils = 44000;
*/ */
if( aHeightInMils < 10 )
aHeightInMils = 10;
return aHeightInMils; return aHeightInMils;
} }
@ -316,18 +321,17 @@ void PAGE_INFO::SetHeightMils( int aHeightInMils )
void PAGE_INFO::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const void PAGE_INFO::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
throw( IO_ERROR ) throw( IO_ERROR )
{ {
// If page is A3 landscape, then it is assumed to be the default and is not written. aFormatter->Print( aNestLevel, "(page %s", aFormatter->Quotew( GetType() ).c_str() );
if( !IsDefault() )
{
aFormatter->Print( aNestLevel, "(page %s", aFormatter->Quotew( GetType() ).c_str() );
// The page dimensions are only required for user defined page sizes. // The page dimensions are only required for user defined page sizes.
if( GetType() == PAGE_INFO::Custom ) // Internally, the page size is in mils
aFormatter->Print( aNestLevel, " %d %d", GetWidthIU(), GetHeightIU() ); if( GetType() == PAGE_INFO::Custom )
aFormatter->Print( 0, " %g %g",
GetCustomWidthMils() * 25.4 / 1000.0,
GetCustomHeightMils() * 25.4 / 1000.0 );
if( IsCustom() && IsPortrait() ) if( IsCustom() && IsPortrait() )
aFormatter->Print( aNestLevel, " portrait" ); aFormatter->Print( 0, " portrait" );
aFormatter->Print( aNestLevel, ")\n" ); aFormatter->Print( 0, ")\n" );
}
} }

View File

@ -274,27 +274,35 @@ void GERBER_PLOTTER::Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill,
} }
void GERBER_PLOTTER::Circle( const wxPoint& aCentre, int aDiameter, FILL_T aFill, void GERBER_PLOTTER::Circle( const wxPoint& aCenter, int aDiameter, FILL_T aFill,
int aWidth ) int aWidth )
{
Arc( aCenter, 0, 3600, aDiameter / 2, aFill, aWidth );
}
void GERBER_PLOTTER::Arc( const wxPoint& aCenter, int aStAngle, int aEndAngle,
int aRadius, FILL_T aFill, int aWidth )
{ {
wxASSERT( outputFile ); wxASSERT( outputFile );
wxPoint start, end; wxPoint start, end;
double radius = aDiameter / 2; start.x = aCenter.x + KiROUND( aRadius*cos( DEG2RAD( aStAngle/10.0 ) ) );
const int delta = 3600 / 32; /* increment (in 0.1 degrees) to draw circles */ start.y = aCenter.y - KiROUND( aRadius*sin( DEG2RAD( aStAngle/10.0 ) ) );
start.x = aCentre.x + KiROUND( radius );
start.y = aCentre.y;
SetCurrentLineWidth( aWidth ); SetCurrentLineWidth( aWidth );
MoveTo( start ); MoveTo( start );
end.x = aCenter.x + KiROUND( aRadius*cos( DEG2RAD( aEndAngle/10.0 ) ) );
end.y = aCenter.y - KiROUND( aRadius*sin( DEG2RAD( aEndAngle/10.0 ) ) );
DPOINT devEnd = userToDeviceCoordinates( end );
DPOINT devCenter = userToDeviceCoordinates( aCenter - start );
fprintf( outputFile, "G75*\n" ); // Multiquadrant mode
for( int ii = delta; ii < 3600; ii += delta ) if( aStAngle < aEndAngle )
{ fprintf( outputFile, "G03" );
end.x = aCentre.x + (int) ( radius * cos( DEG2RAD( ii / 10.0 ) ) ); else
end.y = aCentre.y + (int) ( radius * sin( DEG2RAD( ii / 10.0 ) ) ); fprintf( outputFile, "G02" );
LineTo( end ); fprintf( outputFile, "X%dY%dI%dJ%dD01*\n", int( devEnd.x ), int( devEnd.y ),
} int( devCenter.x ), int( devCenter.y ) );
fprintf( outputFile, "G74*\nG01*\n" ); // Back to single quadrant and linear interp.
FinishTo( start );
} }

View File

@ -624,8 +624,8 @@ void DIALOG_PAGES_SETTINGS::UpdatePageLayoutExample()
// Prepare DC. // Prepare DC.
wxSize example_size( lyWidth, lyHeight ); wxSize example_size( lyWidth, lyHeight );
wxMemoryDC memDC; wxMemoryDC memDC;
memDC.SetClippingRegion( wxPoint( 0, 0 ), example_size );
memDC.SelectObject( *m_page_bitmap ); memDC.SelectObject( *m_page_bitmap );
memDC.SetClippingRegion( wxPoint( 0, 0 ), example_size );
memDC.Clear(); memDC.Clear();
memDC.SetUserScale( scaleW, scaleH ); memDC.SetUserScale( scaleW, scaleH );

View File

@ -344,12 +344,12 @@ void EDA_TEXT::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControl
{ {
if( !IsDefaultFormatting() ) if( !IsDefaultFormatting() )
{ {
aFormatter->Print( aNestLevel+1, "(effects\n" ); aFormatter->Print( aNestLevel+1, "(effects" );
if( ( m_Size.x != DEFAULT_SIZE_TEXT ) || ( m_Size.y != DEFAULT_SIZE_TEXT ) || m_Bold if( ( m_Size.x != DEFAULT_SIZE_TEXT ) || ( m_Size.y != DEFAULT_SIZE_TEXT ) || m_Bold
|| m_Italic ) || m_Italic )
{ {
aFormatter->Print( aNestLevel+2, "(font" ); aFormatter->Print( 0, " (font" );
// Add font support here at some point in the future. // Add font support here at some point in the future.
@ -366,13 +366,13 @@ void EDA_TEXT::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControl
if( IsItalic() ) if( IsItalic() )
aFormatter->Print( 0, " italic" ); aFormatter->Print( 0, " italic" );
aFormatter->Print( 0, ")\n"); aFormatter->Print( 0, ")");
} }
if( m_Mirror || ( m_HJustify != GR_TEXT_HJUSTIFY_CENTER ) if( m_Mirror || ( m_HJustify != GR_TEXT_HJUSTIFY_CENTER )
|| ( m_VJustify != GR_TEXT_VJUSTIFY_CENTER ) ) || ( m_VJustify != GR_TEXT_VJUSTIFY_CENTER ) )
{ {
aFormatter->Print( aNestLevel+2, "(justify"); aFormatter->Print( 0, " (justify");
if( m_HJustify != GR_TEXT_HJUSTIFY_CENTER ) if( m_HJustify != GR_TEXT_HJUSTIFY_CENTER )
aFormatter->Print( 0, (m_HJustify == GR_TEXT_HJUSTIFY_LEFT) ? " left" : " right" ); aFormatter->Print( 0, (m_HJustify == GR_TEXT_HJUSTIFY_LEFT) ? " left" : " right" );
@ -383,13 +383,13 @@ void EDA_TEXT::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControl
if( m_Mirror ) if( m_Mirror )
aFormatter->Print( 0, " mirror" ); aFormatter->Print( 0, " mirror" );
aFormatter->Print( 0, ")\n" ); aFormatter->Print( 0, ")" );
} }
// As of now the only place this is used is in Eeschema to hide or show the text. // As of now the only place this is used is in Eeschema to hide or show the text.
if( m_Attributs ) if( m_Attributs )
aFormatter->Print( aNestLevel+2, "hide\n" ); aFormatter->Print( 0, " hide" );
aFormatter->Print( aNestLevel+1, ")\n" ); aFormatter->Print( 0, ")\n" );
} }
} }

View File

@ -24,6 +24,7 @@
# These are the keywords for the Pcbnew s-expression file format. # These are the keywords for the Pcbnew s-expression file format.
add_net add_net
allowed
angle angle
arc arc
arc_segments arc_segments
@ -48,6 +49,7 @@ comment
company company
connect connect
connect_pads connect_pads
copperpour
crossbar crossbar
date date
descr descr
@ -84,6 +86,7 @@ hatch
hide hide
italic italic
justify justify
keepout
kicad_pcb kicad_pcb
last_trace_width last_trace_width
layer layer
@ -107,10 +110,12 @@ nets
no no
no_connects no_connects
none none
not_allowed
np_thru_hole np_thru_hole
offset offset
oval oval
pad pad
pads
pad_drill pad_drill
pad_size pad_size
pad_to_mask_clearance pad_to_mask_clearance
@ -164,6 +169,7 @@ trace_clearance
trapezoid trapezoid
thru thru
thru_hole thru_hole
thru_hole_only
tstamp tstamp
user user
user_trace_width user_trace_width
@ -177,6 +183,7 @@ uvias_allowed
value value
version version
via via
vias
via_dia via_dia
via_drill via_drill
via_min_drill via_min_drill
@ -193,4 +200,5 @@ zone
zone_45_only zone_45_only
zone_clearance zone_clearance
zone_connect zone_connect
zone_type
zones zones

View File

@ -50,10 +50,10 @@
static void AbortCreateNewLine( EDA_DRAW_PANEL* Panel, wxDC* DC ); static void AbortCreateNewLine( EDA_DRAW_PANEL* Panel, wxDC* DC );
static void ComputeBreakPoint( SCH_LINE* segment, const wxPoint& new_pos ); static void ComputeBreakPoint( SCH_LINE* segment, const wxPoint& new_pos );
static DLIST< SCH_ITEM > s_wires; static DLIST< SCH_ITEM > s_wires; // when creating a new set of wires,
static DLIST< SCH_ITEM > s_oldWires; // stores here the new wires.
static DLIST< SCH_ITEM > s_oldWires; // when creating a new set of wires,
static wxPoint s_startPoint; // stores here the old wires (for undo command)
/** /**
@ -125,7 +125,6 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
if( !segment ) /* first point : Create first wire or bus */ if( !segment ) /* first point : Create first wire or bus */
{ {
s_startPoint = cursorpos;
GetScreen()->ExtractWires( s_oldWires, true ); GetScreen()->ExtractWires( s_oldWires, true );
GetScreen()->SchematicCleanUp( m_canvas ); GetScreen()->SchematicCleanUp( m_canvas );
@ -228,50 +227,40 @@ void SCH_EDIT_FRAME::EndSegment( wxDC* DC )
wxCHECK_RET( item->Type() == SCH_LINE_T, wxT( "Unexpected object type in wire list." ) ); wxCHECK_RET( item->Type() == SCH_LINE_T, wxT( "Unexpected object type in wire list." ) );
segment = (SCH_LINE*) item; segment = (SCH_LINE*) item;
item = item->Next();
if( segment->IsNull() ) if( segment->IsNull() )
{ delete s_wires.Remove( segment );
wxLogDebug( wxT( "Removing null segment: " ) + segment->GetSelectMenuText() );
SCH_ITEM* previousSegment = item->Back();
delete s_wires.Remove( item );
if( previousSegment == NULL )
item = s_wires.begin();
else
item = previousSegment;
wxLogDebug( wxT( "Segment count after removal: %d" ), s_wires.GetCount() );
}
item = item->Next();
} }
if( s_wires.GetCount() == 0 ) if( s_wires.GetCount() == 0 )
return; return;
// Get the last non-null wire. // Get the last non-null wire (this is the last created segment).
m_itemToRepeat = segment = (SCH_LINE*) s_wires.GetLast(); m_itemToRepeat = segment = (SCH_LINE*) s_wires.GetLast();
screen->SetCurItem( NULL ); screen->SetCurItem( NULL );
m_canvas->EndMouseCapture( -1, -1, wxEmptyString, false ); m_canvas->EndMouseCapture( -1, -1, wxEmptyString, false );
// store the terminal point of this last segment: a junction could be needed
// (the last wire could be merged/deleted/modified, and lost)
wxPoint endpoint = segment->GetEndPoint();
// store the starting point of this first segment: a junction could be needed
SCH_LINE* firstsegment = (SCH_LINE*) s_wires.GetFirst();
wxPoint startPoint = firstsegment->GetStartPoint();
screen->Append( s_wires ); screen->Append( s_wires );
// Correct and remove segments that need merged. // Correct and remove segments that need to be merged.
screen->SchematicCleanUp( NULL, DC ); screen->SchematicCleanUp( NULL, DC );
// A junction may be needed to connect the last segment. If the last segment was // A junction could be needed to connect the end point of the last created segment.
// removed by a cleanup, a junction may be needed to connect the segment's end point if( screen->IsJunctionNeeded( endpoint ) )
// which is also the same as the previous segment's start point. screen->Append( AddJunction( DC, endpoint ) );
if( screen->IsJunctionNeeded( segment->GetEndPoint() ) )
screen->Append( AddJunction( DC, segment->GetEndPoint() ) );
else if( screen->IsJunctionNeeded( segment->GetStartPoint() ) )
screen->Append( AddJunction( DC, segment->GetStartPoint() ) );
// Automatically place a junction on the start point if necessary because the cleanup // A junction could be needed to connect the start point of the set of new created wires
// can suppress intermediate points by merging wire segments. if( screen->IsJunctionNeeded( startPoint ) )
if( screen->IsJunctionNeeded( s_startPoint ) ) screen->Append( AddJunction( DC, startPoint ) );
screen->Append( AddJunction( DC, s_startPoint ) );
m_canvas->Refresh(); m_canvas->Refresh();

View File

@ -149,6 +149,14 @@ void DIALOG_PRINT_USING_PRINTER::OnInitDialog( wxInitDialogEvent& event )
m_buttonPrint->SetDefault(); m_buttonPrint->SetDefault();
} }
void DIALOG_PRINT_USING_PRINTER::GetPrintOptions()
{
SCH_EDIT_FRAME* parent = GetParent();
parent->SetPrintMonochrome( m_checkMonochrome->IsChecked() );
parent->SetPrintSheetReference( m_checkReference->IsChecked() );
}
void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event ) void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event )
{ {
@ -160,8 +168,7 @@ void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event )
parent->SetPrintDialogSize( GetSize() ); parent->SetPrintDialogSize( GetSize() );
} }
parent->SetPrintMonochrome( m_checkMonochrome->IsChecked() ); GetPrintOptions();
parent->SetPrintSheetReference( m_checkReference->IsChecked() );
EndDialog( wxID_CANCEL ); EndDialog( wxID_CANCEL );
} }
@ -187,8 +194,7 @@ void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event )
{ {
SCH_EDIT_FRAME* parent = GetParent(); SCH_EDIT_FRAME* parent = GetParent();
parent->SetPrintMonochrome( m_checkMonochrome->IsChecked() ); GetPrintOptions();
parent->SetPrintSheetReference( m_checkReference->IsChecked() );
// Pass two printout objects: for preview, and possible printing. // Pass two printout objects: for preview, and possible printing.
wxString title = _( "Preview" ); wxString title = _( "Preview" );
@ -216,8 +222,7 @@ void DIALOG_PRINT_USING_PRINTER::OnPrintButtonClick( wxCommandEvent& event )
{ {
SCH_EDIT_FRAME* parent = GetParent(); SCH_EDIT_FRAME* parent = GetParent();
parent->SetPrintMonochrome( m_checkMonochrome->IsChecked() ); GetPrintOptions();
parent->SetPrintSheetReference( m_checkReference->IsChecked() );
wxPrintDialogData printDialogData( parent->GetPageSetupData().GetPrintData() ); wxPrintDialogData printDialogData( parent->GetPageSetupData().GetPrintData() );
printDialogData.SetMaxPage( g_RootSheet->CountSheets() ); printDialogData.SetMaxPage( g_RootSheet->CountSheets() );

View File

@ -26,6 +26,8 @@ private:
void OnPrintPreview( wxCommandEvent& event ); void OnPrintPreview( wxCommandEvent& event );
void OnPrintButtonClick( wxCommandEvent& event ); void OnPrintButtonClick( wxCommandEvent& event );
void OnButtonCancelClick( wxCommandEvent& event ){ Close(); } void OnButtonCancelClick( wxCommandEvent& event ){ Close(); }
void GetPrintOptions();
}; };

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 16 2008) // C++ code generated with wxFormBuilder (version Mar 17 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -19,16 +19,22 @@ DIALOG_PRINT_USING_PRINTER_BASE::DIALOG_PRINT_USING_PRINTER_BASE( wxWindow* pare
wxBoxSizer* bleftSizer; wxBoxSizer* bleftSizer;
bleftSizer = new wxBoxSizer( wxVERTICAL ); bleftSizer = new wxBoxSizer( wxVERTICAL );
m_checkReference = new wxCheckBox( this, wxID_ANY, _("Print sheet &reference and title block"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText1 = new wxStaticText( this, wxID_ANY, _("Print options:"), wxDefaultPosition, wxDefaultSize, 0 );
m_checkReference->SetValue(true); m_staticText1->Wrap( -1 );
m_staticText1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
bleftSizer->Add( m_staticText1, 0, wxTOP|wxRIGHT, 5 );
m_checkReference = new wxCheckBox( this, wxID_ANY, _("Print sheet &reference and title block"), wxDefaultPosition, wxDefaultSize, 0 );
m_checkReference->SetValue(true);
m_checkReference->SetToolTip( _("Print (or not) the Frame references.") ); m_checkReference->SetToolTip( _("Print (or not) the Frame references.") );
bleftSizer->Add( m_checkReference, 0, wxALL, 5 ); bleftSizer->Add( m_checkReference, 0, wxALL, 10 );
m_checkMonochrome = new wxCheckBox( this, wxID_ANY, _("Print in &black and white only"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkMonochrome = new wxCheckBox( this, wxID_ANY, _("Print in &black and white only"), wxDefaultPosition, wxDefaultSize, 0 );
m_checkMonochrome->SetValue(true);
bleftSizer->Add( m_checkMonochrome, 0, wxBOTTOM|wxRIGHT|wxLEFT, 10 );
bleftSizer->Add( m_checkMonochrome, 0, wxALL, 5 );
bMainSizer->Add( bleftSizer, 1, wxBOTTOM|wxEXPAND|wxLEFT|wxTOP, 12 ); bMainSizer->Add( bleftSizer, 1, wxBOTTOM|wxEXPAND|wxLEFT|wxTOP, 12 );
@ -47,11 +53,12 @@ DIALOG_PRINT_USING_PRINTER_BASE::DIALOG_PRINT_USING_PRINTER_BASE( wxWindow* pare
m_buttonQuit = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonQuit = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
bbuttonsSizer->Add( m_buttonQuit, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); bbuttonsSizer->Add( m_buttonQuit, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
bMainSizer->Add( bbuttonsSizer, 0, wxALL, 12 ); bMainSizer->Add( bbuttonsSizer, 0, wxALL, 12 );
this->SetSizer( bMainSizer ); this->SetSizer( bMainSizer );
this->Layout(); this->Layout();
bMainSizer->Fit( this );
// Connect Events // Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnCloseWindow ) ); this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnCloseWindow ) );
@ -71,4 +78,5 @@ DIALOG_PRINT_USING_PRINTER_BASE::~DIALOG_PRINT_USING_PRINTER_BASE()
m_buttonPreview->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnPrintPreview ), NULL, this ); m_buttonPreview->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnPrintPreview ), NULL, this );
m_buttonPrint->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnPrintButtonClick ), NULL, this ); m_buttonPrint->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnPrintButtonClick ), NULL, this );
m_buttonQuit->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnButtonCancelClick ), NULL, this ); m_buttonQuit->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PRINT_USING_PRINTER_BASE::OnButtonCancelClick ), NULL, this );
} }

View File

@ -1,11 +1,12 @@
<?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="10" /> <FileVersion major="1" minor="11" />
<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>
<property name="disconnect_events">1</property> <property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property> <property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property> <property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property> <property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property> <property name="encoding">UTF-8</property>
@ -19,6 +20,7 @@
<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_php_events">1</property>
<property name="skip_python_events">1</property> <property name="skip_python_events">1</property>
<property name="use_enum">1</property> <property name="use_enum">1</property>
<property name="use_microsoft_bom">0</property> <property name="use_microsoft_bom">0</property>
@ -27,8 +29,11 @@
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_managed">0</property> <property name="aui_managed">0</property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
@ -51,7 +56,6 @@
<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="layer"></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>
@ -65,11 +69,9 @@
<property name="pane_size"></property> <property name="pane_size"></property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size">-1,-1</property> <property name="size">388,185</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="title">Print</property> <property name="title">Print</property>
@ -134,6 +136,93 @@
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxTOP|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font">,90,92,-1,70,0</property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Print options:</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_staticText1</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>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">10</property>
<property name="flag">wxALL</property> <property name="flag">wxALL</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxCheckBox" expanded="1"> <object class="wxCheckBox" expanded="1">
@ -141,7 +230,10 @@
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
@ -163,7 +255,6 @@
<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">Print sheet &amp;reference and title block</property> <property name="label">Print sheet &amp;reference and title block</property>
<property name="layer"></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>
@ -178,9 +269,7 @@
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>
@ -221,21 +310,24 @@
</object> </object>
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">10</property>
<property name="flag">wxALL</property> <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxCheckBox" expanded="1"> <object class="wxCheckBox" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
<property name="caption_visible">1</property> <property name="caption_visible">1</property>
<property name="center_pane">0</property> <property name="center_pane">0</property>
<property name="checked">0</property> <property name="checked">1</property>
<property name="close_button">1</property> <property name="close_button">1</property>
<property name="context_help"></property> <property name="context_help"></property>
<property name="context_menu">1</property> <property name="context_menu">1</property>
@ -251,7 +343,6 @@
<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">Print in &amp;black and white only</property> <property name="label">Print in &amp;black and white only</property>
<property name="layer"></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>
@ -266,9 +357,7 @@
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>
@ -328,7 +417,10 @@
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
@ -350,7 +442,6 @@
<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">Page Setup</property> <property name="label">Page Setup</property>
<property name="layer"></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>
@ -365,9 +456,7 @@
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>
@ -416,7 +505,10 @@
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
@ -438,7 +530,6 @@
<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">Preview</property> <property name="label">Preview</property>
<property name="layer"></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>
@ -453,9 +544,7 @@
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>
@ -504,7 +593,10 @@
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
@ -526,7 +618,6 @@
<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">Print</property> <property name="label">Print</property>
<property name="layer"></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>
@ -541,9 +632,7 @@
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>
@ -592,7 +681,10 @@
<property name="LeftDockable">1</property> <property name="LeftDockable">1</property>
<property name="RightDockable">1</property> <property name="RightDockable">1</property>
<property name="TopDockable">1</property> <property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property> <property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property> <property name="best_size"></property>
<property name="bg"></property> <property name="bg"></property>
<property name="caption"></property> <property name="caption"></property>
@ -614,7 +706,6 @@
<property name="hidden">0</property> <property name="hidden">0</property>
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Close</property> <property name="label">Close</property>
<property name="layer"></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>
@ -629,9 +720,7 @@
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="position"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="row"></property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style"></property> <property name="style"></property>

View File

@ -1,21 +1,23 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 16 2008) // C++ code generated with wxFormBuilder (version Mar 17 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#ifndef __dialog_print_using_printer_base__ #ifndef __DIALOG_PRINT_USING_PRINTER_BASE_H__
#define __dialog_print_using_printer_base__ #define __DIALOG_PRINT_USING_PRINTER_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h> #include <wx/intl.h>
#include <wx/string.h> #include <wx/string.h>
#include <wx/checkbox.h> #include <wx/stattext.h>
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
#include <wx/font.h> #include <wx/font.h>
#include <wx/colour.h> #include <wx/colour.h>
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/checkbox.h>
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/button.h> #include <wx/button.h>
#include <wx/dialog.h> #include <wx/dialog.h>
@ -30,6 +32,7 @@ class DIALOG_PRINT_USING_PRINTER_BASE : public wxDialog
private: private:
protected: protected:
wxStaticText* m_staticText1;
wxCheckBox* m_checkReference; wxCheckBox* m_checkReference;
wxCheckBox* m_checkMonochrome; wxCheckBox* m_checkMonochrome;
wxButton* m_buttonPageSetup; wxButton* m_buttonPageSetup;
@ -38,18 +41,19 @@ class DIALOG_PRINT_USING_PRINTER_BASE : public wxDialog
wxButton* m_buttonQuit; wxButton* m_buttonQuit;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnCloseWindow( wxCloseEvent& event ){ event.Skip(); } virtual void OnCloseWindow( wxCloseEvent& event ) { event.Skip(); }
virtual void OnInitDialog( wxInitDialogEvent& event ){ event.Skip(); } virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnPageSetup( wxCommandEvent& event ){ event.Skip(); } virtual void OnPageSetup( wxCommandEvent& event ) { event.Skip(); }
virtual void OnPrintPreview( wxCommandEvent& event ){ event.Skip(); } virtual void OnPrintPreview( wxCommandEvent& event ) { event.Skip(); }
virtual void OnPrintButtonClick( wxCommandEvent& event ){ event.Skip(); } virtual void OnPrintButtonClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnButtonCancelClick( wxCommandEvent& event ){ event.Skip(); } virtual void OnButtonCancelClick( wxCommandEvent& event ) { event.Skip(); }
public: public:
DIALOG_PRINT_USING_PRINTER_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Print"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
DIALOG_PRINT_USING_PRINTER_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Print"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 388,185 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_PRINT_USING_PRINTER_BASE(); ~DIALOG_PRINT_USING_PRINTER_BASE();
}; };
#endif //__dialog_print_using_printer_base__ #endif //__DIALOG_PRINT_USING_PRINTER_BASE_H__

View File

@ -85,9 +85,12 @@ HIERARCHY_TREE::HIERARCHY_TREE( HIERARCHY_NAVIG_DLG* parent ) :
m_Parent = parent; m_Parent = parent;
// Make an image list containing small icons // Make an image list containing small icons
imageList = new wxImageList( 16, 15, true, 2 ); // All icons are expected having the same size.
wxBitmap tree_nosel_bm( KiBitmap( tree_nosel_xpm ) );
imageList = new wxImageList( tree_nosel_bm.GetWidth(),
tree_nosel_bm.GetHeight(), true, 2 );
imageList->Add( KiBitmap( tree_nosel_xpm ) ); imageList->Add( tree_nosel_bm );
imageList->Add( KiBitmap( tree_sel_xpm ) ); imageList->Add( KiBitmap( tree_sel_xpm ) );
AssignImageList( imageList ); AssignImageList( imageList );
@ -147,36 +150,31 @@ HIERARCHY_NAVIG_DLG::HIERARCHY_NAVIG_DLG( SCH_EDIT_FRAME* parent, wxDC* DC, cons
cellule = m_Tree->AddRoot( _( "Root" ), 0, 1 ); cellule = m_Tree->AddRoot( _( "Root" ), 0, 1 );
m_Tree->SetItemBold( cellule, true ); m_Tree->SetItemBold( cellule, true );
SCH_SHEET_PATH list; SCH_SHEET_PATH list;
list.Push( g_RootSheet ); list.Push( g_RootSheet );
m_Tree->SetItemData( cellule, new TreeItemData( list ) ); m_Tree->SetItemData( cellule, new TreeItemData( list ) );
wxRect itemrect;
#ifdef __UNIX__
itemrect.SetWidth( 100 );
itemrect.SetHeight( 20 );
#else
m_Tree->GetBoundingRect( cellule, itemrect );
#endif
m_TreeSize.x = itemrect.GetWidth() + 10;
m_TreeSize.y = 20;
if( m_Parent->GetCurrentSheet().Last() == g_RootSheet ) if( m_Parent->GetCurrentSheet().Last() == g_RootSheet )
m_Tree->SelectItem( cellule ); //root. m_Tree->SelectItem( cellule ); //root.
maxposx = 15; maxposx = 15;
BuildSheetsTree( &list, &cellule ); BuildSheetsTree( &list, &cellule );
if( m_nbsheets > 1 ) m_Tree->Expand( cellule );
{
m_Tree->Expand( cellule );
// Readjust the size of the frame to an optimal value. wxRect itemrect;
m_TreeSize.y += m_nbsheets * itemrect.GetHeight(); m_Tree->GetBoundingRect( cellule, itemrect );
m_TreeSize.x = MIN( m_TreeSize.x, 250 );
m_TreeSize.y = MIN( m_TreeSize.y, 350 ); // Set dialog window size to be large enough
SetClientSize( m_TreeSize ); m_TreeSize.x = itemrect.GetWidth() + 20;
} m_TreeSize.x = max( m_TreeSize.x, 250 );
// Readjust the size of the frame to an optimal value.
m_TreeSize.y = m_nbsheets * itemrect.GetHeight();
m_TreeSize.y += 10;
SetClientSize( m_TreeSize );
} }

View File

@ -62,6 +62,7 @@ EXTERN_BITMAP( add_hierarchical_label_xpm )
EXTERN_BITMAP( add_hierarchical_subsheet_xpm ) EXTERN_BITMAP( add_hierarchical_subsheet_xpm )
EXTERN_BITMAP( add_hierar_pin_xpm ) EXTERN_BITMAP( add_hierar_pin_xpm )
EXTERN_BITMAP( add_junction_xpm ) EXTERN_BITMAP( add_junction_xpm )
EXTERN_BITMAP( add_keepout_area_xpm )
EXTERN_BITMAP( add_line2bus_xpm ) EXTERN_BITMAP( add_line2bus_xpm )
EXTERN_BITMAP( add_line_label_xpm ) EXTERN_BITMAP( add_line_label_xpm )
EXTERN_BITMAP( add_line_xpm ) EXTERN_BITMAP( add_line_xpm )

View File

@ -679,6 +679,8 @@ public:
int width = -1 ); int width = -1 );
virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill, virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill,
int width = -1 ); int width = -1 );
virtual void Arc( const wxPoint& aCenter, int aStAngle, int aEndAngle, int aRadius,
FILL_T aFill, int aWidth = -1 );
virtual void PlotPoly( const std::vector< wxPoint >& aCornerList, virtual void PlotPoly( const std::vector< wxPoint >& aCornerList,
FILL_T aFill, int aWidth = -1); FILL_T aFill, int aWidth = -1);

View File

@ -439,6 +439,13 @@ public:
bool OnHotkeyEditItem( int aIdCommand ); bool OnHotkeyEditItem( int aIdCommand );
/**
* Function OnHotkeyCopyItem
* returns the copy event id for copyable items.
* @return Event id of a suitable copy event, zero when no copyable item found.
*/
int OnHotkeyCopyItem();
/** /**
* Function OnHotkeyMoveItem * Function OnHotkeyMoveItem
* Moves or drag the item (footprint, track, text .. ) found under the mouse cursor * Moves or drag the item (footprint, track, text .. ) found under the mouse cursor
@ -911,9 +918,9 @@ public:
// Handling texts on the board // Handling texts on the board
void Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ); void Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC );
void FlipTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC ); void FlipTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC );
TEXTE_PCB* Create_Texte_Pcb( wxDC* DC ); TEXTE_PCB* CreateTextePcb( wxDC* aDC, TEXTE_PCB* aText = NULL );
void Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ); void Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC );
void StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC ); void StartMoveTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC, bool aErase = true );
void Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ); void Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC );
void InstallTextPCBOptionsFrame( TEXTE_PCB* TextPCB, wxDC* DC ); void InstallTextPCBOptionsFrame( TEXTE_PCB* TextPCB, wxDC* DC );

View File

@ -74,6 +74,8 @@ set(PCBNEW_DIALOGS
dialogs/dialog_graphic_item_properties_for_Modedit.cpp dialogs/dialog_graphic_item_properties_for_Modedit.cpp
dialogs/dialog_global_deletion.cpp dialogs/dialog_global_deletion.cpp
dialogs/dialog_global_deletion_base.cpp dialogs/dialog_global_deletion_base.cpp
dialogs/dialog_keepout_area_properties.cpp
dialogs/dialog_keepout_area_properties_base.cpp
dialogs/dialog_layers_setup.cpp dialogs/dialog_layers_setup.cpp
dialogs/dialog_layers_setup_base.cpp dialogs/dialog_layers_setup_base.cpp
dialogs/dialog_netlist.cpp dialogs/dialog_netlist.cpp

View File

@ -440,7 +440,7 @@ int PCB_EDIT_FRAME::GenPlaceBoard()
m_messagePanel->SetMessage( 14, _( "Cells." ), msg, YELLOW ); m_messagePanel->SetMessage( 14, _( "Cells." ), msg, YELLOW );
/* Choose the number of board sides. */ /* Choose the number of board sides. */
Nb_Sides = TWO_SIDES; RoutingMatrix.m_RoutingLayersCount = 2;
RoutingMatrix.InitRoutingMatrix(); RoutingMatrix.InitRoutingMatrix();
@ -450,7 +450,7 @@ int PCB_EDIT_FRAME::GenPlaceBoard()
Route_Layer_BOTTOM = LAYER_N_FRONT; Route_Layer_BOTTOM = LAYER_N_FRONT;
if( Nb_Sides == TWO_SIDES ) if( RoutingMatrix.m_RoutingLayersCount > 1 )
Route_Layer_BOTTOM = LAYER_N_BACK; Route_Layer_BOTTOM = LAYER_N_BACK;
Route_Layer_TOP = LAYER_N_FRONT; Route_Layer_TOP = LAYER_N_FRONT;
@ -618,7 +618,7 @@ int PCB_EDIT_FRAME::GetOptimalModulePlacement( MODULE* aModule, wxDC* aDC )
*/ */
TstOtherSide = false; TstOtherSide = false;
if( Nb_Sides == TWO_SIDES ) if( RoutingMatrix.m_RoutingLayersCount > 1 )
{ {
D_PAD* Pad; D_PAD* Pad;
int otherLayerMask = LAYER_BACK; int otherLayerMask = LAYER_BACK;
@ -967,7 +967,7 @@ void CreateKeepOutRectangle( int ux0, int uy0, int ux1, int uy1,
if( aLayerMask & GetLayerMask( Route_Layer_BOTTOM ) ) if( aLayerMask & GetLayerMask( Route_Layer_BOTTOM ) )
trace = 1; /* Trace on bottom layer. */ trace = 1; /* Trace on bottom layer. */
if( ( aLayerMask & GetLayerMask( Route_Layer_TOP ) ) && Nb_Sides ) if( ( aLayerMask & GetLayerMask( Route_Layer_TOP ) ) && RoutingMatrix.m_RoutingLayersCount )
trace |= 2; /* Trace on top layer. */ trace |= 2; /* Trace on top layer. */
if( trace == 0 ) if( trace == 0 )

View File

@ -47,12 +47,6 @@
#include <autorout.h> #include <autorout.h>
int Nb_Sides; /* Number of layer for autorouting (0 or 1) */
int OpenNodes; /* total number of nodes opened */
int ClosNodes; /* total number of nodes closed */
int MoveNodes; /* total number of nodes moved */
int MaxNodes; /* maximum number of nodes opened at one time */
MATRIX_ROUTING_HEAD RoutingMatrix; // routing matrix (grid) to route 2-sided boards MATRIX_ROUTING_HEAD RoutingMatrix; // routing matrix (grid) to route 2-sided boards
/* init board, route traces*/ /* init board, route traces*/
@ -175,10 +169,10 @@ void PCB_EDIT_FRAME::Autoroute( wxDC* DC, int mode )
m_messagePanel->EraseMsgBox(); m_messagePanel->EraseMsgBox();
/* Map the board */ /* Map the board */
Nb_Sides = ONE_SIDE; RoutingMatrix.m_RoutingLayersCount = 1;
if( Route_Layer_TOP != Route_Layer_BOTTOM ) if( Route_Layer_TOP != Route_Layer_BOTTOM )
Nb_Sides = TWO_SIDES; RoutingMatrix.m_RoutingLayersCount = 2;
if( RoutingMatrix.InitRoutingMatrix() < 0 ) if( RoutingMatrix.InitRoutingMatrix() < 0 )
{ {
@ -195,10 +189,7 @@ void PCB_EDIT_FRAME::Autoroute( wxDC* DC, int mode )
// DisplayRoutingMatrix( m_canvas, DC ); // DisplayRoutingMatrix( m_canvas, DC );
if( Nb_Sides == TWO_SIDES ) Solve( DC, RoutingMatrix.m_RoutingLayersCount );
Solve( DC, TWO_SIDES ); /* double face */
else
Solve( DC, ONE_SIDE ); /* simple face */
/* Free memory. */ /* Free memory. */
FreeQueue(); FreeQueue();
@ -249,7 +240,7 @@ void DisplayRoutingMatrix( EDA_DRAW_PANEL* panel, wxDC* DC )
if( dcell0 & HOLE ) if( dcell0 & HOLE )
color = GREEN; color = GREEN;
// if( Nb_Sides ) // if( RoutingMatrix.m_RoutingLayersCount )
// dcell1 = GetCell( row, col, TOP ); // dcell1 = GetCell( row, col, TOP );
if( dcell1 & HOLE ) if( dcell1 & HOLE )

View File

@ -46,7 +46,8 @@ class BOARD;
/* Autorouter commands. */ /* Autorouter commands. */
enum CommandOpt { enum AUTOPLACEROUTE_OPTIONS
{
PLACE_ALL, PLACE_ALL,
PLACE_OUT_OF_BOARD, PLACE_OUT_OF_BOARD,
PLACE_INCREMENTAL, PLACE_INCREMENTAL,
@ -58,13 +59,7 @@ enum CommandOpt {
ROUTE_PAD ROUTE_PAD
}; };
#define MAX_ROUTING_LAYERS_COUNT 2
#define ONE_SIDE 0
#define TWO_SIDES 1
#define MAX_SIDES_COUNT 2
extern int Nb_Sides; /* Number of layers for autorouting (0 or 1) */
#define FORCE_PADS 1 /* Force placement of pads for any Netcode */ #define FORCE_PADS 1 /* Force placement of pads for any Netcode */
@ -88,20 +83,23 @@ typedef char DIR_CELL;
class MATRIX_ROUTING_HEAD class MATRIX_ROUTING_HEAD
{ {
public: public:
MATRIX_CELL* m_BoardSide[MAX_SIDES_COUNT]; // the image map of 2 board sides MATRIX_CELL* m_BoardSide[MAX_ROUTING_LAYERS_COUNT]; // the image map of 2 board sides
DIST_CELL* m_DistSide[MAX_SIDES_COUNT]; // the image map of 2 board sides: distance to DIST_CELL* m_DistSide[MAX_ROUTING_LAYERS_COUNT]; // the image map of 2 board sides:
// cells // distance to cells
DIR_CELL* m_DirSide[MAX_SIDES_COUNT]; // the image map of 2 board sides: pointers back to DIR_CELL* m_DirSide[MAX_ROUTING_LAYERS_COUNT]; // the image map of 2 board sides:
// source // pointers back to source
bool m_InitMatrixDone; bool m_InitMatrixDone;
int m_Layers; // Layer count (1 2 ) int m_RoutingLayersCount; // Number of layers for autorouting (0 or 1)
int m_GridRouting; // Size of grid for autoplace/autoroute int m_GridRouting; // Size of grid for autoplace/autoroute
EDA_RECT m_BrdBox; // Actual board bounding box EDA_RECT m_BrdBox; // Actual board bounding box
int m_Nrows, m_Ncols; // Matrix size int m_Nrows, m_Ncols; // Matrix size
int m_MemSize; // Memory requirement, just for statistics int m_MemSize; // Memory requirement, just for statistics
int m_RouteCount; // Number of routes int m_RouteCount; // Number of routes
private: private:
void (MATRIX_ROUTING_HEAD::* m_opWriteCell)( int aRow, int aCol, int aSide, MATRIX_CELL aCell); // a pointeur to the current selected cell op // a pointer to the current selected cell operation
void (MATRIX_ROUTING_HEAD::* m_opWriteCell)( int aRow, int aCol,
int aSide, MATRIX_CELL aCell);
public: public:
MATRIX_ROUTING_HEAD(); MATRIX_ROUTING_HEAD();
@ -114,7 +112,7 @@ public:
/** /**
* function GetBrdCoordOrigin * function GetBrdCoordOrigin
* @returns the board coordinate corresponding to the * @return the board coordinate corresponding to the
* routing matrix origin ( board coordinate offset ) * routing matrix origin ( board coordinate offset )
*/ */
wxPoint GetBrdCoordOrigin() wxPoint GetBrdCoordOrigin()
@ -156,6 +154,12 @@ public:
void SetDist( int aRow, int aCol, int aSide, DIST_CELL ); void SetDist( int aRow, int aCol, int aSide, DIST_CELL );
int GetDir( int aRow, int aCol, int aSide ); int GetDir( int aRow, int aCol, int aSide );
void SetDir( int aRow, int aCol, int aSide, int aDir); void SetDir( int aRow, int aCol, int aSide, int aDir);
// calculate distance (with penalty) of a trace through a cell
int CalcDist(int x,int y,int z ,int side );
// calculate approximate distance (manhattan distance)
int GetApxDist( int r1, int c1, int r2, int c2 );
}; };
extern MATRIX_ROUTING_HEAD RoutingMatrix; /* 2-sided board */ extern MATRIX_ROUTING_HEAD RoutingMatrix; /* 2-sided board */
@ -220,10 +224,6 @@ int SetWork( int, int, int , int, int, RATSNEST_ITEM *, int );
void GetWork( int *, int *, int *, int *, int *, RATSNEST_ITEM ** ); void GetWork( int *, int *, int *, int *, int *, RATSNEST_ITEM ** );
void SortWork(); /* order the work items; shortest first */ void SortWork(); /* order the work items; shortest first */
/* DIST.CPP */
int GetApxDist( int r1, int c1, int r2, int c2 );
int CalcDist(int x,int y,int z ,int side );
/* routing_matrix.cpp */ /* routing_matrix.cpp */
int Build_Work( BOARD * Pcb ); int Build_Work( BOARD * Pcb );
void PlaceCells( BOARD * Pcb, int net_code, int flag = 0 ); void PlaceCells( BOARD * Pcb, int net_code, int flag = 0 );

View File

@ -39,7 +39,7 @@
/* calculate approximate distance (manhattan distance) /* calculate approximate distance (manhattan distance)
*/ */
int GetApxDist( int r1, int c1, int r2, int c2 ) int MATRIX_ROUTING_HEAD::GetApxDist( int r1, int c1, int r2, int c2 )
{ {
int d1, d2; /* row and column deltas */ int d1, d2; /* row and column deltas */
@ -135,7 +135,7 @@ static int dir_penalty_BOTTOM[10][10] =
/* calculate distance (with penalty) of a trace through a cell /* calculate distance (with penalty) of a trace through a cell
*/ */
int CalcDist(int x,int y,int z ,int side ) int MATRIX_ROUTING_HEAD::CalcDist(int x,int y,int z ,int side )
{ {
int adjust, ldist; int adjust, ldist;
@ -158,7 +158,7 @@ int CalcDist(int x,int y,int z ,int side )
ldist = dist[x-1][y-1] + penalty[x-1][y-1] + adjust; ldist = dist[x-1][y-1] + penalty[x-1][y-1] + adjust;
if( Nb_Sides ) if( m_RouteCount > 1 )
{ {
if( side == BOTTOM ) if( side == BOTTOM )
ldist += dir_penalty_TOP[x-1][y-1]; ldist += dir_penalty_TOP[x-1][y-1];

View File

@ -71,14 +71,14 @@ static void TraceCircle( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
if( layer < 0 ) \ if( layer < 0 ) \
{ \ { \
RoutingMatrix.WriteCell( dy, dx, BOTTOM, color ); \ RoutingMatrix.WriteCell( dy, dx, BOTTOM, color ); \
if( Nb_Sides ) \ if( RoutingMatrix.m_RoutingLayersCount > 1 ) \
RoutingMatrix.WriteCell( dy, dx, TOP, color ); \ RoutingMatrix.WriteCell( dy, dx, TOP, color ); \
} \ } \
else \ else \
{ \ { \
if( layer == Route_Layer_BOTTOM ) \ if( layer == Route_Layer_BOTTOM ) \
RoutingMatrix.WriteCell( dy, dx, BOTTOM, color ); \ RoutingMatrix.WriteCell( dy, dx, BOTTOM, color ); \
if( Nb_Sides ) \ if( RoutingMatrix.m_RoutingLayersCount > 1 ) \
if( layer == Route_Layer_TOP ) \ if( layer == Route_Layer_TOP ) \
RoutingMatrix.WriteCell( dy, dx, TOP, color ); \ RoutingMatrix.WriteCell( dy, dx, TOP, color ); \
} \ } \
@ -156,7 +156,7 @@ void TraceFilledCircle( int cx, int cy, int radius,
trace = 1; // Trace on BOTTOM trace = 1; // Trace on BOTTOM
if( aLayerMask & GetLayerMask( Route_Layer_TOP ) ) if( aLayerMask & GetLayerMask( Route_Layer_TOP ) )
if( Nb_Sides ) if( RoutingMatrix.m_RoutingLayersCount > 1 )
trace |= 2; // Trace on TOP trace |= 2; // Trace on TOP
if( trace == 0 ) if( trace == 0 )
@ -475,7 +475,7 @@ void TraceFilledRectangle( int ux0, int uy0, int ux1, int uy1,
if( ( aLayerMask & GetLayerMask( Route_Layer_BOTTOM ) ) ) if( ( aLayerMask & GetLayerMask( Route_Layer_BOTTOM ) ) )
trace = 1; // Trace on BOTTOM trace = 1; // Trace on BOTTOM
if( ( aLayerMask & GetLayerMask( Route_Layer_TOP ) ) && Nb_Sides ) if( ( aLayerMask & GetLayerMask( Route_Layer_TOP ) ) && RoutingMatrix.m_RoutingLayersCount > 1 )
trace |= 2; // Trace on TOP trace |= 2; // Trace on TOP
if( trace == 0 ) if( trace == 0 )
@ -542,7 +542,7 @@ void TraceFilledRectangle( int ux0, int uy0, int ux1, int uy1,
if( aLayerMask & GetLayerMask( Route_Layer_TOP ) ) if( aLayerMask & GetLayerMask( Route_Layer_TOP ) )
{ {
if( Nb_Sides ) if( RoutingMatrix.m_RoutingLayersCount > 1 )
trace |= 2; // Trace on TOP trace |= 2; // Trace on TOP
} }

View File

@ -46,6 +46,23 @@
#include <class_pcb_text.h> #include <class_pcb_text.h>
MATRIX_ROUTING_HEAD::MATRIX_ROUTING_HEAD()
{
m_BoardSide[0] = m_BoardSide[1] = NULL;
m_DistSide[0] = m_DistSide[1] = NULL;
m_DirSide[0] = m_DirSide[1] = NULL;
m_InitMatrixDone = false;
m_Nrows = m_Ncols = 0;
m_MemSize = 0;
m_RoutingLayersCount = 1;
}
MATRIX_ROUTING_HEAD::~MATRIX_ROUTING_HEAD()
{
}
bool MATRIX_ROUTING_HEAD::ComputeMatrixSize( BOARD* aPcb, bool aUseBoardEdgesOnly ) bool MATRIX_ROUTING_HEAD::ComputeMatrixSize( BOARD* aPcb, bool aUseBoardEdgesOnly )
{ {
aPcb->ComputeBoundingBox( aUseBoardEdgesOnly ); aPcb->ComputeBoundingBox( aUseBoardEdgesOnly );
@ -80,22 +97,6 @@ bool MATRIX_ROUTING_HEAD::ComputeMatrixSize( BOARD* aPcb, bool aUseBoardEdgesOnl
} }
MATRIX_ROUTING_HEAD::MATRIX_ROUTING_HEAD()
{
m_BoardSide[0] = m_BoardSide[1] = NULL;
m_DistSide[0] = m_DistSide[1] = NULL;
m_DirSide[0] = m_DirSide[1] = NULL;
m_InitMatrixDone = false;
m_Layers = MAX_SIDES_COUNT;
m_Nrows = m_Ncols = 0;
m_MemSize = 0;
}
MATRIX_ROUTING_HEAD::~MATRIX_ROUTING_HEAD()
{
}
int MATRIX_ROUTING_HEAD::InitRoutingMatrix() int MATRIX_ROUTING_HEAD::InitRoutingMatrix()
{ {
@ -109,7 +110,7 @@ int MATRIX_ROUTING_HEAD::InitRoutingMatrix()
// give a small margin for memory allocation: // give a small margin for memory allocation:
ii = (RoutingMatrix.m_Nrows + 1) * (RoutingMatrix.m_Ncols + 1); ii = (RoutingMatrix.m_Nrows + 1) * (RoutingMatrix.m_Ncols + 1);
for( kk = 0; kk < m_Layers; kk++ ) for( kk = 0; kk < m_RoutingLayersCount; kk++ )
{ {
m_BoardSide[kk] = NULL; m_BoardSide[kk] = NULL;
m_DistSide[kk] = NULL; m_DistSide[kk] = NULL;
@ -137,7 +138,7 @@ int MATRIX_ROUTING_HEAD::InitRoutingMatrix()
return -1; return -1;
} }
m_MemSize = m_Layers * ii * ( sizeof(MATRIX_CELL) + sizeof(DIST_CELL) + sizeof(char) ); m_MemSize = m_RouteCount * ii * ( sizeof(MATRIX_CELL) + sizeof(DIST_CELL) + sizeof(char) );
return m_MemSize; return m_MemSize;
} }
@ -149,7 +150,7 @@ void MATRIX_ROUTING_HEAD::UnInitRoutingMatrix()
m_InitMatrixDone = false; m_InitMatrixDone = false;
for( ii = 0; ii < MAX_SIDES_COUNT; ii++ ) for( ii = 0; ii < MAX_ROUTING_LAYERS_COUNT; ii++ )
{ {
// de-allocate Dir matrix // de-allocate Dir matrix
if( m_DirSide[ii] ) if( m_DirSide[ii] )
@ -179,14 +180,17 @@ void MATRIX_ROUTING_HEAD::UnInitRoutingMatrix()
/** /**
* Function PlaceCells * Function PlaceCells
* initializes the cell board is set and VIA_IMPOSSIBLE HOLE according to the setbacks. * Initialize the matrix routing by setting obstacles for each occupied cell
* The elements of net_code = net_code will not be occupied as places but only * a cell set to HOLE is an obstacle for tracks and vias
* VIA_IMPOSSIBLE * a cell set to VIA_IMPOSSIBLE is an obstacle for vias only.
* For single-sided Routing 1: * a cell set to CELL_is_EDGE is a frontier.
* BOTTOM side is used and Route_Layer_BOTTOM = Route_Layer_TOP * Tracks and vias having the same net code as net_code are skipped
* (htey do not are obstacles)
* *
* According to the bits = 1 parameter flag: * For single-sided Routing 1:
* If FORCE_PADS: all pads will be placed even those same net_code. * BOTTOM side is used, and Route_Layer_BOTTOM = Route_Layer_TOP
*
* If flag == FORCE_PADS: all pads will be put in matrix as obstacles.
*/ */
void PlaceCells( BOARD* aPcb, int net_code, int flag ) void PlaceCells( BOARD* aPcb, int net_code, int flag )
{ {
@ -347,8 +351,6 @@ int Build_Work( BOARD* Pcb )
int demi_pas = RoutingMatrix.m_GridRouting / 2; int demi_pas = RoutingMatrix.m_GridRouting / 2;
wxString msg; wxString msg;
EDA_RECT bbbox = Pcb->GetBoundingBox();
InitWork(); /* clear work list */ InitWork(); /* clear work list */
int cellCount = 0; int cellCount = 0;
@ -356,7 +358,7 @@ int Build_Work( BOARD* Pcb )
{ {
pt_rats = &Pcb->m_FullRatsnest[ii]; pt_rats = &Pcb->m_FullRatsnest[ii];
/* We consider her only ratsnest that are active ( obviously not yet routed) /* We consider here only ratsnest that are active ( obviously not yet routed)
* and routables (that are not yet attempt to be routed and fail * and routables (that are not yet attempt to be routed and fail
*/ */
if( (pt_rats->m_Status & CH_ACTIF) == 0 ) if( (pt_rats->m_Status & CH_ACTIF) == 0 )
@ -373,45 +375,47 @@ int Build_Work( BOARD* Pcb )
current_net_code = pt_pad->GetNet(); current_net_code = pt_pad->GetNet();
pt_ch = pt_rats; pt_ch = pt_rats;
r1 = ( pt_pad->GetPosition().y - bbbox.GetY() + demi_pas ) / RoutingMatrix.m_GridRouting; r1 = ( pt_pad->GetPosition().y - RoutingMatrix.m_BrdBox.GetY() + demi_pas )
/ RoutingMatrix.m_GridRouting;
if( r1 < 0 || r1 >= RoutingMatrix.m_Nrows ) if( r1 < 0 || r1 >= RoutingMatrix.m_Nrows )
{ {
msg.Printf( wxT( "error : row = %d ( padY %d pcbY %d) " ), r1, msg.Printf( wxT( "error : row = %d ( padY %d pcbY %d) " ), r1,
pt_pad->GetPosition().y, bbbox.GetY() ); pt_pad->GetPosition().y, RoutingMatrix.m_BrdBox.GetY() );
wxMessageBox( msg ); wxMessageBox( msg );
return 0; return 0;
} }
c1 = ( pt_pad->GetPosition().x - bbbox.GetX() + demi_pas ) / RoutingMatrix.m_GridRouting; c1 = ( pt_pad->GetPosition().x - RoutingMatrix.m_BrdBox.GetX() + demi_pas ) / RoutingMatrix.m_GridRouting;
if( c1 < 0 || c1 >= RoutingMatrix.m_Ncols ) if( c1 < 0 || c1 >= RoutingMatrix.m_Ncols )
{ {
msg.Printf( wxT( "error : col = %d ( padX %d pcbX %d) " ), c1, msg.Printf( wxT( "error : col = %d ( padX %d pcbX %d) " ), c1,
pt_pad->GetPosition().x, bbbox.GetX() ); pt_pad->GetPosition().x, RoutingMatrix.m_BrdBox.GetX() );
wxMessageBox( msg ); wxMessageBox( msg );
return 0; return 0;
} }
pt_pad = pt_rats->m_PadEnd; pt_pad = pt_rats->m_PadEnd;
r2 = ( pt_pad->GetPosition().y - bbbox.GetY() r2 = ( pt_pad->GetPosition().y - RoutingMatrix.m_BrdBox.GetY()
+ demi_pas ) / RoutingMatrix.m_GridRouting; + demi_pas ) / RoutingMatrix.m_GridRouting;
if( r2 < 0 || r2 >= RoutingMatrix.m_Nrows ) if( r2 < 0 || r2 >= RoutingMatrix.m_Nrows )
{ {
msg.Printf( wxT( "error : row = %d ( padY %d pcbY %d) " ), r2, msg.Printf( wxT( "error : row = %d ( padY %d pcbY %d) " ), r2,
pt_pad->GetPosition().y, bbbox.GetY() ); pt_pad->GetPosition().y, RoutingMatrix.m_BrdBox.GetY() );
wxMessageBox( msg ); wxMessageBox( msg );
return 0; return 0;
} }
c2 = ( pt_pad->GetPosition().x - bbbox.GetX() + demi_pas ) / RoutingMatrix.m_GridRouting; c2 = ( pt_pad->GetPosition().x - RoutingMatrix.m_BrdBox.GetX() + demi_pas )
/ RoutingMatrix.m_GridRouting;
if( c2 < 0 || c2 >= RoutingMatrix.m_Ncols ) if( c2 < 0 || c2 >= RoutingMatrix.m_Ncols )
{ {
msg.Printf( wxT( "error : col = %d ( padX %d pcbX %d) " ), c2, msg.Printf( wxT( "error : col = %d ( padX %d pcbX %d) " ), c2,
pt_pad->GetPosition().x, bbbox.GetX() ); pt_pad->GetPosition().x, RoutingMatrix.m_BrdBox.GetX() );
wxMessageBox( msg ); wxMessageBox( msg );
return 0; return 0;
} }
@ -424,7 +428,7 @@ int Build_Work( BOARD* Pcb )
return cellCount; return cellCount;
} }
// Initialize WriteCell to make the aLogicOp // Initialize m_opWriteCell member to make the aLogicOp
void MATRIX_ROUTING_HEAD::SetCellOperation( int aLogicOp ) void MATRIX_ROUTING_HEAD::SetCellOperation( int aLogicOp )
{ {
switch( aLogicOp ) switch( aLogicOp )

View File

@ -86,6 +86,10 @@ static int s_Clearance; // Clearance value used in autorouter
static PICKED_ITEMS_LIST s_ItemsListPicker; static PICKED_ITEMS_LIST s_ItemsListPicker;
int OpenNodes; /* total number of nodes opened */
int ClosNodes; /* total number of nodes closed */
int MoveNodes; /* total number of nodes moved */
int MaxNodes; /* maximum number of nodes opened at one time */
#define NOSUCCESS 0 #define NOSUCCESS 0
#define STOP_FROM_ESC -1 #define STOP_FROM_ESC -1
@ -263,7 +267,7 @@ static long newmask[8] =
* -1 if escape (stop being routed) request * -1 if escape (stop being routed) request
* -2 if default memory allocation * -2 if default memory allocation
*/ */
int PCB_EDIT_FRAME::Solve( wxDC* DC, int two_sides ) int PCB_EDIT_FRAME::Solve( wxDC* DC, int aLayersCount )
{ {
int current_net_code; int current_net_code;
int row_source, col_source, row_target, col_target; int row_source, col_source, row_target, col_target;
@ -272,6 +276,7 @@ int PCB_EDIT_FRAME::Solve( wxDC* DC, int two_sides )
bool stop = false; bool stop = false;
wxString msg; wxString msg;
int routedCount = 0; // routed ratsnest count int routedCount = 0; // routed ratsnest count
bool two_sides = aLayersCount == 2;
m_canvas->SetAbortRequest( false ); m_canvas->SetAbortRequest( false );
@ -522,7 +527,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
} }
InitQueue(); /* initialize the search queue */ InitQueue(); /* initialize the search queue */
apx_dist = GetApxDist( row_source, col_source, row_target, col_target ); apx_dist = RoutingMatrix.GetApxDist( row_source, col_source, row_target, col_target );
/* Initialize first search. */ /* Initialize first search. */
if( two_sides ) /* Preferred orientation. */ if( two_sides ) /* Preferred orientation. */
@ -713,7 +718,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
} }
olddir = RoutingMatrix.GetDir( r, c, side ); olddir = RoutingMatrix.GetDir( r, c, side );
newdist = d + CalcDist( ndir[i], olddir, newdist = d + RoutingMatrix.CalcDist( ndir[i], olddir,
( olddir == FROM_OTHERSIDE ) ? ( olddir == FROM_OTHERSIDE ) ?
RoutingMatrix.GetDir( r, c, 1 - side ) : 0, side ); RoutingMatrix.GetDir( r, c, 1 - side ) : 0, side );
@ -725,7 +730,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
RoutingMatrix.SetDist( nr, nc, side, newdist ); RoutingMatrix.SetDist( nr, nc, side, newdist );
if( SetQueue( nr, nc, side, newdist, if( SetQueue( nr, nc, side, newdist,
GetApxDist( nr, nc, row_target, col_target ), RoutingMatrix.GetApxDist( nr, nc, row_target, col_target ),
row_target, col_target ) == 0 ) row_target, col_target ) == 0 )
{ {
return ERR_MEMORY; return ERR_MEMORY;
@ -736,7 +741,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
RoutingMatrix.SetDir( nr, nc, side, ndir[i] ); RoutingMatrix.SetDir( nr, nc, side, ndir[i] );
RoutingMatrix.SetDist( nr, nc, side, newdist ); RoutingMatrix.SetDist( nr, nc, side, newdist );
ReSetQueue( nr, nc, side, newdist, ReSetQueue( nr, nc, side, newdist,
GetApxDist( nr, nc, row_target, col_target ), RoutingMatrix.GetApxDist( nr, nc, row_target, col_target ),
row_target, col_target ); row_target, col_target );
} }
} }
@ -781,7 +786,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
if( skip ) /* neighboring hole or trace? */ if( skip ) /* neighboring hole or trace? */
continue; /* yes, can't drill via here */ continue; /* yes, can't drill via here */
newdist = d + CalcDist( FROM_OTHERSIDE, olddir, 0, side ); newdist = d + RoutingMatrix.CalcDist( FROM_OTHERSIDE, olddir, 0, side );
/* if (a) not visited yet, /* if (a) not visited yet,
* or (b) we have found a better path, * or (b) we have found a better path,

View File

@ -41,9 +41,9 @@
#include <cell.h> #include <cell.h>
struct CWORK // a unit of work is a source-target (a ratsnet item) to connect struct CWORK // a unit of work is a source-target to connect
// this is a ratsnest item in the routing matrix world
{ {
struct CWORK* m_Next;
int m_FromRow; // source row int m_FromRow; // source row
int m_FromCol; // source column int m_FromCol; // source column
int m_ToRow; // target row int m_ToRow; // target row
@ -53,34 +53,22 @@ struct CWORK // a unit of work is a source-target (a ratsnet item) to connect
int m_ApxDist; // approximate distance int m_ApxDist; // approximate distance
int m_Cost; // cost for sort by length int m_Cost; // cost for sort by length
int m_Priority; // route priority int m_Priority; // route priority
// the function that calculates the cost of this ratsnest:
void CalculateCost();
}; };
// pointers to the first and last item of work to do // the list of ratsnests
static CWORK* Head = NULL; static std::vector <CWORK> WorkList;
static CWORK* Tail = NULL; static unsigned Current = 0;
static CWORK* Current = NULL;
// initialize the work list // initialize the work list
void InitWork() void InitWork()
{ {
CWORK* ptr; WorkList.clear();
Current = 0;
while( ( ptr = Head ) != NULL )
{
Head = ptr->m_Next;
delete ptr;
}
Tail = Current = NULL;
}
// initialize the work list
void ReInitWork()
{
Current = Head;
} }
@ -89,40 +77,24 @@ void ReInitWork()
* 1 if OK * 1 if OK
* 0 if memory allocation failed * 0 if memory allocation failed
*/ */
static int GetCost( int r1, int c1, int r2, int c2 );
int SetWork( int r1, int c1, int SetWork( int r1, int c1,
int n_c, int n_c,
int r2, int c2, int r2, int c2,
RATSNEST_ITEM* pt_ch, int pri ) RATSNEST_ITEM* pt_ch, int pri )
{ {
CWORK* p; CWORK item;
item.m_FromRow = r1;
if( ( p = (CWORK*) operator new( sizeof(CWORK), std::nothrow ) ) != NULL ) item.m_FromCol = c1;
{ item.m_NetCode = n_c;
p->m_FromRow = r1; item.m_ToRow = r2;
p->m_FromCol = c1; item.m_ToCol = c2;
p->m_NetCode = n_c; item.m_Ratsnest = pt_ch;
p->m_ToRow = r2; item.m_ApxDist = RoutingMatrix.GetApxDist( r1, c1, r2, c2 );
p->m_ToCol = c2; item.CalculateCost();
p->m_Ratsnest = pt_ch; item.m_Priority = pri;
p->m_ApxDist = GetApxDist( r1, c1, r2, c2 ); WorkList.push_back( item );
p->m_Cost = GetCost( r1, c1, r2, c2 ); return 1;
p->m_Priority = pri;
p->m_Next = NULL;
if( Head ) /* attach at end */
Tail->m_Next = p;
else /* first in list */
Head = Current = p;
Tail = p;
return 1;
}
else /* can't get any more memory */
{
return 0;
}
} }
@ -132,15 +104,15 @@ void GetWork( int* r1, int* c1,
int* r2, int* c2, int* r2, int* c2,
RATSNEST_ITEM** pt_ch ) RATSNEST_ITEM** pt_ch )
{ {
if( Current ) if( Current < WorkList.size() )
{ {
*r1 = Current->m_FromRow; *r1 = WorkList[Current].m_FromRow;
*c1 = Current->m_FromCol; *c1 = WorkList[Current].m_FromCol;
*n_c = Current->m_NetCode; *n_c = WorkList[Current].m_NetCode;
*r2 = Current->m_ToRow; *r2 = WorkList[Current].m_ToRow;
*c2 = Current->m_ToCol; *c2 = WorkList[Current].m_ToCol;
*pt_ch = Current->m_Ratsnest; *pt_ch = WorkList[Current].m_Ratsnest;
Current = Current->m_Next; Current++;
} }
else /* none left */ else /* none left */
{ {
@ -151,64 +123,18 @@ void GetWork( int* r1, int* c1,
} }
/* order the work items; shortest (low cost) first */ // order the work items; shortest (low cost) first:
bool sort_by_cost( const CWORK& ref, const CWORK& item )
{
if( ref.m_Priority == item.m_Priority )
return ref.m_Cost < item.m_Cost;
return ref.m_Priority >= item.m_Priority;
}
void SortWork() void SortWork()
{ {
CWORK* p; sort( WorkList.begin(), WorkList.end(), sort_by_cost );
CWORK* q0; /* put PRIORITY PAD_CONNECTs in q0 */
CWORK* q1; /* sort other PAD_CONNECTs in q1 */
CWORK* r;
q0 = q1 = NULL;
while( (p = Head) != NULL ) /* prioritize each work item */
{
Head = Head->m_Next;
if( p->m_Priority ) /* put at end of priority list */
{
p->m_Next = NULL;
if( (r = q0) == NULL ) /* empty list? */
{
q0 = p;
}
else /* attach at end */
{
while( r->m_Next ) /* search for end */
r = r->m_Next;
r->m_Next = p; /* attach */
}
}
else if( ( ( r = q1 ) == NULL ) || ( p->m_Cost < q1->m_Cost ) )
{
p->m_Next = q1;
q1 = p;
}
else /* find proper position in list */
{
while( r->m_Next && p->m_Cost >= r->m_Next->m_Cost )
r = r->m_Next;
p->m_Next = r->m_Next;
r->m_Next = p;
}
}
if( (p = q0) != NULL ) /* any priority PAD_CONNECTs? */
{
while( q0->m_Next )
q0 = q0->m_Next;
q0->m_Next = q1;
}
else
p = q1;
/* reposition Head and Tail */
for( Head = Current = Tail = p; Tail && Tail->m_Next; Tail = Tail->m_Next )
;
} }
@ -216,13 +142,13 @@ void SortWork()
* cost = (| dx | + | dy |) * disability * cost = (| dx | + | dy |) * disability
* disability = 1 if dx or dy = 0, max if | dx | # | dy | * disability = 1 if dx or dy = 0, max if | dx | # | dy |
*/ */
static int GetCost( int r1, int c1, int r2, int c2 ) void CWORK::CalculateCost()
{ {
int dx, dy, mx, my; int dx, dy, mx, my;
double incl = 1.0; double incl = 1.0;
dx = abs( c2 - c1 ); dx = abs( m_ToCol - m_FromCol );
dy = abs( r2 - r1 ); dy = abs( m_ToRow - m_FromRow );
mx = dx; mx = dx;
my = dy; my = dy;
@ -234,5 +160,5 @@ static int GetCost( int r1, int c1, int r2, int c2 )
if( mx ) if( mx )
incl += (2 * (double) my / mx); incl += (2 * (double) my / mx);
return (int) ( ( dx + dy ) * incl ); m_Cost = (int) ( ( dx + dy ) * incl );
} }

View File

@ -76,7 +76,7 @@ BOARD::BOARD() :
for( int layer = 0; layer < LAYER_COUNT; ++layer ) for( int layer = 0; layer < LAYER_COUNT; ++layer )
{ {
m_Layer[layer].m_Name = GetDefaultLayerName( layer ); m_Layer[layer].m_Name = GetDefaultLayerName( layer, true );
if( layer <= LAST_COPPER_LAYER ) if( layer <= LAST_COPPER_LAYER )
m_Layer[layer].m_Type = LT_SIGNAL; m_Layer[layer].m_Type = LT_SIGNAL;
@ -355,7 +355,7 @@ bool BOARD::SetLayer( int aIndex, const LAYER& aLayer )
} }
wxString BOARD::GetLayerName( int aLayerIndex ) const wxString BOARD::GetLayerName( int aLayerIndex, bool aTranslate ) const
{ {
if( !IsValidLayerIndex( aLayerIndex ) ) if( !IsValidLayerIndex( aLayerIndex ) )
return wxEmptyString; return wxEmptyString;
@ -365,14 +365,51 @@ wxString BOARD::GetLayerName( int aLayerIndex ) const
{ {
// default names were set in BOARD::BOARD() but they may be // default names were set in BOARD::BOARD() but they may be
// over-ridden by BOARD::SetLayerName() // over-ridden by BOARD::SetLayerName()
return m_Layer[aLayerIndex].m_Name; // For non translated name, return the actual copper layer names,
// otherwise, return the native layer names
if( aTranslate || aLayerIndex < FIRST_NO_COPPER_LAYER )
return m_Layer[aLayerIndex].m_Name;
} }
return GetDefaultLayerName( aLayerIndex ); return GetDefaultLayerName( aLayerIndex, aTranslate );
} }
wxString BOARD::GetDefaultLayerName( int aLayerNumber ) // Default layer names are statically initialized,
// because we want the English name and the translation
// The English name is stored here, and to get the tranlation
// wxGetTranslation must be called explicitely
static const wxChar * layer_FRONT_name = _( "Front" );
static const wxChar * layer_INNER1_name = _( "Inner1" );
static const wxChar * layer_INNER2_name = _( "Inner2" );
static const wxChar * layer_INNER3_name = _( "Inner3" );
static const wxChar * layer_INNER4_name = _( "Inner4" );
static const wxChar * layer_INNER5_name = _( "Inner5" );
static const wxChar * layer_INNER6_name = _( "Inner6" );
static const wxChar * layer_INNER7_name = _( "Inner7" );
static const wxChar * layer_INNER8_name = _( "Inner8" );
static const wxChar * layer_INNER9_name = _( "Inner9" );
static const wxChar * layer_INNER10_name = _( "Inner10" );
static const wxChar * layer_INNER11_name = _( "Inner11" );
static const wxChar * layer_INNER12_name = _( "Inner12" );
static const wxChar * layer_INNER13_name = _( "Inner13" );
static const wxChar * layer_INNER14_name = _( "Inner14" );
static const wxChar * layer_BACK_name = _( "Back" );
static const wxChar * layer_ADHESIVE_BACK_name = _( "Adhes_Back" );
static const wxChar * layer_ADHESIVE_FRONT_name = _( "Adhes_Front" );
static const wxChar * layer_SOLDERPASTE_BACK_namet = _( "SoldP_Back" );
static const wxChar * layer_SOLDERPASTE_FRONT_name = _( "SoldP_Front" );
static const wxChar * layer_SILKSCREEN_BACK_name = _( "SilkS_Back" );
static const wxChar * layer_SILKSCREEN_FRONT_name = _( "SilkS_Front" );
static const wxChar * layer_SOLDERMASK_BACK_name = _( "Mask_Back" );
static const wxChar * layer_SOLDERMASK_FRONT_name = _( "Mask_Front" );
static const wxChar * layer_DRAW_name = _( "Drawings" );
static const wxChar * layer_COMMENT_name = _( "Comments" );
static const wxChar * layer_ECO1_name = _( "Eco1" );
static const wxChar * layer_ECO2_name = _( "Eco2" );
static const wxChar * layer_EDGE_name = _( "PCB_Edges" );
wxString BOARD::GetDefaultLayerName( int aLayerNumber, bool aTranslate )
{ {
const wxChar* txt; const wxChar* txt;
@ -382,39 +419,49 @@ wxString BOARD::GetDefaultLayerName( int aLayerNumber )
// Use a switch to explicitly show the mapping more clearly // Use a switch to explicitly show the mapping more clearly
switch( aLayerNumber ) switch( aLayerNumber )
{ {
case LAYER_N_FRONT: txt = _( "Front" ); break; case LAYER_N_FRONT: txt = layer_FRONT_name; break;
case LAYER_N_2: txt = _( "Inner2" ); break; case LAYER_N_2: txt = layer_INNER1_name; break;
case LAYER_N_3: txt = _( "Inner3" ); break; case LAYER_N_3: txt = layer_INNER2_name; break;
case LAYER_N_4: txt = _( "Inner4" ); break; case LAYER_N_4: txt = layer_INNER3_name; break;
case LAYER_N_5: txt = _( "Inner5" ); break; case LAYER_N_5: txt = layer_INNER4_name; break;
case LAYER_N_6: txt = _( "Inner6" ); break; case LAYER_N_6: txt = layer_INNER5_name; break;
case LAYER_N_7: txt = _( "Inner7" ); break; case LAYER_N_7: txt = layer_INNER6_name; break;
case LAYER_N_8: txt = _( "Inner8" ); break; case LAYER_N_8: txt = layer_INNER7_name; break;
case LAYER_N_9: txt = _( "Inner9" ); break; case LAYER_N_9: txt = layer_INNER8_name; break;
case LAYER_N_10: txt = _( "Inner10" ); break; case LAYER_N_10: txt = layer_INNER9_name; break;
case LAYER_N_11: txt = _( "Inner11" ); break; case LAYER_N_11: txt = layer_INNER10_name; break;
case LAYER_N_12: txt = _( "Inner12" ); break; case LAYER_N_12: txt = layer_INNER11_name; break;
case LAYER_N_13: txt = _( "Inner13" ); break; case LAYER_N_13: txt = layer_INNER12_name; break;
case LAYER_N_14: txt = _( "Inner14" ); break; case LAYER_N_14: txt = layer_INNER13_name; break;
case LAYER_N_15: txt = _( "Inner15" ); break; case LAYER_N_15: txt = layer_INNER14_name; break;
case LAYER_N_BACK: txt = _( "Back" ); break; case LAYER_N_BACK: txt = layer_BACK_name; break;
case ADHESIVE_N_BACK: txt = _( "Adhes_Back" ); break; case ADHESIVE_N_BACK: txt =layer_ADHESIVE_BACK_name; break;
case ADHESIVE_N_FRONT: txt = _( "Adhes_Front" ); break; case ADHESIVE_N_FRONT: txt = layer_ADHESIVE_FRONT_name; break;
case SOLDERPASTE_N_BACK: txt = _( "SoldP_Back" ); break; case SOLDERPASTE_N_BACK: txt = layer_SOLDERPASTE_BACK_namet; break;
case SOLDERPASTE_N_FRONT: txt = _( "SoldP_Front" ); break; case SOLDERPASTE_N_FRONT: txt = layer_SOLDERPASTE_FRONT_name; break;
case SILKSCREEN_N_BACK: txt = _( "SilkS_Back" ); break; case SILKSCREEN_N_BACK: txt = layer_SILKSCREEN_BACK_name; break;
case SILKSCREEN_N_FRONT: txt = _( "SilkS_Front" ); break; case SILKSCREEN_N_FRONT: txt = layer_SILKSCREEN_FRONT_name; break;
case SOLDERMASK_N_BACK: txt = _( "Mask_Back" ); break; case SOLDERMASK_N_BACK: txt = layer_SOLDERMASK_BACK_name; break;
case SOLDERMASK_N_FRONT: txt = _( "Mask_Front" ); break; case SOLDERMASK_N_FRONT: txt = layer_SOLDERMASK_FRONT_name; break;
case DRAW_N: txt = _( "Drawings" ); break; case DRAW_N: txt = layer_DRAW_name; break;
case COMMENT_N: txt = _( "Comments" ); break; case COMMENT_N: txt = layer_COMMENT_name; break;
case ECO1_N: txt = _( "Eco1" ); break; case ECO1_N: txt = layer_ECO1_name; break;
case ECO2_N: txt = _( "Eco2" ); break; case ECO2_N: txt = layer_ECO2_name; break;
case EDGE_N: txt = _( "PCB_Edges" ); break; case EDGE_N: txt = layer_EDGE_name; break;
default: txt = _( "BAD INDEX" ); break; default: txt = wxT( "BAD_INDEX" ); break;
} }
return wxString( txt ); wxString name;
if( aTranslate )
{
name = wxGetTranslation( txt );
name.Trim( true );
name.Trim( false );
}
else
name = txt;
return name;
} }
@ -1334,13 +1381,10 @@ NETINFO_ITEM* BOARD::FindNet( int aNetcode ) const
NETINFO_ITEM* net = m_NetInfo.GetNetItem( aNetcode ); NETINFO_ITEM* net = m_NetInfo.GetNetItem( aNetcode );
#if defined(DEBUG) #if defined(DEBUG)
if( net ) // item can be NULL if anetcode is not valid if( net && aNetcode != net->GetNet()) // item can be NULL if anetcode is not valid
{ {
if( aNetcode != net->GetNet() ) wxLogError( wxT( "FindNet() anetcode %d != GetNet() %d (net: %s)\n" ),
{ aNetcode, net->GetNet(), TO_UTF8( net->GetNetname() ) );
printf( "FindNet() anetcode %d != GetNet() %d (net: %s)\n",
aNetcode, net->GetNet(), TO_UTF8( net->GetNetname() ) );
}
} }
#endif #endif
@ -1393,7 +1437,7 @@ NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) const
if( item == NULL ) if( item == NULL )
return NULL; return NULL;
int icmp = item->GetNetname().Cmp( aNetname ); int icmp = item->GetNetname().Cmp( aNetname );
if( icmp == 0 ) // found ! if( icmp == 0 ) // found !
{ {

View File

@ -303,10 +303,12 @@ public:
* be different than the default if the user has renamed any copper layers. * be different than the default if the user has renamed any copper layers.
* *
* @param aLayerNumber is the layer number to fetch * @param aLayerNumber is the layer number to fetch
* @param aTranslate = true to return the translated version
* = false to get the native version
* @return wxString - containing the layer name or "BAD INDEX" if aLayerNumber * @return wxString - containing the layer name or "BAD INDEX" if aLayerNumber
* is not legal * is not legal
*/ */
static wxString GetDefaultLayerName( int aLayerNumber ); static wxString GetDefaultLayerName( int aLayerNumber, bool aTranslate );
/** /**
* Function ReturnFlippedLayerNumber * Function ReturnFlippedLayerNumber
@ -619,10 +621,13 @@ public:
* Function GetLayerName * Function GetLayerName
* returns the name of the layer given by aLayerIndex. * returns the name of the layer given by aLayerIndex.
* *
* @param aLayerIndex A layer index, like LAYER_N_BACK, etc. * @param aLayerIndex = A layer index, like LAYER_N_BACK, etc.
* @param aTranslate = true to return the translated version (default)
* = false to get the native English name
* (Useful to build filenames from layer names)
* @return wxString - the layer name. * @return wxString - the layer name.
*/ */
wxString GetLayerName( int aLayerIndex ) const; wxString GetLayerName( int aLayerIndex, bool aTranslate = true ) const;
/** /**
* Function SetLayerName * Function SetLayerName
@ -1048,16 +1053,6 @@ public:
*/ */
ZONE_CONTAINER* InsertArea( int netcode, int iarea, int layer, int x, int y, int hatch ); ZONE_CONTAINER* InsertArea( int netcode, int iarea, int layer, int x, int y, int hatch );
/**
* Function CompleteArea
* complete copper area contour by adding a line from last to first corner
* if there is only 1 or 2 corners, remove (delete) the area
* @param area_to_complete = area to complete or remove
* @param style = style of last corner
* @return 1 if Ok, 0 if area removed
*/
int CompleteArea( ZONE_CONTAINER* area_to_complete, int style );
/** /**
* Function TestAreaPolygon * Function TestAreaPolygon
* Test an area for self-intersection. * Test an area for self-intersection.

View File

@ -112,7 +112,6 @@ void DRAWSEGMENT::Flip( const wxPoint& aCentre )
SetLayer( BOARD::ReturnFlippedLayerNumber( GetLayer() ) ); SetLayer( BOARD::ReturnFlippedLayerNumber( GetLayer() ) );
} }
const wxPoint DRAWSEGMENT::GetArcEnd() const const wxPoint DRAWSEGMENT::GetArcEnd() const
{ {
wxPoint endPoint; // start of arc wxPoint endPoint; // start of arc
@ -134,45 +133,23 @@ const wxPoint DRAWSEGMENT::GetArcEnd() const
return endPoint; // after rotation, the end of the arc. return endPoint; // after rotation, the end of the arc.
} }
const double DRAWSEGMENT::GetArcAngleStart() const
/* use GetArcStart() now
const wxPoint DRAWSEGMENT::GetStart() const
{ {
switch( m_Shape ) // due to the Y axis orient atan2 needs - y value
{ double angleStart = atan2( (double)(GetArcStart().y - GetCenter().y),
case S_ARC: (double)(GetArcStart().x - GetCenter().x) );
return m_End; // the start of the arc is held in field m_End, center point is in m_Start. // angleStart is in radians, convert it in 1/10 degrees
angleStart = angleStart / M_PI * 1800.0;
case S_SEGMENT: // Normalize it to 0 ... 360 deg, to avoid discontinuity for angles near 180 deg
default: // because 180 deg and -180 are very near angles when ampping betewwen -180 ... 180 deg.
return m_Start; // and this is not easy to handle in calculations
} if( angleStart < 0 )
angleStart += 3600.0;
return angleStart;
} }
const wxPoint DRAWSEGMENT::GetEnd() const
{
wxPoint endPoint; // start of arc
switch( m_Shape )
{
case S_ARC:
// rotate the starting point of the arc, given by m_End, through the
// angle m_Angle to get the ending point of the arc.
// m_Start is the arc centre
endPoint = m_End; // m_End = start point of arc
RotatePoint( &endPoint, m_Start, -m_Angle );
return endPoint; // after rotation, the end of the arc.
break;
case S_SEGMENT:
default:
return m_End;
}
}
*/
void DRAWSEGMENT::SetAngle( double aAngle ) void DRAWSEGMENT::SetAngle( double aAngle )
{ {
NORMALIZE_ANGLE_360( aAngle ); NORMALIZE_ANGLE_360( aAngle );
@ -450,14 +427,12 @@ EDA_RECT DRAWSEGMENT::GetBoundingBox() const
bool DRAWSEGMENT::HitTest( const wxPoint& aPosition ) bool DRAWSEGMENT::HitTest( const wxPoint& aPosition )
{ {
/* Calculate coordinates to test relative to segment origin. */
wxPoint relPos = aPosition - m_Start;
switch( m_Shape ) switch( m_Shape )
{ {
case S_CIRCLE: case S_CIRCLE:
case S_ARC: case S_ARC:
{ {
wxPoint relPos = aPosition - GetCenter();
int radius = GetRadius(); int radius = GetRadius();
int dist = (int) hypot( (double) relPos.x, (double) relPos.y ); int dist = (int) hypot( (double) relPos.x, (double) relPos.y );
@ -466,18 +441,35 @@ bool DRAWSEGMENT::HitTest( const wxPoint& aPosition )
if( m_Shape == S_CIRCLE ) if( m_Shape == S_CIRCLE )
return true; return true;
wxPoint startVec = wxPoint( m_End.x - m_Start.x, m_End.y - m_Start.y ); // For arcs, the test point angle must be >= arc angle start
wxPoint endVec = m_End - m_Start; // and <= arc angle end
RotatePoint( &endVec, -m_Angle ); // However angle values > 360 deg are not easy to handle
// so we calculate the relative angle between arc start point and teast point
// this relative arc should be < arc angle if arc angle > 0 (CW arc)
// and > arc angle if arc angle < 0 (CCW arc)
double arc_angle_start = GetArcAngleStart(); // Always 0.0 ... 360 deg, in 0.1 deg
// Check dot products double arc_hittest = atan2( (double) relPos.y, (double) relPos.x );
if( (long long)relPos.x*startVec.x + (long long)relPos.y*startVec.y < 0 ) arc_hittest = arc_hittest / M_PI * 1800; // angles are in 1/10 deg
return false;
if( (long long)relPos.x*endVec.x + (long long)relPos.y*endVec.y < 0 ) // Calculate relative angle between the starting point of the arc, and the test point
return false; arc_hittest -= arc_angle_start;
return true; // Normalise arc_hittest between 0 ... 360 deg
NORMALIZE_ANGLE_POS( arc_hittest );
// Check angle: inside the arc angle when it is > 0
// and outside the not drawn arc when it is < 0
if( GetAngle() >= 0.0 )
{
if( arc_hittest <= GetAngle() )
return true;
}
else
{
if( arc_hittest >= (3600.0 + GetAngle()) )
return true;
}
} }
} }
break; break;

View File

@ -120,6 +120,12 @@ public:
const wxPoint& GetArcStart() const { return m_End; } const wxPoint& GetArcStart() const { return m_End; }
const wxPoint GetArcEnd() const; const wxPoint GetArcEnd() const;
/**
* function GetArcAngleStart()
* @return the angle of the stating point of this arc, between 0 and 3600 in 0.1 deg
*/
const double GetArcAngleStart() const;
/** /**
* Function GetRadius * Function GetRadius
* returns the radius of this item * returns the radius of this item

View File

@ -102,8 +102,21 @@ wxString DRC_ITEM::GetErrorText() const
case DRCE_NETCLASS_uVIADRILLSIZE: case DRCE_NETCLASS_uVIADRILLSIZE:
return wxString( _("NetClass uVia Drill &lt; global limit")); return wxString( _("NetClass uVia Drill &lt; global limit"));
case DRCE_VIA_INSIDE_KEEPOUT:
return wxString( _("Via inside a keepout area"));
case DRCE_TRACK_INSIDE_KEEPOUT:
return wxString( _("Track inside a keepout area"));
case DRCE_PAD_INSIDE_KEEPOUT:
return wxString( _("Pad inside a keepout area"));
default: default:
return wxString( wxT("PROGRAM BUG, PLEASE LEAVE THE ROOM.") ); {
wxString msg;
msg.Printf( wxT( "Unknown DRC error code %d" ), m_ErrorCode );
return ( msg );
}
} }
} }

View File

@ -56,9 +56,13 @@ ZONE_CONTAINER::ZONE_CONTAINER( BOARD* aBoard ) :
m_IsFilled = false; // fill status : true when the zone is filled m_IsFilled = false; // fill status : true when the zone is filled
m_FillMode = 0; // How to fill areas: 0 = use filled polygons, != 0 fill with segments m_FillMode = 0; // How to fill areas: 0 = use filled polygons, != 0 fill with segments
m_priority = 0; m_priority = 0;
smoothedPoly = NULL; m_smoothedPoly = NULL;
cornerSmoothingType = ZONE_SETTINGS::SMOOTHING_NONE; m_cornerSmoothingType = ZONE_SETTINGS::SMOOTHING_NONE;
cornerRadius = 0; SetIsKeepout( false );
SetDoNotAllowCopperPour( false ); // has meaning only if m_isKeepout == true
SetDoNotAllowVias( true ); // has meaning only if m_isKeepout == true
SetDoNotAllowTracks( true ); // has meaning only if m_isKeepout == true
m_cornerRadius = 0;
utility = 0; // flags used in polygon calculations utility = 0; // flags used in polygon calculations
utility2 = 0; // flags used in polygon calculations utility2 = 0; // flags used in polygon calculations
m_Poly = new CPolyLine(); // Outlines m_Poly = new CPolyLine(); // Outlines
@ -87,8 +91,15 @@ ZONE_CONTAINER::ZONE_CONTAINER( const ZONE_CONTAINER& aZone ) :
m_FilledPolysList = aZone.m_FilledPolysList; m_FilledPolysList = aZone.m_FilledPolysList;
m_FillSegmList = aZone.m_FillSegmList; m_FillSegmList = aZone.m_FillSegmList;
cornerSmoothingType = aZone.cornerSmoothingType; m_isKeepout = aZone.m_isKeepout;
cornerRadius = aZone.cornerRadius; m_doNotAllowCopperPour = aZone.m_doNotAllowCopperPour;
m_doNotAllowVias = aZone.m_doNotAllowVias;
m_doNotAllowTracks = aZone.m_doNotAllowTracks;
m_cornerSmoothingType = aZone.m_cornerSmoothingType;
m_cornerRadius = aZone.m_cornerRadius;
utility = aZone.utility; utility = aZone.utility;
utility2 = aZone.utility; utility2 = aZone.utility;
} }
@ -221,10 +232,8 @@ void ZONE_CONTAINER::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, int aDrawMode, const
for( unsigned ic = 0; ic < m_Poly->m_HatchLines.size(); ic++ ) for( unsigned ic = 0; ic < m_Poly->m_HatchLines.size(); ic++ )
{ {
seg_start.x = m_Poly->m_HatchLines[ic].xi + offset.x; seg_start = m_Poly->m_HatchLines[ic].m_Start + offset;
seg_start.y = m_Poly->m_HatchLines[ic].yi + offset.y; seg_end = m_Poly->m_HatchLines[ic].m_End + offset;
seg_end.x = m_Poly->m_HatchLines[ic].xf + offset.x;
seg_end.y = m_Poly->m_HatchLines[ic].yf + offset.y;
lines.push_back( seg_start ); lines.push_back( seg_start );
lines.push_back( seg_end ); lines.push_back( seg_end );
} }

View File

@ -48,7 +48,6 @@ class PCB_EDIT_FRAME;
class BOARD; class BOARD;
class ZONE_CONTAINER; class ZONE_CONTAINER;
/** /**
* Struct SEGMENT * Struct SEGMENT
* is a simple container used when filling areas with segments * is a simple container used when filling areas with segments
@ -499,24 +498,24 @@ public:
*/ */
CPolyLine* GetSmoothedPoly() const CPolyLine* GetSmoothedPoly() const
{ {
if( smoothedPoly ) if( m_smoothedPoly )
return smoothedPoly; return m_smoothedPoly;
else else
return m_Poly; return m_Poly;
}; };
void SetCornerSmoothingType( int aType ) { cornerSmoothingType = aType; }; void SetCornerSmoothingType( int aType ) { m_cornerSmoothingType = aType; };
int GetCornerSmoothingType() const { return cornerSmoothingType; }; int GetCornerSmoothingType() const { return m_cornerSmoothingType; };
void SetCornerRadius( unsigned int aRadius ) void SetCornerRadius( unsigned int aRadius )
{ {
cornerRadius = aRadius; m_cornerRadius = aRadius;
if( cornerRadius > (unsigned int) Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS ) ) if( m_cornerRadius > (unsigned int) Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS ) )
cornerRadius = Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS ); m_cornerRadius = Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS );
}; };
unsigned int GetCornerRadius() const { return cornerRadius; }; unsigned int GetCornerRadius() const { return m_cornerRadius; };
void AddPolygon( std::vector< wxPoint >& aPolygon ); void AddPolygon( std::vector< wxPoint >& aPolygon );
@ -536,6 +535,20 @@ public:
virtual EDA_ITEM* Clone() const; virtual EDA_ITEM* Clone() const;
/**
* Accessors to parameters used in Keepout zones:
*/
bool GetIsKeepout() const { return m_isKeepout; }
bool GetDoNotAllowCopperPour() const { return m_doNotAllowCopperPour; }
bool GetDoNotAllowVias() const { return m_doNotAllowVias; }
bool GetDoNotAllowTracks() const { return m_doNotAllowTracks; }
void SetIsKeepout( bool aEnable ) { m_isKeepout = aEnable; }
void SetDoNotAllowCopperPour( bool aEnable ) { m_doNotAllowCopperPour = aEnable; }
void SetDoNotAllowVias( bool aEnable ) { m_doNotAllowVias = aEnable; }
void SetDoNotAllowTracks( bool aEnable ) { m_doNotAllowTracks = aEnable; }
#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
@ -573,14 +586,29 @@ public:
private: private:
wxString m_Netname; // Net Name wxString m_Netname; // Net Name
CPolyLine* smoothedPoly; // Corner-smoothed version of m_Poly CPolyLine* m_smoothedPoly; // Corner-smoothed version of m_Poly
int cornerSmoothingType; int m_cornerSmoothingType;
unsigned int cornerRadius; unsigned int m_cornerRadius;
// Priority: when a zone outline is inside and other zone, if its priority is higher
// the other zone priority, it will be created inside. /* Priority: when a zone outline is inside and other zone, if its priority is higher
// if priorities are equal, a DRC error is set * the other zone priority, it will be created inside.
* if priorities are equal, a DRC error is set
*/
unsigned m_priority; unsigned m_priority;
/* A zone outline can be a keepout zone.
* It will be never filled, and DRC should test for pads, tracks and vias
*/
bool m_isKeepout;
/* For keepout zones only:
* what is not allowed inside the keepout ( pads, tracks and vias )
*/
bool m_doNotAllowCopperPour;
bool m_doNotAllowVias;
bool m_doNotAllowTracks;
ZoneConnection m_PadConnection; ZoneConnection m_PadConnection;
/* set of filled polygons used to draw a zone as a filled area. /* set of filled polygons used to draw a zone as a filled area.

View File

@ -39,8 +39,10 @@ ZONE_SETTINGS::ZONE_SETTINGS()
{ {
m_ZonePriority = 0; m_ZonePriority = 0;
m_FillMode = 0; // Mode for filling zone : 1 use segments, 0 use polygons m_FillMode = 0; // Mode for filling zone : 1 use segments, 0 use polygons
m_ZoneClearance = 200; // Clearance value // Clearance value
m_ZoneMinThickness = 100; // Min thickness value in filled areas m_ZoneClearance = Mils2iu( ZONE_CLEARANCE_MIL );
// Min thickness value in filled areas (this is the minimum width of copper to fill solid areas) :
m_ZoneMinThickness = Mils2iu( ZONE_THICKNESS_MIL );
m_NetcodeSelection = 0; // Net code selection for the current zone m_NetcodeSelection = 0; // Net code selection for the current zone
m_CurrentZone_Layer = 0; // Layer used to create the current zone m_CurrentZone_Layer = 0; // Layer used to create the current zone
m_Zone_HatchingStyle = CPolyLine::DIAGONAL_EDGE; // Option to show the zone area (outlines only, short hatches or full hatches m_Zone_HatchingStyle = CPolyLine::DIAGONAL_EDGE; // Option to show the zone area (outlines only, short hatches or full hatches
@ -49,15 +51,22 @@ ZONE_SETTINGS::ZONE_SETTINGS()
// ARC_APPROX_SEGMENTS_COUNT_LOW_DEF // ARC_APPROX_SEGMENTS_COUNT_LOW_DEF
// or ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF segments // or ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF segments
m_ThermalReliefGap = 200; // tickness of the gap in thermal reliefs // tickness of the gap in thermal reliefs:
m_ThermalReliefCopperBridge = 200; // tickness of the copper bridge in thermal reliefs m_ThermalReliefGap = Mils2iu( ZONE_THERMAL_RELIEF_GAP_MIL );
// tickness of the copper bridge in thermal reliefs:
m_ThermalReliefCopperBridge = Mils2iu( ZONE_THERMAL_RELIEF_COPPER_WIDTH_MIL );
m_PadConnection = THERMAL_PAD; // How pads are covered by copper in zone m_PadConnection = THERMAL_PAD; // How pads are covered by copper in zone
m_Zone_45_Only = false; m_Zone_45_Only = false;
cornerSmoothingType = SMOOTHING_NONE; m_cornerSmoothingType = SMOOTHING_NONE;
cornerRadius = 0; m_cornerRadius = 0;
SetIsKeepout( false );
SetDoNotAllowCopperPour( false );
SetDoNotAllowVias( true );
SetDoNotAllowTracks( true );
} }
@ -74,8 +83,12 @@ ZONE_SETTINGS& ZONE_SETTINGS::operator << ( const ZONE_CONTAINER& aSource )
m_ThermalReliefGap = aSource.m_ThermalReliefGap; m_ThermalReliefGap = aSource.m_ThermalReliefGap;
m_ThermalReliefCopperBridge = aSource.m_ThermalReliefCopperBridge; m_ThermalReliefCopperBridge = aSource.m_ThermalReliefCopperBridge;
m_PadConnection = aSource.GetPadConnection(); m_PadConnection = aSource.GetPadConnection();
cornerSmoothingType = aSource.GetCornerSmoothingType(); m_cornerSmoothingType = aSource.GetCornerSmoothingType();
cornerRadius = aSource.GetCornerRadius(); m_cornerRadius = aSource.GetCornerRadius();
m_isKeepout = aSource.GetIsKeepout();
m_keepoutDoNotAllowCopperPour = aSource.GetDoNotAllowCopperPour();
m_keepoutDoNotAllowVias = aSource.GetDoNotAllowVias();
m_keepoutDoNotAllowTracks = aSource.GetDoNotAllowTracks();
return *this; return *this;
} }
@ -91,8 +104,12 @@ void ZONE_SETTINGS::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) c
aTarget.m_ThermalReliefGap = m_ThermalReliefGap; aTarget.m_ThermalReliefGap = m_ThermalReliefGap;
aTarget.m_ThermalReliefCopperBridge = m_ThermalReliefCopperBridge; aTarget.m_ThermalReliefCopperBridge = m_ThermalReliefCopperBridge;
aTarget.SetPadConnection( m_PadConnection ); aTarget.SetPadConnection( m_PadConnection );
aTarget.SetCornerSmoothingType( cornerSmoothingType ); aTarget.SetCornerSmoothingType( m_cornerSmoothingType );
aTarget.SetCornerRadius( cornerRadius ); aTarget.SetCornerRadius( m_cornerRadius );
aTarget.SetIsKeepout( GetIsKeepout() );
aTarget.SetDoNotAllowCopperPour( GetDoNotAllowCopperPour() );
aTarget.SetDoNotAllowVias( GetDoNotAllowVias() );
aTarget.SetDoNotAllowTracks( GetDoNotAllowTracks() );
if( aFullExport ) if( aFullExport )
{ {

View File

@ -18,6 +18,8 @@ class ZONE_CONTAINER;
/** /**
* Class ZONE_SETTINGS * Class ZONE_SETTINGS
* handles zones parameters. * handles zones parameters.
* Because a zone can be on copper or non copper layers, and can be also
* a keepout area, some parameters are irrelevant depending on the type of zone
*/ */
class ZONE_SETTINGS class ZONE_SETTINGS
{ {
@ -51,10 +53,23 @@ public:
bool m_Zone_45_Only; bool m_Zone_45_Only;
private: private:
int cornerSmoothingType; ///< Corner smoothing type int m_cornerSmoothingType; ///< Corner smoothing type
unsigned int cornerRadius; ///< Corner chamfer distance / fillet radius unsigned int m_cornerRadius; ///< Corner chamfer distance / fillet radius
ZoneConnection m_PadConnection; ZoneConnection m_PadConnection;
/* A zone outline can be a keepout zone.
* It will be never filled, and DRC should test for pads, tracks and vias
*/
bool m_isKeepout;
/* For keepout zones only:
* what is not allowed inside the keepout ( pads, tracks and vias )
*/
bool m_keepoutDoNotAllowCopperPour;
bool m_keepoutDoNotAllowVias;
bool m_keepoutDoNotAllowTracks;
public: public:
ZONE_SETTINGS(); ZONE_SETTINGS();
@ -77,25 +92,37 @@ public:
*/ */
void ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport = true ) const; void ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport = true ) const;
void SetCornerSmoothingType( int aType) { cornerSmoothingType = aType; } void SetCornerSmoothingType( int aType) { m_cornerSmoothingType = aType; }
int GetCornerSmoothingType() const { return cornerSmoothingType; } int GetCornerSmoothingType() const { return m_cornerSmoothingType; }
void SetCornerRadius( int aRadius ) void SetCornerRadius( int aRadius )
{ {
if( aRadius > Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS ) ) if( aRadius > Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS ) )
cornerRadius = Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS ); m_cornerRadius = Mils2iu( MAX_ZONE_CORNER_RADIUS_MILS );
else if( aRadius < 0 ) else if( aRadius < 0 )
cornerRadius = 0; m_cornerRadius = 0;
else else
cornerRadius = aRadius; m_cornerRadius = aRadius;
}; };
unsigned int GetCornerRadius() const { return cornerRadius; } unsigned int GetCornerRadius() const { return m_cornerRadius; }
ZoneConnection GetPadConnection() const { return m_PadConnection; } ZoneConnection GetPadConnection() const { return m_PadConnection; }
void SetPadConnection( ZoneConnection aPadConnection ) { m_PadConnection = aPadConnection; } void SetPadConnection( ZoneConnection aPadConnection ) { m_PadConnection = aPadConnection; }
/**
* Accessors to parameters used in Keepout zones:
*/
const bool GetIsKeepout() const { return m_isKeepout; }
const bool GetDoNotAllowCopperPour() const { return m_keepoutDoNotAllowCopperPour; }
const bool GetDoNotAllowVias() const { return m_keepoutDoNotAllowVias; }
const bool GetDoNotAllowTracks() const { return m_keepoutDoNotAllowTracks; }
void SetIsKeepout( bool aEnable ) { m_isKeepout = aEnable; }
void SetDoNotAllowCopperPour( bool aEnable ) { m_keepoutDoNotAllowCopperPour = aEnable; }
void SetDoNotAllowVias( bool aEnable ) { m_keepoutDoNotAllowVias = aEnable; }
void SetDoNotAllowTracks( bool aEnable ) { m_keepoutDoNotAllowTracks = aEnable; }
}; };

View File

@ -133,6 +133,7 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode )
break; break;
case ID_PCB_ZONES_BUTT: case ID_PCB_ZONES_BUTT:
case ID_PCB_KEEPOUT_AREA_BUTT:
scanList = GENERAL_COLLECTOR::Zones; scanList = GENERAL_COLLECTOR::Zones;
break; break;

View File

@ -1,25 +1,47 @@
///////////////////////////////////////////////////////////////////////////// /**
// Name: dialog_copper_zones.cpp * @file dialog_copper_zones.cpp
// Author: jean-pierre Charras */
// Created: 09/oct/2008
// Licence: GNU License /*
///////////////////////////////////////////////////////////////////////////// * This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <wx/wx.h> #include <wx/wx.h>
#include <wx/imaglist.h>
#include <fctsys.h> #include <fctsys.h>
#include <appl_wxstruct.h> #include <appl_wxstruct.h>
#include <confirm.h> #include <confirm.h>
#include <PolyLine.h> #include <PolyLine.h>
#include <pcbnew.h> #include <pcbnew.h>
#include <wxPcbStruct.h> #include <wxPcbStruct.h>
#include <trigo.h>
#include <zones.h> #include <zones.h>
#include <base_units.h> #include <base_units.h>
#include <class_zone_settings.h> #include <class_zone_settings.h>
#include <class_board.h> #include <class_board.h>
#include <dialog_copper_zones_base.h> #include <dialog_copper_zones_base.h>
#include <wx/imaglist.h> // needed for wx/listctrl.h, in wxGTK 2.8.12
#include <wx/listctrl.h> #include <wx/listctrl.h>
@ -54,8 +76,6 @@ private:
static wxString m_netNameShowFilter; ///< the filter to show nets (default * "*"). static wxString m_netNameShowFilter; ///< the filter to show nets (default * "*").
///< static to keep this pattern for an entire pcbnew session ///< static to keep this pattern for an entire pcbnew session
wxListView* m_LayerSelectionCtrl;
/** /**
* Function initDialog * Function initDialog
* fills in the dialog controls using the current settings. * fills in the dialog controls using the current settings.
@ -133,16 +153,6 @@ DIALOG_COPPER_ZONE::DIALOG_COPPER_ZONE( PCB_BASE_FRAME* aParent, ZONE_SETTINGS*
SetReturnCode( ZONE_ABORT ); // Will be changed on buttons click SetReturnCode( ZONE_ABORT ); // Will be changed on buttons click
m_LayerSelectionCtrl = new wxListView( this, wxID_ANY,
wxDefaultPosition, wxDefaultSize,
wxLC_NO_HEADER | wxLC_REPORT
| wxLC_SINGLE_SEL | wxRAISED_BORDER );
wxListItem col0;
col0.SetId( 0 );
m_LayerSelectionCtrl->InsertColumn( 0, col0 );
m_layerSizer->Add( m_LayerSelectionCtrl, 1,
wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
// Fix static text widget minimum width to a suitable value so that // Fix static text widget minimum width to a suitable value so that
// resizing the dialog is not necessary when changing the corner smoothing type. // resizing the dialog is not necessary when changing the corner smoothing type.
// Depends on the default text in the widget. // Depends on the default text in the widget.
@ -151,8 +161,6 @@ DIALOG_COPPER_ZONE::DIALOG_COPPER_ZONE( PCB_BASE_FRAME* aParent, ZONE_SETTINGS*
initDialog(); initDialog();
GetSizer()->SetSizeHints( this ); GetSizer()->SetSizeHints( this );
Center();
} }
@ -177,10 +185,14 @@ void DIALOG_COPPER_ZONE::initDialog()
switch( m_settings.GetPadConnection() ) switch( m_settings.GetPadConnection() )
{ {
case PAD_NOT_IN_ZONE: // Pads are not covered case THT_THERMAL: // Thermals only for THT pads
m_PadInZoneOpt->SetSelection( 2 ); m_PadInZoneOpt->SetSelection( 2 );
break; break;
case PAD_NOT_IN_ZONE: // Pads are not covered
m_PadInZoneOpt->SetSelection( 3 );
break;
default: default:
case THERMAL_PAD: // Use thermal relief for pads case THERMAL_PAD: // Use thermal relief for pads
m_PadInZoneOpt->SetSelection( 1 ); m_PadInZoneOpt->SetSelection( 1 );
@ -191,7 +203,9 @@ void DIALOG_COPPER_ZONE::initDialog()
break; break;
} }
if( m_settings.GetPadConnection() != THERMAL_PAD ) // Antipad and spokes are significant only for thermals
if( m_settings.GetPadConnection() != THERMAL_PAD &&
m_settings.GetPadConnection() != THT_THERMAL )
{ {
m_AntipadSizeValue->Enable( false ); m_AntipadSizeValue->Enable( false );
m_CopperWidthValue->Enable( false ); m_CopperWidthValue->Enable( false );
@ -231,6 +245,10 @@ void DIALOG_COPPER_ZONE::initDialog()
m_ArcApproximationOpt->SetSelection( m_ArcApproximationOpt->SetSelection(
m_settings.m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF ? 1 : 0 ); m_settings.m_ArcToSegmentsCount == ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF ? 1 : 0 );
// Create one column in m_LayerSelectionCtrl
wxListItem col0;
col0.SetId( 0 );
m_LayerSelectionCtrl->InsertColumn( 0, col0 );
// Build copper layer list and append to layer widget // Build copper layer list and append to layer widget
int layerCount = board->GetCopperLayerCount(); int layerCount = board->GetCopperLayerCount();
int layerNumber, itemIndex, layerColor; int layerNumber, itemIndex, layerColor;
@ -319,11 +337,16 @@ bool DIALOG_COPPER_ZONE::AcceptOptions( bool aPromptForErrors, bool aUseExportab
{ {
switch( m_PadInZoneOpt->GetSelection() ) switch( m_PadInZoneOpt->GetSelection() )
{ {
case 2: case 3:
// Pads are not covered // Pads are not covered
m_settings.SetPadConnection( PAD_NOT_IN_ZONE ); m_settings.SetPadConnection( PAD_NOT_IN_ZONE );
break; break;
case 2:
// Use thermal relief for THT pads
m_settings.SetPadConnection( THT_THERMAL );
break;
case 1: case 1:
// Use thermal relief for pads // Use thermal relief for pads
m_settings.SetPadConnection( THERMAL_PAD ); m_settings.SetPadConnection( THERMAL_PAD );
@ -370,20 +393,25 @@ bool DIALOG_COPPER_ZONE::AcceptOptions( bool aPromptForErrors, bool aUseExportab
// Test if this is a reasonable value for this parameter // Test if this is a reasonable value for this parameter
// A too large value can hang Pcbnew // A too large value can hang Pcbnew
#define CLEARANCE_MAX_VALUE 100*IU_PER_MILS #define CLEARANCE_MAX_VALUE ZONE_CLEARANCE_MAX_VALUE_MIL*IU_PER_MILS
if( m_settings.m_ZoneClearance > CLEARANCE_MAX_VALUE ) if( m_settings.m_ZoneClearance > CLEARANCE_MAX_VALUE )
{ {
DisplayError( this, _( "Clearance must be smaller than 0.5\" / 12.7 mm." ) ); wxString msg;
msg.Printf( _( "Clearance must be smaller than %f\" / %f mm." ),
ZONE_CLEARANCE_MAX_VALUE_MIL / 1000.0, ZONE_CLEARANCE_MAX_VALUE_MIL * 0.0254 );
DisplayError( this, msg );
return false; return false;
} }
txtvalue = m_ZoneMinThicknessCtrl->GetValue(); txtvalue = m_ZoneMinThicknessCtrl->GetValue();
m_settings.m_ZoneMinThickness = ReturnValueFromString( g_UserUnit, txtvalue ); m_settings.m_ZoneMinThickness = ReturnValueFromString( g_UserUnit, txtvalue );
if( m_settings.m_ZoneMinThickness < (1*IU_PER_MILS) ) if( m_settings.m_ZoneMinThickness < (ZONE_THICKNESS_MIN_VALUE_MIL*IU_PER_MILS) )
{ {
DisplayError( this, wxString msg;
_( "Minimum width must be larger than 0.001\" / 0.0254 mm." ) ); msg.Printf( _( "Minimum width must be larger than %f\" / %f mm." ),
ZONE_THICKNESS_MIN_VALUE_MIL / 1000.0, ZONE_THICKNESS_MIN_VALUE_MIL * 0.0254 );
DisplayError( this, msg );
return false; return false;
} }
@ -402,9 +430,20 @@ bool DIALOG_COPPER_ZONE::AcceptOptions( bool aPromptForErrors, bool aUseExportab
m_settings.m_ThermalReliefCopperBridge = ReturnValueFromTextCtrl( *m_CopperWidthValue ); m_settings.m_ThermalReliefCopperBridge = ReturnValueFromTextCtrl( *m_CopperWidthValue );
m_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, (long) m_settings.m_ThermalReliefGap ); if( m_Config )
{
m_Config->Write( ZONE_CLEARANCE_WIDTH_STRING_KEY,
(double) m_settings.m_ZoneClearance / IU_PER_MILS );
m_Config->Write( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, (long) m_settings.m_ThermalReliefCopperBridge ); m_Config->Write( ZONE_MIN_THICKNESS_WIDTH_STRING_KEY,
(double) m_settings.m_ZoneMinThickness / IU_PER_MILS );
m_Config->Write( ZONE_THERMAL_RELIEF_GAP_STRING_KEY,
(double) m_settings.m_ThermalReliefGap / IU_PER_MILS );
m_Config->Write( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY,
(double) m_settings.m_ThermalReliefCopperBridge / IU_PER_MILS );
}
if( m_settings.m_ThermalReliefCopperBridge <= m_settings.m_ZoneMinThickness ) if( m_settings.m_ThermalReliefCopperBridge <= m_settings.m_ZoneMinThickness )
{ {
@ -528,6 +567,7 @@ void DIALOG_COPPER_ZONE::OnPadsInZoneClick( wxCommandEvent& event )
m_CopperWidthValue->Enable( false ); m_CopperWidthValue->Enable( false );
break; break;
case 2:
case 1: case 1:
m_AntipadSizeValue->Enable( true ); m_AntipadSizeValue->Enable( true );
m_CopperWidthValue->Enable( true ); m_CopperWidthValue->Enable( true );

View File

@ -1,268 +1,272 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 11 2012) // C++ code generated with wxFormBuilder (version Mar 17 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "dialog_copper_zones_base.h" #include "dialog_copper_zones_base.h"
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE( DIALOG_COPPER_ZONE_BASE, DIALOG_SHIM ) BEGIN_EVENT_TABLE( DIALOG_COPPER_ZONE_BASE, DIALOG_SHIM )
EVT_CLOSE( DIALOG_COPPER_ZONE_BASE::_wxFB_OnClose ) EVT_CLOSE( DIALOG_COPPER_ZONE_BASE::_wxFB_OnClose )
EVT_SIZE( DIALOG_COPPER_ZONE_BASE::_wxFB_OnSize ) EVT_SIZE( DIALOG_COPPER_ZONE_BASE::_wxFB_OnSize )
EVT_CHOICE( ID_M_NETDISPLAYOPTION, DIALOG_COPPER_ZONE_BASE::_wxFB_OnNetSortingOptionSelected ) EVT_CHOICE( ID_M_NETDISPLAYOPTION, DIALOG_COPPER_ZONE_BASE::_wxFB_OnNetSortingOptionSelected )
EVT_TEXT_ENTER( ID_TEXTCTRL_NETNAMES_FILTER, DIALOG_COPPER_ZONE_BASE::_wxFB_OnRunFiltersButtonClick ) EVT_TEXT_ENTER( ID_TEXTCTRL_NETNAMES_FILTER, DIALOG_COPPER_ZONE_BASE::_wxFB_OnRunFiltersButtonClick )
EVT_TEXT_ENTER( ID_TEXTCTRL_NETNAMES_FILTER, DIALOG_COPPER_ZONE_BASE::_wxFB_OnRunFiltersButtonClick ) EVT_TEXT_ENTER( ID_TEXTCTRL_NETNAMES_FILTER, DIALOG_COPPER_ZONE_BASE::_wxFB_OnRunFiltersButtonClick )
EVT_BUTTON( wxID_APPLY_FILTERS, DIALOG_COPPER_ZONE_BASE::_wxFB_OnRunFiltersButtonClick ) EVT_BUTTON( wxID_APPLY_FILTERS, DIALOG_COPPER_ZONE_BASE::_wxFB_OnRunFiltersButtonClick )
EVT_CHOICE( ID_CORNER_SMOOTHING, DIALOG_COPPER_ZONE_BASE::_wxFB_OnCornerSmoothingModeChoice ) EVT_CHOICE( ID_CORNER_SMOOTHING, DIALOG_COPPER_ZONE_BASE::_wxFB_OnCornerSmoothingModeChoice )
EVT_CHOICE( ID_M_PADINZONEOPT, DIALOG_COPPER_ZONE_BASE::_wxFB_OnPadsInZoneClick ) EVT_CHOICE( ID_M_PADINZONEOPT, DIALOG_COPPER_ZONE_BASE::_wxFB_OnPadsInZoneClick )
EVT_BUTTON( wxID_BUTTON_EXPORT, DIALOG_COPPER_ZONE_BASE::_wxFB_ExportSetupToOtherCopperZones ) EVT_BUTTON( wxID_BUTTON_EXPORT, DIALOG_COPPER_ZONE_BASE::_wxFB_ExportSetupToOtherCopperZones )
EVT_BUTTON( wxID_OK, DIALOG_COPPER_ZONE_BASE::_wxFB_OnButtonOkClick ) EVT_BUTTON( wxID_OK, DIALOG_COPPER_ZONE_BASE::_wxFB_OnButtonOkClick )
EVT_BUTTON( wxID_CANCEL, DIALOG_COPPER_ZONE_BASE::_wxFB_OnButtonCancelClick ) EVT_BUTTON( wxID_CANCEL, DIALOG_COPPER_ZONE_BASE::_wxFB_OnButtonCancelClick )
END_EVENT_TABLE() END_EVENT_TABLE()
DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{ {
this->SetSizeHints( wxDefaultSize, wxDefaultSize ); this->SetSizeHints( wxDefaultSize, wxDefaultSize );
m_MainBoxSizer = new wxBoxSizer( wxVERTICAL ); m_MainBoxSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* m_OptionsBoxSizer; wxBoxSizer* m_OptionsBoxSizer;
m_OptionsBoxSizer = new wxBoxSizer( wxHORIZONTAL ); m_OptionsBoxSizer = new wxBoxSizer( wxHORIZONTAL );
m_layerSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* m_layerSizer;
m_layerSizer = new wxBoxSizer( wxVERTICAL );
m_staticText17 = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText17->Wrap( -1 ); m_staticText17 = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_layerSizer->Add( m_staticText17, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); m_staticText17->Wrap( -1 );
m_layerSizer->Add( m_staticText17, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_OptionsBoxSizer->Add( m_layerSizer, 1, wxEXPAND, 5 ); m_LayerSelectionCtrl = new wxListView( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_ALIGN_LEFT|wxLC_NO_HEADER|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_SMALL_ICON );
m_layerSizer->Add( m_LayerSelectionCtrl, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizer7;
bSizer7 = new wxBoxSizer( wxVERTICAL );
m_OptionsBoxSizer->Add( m_layerSizer, 1, wxEXPAND, 5 );
m_staticText2 = new wxStaticText( this, wxID_ANY, _("Net:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText2->Wrap( -1 ); wxBoxSizer* bSizer7;
bSizer7->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); bSizer7 = new wxBoxSizer( wxVERTICAL );
m_ListNetNameSelection = new wxListBox( this, ID_NETNAME_SELECTION, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); m_staticText2 = new wxStaticText( this, wxID_ANY, _("Net:"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer7->Add( m_ListNetNameSelection, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_staticText2->Wrap( -1 );
bSizer7->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_OptionsBoxSizer->Add( bSizer7, 1, wxEXPAND, 5 ); m_ListNetNameSelection = new wxListBox( this, ID_NETNAME_SELECTION, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer7->Add( m_ListNetNameSelection, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxStaticBoxSizer* m_NetSortOptSizer;
m_NetSortOptSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Net Filtering") ), wxVERTICAL );
m_OptionsBoxSizer->Add( bSizer7, 1, wxEXPAND, 5 );
m_staticText16 = new wxStaticText( this, wxID_ANY, _("Display:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText16->Wrap( -1 ); wxStaticBoxSizer* m_NetSortOptSizer;
m_NetSortOptSizer->Add( m_staticText16, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); m_NetSortOptSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Net Filtering") ), wxVERTICAL );
wxString m_NetDisplayOptionChoices[] = { _("Show all (alphabetical)"), _("Show all (advanced)"), _("Filtered (alphabetical)"), _("Filtered (advanced)") }; m_staticText16 = new wxStaticText( this, wxID_ANY, _("Display:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_NetDisplayOptionNChoices = sizeof( m_NetDisplayOptionChoices ) / sizeof( wxString ); m_staticText16->Wrap( -1 );
m_NetDisplayOption = new wxChoice( this, ID_M_NETDISPLAYOPTION, wxDefaultPosition, wxDefaultSize, m_NetDisplayOptionNChoices, m_NetDisplayOptionChoices, 0 ); m_NetSortOptSizer->Add( m_staticText16, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_NetDisplayOption->SetSelection( 0 );
m_NetSortOptSizer->Add( m_NetDisplayOption, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_NetDisplayOptionChoices[] = { _("Show all (alphabetical)"), _("Show all (advanced)"), _("Filtered (alphabetical)"), _("Filtered (advanced)") };
int m_NetDisplayOptionNChoices = sizeof( m_NetDisplayOptionChoices ) / sizeof( wxString );
m_staticText5 = new wxStaticText( this, wxID_ANY, _("Hidden net filter:"), wxDefaultPosition, wxDefaultSize, 0 ); m_NetDisplayOption = new wxChoice( this, ID_M_NETDISPLAYOPTION, wxDefaultPosition, wxDefaultSize, m_NetDisplayOptionNChoices, m_NetDisplayOptionChoices, 0 );
m_staticText5->Wrap( -1 ); m_NetDisplayOption->SetSelection( 0 );
m_NetSortOptSizer->Add( m_staticText5, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_NetSortOptSizer->Add( m_NetDisplayOption, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_DoNotShowNetNameFilter = new wxTextCtrl( this, ID_TEXTCTRL_NETNAMES_FILTER, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); m_staticText5 = new wxStaticText( this, wxID_ANY, _("Hidden net filter:"), wxDefaultPosition, wxDefaultSize, 0 );
m_DoNotShowNetNameFilter->SetToolTip( _("Pattern to filter net names in filtered list.\nNet names matching this pattern are not displayed.") ); m_staticText5->Wrap( -1 );
m_NetSortOptSizer->Add( m_staticText5, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_NetSortOptSizer->Add( m_DoNotShowNetNameFilter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_DoNotShowNetNameFilter = new wxTextCtrl( this, ID_TEXTCTRL_NETNAMES_FILTER, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
m_staticText51 = new wxStaticText( this, wxID_ANY, _("Visible net filter:"), wxDefaultPosition, wxDefaultSize, 0 ); m_DoNotShowNetNameFilter->SetToolTip( _("Pattern to filter net names in filtered list.\nNet names matching this pattern are not displayed.") );
m_staticText51->Wrap( -1 );
m_NetSortOptSizer->Add( m_staticText51, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_NetSortOptSizer->Add( m_DoNotShowNetNameFilter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_ShowNetNameFilter = new wxTextCtrl( this, ID_TEXTCTRL_NETNAMES_FILTER, _("*"), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); m_staticText51 = new wxStaticText( this, wxID_ANY, _("Visible net filter:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ShowNetNameFilter->SetToolTip( _("Pattern to filter net names in filtered list.\nOnly net names matching this pattern are displayed.") ); m_staticText51->Wrap( -1 );
m_NetSortOptSizer->Add( m_staticText51, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_NetSortOptSizer->Add( m_ShowNetNameFilter, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_ShowNetNameFilter = new wxTextCtrl( this, ID_TEXTCTRL_NETNAMES_FILTER, _("*"), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
m_buttonRunFilter = new wxButton( this, wxID_APPLY_FILTERS, _("Apply Filters"), wxDefaultPosition, wxDefaultSize, 0 ); m_ShowNetNameFilter->SetToolTip( _("Pattern to filter net names in filtered list.\nOnly net names matching this pattern are displayed.") );
m_NetSortOptSizer->Add( m_buttonRunFilter, 0, wxALL|wxEXPAND, 5 );
m_NetSortOptSizer->Add( m_ShowNetNameFilter, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_OptionsBoxSizer->Add( m_NetSortOptSizer, 0, wxALL, 5 ); m_buttonRunFilter = new wxButton( this, wxID_APPLY_FILTERS, _("Apply Filters"), wxDefaultPosition, wxDefaultSize, 0 );
m_NetSortOptSizer->Add( m_buttonRunFilter, 0, wxALL|wxEXPAND, 5 );
m_MainBoxSizer->Add( m_OptionsBoxSizer, 1, wxALL|wxEXPAND, 5 );
m_OptionsBoxSizer->Add( m_NetSortOptSizer, 0, wxALL, 5 );
wxStaticBoxSizer* m_ExportableSetupSizer;
m_ExportableSetupSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Settings") ), wxHORIZONTAL );
m_MainBoxSizer->Add( m_OptionsBoxSizer, 1, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizer9;
bSizer9 = new wxBoxSizer( wxVERTICAL ); wxStaticBoxSizer* m_ExportableSetupSizer;
m_ExportableSetupSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Settings") ), wxHORIZONTAL );
m_ClearanceValueTitle = new wxStaticText( this, wxID_ANY, _("Clearance"), wxDefaultPosition, wxDefaultSize, 0 );
m_ClearanceValueTitle->Wrap( -1 ); wxBoxSizer* bSizer9;
bSizer9->Add( m_ClearanceValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); bSizer9 = new wxBoxSizer( wxVERTICAL );
m_ZoneClearanceCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_ClearanceValueTitle = new wxStaticText( this, wxID_ANY, _("Clearance"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer9->Add( m_ZoneClearanceCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_ClearanceValueTitle->Wrap( -1 );
bSizer9->Add( m_ClearanceValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_MinThicknessValueTitle = new wxStaticText( this, wxID_ANY, _("Minimum width"), wxDefaultPosition, wxDefaultSize, 0 );
m_MinThicknessValueTitle->Wrap( -1 ); m_ZoneClearanceCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_MinThicknessValueTitle->SetToolTip( _("Minimun thickness of filled areas.") ); bSizer9->Add( m_ZoneClearanceCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bSizer9->Add( m_MinThicknessValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_MinThicknessValueTitle = new wxStaticText( this, wxID_ANY, _("Minimum width"), wxDefaultPosition, wxDefaultSize, 0 );
m_MinThicknessValueTitle->Wrap( -1 );
m_ZoneMinThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_MinThicknessValueTitle->SetToolTip( _("Minimun thickness of filled areas.") );
bSizer9->Add( m_ZoneMinThicknessCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bSizer9->Add( m_MinThicknessValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_staticText151 = new wxStaticText( this, wxID_ANY, _("Corner smoothing:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText151->Wrap( -1 ); m_ZoneMinThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizer9->Add( m_staticText151, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); bSizer9->Add( m_ZoneMinThicknessCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxString m_cornerSmoothingChoiceChoices[] = { _("None"), _("Chamfer"), _("Fillet") }; m_staticText151 = new wxStaticText( this, wxID_ANY, _("Corner smoothing:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_cornerSmoothingChoiceNChoices = sizeof( m_cornerSmoothingChoiceChoices ) / sizeof( wxString ); m_staticText151->Wrap( -1 );
m_cornerSmoothingChoice = new wxChoice( this, ID_CORNER_SMOOTHING, wxDefaultPosition, wxDefaultSize, m_cornerSmoothingChoiceNChoices, m_cornerSmoothingChoiceChoices, 0 ); bSizer9->Add( m_staticText151, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_cornerSmoothingChoice->SetSelection( 0 );
bSizer9->Add( m_cornerSmoothingChoice, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_cornerSmoothingChoiceChoices[] = { _("None"), _("Chamfer"), _("Fillet") };
int m_cornerSmoothingChoiceNChoices = sizeof( m_cornerSmoothingChoiceChoices ) / sizeof( wxString );
m_cornerSmoothingTitle = new wxStaticText( this, wxID_ANY, _("Chamfer distance (mm):"), wxDefaultPosition, wxDefaultSize, 0 ); m_cornerSmoothingChoice = new wxChoice( this, ID_CORNER_SMOOTHING, wxDefaultPosition, wxDefaultSize, m_cornerSmoothingChoiceNChoices, m_cornerSmoothingChoiceChoices, 0 );
m_cornerSmoothingTitle->Wrap( -1 ); m_cornerSmoothingChoice->SetSelection( 0 );
bSizer9->Add( m_cornerSmoothingTitle, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); bSizer9->Add( m_cornerSmoothingChoice, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_cornerSmoothingCtrl = new wxTextCtrl( this, ID_M_CORNERSMOOTHINGCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_cornerSmoothingTitle = new wxStaticText( this, wxID_ANY, _("Chamfer distance (mm):"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer9->Add( m_cornerSmoothingCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); m_cornerSmoothingTitle->Wrap( -1 );
bSizer9->Add( m_cornerSmoothingTitle, 0, wxRIGHT|wxLEFT, 5 );
m_ExportableSetupSizer->Add( bSizer9, 0, wxEXPAND, 5 ); m_cornerSmoothingCtrl = new wxTextCtrl( this, ID_M_CORNERSMOOTHINGCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizer9->Add( m_cornerSmoothingCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxBoxSizer* m_LeftBox;
m_LeftBox = new wxBoxSizer( wxVERTICAL );
m_ExportableSetupSizer->Add( bSizer9, 0, wxEXPAND, 5 );
m_staticText13 = new wxStaticText( this, wxID_ANY, _("Pad connection:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText13->Wrap( -1 ); wxBoxSizer* m_LeftBox;
m_LeftBox->Add( m_staticText13, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); m_LeftBox = new wxBoxSizer( wxVERTICAL );
wxString m_PadInZoneOptChoices[] = { _("Solid"), _("Thermal relief"), _("None") }; m_staticText13 = new wxStaticText( this, wxID_ANY, _("Pad connection:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_PadInZoneOptNChoices = sizeof( m_PadInZoneOptChoices ) / sizeof( wxString ); m_staticText13->Wrap( -1 );
m_PadInZoneOpt = new wxChoice( this, ID_M_PADINZONEOPT, wxDefaultPosition, wxDefaultSize, m_PadInZoneOptNChoices, m_PadInZoneOptChoices, 0 ); m_LeftBox->Add( m_staticText13, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_PadInZoneOpt->SetSelection( 0 );
m_LeftBox->Add( m_PadInZoneOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_PadInZoneOptChoices[] = { _("Solid"), _("Thermal relief"), _("THT thermal"), _("None") };
int m_PadInZoneOptNChoices = sizeof( m_PadInZoneOptChoices ) / sizeof( wxString );
wxStaticBoxSizer* m_ThermalShapesParamsSizer; m_PadInZoneOpt = new wxChoice( this, ID_M_PADINZONEOPT, wxDefaultPosition, wxDefaultSize, m_PadInZoneOptNChoices, m_PadInZoneOptChoices, 0 );
m_ThermalShapesParamsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Thermal Reliefs") ), wxVERTICAL ); m_PadInZoneOpt->SetSelection( 0 );
m_LeftBox->Add( m_PadInZoneOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_AntipadSizeText = new wxStaticText( this, wxID_ANY, _("Antipad clearance"), wxDefaultPosition, wxDefaultSize, 0 );
m_AntipadSizeText->Wrap( -1 ); wxStaticBoxSizer* m_ThermalShapesParamsSizer;
m_ThermalShapesParamsSizer->Add( m_AntipadSizeText, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); m_ThermalShapesParamsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Thermal Reliefs") ), wxVERTICAL );
m_AntipadSizeValue = new wxTextCtrl( this, wxID_ANTIPAD_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_AntipadSizeText = new wxStaticText( this, wxID_ANY, _("Antipad clearance"), wxDefaultPosition, wxDefaultSize, 0 );
m_AntipadSizeValue->SetToolTip( _("Clearance between pads in the same net and filled areas.") ); m_AntipadSizeText->Wrap( -1 );
m_ThermalShapesParamsSizer->Add( m_AntipadSizeText, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_ThermalShapesParamsSizer->Add( m_AntipadSizeValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_AntipadSizeValue = new wxTextCtrl( this, wxID_ANTIPAD_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_CopperBridgeWidthText = new wxStaticText( this, wxID_ANY, _("Spoke width"), wxDefaultPosition, wxDefaultSize, 0 ); m_AntipadSizeValue->SetToolTip( _("Clearance between pads in the same net and filled areas.") );
m_CopperBridgeWidthText->Wrap( -1 );
m_ThermalShapesParamsSizer->Add( m_CopperBridgeWidthText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_ThermalShapesParamsSizer->Add( m_AntipadSizeValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_CopperWidthValue = new wxTextCtrl( this, wxID_COPPER_BRIDGE_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_CopperBridgeWidthText = new wxStaticText( this, wxID_ANY, _("Spoke width"), wxDefaultPosition, wxDefaultSize, 0 );
m_CopperWidthValue->SetToolTip( _("Width of copper in thermal reliefs.") ); m_CopperBridgeWidthText->Wrap( -1 );
m_ThermalShapesParamsSizer->Add( m_CopperBridgeWidthText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_ThermalShapesParamsSizer->Add( m_CopperWidthValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_CopperWidthValue = new wxTextCtrl( this, wxID_COPPER_BRIDGE_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_CopperWidthValue->SetToolTip( _("Width of copper in thermal reliefs.") );
m_LeftBox->Add( m_ThermalShapesParamsSizer, 0, wxALL|wxEXPAND, 5 );
m_ThermalShapesParamsSizer->Add( m_CopperWidthValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_ExportableSetupSizer->Add( m_LeftBox, 0, wxEXPAND, 5 );
m_LeftBox->Add( m_ThermalShapesParamsSizer, 0, wxALL|wxEXPAND, 5 );
wxBoxSizer* m_MiddleBox;
m_MiddleBox = new wxBoxSizer( wxVERTICAL );
m_ExportableSetupSizer->Add( m_LeftBox, 0, wxEXPAND, 5 );
m_staticText171 = new wxStaticText( this, wxID_ANY, _("Priority level:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText171->Wrap( -1 ); wxBoxSizer* m_MiddleBox;
m_staticText171->SetToolTip( _("On each copper layer, zones are filled by priority order.\nSo when a zone is inside an other zone:\n* If its priority is highter: its outlines are removed from the other layer.\n* If its priority is equal: a DRC error is set.") ); m_MiddleBox = new wxBoxSizer( wxVERTICAL );
m_MiddleBox->Add( m_staticText171, 0, wxRIGHT|wxLEFT, 5 ); m_staticText171 = new wxStaticText( this, wxID_ANY, _("Priority level:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText171->Wrap( -1 );
m_PriorityLevelCtrl = new wxSpinCtrl( this, ID_M_PRIORITYLEVELCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 100, 0 ); m_staticText171->SetToolTip( _("On each copper layer, zones are filled by priority order.\nSo when a zone is inside an other zone:\n* If its priority is highter: its outlines are removed from the other layer.\n* If its priority is equal: a DRC error is set.") );
m_MiddleBox->Add( m_PriorityLevelCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_MiddleBox->Add( m_staticText171, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_staticText11 = new wxStaticText( this, wxID_ANY, _("Fill mode:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText11->Wrap( -1 ); m_PriorityLevelCtrl = new wxSpinCtrl( this, ID_M_PRIORITYLEVELCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 100, 0 );
m_MiddleBox->Add( m_staticText11, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); m_MiddleBox->Add( m_PriorityLevelCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxString m_FillModeCtrlChoices[] = { _("Polygon"), _("Segment") }; m_staticText11 = new wxStaticText( this, wxID_ANY, _("Fill mode:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_FillModeCtrlNChoices = sizeof( m_FillModeCtrlChoices ) / sizeof( wxString ); m_staticText11->Wrap( -1 );
m_FillModeCtrl = new wxChoice( this, ID_M_FILLMODECTRL, wxDefaultPosition, wxDefaultSize, m_FillModeCtrlNChoices, m_FillModeCtrlChoices, 0 ); m_MiddleBox->Add( m_staticText11, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_FillModeCtrl->SetSelection( 0 );
m_MiddleBox->Add( m_FillModeCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_FillModeCtrlChoices[] = { _("Polygon"), _("Segment") };
int m_FillModeCtrlNChoices = sizeof( m_FillModeCtrlChoices ) / sizeof( wxString );
m_staticText12 = new wxStaticText( this, wxID_ANY, _("Segments / 360 deg:"), wxDefaultPosition, wxDefaultSize, 0 ); m_FillModeCtrl = new wxChoice( this, ID_M_FILLMODECTRL, wxDefaultPosition, wxDefaultSize, m_FillModeCtrlNChoices, m_FillModeCtrlChoices, 0 );
m_staticText12->Wrap( -1 ); m_FillModeCtrl->SetSelection( 0 );
m_MiddleBox->Add( m_staticText12, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); m_MiddleBox->Add( m_FillModeCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxString m_ArcApproximationOptChoices[] = { _("16"), _("32") }; m_staticText12 = new wxStaticText( this, wxID_ANY, _("Segments / 360 deg:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_ArcApproximationOptNChoices = sizeof( m_ArcApproximationOptChoices ) / sizeof( wxString ); m_staticText12->Wrap( -1 );
m_ArcApproximationOpt = new wxChoice( this, ID_M_ARCAPPROXIMATIONOPT, wxDefaultPosition, wxDefaultSize, m_ArcApproximationOptNChoices, m_ArcApproximationOptChoices, 0 ); m_MiddleBox->Add( m_staticText12, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_ArcApproximationOpt->SetSelection( 0 );
m_MiddleBox->Add( m_ArcApproximationOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_ArcApproximationOptChoices[] = { _("16"), _("32") };
int m_ArcApproximationOptNChoices = sizeof( m_ArcApproximationOptChoices ) / sizeof( wxString );
m_ArcApproximationOpt = new wxChoice( this, ID_M_ARCAPPROXIMATIONOPT, wxDefaultPosition, wxDefaultSize, m_ArcApproximationOptNChoices, m_ArcApproximationOptChoices, 0 );
m_ExportableSetupSizer->Add( m_MiddleBox, 0, wxEXPAND, 5 ); m_ArcApproximationOpt->SetSelection( 0 );
m_MiddleBox->Add( m_ArcApproximationOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxBoxSizer* bSizer81;
bSizer81 = new wxBoxSizer( wxVERTICAL );
m_ExportableSetupSizer->Add( m_MiddleBox, 0, wxEXPAND, 5 );
m_staticText14 = new wxStaticText( this, wxID_ANY, _("Outline slope:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText14->Wrap( -1 ); wxBoxSizer* bSizer81;
bSizer81->Add( m_staticText14, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); bSizer81 = new wxBoxSizer( wxVERTICAL );
wxString m_OrientEdgesOptChoices[] = { _("Arbitrary"), _("H, V, and 45 deg only") }; m_staticText14 = new wxStaticText( this, wxID_ANY, _("Outline slope:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); m_staticText14->Wrap( -1 );
m_OrientEdgesOpt = new wxChoice( this, ID_M_ORIENTEDGESOPT, wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 0 ); bSizer81->Add( m_staticText14, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_OrientEdgesOpt->SetSelection( 0 );
bSizer81->Add( m_OrientEdgesOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_OrientEdgesOptChoices[] = { _("Arbitrary"), _("H, V, and 45 deg only") };
int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString );
m_staticText15 = new wxStaticText( this, wxID_ANY, _("Outline style:"), wxDefaultPosition, wxDefaultSize, 0 ); m_OrientEdgesOpt = new wxChoice( this, ID_M_ORIENTEDGESOPT, wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 0 );
m_staticText15->Wrap( -1 ); m_OrientEdgesOpt->SetSelection( 0 );
bSizer81->Add( m_staticText15, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); bSizer81->Add( m_OrientEdgesOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched"), _("Fully hatched") }; m_staticText15 = new wxStaticText( this, wxID_ANY, _("Outline style:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); m_staticText15->Wrap( -1 );
m_OutlineAppearanceCtrl = new wxChoice( this, ID_M_OUTLINEAPPEARANCECTRL, wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 0 ); bSizer81->Add( m_staticText15, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_OutlineAppearanceCtrl->SetSelection( 0 );
bSizer81->Add( m_OutlineAppearanceCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched"), _("Fully hatched") };
int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString );
m_OutlineAppearanceCtrl = new wxChoice( this, ID_M_OUTLINEAPPEARANCECTRL, wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 0 );
m_ExportableSetupSizer->Add( bSizer81, 0, wxEXPAND, 5 ); m_OutlineAppearanceCtrl->SetSelection( 0 );
bSizer81->Add( m_OutlineAppearanceCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_MainBoxSizer->Add( m_ExportableSetupSizer, 1, wxALL|wxEXPAND, 5 );
m_ExportableSetupSizer->Add( bSizer81, 0, wxEXPAND, 5 );
wxBoxSizer* bSizer10;
bSizer10 = new wxBoxSizer( wxHORIZONTAL );
m_MainBoxSizer->Add( m_ExportableSetupSizer, 0, wxALL|wxEXPAND, 5 );
m_ExportSetupButton = new wxButton( this, wxID_BUTTON_EXPORT, _("Export Settings to Other Zones"), wxDefaultPosition, wxDefaultSize, 0 );
m_ExportSetupButton->SetToolTip( _("Export this zone setup (excluding layer and net selection) to all other copper zones.") ); wxBoxSizer* bSizer10;
bSizer10 = new wxBoxSizer( wxHORIZONTAL );
bSizer10->Add( m_ExportSetupButton, 0, wxALL|wxEXPAND, 5 );
m_ExportSetupButton = new wxButton( this, wxID_BUTTON_EXPORT, _("Export Settings to Other Zones"), wxDefaultPosition, wxDefaultSize, 0 );
m_OkButton = new wxButton( this, wxID_OK, _("Ok"), wxDefaultPosition, wxDefaultSize, 0 ); m_ExportSetupButton->SetToolTip( _("Export this zone setup (excluding layer and net selection) to all other copper zones.") );
m_OkButton->SetDefault();
bSizer10->Add( m_OkButton, 0, wxALL|wxEXPAND, 5 ); bSizer10->Add( m_ExportSetupButton, 0, wxALL|wxEXPAND, 5 );
m_ButtonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); m_OkButton = new wxButton( this, wxID_OK, _("Ok"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer10->Add( m_ButtonCancel, 0, wxALL|wxEXPAND, 5 ); m_OkButton->SetDefault();
bSizer10->Add( m_OkButton, 0, wxALL|wxEXPAND, 5 );
m_MainBoxSizer->Add( bSizer10, 0, wxALIGN_RIGHT|wxALL, 5 ); m_ButtonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer10->Add( m_ButtonCancel, 0, wxALL|wxEXPAND, 5 );
this->SetSizer( m_MainBoxSizer );
this->Layout(); m_MainBoxSizer->Add( bSizer10, 0, wxALIGN_RIGHT|wxALL, 5 );
}
DIALOG_COPPER_ZONE_BASE::~DIALOG_COPPER_ZONE_BASE() this->SetSizer( m_MainBoxSizer );
{ this->Layout();
} }
DIALOG_COPPER_ZONE_BASE::~DIALOG_COPPER_ZONE_BASE()
{
}

File diff suppressed because it is too large Load Diff

View File

@ -1,132 +1,133 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 11 2012) // C++ code generated with wxFormBuilder (version Mar 17 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_COPPER_ZONES_BASE_H__ #ifndef __DIALOG_COPPER_ZONES_BASE_H__
#define __DIALOG_COPPER_ZONES_BASE_H__ #define __DIALOG_COPPER_ZONES_BASE_H__
#include <wx/artprov.h> #include <wx/artprov.h>
#include <wx/xrc/xmlres.h> #include <wx/xrc/xmlres.h>
#include <wx/intl.h> #include <wx/intl.h>
#include "dialog_shim.h" #include "dialog_shim.h"
#include <wx/string.h> #include <wx/string.h>
#include <wx/stattext.h> #include <wx/stattext.h>
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
#include <wx/font.h> #include <wx/font.h>
#include <wx/colour.h> #include <wx/colour.h>
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/sizer.h> #include <wx/listctrl.h>
#include <wx/listbox.h> #include <wx/sizer.h>
#include <wx/choice.h> #include <wx/listbox.h>
#include <wx/textctrl.h> #include <wx/choice.h>
#include <wx/button.h> #include <wx/textctrl.h>
#include <wx/statbox.h> #include <wx/button.h>
#include <wx/spinctrl.h> #include <wx/statbox.h>
#include <wx/dialog.h> #include <wx/spinctrl.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_COPPER_ZONE_BASE ///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////// /// Class DIALOG_COPPER_ZONE_BASE
class DIALOG_COPPER_ZONE_BASE : public DIALOG_SHIM ///////////////////////////////////////////////////////////////////////////////
{ class DIALOG_COPPER_ZONE_BASE : public DIALOG_SHIM
DECLARE_EVENT_TABLE() {
private: DECLARE_EVENT_TABLE()
private:
// Private event handlers
void _wxFB_OnClose( wxCloseEvent& event ){ OnClose( event ); } // Private event handlers
void _wxFB_OnSize( wxSizeEvent& event ){ OnSize( event ); } void _wxFB_OnClose( wxCloseEvent& event ){ OnClose( event ); }
void _wxFB_OnNetSortingOptionSelected( wxCommandEvent& event ){ OnNetSortingOptionSelected( event ); } void _wxFB_OnSize( wxSizeEvent& event ){ OnSize( event ); }
void _wxFB_OnRunFiltersButtonClick( wxCommandEvent& event ){ OnRunFiltersButtonClick( event ); } void _wxFB_OnNetSortingOptionSelected( wxCommandEvent& event ){ OnNetSortingOptionSelected( event ); }
void _wxFB_OnCornerSmoothingModeChoice( wxCommandEvent& event ){ OnCornerSmoothingModeChoice( event ); } void _wxFB_OnRunFiltersButtonClick( wxCommandEvent& event ){ OnRunFiltersButtonClick( event ); }
void _wxFB_OnPadsInZoneClick( wxCommandEvent& event ){ OnPadsInZoneClick( event ); } void _wxFB_OnCornerSmoothingModeChoice( wxCommandEvent& event ){ OnCornerSmoothingModeChoice( event ); }
void _wxFB_ExportSetupToOtherCopperZones( wxCommandEvent& event ){ ExportSetupToOtherCopperZones( event ); } void _wxFB_OnPadsInZoneClick( wxCommandEvent& event ){ OnPadsInZoneClick( event ); }
void _wxFB_OnButtonOkClick( wxCommandEvent& event ){ OnButtonOkClick( event ); } void _wxFB_ExportSetupToOtherCopperZones( wxCommandEvent& event ){ ExportSetupToOtherCopperZones( event ); }
void _wxFB_OnButtonCancelClick( wxCommandEvent& event ){ OnButtonCancelClick( event ); } void _wxFB_OnButtonOkClick( wxCommandEvent& event ){ OnButtonOkClick( event ); }
void _wxFB_OnButtonCancelClick( wxCommandEvent& event ){ OnButtonCancelClick( event ); }
protected:
enum protected:
{ enum
ID_DIALOG_COPPER_ZONE_BASE = 1000, {
ID_NETNAME_SELECTION, ID_DIALOG_COPPER_ZONE_BASE = 1000,
ID_M_NETDISPLAYOPTION, ID_NETNAME_SELECTION,
ID_TEXTCTRL_NETNAMES_FILTER, ID_M_NETDISPLAYOPTION,
wxID_APPLY_FILTERS, ID_TEXTCTRL_NETNAMES_FILTER,
ID_CORNER_SMOOTHING, wxID_APPLY_FILTERS,
ID_M_CORNERSMOOTHINGCTRL, ID_CORNER_SMOOTHING,
ID_M_PADINZONEOPT, ID_M_CORNERSMOOTHINGCTRL,
wxID_ANTIPAD_SIZE, ID_M_PADINZONEOPT,
wxID_COPPER_BRIDGE_VALUE, wxID_ANTIPAD_SIZE,
ID_M_PRIORITYLEVELCTRL, wxID_COPPER_BRIDGE_VALUE,
ID_M_FILLMODECTRL, ID_M_PRIORITYLEVELCTRL,
ID_M_ARCAPPROXIMATIONOPT, ID_M_FILLMODECTRL,
ID_M_ORIENTEDGESOPT, ID_M_ARCAPPROXIMATIONOPT,
ID_M_OUTLINEAPPEARANCECTRL, ID_M_ORIENTEDGESOPT,
wxID_BUTTON_EXPORT ID_M_OUTLINEAPPEARANCECTRL,
}; wxID_BUTTON_EXPORT
};
wxBoxSizer* m_MainBoxSizer;
wxBoxSizer* m_layerSizer; wxBoxSizer* m_MainBoxSizer;
wxStaticText* m_staticText17; wxStaticText* m_staticText17;
wxStaticText* m_staticText2; wxListView* m_LayerSelectionCtrl;
wxListBox* m_ListNetNameSelection; wxStaticText* m_staticText2;
wxStaticText* m_staticText16; wxListBox* m_ListNetNameSelection;
wxChoice* m_NetDisplayOption; wxStaticText* m_staticText16;
wxStaticText* m_staticText5; wxChoice* m_NetDisplayOption;
wxTextCtrl* m_DoNotShowNetNameFilter; wxStaticText* m_staticText5;
wxStaticText* m_staticText51; wxTextCtrl* m_DoNotShowNetNameFilter;
wxTextCtrl* m_ShowNetNameFilter; wxStaticText* m_staticText51;
wxButton* m_buttonRunFilter; wxTextCtrl* m_ShowNetNameFilter;
wxStaticText* m_ClearanceValueTitle; wxButton* m_buttonRunFilter;
wxTextCtrl* m_ZoneClearanceCtrl; wxStaticText* m_ClearanceValueTitle;
wxStaticText* m_MinThicknessValueTitle; wxTextCtrl* m_ZoneClearanceCtrl;
wxTextCtrl* m_ZoneMinThicknessCtrl; wxStaticText* m_MinThicknessValueTitle;
wxStaticText* m_staticText151; wxTextCtrl* m_ZoneMinThicknessCtrl;
wxChoice* m_cornerSmoothingChoice; wxStaticText* m_staticText151;
wxStaticText* m_cornerSmoothingTitle; wxChoice* m_cornerSmoothingChoice;
wxTextCtrl* m_cornerSmoothingCtrl; wxStaticText* m_cornerSmoothingTitle;
wxStaticText* m_staticText13; wxTextCtrl* m_cornerSmoothingCtrl;
wxChoice* m_PadInZoneOpt; wxStaticText* m_staticText13;
wxStaticText* m_AntipadSizeText; wxChoice* m_PadInZoneOpt;
wxTextCtrl* m_AntipadSizeValue; wxStaticText* m_AntipadSizeText;
wxStaticText* m_CopperBridgeWidthText; wxTextCtrl* m_AntipadSizeValue;
wxTextCtrl* m_CopperWidthValue; wxStaticText* m_CopperBridgeWidthText;
wxStaticText* m_staticText171; wxTextCtrl* m_CopperWidthValue;
wxSpinCtrl* m_PriorityLevelCtrl; wxStaticText* m_staticText171;
wxStaticText* m_staticText11; wxSpinCtrl* m_PriorityLevelCtrl;
wxChoice* m_FillModeCtrl; wxStaticText* m_staticText11;
wxStaticText* m_staticText12; wxChoice* m_FillModeCtrl;
wxChoice* m_ArcApproximationOpt; wxStaticText* m_staticText12;
wxStaticText* m_staticText14; wxChoice* m_ArcApproximationOpt;
wxChoice* m_OrientEdgesOpt; wxStaticText* m_staticText14;
wxStaticText* m_staticText15; wxChoice* m_OrientEdgesOpt;
wxChoice* m_OutlineAppearanceCtrl; wxStaticText* m_staticText15;
wxButton* m_ExportSetupButton; wxChoice* m_OutlineAppearanceCtrl;
wxButton* m_OkButton; wxButton* m_ExportSetupButton;
wxButton* m_ButtonCancel; wxButton* m_OkButton;
wxButton* m_ButtonCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } // Virtual event handlers, overide them in your derived class
virtual void OnSize( wxSizeEvent& event ) { event.Skip(); } virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnNetSortingOptionSelected( wxCommandEvent& event ) { event.Skip(); } virtual void OnSize( wxSizeEvent& event ) { event.Skip(); }
virtual void OnRunFiltersButtonClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnNetSortingOptionSelected( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCornerSmoothingModeChoice( wxCommandEvent& event ) { event.Skip(); } virtual void OnRunFiltersButtonClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnPadsInZoneClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnCornerSmoothingModeChoice( wxCommandEvent& event ) { event.Skip(); }
virtual void ExportSetupToOtherCopperZones( wxCommandEvent& event ) { event.Skip(); } virtual void OnPadsInZoneClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnButtonOkClick( wxCommandEvent& event ) { event.Skip(); } virtual void ExportSetupToOtherCopperZones( wxCommandEvent& event ) { event.Skip(); }
virtual void OnButtonCancelClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnButtonOkClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnButtonCancelClick( wxCommandEvent& event ) { event.Skip(); }
public:
public:
DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID id = ID_DIALOG_COPPER_ZONE_BASE, const wxString& title = _("Zone Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 550,500 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_COPPER_ZONE_BASE(); DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID id = ID_DIALOG_COPPER_ZONE_BASE, const wxString& title = _("Zone Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 567,500 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_COPPER_ZONE_BASE();
};
};
#endif //__DIALOG_COPPER_ZONES_BASE_H__
#endif //__DIALOG_COPPER_ZONES_BASE_H__

View File

@ -163,9 +163,10 @@ void DIALOG_DRC_CONTROL::OnStartdrcClick( wxCommandEvent& event )
SetDrcParmeters(); SetDrcParmeters();
m_tester->SetSettings( true, // Pad to pad DRC test enabled m_tester->SetSettings( true, // Pad to pad DRC test enabled
true, // unconnected pdas DRC test enabled true, // unconnected pdas DRC test enabled
true, // DRC test for zones enabled true, // DRC test for zones enabled
reportName, m_CreateRptCtrl->IsChecked() ); true, // DRC test for keepout areas enabled
reportName, m_CreateRptCtrl->IsChecked() );
DelDRCMarkers(); DelDRCMarkers();
@ -241,9 +242,10 @@ void DIALOG_DRC_CONTROL::OnListUnconnectedClick( wxCommandEvent& event )
SetDrcParmeters(); SetDrcParmeters();
m_tester->SetSettings( true, // Pad to pad DRC test enabled m_tester->SetSettings( true, // Pad to pad DRC test enabled
true, // unconnected pdas DRC test enabled true, // unconnected pdas DRC test enabled
true, // DRC test for zones enabled true, // DRC test for zones enabled
reportName, m_CreateRptCtrl->IsChecked() ); true, // DRC test for keepout areas enabled
reportName, m_CreateRptCtrl->IsChecked() );
DelDRCMarkers(); DelDRCMarkers();

View File

@ -1,342 +1,364 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Aug 24 2011) // C++ code generated with wxFormBuilder (version Apr 10 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "dialog_edit_module_for_BoardEditor_base.h" #include "dialog_edit_module_for_BoardEditor_base.h"
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
DIALOG_MODULE_BOARD_EDITOR_BASE::DIALOG_MODULE_BOARD_EDITOR_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) DIALOG_MODULE_BOARD_EDITOR_BASE::DIALOG_MODULE_BOARD_EDITOR_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{ {
this->SetSizeHints( wxDefaultSize, wxDefaultSize ); this->SetSizeHints( wxDefaultSize, wxDefaultSize );
m_GeneralBoxSizer = new wxBoxSizer( wxVERTICAL ); m_GeneralBoxSizer = new wxBoxSizer( wxVERTICAL );
m_NoteBook = new wxNotebook( this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 ); m_NoteBook = new wxNotebook( this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 );
m_PanelProperties = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL ); m_PanelProperties = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
wxBoxSizer* m_PanelPropertiesBoxSizer; wxBoxSizer* m_PanelPropertiesBoxSizer;
m_PanelPropertiesBoxSizer = new wxBoxSizer( wxHORIZONTAL ); m_PanelPropertiesBoxSizer = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer* bSizer13; wxBoxSizer* bSizer13;
bSizer13 = new wxBoxSizer( wxVERTICAL ); bSizer13 = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizerRef; wxStaticBoxSizer* sbSizerRef;
sbSizerRef = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Reference") ), wxHORIZONTAL ); sbSizerRef = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Reference") ), wxHORIZONTAL );
m_ReferenceCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); m_ReferenceCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
sbSizerRef->Add( m_ReferenceCtrl, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5 ); sbSizerRef->Add( m_ReferenceCtrl, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5 );
m_button4 = new wxButton( m_PanelProperties, wxID_ANY, _("Edit"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); m_button4 = new wxButton( m_PanelProperties, wxID_ANY, _("Edit"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
sbSizerRef->Add( m_button4, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5 ); sbSizerRef->Add( m_button4, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5 );
bSizer13->Add( sbSizerRef, 0, wxALL|wxEXPAND, 5 );
bSizer13->Add( sbSizerRef, 0, wxALL|wxEXPAND, 5 );
wxStaticBoxSizer* sbSizerValue;
sbSizerValue = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Value") ), wxHORIZONTAL ); wxStaticBoxSizer* sbSizerValue;
sbSizerValue = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Value") ), wxHORIZONTAL );
m_ValueCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
sbSizerValue->Add( m_ValueCtrl, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5 ); m_ValueCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
sbSizerValue->Add( m_ValueCtrl, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5 );
m_button5 = new wxButton( m_PanelProperties, wxID_ANY, _("Edit"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
sbSizerValue->Add( m_button5, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5 ); m_button5 = new wxButton( m_PanelProperties, wxID_ANY, _("Edit"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
sbSizerValue->Add( m_button5, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5 );
bSizer13->Add( sbSizerValue, 0, wxALL|wxEXPAND, 5 );
wxString m_LayerCtrlChoices[] = { _("Top"), _("Bottom") }; bSizer13->Add( sbSizerValue, 0, wxALL|wxEXPAND, 5 );
int m_LayerCtrlNChoices = sizeof( m_LayerCtrlChoices ) / sizeof( wxString );
m_LayerCtrl = new wxRadioBox( m_PanelProperties, wxID_ANY, _("Side"), wxDefaultPosition, wxDefaultSize, m_LayerCtrlNChoices, m_LayerCtrlChoices, 1, 0 ); wxString m_LayerCtrlChoices[] = { _("Top"), _("Bottom") };
m_LayerCtrl->SetSelection( 0 ); int m_LayerCtrlNChoices = sizeof( m_LayerCtrlChoices ) / sizeof( wxString );
bSizer13->Add( m_LayerCtrl, 0, wxALL|wxEXPAND, 5 ); m_LayerCtrl = new wxRadioBox( m_PanelProperties, wxID_ANY, _("Side"), wxDefaultPosition, wxDefaultSize, m_LayerCtrlNChoices, m_LayerCtrlChoices, 1, 0 );
m_LayerCtrl->SetSelection( 0 );
wxStaticBoxSizer* sbSizerOrientation; bSizer13->Add( m_LayerCtrl, 0, wxALL|wxEXPAND, 5 );
sbSizerOrientation = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Orientation") ), wxVERTICAL );
wxStaticBoxSizer* sbSizerOrientation;
wxString m_OrientCtrlChoices[] = { _("Normal"), _("+90.0"), _("-90.0"), _("180.0"), _("User") }; sbSizerOrientation = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Orientation") ), wxVERTICAL );
int m_OrientCtrlNChoices = sizeof( m_OrientCtrlChoices ) / sizeof( wxString );
m_OrientCtrl = new wxRadioBox( m_PanelProperties, ID_LISTBOX_ORIENT_SELECT, _("Orientation"), wxDefaultPosition, wxDefaultSize, m_OrientCtrlNChoices, m_OrientCtrlChoices, 1, wxRA_SPECIFY_COLS ); wxString m_OrientCtrlChoices[] = { _("Normal"), _("+90.0"), _("-90.0"), _("180.0"), _("User") };
m_OrientCtrl->SetSelection( 1 ); int m_OrientCtrlNChoices = sizeof( m_OrientCtrlChoices ) / sizeof( wxString );
sbSizerOrientation->Add( m_OrientCtrl, 0, wxALL|wxEXPAND, 5 ); m_OrientCtrl = new wxRadioBox( m_PanelProperties, ID_LISTBOX_ORIENT_SELECT, _("Orientation"), wxDefaultPosition, wxDefaultSize, m_OrientCtrlNChoices, m_OrientCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_OrientCtrl->SetSelection( 1 );
m_staticText4 = new wxStaticText( m_PanelProperties, wxID_ANY, _("User orientation (in 0.1 degrees):"), wxDefaultPosition, wxDefaultSize, 0 ); sbSizerOrientation->Add( m_OrientCtrl, 0, wxALL|wxEXPAND, 5 );
m_staticText4->Wrap( -1 );
sbSizerOrientation->Add( m_staticText4, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_staticText4 = new wxStaticText( m_PanelProperties, wxID_ANY, _("User orientation (in 0.1 degrees):"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText4->Wrap( -1 );
m_OrientValue = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); sbSizerOrientation->Add( m_staticText4, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
sbSizerOrientation->Add( m_OrientValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_OrientValue = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizer13->Add( sbSizerOrientation, 0, wxALL|wxEXPAND, 5 ); sbSizerOrientation->Add( m_OrientValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxStaticBoxSizer* sbSizerPosition;
sbSizerPosition = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Position") ), wxVERTICAL ); bSizer13->Add( sbSizerOrientation, 0, wxALL|wxEXPAND, 5 );
wxFlexGridSizer* fgSizer2; wxStaticBoxSizer* sbSizerPosition;
fgSizer2 = new wxFlexGridSizer( 2, 2, 0, 0 ); sbSizerPosition = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Position") ), wxVERTICAL );
fgSizer2->AddGrowableCol( 1 );
fgSizer2->AddGrowableRow( 2 ); wxFlexGridSizer* fgSizer2;
fgSizer2->SetFlexibleDirection( wxHORIZONTAL ); fgSizer2 = new wxFlexGridSizer( 2, 2, 0, 0 );
fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); fgSizer2->AddGrowableCol( 1 );
fgSizer2->SetFlexibleDirection( wxHORIZONTAL );
XPositionStatic = new wxStaticText( m_PanelProperties, wxID_ANY, _("X"), wxDefaultPosition, wxDefaultSize, 0 ); fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
XPositionStatic->Wrap( -1 );
fgSizer2->Add( XPositionStatic, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT|wxRIGHT|wxTOP, 5 ); XPositionStatic = new wxStaticText( m_PanelProperties, wxID_ANY, _("X"), wxDefaultPosition, wxDefaultSize, 0 );
XPositionStatic->Wrap( -1 );
m_ModPositionX = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); fgSizer2->Add( XPositionStatic, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT|wxRIGHT|wxTOP, 5 );
fgSizer2->Add( m_ModPositionX, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_ModPositionX = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
YPositionStatic = new wxStaticText( m_PanelProperties, wxID_ANY, _("Y"), wxDefaultPosition, wxDefaultSize, 0 ); fgSizer2->Add( m_ModPositionX, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
YPositionStatic->Wrap( -1 );
fgSizer2->Add( YPositionStatic, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); YPositionStatic = new wxStaticText( m_PanelProperties, wxID_ANY, _("Y"), wxDefaultPosition, wxDefaultSize, 0 );
YPositionStatic->Wrap( -1 );
m_ModPositionY = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); fgSizer2->Add( YPositionStatic, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
fgSizer2->Add( m_ModPositionY, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_ModPositionY = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
sbSizerPosition->Add( fgSizer2, 1, wxEXPAND, 5 ); fgSizer2->Add( m_ModPositionY, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
bSizer13->Add( sbSizerPosition, 0, wxALL|wxEXPAND, 5 );
sbSizerPosition->Add( fgSizer2, 1, wxEXPAND, 5 );
m_PanelPropertiesBoxSizer->Add( bSizer13, 1, wxEXPAND, 5 );
m_PropRightSizer = new wxBoxSizer( wxVERTICAL ); bSizer13->Add( sbSizerPosition, 0, wxALL|wxEXPAND, 5 );
m_buttonExchange = new wxButton( m_PanelProperties, ID_MODULE_PROPERTIES_EXCHANGE, _("Change Module(s)"), wxDefaultPosition, wxDefaultSize, 0 );
m_PropRightSizer->Add( m_buttonExchange, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); m_PanelPropertiesBoxSizer->Add( bSizer13, 1, wxEXPAND, 5 );
m_buttonModuleEditor = new wxButton( m_PanelProperties, ID_GOTO_MODULE_EDITOR, _("Module Editor"), wxDefaultPosition, wxDefaultSize, 0 ); m_PropRightSizer = new wxBoxSizer( wxVERTICAL );
m_PropRightSizer->Add( m_buttonModuleEditor, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
m_buttonExchange = new wxButton( m_PanelProperties, ID_MODULE_PROPERTIES_EXCHANGE, _("Change Module(s)"), wxDefaultPosition, wxDefaultSize, 0 );
wxBoxSizer* bSizer12; m_PropRightSizer->Add( m_buttonExchange, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
bSizer12 = new wxBoxSizer( wxHORIZONTAL );
m_buttonModuleEditor = new wxButton( m_PanelProperties, ID_GOTO_MODULE_EDITOR, _("Module Editor"), wxDefaultPosition, wxDefaultSize, 0 );
wxString m_AttributsCtrlChoices[] = { _("Normal"), _("Normal+Insert"), _("Virtual") }; m_PropRightSizer->Add( m_buttonModuleEditor, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
int m_AttributsCtrlNChoices = sizeof( m_AttributsCtrlChoices ) / sizeof( wxString );
m_AttributsCtrl = new wxRadioBox( m_PanelProperties, wxID_ANY, _("Attributes"), wxDefaultPosition, wxDefaultSize, m_AttributsCtrlNChoices, m_AttributsCtrlChoices, 1, wxRA_SPECIFY_COLS ); wxBoxSizer* bSizer12;
m_AttributsCtrl->SetSelection( 0 ); bSizer12 = new wxBoxSizer( wxHORIZONTAL );
bSizer12->Add( m_AttributsCtrl, 1, wxALL|wxEXPAND, 5 );
wxString m_AttributsCtrlChoices[] = { _("Normal"), _("Normal+Insert"), _("Virtual") };
wxString m_AutoPlaceCtrlChoices[] = { _("Free"), _("Locked") }; int m_AttributsCtrlNChoices = sizeof( m_AttributsCtrlChoices ) / sizeof( wxString );
int m_AutoPlaceCtrlNChoices = sizeof( m_AutoPlaceCtrlChoices ) / sizeof( wxString ); m_AttributsCtrl = new wxRadioBox( m_PanelProperties, wxID_ANY, _("Attributes"), wxDefaultPosition, wxDefaultSize, m_AttributsCtrlNChoices, m_AttributsCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_AutoPlaceCtrl = new wxRadioBox( m_PanelProperties, wxID_ANY, _("Move and Auto Place"), wxDefaultPosition, wxDefaultSize, m_AutoPlaceCtrlNChoices, m_AutoPlaceCtrlChoices, 1, wxRA_SPECIFY_COLS ); m_AttributsCtrl->SetSelection( 0 );
m_AutoPlaceCtrl->SetSelection( 0 ); bSizer12->Add( m_AttributsCtrl, 1, wxALL|wxEXPAND, 5 );
bSizer12->Add( m_AutoPlaceCtrl, 1, wxALL|wxEXPAND, 5 );
wxString m_AutoPlaceCtrlChoices[] = { _("Free"), _("Locked") };
m_PropRightSizer->Add( bSizer12, 1, wxEXPAND, 5 ); int m_AutoPlaceCtrlNChoices = sizeof( m_AutoPlaceCtrlChoices ) / sizeof( wxString );
m_AutoPlaceCtrl = new wxRadioBox( m_PanelProperties, wxID_ANY, _("Move and Auto Place"), wxDefaultPosition, wxDefaultSize, m_AutoPlaceCtrlNChoices, m_AutoPlaceCtrlChoices, 1, wxRA_SPECIFY_COLS );
wxStaticBoxSizer* sbSizerAutoplace; m_AutoPlaceCtrl->SetSelection( 0 );
sbSizerAutoplace = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Auto Move and Place") ), wxHORIZONTAL ); bSizer12->Add( m_AutoPlaceCtrl, 1, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizerRotOpt;
bSizerRotOpt = new wxBoxSizer( wxVERTICAL ); m_PropRightSizer->Add( bSizer12, 1, wxEXPAND, 5 );
m_staticText11 = new wxStaticText( m_PanelProperties, wxID_ANY, _("Rotation 90 degree"), wxDefaultPosition, wxDefaultSize, 0 ); wxStaticBoxSizer* sbSizerAutoplace;
m_staticText11->Wrap( -1 ); sbSizerAutoplace = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Auto Move and Place") ), wxHORIZONTAL );
bSizerRotOpt->Add( m_staticText11, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizerRotOpt;
m_CostRot90Ctrl = new wxSlider( m_PanelProperties, wxID_ANY, 0, 0, 10, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS ); bSizerRotOpt = new wxBoxSizer( wxVERTICAL );
bSizerRotOpt->Add( m_CostRot90Ctrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_staticText11 = new wxStaticText( m_PanelProperties, wxID_ANY, _("Rotation 90 degree"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizerAutoplace->Add( bSizerRotOpt, 1, wxEXPAND, 5 ); m_staticText11->Wrap( -1 );
bSizerRotOpt->Add( m_staticText11, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizerMoveOpt;
bSizerMoveOpt = new wxBoxSizer( wxVERTICAL ); m_CostRot90Ctrl = new wxSlider( m_PanelProperties, wxID_ANY, 0, 0, 10, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS );
bSizerRotOpt->Add( m_CostRot90Ctrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_staticText12 = new wxStaticText( m_PanelProperties, wxID_ANY, _("Rotation 180 degree"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText12->Wrap( -1 );
bSizerMoveOpt->Add( m_staticText12, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); sbSizerAutoplace->Add( bSizerRotOpt, 1, wxEXPAND, 5 );
m_CostRot180Ctrl = new wxSlider( m_PanelProperties, wxID_ANY, 0, 0, 10, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS ); wxBoxSizer* bSizerMoveOpt;
bSizerMoveOpt->Add( m_CostRot180Ctrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); bSizerMoveOpt = new wxBoxSizer( wxVERTICAL );
sbSizerAutoplace->Add( bSizerMoveOpt, 1, wxEXPAND, 5 ); m_staticText12 = new wxStaticText( m_PanelProperties, wxID_ANY, _("Rotation 180 degree"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText12->Wrap( -1 );
m_PropRightSizer->Add( sbSizerAutoplace, 1, wxEXPAND|wxALL, 5 ); bSizerMoveOpt->Add( m_staticText12, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
wxStaticBoxSizer* sbSizerLocalProperties; m_CostRot180Ctrl = new wxSlider( m_PanelProperties, wxID_ANY, 0, 0, 10, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS );
sbSizerLocalProperties = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Local Settings") ), wxVERTICAL ); bSizerMoveOpt->Add( m_CostRot180Ctrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxBoxSizer* bSizer11;
bSizer11 = new wxBoxSizer( wxVERTICAL ); sbSizerAutoplace->Add( bSizerMoveOpt, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer10;
bSizer10 = new wxBoxSizer( wxHORIZONTAL ); m_PropRightSizer->Add( sbSizerAutoplace, 1, wxEXPAND|wxALL, 5 );
m_staticText16 = new wxStaticText( m_PanelProperties, wxID_ANY, _("Pad connection to zones:"), wxDefaultPosition, wxDefaultSize, 0 ); wxStaticBoxSizer* sbSizerLocalProperties;
m_staticText16->Wrap( -1 ); sbSizerLocalProperties = new wxStaticBoxSizer( new wxStaticBox( m_PanelProperties, wxID_ANY, _("Local Settings") ), wxVERTICAL );
bSizer10->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
wxBoxSizer* bSizer11;
wxString m_ZoneConnectionChoiceChoices[] = { _("Use zone setting"), _("Solid"), _("Thermal relief"), _("None") }; bSizer11 = new wxBoxSizer( wxVERTICAL );
int m_ZoneConnectionChoiceNChoices = sizeof( m_ZoneConnectionChoiceChoices ) / sizeof( wxString );
m_ZoneConnectionChoice = new wxChoice( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_ZoneConnectionChoiceNChoices, m_ZoneConnectionChoiceChoices, 0 ); wxBoxSizer* bSizer10;
m_ZoneConnectionChoice->SetSelection( 0 ); bSizer10 = new wxBoxSizer( wxHORIZONTAL );
bSizer10->Add( m_ZoneConnectionChoice, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_staticText16 = new wxStaticText( m_PanelProperties, wxID_ANY, _("Pad connection to zones:"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer11->Add( bSizer10, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); m_staticText16->Wrap( -1 );
bSizer10->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_staticTextInfo = new wxStaticText( m_PanelProperties, wxID_ANY, _("Set clearances to 0 to use global values"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextInfo->Wrap( -1 ); wxString m_ZoneConnectionChoiceChoices[] = { _("Use zone setting"), _("Solid"), _("Thermal relief"), _("None") };
m_staticTextInfo->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); int m_ZoneConnectionChoiceNChoices = sizeof( m_ZoneConnectionChoiceChoices ) / sizeof( wxString );
m_ZoneConnectionChoice = new wxChoice( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_ZoneConnectionChoiceNChoices, m_ZoneConnectionChoiceChoices, 0 );
bSizer11->Add( m_staticTextInfo, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 ); m_ZoneConnectionChoice->SetSelection( 0 );
bSizer10->Add( m_ZoneConnectionChoice, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
sbSizerLocalProperties->Add( bSizer11, 0, 0, 5 );
wxFlexGridSizer* fgSizerClearances; bSizer11->Add( bSizer10, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
fgSizerClearances = new wxFlexGridSizer( 5, 3, 0, 0 );
fgSizerClearances->SetFlexibleDirection( wxBOTH ); m_staticTextInfo = new wxStaticText( m_PanelProperties, wxID_ANY, _("Set clearances to 0 to use global values"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizerClearances->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); m_staticTextInfo->Wrap( -1 );
m_staticTextInfo->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
m_staticTextNetClearance = new wxStaticText( m_PanelProperties, wxID_ANY, _("All pads nets clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextNetClearance->Wrap( -1 ); bSizer11->Add( m_staticTextInfo, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 );
m_staticTextNetClearance->SetToolTip( _("This is the local net clearance for all pad of this footprint\nIf 0, the Netclass values are used\nThis value can be superseded by a pad local value.") );
fgSizerClearances->Add( m_staticTextNetClearance, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); sbSizerLocalProperties->Add( bSizer11, 0, 0, 5 );
m_NetClearanceValueCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); wxFlexGridSizer* fgSizerClearances;
fgSizerClearances->Add( m_NetClearanceValueCtrl, 0, wxALL|wxEXPAND, 5 ); fgSizerClearances = new wxFlexGridSizer( 5, 3, 0, 0 );
fgSizerClearances->AddGrowableCol( 1 );
m_NetClearanceUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 ); fgSizerClearances->SetFlexibleDirection( wxBOTH );
m_NetClearanceUnits->Wrap( -1 ); fgSizerClearances->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
fgSizerClearances->Add( m_NetClearanceUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
m_staticTextNetClearance = new wxStaticText( m_PanelProperties, wxID_ANY, _("All pads nets clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticline1 = new wxStaticLine( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_staticTextNetClearance->Wrap( -1 );
fgSizerClearances->Add( m_staticline1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); m_staticTextNetClearance->SetToolTip( _("This is the local net clearance for all pad of this footprint\nIf 0, the Netclass values are used\nThis value can be superseded by a pad local value.") );
m_staticline2 = new wxStaticLine( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); fgSizerClearances->Add( m_staticTextNetClearance, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
fgSizerClearances->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_NetClearanceValueCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_staticline3 = new wxStaticLine( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); fgSizerClearances->Add( m_NetClearanceValueCtrl, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
fgSizerClearances->Add( m_staticline3, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_NetClearanceUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
m_MaskClearanceTitle = new wxStaticText( m_PanelProperties, wxID_ANY, _("Solder mask clearance:"), wxDefaultPosition, wxDefaultSize, 0 ); m_NetClearanceUnits->Wrap( -1 );
m_MaskClearanceTitle->Wrap( -1 ); fgSizerClearances->Add( m_NetClearanceUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
m_MaskClearanceTitle->SetToolTip( _("This is the local clearance between pads and the solder mask\nfor this footprint\nThis value can be superseded by a pad local value.\nIf 0, the global value is used") );
m_staticline1 = new wxStaticLine( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
fgSizerClearances->Add( m_MaskClearanceTitle, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); fgSizerClearances->Add( m_staticline1, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_SolderMaskMarginCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_staticline2 = new wxStaticLine( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
fgSizerClearances->Add( m_SolderMaskMarginCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); fgSizerClearances->Add( m_staticline2, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_SolderMaskMarginUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticline3 = new wxStaticLine( m_PanelProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
m_SolderMaskMarginUnits->Wrap( -1 ); fgSizerClearances->Add( m_staticline3, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 );
fgSizerClearances->Add( m_SolderMaskMarginUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
m_MaskClearanceTitle = new wxStaticText( m_PanelProperties, wxID_ANY, _("Solder mask clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextSolderPaste = new wxStaticText( m_PanelProperties, wxID_ANY, _("Solder paste clearance:"), wxDefaultPosition, wxDefaultSize, 0 ); m_MaskClearanceTitle->Wrap( -1 );
m_staticTextSolderPaste->Wrap( -1 ); m_MaskClearanceTitle->SetToolTip( _("This is the local clearance between pads and the solder mask\nfor this footprint\nThis value can be superseded by a pad local value.\nIf 0, the global value is used") );
m_staticTextSolderPaste->SetToolTip( _("This is the local clearance between pads and the solder paste\nfor this footprint.\nThis value can be superseded by a pad local values.\nThe final clearance value is the sum of this value and the clearance value ratio\nA negative value means a smaller mask size than pad size") );
fgSizerClearances->Add( m_MaskClearanceTitle, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
fgSizerClearances->Add( m_staticTextSolderPaste, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 );
m_SolderMaskMarginCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_SolderPasteMarginCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); fgSizerClearances->Add( m_SolderMaskMarginCtrl, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
fgSizerClearances->Add( m_SolderPasteMarginCtrl, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
m_SolderMaskMarginUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
m_SolderPasteMarginUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 ); m_SolderMaskMarginUnits->Wrap( -1 );
m_SolderPasteMarginUnits->Wrap( -1 ); fgSizerClearances->Add( m_SolderMaskMarginUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
fgSizerClearances->Add( m_SolderPasteMarginUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 5 );
m_staticTextSolderPaste = new wxStaticText( m_PanelProperties, wxID_ANY, _("Solder paste clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextRatio = new wxStaticText( m_PanelProperties, wxID_ANY, _("Solder mask ratio clearance:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextSolderPaste->Wrap( -1 );
m_staticTextRatio->Wrap( -1 ); m_staticTextSolderPaste->SetToolTip( _("This is the local clearance between pads and the solder paste\nfor this footprint.\nThis value can be superseded by a pad local values.\nThe final clearance value is the sum of this value and the clearance value ratio\nA negative value means a smaller mask size than pad size") );
m_staticTextRatio->SetToolTip( _("This is the local clearance ratio in per cent between pads and the solder paste\nfor this footprint.\nA value of 10 means the clearance value is 10 per cent of the pad size\nThis value can be superseded by a pad local value.\nThe final clearance value is the sum of this value and the clearance value\nA negative value means a smaller mask size than pad size.") );
fgSizerClearances->Add( m_staticTextSolderPaste, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 );
fgSizerClearances->Add( m_staticTextRatio, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_SolderPasteMarginCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_SolderPasteMarginRatioCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); fgSizerClearances->Add( m_SolderPasteMarginCtrl, 1, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
fgSizerClearances->Add( m_SolderPasteMarginRatioCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_SolderPasteMarginUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 );
m_SolderPasteRatioMarginUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("%"), wxDefaultPosition, wxDefaultSize, 0 ); m_SolderPasteMarginUnits->Wrap( -1 );
m_SolderPasteRatioMarginUnits->Wrap( -1 ); fgSizerClearances->Add( m_SolderPasteMarginUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 5 );
fgSizerClearances->Add( m_SolderPasteRatioMarginUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
m_staticTextRatio = new wxStaticText( m_PanelProperties, wxID_ANY, _("Solder mask ratio clearance:"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizerLocalProperties->Add( fgSizerClearances, 1, wxEXPAND, 5 ); m_staticTextRatio->Wrap( -1 );
m_staticTextRatio->SetToolTip( _("This is the local clearance ratio in per cent between pads and the solder paste\nfor this footprint.\nA value of 10 means the clearance value is 10 per cent of the pad size\nThis value can be superseded by a pad local value.\nThe final clearance value is the sum of this value and the clearance value\nA negative value means a smaller mask size than pad size.") );
m_PropRightSizer->Add( sbSizerLocalProperties, 0, wxALL|wxEXPAND, 5 );
fgSizerClearances->Add( m_staticTextRatio, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_PanelPropertiesBoxSizer->Add( m_PropRightSizer, 0, 0, 5 );
m_SolderPasteMarginRatioCtrl = new wxTextCtrl( m_PanelProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_PanelProperties->SetSizer( m_PanelPropertiesBoxSizer ); fgSizerClearances->Add( m_SolderPasteMarginRatioCtrl, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_PanelProperties->Layout();
m_PanelPropertiesBoxSizer->Fit( m_PanelProperties ); m_SolderPasteRatioMarginUnits = new wxStaticText( m_PanelProperties, wxID_ANY, _("%"), wxDefaultPosition, wxDefaultSize, 0 );
m_NoteBook->AddPage( m_PanelProperties, _("Properties"), true ); m_SolderPasteRatioMarginUnits->Wrap( -1 );
m_Panel3D = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL ); fgSizerClearances->Add( m_SolderPasteRatioMarginUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
wxBoxSizer* bSizerMain3D;
bSizerMain3D = new wxBoxSizer( wxVERTICAL );
sbSizerLocalProperties->Add( fgSizerClearances, 1, wxEXPAND, 5 );
m_staticText3Dname = new wxStaticText( m_Panel3D, wxID_ANY, _("3D Shape Name"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText3Dname->Wrap( -1 );
bSizerMain3D->Add( m_staticText3Dname, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_PropRightSizer->Add( sbSizerLocalProperties, 0, wxALL|wxEXPAND, 5 );
m_3D_ShapeNameListBox = new wxListBox( m_Panel3D, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE );
bSizerMain3D->Add( m_3D_ShapeNameListBox, 0, wxALL|wxEXPAND, 5 ); m_PanelPropertiesBoxSizer->Add( m_PropRightSizer, 0, 0, 5 );
wxBoxSizer* bLowerSizer3D;
bLowerSizer3D = new wxBoxSizer( wxHORIZONTAL ); m_PanelProperties->SetSizer( m_PanelPropertiesBoxSizer );
m_PanelProperties->Layout();
m_Sizer3DValues = new wxStaticBoxSizer( new wxStaticBox( m_Panel3D, wxID_ANY, _("3D Scale and Position") ), wxVERTICAL ); m_PanelPropertiesBoxSizer->Fit( m_PanelProperties );
m_NoteBook->AddPage( m_PanelProperties, _("Properties"), true );
bLowerSizer3D->Add( m_Sizer3DValues, 1, wxEXPAND, 5 ); m_Panel3D = new wxPanel( m_NoteBook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
wxBoxSizer* bSizerMain3D;
wxBoxSizer* bSizer3DButtons; bSizerMain3D = new wxBoxSizer( wxVERTICAL );
bSizer3DButtons = new wxBoxSizer( wxVERTICAL );
m_staticText3Dname = new wxStaticText( m_Panel3D, wxID_ANY, _("3D Shape Name"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonBrowse = new wxButton( m_Panel3D, ID_BROWSE_3D_LIB, _("Browse Shapes"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText3Dname->Wrap( -1 );
bSizer3DButtons->Add( m_buttonBrowse, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); bSizerMain3D->Add( m_staticText3Dname, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_buttonAdd = new wxButton( m_Panel3D, ID_ADD_3D_SHAPE, _("Add 3D Shape"), wxDefaultPosition, wxDefaultSize, 0 ); m_3D_ShapeNameListBox = new wxListBox( m_Panel3D, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE );
bSizer3DButtons->Add( m_buttonAdd, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); bSizerMain3D->Add( m_3D_ShapeNameListBox, 0, wxALL|wxEXPAND, 5 );
m_buttonRemove = new wxButton( m_Panel3D, ID_REMOVE_3D_SHAPE, _("Remove 3D Shape"), wxDefaultPosition, wxDefaultSize, 0 ); wxBoxSizer* bLowerSizer3D;
bSizer3DButtons->Add( m_buttonRemove, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); bLowerSizer3D = new wxBoxSizer( wxHORIZONTAL );
bLowerSizer3D->Add( bSizer3DButtons, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_Sizer3DValues = new wxStaticBoxSizer( new wxStaticBox( m_Panel3D, wxID_ANY, _("3D Scale and Position") ), wxVERTICAL );
bSizerMain3D->Add( bLowerSizer3D, 1, wxEXPAND, 5 );
bLowerSizer3D->Add( m_Sizer3DValues, 1, wxEXPAND, 5 );
m_Panel3D->SetSizer( bSizerMain3D );
m_Panel3D->Layout(); wxBoxSizer* bSizer3DButtons;
bSizerMain3D->Fit( m_Panel3D ); bSizer3DButtons = new wxBoxSizer( wxVERTICAL );
m_NoteBook->AddPage( m_Panel3D, _("3D settings"), false );
m_buttonBrowse = new wxButton( m_Panel3D, ID_BROWSE_3D_LIB, _("Browse Shapes"), wxDefaultPosition, wxDefaultSize, 0 );
m_GeneralBoxSizer->Add( m_NoteBook, 1, wxEXPAND | wxALL, 5 ); bSizer3DButtons->Add( m_buttonBrowse, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
m_sdbSizerStdButtons = new wxStdDialogButtonSizer(); m_buttonAdd = new wxButton( m_Panel3D, ID_ADD_3D_SHAPE, _("Add 3D Shape"), wxDefaultPosition, wxDefaultSize, 0 );
m_sdbSizerStdButtonsOK = new wxButton( this, wxID_OK ); bSizer3DButtons->Add( m_buttonAdd, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
m_sdbSizerStdButtons->AddButton( m_sdbSizerStdButtonsOK );
m_sdbSizerStdButtonsCancel = new wxButton( this, wxID_CANCEL ); m_buttonRemove = new wxButton( m_Panel3D, ID_REMOVE_3D_SHAPE, _("Remove 3D Shape"), wxDefaultPosition, wxDefaultSize, 0 );
m_sdbSizerStdButtons->AddButton( m_sdbSizerStdButtonsCancel ); bSizer3DButtons->Add( m_buttonRemove, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
m_sdbSizerStdButtons->Realize();
m_GeneralBoxSizer->Add( m_sdbSizerStdButtons, 0, wxEXPAND|wxALIGN_RIGHT|wxALL, 5 );
bLowerSizer3D->Add( bSizer3DButtons, 0, wxALIGN_CENTER_VERTICAL, 5 );
this->SetSizer( m_GeneralBoxSizer );
this->Layout();
bSizerMain3D->Add( bLowerSizer3D, 1, wxEXPAND, 5 );
// Connect Events
m_button4->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditReference ), NULL, this );
m_button5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditValue ), NULL, this ); m_Panel3D->SetSizer( bSizerMain3D );
m_OrientCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ModuleOrientEvent ), NULL, this ); m_Panel3D->Layout();
m_buttonExchange->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ExchangeModule ), NULL, this ); bSizerMain3D->Fit( m_Panel3D );
m_buttonModuleEditor->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::GotoModuleEditor ), NULL, this ); m_NoteBook->AddPage( m_Panel3D, _("3D settings"), false );
m_3D_ShapeNameListBox->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::On3DShapeNameSelected ), NULL, this );
m_buttonBrowse->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Browse3DLib ), NULL, this ); m_GeneralBoxSizer->Add( m_NoteBook, 1, wxEXPAND | wxALL, 5 );
m_buttonAdd->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Add3DShape ), NULL, this );
m_buttonRemove->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Remove3DShape ), NULL, this ); m_sdbSizerStdButtons = new wxStdDialogButtonSizer();
m_sdbSizerStdButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnCancelClick ), NULL, this ); m_sdbSizerStdButtonsOK = new wxButton( this, wxID_OK );
m_sdbSizerStdButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnOkClick ), NULL, this ); m_sdbSizerStdButtons->AddButton( m_sdbSizerStdButtonsOK );
} m_sdbSizerStdButtonsCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizerStdButtons->AddButton( m_sdbSizerStdButtonsCancel );
DIALOG_MODULE_BOARD_EDITOR_BASE::~DIALOG_MODULE_BOARD_EDITOR_BASE() m_sdbSizerStdButtons->Realize();
{
// Disconnect Events m_GeneralBoxSizer->Add( m_sdbSizerStdButtons, 0, wxEXPAND|wxALIGN_RIGHT|wxALL, 5 );
m_button4->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditReference ), NULL, this );
m_button5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditValue ), NULL, this );
m_OrientCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ModuleOrientEvent ), NULL, this ); this->SetSizer( m_GeneralBoxSizer );
m_buttonExchange->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ExchangeModule ), NULL, this ); this->Layout();
m_buttonModuleEditor->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::GotoModuleEditor ), NULL, this );
m_3D_ShapeNameListBox->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::On3DShapeNameSelected ), NULL, this ); // Connect Events
m_buttonBrowse->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Browse3DLib ), NULL, this ); m_button4->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditReference ), NULL, this );
m_buttonAdd->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Add3DShape ), NULL, this ); m_button5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditValue ), NULL, this );
m_buttonRemove->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Remove3DShape ), NULL, this ); m_OrientCtrl->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ModuleOrientEvent ), NULL, this );
m_sdbSizerStdButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnCancelClick ), NULL, this ); m_buttonExchange->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ExchangeModule ), NULL, this );
m_sdbSizerStdButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnOkClick ), NULL, this ); m_buttonModuleEditor->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::GotoModuleEditor ), NULL, this );
m_3D_ShapeNameListBox->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::On3DShapeNameSelected ), NULL, this );
} m_buttonBrowse->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Browse3DLib ), NULL, this );
m_buttonAdd->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Add3DShape ), NULL, this );
m_buttonRemove->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Remove3DShape ), NULL, this );
m_sdbSizerStdButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnCancelClick ), NULL, this );
m_sdbSizerStdButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnOkClick ), NULL, this );
}
DIALOG_MODULE_BOARD_EDITOR_BASE::~DIALOG_MODULE_BOARD_EDITOR_BASE()
{
// Disconnect Events
m_button4->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditReference ), NULL, this );
m_button5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnEditValue ), NULL, this );
m_OrientCtrl->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ModuleOrientEvent ), NULL, this );
m_buttonExchange->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::ExchangeModule ), NULL, this );
m_buttonModuleEditor->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::GotoModuleEditor ), NULL, this );
m_3D_ShapeNameListBox->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::On3DShapeNameSelected ), NULL, this );
m_buttonBrowse->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Browse3DLib ), NULL, this );
m_buttonAdd->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Add3DShape ), NULL, this );
m_buttonRemove->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::Remove3DShape ), NULL, this );
m_sdbSizerStdButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnCancelClick ), NULL, this );
m_sdbSizerStdButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_MODULE_BOARD_EDITOR_BASE::OnOkClick ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -1,128 +1,128 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Aug 24 2011) // C++ code generated with wxFormBuilder (version Apr 10 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_EDIT_MODULE_FOR_BOARDEDITOR_BASE_H__ #ifndef __DIALOG_EDIT_MODULE_FOR_BOARDEDITOR_BASE_H__
#define __DIALOG_EDIT_MODULE_FOR_BOARDEDITOR_BASE_H__ #define __DIALOG_EDIT_MODULE_FOR_BOARDEDITOR_BASE_H__
#include <wx/artprov.h> #include <wx/artprov.h>
#include <wx/xrc/xmlres.h> #include <wx/xrc/xmlres.h>
#include <wx/intl.h> #include <wx/intl.h>
#include <wx/string.h> #include <wx/string.h>
#include <wx/textctrl.h> #include <wx/textctrl.h>
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
#include <wx/font.h> #include <wx/font.h>
#include <wx/colour.h> #include <wx/colour.h>
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/button.h> #include <wx/button.h>
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/statbox.h> #include <wx/statbox.h>
#include <wx/radiobox.h> #include <wx/radiobox.h>
#include <wx/stattext.h> #include <wx/stattext.h>
#include <wx/slider.h> #include <wx/slider.h>
#include <wx/choice.h> #include <wx/choice.h>
#include <wx/statline.h> #include <wx/statline.h>
#include <wx/panel.h> #include <wx/panel.h>
#include <wx/bitmap.h> #include <wx/bitmap.h>
#include <wx/image.h> #include <wx/image.h>
#include <wx/icon.h> #include <wx/icon.h>
#include <wx/listbox.h> #include <wx/listbox.h>
#include <wx/notebook.h> #include <wx/notebook.h>
#include <wx/dialog.h> #include <wx/dialog.h>
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#define ID_NOTEBOOK 1000 #define ID_NOTEBOOK 1000
#define ID_LISTBOX_ORIENT_SELECT 1001 #define ID_LISTBOX_ORIENT_SELECT 1001
#define ID_MODULE_PROPERTIES_EXCHANGE 1002 #define ID_MODULE_PROPERTIES_EXCHANGE 1002
#define ID_GOTO_MODULE_EDITOR 1003 #define ID_GOTO_MODULE_EDITOR 1003
#define ID_BROWSE_3D_LIB 1004 #define ID_BROWSE_3D_LIB 1004
#define ID_ADD_3D_SHAPE 1005 #define ID_ADD_3D_SHAPE 1005
#define ID_REMOVE_3D_SHAPE 1006 #define ID_REMOVE_3D_SHAPE 1006
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_MODULE_BOARD_EDITOR_BASE /// Class DIALOG_MODULE_BOARD_EDITOR_BASE
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
class DIALOG_MODULE_BOARD_EDITOR_BASE : public wxDialog class DIALOG_MODULE_BOARD_EDITOR_BASE : public wxDialog
{ {
private: private:
wxBoxSizer* m_GeneralBoxSizer; wxBoxSizer* m_GeneralBoxSizer;
wxBoxSizer* m_PropRightSizer; wxBoxSizer* m_PropRightSizer;
protected: protected:
wxNotebook* m_NoteBook; wxNotebook* m_NoteBook;
wxPanel* m_PanelProperties; wxPanel* m_PanelProperties;
wxTextCtrl* m_ReferenceCtrl; wxTextCtrl* m_ReferenceCtrl;
wxButton* m_button4; wxButton* m_button4;
wxTextCtrl* m_ValueCtrl; wxTextCtrl* m_ValueCtrl;
wxButton* m_button5; wxButton* m_button5;
wxRadioBox* m_LayerCtrl; wxRadioBox* m_LayerCtrl;
wxRadioBox* m_OrientCtrl; wxRadioBox* m_OrientCtrl;
wxStaticText* m_staticText4; wxStaticText* m_staticText4;
wxTextCtrl* m_OrientValue; wxTextCtrl* m_OrientValue;
wxStaticText* XPositionStatic; wxStaticText* XPositionStatic;
wxTextCtrl* m_ModPositionX; wxTextCtrl* m_ModPositionX;
wxStaticText* YPositionStatic; wxStaticText* YPositionStatic;
wxTextCtrl* m_ModPositionY; wxTextCtrl* m_ModPositionY;
wxButton* m_buttonExchange; wxButton* m_buttonExchange;
wxButton* m_buttonModuleEditor; wxButton* m_buttonModuleEditor;
wxRadioBox* m_AttributsCtrl; wxRadioBox* m_AttributsCtrl;
wxRadioBox* m_AutoPlaceCtrl; wxRadioBox* m_AutoPlaceCtrl;
wxStaticText* m_staticText11; wxStaticText* m_staticText11;
wxSlider* m_CostRot90Ctrl; wxSlider* m_CostRot90Ctrl;
wxStaticText* m_staticText12; wxStaticText* m_staticText12;
wxSlider* m_CostRot180Ctrl; wxSlider* m_CostRot180Ctrl;
wxStaticText* m_staticText16; wxStaticText* m_staticText16;
wxChoice* m_ZoneConnectionChoice; wxChoice* m_ZoneConnectionChoice;
wxStaticText* m_staticTextInfo; wxStaticText* m_staticTextInfo;
wxStaticText* m_staticTextNetClearance; wxStaticText* m_staticTextNetClearance;
wxTextCtrl* m_NetClearanceValueCtrl; wxTextCtrl* m_NetClearanceValueCtrl;
wxStaticText* m_NetClearanceUnits; wxStaticText* m_NetClearanceUnits;
wxStaticLine* m_staticline1; wxStaticLine* m_staticline1;
wxStaticLine* m_staticline2; wxStaticLine* m_staticline2;
wxStaticLine* m_staticline3; wxStaticLine* m_staticline3;
wxStaticText* m_MaskClearanceTitle; wxStaticText* m_MaskClearanceTitle;
wxTextCtrl* m_SolderMaskMarginCtrl; wxTextCtrl* m_SolderMaskMarginCtrl;
wxStaticText* m_SolderMaskMarginUnits; wxStaticText* m_SolderMaskMarginUnits;
wxStaticText* m_staticTextSolderPaste; wxStaticText* m_staticTextSolderPaste;
wxTextCtrl* m_SolderPasteMarginCtrl; wxTextCtrl* m_SolderPasteMarginCtrl;
wxStaticText* m_SolderPasteMarginUnits; wxStaticText* m_SolderPasteMarginUnits;
wxStaticText* m_staticTextRatio; wxStaticText* m_staticTextRatio;
wxTextCtrl* m_SolderPasteMarginRatioCtrl; wxTextCtrl* m_SolderPasteMarginRatioCtrl;
wxStaticText* m_SolderPasteRatioMarginUnits; wxStaticText* m_SolderPasteRatioMarginUnits;
wxPanel* m_Panel3D; wxPanel* m_Panel3D;
wxStaticText* m_staticText3Dname; wxStaticText* m_staticText3Dname;
wxListBox* m_3D_ShapeNameListBox; wxListBox* m_3D_ShapeNameListBox;
wxButton* m_buttonBrowse; wxButton* m_buttonBrowse;
wxButton* m_buttonAdd; wxButton* m_buttonAdd;
wxButton* m_buttonRemove; wxButton* m_buttonRemove;
wxStdDialogButtonSizer* m_sdbSizerStdButtons; wxStdDialogButtonSizer* m_sdbSizerStdButtons;
wxButton* m_sdbSizerStdButtonsOK; wxButton* m_sdbSizerStdButtonsOK;
wxButton* m_sdbSizerStdButtonsCancel; wxButton* m_sdbSizerStdButtonsCancel;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnEditReference( wxCommandEvent& event ) { event.Skip(); } virtual void OnEditReference( wxCommandEvent& event ) { event.Skip(); }
virtual void OnEditValue( wxCommandEvent& event ) { event.Skip(); } virtual void OnEditValue( wxCommandEvent& event ) { event.Skip(); }
virtual void ModuleOrientEvent( wxCommandEvent& event ) { event.Skip(); } virtual void ModuleOrientEvent( wxCommandEvent& event ) { event.Skip(); }
virtual void ExchangeModule( wxCommandEvent& event ) { event.Skip(); } virtual void ExchangeModule( wxCommandEvent& event ) { event.Skip(); }
virtual void GotoModuleEditor( wxCommandEvent& event ) { event.Skip(); } virtual void GotoModuleEditor( wxCommandEvent& event ) { event.Skip(); }
virtual void On3DShapeNameSelected( wxCommandEvent& event ) { event.Skip(); } virtual void On3DShapeNameSelected( wxCommandEvent& event ) { event.Skip(); }
virtual void Browse3DLib( wxCommandEvent& event ) { event.Skip(); } virtual void Browse3DLib( wxCommandEvent& event ) { event.Skip(); }
virtual void Add3DShape( wxCommandEvent& event ) { event.Skip(); } virtual void Add3DShape( wxCommandEvent& event ) { event.Skip(); }
virtual void Remove3DShape( wxCommandEvent& event ) { event.Skip(); } virtual void Remove3DShape( 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(); }
public: public:
wxStaticBoxSizer* m_Sizer3DValues; wxStaticBoxSizer* m_Sizer3DValues;
DIALOG_MODULE_BOARD_EDITOR_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Module properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 550,800 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); DIALOG_MODULE_BOARD_EDITOR_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Module properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 544,599 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_MODULE_BOARD_EDITOR_BASE(); ~DIALOG_MODULE_BOARD_EDITOR_BASE();
}; };
#endif //__DIALOG_EDIT_MODULE_FOR_BOARDEDITOR_BASE_H__ #endif //__DIALOG_EDIT_MODULE_FOR_BOARDEDITOR_BASE_H__

View File

@ -0,0 +1,277 @@
/**
* @file dialog_keepout_area_properties.cpp
*/
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <wx/wx.h>
#include <fctsys.h>
#include <appl_wxstruct.h>
#include <confirm.h>
#include <pcbnew.h>
#include <wxPcbStruct.h>
#include <zones.h>
#include <base_units.h>
#include <class_zone_settings.h>
#include <class_board.h>
#include <dialog_keepout_area_properties_base.h>
#include <wx/imaglist.h> // needed for wx/listctrl.h, in wxGTK 2.8.12
#include <wx/listctrl.h>
/**
* Class DIALOG_KEEPOUT_AREA_PROPERTIES
* is the derived class from dialog_copper_zone_frame created by wxFormBuilder
*/
class DIALOG_KEEPOUT_AREA_PROPERTIES : public DIALOG_KEEPOUT_AREA_PROPERTIES_BASE
{
public:
DIALOG_KEEPOUT_AREA_PROPERTIES( PCB_BASE_FRAME* aParent, ZONE_SETTINGS* aSettings );
private:
PCB_BASE_FRAME* m_Parent;
wxConfig* m_Config; ///< Current config
ZONE_SETTINGS m_zonesettings;
ZONE_SETTINGS* m_ptr;
std::vector<int> m_LayerId; ///< Handle the real layer number from layer
///< name position in m_LayerSelectionCtrl
/**
* Function initDialog
* fills in the dialog controls using the current settings.
*/
void initDialog();
void OnOkClick( wxCommandEvent& event );
void OnCancelClick( wxCommandEvent& event );
void OnSize( wxSizeEvent& event );
/**
* Function AcceptOptionsForKeepOut
* Test validity of options, and copy options in m_zonesettings, for keepout zones
* @return bool - false if incorrect options, true if ok.
*/
bool AcceptOptionsForKeepOut();
/**
* Function makeLayerBitmap
* creates the colored rectangle bitmaps used in the layer selection widget.
* @param aColor is the color to fill the rectangle with.
*/
wxBitmap makeLayerBitmap( int aColor );
};
#define LAYER_BITMAP_SIZE_X 20
#define LAYER_BITMAP_SIZE_Y 10
ZONE_EDIT_T InvokeKeepoutAreaEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings )
{
DIALOG_KEEPOUT_AREA_PROPERTIES dlg( aCaller, aSettings );
ZONE_EDIT_T result = ZONE_EDIT_T( dlg.ShowModal() );
return result;
}
DIALOG_KEEPOUT_AREA_PROPERTIES::DIALOG_KEEPOUT_AREA_PROPERTIES( PCB_BASE_FRAME* aParent, ZONE_SETTINGS* aSettings ) :
DIALOG_KEEPOUT_AREA_PROPERTIES_BASE( aParent )
{
m_Parent = aParent;
m_Config = wxGetApp().GetSettings();
m_ptr = aSettings;
m_zonesettings = *aSettings;
SetReturnCode( ZONE_ABORT ); // Will be changed on button OK ckick
initDialog();
GetSizer()->SetSizeHints( this );
}
void DIALOG_KEEPOUT_AREA_PROPERTIES::initDialog()
{
BOARD* board = m_Parent->GetBoard();
wxString msg;
if( m_zonesettings.m_Zone_45_Only )
m_OrientEdgesOpt->SetSelection( 1 );
switch( m_zonesettings.m_Zone_HatchingStyle )
{
case CPolyLine::NO_HATCH:
m_OutlineAppearanceCtrl->SetSelection( 0 );
break;
case CPolyLine::DIAGONAL_EDGE:
m_OutlineAppearanceCtrl->SetSelection( 1 );
break;
case CPolyLine::DIAGONAL_FULL:
m_OutlineAppearanceCtrl->SetSelection( 2 );
break;
}
// Create one column in m_LayerSelectionCtrl
wxListItem col0;
col0.SetId( 0 );
m_LayerSelectionCtrl->InsertColumn( 0, col0 );
// Build copper layer list and append to layer widget
int layerCount = board->GetCopperLayerCount();
int layerNumber, itemIndex, layerColor;
wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL );
for( int ii = 0; ii < layerCount; ii++ )
{
layerNumber = LAYER_N_BACK;
if( layerCount <= 1 || ii < layerCount - 1 )
layerNumber = ii;
else if( ii == layerCount - 1 )
layerNumber = LAYER_N_FRONT;
m_LayerId.insert( m_LayerId.begin(), layerNumber );
msg = board->GetLayerName( layerNumber );
layerColor = board->GetLayerColor( layerNumber );
imageList->Add( makeLayerBitmap( layerColor ) );
itemIndex = m_LayerSelectionCtrl->InsertItem( 0, msg, ii );
if( m_zonesettings.m_CurrentZone_Layer == layerNumber )
m_LayerSelectionCtrl->Select( itemIndex );
}
// Init keepout parameters:
m_cbTracksCtrl->SetValue( m_zonesettings.GetDoNotAllowTracks() );
m_cbViasCtrl->SetValue( m_zonesettings.GetDoNotAllowVias() );
m_cbCopperPourCtrl->SetValue( m_zonesettings.GetDoNotAllowCopperPour() );
}
void DIALOG_KEEPOUT_AREA_PROPERTIES::OnCancelClick( wxCommandEvent& event )
{
EndModal( ZONE_ABORT );
}
void DIALOG_KEEPOUT_AREA_PROPERTIES::OnOkClick( wxCommandEvent& event )
{
if( AcceptOptionsForKeepOut() )
{
*m_ptr = m_zonesettings;
EndModal( ZONE_OK );
}
}
void DIALOG_KEEPOUT_AREA_PROPERTIES::OnSize( wxSizeEvent& event )
{
Layout();
// Set layer list column width to widget width minus a few pixels
m_LayerSelectionCtrl->SetColumnWidth( 0, m_LayerSelectionCtrl->GetSize().x - 5 );
event.Skip();
}
bool DIALOG_KEEPOUT_AREA_PROPERTIES::AcceptOptionsForKeepOut()
{
// Init keepout parameters:
m_zonesettings.SetIsKeepout( true );
m_zonesettings.SetDoNotAllowTracks( m_cbTracksCtrl->GetValue() );
m_zonesettings.SetDoNotAllowVias( m_cbViasCtrl->GetValue() );
m_zonesettings.SetDoNotAllowCopperPour( m_cbCopperPourCtrl->GetValue() );
// Test for not allowed items: should have at least one item not allowed:
if( ! m_zonesettings.GetDoNotAllowTracks() &&
! m_zonesettings.GetDoNotAllowVias() &&
! m_zonesettings.GetDoNotAllowCopperPour() )
{
DisplayError( NULL,
_("Tracks, vias and pads are allowed. The keepout is useless" ) );
return false;
}
// Get the layer selection for this zone
int ii = m_LayerSelectionCtrl->GetFirstSelected();
if( ii < 0 )
{
DisplayError( NULL, _( "No layer selected." ) );
return false;
}
m_zonesettings.m_CurrentZone_Layer = m_LayerId[ii];
switch( m_OutlineAppearanceCtrl->GetSelection() )
{
case 0:
m_zonesettings.m_Zone_HatchingStyle = CPolyLine::NO_HATCH;
break;
case 1:
m_zonesettings.m_Zone_HatchingStyle = CPolyLine::DIAGONAL_EDGE;
break;
case 2:
m_zonesettings.m_Zone_HatchingStyle = CPolyLine::DIAGONAL_FULL;
break;
}
if( m_Config )
{
m_Config->Write( ZONE_NET_OUTLINES_HATCH_OPTION_KEY,
(long) m_zonesettings.m_Zone_HatchingStyle );
}
if( m_OrientEdgesOpt->GetSelection() == 0 )
m_zonesettings.m_Zone_45_Only = false;
else
m_zonesettings.m_Zone_45_Only = true;
m_zonesettings.m_ZonePriority = 0; //m_PriorityLevelCtrl->GetValue();
return true;
}
wxBitmap DIALOG_KEEPOUT_AREA_PROPERTIES::makeLayerBitmap( int aColor )
{
wxBitmap bitmap( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
wxBrush brush;
wxMemoryDC iconDC;
iconDC.SelectObject( bitmap );
brush.SetColour( MakeColour( aColor ) );
brush.SetStyle( wxSOLID );
iconDC.SetBrush( brush );
iconDC.DrawRectangle( 0, 0, LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
return bitmap;
}

View File

@ -0,0 +1,103 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 10 2012)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_keepout_area_properties_base.h"
///////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE( DIALOG_KEEPOUT_AREA_PROPERTIES_BASE, DIALOG_SHIM )
EVT_BUTTON( wxID_CANCEL, DIALOG_KEEPOUT_AREA_PROPERTIES_BASE::_wxFB_OnCancelClick )
EVT_BUTTON( wxID_OK, DIALOG_KEEPOUT_AREA_PROPERTIES_BASE::_wxFB_OnOkClick )
END_EVENT_TABLE()
DIALOG_KEEPOUT_AREA_PROPERTIES_BASE::DIALOG_KEEPOUT_AREA_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* m_MainSizer;
m_MainSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* m_UpperSizer;
m_UpperSizer = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer* m_layersListSizer;
m_layersListSizer = new wxBoxSizer( wxVERTICAL );
m_staticTextLayerSelection = new wxStaticText( this, wxID_ANY, _("Layer selection:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextLayerSelection->Wrap( -1 );
m_layersListSizer->Add( m_staticTextLayerSelection, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_LayerSelectionCtrl = new wxListView( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_ALIGN_LEFT|wxLC_ICON|wxLC_NO_HEADER|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_SMALL_ICON );
m_layersListSizer->Add( m_LayerSelectionCtrl, 1, wxALL|wxEXPAND, 5 );
m_UpperSizer->Add( m_layersListSizer, 1, wxEXPAND, 5 );
wxBoxSizer* bSizerRight;
bSizerRight = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* m_OutilinesBoxOpt;
m_OutilinesBoxOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Outlines Options:") ), wxVERTICAL );
wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H, V and 45 deg") };
int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString );
m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone Edges Orient"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS );
m_OrientEdgesOpt->SetSelection( 0 );
m_OutilinesBoxOpt->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") };
int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString );
m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_OutlineAppearanceCtrl->SetSelection( 1 );
m_OutilinesBoxOpt->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
bSizerRight->Add( m_OutilinesBoxOpt, 0, wxEXPAND|wxALL, 5 );
wxStaticBoxSizer* sbSizerCutoutOpts;
sbSizerCutoutOpts = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Keepout Options:") ), wxVERTICAL );
m_cbTracksCtrl = new wxCheckBox( this, wxID_ANY, _("No Tracks"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizerCutoutOpts->Add( m_cbTracksCtrl, 0, wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_cbViasCtrl = new wxCheckBox( this, wxID_ANY, _("No Vias"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizerCutoutOpts->Add( m_cbViasCtrl, 0, wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_cbCopperPourCtrl = new wxCheckBox( this, wxID_ANY, _("No Copper Pour"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizerCutoutOpts->Add( m_cbCopperPourCtrl, 0, wxALL|wxEXPAND, 5 );
bSizerRight->Add( sbSizerCutoutOpts, 0, wxEXPAND|wxALL, 5 );
m_UpperSizer->Add( bSizerRight, 0, wxEXPAND, 5 );
m_MainSizer->Add( m_UpperSizer, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
m_MainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
m_sdbSizerButtons = new wxStdDialogButtonSizer();
m_sdbSizerButtonsOK = new wxButton( this, wxID_OK );
m_sdbSizerButtons->AddButton( m_sdbSizerButtonsOK );
m_sdbSizerButtonsCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizerButtons->AddButton( m_sdbSizerButtonsCancel );
m_sdbSizerButtons->Realize();
m_MainSizer->Add( m_sdbSizerButtons, 0, wxEXPAND, 5 );
this->SetSizer( m_MainSizer );
this->Layout();
this->Centre( wxBOTH );
}
DIALOG_KEEPOUT_AREA_PROPERTIES_BASE::~DIALOG_KEEPOUT_AREA_PROPERTIES_BASE()
{
}

View File

@ -0,0 +1,897 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">table</property>
<property name="file">dialog_keepout_area_properties_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">1</property>
<property name="name">dialog_keepout_areas_properties_base</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">1</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">DIALOG_KEEPOUT_AREA_PROPERTIES_BASE</property>
<property name="pos"></property>
<property name="size">308,355</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title">Keepout Area Properties</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER</property>
<event name="OnActivate"></event>
<event name="OnActivateApp"></event>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnClose"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnHibernate"></event>
<event name="OnIconize"></event>
<event name="OnIdle"></event>
<event name="OnInitDialog"></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 class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">m_MainSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">m_UpperSizer</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">m_layersListSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Layer selection:</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_staticTextLayerSelection</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxListCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_LayerSelectionCtrl</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">wxLC_ALIGN_LEFT|wxLC_ICON|wxLC_NO_HEADER|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_SMALL_ICON</property>
<property name="subclass">wxListView; </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="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="OnListBeginDrag"></event>
<event name="OnListBeginLabelEdit"></event>
<event name="OnListBeginRDrag"></event>
<event name="OnListCacheHint"></event>
<event name="OnListColBeginDrag"></event>
<event name="OnListColClick"></event>
<event name="OnListColDragging"></event>
<event name="OnListColEndDrag"></event>
<event name="OnListColRightClick"></event>
<event name="OnListDeleteAllItems"></event>
<event name="OnListDeleteItem"></event>
<event name="OnListEndLabelEdit"></event>
<event name="OnListInsertItem"></event>
<event name="OnListItemActivated"></event>
<event name="OnListItemDeselected"></event>
<event name="OnListItemFocused"></event>
<event name="OnListItemMiddleClick"></event>
<event name="OnListItemRightClick"></event>
<event name="OnListItemSelected"></event>
<event name="OnListKeyDown"></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 class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizerRight</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property>
<property name="label">Outlines Options:</property>
<property name="minimum_size"></property>
<property name="name">m_OutilinesBoxOpt</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<event name="OnUpdateUI"></event>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxRadioBox" 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="choices">&quot;Any&quot; &quot;H, V and 45 deg&quot;</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">Zone Edges Orient</property>
<property name="majorDimension">1</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_OrientEdgesOpt</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="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxRA_SPECIFY_COLS</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="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="OnRadioBox"></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|wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxRadioBox" 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="choices">&quot;Line&quot; &quot;Hatched Outline&quot; &quot;Full Hatched&quot;</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">Outlines Appearence</property>
<property name="majorDimension">1</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_OutlineAppearanceCtrl</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="selection">1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxRA_SPECIFY_COLS</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="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="OnRadioBox"></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 class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property>
<property name="label">Keepout Options:</property>
<property name="minimum_size"></property>
<property name="name">sbSizerCutoutOpts</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<event name="OnUpdateUI"></event>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxTOP|wxRIGHT|wxLEFT|wxEXPAND</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">No Tracks</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_cbTracksCtrl</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">wxTOP|wxRIGHT|wxLEFT|wxEXPAND</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">No Vias</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_cbViasCtrl</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|wxEXPAND</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">No Copper Pour</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_cbCopperPourCtrl</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>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticLine" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticline1</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">wxLI_HORIZONTAL</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="1">
<property name="Apply">0</property>
<property name="Cancel">1</property>
<property name="ContextHelp">0</property>
<property name="Help">0</property>
<property name="No">0</property>
<property name="OK">1</property>
<property name="Save">0</property>
<property name="Yes">0</property>
<property name="minimum_size"></property>
<property name="name">m_sdbSizerButtons</property>
<property name="permission">protected</property>
<event name="OnApplyButtonClick"></event>
<event name="OnCancelButtonClick">OnCancelClick</event>
<event name="OnContextHelpButtonClick"></event>
<event name="OnHelpButtonClick"></event>
<event name="OnNoButtonClick"></event>
<event name="OnOKButtonClick">OnOkClick</event>
<event name="OnSaveButtonClick"></event>
<event name="OnYesButtonClick"></event>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -0,0 +1,70 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 10 2012)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_KEEPOUT_AREA_PROPERTIES_BASE_H__
#define __DIALOG_KEEPOUT_AREA_PROPERTIES_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
#include "dialog_shim.h"
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/listctrl.h>
#include <wx/sizer.h>
#include <wx/radiobox.h>
#include <wx/statbox.h>
#include <wx/checkbox.h>
#include <wx/statline.h>
#include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_KEEPOUT_AREA_PROPERTIES_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_KEEPOUT_AREA_PROPERTIES_BASE : public DIALOG_SHIM
{
DECLARE_EVENT_TABLE()
private:
// Private event handlers
void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); }
void _wxFB_OnOkClick( wxCommandEvent& event ){ OnOkClick( event ); }
protected:
wxStaticText* m_staticTextLayerSelection;
wxListView* m_LayerSelectionCtrl;
wxRadioBox* m_OrientEdgesOpt;
wxRadioBox* m_OutlineAppearanceCtrl;
wxCheckBox* m_cbTracksCtrl;
wxCheckBox* m_cbViasCtrl;
wxCheckBox* m_cbCopperPourCtrl;
wxStaticLine* m_staticline1;
wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
wxButton* m_sdbSizerButtonsCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_KEEPOUT_AREA_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Keepout Area Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 308,355 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER );
~DIALOG_KEEPOUT_AREA_PROPERTIES_BASE();
};
#endif //__DIALOG_KEEPOUT_AREA_PROPERTIES_BASE_H__

View File

@ -1,96 +1,95 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 11 2012) // C++ code generated with wxFormBuilder (version Apr 10 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "dialog_non_copper_zones_properties_base.h" #include "dialog_non_copper_zones_properties_base.h"
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, DIALOG_SHIM ) BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, DIALOG_SHIM )
EVT_BUTTON( wxID_OK, DialogNonCopperZonesPropertiesBase::_wxFB_OnOkClick ) EVT_BUTTON( wxID_CANCEL, DialogNonCopperZonesPropertiesBase::_wxFB_OnCancelClick )
EVT_BUTTON( wxID_CANCEL, DialogNonCopperZonesPropertiesBase::_wxFB_OnCancelClick ) EVT_BUTTON( wxID_OK, DialogNonCopperZonesPropertiesBase::_wxFB_OnOkClick )
END_EVENT_TABLE() END_EVENT_TABLE()
DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{ {
this->SetSizeHints( wxDefaultSize, wxDefaultSize ); this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* m_MainSizer; wxBoxSizer* m_MainSizer;
m_MainSizer = new wxBoxSizer( wxVERTICAL ); m_MainSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* m_UpperSizer; wxBoxSizer* m_UpperSizer;
m_UpperSizer = new wxBoxSizer( wxHORIZONTAL ); m_UpperSizer = new wxBoxSizer( wxHORIZONTAL );
wxStaticBoxSizer* sbLeftSizer_; wxBoxSizer* bSizerLeft;
sbLeftSizer_ = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Zone Fill Options:") ), wxVERTICAL ); bSizerLeft = new wxBoxSizer( wxVERTICAL );
wxString m_FillModeCtrlChoices[] = { _("Use polygons"), _("Use segments") }; m_staticTextLayerSelection = new wxStaticText( this, wxID_ANY, _("Layer selection:"), wxDefaultPosition, wxDefaultSize, 0 );
int m_FillModeCtrlNChoices = sizeof( m_FillModeCtrlChoices ) / sizeof( wxString ); m_staticTextLayerSelection->Wrap( -1 );
m_FillModeCtrl = new wxRadioBox( this, wxID_ANY, _("Filling Mode:"), wxDefaultPosition, wxDefaultSize, m_FillModeCtrlNChoices, m_FillModeCtrlChoices, 1, wxRA_SPECIFY_COLS ); bSizerLeft->Add( m_staticTextLayerSelection, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_FillModeCtrl->SetSelection( 0 );
sbLeftSizer_->Add( m_FillModeCtrl, 0, wxALL|wxEXPAND, 5 ); m_LayerSelectionCtrl = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizerLeft->Add( m_LayerSelectionCtrl, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_MinThicknessValueTitle = new wxStaticText( this, wxID_ANY, _("Zone min thickness value"), wxDefaultPosition, wxDefaultSize, 0 );
m_MinThicknessValueTitle->Wrap( -1 );
sbLeftSizer_->Add( m_MinThicknessValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_UpperSizer->Add( bSizerLeft, 1, wxEXPAND, 5 );
m_ZoneMinThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); wxBoxSizer* bSizerRight;
sbLeftSizer_->Add( m_ZoneMinThicknessCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); bSizerRight = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* m_OutilinesBoxOpt;
m_UpperSizer->Add( sbLeftSizer_, 0, 0, 5 ); m_OutilinesBoxOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Outlines Options:") ), wxVERTICAL );
wxStaticBoxSizer* m_OutilinesBoxOpt; wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H, V and 45 deg") };
m_OutilinesBoxOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Outlines Options:") ), wxVERTICAL ); int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString );
m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone Edges Orient"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS );
wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H, V and 45 deg") }; m_OrientEdgesOpt->SetSelection( 0 );
int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); m_OutilinesBoxOpt->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone Edges Orient"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS );
m_OrientEdgesOpt->SetSelection( 0 ); wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") };
m_OutilinesBoxOpt->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString );
m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS );
wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") }; m_OutlineAppearanceCtrl->SetSelection( 1 );
int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); m_OutilinesBoxOpt->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_OutlineAppearanceCtrl->SetSelection( 1 );
m_OutilinesBoxOpt->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); bSizerRight->Add( m_OutilinesBoxOpt, 0, wxEXPAND|wxALL, 5 );
m_MinThicknessValueTitle = new wxStaticText( this, wxID_ANY, _("Zone min thickness value"), wxDefaultPosition, wxDefaultSize, 0 );
m_UpperSizer->Add( m_OutilinesBoxOpt, 0, 0, 5 ); m_MinThicknessValueTitle->Wrap( -1 );
bSizerRight->Add( m_MinThicknessValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* m_ButtonsSizer;
m_ButtonsSizer = new wxBoxSizer( wxVERTICAL ); m_ZoneMinThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizerRight->Add( m_ZoneMinThicknessCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonOk->SetDefault();
m_ButtonsSizer->Add( m_buttonOk, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); m_UpperSizer->Add( bSizerRight, 0, wxEXPAND, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
m_ButtonsSizer->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); m_MainSizer->Add( m_UpperSizer, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
m_UpperSizer->Add( m_ButtonsSizer, 1, wxALIGN_CENTER_VERTICAL, 5 ); m_MainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
m_sdbSizerButtons = new wxStdDialogButtonSizer();
m_MainSizer->Add( m_UpperSizer, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); m_sdbSizerButtonsOK = new wxButton( this, wxID_OK );
m_sdbSizerButtons->AddButton( m_sdbSizerButtonsOK );
m_staticTextLayerSelection = new wxStaticText( this, wxID_ANY, _("Layer selection:"), wxDefaultPosition, wxDefaultSize, 0 ); m_sdbSizerButtonsCancel = new wxButton( this, wxID_CANCEL );
m_staticTextLayerSelection->Wrap( -1 ); m_sdbSizerButtons->AddButton( m_sdbSizerButtonsCancel );
m_MainSizer->Add( m_staticTextLayerSelection, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_sdbSizerButtons->Realize();
m_LayerSelectionCtrl = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); m_MainSizer->Add( m_sdbSizerButtons, 0, wxEXPAND, 5 );
m_MainSizer->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
this->SetSizer( m_MainSizer );
this->SetSizer( m_MainSizer ); this->Layout();
this->Layout();
this->Centre( wxBOTH );
this->Centre( wxBOTH ); }
}
DialogNonCopperZonesPropertiesBase::~DialogNonCopperZonesPropertiesBase()
DialogNonCopperZonesPropertiesBase::~DialogNonCopperZonesPropertiesBase() {
{ }
}

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +1,69 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 11 2012) // C++ code generated with wxFormBuilder (version Apr 10 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__ #ifndef __DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__
#define __DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__ #define __DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__
#include <wx/artprov.h> #include <wx/artprov.h>
#include <wx/xrc/xmlres.h> #include <wx/xrc/xmlres.h>
#include <wx/intl.h> #include <wx/intl.h>
#include "dialog_shim.h" #include "dialog_shim.h"
#include <wx/string.h> #include <wx/string.h>
#include <wx/radiobox.h> #include <wx/stattext.h>
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
#include <wx/font.h> #include <wx/font.h>
#include <wx/colour.h> #include <wx/colour.h>
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/stattext.h> #include <wx/listbox.h>
#include <wx/textctrl.h> #include <wx/sizer.h>
#include <wx/sizer.h> #include <wx/radiobox.h>
#include <wx/statbox.h> #include <wx/statbox.h>
#include <wx/button.h> #include <wx/textctrl.h>
#include <wx/listbox.h> #include <wx/statline.h>
#include <wx/dialog.h> #include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DialogNonCopperZonesPropertiesBase ///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////// /// Class DialogNonCopperZonesPropertiesBase
class DialogNonCopperZonesPropertiesBase : public DIALOG_SHIM ///////////////////////////////////////////////////////////////////////////////
{ class DialogNonCopperZonesPropertiesBase : public DIALOG_SHIM
DECLARE_EVENT_TABLE() {
private: DECLARE_EVENT_TABLE()
private:
// Private event handlers
void _wxFB_OnOkClick( wxCommandEvent& event ){ OnOkClick( event ); } // Private event handlers
void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); } void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); }
void _wxFB_OnOkClick( wxCommandEvent& event ){ OnOkClick( event ); }
protected:
wxRadioBox* m_FillModeCtrl; protected:
wxStaticText* m_MinThicknessValueTitle; wxStaticText* m_staticTextLayerSelection;
wxTextCtrl* m_ZoneMinThicknessCtrl; wxListBox* m_LayerSelectionCtrl;
wxRadioBox* m_OrientEdgesOpt; wxRadioBox* m_OrientEdgesOpt;
wxRadioBox* m_OutlineAppearanceCtrl; wxRadioBox* m_OutlineAppearanceCtrl;
wxButton* m_buttonOk; wxStaticText* m_MinThicknessValueTitle;
wxButton* m_buttonCancel; wxTextCtrl* m_ZoneMinThicknessCtrl;
wxStaticText* m_staticTextLayerSelection; wxStaticLine* m_staticline1;
wxListBox* m_LayerSelectionCtrl; wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
// Virtual event handlers, overide them in your derived class wxButton* m_sdbSizerButtonsCancel;
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } // Virtual event handlers, overide them in your derived class
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
public:
DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Non Copper Zones Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 416,287 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER ); public:
~DialogNonCopperZonesPropertiesBase();
DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Non Copper Zones Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 369,317 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER );
}; ~DialogNonCopperZonesPropertiesBase();
#endif //__DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__ };
#endif //__DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__

View File

@ -479,6 +479,7 @@ void DIALOG_PAD_PROPERTIES::initValues()
wxCommandEvent cmd_event; wxCommandEvent cmd_event;
setPadLayersList( m_dummyPad->GetLayerMask() ); setPadLayersList( m_dummyPad->GetLayerMask() );
OnDrillShapeSelected( cmd_event ); OnDrillShapeSelected( cmd_event );
OnPadShapeSelection( cmd_event );
} }

View File

@ -135,27 +135,9 @@ void DIALOG_PCB_TEXT_PROPERTIES::MyInit()
} }
} }
switch( (int) m_SelectedPCBText->GetOrientation() ) wxString orientationStr;
{ orientationStr << m_SelectedPCBText->GetOrientation();
default: m_OrientationCtrl->SetValue( orientationStr );
m_OrientationCtrl->SetSelection( 0 );
break;
case 900:
case -2700:
m_OrientationCtrl->SetSelection( 1 );
break;
case 1800:
case -1800:
m_OrientationCtrl->SetSelection( 2 );
break;
case 2700:
case -900:
m_OrientationCtrl->SetSelection( 3 );
break;
}
if( m_SelectedPCBText->m_Mirror ) if( m_SelectedPCBText->m_Mirror )
m_DisplayCtrl->SetSelection( 1 ); m_DisplayCtrl->SetSelection( 1 );
@ -263,7 +245,10 @@ void DIALOG_PCB_TEXT_PROPERTIES::OnOkClick( wxCommandEvent& event )
m_SelectedPCBText->m_Mirror = (m_DisplayCtrl->GetSelection() == 1) ? true : false; m_SelectedPCBText->m_Mirror = (m_DisplayCtrl->GetSelection() == 1) ? true : false;
// Set the text orientation // Set the text orientation
m_SelectedPCBText->m_Orient = m_OrientationCtrl->GetSelection() * 900; long orientation;
m_OrientationCtrl->GetValue().ToLong( &orientation );
orientation = orientation % 3600;
m_SelectedPCBText->SetOrientation( orientation );
// Set whether the PCB text is slanted (it is not italics, as italics has additional curves in style) // Set whether the PCB text is slanted (it is not italics, as italics has additional curves in style)
m_SelectedPCBText->m_Italic = m_StyleCtrl->GetSelection() ? 1 : 0; m_SelectedPCBText->m_Italic = m_StyleCtrl->GetSelection() ? 1 : 0;

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Mar 19 2012) // C++ code generated with wxFormBuilder (version Apr 11 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -29,121 +29,106 @@ DIALOG_PCB_TEXT_PROPERTIES_BASE::DIALOG_PCB_TEXT_PROPERTIES_BASE( wxWindow* pare
bSizer9->Add( m_TextContentCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); bSizer9->Add( m_TextContentCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxBoxSizer* bSizerLower; wxFlexGridSizer* fgSizer1;
bSizerLower = new wxBoxSizer( wxHORIZONTAL ); fgSizer1 = new wxFlexGridSizer( 6, 4, 0, 0 );
fgSizer1->AddGrowableCol( 0 );
wxBoxSizer* bSizerLeft; fgSizer1->AddGrowableCol( 1 );
bSizerLeft = new wxBoxSizer( wxVERTICAL ); fgSizer1->AddGrowableCol( 2 );
fgSizer1->AddGrowableCol( 3 );
fgSizer1->SetFlexibleDirection( wxBOTH );
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_SizeXLabel = new wxStaticText( this, wxID_ANY, _("Size X"), wxDefaultPosition, wxDefaultSize, 0 ); m_SizeXLabel = new wxStaticText( this, wxID_ANY, _("Size X"), wxDefaultPosition, wxDefaultSize, 0 );
m_SizeXLabel->Wrap( -1 ); m_SizeXLabel->Wrap( -1 );
bSizerLeft->Add( m_SizeXLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); fgSizer1->Add( m_SizeXLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_SizeXCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizerLeft->Add( m_SizeXCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_SizeYLabel = new wxStaticText( this, wxID_ANY, _("Size Y"), wxDefaultPosition, wxDefaultSize, 0 );
m_SizeYLabel->Wrap( -1 );
bSizerLeft->Add( m_SizeYLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_SizeYCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizerLeft->Add( m_SizeYCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_ThicknessLabel = new wxStaticText( this, wxID_ANY, _("Thickness"), wxDefaultPosition, wxDefaultSize, 0 );
m_ThicknessLabel->Wrap( -1 );
bSizerLeft->Add( m_ThicknessLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_ThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizerLeft->Add( m_ThicknessCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
bSizerLower->Add( bSizerLeft, 1, 0, 5 );
wxBoxSizer* bSizerRight;
bSizerRight = new wxBoxSizer( wxVERTICAL );
m_PositionXLabel = new wxStaticText( this, wxID_ANY, _("Position X"), wxDefaultPosition, wxDefaultSize, 0 ); m_PositionXLabel = new wxStaticText( this, wxID_ANY, _("Position X"), wxDefaultPosition, wxDefaultSize, 0 );
m_PositionXLabel->Wrap( -1 ); m_PositionXLabel->Wrap( -1 );
bSizerRight->Add( m_PositionXLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 ); fgSizer1->Add( m_PositionXLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_PositionXCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizerRight->Add( m_PositionXCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_PositionYLabel = new wxStaticText( this, wxID_ANY, _("Position Y"), wxDefaultPosition, wxDefaultSize, 0 );
m_PositionYLabel->Wrap( -1 );
bSizerRight->Add( m_PositionYLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_PositionYCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizerRight->Add( m_PositionYCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_LayerLabel = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 ); m_LayerLabel = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_LayerLabel->Wrap( -1 ); m_LayerLabel->Wrap( -1 );
bSizerRight->Add( m_LayerLabel, 0, wxLEFT|wxRIGHT, 5 ); fgSizer1->Add( m_LayerLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_staticText10 = new wxStaticText( this, wxID_ANY, _("Display:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText10->Wrap( -1 );
fgSizer1->Add( m_staticText10, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_SizeXCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_SizeXCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_PositionXCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_PositionXCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxArrayString m_LayerSelectionCtrlChoices; wxArrayString m_LayerSelectionCtrlChoices;
m_LayerSelectionCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_LayerSelectionCtrlChoices, 0 ); m_LayerSelectionCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_LayerSelectionCtrlChoices, 0 );
m_LayerSelectionCtrl->SetSelection( 0 ); m_LayerSelectionCtrl->SetSelection( 0 );
m_LayerSelectionCtrl->SetToolTip( _("Select the layer on which text should lay.") ); m_LayerSelectionCtrl->SetToolTip( _("Select the layer on which text should lay.") );
bSizerRight->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); fgSizer1->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bSizerLower->Add( bSizerRight, 1, 0, 5 );
wxBoxSizer* bSizer5;
bSizer5 = new wxBoxSizer( wxVERTICAL );
m_staticText8 = new wxStaticText( this, wxID_ANY, _("Orientation:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText8->Wrap( -1 );
bSizer5->Add( m_staticText8, 0, wxLEFT|wxRIGHT, 5 );
wxString m_OrientationCtrlChoices[] = { _("0"), _("90"), _("180"), _("-90") };
int m_OrientationCtrlNChoices = sizeof( m_OrientationCtrlChoices ) / sizeof( wxString );
m_OrientationCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_OrientationCtrlNChoices, m_OrientationCtrlChoices, 0 );
m_OrientationCtrl->SetSelection( 0 );
bSizer5->Add( m_OrientationCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_staticText9 = new wxStaticText( this, wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText9->Wrap( -1 );
bSizer5->Add( m_staticText9, 0, wxLEFT|wxRIGHT, 5 );
wxString m_StyleCtrlChoices[] = { _("Normal"), _("Italic") };
int m_StyleCtrlNChoices = sizeof( m_StyleCtrlChoices ) / sizeof( wxString );
m_StyleCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_StyleCtrlNChoices, m_StyleCtrlChoices, 0 );
m_StyleCtrl->SetSelection( 0 );
bSizer5->Add( m_StyleCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
bSizerLower->Add( bSizer5, 0, wxEXPAND, 5 );
wxBoxSizer* bSizer6;
bSizer6 = new wxBoxSizer( wxVERTICAL );
m_staticText10 = new wxStaticText( this, wxID_ANY, _("Display:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText10->Wrap( -1 );
bSizer6->Add( m_staticText10, 0, wxLEFT|wxRIGHT, 5 );
wxString m_DisplayCtrlChoices[] = { _("Normal"), _("Mirrored") }; wxString m_DisplayCtrlChoices[] = { _("Normal"), _("Mirrored") };
int m_DisplayCtrlNChoices = sizeof( m_DisplayCtrlChoices ) / sizeof( wxString ); int m_DisplayCtrlNChoices = sizeof( m_DisplayCtrlChoices ) / sizeof( wxString );
m_DisplayCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_DisplayCtrlNChoices, m_DisplayCtrlChoices, 0 ); m_DisplayCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_DisplayCtrlNChoices, m_DisplayCtrlChoices, 0 );
m_DisplayCtrl->SetSelection( 0 ); m_DisplayCtrl->SetSelection( 0 );
bSizer6->Add( m_DisplayCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); fgSizer1->Add( m_DisplayCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_SizeYLabel = new wxStaticText( this, wxID_ANY, _("Size Y"), wxDefaultPosition, wxDefaultSize, 0 );
m_SizeYLabel->Wrap( -1 );
fgSizer1->Add( m_SizeYLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_PositionYLabel = new wxStaticText( this, wxID_ANY, _("Position Y"), wxDefaultPosition, wxDefaultSize, 0 );
m_PositionYLabel->Wrap( -1 );
fgSizer1->Add( m_PositionYLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_staticText9 = new wxStaticText( this, wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText9->Wrap( -1 );
fgSizer1->Add( m_staticText9, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_staticText11 = new wxStaticText( this, wxID_ANY, _("Justification:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText11 = new wxStaticText( this, wxID_ANY, _("Justification:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText11->Wrap( -1 ); m_staticText11->Wrap( -1 );
bSizer6->Add( m_staticText11, 0, wxLEFT|wxRIGHT, 5 ); fgSizer1->Add( m_staticText11, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_SizeYCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_SizeYCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_PositionYCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_PositionYCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxString m_StyleCtrlChoices[] = { _("Normal"), _("Italic") };
int m_StyleCtrlNChoices = sizeof( m_StyleCtrlChoices ) / sizeof( wxString );
m_StyleCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_StyleCtrlNChoices, m_StyleCtrlChoices, 0 );
m_StyleCtrl->SetSelection( 0 );
fgSizer1->Add( m_StyleCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
wxString m_justifyChoiceChoices[] = { _("Left"), _("Center"), _("Right") }; wxString m_justifyChoiceChoices[] = { _("Left"), _("Center"), _("Right") };
int m_justifyChoiceNChoices = sizeof( m_justifyChoiceChoices ) / sizeof( wxString ); int m_justifyChoiceNChoices = sizeof( m_justifyChoiceChoices ) / sizeof( wxString );
m_justifyChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_justifyChoiceNChoices, m_justifyChoiceChoices, 0 ); m_justifyChoice = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_justifyChoiceNChoices, m_justifyChoiceChoices, 0 );
m_justifyChoice->SetSelection( 0 ); m_justifyChoice->SetSelection( 0 );
bSizer6->Add( m_justifyChoice, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); fgSizer1->Add( m_justifyChoice, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_ThicknessLabel = new wxStaticText( this, wxID_ANY, _("Thickness"), wxDefaultPosition, wxDefaultSize, 0 );
m_ThicknessLabel->Wrap( -1 );
fgSizer1->Add( m_ThicknessLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
m_orientationLabel = new wxStaticText( this, wxID_ANY, _("Orientation (0.1 deg):"), wxDefaultPosition, wxDefaultSize, 0 );
m_orientationLabel->Wrap( -1 );
fgSizer1->Add( m_orientationLabel, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
bSizerLower->Add( bSizer6, 0, wxEXPAND, 5 ); fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 );
bSizer9->Add( bSizerLower, 0, wxEXPAND, 5 ); fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 );
m_ThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_ThicknessCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
m_OrientationCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_OrientationCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bSizer9->Add( fgSizer1, 1, wxEXPAND, 5 );
m_StandardSizer = new wxStdDialogButtonSizer(); m_StandardSizer = new wxStdDialogButtonSizer();
m_StandardSizerOK = new wxButton( this, wxID_OK ); m_StandardSizerOK = new wxButton( this, wxID_OK );

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Mar 19 2012) // C++ code generated with wxFormBuilder (version Apr 11 2012)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO "NOT" EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
@ -19,8 +19,8 @@
#include <wx/colour.h> #include <wx/colour.h>
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/textctrl.h> #include <wx/textctrl.h>
#include <wx/sizer.h>
#include <wx/choice.h> #include <wx/choice.h>
#include <wx/sizer.h>
#include <wx/button.h> #include <wx/button.h>
#include <wx/dialog.h> #include <wx/dialog.h>
@ -38,25 +38,25 @@ class DIALOG_PCB_TEXT_PROPERTIES_BASE : public DIALOG_SHIM
wxStaticText* m_TextLabel; wxStaticText* m_TextLabel;
wxTextCtrl* m_TextContentCtrl; wxTextCtrl* m_TextContentCtrl;
wxStaticText* m_SizeXLabel; wxStaticText* m_SizeXLabel;
wxTextCtrl* m_SizeXCtrl;
wxStaticText* m_SizeYLabel;
wxTextCtrl* m_SizeYCtrl;
wxStaticText* m_ThicknessLabel;
wxTextCtrl* m_ThicknessCtrl;
wxStaticText* m_PositionXLabel; wxStaticText* m_PositionXLabel;
wxTextCtrl* m_PositionXCtrl;
wxStaticText* m_PositionYLabel;
wxTextCtrl* m_PositionYCtrl;
wxStaticText* m_LayerLabel; wxStaticText* m_LayerLabel;
wxChoice* m_LayerSelectionCtrl;
wxStaticText* m_staticText8;
wxChoice* m_OrientationCtrl;
wxStaticText* m_staticText9;
wxChoice* m_StyleCtrl;
wxStaticText* m_staticText10; wxStaticText* m_staticText10;
wxTextCtrl* m_SizeXCtrl;
wxTextCtrl* m_PositionXCtrl;
wxChoice* m_LayerSelectionCtrl;
wxChoice* m_DisplayCtrl; wxChoice* m_DisplayCtrl;
wxStaticText* m_SizeYLabel;
wxStaticText* m_PositionYLabel;
wxStaticText* m_staticText9;
wxStaticText* m_staticText11; wxStaticText* m_staticText11;
wxTextCtrl* m_SizeYCtrl;
wxTextCtrl* m_PositionYCtrl;
wxChoice* m_StyleCtrl;
wxChoice* m_justifyChoice; wxChoice* m_justifyChoice;
wxStaticText* m_ThicknessLabel;
wxStaticText* m_orientationLabel;
wxTextCtrl* m_ThicknessCtrl;
wxTextCtrl* m_OrientationCtrl;
wxStdDialogButtonSizer* m_StandardSizer; wxStdDialogButtonSizer* m_StandardSizer;
wxButton* m_StandardSizerOK; wxButton* m_StandardSizerOK;
wxButton* m_StandardSizerCancel; wxButton* m_StandardSizerCancel;
@ -69,7 +69,7 @@ class DIALOG_PCB_TEXT_PROPERTIES_BASE : public DIALOG_SHIM
public: public:
DIALOG_PCB_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Text Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 433,465 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU ); DIALOG_PCB_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Text Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 433,450 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU );
~DIALOG_PCB_TEXT_PROPERTIES_BASE(); ~DIALOG_PCB_TEXT_PROPERTIES_BASE();
}; };

View File

@ -136,6 +136,14 @@ int DRC::Drc( TRACK* aRefSegm, TRACK* aList )
return BAD_DRC; return BAD_DRC;
} }
if( !doTrackKeepoutDrc( aRefSegm ) )
{
wxASSERT( m_currentMarker );
m_currentMarker->DisplayInfo( m_mainWindow );
return BAD_DRC;
}
return OK_DRC; return OK_DRC;
} }
@ -252,6 +260,18 @@ void DRC::RunTests( wxTextCtrl* aMessages )
testUnconnected(); testUnconnected();
} }
// find and gather vias, tracks, pads inside keepout areas.
if( m_doKeepoutTest )
{
if( aMessages )
{
aMessages->AppendText( _( "Keepout areas ...\n" ) );
aMessages->Refresh();
}
testKeepoutAreas();
}
// update the m_ui listboxes // update the m_ui listboxes
updatePointers(); updatePointers();
@ -556,6 +576,107 @@ void DRC::testZones()
} }
void DRC::testKeepoutAreas()
{
// Test keepout areas for vias, tracks and pads inside keepout areas
for( int ii = 0; ii < m_pcb->GetAreaCount(); ii++ )
{
ZONE_CONTAINER* area = m_pcb->GetArea( ii );
if( !area->GetIsKeepout() )
continue;
for( TRACK* segm = m_pcb->m_Track; segm != NULL; segm = segm->Next() )
{
if( segm->Type() == PCB_TRACE_T )
{
if( ! area->GetDoNotAllowTracks() )
continue;
if( segm->GetLayer() != area->GetLayer() )
continue;
if( area->m_Poly->Distance( segm->GetStart(), segm->GetEnd(), segm->GetWidth() ) == 0 )
{
m_currentMarker = fillMarker( segm, NULL,
DRCE_TRACK_INSIDE_KEEPOUT, m_currentMarker );
m_pcb->Add( m_currentMarker );
m_currentMarker = 0;
}
}
else if( segm->Type() == PCB_VIA_T )
{
if( ! area->GetDoNotAllowVias() )
continue;
if( ! ((SEGVIA*)segm)->IsOnLayer( area->GetLayer() ) )
continue;
if( area->m_Poly->Distance( segm->GetPosition() ) < segm->GetWidth()/2 )
{
m_currentMarker = fillMarker( segm, NULL,
DRCE_VIA_INSIDE_KEEPOUT, m_currentMarker );
m_pcb->Add( m_currentMarker );
m_currentMarker = 0;
}
}
}
// Test pads: TODO
}
}
/*
* Function doTrackKeepoutDrc
* tests the current segment or via.
* aRefSeg is the segment to test
* return true if no DRC err
*/
bool DRC::doTrackKeepoutDrc( TRACK* aRefSeg )
{
// Test keepout areas for vias, tracks and pads inside keepout areas
for( int ii = 0; ii < m_pcb->GetAreaCount(); ii++ )
{
ZONE_CONTAINER* area = m_pcb->GetArea( ii );
if( !area->GetIsKeepout() )
continue;
if( aRefSeg->Type() == PCB_TRACE_T )
{
if( ! area->GetDoNotAllowTracks() )
continue;
if( aRefSeg->GetLayer() != area->GetLayer() )
continue;
if( area->m_Poly->Distance( aRefSeg->GetStart(), aRefSeg->GetEnd(), aRefSeg->GetWidth() ) == 0 )
{
m_currentMarker = fillMarker( aRefSeg, NULL,
DRCE_TRACK_INSIDE_KEEPOUT, m_currentMarker );
return false;
}
}
else if( aRefSeg->Type() == PCB_VIA_T )
{
if( ! area->GetDoNotAllowVias() )
continue;
if( ! ((SEGVIA*)aRefSeg)->IsOnLayer( area->GetLayer() ) )
continue;
if( area->m_Poly->Distance( aRefSeg->GetPosition() ) < aRefSeg->GetWidth()/2 )
{
m_currentMarker = fillMarker( aRefSeg, NULL,
DRCE_VIA_INSIDE_KEEPOUT, m_currentMarker );
return false;
}
}
}
return true;
}
bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_limit ) bool DRC::doPadToPadsDrc( D_PAD* aRefPad, D_PAD** aStart, D_PAD** aEnd, int x_limit )
{ {
int layerMask = aRefPad->GetLayerMask() & ALL_CU_LAYERS; int layerMask = aRefPad->GetLayerMask() & ALL_CU_LAYERS;

View File

@ -32,7 +32,6 @@
#include <vector> #include <vector>
#define OK_DRC 0 #define OK_DRC 0
#define BAD_DRC 1 #define BAD_DRC 1
@ -73,6 +72,9 @@
#define DRCE_NETCLASS_VIADRILLSIZE 33 ///< netclass has ViaDrillSize < board.m_designSettings->m_ViasMinDrill #define DRCE_NETCLASS_VIADRILLSIZE 33 ///< netclass has ViaDrillSize < board.m_designSettings->m_ViasMinDrill
#define DRCE_NETCLASS_uVIASIZE 34 ///< netclass has ViaSize < board.m_designSettings->m_MicroViasMinSize #define DRCE_NETCLASS_uVIASIZE 34 ///< netclass has ViaSize < board.m_designSettings->m_MicroViasMinSize
#define DRCE_NETCLASS_uVIADRILLSIZE 35 ///< netclass has ViaSize < board.m_designSettings->m_MicroViasMinDrill #define DRCE_NETCLASS_uVIADRILLSIZE 35 ///< netclass has ViaSize < board.m_designSettings->m_MicroViasMinDrill
#define DRCE_VIA_INSIDE_KEEPOUT 36 ///< Via in inside a keepout area
#define DRCE_TRACK_INSIDE_KEEPOUT 37 ///< Track in inside a keepout area
#define DRCE_PAD_INSIDE_KEEPOUT 38 ///< Pad in inside a keepout area
class EDA_DRAW_PANEL; class EDA_DRAW_PANEL;
@ -155,15 +157,14 @@ private:
bool m_doPad2PadTest; bool m_doPad2PadTest;
bool m_doUnconnectedTest; bool m_doUnconnectedTest;
bool m_doZonesTest; bool m_doZonesTest;
bool m_doKeepoutTest;
bool m_doCreateRptFile; bool m_doCreateRptFile;
wxString m_rptFilename; wxString m_rptFilename;
// int m_errorCount;
MARKER_PCB* m_currentMarker; MARKER_PCB* m_currentMarker;
bool m_aboartDRC; bool m_abortDRC;
bool m_drcInProgress; bool m_drcInProgress;
/* In DRC functions, many calculations are using coordinates relative /* In DRC functions, many calculations are using coordinates relative
@ -182,7 +183,7 @@ private:
int m_segmLength; // length of the reference segment int m_segmLength; // length of the reference segment
/* variables used in checkLine to test DRC segm to segm: /* variables used in checkLine to test DRC segm to segm:
* define the area relative to the ref segment that does not contains anu other segment * define the area relative to the ref segment that does not contains any other segment
*/ */
int m_xcliplo; int m_xcliplo;
int m_ycliplo; int m_ycliplo;
@ -278,6 +279,7 @@ private:
void testZones(); void testZones();
void testKeepoutAreas();
//-----<single "item" tests>----------------------------------------- //-----<single "item" tests>-----------------------------------------
@ -305,6 +307,15 @@ private:
*/ */
bool doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool doPads = true ); bool doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool doPads = true );
/**
* Function doTrackKeepoutDrc
* tests the current segment or via.
* @param aRefSeg The segment to test
* @return bool - true if no poblems, else false and m_currentMarker is
* filled in with the problem information.
*/
bool doTrackKeepoutDrc( TRACK* aRefSeg );
/** /**
* Function doEdgeZoneDrc * Function doEdgeZoneDrc
@ -412,7 +423,10 @@ public:
{ {
updatePointers(); updatePointers();
return doTrackDrc( aRefSeg, aList ) ? OK_DRC : BAD_DRC; if( ! doTrackDrc( aRefSeg, aList ) )
return BAD_DRC;
return doTrackKeepoutDrc( aRefSeg ) ? OK_DRC : BAD_DRC;
} }
@ -443,11 +457,13 @@ public:
* @param aSaveReport A boolean telling whether to generate disk file report. * @param aSaveReport A boolean telling whether to generate disk file report.
*/ */
void SetSettings( bool aPad2PadTest, bool aUnconnectedTest, void SetSettings( bool aPad2PadTest, bool aUnconnectedTest,
bool aZonesTest, const wxString& aReportName, bool aSaveReport ) bool aZonesTest, bool aKeepoutTest,
const wxString& aReportName, bool aSaveReport )
{ {
m_doPad2PadTest = aPad2PadTest; m_doPad2PadTest = aPad2PadTest;
m_doUnconnectedTest = aUnconnectedTest; m_doUnconnectedTest = aUnconnectedTest;
m_doZonesTest = aZonesTest; m_doZonesTest = aZonesTest;
m_doKeepoutTest = aKeepoutTest;
m_rptFilename = aReportName; m_rptFilename = aReportName;
m_doCreateRptFile = aSaveReport; m_doCreateRptFile = aSaveReport;
} }

View File

@ -48,6 +48,7 @@
#include <class_module.h> #include <class_module.h>
#include <class_track.h> #include <class_track.h>
#include <class_zone.h> #include <class_zone.h>
#include <class_pcb_text.h>
#include <modview_frame.h> #include <modview_frame.h>
#include <class_pcb_layer_box_selector.h> #include <class_pcb_layer_box_selector.h>
@ -83,6 +84,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
case ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR: case ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR:
case ID_POPUP_PCB_ROTATE_TEXTEPCB: case ID_POPUP_PCB_ROTATE_TEXTEPCB:
case ID_POPUP_PCB_FLIP_TEXTEPCB: case ID_POPUP_PCB_FLIP_TEXTEPCB:
case ID_POPUP_PCB_COPY_TEXTEPCB:
case ID_POPUP_PCB_EDIT_TEXTEPCB: case ID_POPUP_PCB_EDIT_TEXTEPCB:
case ID_POPUP_PCB_EDIT_MIRE: case ID_POPUP_PCB_EDIT_MIRE:
case ID_POPUP_PCB_ROTATE_TEXTMODULE: case ID_POPUP_PCB_ROTATE_TEXTMODULE:
@ -939,6 +941,12 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
m_canvas->MoveCursorToCrossHair(); m_canvas->MoveCursorToCrossHair();
break; break;
case ID_POPUP_PCB_COPY_TEXTEPCB:
CreateTextePcb( &dc, (TEXTE_PCB*) GetCurItem() );
m_canvas->MoveCursorToCrossHair();
m_canvas->SetAutoPanRequest( true );
break;
case ID_POPUP_PCB_FLIP_TEXTEPCB: case ID_POPUP_PCB_FLIP_TEXTEPCB:
FlipTextePcb( (TEXTE_PCB*) GetCurItem(), &dc ); FlipTextePcb( (TEXTE_PCB*) GetCurItem(), &dc );
m_canvas->MoveCursorToCrossHair(); m_canvas->MoveCursorToCrossHair();
@ -1335,6 +1343,10 @@ void PCB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
break; break;
case ID_PCB_KEEPOUT_AREA_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add keepout" ) );
break;
case ID_PCB_MIRE_BUTT: case ID_PCB_MIRE_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add layer alignment target" ) ); SetToolID( id, wxCURSOR_PENCIL, _( "Add layer alignment target" ) );
break; break;

View File

@ -76,7 +76,7 @@ void Abort_Edit_Pcb_Text( EDA_DRAW_PANEL* Panel, wxDC* DC )
} }
SwapData(TextePcb, &s_TextCopy); SwapData( TextePcb, &s_TextCopy );
TextePcb->ClearFlags(); TextePcb->ClearFlags();
TextePcb->Draw( Panel, DC, GR_OR ); TextePcb->Draw( Panel, DC, GR_OR );
} }
@ -110,10 +110,10 @@ void PCB_EDIT_FRAME::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
else else
{ {
// Restore initial params // Restore initial params
SwapData( TextePcb, &s_TextCopy); SwapData( TextePcb, &s_TextCopy );
// Prepare undo command // Prepare undo command
SaveCopyInUndoList( TextePcb, UR_CHANGED ); SaveCopyInUndoList( TextePcb, UR_CHANGED );
SwapData( TextePcb, &s_TextCopy); SwapData( TextePcb, &s_TextCopy );
// Restore current params // Restore current params
} }
@ -121,27 +121,24 @@ void PCB_EDIT_FRAME::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
} }
/* Initialize parameters to move a pcb text void PCB_EDIT_FRAME::StartMoveTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC, bool aErase )
*/
void PCB_EDIT_FRAME::StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
{ {
if( TextePcb == NULL ) if( aTextePcb == NULL )
return; return;
// if it is an existing item: prepare a copy to undo/abort command // if it is an existing item: prepare a copy to undo/abort command
if( !TextePcb->IsNew() ) if( !aTextePcb->IsNew() )
s_TextCopy.Copy( TextePcb ); s_TextCopy.Copy( aTextePcb );
TextePcb->Draw( m_canvas, DC, GR_XOR ); aTextePcb->SetFlags( IS_MOVED );
TextePcb->SetFlags( IS_MOVED ); aTextePcb->DisplayInfo( this );
TextePcb->DisplayInfo( this );
GetScreen()->SetCrossHairPosition( TextePcb->GetPosition() ); GetScreen()->SetCrossHairPosition( aTextePcb->GetPosition() );
m_canvas->MoveCursorToCrossHair(); m_canvas->MoveCursorToCrossHair();
m_canvas->SetMouseCapture( Move_Texte_Pcb, Abort_Edit_Pcb_Text ); m_canvas->SetMouseCapture( Move_Texte_Pcb, Abort_Edit_Pcb_Text );
SetCurItem( TextePcb ); SetCurItem( aTextePcb );
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->CallMouseCapture( aDC, wxDefaultPosition, aErase );
} }
@ -157,7 +154,7 @@ static void Move_Texte_Pcb( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aP
if( aErase ) if( aErase )
TextePcb->Draw( aPanel, aDC, GR_XOR ); TextePcb->Draw( aPanel, aDC, GR_XOR );
TextePcb->m_Pos = aPanel->GetScreen()->GetCrossHairPosition(); TextePcb->SetPosition( aPanel->GetScreen()->GetCrossHairPosition() );
TextePcb->Draw( aPanel, aDC, GR_XOR ); TextePcb->Draw( aPanel, aDC, GR_XOR );
} }
@ -177,40 +174,46 @@ void PCB_EDIT_FRAME::Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
} }
TEXTE_PCB* PCB_EDIT_FRAME::Create_Texte_Pcb( wxDC* DC ) TEXTE_PCB* PCB_EDIT_FRAME::CreateTextePcb( wxDC* aDC, TEXTE_PCB* aText )
{ {
TEXTE_PCB* TextePcb; TEXTE_PCB* textePcb = new TEXTE_PCB( GetBoard() );
TextePcb = new TEXTE_PCB( GetBoard() ); if( aText )
/* Add text to the board item list. */
GetBoard()->Add( TextePcb );
/* Update text properties. */
TextePcb->SetFlags( IS_NEW );
TextePcb->SetLayer( ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer );
TextePcb->m_Mirror = false;
if( TextePcb->GetLayer() == LAYER_N_BACK )
TextePcb->m_Mirror = true;
TextePcb->m_Size = GetBoard()->GetDesignSettings().m_PcbTextSize;
TextePcb->m_Pos = GetScreen()->GetCrossHairPosition();
TextePcb->m_Thickness = GetBoard()->GetDesignSettings().m_PcbTextWidth;
InstallTextPCBOptionsFrame( TextePcb, DC );
if( TextePcb->m_Text.IsEmpty() )
{ {
TextePcb->DeleteStructure(); textePcb->Copy( aText );
TextePcb = NULL; GetBoard()->Add( textePcb );
textePcb->SetFlags( IS_NEW );
StartMoveTextePcb( textePcb, aDC, false ); // Don't erase aText when copying
} }
else else
{ {
StartMoveTextePcb( TextePcb, DC ); GetBoard()->Add( textePcb );
textePcb->SetFlags( IS_NEW );
int layer = ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer;
textePcb->SetLayer( layer );
if( layer == LAYER_N_BACK
|| layer == SILKSCREEN_N_BACK )
textePcb->SetMirrored( true );
textePcb->SetSize( GetBoard()->GetDesignSettings().m_PcbTextSize );
textePcb->SetPosition( GetScreen()->GetCrossHairPosition() );
textePcb->SetThickness( GetBoard()->GetDesignSettings().m_PcbTextWidth );
InstallTextPCBOptionsFrame( textePcb, aDC );
if( textePcb->GetText().IsEmpty() )
{
textePcb->DeleteStructure();
textePcb = NULL;
}
else
{
StartMoveTextePcb( textePcb, aDC );
}
} }
return TextePcb; return textePcb;
} }

View File

@ -424,17 +424,39 @@ void EXCELLON_WRITER::WriteCoordinates( char* aLine, double aCoordX, double aCoo
int xpad = m_precision.m_lhs + m_precision.m_rhs; int xpad = m_precision.m_lhs + m_precision.m_rhs;
int ypad = xpad; int ypad = xpad;
/* I need to come up with an algorithm that handles any lhs:rhs format.*/
/* one idea is to take more inputs for xpad/ypad when metric is used. */
switch( DIALOG_GENDRILL::m_ZerosFormat ) switch( DIALOG_GENDRILL::m_ZerosFormat )
{ {
default: default:
case DECIMAL_FORMAT: case DECIMAL_FORMAT:
sprintf( aLine, "X%.3fY%.3f\n", aCoordX, aCoordY ); /* In Excellon files, resolution is 1/1000 mm or 1/10000 inch (0.1 mil)
* Although in decimal format, Excellon specifications do not specify
* clearly the resolution. However it seems to be 1/1000mm or 0.1 mil
* like in non decimal formats, so we trunk coordinates to 3 or 4 digits in mantissa
* Decimal format just prohibit useless leading 0:
* 0.45 or .45 is right, but 00.54 is incorrect.
*/
if( m_unitsDecimal )
{
// resolution is 1/1000 mm
xs.Printf( wxT( "%.3f" ), aCoordX );
ys.Printf( wxT( "%.3f" ), aCoordY );
}
else
{
// resolution is 1/10000 inch
xs.Printf( wxT( "%.4f" ), aCoordX );
ys.Printf( wxT( "%.4f" ), aCoordY );
}
//Remove useless trailing 0
while( xs.Last() == '0' )
xs.RemoveLast();
while( ys.Last() == '0' )
ys.RemoveLast();
sprintf( aLine, "X%sY%s\n", TO_UTF8( xs ), TO_UTF8( ys ) );
break; break;
case SUPPRESS_LEADING: /* that should work now */ case SUPPRESS_LEADING:
for( int i = 0; i< m_precision.m_rhs; i++ ) for( int i = 0; i< m_precision.m_rhs; i++ )
{ {
aCoordX *= 10; aCoordY *= 10; aCoordX *= 10; aCoordY *= 10;

View File

@ -399,6 +399,7 @@ bool MODULE::Read_GPCB_Descr( const wxString& CmpFullFileName )
// format: Pad [x1 y1 x2 y2 thickness clearance mask "name" "pad_number" flags] // format: Pad [x1 y1 x2 y2 thickness clearance mask "name" "pad_number" flags]
pad = new D_PAD( this ); pad = new D_PAD( this );
pad->SetShape( PAD_RECT ); pad->SetShape( PAD_RECT );
pad->SetAttribute( PAD_SMD );
pad->SetLayerMask( LAYER_FRONT | SOLDERMASK_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT ); pad->SetLayerMask( LAYER_FRONT | SOLDERMASK_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT );
// Set shape from flags // Set shape from flags

View File

@ -70,6 +70,7 @@ static EDA_HOTKEY HkEditBoardItem( wxT( "Edit Item" ), HK_EDIT_ITEM, 'E' );
static EDA_HOTKEY HkFlipItem( wxT( "Flip Item" ), HK_FLIP_ITEM, 'F' ); static EDA_HOTKEY HkFlipItem( wxT( "Flip Item" ), HK_FLIP_ITEM, 'F' );
static EDA_HOTKEY HkRotateItem( wxT( "Rotate Item" ), HK_ROTATE_ITEM, 'R' ); static EDA_HOTKEY HkRotateItem( wxT( "Rotate Item" ), HK_ROTATE_ITEM, 'R' );
static EDA_HOTKEY HkMoveItem( wxT( "Move Item" ), HK_MOVE_ITEM, 'M' ); static EDA_HOTKEY HkMoveItem( wxT( "Move Item" ), HK_MOVE_ITEM, 'M' );
static EDA_HOTKEY HkCopyItem( wxT( "Copy Item" ), HK_COPY_ITEM, 'C' );
static EDA_HOTKEY HkDragFootprint( wxT( "Drag Footprint" ), HK_DRAG_ITEM, 'G' ); static EDA_HOTKEY HkDragFootprint( wxT( "Drag Footprint" ), HK_DRAG_ITEM, 'G' );
static EDA_HOTKEY HkGetAndMoveFootprint( wxT( "Get and Move Footprint" ), static EDA_HOTKEY HkGetAndMoveFootprint( wxT( "Get and Move Footprint" ),
HK_GET_AND_MOVE_FOOTPRINT, 'T' ); HK_GET_AND_MOVE_FOOTPRINT, 'T' );
@ -209,7 +210,7 @@ EDA_HOTKEY* board_edit_Hotkey_List[] =
&HkAddNewTrack, &HkAddVia, &HkAddMicroVia, &HkAddNewTrack, &HkAddVia, &HkAddMicroVia,
&HkSwitchTrackPosture, &HkSwitchTrackPosture,
&HkDragTrackKeepSlope, &HkDragTrackKeepSlope,
&HkPlaceItem, &HkPlaceItem, &HkCopyItem,
&HkEndTrack, &HkMoveItem, &HkFlipItem, &HkEndTrack, &HkMoveItem, &HkFlipItem,
&HkRotateItem, &HkDragFootprint, &HkRotateItem, &HkDragFootprint,
&HkGetAndMoveFootprint, &HkLock_Unlock_Footprint, &HkSavefile, &HkGetAndMoveFootprint, &HkLock_Unlock_Footprint, &HkSavefile,

View File

@ -15,6 +15,7 @@ enum hotkey_id_commnand {
HK_BACK_SPACE, HK_BACK_SPACE,
HK_ROTATE_ITEM, HK_ROTATE_ITEM,
HK_FLIP_ITEM, HK_FLIP_ITEM,
HK_COPY_ITEM,
HK_MOVE_ITEM, HK_MOVE_ITEM,
HK_DRAG_ITEM, HK_DRAG_ITEM,
HK_GET_AND_MOVE_FOOTPRINT, HK_GET_AND_MOVE_FOOTPRINT,

View File

@ -620,6 +620,10 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
OnHotkeyMoveItem( HK_MOVE_ITEM ); OnHotkeyMoveItem( HK_MOVE_ITEM );
break; break;
case HK_COPY_ITEM:
evt_type = OnHotkeyCopyItem();
break;
case HK_ROTATE_ITEM: // Rotation case HK_ROTATE_ITEM: // Rotation
OnHotkeyRotateItem( HK_ROTATE_ITEM ); OnHotkeyRotateItem( HK_ROTATE_ITEM );
break; break;
@ -631,7 +635,7 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
case HK_SWITCH_HIGHCONTRAST_MODE: // switch to high contrast mode and refresh the canvas case HK_SWITCH_HIGHCONTRAST_MODE: // switch to high contrast mode and refresh the canvas
DisplayOpt.ContrastModeDisplay = !DisplayOpt.ContrastModeDisplay; DisplayOpt.ContrastModeDisplay = !DisplayOpt.ContrastModeDisplay;
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
} }
if( evt_type != 0 ) if( evt_type != 0 )
@ -715,6 +719,7 @@ bool PCB_EDIT_FRAME::OnHotkeyDeleteItem( wxDC* aDC )
return true; return true;
} }
bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand ) bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand )
{ {
BOARD_ITEM* item = GetCurItem(); BOARD_ITEM* item = GetCurItem();
@ -810,6 +815,37 @@ bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand )
} }
int PCB_EDIT_FRAME::OnHotkeyCopyItem()
{
BOARD_ITEM* item = GetCurItem();
bool itemCurrentlyEdited = item && item->GetFlags();
if( itemCurrentlyEdited )
return 0;
item = PcbGeneralLocateAndDisplay();
if( item == NULL )
return 0;
SetCurItem( item );
int eventId = 0;
switch( item->Type() )
{
case PCB_TEXT_T:
eventId = ID_POPUP_PCB_COPY_TEXTEPCB;
break;
default:
eventId = 0;
break;
}
return eventId;
}
bool PCB_EDIT_FRAME::OnHotkeyMoveItem( int aIdCommand ) bool PCB_EDIT_FRAME::OnHotkeyMoveItem( int aIdCommand )
{ {
BOARD_ITEM* item = GetCurItem(); BOARD_ITEM* item = GetCurItem();

View File

@ -134,11 +134,7 @@ void PCB_IO::Format( BOARD_ITEM* aItem, int aNestLevel ) const
void PCB_IO::formatLayer( const BOARD_ITEM* aItem ) const void PCB_IO::formatLayer( const BOARD_ITEM* aItem ) const
{ {
#if 1
m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() ); m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
#else
m_out->Print( 0, " (layer %d)", aItem->GetLayer() );
#endif
} }
@ -181,18 +177,12 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
{ {
if( mask & aBoard->GetEnabledLayers() ) if( mask & aBoard->GetEnabledLayers() )
{ {
#if USE_LAYER_NAMES
m_out->Print( aNestLevel+1, "(%d %s %s", layer, m_out->Print( aNestLevel+1, "(%d %s %s", layer,
m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(), m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
LAYER::ShowType( aBoard->GetLayerType( layer ) ) ); LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
#else
m_out->Print( aNestLevel+1, "(%d %s %s", layer,
m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
#endif
if( !( aBoard->GetVisibleLayers() & mask ) ) if( !( aBoard->GetVisibleLayers() & mask ) )
m_out->Print( 0, "hide" ); m_out->Print( 0, " hide" );
m_out->Print( 0, ")\n" ); m_out->Print( 0, ")\n" );
} }
@ -209,16 +199,11 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
{ {
if( mask & aBoard->GetEnabledLayers() ) if( mask & aBoard->GetEnabledLayers() )
{ {
#if USE_LAYER_NAMES
m_out->Print( aNestLevel+1, "(%d %s user", layer, m_out->Print( aNestLevel+1, "(%d %s user", layer,
m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() ); m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
#else
m_out->Print( aNestLevel+1, "(%d %s user", layer,
m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
#endif
if( !( aBoard->GetVisibleLayers() & mask ) ) if( !( aBoard->GetVisibleLayers() & mask ) )
m_out->Print( 0, "hide" ); m_out->Print( 0, " hide" );
m_out->Print( 0, ")\n" ); m_out->Print( 0, ")\n" );
} }
@ -325,9 +310,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
m_out->Print( aNestLevel+1, "(visible_elements %X)\n", m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
aBoard->GetDesignSettings().GetVisibleElements() ); aBoard->GetDesignSettings().GetVisibleElements() );
#if SAVE_PCB_PLOT_PARAMS
aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 ); aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
#endif
m_out->Print( aNestLevel, ")\n\n" ); m_out->Print( aNestLevel, ")\n\n" );
@ -770,8 +753,11 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
if( aPad->GetDrillShape() == PAD_OVAL ) if( aPad->GetDrillShape() == PAD_OVAL )
m_out->Print( 0, " oval" ); m_out->Print( 0, " oval" );
m_out->Print( 0, " (size %s)", (sz.GetHeight() != sz.GetWidth()) ? FMT_IU( sz ).c_str() : if( sz.GetWidth() > 0 )
FMT_IU( sz.GetWidth() ).c_str() ); m_out->Print( 0, " %s", FMT_IU( sz.GetWidth() ).c_str() );
if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
m_out->Print( 0, " %s", FMT_IU( sz.GetHeight() ).c_str() );
if( (aPad->GetOffset().x != 0) || (aPad->GetOffset().y != 0) ) if( (aPad->GetOffset().x != 0) || (aPad->GetOffset().y != 0) )
m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() ); m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() );
@ -789,18 +775,18 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const
{ {
if( layerMask & 1 ) if( layerMask & 1 )
{ {
#if 1
m_out->Print( 0, " %s", m_out->Quotew( m_board->GetLayerName( layer ) ).c_str() ); m_out->Print( 0, " %s", m_out->Quotew( m_board->GetLayerName( layer ) ).c_str() );
#else
m_out->Print( 0, " %d", layer );
#endif
} }
} }
m_out->Print( 0, ")\n" ); m_out->Print( 0, ")\n" );
m_out->Print( aNestLevel+1, "(net %d %s)\n", // Unconnected pad is default net so don't save it.
aPad->GetNet(), m_out->Quotew( aPad->GetNetname() ).c_str() ); if( aPad->GetNet() != 0 )
{
m_out->Print( aNestLevel+1, "(net %d %s)\n",
aPad->GetNet(), m_out->Quotew( aPad->GetNetname() ).c_str() );
}
if( aPad->GetDieLength() != 0 ) if( aPad->GetDieLength() != 0 )
m_out->Print( aNestLevel+1, "(die_length %s)\n", m_out->Print( aNestLevel+1, "(die_length %s)\n",
@ -944,13 +930,9 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const
if( aTrack->GetDrill() != UNDEFINED_DRILL_DIAMETER ) if( aTrack->GetDrill() != UNDEFINED_DRILL_DIAMETER )
m_out->Print( 0, " (drill %s)", FMT_IU( aTrack->GetDrill() ).c_str() ); m_out->Print( 0, " (drill %s)", FMT_IU( aTrack->GetDrill() ).c_str() );
#if 1
m_out->Print( 0, " (layers %s %s)", m_out->Print( 0, " (layers %s %s)",
m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(), m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() ); m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
#else
m_out->Print( 0, " (layers %d %d)", layer1, layer2 );
#endif
} }
else else
{ {
@ -958,11 +940,7 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const
FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(), FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(),
FMT_IU( aTrack->GetWidth() ).c_str() ); FMT_IU( aTrack->GetWidth() ).c_str() );
#if 1
m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() ); m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
#else
m_out->Print( 0, " (layer %d)", aTrack->GetLayer() );
#endif
} }
m_out->Print( 0, " (net %d)", aTrack->GetNet() ); m_out->Print( 0, " (net %d)", aTrack->GetNet() );
@ -1002,7 +980,7 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
FMT_IU( aZone->m_Poly->GetHatchPitch() ).c_str() ); FMT_IU( aZone->m_Poly->GetHatchPitch() ).c_str() );
if( aZone->GetPriority() > 0 ) if( aZone->GetPriority() > 0 )
m_out->Print( aNestLevel+1, " (priority %d)\n", aZone->GetPriority() ); m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
m_out->Print( aNestLevel+1, "(connect_pads" ); m_out->Print( aNestLevel+1, "(connect_pads" );
@ -1012,6 +990,10 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
case THERMAL_PAD: // Default option not saved or loaded. case THERMAL_PAD: // Default option not saved or loaded.
break; break;
case THT_THERMAL:
m_out->Print( 0, " thru_hole_only" );
break;
case PAD_IN_ZONE: case PAD_IN_ZONE:
m_out->Print( 0, " yes" ); m_out->Print( 0, " yes" );
break; break;
@ -1027,6 +1009,14 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
m_out->Print( aNestLevel+1, "(min_thickness %s)\n", m_out->Print( aNestLevel+1, "(min_thickness %s)\n",
FMT_IU( aZone->GetMinThickness() ).c_str() ); FMT_IU( aZone->GetMinThickness() ).c_str() );
if( aZone->GetIsKeepout() )
{
m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
}
m_out->Print( aNestLevel+1, "(fill" ); m_out->Print( aNestLevel+1, "(fill" );
// Default is not filled. // Default is not filled.
@ -1197,7 +1187,9 @@ BOARD* PCB_IO::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPERTIES*
if( !file.IsOpened() ) if( !file.IsOpened() )
{ {
THROW_IO_ERROR( _( "Unable to read file \"" ) + aFileName + wxT( "\"" ) ); wxString msg;
msg.Printf( _( "Unable to read file \"%s\"" ), GetChars( aFileName ) );
THROW_IO_ERROR( msg );
} }
PCB_PARSER parser( new FILE_LINE_READER( file.fp(), aFileName ), aAppendToMe ); PCB_PARSER parser( new FILE_LINE_READER( file.fp(), aFileName ), aAppendToMe );

View File

@ -3,8 +3,8 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2007-2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com> * Copyright (C) 2007-2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2004 Jean-Pierre Charras, jean-pierre.charras@gipsa-lab.inpg.fr * Copyright (C) 2004 Jean-Pierre Charras, jp.charras@wanadoo.fr
* Copyright (C) 1992-2011 KiCad Developers, see change_log.txt for contributors. * Copyright (C) 1992-2012 KiCad Developers, see change_log.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -106,10 +106,16 @@ typedef LEGACY_PLUGIN::BIU BIU;
#define SZ( x ) (sizeof(x)-1) #define SZ( x ) (sizeof(x)-1)
static const char delims[] = " \t\r\n";
static bool inline isSpace( int c ) { return strchr( delims, c ) != 0; }
//-----<BOARD Load Functions>--------------------------------------------------- //-----<BOARD Load Functions>---------------------------------------------------
/// C string compare test for a specific length of characters. /// C string compare test for a specific length of characters.
#define TESTLINE( x ) ( !strnicmp( line, x, SZ( x ) ) && isspace( line[SZ( x )] ) ) #define TESTLINE( x ) ( !strnicmp( line, x, SZ( x ) ) && isSpace( line[SZ( x )] ) )
/// C sub-string compare test for a specific length of characters. /// C sub-string compare test for a specific length of characters.
#define TESTSUBSTR( x ) ( !strnicmp( line, x, SZ( x ) ) ) #define TESTSUBSTR( x ) ( !strnicmp( line, x, SZ( x ) ) )
@ -141,7 +147,6 @@ static inline unsigned ReadLine( LINE_READER* rdr, const char* caller )
#define READLINE( rdr ) ReadLine( rdr, __FUNCTION__ ) #define READLINE( rdr ) ReadLine( rdr, __FUNCTION__ )
#endif #endif
static const char delims[] = " \t\r\n";
using namespace std; // auto_ptr using namespace std; // auto_ptr
@ -355,12 +360,6 @@ void LEGACY_PLUGIN::loadGENERAL()
{ {
#if defined( USE_PCBNEW_NANOMETRES ) #if defined( USE_PCBNEW_NANOMETRES )
diskToBiu = IU_PER_MM; diskToBiu = IU_PER_MM;
#elif defined(DEBUG)
// mm to deci-mils:
// advanced testing of round tripping only, not supported in non DEBUG build
diskToBiu = IU_PER_MM;
#else #else
THROW_IO_ERROR( _( "May not load millimeter *.brd file into 'Pcbnew compiled for deci-mils'" ) ); THROW_IO_ERROR( _( "May not load millimeter *.brd file into 'Pcbnew compiled for deci-mils'" ) );
#endif #endif
@ -1107,8 +1106,10 @@ void LEGACY_PLUGIN::loadPAD( MODULE* aModule )
data = data + ReadDelimitedText( mypadname, data, sizeof(mypadname) ) + 1; // +1 trailing whitespace data = data + ReadDelimitedText( mypadname, data, sizeof(mypadname) ) + 1; // +1 trailing whitespace
// sscanf( PtLine, " %s %d %d %d %d %d", BufCar, &m_Size.x, &m_Size.y, &m_DeltaSize.x, &m_DeltaSize.y, &m_Orient ); // sscanf( PtLine, " %s %d %d %d %d %d", BufCar, &m_Size.x, &m_Size.y, &m_DeltaSize.x, &m_DeltaSize.y, &m_Orient );
while( isSpace( *data ) )
++data;
int padshape = *data++; int padshape = *data++;
BIU size_x = biuParse( data, &data ); BIU size_x = biuParse( data, &data );
BIU size_y = biuParse( data, &data ); BIU size_y = biuParse( data, &data );
BIU delta_x = biuParse( data, &data ); BIU delta_x = biuParse( data, &data );
@ -1719,13 +1720,11 @@ void LEGACY_PLUGIN::loadPCB_LINE()
THROW_IO_ERROR( "Missing '$EndDRAWSEGMENT'" ); THROW_IO_ERROR( "Missing '$EndDRAWSEGMENT'" );
} }
void LEGACY_PLUGIN::loadNETINFO_ITEM() void LEGACY_PLUGIN::loadNETINFO_ITEM()
{ {
char buf[1024]; char buf[1024];
NETINFO_ITEM* net = new NETINFO_ITEM( m_board ); NETINFO_ITEM* net = new NETINFO_ITEM( m_board );
m_board->AppendNet( net );
while( READLINE( m_reader ) ) while( READLINE( m_reader ) )
{ {
@ -1744,7 +1743,15 @@ void LEGACY_PLUGIN::loadNETINFO_ITEM()
} }
else if( TESTLINE( "$EndEQUIPOT" ) ) else if( TESTLINE( "$EndEQUIPOT" ) )
{
// net 0 should be already in list, so store this net
// if it is not the net 0, or if the net 0 does not exists.
if( net->GetNet() > 0 || m_board->FindNet( 0 ) == NULL )
m_board->AppendNet( net );
else
delete net;
return; // preferred exit return; // preferred exit
}
} }
THROW_IO_ERROR( "Missing '$EndEQUIPOT'" ); THROW_IO_ERROR( "Missing '$EndEQUIPOT'" );
@ -2141,8 +2148,11 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
} }
zc->SetTimeStamp( timestamp ); zc->SetTimeStamp( timestamp );
zc->SetNet( netcode ); // Init the net code only, not the netname, to be sure
zc->SetNetName( FROM_UTF8( buf ) ); // the zone net name is the name read in file.
// (When mismatch, the user will be prompted in DRC, to fix the actual name)
zc->BOARD_CONNECTED_ITEM::SetNet( netcode );
zc->SetNetName( FROM_UTF8( buf ) ); // init the net name here
} }
else if( TESTLINE( "ZLayer" ) ) // layer found else if( TESTLINE( "ZLayer" ) ) // layer found
@ -2195,6 +2205,34 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
zc->SetCornerRadius( cornerRadius ); zc->SetCornerRadius( cornerRadius );
} }
else if( TESTLINE( "ZKeepout" ) )
{
zc->SetIsKeepout( true );
// e.g. "ZKeepout tracks N vias N pads Y"
data = strtok( line + SZ( "ZKeepout" ), delims );
while( data )
{
if( !strcmp( data, "tracks" ) )
{
data = strtok( NULL, delims );
zc->SetDoNotAllowTracks( data && *data == 'N' );
}
else if( !strcmp( data, "vias" ) )
{
data = strtok( NULL, delims );
zc->SetDoNotAllowVias( data && *data == 'N' );
}
else if( !strcmp( data, "copperpour" ) )
{
data = strtok( NULL, delims );
zc->SetDoNotAllowCopperPour( data && *data == 'N' );
}
data = strtok( NULL, delims );
}
}
else if( TESTLINE( "ZOptions" ) ) else if( TESTLINE( "ZOptions" ) )
{ {
// e.g. "ZOptions 0 32 F 200 200" // e.g. "ZOptions 0 32 F 200 200"
@ -2229,6 +2267,7 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
{ {
case 'I': popt = PAD_IN_ZONE; break; case 'I': popt = PAD_IN_ZONE; break;
case 'T': popt = THERMAL_PAD; break; case 'T': popt = THERMAL_PAD; break;
case 'H': popt = THT_THERMAL; break;
case 'X': popt = PAD_NOT_IN_ZONE; break; case 'X': popt = PAD_NOT_IN_ZONE; break;
default: default:
@ -2563,15 +2602,16 @@ void LEGACY_PLUGIN::loadPCB_TARGET()
} }
#define SPBUFZ 50 // wire all usages of this together.
int LEGACY_PLUGIN::biuSprintf( char* buf, BIU aValue ) const int LEGACY_PLUGIN::biuSprintf( char* buf, BIU aValue ) const
{ {
double engUnits = biuToDisk * aValue; double engUnits = biuToDisk * aValue;
int len; int len;
if( engUnits != 0.0 && fabs( engUnits ) <= 0.0001 ) if( engUnits != 0.0 && fabsl( engUnits ) <= 0.0001 )
{ {
// printf( "f: " ); len = snprintf( buf, SPBUFZ, "%.10f", engUnits );
len = sprintf( buf, "%.10f", engUnits );
while( --len > 0 && buf[len] == '0' ) while( --len > 0 && buf[len] == '0' )
buf[len] = '\0'; buf[len] = '\0';
@ -2580,8 +2620,16 @@ int LEGACY_PLUGIN::biuSprintf( char* buf, BIU aValue ) const
} }
else else
{ {
// printf( "g: " ); // The %.10g is about optimal since we are dealing with a bounded
len = sprintf( buf, "%.10g", engUnits ); // range on aValue, and we can be sure that there will never
// be a reason to have more than 6 digits to the right of the
// decimal point because we are converting from integer
// (signed whole numbers) nanometers to mm. A value of
// 0.000001 is one nanometer, the smallest positive nonzero value
// that we can ever have here. If you ever see a board file with
// more digits to the right of the decimal point than 6, this is a
// possibly a bug in a formatting string nearby.
len = snprintf( buf, SPBUFZ, "%.10g", engUnits );
} }
return len; return len;
} }
@ -2589,7 +2637,7 @@ int LEGACY_PLUGIN::biuSprintf( char* buf, BIU aValue ) const
std::string LEGACY_PLUGIN::fmtBIU( BIU aValue ) const std::string LEGACY_PLUGIN::fmtBIU( BIU aValue ) const
{ {
char temp[50]; char temp[SPBUFZ];
int len = biuSprintf( temp, aValue ); int len = biuSprintf( temp, aValue );
@ -2603,7 +2651,8 @@ std::string LEGACY_PLUGIN::fmtDEG( double aAngle ) const
// @todo a hook site to convert from tenths degrees to degrees for BOARD_FORMAT_VERSION 2. // @todo a hook site to convert from tenths degrees to degrees for BOARD_FORMAT_VERSION 2.
int len = sprintf( temp, "%.10g", aAngle ); // MINGW: snprintf() comes from gcc folks, sprintf() comes from Microsoft.
int len = snprintf( temp, sizeof( temp ), "%.10g", aAngle );
return std::string( temp, len ); return std::string( temp, len );
} }
@ -2611,7 +2660,7 @@ std::string LEGACY_PLUGIN::fmtDEG( double aAngle ) const
std::string LEGACY_PLUGIN::fmtBIUPair( BIU first, BIU second ) const std::string LEGACY_PLUGIN::fmtBIUPair( BIU first, BIU second ) const
{ {
char temp[100]; char temp[2*SPBUFZ+2];
char* cp = temp; char* cp = temp;
cp += biuSprintf( cp, first ); cp += biuSprintf( cp, first );
@ -2651,20 +2700,11 @@ BIU LEGACY_PLUGIN::biuParse( const char* aValue, const char** nptrptr )
if( nptrptr ) if( nptrptr )
*nptrptr = nptr; *nptrptr = nptr;
#if defined(DEBUG) fval *= diskToBiu;
if( diskToBiu == 10000/25.4 ) // fval is up into the whole number realm here, and should be bounded
{ // within INT_MIN to INT_MAX since BIU's are nanometers.
// this is the special reverse trip mm -> deci-mils testing run, return KiROUND( fval );
// only available in DEBUG mode.
return BIU( KiROUND( fval * diskToBiu ) );
}
#endif
// There should be no rounding issues here, since the values in the file initially
// came from integers via biuFmt(). In fact this product should be an integer, exactly.
return BIU( fval * diskToBiu );
} }
@ -2706,20 +2746,20 @@ void LEGACY_PLUGIN::init( PROPERTIES* aProperties )
// conversion factor for saving RAM BIUs to KICAD legacy file format. // conversion factor for saving RAM BIUs to KICAD legacy file format.
#if defined( USE_PCBNEW_NANOMETRES ) #if defined( USE_PCBNEW_NANOMETRES )
biuToDisk = 1/IU_PER_MM; // BIUs are nanometers & file is mm biuToDisk = 1.0/IU_PER_MM; // BIUs are nanometers & file is mm
#else #else
biuToDisk = 1.0; // BIUs are deci-mils biuToDisk = 1.0; // BIUs are deci-mils
#endif #endif
// conversion factor for loading KICAD legacy file format into BIUs in RAM // Conversion factor for loading KICAD legacy file format into BIUs in RAM
// Start by assuming the *.brd file is in deci-mils. // Start by assuming the *.brd file is in deci-mils.
// if we see "Units mm" in the $GENERAL section, set diskToBiu to 1000000.0 // If we see "Units mm" in the $GENERAL section, set diskToBiu to 1000000.0
// then, during the file loading process, to start a conversion from // then, during the file loading process, to start a conversion from
// mm to nanometers. // mm to nanometers. The deci-mil legacy files have no such "Units" marker
// so we must assume the file is in deci-mils until told otherwise.
diskToBiu = IU_PER_DECIMILS; // BIUs are nanometers if USE_PCBNEW_NANOMETRES diskToBiu = IU_PER_DECIMILS; // BIUs are nanometers if defined(USE_PCBNEW_NANOMETRES)
// or BIUs are deci-mils // else are deci-mils
} }
@ -3537,6 +3577,7 @@ void LEGACY_PLUGIN::saveZONE_CONTAINER( const ZONE_CONTAINER* me ) const
default: default:
case PAD_IN_ZONE: padoption = 'I'; break; case PAD_IN_ZONE: padoption = 'I'; break;
case THERMAL_PAD: padoption = 'T'; break; case THERMAL_PAD: padoption = 'T'; break;
case THT_THERMAL: padoption = 'H'; break; // H is for 'hole' since it reliefs holes only
case PAD_NOT_IN_ZONE: padoption = 'X'; break; case PAD_NOT_IN_ZONE: padoption = 'X'; break;
} }
@ -3553,6 +3594,14 @@ void LEGACY_PLUGIN::saveZONE_CONTAINER( const ZONE_CONTAINER* me ) const
fmtBIU( me->GetThermalReliefGap() ).c_str(), fmtBIU( me->GetThermalReliefGap() ).c_str(),
fmtBIU( me->GetThermalReliefCopperBridge() ).c_str() ); fmtBIU( me->GetThermalReliefCopperBridge() ).c_str() );
if( me->GetIsKeepout() )
{
fprintf( m_fp, "ZKeepout tracks %c vias %c copperpour %c\n",
me->GetDoNotAllowTracks() ? 'N' : 'Y',
me->GetDoNotAllowVias() ? 'N' : 'Y',
me->GetDoNotAllowCopperPour() ? 'N' : 'Y' );
}
fprintf( m_fp, "ZSmoothing %d %s\n", fprintf( m_fp, "ZSmoothing %d %s\n",
me->GetCornerSmoothingType(), me->GetCornerSmoothingType(),
fmtBIU( me->GetCornerRadius() ).c_str() ); fmtBIU( me->GetCornerRadius() ).c_str() );
@ -3857,12 +3906,6 @@ void FPL_CACHE::ReadAndVerifyHeader( LINE_READER* aReader )
{ {
#if defined( USE_PCBNEW_NANOMETRES ) #if defined( USE_PCBNEW_NANOMETRES )
m_owner->diskToBiu = IU_PER_MM; m_owner->diskToBiu = IU_PER_MM;
#elif defined(DEBUG)
// mm to deci-mils:
// advanced testing of round tripping only, not supported in non DEBUG build
m_owner->diskToBiu = IU_PER_MM;
#else #else
THROW_IO_ERROR( _( "May not load millimeter legacy library file into 'Pcbnew compiled for deci-mils'" ) ); THROW_IO_ERROR( _( "May not load millimeter legacy library file into 'Pcbnew compiled for deci-mils'" ) );
#endif #endif

View File

@ -126,12 +126,14 @@ protected:
int m_loading_format_version; ///< which BOARD_FORMAT_VERSION am I Load()ing? int m_loading_format_version; ///< which BOARD_FORMAT_VERSION am I Load()ing?
FPL_CACHE* m_cache; FPL_CACHE* m_cache;
/// initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed. /// initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
void init( PROPERTIES* aProperties ); void init( PROPERTIES* aProperties );
double biuToDisk; ///< convert from BIUs to disk engineering units with this scale factor double biuToDisk; ///< convert from BIUs to disk engineering units
double diskToBiu; ///< convert from disk engineering units to BIUs with this scale factor ///< with this scale factor
double diskToBiu; ///< convert from disk engineering units to BIUs
///< with this scale factor
/** /**
* Function biuParse * Function biuParse

View File

@ -370,6 +370,10 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
AddMenuItem( placeMenu, ID_PCB_ZONES_BUTT, AddMenuItem( placeMenu, ID_PCB_ZONES_BUTT,
_( "&Zone" ), _( "Add filled zones" ), KiBitmap( add_zone_xpm ) ); _( "&Zone" ), _( "Add filled zones" ), KiBitmap( add_zone_xpm ) );
// Keepout areas
AddMenuItem( placeMenu, ID_PCB_KEEPOUT_AREA_BUTT,
_( "&Zone" ), _( "Add keepout areas" ), KiBitmap( add_keepout_area_xpm ) );
// Text // Text
AddMenuItem( placeMenu, ID_PCB_ADD_TEXT_BUTT, AddMenuItem( placeMenu, ID_PCB_ADD_TEXT_BUTT,
_( "Te&xt" ), _( "Add text on copper layers or graphic text" ), _( "Te&xt" ), _( "Add text on copper layers or graphic text" ),

View File

@ -291,37 +291,13 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
break; break;
case ID_PCB_ZONES_BUTT: case ID_PCB_ZONES_BUTT:
case ID_PCB_KEEPOUT_AREA_BUTT:
/* ZONE Tool is selected. Determine action for a left click: /* ZONE or KEEPOUT Tool is selected. Determine action for a left click:
* this can be start a new zone or select and move an existing zone outline corner * this can be start a new zone or select and move an existing zone outline corner
* if found near the mouse cursor * if found near the mouse cursor
*/ */
if( (DrawStruct == NULL) || (DrawStruct->GetFlags() == 0) ) if( (DrawStruct == NULL) || (DrawStruct->GetFlags() == 0) )
{ {
#if 0 // Set to 1 to automatically edit a zone found under the mouse
// there is no current item, try to find something under the mouse cursor
DrawStruct = PcbGeneralLocateAndDisplay();
bool hit_on_corner = false;
if( DrawStruct && (DrawStruct->Type() == PCB_ZONE_AREA_T) )
{
// We have a hit under mouse (a zone outline corner or segment)
// test for a corner only because want to move corners only.
ZONE_CONTAINER* edge_zone = (ZONE_CONTAINER*) DrawStruct;
if( edge_zone->HitTestForCorner( GetScreen()->RefPos( true ) ) ) // corner located!
hit_on_corner = true;
}
if( hit_on_corner )
{
m_canvas->MoveCursorToCrossHair();
ZONE_CONTAINER* zone_cont = (ZONE_CONTAINER*) GetCurItem();
m_canvas->SetAutoPanRequest( true );
Start_Move_Zone_Corner( aDC, zone_cont, zone_cont->m_CornerSelection, false );
}
else
#endif
if( Begin_Zone( aDC ) ) if( Begin_Zone( aDC ) )
{ {
m_canvas->SetAutoPanRequest( true ); m_canvas->SetAutoPanRequest( true );
@ -346,7 +322,7 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
case ID_PCB_ADD_TEXT_BUTT: case ID_PCB_ADD_TEXT_BUTT:
if( (DrawStruct == NULL) || (DrawStruct->GetFlags() == 0) ) if( (DrawStruct == NULL) || (DrawStruct->GetFlags() == 0) )
{ {
SetCurItem( Create_Texte_Pcb( aDC ) ); SetCurItem( CreateTextePcb( aDC ) );
m_canvas->MoveCursorToCrossHair(); m_canvas->MoveCursorToCrossHair();
m_canvas->SetAutoPanRequest( true ); m_canvas->SetAutoPanRequest( true );
} }
@ -521,6 +497,7 @@ void PCB_EDIT_FRAME::OnLeftDClick( wxDC* aDC, const wxPoint& aPosition )
break; break;
case ID_PCB_ZONES_BUTT: case ID_PCB_ZONES_BUTT:
case ID_PCB_KEEPOUT_AREA_BUTT:
if( End_Zone( aDC ) ) if( End_Zone( aDC ) )
{ {
m_canvas->SetAutoPanRequest( false ); m_canvas->SetAutoPanRequest( false );

View File

@ -329,6 +329,12 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
aPopMenu->AppendSeparator(); aPopMenu->AppendSeparator();
break; break;
case ID_PCB_KEEPOUT_AREA_BUTT:
AddMenuItem( aPopMenu, ID_POPUP_PCB_SELECT_LAYER,
_( "Select Working Layer" ), KiBitmap( select_w_layer_xpm ) );
aPopMenu->AppendSeparator();
break;
case ID_TRACK_BUTT: case ID_TRACK_BUTT:
if ( ! locate_track ) // This menu is already added when a track is located if ( ! locate_track ) // This menu is already added when a track is located
AddMenuItem( aPopMenu, Append_Track_Width_List( GetBoard() ), AddMenuItem( aPopMenu, Append_Track_Width_List( GetBoard() ),
@ -601,7 +607,9 @@ void PCB_EDIT_FRAME::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu*
{ {
wxMenu* zones_menu = new wxMenu(); wxMenu* zones_menu = new wxMenu();
AddMenuItem( aPopMenu, zones_menu, -1, _( "Zones" ), KiBitmap( add_zone_xpm ) ); AddMenuItem( aPopMenu, zones_menu, -1,
edge_zone->GetIsKeepout() ? _("Keepout Area") : _( "Zones" ),
KiBitmap( add_zone_xpm ) );
if( edge_zone->HitTestForCorner( GetScreen()->RefPos( true ) ) ) if( edge_zone->HitTestForCorner( GetScreen()->RefPos( true ) ) )
{ {
@ -632,8 +640,9 @@ void PCB_EDIT_FRAME::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu*
zones_menu->AppendSeparator(); zones_menu->AppendSeparator();
AddMenuItem( zones_menu, ID_POPUP_PCB_FILL_ZONE, _( "Fill Zone" ), if( ! edge_zone->GetIsKeepout() )
KiBitmap( fill_zone_xpm ) ); AddMenuItem( zones_menu, ID_POPUP_PCB_FILL_ZONE, _( "Fill Zone" ),
KiBitmap( fill_zone_xpm ) );
if( edge_zone->GetFilledPolysList().size() > 0 ) if( edge_zone->GetFilledPolysList().size() > 0 )
{ {
@ -839,6 +848,9 @@ void PCB_EDIT_FRAME::createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu )
msg = AddHotkeyName( _( "Move" ), g_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM ); msg = AddHotkeyName( _( "Move" ), g_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM );
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST, AddMenuItem( sub_menu_Text, ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST,
msg, KiBitmap( move_text_xpm ) ); msg, KiBitmap( move_text_xpm ) );
msg = AddHotkeyName( _( "Copy" ), g_Board_Editor_Hokeys_Descr, HK_COPY_ITEM );
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_COPY_TEXTEPCB,
msg, KiBitmap( copyblock_xpm ) );
} }
msg = AddHotkeyName( _( "Rotate" ), g_Board_Editor_Hokeys_Descr, HK_ROTATE_ITEM ); msg = AddHotkeyName( _( "Rotate" ), g_Board_Editor_Hokeys_Descr, HK_ROTATE_ITEM );
@ -847,12 +859,15 @@ void PCB_EDIT_FRAME::createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu )
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_FLIP_TEXTEPCB, msg, KiBitmap( invert_module_xpm ) ); AddMenuItem( sub_menu_Text, ID_POPUP_PCB_FLIP_TEXTEPCB, msg, KiBitmap( invert_module_xpm ) );
msg = AddHotkeyName( _( "Edit" ), g_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); msg = AddHotkeyName( _( "Edit" ), g_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM );
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_EDIT_TEXTEPCB, msg, KiBitmap( edit_text_xpm ) ); AddMenuItem( sub_menu_Text, ID_POPUP_PCB_EDIT_TEXTEPCB, msg, KiBitmap( edit_text_xpm ) );
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_RESET_TEXT_SIZE, if( !flags )
_( "Reset Size" ), KiBitmap( reset_text_xpm ) ); {
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_RESET_TEXT_SIZE,
_( "Reset Size" ), KiBitmap( reset_text_xpm ) );
sub_menu_Text->AppendSeparator(); sub_menu_Text->AppendSeparator();
msg = AddHotkeyName( _( "Delete" ), g_Board_Editor_Hokeys_Descr, HK_DELETE ); msg = AddHotkeyName( _( "Delete" ), g_Board_Editor_Hokeys_Descr, HK_DELETE );
AddMenuItem( sub_menu_Text, ID_POPUP_PCB_DELETE_TEXTEPCB, msg, KiBitmap( delete_text_xpm ) ); AddMenuItem( sub_menu_Text, ID_POPUP_PCB_DELETE_TEXTEPCB, msg, KiBitmap( delete_text_xpm ) );
}
} }

View File

@ -319,7 +319,7 @@ BOARD_ITEM* PCB_PARSER::Parse() throw( IO_ERROR, PARSE_ERROR )
default: default:
wxString err; wxString err;
err.Printf( _( "unknown token \"%s\" " ), GetChars( FromUTF8() ) ); err.Printf( _( "unknown token \"%s\"" ), GetChars( FromUTF8() ) );
THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() ); THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
} }
@ -431,7 +431,7 @@ void PCB_PARSER::parseHeader() throw( IO_ERROR, PARSE_ERROR )
Expecting( GetTokenText( T_version ) ); Expecting( GetTokenText( T_version ) );
// Get the file version. // Get the file version.
m_board->SetFileFormatVersionAtLoad( NeedNUMBER( GetTokenText( T_version ) ) ); m_board->SetFileFormatVersionAtLoad( parseInt( GetTokenText( T_version ) ) );
// Skip the host name and host build version information. // Skip the host name and host build version information.
NeedRIGHT(); NeedRIGHT();
@ -489,23 +489,45 @@ void PCB_PARSER::parsePAGE_INFO() throw( IO_ERROR, PARSE_ERROR )
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as a PAGE_INFO." ) ); wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as a PAGE_INFO." ) );
T token; T token;
bool isPortrait = false; PAGE_INFO pageInfo;
NeedSYMBOL(); NeedSYMBOL();
wxString pageType = FromUTF8(); wxString pageType = FromUTF8();
if( !pageInfo.SetType( pageType ) )
{
wxString err;
err.Printf( _( "page type \"%s\" is not valid " ), GetChars( FromUTF8() ) );
THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
}
if( pageType == PAGE_INFO::Custom ) if( pageType == PAGE_INFO::Custom )
{ {
PAGE_INFO::SetCustomWidthMils( Iu2Mils( NeedNUMBER( "width" ) ) ); double width = parseDouble( "width" ); // width in mm
PAGE_INFO::SetCustomHeightMils( Iu2Mils( NeedNUMBER( "height" ) ) );
// Perform some controls to avoid crashes if the size is edited by hands
if( width < 100.0 )
width = 100.0;
else if( width > 1200.0 )
width = 1200.0;
double height = parseDouble( "height" ); // height in mm
if( height < 100.0 )
height = 100.0;
else if( height > 1200.0 )
height = 1200.0;
pageInfo.SetWidthMils( Mm2mils( width ) );
pageInfo.SetHeightMils( Mm2mils( height ) );
} }
token = NextTok(); token = NextTok();
if( token == T_portrait ) if( token == T_portrait )
{ {
isPortrait = true; pageInfo.SetPortrait( true );
NeedRIGHT(); NeedRIGHT();
} }
else if( token != T_RIGHT ) else if( token != T_RIGHT )
@ -513,15 +535,6 @@ void PCB_PARSER::parsePAGE_INFO() throw( IO_ERROR, PARSE_ERROR )
Expecting( "portrait|)" ); Expecting( "portrait|)" );
} }
PAGE_INFO pageInfo;
if( !pageInfo.SetType( pageType, isPortrait ) )
{
wxString err;
err.Printf( _( "page type \"%s\" is not valid " ), GetChars( FromUTF8() ) );
THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
}
m_board->SetPageSettings( pageInfo ); m_board->SetPageSettings( pageInfo );
} }
@ -566,7 +579,7 @@ void PCB_PARSER::parseTITLE_BLOCK() throw( IO_ERROR, PARSE_ERROR )
case T_comment: case T_comment:
{ {
int commentNumber = NeedNUMBER( "comment" ); int commentNumber = parseInt( "comment" );
switch( commentNumber ) switch( commentNumber )
{ {
@ -592,7 +605,7 @@ void PCB_PARSER::parseTITLE_BLOCK() throw( IO_ERROR, PARSE_ERROR )
default: default:
wxString err; wxString err;
err.Printf( _( "%d is not a valid title block comment number" ), commentNumber ); err.Printf( wxT( "%d is not a valid title block comment number" ), commentNumber );
THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() ); THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
} }
@ -685,35 +698,18 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
int PCB_PARSER::lookUpLayer() throw( PARSE_ERROR, IO_ERROR ) int PCB_PARSER::lookUpLayer() throw( PARSE_ERROR, IO_ERROR )
{ {
#if USE_LAYER_NAMES
wxString name = FromUTF8(); wxString name = FromUTF8();
const LAYER_HASH_MAP::iterator it = m_layerMap.find( name ); const LAYER_HASH_MAP::iterator it = m_layerMap.find( name );
if( it == m_layerMap.end() ) if( it == m_layerMap.end() )
{ {
wxString error; wxString error;
error.Printf( _( "Layer '%s' in file <%s> at line %d, position %d was not defined in the layers section" ), error.Printf( wxT( "Layer '%s' in file <%s> at line %d, position %d was not defined in the layers section" ),
GetChars( name ), GetChars( CurSource() ), CurLineNumber(), CurOffset() ); GetChars( name ), GetChars( CurSource() ), CurLineNumber(), CurOffset() );
THROW_IO_ERROR( error ); THROW_IO_ERROR( error );
} }
return m_layerMap[ name ]; return m_layerMap[ name ];
#else
if( CurTok() != T_NUMBER )
Expecting( T_NUMBER );
int layerIndex = parseInt();
if( !m_board->IsLayerEnabled( layerIndex ) )
{
wxString error;
error.Printf( _( "Layer index %d in file <%s> at line %d, offset %d was not defined in the layers section" ),
layerIndex, GetChars( CurSource() ), CurLineNumber(), CurOffset() );
THROW_IO_ERROR( error );
}
return layerIndex;
#endif
} }
@ -928,8 +924,8 @@ void PCB_PARSER::parseSetup() throw( IO_ERROR, PARSE_ERROR )
case T_aux_axis_origin: case T_aux_axis_origin:
{ {
int x = parseBoardUnits( "auxilary origin X" ); int x = parseBoardUnits( "auxiliary origin X" );
int y = parseBoardUnits( "auxilary origin Y" ); int y = parseBoardUnits( "auxiliary origin Y" );
// x, y are not evaluated left to right, since they are push on stack right to left // x, y are not evaluated left to right, since they are push on stack right to left
m_board->SetOriginAxisPosition( wxPoint( x, y ) ); m_board->SetOriginAxisPosition( wxPoint( x, y ) );
NeedRIGHT(); NeedRIGHT();
@ -941,7 +937,6 @@ void PCB_PARSER::parseSetup() throw( IO_ERROR, PARSE_ERROR )
NeedRIGHT(); NeedRIGHT();
break; break;
#if SAVE_PCB_PLOT_PARAMS
case T_pcbplotparams: case T_pcbplotparams:
{ {
PCB_PLOT_PARAMS plotParams; PCB_PLOT_PARAMS plotParams;
@ -949,9 +944,11 @@ void PCB_PARSER::parseSetup() throw( IO_ERROR, PARSE_ERROR )
plotParams.Parse( &parser ); plotParams.Parse( &parser );
m_board->SetPlotOptions( plotParams ); m_board->SetPlotOptions( plotParams );
// I don't know why but this seems to fix a problem in PCB_PLOT_PARAMS::Parse().
NextTok();
break; break;
} }
#endif
default: default:
Unexpected( CurText() ); Unexpected( CurText() );
@ -990,10 +987,16 @@ void PCB_PARSER::parseNETINFO_ITEM() throw( IO_ERROR, PARSE_ERROR )
wxString name = FromUTF8(); wxString name = FromUTF8();
NeedRIGHT(); NeedRIGHT();
NETINFO_ITEM* net = new NETINFO_ITEM( m_board ); // net 0 should be already in list, so store this net
net->SetNet( number ); // if it is not the net 0, or if the net 0 does not exists.
net->SetNetname( name ); // (TODO: a better test.)
m_board->AppendNet( net ); if( number > 0 || m_board->FindNet( 0 ) == NULL )
{
NETINFO_ITEM* net = new NETINFO_ITEM( m_board );
net->SetNet( number );
net->SetNetname( name );
m_board->AppendNet( net );
}
} }
@ -1515,13 +1518,13 @@ MODULE* PCB_PARSER::parseMODULE() throw( IO_ERROR, PARSE_ERROR )
break; break;
case T_descr: case T_descr:
NeedSYMBOL(); NeedSYMBOLorNUMBER(); // some symbols can be 0508, so a number is also a symbol here
module->SetDescription( FromUTF8() ); module->SetDescription( FromUTF8() );
NeedRIGHT(); NeedRIGHT();
break; break;
case T_tags: case T_tags:
NeedSYMBOL(); NeedSYMBOLorNUMBER(); // some symbols can be 0508, so a number is also a symbol here
module->SetKeywords( FromUTF8() ); module->SetKeywords( FromUTF8() );
NeedRIGHT(); NeedRIGHT();
break; break;
@ -1775,6 +1778,7 @@ EDGE_MODULE* PCB_PARSER::parseEDGE_MODULE() throw( IO_ERROR, PARSE_ERROR )
pt.y = parseBoardUnits( "Y coordinate" ); pt.y = parseBoardUnits( "Y coordinate" );
segment->SetStart0( pt ); segment->SetStart0( pt );
NeedRIGHT(); NeedRIGHT();
NeedLEFT();
token = NextTok(); token = NextTok();
if( token != T_end ) if( token != T_end )
@ -2022,6 +2026,9 @@ D_PAD* PCB_PARSER::parseD_PAD() throw( IO_ERROR, PARSE_ERROR )
case T_drill: case T_drill:
{ {
bool haveWidth = false;
wxSize drillSize = pad->GetDrillSize();
for( token = NextTok(); token != T_RIGHT; token = NextTok() ) for( token = NextTok(); token != T_RIGHT; token = NextTok() )
{ {
if( token == T_LEFT ) if( token == T_LEFT )
@ -2033,23 +2040,21 @@ D_PAD* PCB_PARSER::parseD_PAD() throw( IO_ERROR, PARSE_ERROR )
pad->SetDrillShape( PAD_OVAL ); pad->SetDrillShape( PAD_OVAL );
break; break;
case T_size: case T_NUMBER:
{ {
int width = parseBoardUnits( "drill width" ); if( !haveWidth )
int height = width; {
token = NextTok(); drillSize.SetWidth( parseBoardUnits() );
if( token == T_NUMBER ) // If height is not defined the width and height are the same.
{ drillSize.SetHeight( drillSize.GetWidth() );
height = parseBoardUnits(); haveWidth = true;
NeedRIGHT();
} }
else if( token != T_RIGHT ) else
{ {
Expecting( ") or number" ); drillSize.SetHeight( parseBoardUnits() );
} }
pad->SetDrillSize( wxSize( width, height ) );
break; break;
} }
@ -2064,6 +2069,7 @@ D_PAD* PCB_PARSER::parseD_PAD() throw( IO_ERROR, PARSE_ERROR )
} }
} }
pad->SetDrillSize( drillSize );
break; break;
} }
@ -2286,12 +2292,12 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( "Cannot parse " ) + GetTokenString( CurTok() ) +
wxT( " as ZONE_CONTAINER." ) ); wxT( " as ZONE_CONTAINER." ) );
int hatchStyle = CPolyLine::NO_HATCH; // Fix compil warning int hatchStyle = CPolyLine::NO_HATCH; // Fix compile warning
int hatchPitch = 0; // Fix compil warning int hatchPitch = 0; // Fix compile warning
wxPoint pt; wxPoint pt;
T token; T token;
// bigger scope since each filled_polygon is concatonated in here // bigger scope since each filled_polygon is concatenated in here
std::vector< CPolyPt > pts; std::vector< CPolyPt > pts;
auto_ptr< ZONE_CONTAINER > zone( new ZONE_CONTAINER( m_board ) ); auto_ptr< ZONE_CONTAINER > zone( new ZONE_CONTAINER( m_board ) );
@ -2306,7 +2312,10 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
switch( token ) switch( token )
{ {
case T_net: case T_net:
zone->SetNet( parseInt( "net number" ) ); // Init the net code only, not the netname, to be sure
// the zone net name is the name read in file.
// (When mismatch, the user will be prompted in DRC, to fix the actual name)
zone->BOARD_CONNECTED_ITEM::SetNet( parseInt( "net number" ) );
NeedRIGHT(); NeedRIGHT();
break; break;
@ -2365,6 +2374,10 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
zone->SetPadConnection( PAD_NOT_IN_ZONE ); zone->SetPadConnection( PAD_NOT_IN_ZONE );
break; break;
case T_thru_hole_only:
zone->SetPadConnection( THT_THERMAL );
break;
case T_clearance: case T_clearance:
zone->SetZoneClearance( parseBoardUnits( "zone clearance" ) ); zone->SetZoneClearance( parseBoardUnits( "zone clearance" ) );
NeedRIGHT(); NeedRIGHT();
@ -2451,6 +2464,49 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
break; break;
case T_keepout:
zone->SetIsKeepout( true );
for( token = NextTok(); token != T_RIGHT; token = NextTok() )
{
if( token == T_LEFT )
token = NextTok();
switch( token )
{
case T_tracks:
token = NextTok();
if( token != T_allowed && token != T_not_allowed )
Expecting( "allowed or not_allowed" );
zone->SetDoNotAllowTracks( token == T_not_allowed );
break;
case T_vias:
token = NextTok();
if( token != T_allowed && token != T_not_allowed )
Expecting( "allowed or not_allowed" );
zone->SetDoNotAllowVias( token == T_not_allowed );
break;
case T_copperpour:
token = NextTok();
if( token != T_allowed && token != T_not_allowed )
Expecting( "allowed or not_allowed" );
zone->SetDoNotAllowCopperPour( token == T_not_allowed );
break;
default:
Expecting( "tracks, vias or copperpour" );
}
NeedRIGHT();
}
break;
case T_polygon: case T_polygon:
{ {
std::vector< wxPoint > corners; std::vector< wxPoint > corners;

View File

@ -54,12 +54,9 @@ class ZONE_CONTAINER;
WX_DECLARE_STRING_HASH_MAP( int, LAYER_HASH_MAP ); WX_DECLARE_STRING_HASH_MAP( int, LAYER_HASH_MAP );
#define USE_LAYER_NAMES 1 // Set to 0 to format and parse layers by index number.
#define SAVE_PCB_PLOT_PARAMS 0 // Set to 1 to save and load the PCB plot dialog data.
/** /**
* Class PCB_PARSER * Class PCB_PARSER
* reads a Pcbnew s-expression fromatted #LINE_READER object and returns the appropriate * reads a Pcbnew s-expression formatted #LINE_READER object and returns the appropriate
* #BOARD_ITEM object. * #BOARD_ITEM object.
*/ */
class PCB_PARSER : public PCB_LEXER class PCB_PARSER : public PCB_LEXER
@ -124,7 +121,7 @@ class PCB_PARSER : public PCB_LEXER
* parses a coordinate pair (xy X Y) in board units (mm). * parses a coordinate pair (xy X Y) in board units (mm).
* *
* The parser checks if the previous token was T_LEFT and parses the remainder of * The parser checks if the previous token was T_LEFT and parses the remainder of
* the token syntax. This is used when parsing a list of coorinate points. This * the token syntax. This is used when parsing a list of coordinate points. This
* way the parser can be used in either case. * way the parser can be used in either case.
* *
* @throw PARSE_ERROR if the coordinate pair syntax is incorrect. * @throw PARSE_ERROR if the coordinate pair syntax is incorrect.

View File

@ -26,6 +26,7 @@ enum pcbnew_ids
ID_PCB_MODULE_BUTT, ID_PCB_MODULE_BUTT,
ID_TRACK_BUTT, ID_TRACK_BUTT,
ID_PCB_ZONES_BUTT, ID_PCB_ZONES_BUTT,
ID_PCB_KEEPOUT_AREA_BUTT,
ID_PCB_ADD_LINE_BUTT, ID_PCB_ADD_LINE_BUTT,
ID_PCB_CIRCLE_BUTT, ID_PCB_CIRCLE_BUTT,
ID_PCB_ARC_BUTT, ID_PCB_ARC_BUTT,
@ -66,6 +67,7 @@ enum pcbnew_ids
ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST, ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST,
ID_POPUP_PCB_ROTATE_TEXTEPCB, ID_POPUP_PCB_ROTATE_TEXTEPCB,
ID_POPUP_PCB_COPY_TEXTEPCB,
ID_POPUP_PCB_FLIP_TEXTEPCB, ID_POPUP_PCB_FLIP_TEXTEPCB,
ID_POPUP_PCB_EDIT_TEXTEPCB, ID_POPUP_PCB_EDIT_TEXTEPCB,
ID_POPUP_PCB_DELETE_TEXTEPCB, ID_POPUP_PCB_DELETE_TEXTEPCB,

View File

@ -111,7 +111,7 @@ private:
}; };
const int UNITS_MILS = 1000; //const int UNITS_MILS = 1000;
DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aParent ) : DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aParent ) :
DIALOG_PLOT_BASE( aParent ), DIALOG_PLOT_BASE( aParent ),
@ -725,9 +725,10 @@ void DIALOG_PLOT::Plot( wxCommandEvent& event )
fn = m_parent->GetScreen()->GetFileName(); fn = m_parent->GetScreen()->GetFileName();
fn.SetPath( outputDir.GetPath() ); fn.SetPath( outputDir.GetPath() );
// Create file name. // Create file name (from the English layer name for non copper layers).
wxString layername = m_board->GetLayerName( layer ); wxString layername = m_board->GetLayerName( layer, false );
layername.Trim( true ); layername.Trim( false ); // remove leading and trailing spaces if any // remove leading and trailing spaces if any
layername.Trim( true ); layername.Trim( false );
fn.SetName( fn.GetName() + wxT( "-" ) + layername ); fn.SetName( fn.GetName() + wxT( "-" ) + layername );
// Use Gerber Extensions based on layer number // Use Gerber Extensions based on layer number

View File

@ -1135,7 +1135,8 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
} }
//-----<zone containers become planes>-------------------------------- //-----<zone containers (not keepout areas) become planes>--------------------------------
// Note: only zones are output here, keepout areas be be created later
{ {
int netlessZones = 0; int netlessZones = 0;
@ -1146,6 +1147,9 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
{ {
ZONE_CONTAINER* item = (ZONE_CONTAINER*) items[i]; ZONE_CONTAINER* item = (ZONE_CONTAINER*) items[i];
if( item->GetIsKeepout() )
continue;
COPPER_PLANE* plane = new COPPER_PLANE( pcb->structure ); COPPER_PLANE* plane = new COPPER_PLANE( pcb->structure );
pcb->structure->planes.push_back( plane ); pcb->structure->planes.push_back( plane );
@ -1214,7 +1218,80 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
} }
} }
// keepouts could go here, there are none in Kicad at this time. //-----<zone containers flagged keepout areas become keepout>--------------------------------
{
static const KICAD_T scanZONEs[] = { PCB_ZONE_AREA_T, EOT };
items.Collect( aBoard, scanZONEs );
for( int i=0; i<items.GetCount(); ++i )
{
ZONE_CONTAINER* item = (ZONE_CONTAINER*) items[i];
if( ! item->GetIsKeepout() )
continue;
// keepout areas have a type. types are
// T_place_keepout, T_via_keepout, T_wire_keepout,
// T_bend_keepout, T_elongate_keepout, T_keepout.
// Pcbnew knows only T_keepout, T_via_keepout and T_wire_keepout
DSN_T keepout_type;
if( item->GetDoNotAllowVias() && item->GetDoNotAllowTracks() )
keepout_type = T_keepout;
else if( item->GetDoNotAllowVias() )
keepout_type = T_via_keepout;
else if( item->GetDoNotAllowTracks() )
keepout_type = T_wire_keepout;
else
keepout_type = T_keepout;
KEEPOUT* keepout = new KEEPOUT( pcb->structure, keepout_type );
pcb->structure->keepouts.push_back( keepout );
PATH* mainPolygon = new PATH( keepout, T_polygon );
keepout->SetShape( mainPolygon );
mainPolygon->layer_id = layerIds[ kicadLayer2pcb[ item->GetLayer() ] ];
int count = item->m_Poly->corner.size();
int ndx = 0; // used in 2 for() loops below
for( ; ndx<count; ++ndx )
{
wxPoint point( item->m_Poly->corner[ndx].x,
item->m_Poly->corner[ndx].y );
mainPolygon->AppendPoint( mapPt(point) );
// this was the end of the main polygon
if( item->m_Poly->corner[ndx].end_contour )
break;
}
WINDOW* window = 0;
PATH* cutout = 0;
// handle the cutouts
for( ++ndx; ndx<count; ++ndx )
{
if( item->m_Poly->corner[ndx-1].end_contour )
{
window = new WINDOW( keepout );
keepout->AddWindow( window );
cutout = new PATH( window, T_polygon );
window->SetShape( cutout );
cutout->layer_id = layerIds[ kicadLayer2pcb[ item->GetLayer() ] ];
}
wxASSERT( window );
wxASSERT( cutout );
wxPoint point(item->m_Poly->corner[ndx].x,
item->m_Poly->corner[ndx].y );
cutout->AppendPoint( mapPt(point) );
}
}
}
//-----<build the images, components, and netlist>----------------------- //-----<build the images, components, and netlist>-----------------------
{ {

View File

@ -429,6 +429,10 @@ void PCB_EDIT_FRAME::ReCreateVToolbar()
m_drawToolBar->AddTool( ID_PCB_ZONES_BUTT, wxEmptyString, KiBitmap( add_zone_xpm ), m_drawToolBar->AddTool( ID_PCB_ZONES_BUTT, wxEmptyString, KiBitmap( add_zone_xpm ),
_( "Add filled zones" ), wxITEM_CHECK ); _( "Add filled zones" ), wxITEM_CHECK );
m_drawToolBar->AddTool( ID_PCB_KEEPOUT_AREA_BUTT, wxEmptyString,
KiBitmap( add_keepout_area_xpm ),
_( "Add keepout areas" ), wxITEM_CHECK );
m_drawToolBar->AddSeparator(); m_drawToolBar->AddSeparator();
m_drawToolBar->AddTool( ID_PCB_ADD_LINE_BUTT, wxEmptyString, KiBitmap( add_dashed_line_xpm ), m_drawToolBar->AddTool( ID_PCB_ADD_LINE_BUTT, wxEmptyString, KiBitmap( add_dashed_line_xpm ),
_( "Add graphic line or polygon" ), wxITEM_CHECK ); _( "Add graphic line or polygon" ), wxITEM_CHECK );

View File

@ -69,35 +69,35 @@ int ZONE_CONTAINER::BuildFilledPolysListData( BOARD* aPcb, std::vector <CPolyPt>
return 0; return 0;
// Make a smoothed polygon out of the user-drawn polygon if required // Make a smoothed polygon out of the user-drawn polygon if required
if( smoothedPoly ) if( m_smoothedPoly )
{ {
delete smoothedPoly; delete m_smoothedPoly;
smoothedPoly = NULL; m_smoothedPoly = NULL;
} }
switch( cornerSmoothingType ) switch( m_cornerSmoothingType )
{ {
case ZONE_SETTINGS::SMOOTHING_CHAMFER: case ZONE_SETTINGS::SMOOTHING_CHAMFER:
smoothedPoly = m_Poly->Chamfer( cornerRadius ); m_smoothedPoly = m_Poly->Chamfer( m_cornerRadius );
break; break;
case ZONE_SETTINGS::SMOOTHING_FILLET: case ZONE_SETTINGS::SMOOTHING_FILLET:
smoothedPoly = m_Poly->Fillet( cornerRadius, m_ArcToSegmentsCount ); m_smoothedPoly = m_Poly->Fillet( m_cornerRadius, m_ArcToSegmentsCount );
break; break;
default: default:
smoothedPoly = new CPolyLine; m_smoothedPoly = new CPolyLine;
smoothedPoly->Copy( m_Poly ); m_smoothedPoly->Copy( m_Poly );
break; break;
} }
smoothedPoly->MakeKboolPoly( -1, -1, NULL, true ); m_smoothedPoly->MakeKboolPoly( -1, -1, NULL, true );
int count = 0; int count = 0;
while( smoothedPoly->GetKboolEngine()->StartPolygonGet() ) while( m_smoothedPoly->GetKboolEngine()->StartPolygonGet() )
{ {
CPolyPt corner( 0, 0, false ); CPolyPt corner( 0, 0, false );
while( smoothedPoly->GetKboolEngine()->PolygonHasMorePoints() ) while( m_smoothedPoly->GetKboolEngine()->PolygonHasMorePoints() )
{ {
corner.x = (int) smoothedPoly->GetKboolEngine()->GetPolygonXPoint(); corner.x = (int) m_smoothedPoly->GetKboolEngine()->GetPolygonXPoint();
corner.y = (int) smoothedPoly->GetKboolEngine()->GetPolygonYPoint(); corner.y = (int) m_smoothedPoly->GetKboolEngine()->GetPolygonYPoint();
corner.end_contour = false; corner.end_contour = false;
if( aCornerBuffer ) if( aCornerBuffer )
aCornerBuffer->push_back( corner ); aCornerBuffer->push_back( corner );
@ -117,10 +117,10 @@ int ZONE_CONTAINER::BuildFilledPolysListData( BOARD* aPcb, std::vector <CPolyPt>
m_FilledPolysList.pop_back(); m_FilledPolysList.pop_back();
m_FilledPolysList.push_back( corner ); m_FilledPolysList.push_back( corner );
} }
smoothedPoly->GetKboolEngine()->EndPolygonGet(); m_smoothedPoly->GetKboolEngine()->EndPolygonGet();
} }
smoothedPoly->FreeKboolEngine(); m_smoothedPoly->FreeKboolEngine();
/* For copper layers, we now must add holes in the Polygon list. /* For copper layers, we now must add holes in the Polygon list.
* holes are pads and tracks with their clearance area * holes are pads and tracks with their clearance area

View File

@ -11,6 +11,17 @@
#define ZONE_NET_FILTER_STRING_KEY wxT( "Zone_Filter_Opt" ) #define ZONE_NET_FILTER_STRING_KEY wxT( "Zone_Filter_Opt" )
#define ZONE_THERMAL_RELIEF_GAP_STRING_KEY wxT( "Zone_TH_Gap" ) #define ZONE_THERMAL_RELIEF_GAP_STRING_KEY wxT( "Zone_TH_Gap" )
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY wxT( "Zone_TH_Copper_Width" ) #define ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY wxT( "Zone_TH_Copper_Width" )
#define ZONE_CLEARANCE_WIDTH_STRING_KEY wxT( "Zone_Clearance" )
#define ZONE_MIN_THICKNESS_WIDTH_STRING_KEY wxT( "Zone_Thickness" )
// Default values in mils for parameters in ZONE_CONTAINER
#define ZONE_THERMAL_RELIEF_GAP_MIL 20 // default value for ZONE_SETTINGS::m_ThermalReliefGap
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MIL 20 // default value for ZONE_SETTINGS::m_ThermalReliefCopperBridge
#define ZONE_THICKNESS_MIL 10 // default value for ZONE_SETTINGS::m_ZoneMinThickness
#define ZONE_THICKNESS_MIN_VALUE_MIL 1 // minimum acceptable value for ZONE_SETTINGS::m_ZoneMinThickness
#define ZONE_CLEARANCE_MIL 20 // default value for ZONE_SETTINGS::m_ZoneClearance
#define ZONE_CLEARANCE_MAX_VALUE_MIL 500 // maximum acceptable value for ZONE_SETTINGS::m_ZoneClearance
/// Exit codes for zone editing dialogs /// Exit codes for zone editing dialogs
enum ZONE_EDIT_T { enum ZONE_EDIT_T {
@ -25,7 +36,8 @@ enum ZoneConnection {
UNDEFINED_CONNECTION = -1, UNDEFINED_CONNECTION = -1,
PAD_NOT_IN_ZONE, ///< Pads are not covered PAD_NOT_IN_ZONE, ///< Pads are not covered
THERMAL_PAD, ///< Use thermal relief for pads THERMAL_PAD, ///< Use thermal relief for pads
PAD_IN_ZONE ///< pads are covered by copper PAD_IN_ZONE, ///< pads are covered by copper
THT_THERMAL ///< Thermal relief only for THT pads
}; };
class ZONE_CONTAINER; class ZONE_CONTAINER;
@ -56,4 +68,15 @@ ZONE_EDIT_T InvokeNonCopperZonesEditor( PCB_BASE_FRAME* aParent, ZONE_CONTAINER*
*/ */
ZONE_EDIT_T InvokeCopperZonesEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings ); ZONE_EDIT_T InvokeCopperZonesEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings );
/**
* Function InvokeKeepoutAreaEditor
* invokes up a modal dialog window for copper zone editing.
*
* @param aCaller is the PCB_BASE_FRAME calling parent window for the modal dialog,
* and it gives access to the BOARD through PCB_BASE_FRAME::GetBoard().
* @param aSettings points to the ZONE_SETTINGS to edit.
* @return ZONE_EDIT_T - tells if user aborted, changed only one zone, or all of them.
*/
ZONE_EDIT_T InvokeKeepoutAreaEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings );
#endif // ZONES_H_ #endif // ZONES_H_

View File

@ -83,7 +83,7 @@ void PCB_EDIT_FRAME::Add_Similar_Zone( wxDC* DC, ZONE_CONTAINER* aZone )
// Use the general event handler to set others params (like toolbar) // Use the general event handler to set others params (like toolbar)
wxCommandEvent evt; wxCommandEvent evt;
evt.SetId( ID_PCB_ZONES_BUTT ); evt.SetId( aZone->GetIsKeepout() ? ID_PCB_KEEPOUT_AREA_BUTT : ID_PCB_ZONES_BUTT );
OnSelectTool( evt ); OnSelectTool( evt );
} }
@ -103,7 +103,7 @@ void PCB_EDIT_FRAME::Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* aZone )
// Use the general event handle to set others params (like toolbar) // Use the general event handle to set others params (like toolbar)
wxCommandEvent evt; wxCommandEvent evt;
evt.SetId( ID_PCB_ZONES_BUTT ); evt.SetId( aZone->GetIsKeepout() ? ID_PCB_KEEPOUT_AREA_BUTT : ID_PCB_ZONES_BUTT );
OnSelectTool( evt ); OnSelectTool( evt );
} }
@ -116,7 +116,16 @@ void PCB_EDIT_FRAME::duplicateZone( wxDC* aDC, ZONE_CONTAINER* aZone )
ZONE_SETTINGS zoneSettings; ZONE_SETTINGS zoneSettings;
zoneSettings << *aZone; zoneSettings << *aZone;
if( InvokeCopperZonesEditor( this, &zoneSettings ) ) bool success;
if( aZone->GetIsKeepout() )
success = InvokeKeepoutAreaEditor( this, &zoneSettings );
else if( aZone->IsOnCopperLayer() )
success = InvokeCopperZonesEditor( this, &zoneSettings );
else
success = InvokeNonCopperZonesEditor( this, aZone, &zoneSettings );
if( success )
{ {
zoneSettings.ExportSetting( *newZone ); zoneSettings.ExportSetting( *newZone );
newZone->m_Poly->Hatch(); newZone->m_Poly->Hatch();
@ -510,7 +519,17 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
// If no zone contour in progress, a new zone is being created: // If no zone contour in progress, a new zone is being created:
if( !GetBoard()->m_CurrentZoneContour ) if( !GetBoard()->m_CurrentZoneContour )
GetBoard()->m_CurrentZoneContour = new ZONE_CONTAINER( GetBoard() ); {
if( GetToolId() == ID_PCB_KEEPOUT_AREA_BUTT &&
getActiveLayer() >= FIRST_NON_COPPER_LAYER )
{
DisplayError( this,
_( "Error: a keepout area is allowed only on copper layers" ) );
return 0;
}
else
GetBoard()->m_CurrentZoneContour = new ZONE_CONTAINER( GetBoard() );
}
ZONE_CONTAINER* zone = GetBoard()->m_CurrentZoneContour; ZONE_CONTAINER* zone = GetBoard()->m_CurrentZoneContour;
@ -536,21 +555,38 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
zone->SetNet( zoneInfo.m_NetcodeSelection ); zone->SetNet( zoneInfo.m_NetcodeSelection );
zone->SetNetNameFromNetCode( ); zone->SetNetNameFromNetCode( );
} }
double tmp = ZONE_THERMAL_RELIEF_GAP_MIL;
wxGetApp().GetSettings()->Read( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, &tmp );
zoneInfo.m_ThermalReliefGap = KiROUND( tmp * IU_PER_MILS);
wxGetApp().GetSettings()->Read( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, tmp = ZONE_THERMAL_RELIEF_COPPER_WIDTH_MIL;
&zoneInfo.m_ThermalReliefGap );
wxGetApp().GetSettings()->Read( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, wxGetApp().GetSettings()->Read( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY,
&zoneInfo.m_ThermalReliefCopperBridge ); &tmp );
zoneInfo.m_ThermalReliefCopperBridge = KiROUND( tmp * IU_PER_MILS );
tmp = ZONE_CLEARANCE_MIL;
wxGetApp().GetSettings()->Read( ZONE_CLEARANCE_WIDTH_STRING_KEY,
&tmp );
zoneInfo.m_ZoneClearance = KiROUND( tmp * IU_PER_MILS );
tmp = ZONE_THICKNESS_MIL;
wxGetApp().GetSettings()->Read( ZONE_MIN_THICKNESS_WIDTH_STRING_KEY,
&tmp );
zoneInfo.m_ZoneMinThickness = KiROUND( tmp * IU_PER_MILS );
zoneInfo.m_CurrentZone_Layer = zone->GetLayer(); zoneInfo.m_CurrentZone_Layer = zone->GetLayer();
edited = InvokeCopperZonesEditor( this, &zoneInfo ); if( GetToolId() == ID_PCB_KEEPOUT_AREA_BUTT )
{
zoneInfo.SetIsKeepout( true );
edited = InvokeKeepoutAreaEditor( this, &zoneInfo );
}
else
edited = InvokeCopperZonesEditor( this, &zoneInfo );
} }
else // Put a zone on a non copper layer (technical layer) else // Put a zone on a non copper layer (technical layer)
{ {
zoneInfo.m_NetcodeSelection = 0; // No net for non copper zones zoneInfo.m_NetcodeSelection = 0; // No net for non copper zones
edited = InvokeNonCopperZonesEditor( this, zone, &zoneInfo ); edited = InvokeNonCopperZonesEditor( this, zone, &zoneInfo );
} }
@ -579,7 +615,8 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
} }
// Show the Net for zones on copper layers // Show the Net for zones on copper layers
if( zoneInfo.m_CurrentZone_Layer < FIRST_NO_COPPER_LAYER ) if( zoneInfo.m_CurrentZone_Layer < FIRST_NO_COPPER_LAYER &&
! zoneInfo.GetIsKeepout() )
{ {
if( s_CurrentZone ) if( s_CurrentZone )
{ {
@ -803,7 +840,13 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
s_PickedList.ClearListAndDeleteItems(); s_PickedList.ClearListAndDeleteItems();
SaveCopyOfZones(s_PickedList, GetBoard(), -1, -1 ); SaveCopyOfZones(s_PickedList, GetBoard(), -1, -1 );
if( aZone->GetLayer() < FIRST_NO_COPPER_LAYER ) if( aZone->GetIsKeepout() )
{
// edit a keepout area on a copper layer
zoneInfo << *aZone;
edited = InvokeKeepoutAreaEditor( this, &zoneInfo );
}
else if( aZone->GetLayer() < FIRST_NO_COPPER_LAYER )
{ {
// edit a zone on a copper layer // edit a zone on a copper layer

View File

@ -87,6 +87,13 @@ void PCB_EDIT_FRAME::Delete_OldZone_Fill( SEGZONE* aZone, time_t aTimestamp )
int PCB_EDIT_FRAME::Fill_Zone( ZONE_CONTAINER* aZone ) int PCB_EDIT_FRAME::Fill_Zone( ZONE_CONTAINER* aZone )
{ {
aZone->ClearFilledPolysList();
aZone->UnFill();
// Cannot fill keepout zones:
if( aZone->GetIsKeepout() )
return 1;
wxString msg; wxString msg;
ClearMsgPanel(); ClearMsgPanel();
@ -105,8 +112,6 @@ int PCB_EDIT_FRAME::Fill_Zone( ZONE_CONTAINER* aZone )
wxBusyCursor dummy; // Shows an hourglass cursor (removed by its destructor) wxBusyCursor dummy; // Shows an hourglass cursor (removed by its destructor)
aZone->ClearFilledPolysList();
aZone->UnFill();
aZone->BuildFilledPolysListData( GetBoard() ); aZone->BuildFilledPolysListData( GetBoard() );
OnModify(); OnModify();
@ -142,6 +147,9 @@ int PCB_EDIT_FRAME::Fill_All_Zones( wxWindow * aActiveWindow, bool aVerbose )
for( ii = 0; ii < areaCount; ii++ ) for( ii = 0; ii < areaCount; ii++ )
{ {
ZONE_CONTAINER* zoneContainer = GetBoard()->GetArea( ii ); ZONE_CONTAINER* zoneContainer = GetBoard()->GetArea( ii );
if( zoneContainer->GetIsKeepout() )
continue;
msg.Printf( FORMAT_STRING, ii+1, areaCount, GetChars( zoneContainer->GetNetName() ) ); msg.Printf( FORMAT_STRING, ii+1, areaCount, GetChars( zoneContainer->GetNetName() ) );
if( progressDialog ) if( progressDialog )

View File

@ -353,17 +353,20 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
} }
} }
// Add zones outlines having an higher priority // Add zones outlines having an higher priority and keepout
for( int ii = 0; ii < GetBoard()->GetAreaCount(); ii++ ) for( int ii = 0; ii < GetBoard()->GetAreaCount(); ii++ )
{ {
ZONE_CONTAINER* zone = GetBoard()->GetArea( ii ); ZONE_CONTAINER* zone = GetBoard()->GetArea( ii );
if( zone->GetLayer() != GetLayer() ) if( zone->GetLayer() != GetLayer() )
continue; continue;
if( zone->GetPriority() <= GetPriority() ) if( !zone->GetIsKeepout() && zone->GetPriority() <= GetPriority() )
continue; continue;
// A highter priority zone is found: remove its area if( zone->GetIsKeepout() && ! zone->GetDoNotAllowCopperPour() )
continue;
// A highter priority zone or keepout area is found: remove its area
item_boundingbox = zone->GetBoundingBox(); item_boundingbox = zone->GetBoundingBox();
if( !item_boundingbox.Intersects( zone_boundingbox ) ) if( !item_boundingbox.Intersects( zone_boundingbox ) )
continue; continue;
@ -372,11 +375,19 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
// However if the zone has the same net as the current zone, // However if the zone has the same net as the current zone,
// do not add clearance. // do not add clearance.
// the zone will be connected to the current zone, but filled areas // the zone will be connected to the current zone, but filled areas
// will use different parameters (clearnce, thermal shapes ) // will use different parameters (clearance, thermal shapes )
bool addclearance = GetNet() != zone->GetNet(); bool addclearance = GetNet() != zone->GetNet();
int clearance = zone_clearance;
if( zone->GetIsKeepout() )
{
addclearance = true;
clearance = m_ZoneMinThickness / 2;
}
zone->TransformShapeWithClearanceToPolygon( zone->TransformShapeWithClearanceToPolygon(
cornerBufferPolysToSubstract, cornerBufferPolysToSubstract,
zone_clearance, s_CircleToSegmentsCount, clearance, s_CircleToSegmentsCount,
s_Correction, addclearance ); s_Correction, addclearance );
} }
@ -385,7 +396,13 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
{ {
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() ) for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
{ {
if( GetPadConnection( pad ) != THERMAL_PAD ) // Rejects non-standard pads with tht-only thermal reliefs
if( GetPadConnection( pad ) == THT_THERMAL
&& pad->GetAttribute() != PAD_STANDARD )
continue;
if( GetPadConnection( pad ) != THERMAL_PAD
&& GetPadConnection( pad ) != THT_THERMAL )
continue; continue;
if( !pad->IsOnLayer( GetLayer() ) ) if( !pad->IsOnLayer( GetLayer() ) )

View File

@ -78,7 +78,13 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector<CPolyPt>& aCornerBuffe
{ {
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() ) for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
{ {
if( aZone->GetPadConnection( pad ) != THERMAL_PAD ) // Rejects non-standard pads with tht-only thermal reliefs
if( aZone->GetPadConnection( pad ) == THT_THERMAL
&& pad->GetAttribute() != PAD_STANDARD )
continue;
if( aZone->GetPadConnection( pad ) != THERMAL_PAD
&& aZone->GetPadConnection( pad ) != THT_THERMAL )
continue; continue;
// check // check

View File

@ -5,7 +5,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2009 Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr> * Copyright (C) 2009 Jean-Pierre Charras <jp.charras@wanadoo.fr>
* Copyright (C) 2007 KiCad Developers, see change_log.txt for contributors. * Copyright (C) 2007 KiCad Developers, see change_log.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -70,31 +70,47 @@ bool ZONE_CONTAINER::IsSame( const ZONE_CONTAINER& aZoneToCompare )
if( m_Netname != aZoneToCompare.m_Netname ) if( m_Netname != aZoneToCompare.m_Netname )
return false; return false;
// Compare zone specfic parameters if( GetPriority() != aZoneToCompare.GetPriority() )
if( m_ZoneClearance != aZoneToCompare.m_ZoneClearance )
return false; return false;
if( m_ZoneMinThickness != aZoneToCompare.m_ZoneMinThickness ) // Compare zone specific parameters
if( GetIsKeepout() != aZoneToCompare.GetIsKeepout() )
return false; return false;
if( m_FillMode != aZoneToCompare.m_FillMode ) if( GetIsKeepout() )
{
if( GetDoNotAllowCopperPour() != aZoneToCompare.GetDoNotAllowCopperPour() )
return false;
if( GetDoNotAllowVias() != aZoneToCompare.GetDoNotAllowVias() )
return false;
if( GetDoNotAllowTracks() != aZoneToCompare.GetDoNotAllowTracks() )
return false;
}
if( m_ArcToSegmentsCount != aZoneToCompare.m_ArcToSegmentsCount )
return false; return false;
if( m_ArcToSegmentsCount != aZoneToCompare.m_ArcToSegmentsCount ) if( m_ZoneClearance != aZoneToCompare.m_ZoneClearance )
return false; return false;
if( m_PadConnection != aZoneToCompare.m_PadConnection ) if( m_ZoneMinThickness != aZoneToCompare.m_ZoneMinThickness )
return false; return false;
if( m_ThermalReliefGap != aZoneToCompare.m_ThermalReliefGap ) if( m_FillMode != aZoneToCompare.m_FillMode )
return false; return false;
if( m_ThermalReliefCopperBridge != aZoneToCompare.m_ThermalReliefCopperBridge ) if( m_PadConnection != aZoneToCompare.m_PadConnection )
return false; return false;
if( GetPriority() != aZoneToCompare.GetPriority() ) if( m_ThermalReliefGap != aZoneToCompare.m_ThermalReliefGap )
return false; return false;
if( m_ThermalReliefCopperBridge != aZoneToCompare.m_ThermalReliefCopperBridge )
return false;
// Compare outlines // Compare outlines
wxASSERT( m_Poly ); // m_Poly == NULL Should never happen wxASSERT( m_Poly ); // m_Poly == NULL Should never happen
wxASSERT( aZoneToCompare.m_Poly ); wxASSERT( aZoneToCompare.m_Poly );

View File

@ -29,7 +29,7 @@ private:
PCB_BASE_FRAME* m_Parent; PCB_BASE_FRAME* m_Parent;
ZONE_CONTAINER* m_zone; ZONE_CONTAINER* m_zone;
ZONE_SETTINGS* m_ptr; ZONE_SETTINGS* m_ptr;
ZONE_SETTINGS m_settings; ZONE_SETTINGS m_settings; // working copy of zone settings
void OnOkClick( wxCommandEvent& event ); void OnOkClick( wxCommandEvent& event );
void OnCancelClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event );
@ -76,8 +76,6 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
{ {
SetReturnCode( ZONE_ABORT ); // Will be changed on button click SetReturnCode( ZONE_ABORT ); // Will be changed on button click
m_FillModeCtrl->SetSelection( m_settings.m_FillMode ? 1 : 0 );
AddUnitSymbol( *m_MinThicknessValueTitle, g_UserUnit ); AddUnitSymbol( *m_MinThicknessValueTitle, g_UserUnit );
wxString msg = ReturnStringFromValue( g_UserUnit, m_settings.m_ZoneMinThickness ); wxString msg = ReturnStringFromValue( g_UserUnit, m_settings.m_ZoneMinThickness );
m_ZoneMinThicknessCtrl->SetValue( msg ); m_ZoneMinThicknessCtrl->SetValue( msg );
@ -125,18 +123,18 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
void DIALOG_NON_COPPER_ZONES_EDITOR::OnOkClick( wxCommandEvent& event ) void DIALOG_NON_COPPER_ZONES_EDITOR::OnOkClick( wxCommandEvent& event )
{ {
wxString txtvalue = m_ZoneMinThicknessCtrl->GetValue(); wxString txtvalue = m_ZoneMinThicknessCtrl->GetValue();
m_settings.m_ZoneMinThickness = ReturnValueFromString( g_UserUnit, txtvalue ); m_settings.m_ZoneMinThickness = ReturnValueFromString( g_UserUnit, txtvalue );
if( m_settings.m_ZoneMinThickness < 10 ) if( m_settings.m_ZoneMinThickness < 10 )
{ {
DisplayError( this, DisplayError( this,
_( "Error :\nyou must choose a copper min thickness value bigger than 0.001 inch (or 0.0254 mm)" ) ); _( "Error :\nyou must choose a min thickness value bigger than 0.001 inch (or 0.0254 mm)" ) );
return; return;
} }
m_settings.m_FillMode = (m_FillModeCtrl->GetSelection() == 0) ? 0 : 1; m_settings.m_FillMode = 0; // Use always polygon fill mode
switch( m_OutlineAppearanceCtrl->GetSelection() ) switch( m_OutlineAppearanceCtrl->GetSelection() )
{ {

View File

@ -124,30 +124,6 @@ ZONE_CONTAINER* BOARD::InsertArea( int netcode, int iarea, int layer, int x, int
} }
/**
* Function CompleteArea
* complete copper area contour by adding a line from last to first corner
* if there is only 1 or 2 corners, remove (delete) the area
* @param area_to_complete = area to complete or remove
* @param style = style of last corner
* @return 1 if Ok, 0 if area removed
*/
int BOARD::CompleteArea( ZONE_CONTAINER* area_to_complete, int style )
{
if( area_to_complete->m_Poly->GetNumCorners() > 2 )
{
area_to_complete->m_Poly->Close( style );
return 1;
}
else
{
Delete( area_to_complete );
}
return 0;
}
/** /**
* Function TestAreaPolygon * Function TestAreaPolygon
* Test an area for self-intersection. * Test an area for self-intersection.
@ -285,7 +261,7 @@ int BOARD::TestAreaPolygon( ZONE_CONTAINER* CurrArea )
* @param bMessageBoxInt == true, shows message when clipping occurs. * @param bMessageBoxInt == true, shows message when clipping occurs.
* @param bMessageBoxArc == true, shows message when clipping can't be done due to arcs. * @param bMessageBoxArc == true, shows message when clipping can't be done due to arcs.
* @param bRetainArcs = true to handle arcs (not really used in KiCad) * @param bRetainArcs = true to handle arcs (not really used in KiCad)
* @return: * @return
* -1 if arcs intersect other sides, so polygon can't be clipped * -1 if arcs intersect other sides, so polygon can't be clipped
* 0 if no intersecting sides * 0 if no intersecting sides
* 1 if intersecting sides * 1 if intersecting sides
@ -478,9 +454,13 @@ int BOARD::CombineAllAreasInNet( PICKED_ITEMS_LIST* aDeletedList, int aNetCode,
if( area2->GetNet() != aNetCode ) if( area2->GetNet() != aNetCode )
continue; continue;
if( curr_area->GetPriority() != area2->GetPriority() ) if( curr_area->GetPriority() != area2->GetPriority() )
continue; continue;
if( curr_area->GetIsKeepout() != area2->GetIsKeepout() )
continue;
if( curr_area->GetLayer() == area2->GetLayer() if( curr_area->GetLayer() == area2->GetLayer()
&& curr_area->utility2 != -1 && area2->utility2 != -1 ) && curr_area->utility2 != -1 && area2->utility2 != -1 )
{ {
@ -549,9 +529,14 @@ bool BOARD::TestAreaIntersections( ZONE_CONTAINER* area_to_test )
if( area_to_test->GetLayer() != area2->GetLayer() ) if( area_to_test->GetLayer() != area2->GetLayer() )
continue; continue;
// test for different priorities
if( area_to_test->GetPriority() != area2->GetPriority() ) if( area_to_test->GetPriority() != area2->GetPriority() )
continue; continue;
// test for different types
if( area_to_test->GetIsKeepout() != area2->GetIsKeepout() )
continue;
CPolyLine* poly2 = area2->m_Poly; CPolyLine* poly2 = area2->m_Poly;
// test bounding rects // test bounding rects
@ -936,6 +921,10 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
} }
/* Tests area outlines for DRC: areas inside other areas or too close.
* aArea_To_Examine: area to compare with other areas,
* or if NULL then all areas are compared to all others.
*/
int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_Examine, int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_Examine,
bool aCreate_Markers ) bool aCreate_Markers )
{ {
@ -951,38 +940,42 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
if( !Area_Ref->IsOnCopperLayer() ) if( !Area_Ref->IsOnCopperLayer() )
continue; continue;
// If testing only a single area, then skip all others // When testing only a single area, skip all others
if( aArea_To_Examine && (aArea_To_Examine != Area_Ref) ) if( aArea_To_Examine && (aArea_To_Examine != Area_Ref) )
continue; continue;
for( int ia2 = 0; ia2 < GetAreaCount(); ia2++ ) for( int ia2 = 0; ia2 < GetAreaCount(); ia2++ )
{ {
ZONE_CONTAINER* Area_To_Test = GetArea( ia2 ); ZONE_CONTAINER* area_to_test = GetArea( ia2 );
CPolyLine* testSmoothedPoly = Area_To_Test->GetSmoothedPoly(); CPolyLine* testSmoothedPoly = area_to_test->GetSmoothedPoly();
if( Area_Ref == Area_To_Test ) if( Area_Ref == area_to_test )
continue; continue;
// test for same layer // test for same layer
if( Area_Ref->GetLayer() != Area_To_Test->GetLayer() ) if( Area_Ref->GetLayer() != area_to_test->GetLayer() )
continue; continue;
// Test for same net // Test for same net
if( Area_Ref->GetNet() == Area_To_Test->GetNet() && Area_Ref->GetNet() >= 0 ) if( Area_Ref->GetNet() == area_to_test->GetNet() && Area_Ref->GetNet() >= 0 )
continue; continue;
// test for different priorities // test for different priorities
if( Area_Ref->GetPriority() != Area_To_Test->GetPriority() ) if( Area_Ref->GetPriority() != area_to_test->GetPriority() )
continue; continue;
// Examine a candidate zone: compare Area_To_Test to Area_Ref // test for different types
if( Area_Ref->GetIsKeepout() != area_to_test->GetIsKeepout() )
continue;
// Examine a candidate zone: compare area_to_test to Area_Ref
// Get clearance used in zone to zone test. The policy used to // Get clearance used in zone to zone test. The policy used to
// obtain that value is now part of the zone object itself by way of // obtain that value is now part of the zone object itself by way of
// ZONE_CONTAINER::GetClearance(). // ZONE_CONTAINER::GetClearance().
int zone2zoneClearance = Area_Ref->GetClearance( Area_To_Test ); int zone2zoneClearance = Area_Ref->GetClearance( area_to_test );
// test for some corners of Area_Ref inside Area_To_Test // test for some corners of Area_Ref inside area_to_test
for( int ic = 0; ic < refSmoothedPoly->GetNumCorners(); ic++ ) for( int ic = 0; ic < refSmoothedPoly->GetNumCorners(); ic++ )
{ {
int x = refSmoothedPoly->GetX( ic ); int x = refSmoothedPoly->GetX( ic );
@ -994,7 +987,7 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
if( aCreate_Markers ) if( aCreate_Markers )
{ {
wxString msg1 = Area_Ref->GetSelectMenuText(); wxString msg1 = Area_Ref->GetSelectMenuText();
wxString msg2 = Area_To_Test->GetSelectMenuText(); wxString msg2 = area_to_test->GetSelectMenuText();
MARKER_PCB* marker = new MARKER_PCB( COPPERAREA_INSIDE_COPPERAREA, MARKER_PCB* marker = new MARKER_PCB( COPPERAREA_INSIDE_COPPERAREA,
wxPoint( x, y ), wxPoint( x, y ),
msg1, wxPoint( x, y ), msg1, wxPoint( x, y ),
@ -1006,7 +999,7 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
} }
} }
// test for some corners of Area_To_Test inside Area_Ref // test for some corners of area_to_test inside Area_Ref
for( int ic2 = 0; ic2 < testSmoothedPoly->GetNumCorners(); ic2++ ) for( int ic2 = 0; ic2 < testSmoothedPoly->GetNumCorners(); ic2++ )
{ {
int x = testSmoothedPoly->GetX( ic2 ); int x = testSmoothedPoly->GetX( ic2 );
@ -1017,7 +1010,7 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
// COPPERAREA_COPPERAREA error: copper area corner inside copper area ref // COPPERAREA_COPPERAREA error: copper area corner inside copper area ref
if( aCreate_Markers ) if( aCreate_Markers )
{ {
wxString msg1 = Area_To_Test->GetSelectMenuText(); wxString msg1 = area_to_test->GetSelectMenuText();
wxString msg2 = Area_Ref->GetSelectMenuText(); wxString msg2 = Area_Ref->GetSelectMenuText();
MARKER_PCB* marker = new MARKER_PCB( COPPERAREA_INSIDE_COPPERAREA, MARKER_PCB* marker = new MARKER_PCB( COPPERAREA_INSIDE_COPPERAREA,
wxPoint( x, y ), wxPoint( x, y ),
@ -1094,7 +1087,7 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
if( aCreate_Markers ) if( aCreate_Markers )
{ {
wxString msg1 = Area_Ref->GetSelectMenuText(); wxString msg1 = Area_Ref->GetSelectMenuText();
wxString msg2 = Area_To_Test->GetSelectMenuText(); wxString msg2 = area_to_test->GetSelectMenuText();
MARKER_PCB* marker = new MARKER_PCB( COPPERAREA_CLOSE_TO_COPPERAREA, MARKER_PCB* marker = new MARKER_PCB( COPPERAREA_CLOSE_TO_COPPERAREA,
wxPoint( x, y ), wxPoint( x, y ),
msg1, wxPoint( x, y ), msg1, wxPoint( x, y ),
@ -1115,14 +1108,13 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
} }
/** /* tests a segment in ZONE_CONTAINER * aArea:
* Function doEdgeZoneDrc
* tests a segment in ZONE_CONTAINER * aArea:
* Test Edge inside other areas * Test Edge inside other areas
* Test Edge too close other areas * Test Edge too close other areas
* @param aArea The current area. * aArea is the current area.
* @param aCornerIndex The first corner of the segment to test. * aCornerIndex is the index of the first corner (starting point)
* @return bool - false if DRC error or true if OK * of the edge segment to test.
* return false if DRC error or true if OK
*/ */
bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex ) bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
@ -1160,30 +1152,31 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
// iterate through all areas // iterate through all areas
for( int ia2 = 0; ia2 < m_pcb->GetAreaCount(); ia2++ ) for( int ia2 = 0; ia2 < m_pcb->GetAreaCount(); ia2++ )
{ {
ZONE_CONTAINER* Area_To_Test = m_pcb->GetArea( ia2 ); ZONE_CONTAINER* area_to_test = m_pcb->GetArea( ia2 );
int zone_clearance = max( Area_To_Test->m_ZoneClearance, int zone_clearance = max( area_to_test->m_ZoneClearance,
aArea->m_ZoneClearance ); aArea->m_ZoneClearance );
// test for same layer // test for same layer
if( Area_To_Test->GetLayer() != aArea->GetLayer() ) if( area_to_test->GetLayer() != aArea->GetLayer() )
continue; continue;
// Test for same net // Test for same net
if( ( aArea->GetNet() == Area_To_Test->GetNet() ) && (aArea->GetNet() >= 0) ) if( ( aArea->GetNet() == area_to_test->GetNet() ) && (aArea->GetNet() >= 0) )
continue; continue;
// test for same priority // test for same priority
if( Area_To_Test->GetPriority() != aArea->GetPriority() ) if( area_to_test->GetPriority() != aArea->GetPriority() )
continue; continue;
// test for ending line inside Area_To_Test // test for same type
int x = end.x; if( area_to_test->GetIsKeepout() != aArea->GetIsKeepout() )
int y = end.y; continue;
if( Area_To_Test->m_Poly->TestPointInside( x, y ) ) // test for ending line inside area_to_test
if( area_to_test->m_Poly->TestPointInside( end.x, end.y ) )
{ {
// COPPERAREA_COPPERAREA error: corner inside copper area // COPPERAREA_COPPERAREA error: corner inside copper area
m_currentMarker = fillMarker( aArea, wxPoint( x, y ), m_currentMarker = fillMarker( aArea, end,
COPPERAREA_INSIDE_COPPERAREA, COPPERAREA_INSIDE_COPPERAREA,
m_currentMarker ); m_currentMarker );
return false; return false;
@ -1196,35 +1189,35 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
int ax2 = end.x; int ax2 = end.x;
int ay2 = end.y; int ay2 = end.y;
for( int icont2 = 0; icont2 < Area_To_Test->m_Poly->GetNumContours(); icont2++ ) for( int icont2 = 0; icont2 < area_to_test->m_Poly->GetNumContours(); icont2++ )
{ {
int ic_start2 = Area_To_Test->m_Poly->GetContourStart( icont2 ); int ic_start2 = area_to_test->m_Poly->GetContourStart( icont2 );
int ic_end2 = Area_To_Test->m_Poly->GetContourEnd( icont2 ); int ic_end2 = area_to_test->m_Poly->GetContourEnd( icont2 );
for( int ic2 = ic_start2; ic2<=ic_end2; ic2++ ) for( int ic2 = ic_start2; ic2<=ic_end2; ic2++ )
{ {
int bx1 = Area_To_Test->m_Poly->GetX( ic2 ); int bx1 = area_to_test->m_Poly->GetX( ic2 );
int by1 = Area_To_Test->m_Poly->GetY( ic2 ); int by1 = area_to_test->m_Poly->GetY( ic2 );
int bx2, by2; int bx2, by2;
if( ic2 == ic_end2 ) if( ic2 == ic_end2 )
{ {
bx2 = Area_To_Test->m_Poly->GetX( ic_start2 ); bx2 = area_to_test->m_Poly->GetX( ic_start2 );
by2 = Area_To_Test->m_Poly->GetY( ic_start2 ); by2 = area_to_test->m_Poly->GetY( ic_start2 );
} }
else else
{ {
bx2 = Area_To_Test->m_Poly->GetX( ic2 + 1 ); bx2 = area_to_test->m_Poly->GetX( ic2 + 1 );
by2 = Area_To_Test->m_Poly->GetY( ic2 + 1 ); by2 = area_to_test->m_Poly->GetY( ic2 + 1 );
} }
int bstyle = Area_To_Test->m_Poly->GetSideStyle( ic2 ); int bstyle = area_to_test->m_Poly->GetSideStyle( ic2 );
int x, y; int x, y; // variables containing the intersecting point coordinates
int d = GetClearanceBetweenSegments( bx1, by1, bx2, by2, bstyle, int d = GetClearanceBetweenSegments( bx1, by1, bx2, by2, bstyle,
0, 0,
ax1, ay1, ax2, ay2, astyle, ax1, ay1, ax2, ay2, astyle,
0, 0,
zone_clearance, 0,
&x, &y ); &x, &y );
if( d < zone_clearance ) if( d < zone_clearance )

View File

@ -14,18 +14,6 @@
#include <bezier_curves.h> #include <bezier_curves.h>
#include <polygon_test_point_inside.h> #include <polygon_test_point_inside.h>
#define to_int( x ) KiROUND( (x) )
#ifndef MIN
#define MIN( x1, x2 ) ( (x1) > (x2) ? (x2) : (x1) )
#endif
#ifndef MAX
#define MAX( x1, x2 ) ( (x1) > (x2) ? (x1) : (x2) )
#endif
#define pi M_PI
CPolyLine::CPolyLine() CPolyLine::CPolyLine()
{ {
m_hatchStyle = NO_HATCH; m_hatchStyle = NO_HATCH;
@ -282,7 +270,10 @@ int CPolyLine::MakeKboolPoly( int aStart_contour, int aEnd_contour, std::vector<
delete m_Kbool_Poly_Engine; delete m_Kbool_Poly_Engine;
m_Kbool_Poly_Engine = NULL; m_Kbool_Poly_Engine = NULL;
} }
if( !GetClosed() && (aStart_contour == (GetNumContours() - 1) || aStart_contour == -1) )
int polycount = GetNumContours();
if( !GetClosed() && (aStart_contour == (polycount - 1) || aStart_contour == -1) )
return 1; // error return 1; // error
int n_arcs = 0; int n_arcs = 0;
@ -292,11 +283,11 @@ int CPolyLine::MakeKboolPoly( int aStart_contour, int aEnd_contour, std::vector<
if( aStart_contour == -1 ) if( aStart_contour == -1 )
{ {
first_contour = 0; first_contour = 0;
last_contour = GetNumContours() - 1; last_contour = polycount - 1;
} }
if( aEnd_contour == -1 ) if( aEnd_contour == -1 )
{ {
last_contour = GetNumContours() - 1; last_contour = polycount - 1;
} }
if( arc_array ) if( arc_array )
arc_array->clear(); arc_array->clear();
@ -389,30 +380,30 @@ int CPolyLine::MakeKboolPoly( int aStart_contour, int aEnd_contour, std::vector<
// first quadrant, draw second quadrant of ellipse // first quadrant, draw second quadrant of ellipse
xo = x2; xo = x2;
yo = y1; yo = y1;
theta1 = pi; theta1 = M_PI;
theta2 = pi / 2.0; theta2 = M_PI / 2.0;
} }
else if( x2 < x1 && y2 > y1 ) else if( x2 < x1 && y2 > y1 )
{ {
// second quadrant, draw third quadrant of ellipse // second quadrant, draw third quadrant of ellipse
xo = x1; xo = x1;
yo = y2; yo = y2;
theta1 = 3.0 * pi / 2.0; theta1 = 3.0 * M_PI / 2.0;
theta2 = pi; theta2 = M_PI;
} }
else if( x2 < x1 && y2 < y1 ) else if( x2 < x1 && y2 < y1 )
{ {
// third quadrant, draw fourth quadrant of ellipse // third quadrant, draw fourth quadrant of ellipse
xo = x2; xo = x2;
yo = y1; yo = y1;
theta1 = 2.0 * pi; theta1 = 2.0 * M_PI;
theta2 = 3.0 * pi / 2.0; theta2 = 3.0 * M_PI / 2.0;
} }
else else
{ {
xo = x1; // fourth quadrant, draw first quadrant of ellipse xo = x1; // fourth quadrant, draw first quadrant of ellipse
yo = y2; yo = y2;
theta1 = pi / 2.0; theta1 = M_PI / 2.0;
theta2 = 0.0; theta2 = 0.0;
} }
} }
@ -423,29 +414,29 @@ int CPolyLine::MakeKboolPoly( int aStart_contour, int aEnd_contour, std::vector<
{ {
xo = x1; // first quadrant, draw fourth quadrant of ellipse xo = x1; // first quadrant, draw fourth quadrant of ellipse
yo = y2; yo = y2;
theta1 = 3.0 * pi / 2.0; theta1 = 3.0 * M_PI / 2.0;
theta2 = 2.0 * pi; theta2 = 2.0 * M_PI;
} }
else if( x2 < x1 && y2 > y1 ) else if( x2 < x1 && y2 > y1 )
{ {
xo = x2; // second quadrant xo = x2; // second quadrant
yo = y1; yo = y1;
theta1 = 0.0; theta1 = 0.0;
theta2 = pi / 2.0; theta2 = M_PI / 2.0;
} }
else if( x2 < x1 && y2 < y1 ) else if( x2 < x1 && y2 < y1 )
{ {
xo = x1; // third quadrant xo = x1; // third quadrant
yo = y2; yo = y2;
theta1 = pi / 2.0; theta1 = M_PI / 2.0;
theta2 = pi; theta2 = M_PI;
} }
else else
{ {
xo = x2; // fourth quadrant xo = x2; // fourth quadrant
yo = y1; yo = y1;
theta1 = pi; theta1 = M_PI;
theta2 = 3.0 * pi / 2.0; theta2 = 3.0 * M_PI / 2.0;
} }
} }
@ -658,7 +649,8 @@ int CPolyLine::RestoreArcs( std::vector<CArc> * arc_array, std::vector<CPolyLine
poly = this; poly = this;
else else
poly = (*pa)[ip - 1]; poly = (*pa)[ip - 1];
for( int icont = 0; icont<poly->GetNumContours(); icont++ ) int polycount = poly->GetNumContours();
for( int icont = 0; icont < polycount; icont++ )
{ {
int ic_start = poly->GetContourStart( icont ); int ic_start = poly->GetContourStart( icont );
int ic_end = poly->GetContourEnd( icont ); int ic_end = poly->GetContourEnd( icont );
@ -877,12 +869,13 @@ void CPolyLine::RemoveContour( int icont )
int istart = GetContourStart( icont ); int istart = GetContourStart( icont );
int iend = GetContourEnd( icont ); int iend = GetContourEnd( icont );
if( icont == 0 && GetNumContours() == 1 ) int polycount = GetNumContours();
if( icont == 0 && polycount == 1 )
{ {
// remove the only contour // remove the only contour
wxASSERT( 0 ); wxASSERT( 0 );
} }
else if( icont == GetNumContours() - 1 ) else if( icont == polycount - 1 )
{ {
// remove last contour // remove last contour
corner.erase( corner.begin() + istart, corner.end() ); corner.erase( corner.begin() + istart, corner.end() );
@ -911,7 +904,8 @@ CPolyLine* CPolyLine::Chamfer( unsigned int aDistance )
return newPoly; return newPoly;
} }
for( int contour = 0; contour < GetNumContours(); contour++ ) int polycount = GetNumContours();
for( int contour = 0; contour < polycount; contour++ )
{ {
unsigned int startIndex = GetContourStart( contour ); unsigned int startIndex = GetContourStart( contour );
unsigned int endIndex = GetContourEnd( contour ); unsigned int endIndex = GetContourEnd( contour );
@ -986,7 +980,8 @@ CPolyLine* CPolyLine::Fillet( unsigned int aRadius, unsigned int aSegments )
return newPoly; return newPoly;
} }
for( int contour = 0; contour < GetNumContours(); contour++ ) int polycount = GetNumContours();
for( int contour = 0; contour < polycount; contour++ )
{ {
unsigned int startIndex = GetContourStart( contour ); unsigned int startIndex = GetContourStart( contour );
unsigned int endIndex = GetContourEnd( contour ); unsigned int endIndex = GetContourEnd( contour );
@ -1199,10 +1194,10 @@ CRect CPolyLine::GetCornerBounds( int icont )
int iend = GetContourEnd( icont ); int iend = GetContourEnd( icont );
for( int i = istart; i<=iend; i++ ) for( int i = istart; i<=iend; i++ )
{ {
r.left = MIN( r.left, corner[i].x ); r.left = min( r.left, corner[i].x );
r.right = MAX( r.right, corner[i].x ); r.right = max( r.right, corner[i].x );
r.bottom = MIN( r.bottom, corner[i].y ); r.bottom = min( r.bottom, corner[i].y );
r.top = MAX( r.top, corner[i].y ); r.top = max( r.top, corner[i].y );
} }
return r; return r;
@ -1309,7 +1304,7 @@ int CPolyLine::GetContourSize( int icont )
void CPolyLine::SetSideStyle( int is, int style ) void CPolyLine::SetSideStyle( int is, int style )
{ {
UnHatch(); UnHatch();
CPoint p1, p2; wxPoint p1, p2;
if( is == (int) (corner.size() - 1) ) if( is == (int) (corner.size() - 1) )
{ {
p1.x = corner[corner.size() - 1].x; p1.x = corner[corner.size() - 1].x;
@ -1349,8 +1344,8 @@ int CPolyLine::GetClosed()
// Creates hatch lines inside the outline of the complex polygon // Creates hatch lines inside the outline of the complex polygon
// //
// sort function used in ::Hatch to sort points by descending CPoint.x values // sort function used in ::Hatch to sort points by descending wxPoint.x values
bool sort_ends_by_descending_X( const CPoint& ref, const CPoint& tst ) bool sort_ends_by_descending_X( const wxPoint& ref, const wxPoint& tst )
{ {
return tst.x < ref.x; return tst.x < ref.x;
} }
@ -1420,7 +1415,7 @@ void CPolyLine::Hatch()
#define MAXPTS 200 // Usually we store only few values per one hatch line #define MAXPTS 200 // Usually we store only few values per one hatch line
// depending on the compexity of the zone outline // depending on the compexity of the zone outline
static std::vector <CPoint> pointbuffer; static std::vector <wxPoint> pointbuffer;
pointbuffer.clear(); pointbuffer.clear();
pointbuffer.reserve(MAXPTS+2); pointbuffer.reserve(MAXPTS+2);
@ -1458,12 +1453,12 @@ void CPolyLine::Hatch()
} }
if( ok ) if( ok )
{ {
CPoint point( (int) x, (int) y); wxPoint point( (int) x, (int) y);
pointbuffer.push_back( point ); pointbuffer.push_back( point );
} }
if( ok == 2 ) if( ok == 2 )
{ {
CPoint point( (int) x2, (int) y2); wxPoint point( (int) x2, (int) y2);
pointbuffer.push_back( point ); pointbuffer.push_back( point );
} }
if( pointbuffer.size() >= MAXPTS ) // overflow if( pointbuffer.size() >= MAXPTS ) // overflow
@ -1495,10 +1490,7 @@ void CPolyLine::Hatch()
// else push 2 small lines // else push 2 small lines
if( m_hatchStyle == DIAGONAL_FULL || fabs( dx ) < 2 * hatch_line_len ) if( m_hatchStyle == DIAGONAL_FULL || fabs( dx ) < 2 * hatch_line_len )
{ {
m_HatchLines.push_back( CSegment( pointbuffer[ip].x, m_HatchLines.push_back( CSegment( pointbuffer[ip], pointbuffer[ip + 1] ) );
pointbuffer[ip].y,
pointbuffer[ip + 1].x,
pointbuffer[ip + 1].y ) );
} }
else else
{ {
@ -1517,11 +1509,11 @@ void CPolyLine::Hatch()
m_HatchLines.push_back( CSegment( pointbuffer[ip].x, m_HatchLines.push_back( CSegment( pointbuffer[ip].x,
pointbuffer[ip].y, pointbuffer[ip].y,
to_int( x1 ), to_int( y1 ) ) ); KiROUND( x1 ), KiROUND( y1 ) ) );
m_HatchLines.push_back( CSegment( pointbuffer[ip + 1].x, m_HatchLines.push_back( CSegment( pointbuffer[ip + 1].x,
pointbuffer[ip + 1].y, pointbuffer[ip + 1].y,
to_int( x2 ), to_int( y2 ) ) ); KiROUND( x2 ), KiROUND( y2 ) ) );
} }
} }
} }
@ -1538,7 +1530,7 @@ bool CPolyLine::TestPointInside( int px, int py )
} }
// Test all polygons. // Test all polygons.
// Since the first is the main outline, and other are hole, // Since the first is the main outline, and other are holes,
// if the tested point is inside only one contour, it is inside the whole polygon // if the tested point is inside only one contour, it is inside the whole polygon
// (in fact inside the main outline, and outside all holes). // (in fact inside the main outline, and outside all holes).
// if inside 2 contours (the main outline + an hole), it is outside the poly. // if inside 2 contours (the main outline + an hole), it is outside the poly.
@ -1636,8 +1628,8 @@ void CPolyLine::AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int n
// generate arc // generate arc
for( int ic = 0; ic<num; ic++ ) for( int ic = 0; ic<num; ic++ )
{ {
int x = to_int( xc + r * cos( theta ) ); int x = KiROUND( xc + r * cos( theta ) );
int y = to_int( yc + r * sin( theta ) ); int y = KiROUND( yc + r * sin( theta ) );
AppendCorner( x, y, STRAIGHT, 0 ); AppendCorner( x, y, STRAIGHT, 0 );
theta += th_d; theta += th_d;
} }
@ -1646,7 +1638,8 @@ void CPolyLine::AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int n
} }
// Bezier Support // Bezier Support
void CPolyLine::AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3) { void CPolyLine::AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3)
{
std::vector<wxPoint> bezier_points; std::vector<wxPoint> bezier_points;
bezier_points = Bezier2Poly(x1,y1,x2,y2,x3,y3); bezier_points = Bezier2Poly(x1,y1,x2,y2,x3,y3);
@ -1654,10 +1647,128 @@ void CPolyLine::AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3) {
AppendCorner( bezier_points[i].x, bezier_points[i].y); AppendCorner( bezier_points[i].x, bezier_points[i].y);
} }
void CPolyLine::AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4){ void CPolyLine::AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
std::vector<wxPoint> bezier_points; std::vector<wxPoint> bezier_points;
bezier_points = Bezier2Poly(x1,y1,x2,y2,x3,y3,x4,y4); bezier_points = Bezier2Poly(x1,y1,x2,y2,x3,y3,x4,y4);
for( unsigned int i = 0; i < bezier_points.size() ; i++) for( unsigned int i = 0; i < bezier_points.size() ; i++)
AppendCorner( bezier_points[i].x, bezier_points[i].y); AppendCorner( bezier_points[i].x, bezier_points[i].y);
} }
/*
* Function Distance
* Calculates the distance between a segment and a polygon (with holes):
* param aStart is the starting point of the segment.
* param aEnd is the ending point of the segment.
* param aWidth is the width of the segment.
* return distance between the segment and outline.
* 0 if segment intersects or is inside
*/
int CPolyLine::Distance( wxPoint aStart, wxPoint aEnd, int aWidth )
{
// We calculate the min dist between the segment and each outline segment
// However, if the segment to test is inside the outline, and does not cross
// any edge, it can be seen outside the polygon.
// Therefore test if a segment end is inside ( testing only one end is enough )
if( TestPointInside( aStart.x, aStart.y ) )
return 0;
int distance = INT_MAX;
int polycount = GetNumContours();
for( int icont = 0; icont < polycount; icont++ )
{
int ic_start = GetContourStart( icont );
int ic_end = GetContourEnd( icont );
// now test spacing between area outline and segment
for( int ic2 = ic_start; ic2 <= ic_end; ic2++ )
{
int bx1 = GetX( ic2 );
int by1 = GetY( ic2 );
int bx2, by2;
if( ic2 == ic_end )
{
bx2 = GetX( ic_start );
by2 = GetY( ic_start );
}
else
{
bx2 = GetX( ic2 + 1 );
by2 = GetY( ic2 + 1 );
}
int bstyle = GetSideStyle( ic2 );
int d = GetClearanceBetweenSegments( bx1, by1, bx2, by2, bstyle, 0,
aStart.x, aStart.y, aEnd.x, aEnd.y,
CPolyLine::STRAIGHT, aWidth,
1, // min clearance, should be > 0
NULL, NULL );
if( distance > d )
distance = d;
if( distance <= 0 )
return 0;
}
}
return distance;
}
/*
* Function Distance
* Calculates the distance between a point and polygon (with holes):
* param aPoint is the coordinate of the point.
* return distance between the point and outline.
* 0 if the point is inside
*/
int CPolyLine::Distance( const wxPoint& aPoint )
{
// We calculate the dist between the point and each outline segment
// If the point is inside the outline, the dist is 0.
if( TestPointInside( aPoint.x, aPoint.y ) )
return 0;
int distance = INT_MAX;
int polycount = GetNumContours();
for( int icont = 0; icont < polycount; icont++ )
{
int ic_start = GetContourStart( icont );
int ic_end = GetContourEnd( icont );
// now test spacing between area outline and segment
for( int ic2 = ic_start; ic2 <= ic_end; ic2++ )
{
int bx1 = GetX( ic2 );
int by1 = GetY( ic2 );
int bx2, by2;
if( ic2 == ic_end )
{
bx2 = GetX( ic_start );
by2 = GetY( ic_start );
}
else
{
bx2 = GetX( ic2 + 1 );
by2 = GetY( ic2 + 1 );
}
// Here we expect only straight lines for vertices
// (no arcs, not yet supported in Pcbnew)
int d = KiROUND( GetPointToLineSegmentDistance( aPoint.x, aPoint.y,
bx1, by1, bx2, by2 ) );
if( distance > d )
distance = d;
if( distance <= 0 )
return 0;
}
}
return distance;
}

View File

@ -49,25 +49,22 @@ public:
int left, right, top, bottom; int left, right, top, bottom;
}; };
class CPoint
{
public:
int x, y;
public:
CPoint( void ) { x = y = 0; };
CPoint( int i, int j ) { x = i; y = j; };
};
class CSegment class CSegment
{ {
public: public:
int xi, yi, xf, yf; wxPoint m_Start;
wxPoint m_End;
CSegment() { }; CSegment() { };
CSegment( const wxPoint & aStart, const wxPoint & aEnd )
{
m_Start = aStart;
m_End = aEnd;
}
CSegment( int x0, int y0, int x1, int y1 ) CSegment( int x0, int y0, int x1, int y1 )
{ {
xi = x0; yi = y0; xf = x1; yf = y1; m_Start.x = x0; m_Start.y = y0;
m_End.x = x1; m_End.y = y1;
} }
}; };
@ -282,6 +279,25 @@ public:
void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3); void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3);
void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
/**
* Function Distance
* Calculates the distance between a point and the zone:
* @param aPoint the coordinate of the point.
* @return int = distance between the point and outline.
* 0 if the point is inside
*/
int Distance( const wxPoint& aPoint );
/**
* Function Distance
* Calculates the distance between a segment and the zone:
* @param aStart the starting point of the segment.
* @param aEnd the ending point of the segment.
* @param aWidth the width of the segment.
* @return int = distance between the segment and outline.
* 0 if segment intersects or is inside
*/
int Distance( wxPoint aStart, wxPoint aEnd, int aWidth );
private: private:
int m_layer; // layer to draw on int m_layer; // layer to draw on

View File

@ -60,6 +60,10 @@ target_link_libraries( container_test
${wxWidgets_LIBRARIES} ${wxWidgets_LIBRARIES}
) )
add_executable( test-nm-biu-to-ascii-mm-round-tripping
EXCLUDE_FROM_ALL
test-nm-biu-to-ascii-mm-round-tripping.cpp
)
add_executable( parser_gen add_executable( parser_gen
EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL

View File

@ -0,0 +1,120 @@
/*
A test program to which explores the ability to round trip a nanometer
internal unit in the form of a 32 bit int, out to ASCII floating point
millimeters and back in without variation. It tests all 4 billion values
that an int can hold, and converts to ASCII and back and verifies integrity
of the round tripped value.
Author: Dick Hollenbeck
*/
#include <limits.h>
#include <stdio.h>
#include <math.h>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
static inline int KiROUND( double v )
{
return int( v < 0 ? v - 0.5 : v + 0.5 );
}
typedef int BIU;
#define BIU_PER_MM 1e6
//double scale = BIU_PER_MM;
//double scale = UM_PER_BIU;
double scale = 1.0/BIU_PER_MM;
std::string biuFmt( BIU aValue )
{
double engUnits = aValue * scale;
char temp[48];
int len;
if( engUnits != 0.0 && fabsl( engUnits ) <= 0.0001 )
{
len = snprintf( temp, sizeof( temp ), "%.10f", engUnits );
while( --len > 0 && temp[len] == '0' )
temp[len] = '\0';
++len;
}
else
{
len = snprintf( temp, sizeof( temp ), "%.10g", engUnits );
}
return std::string( temp, len );;
}
int parseBIU( const char* s )
{
double d = strtod( s, NULL );
return KiROUND( double( d * BIU_PER_MM ) );
// return int( d * BIU_PER_MM );
}
int main( int argc, char** argv )
{
unsigned mismatches = 0;
if( argc > 1 )
{
// take a value on the command line and round trip it back to ASCII.
int i = parseBIU( argv[1] );
printf( "%s: i:%d\n", __func__, i );
std::string s = biuFmt( i );
printf( "%s: s:%s\n", __func__, s.c_str() );
exit(0);
}
// printf( "sizeof(long double): %zd\n", sizeof( long double ) );
// Emperically prove that we can round trip all 4 billion 32 bit integers representative
// of nanometers out to textual floating point millimeters, and back without error using
// the above two functions.
// for( int i = INT_MIN; int64_t( i ) <= int64_t( INT_MAX ); ++i )
for( int64_t j = INT_MIN; j <= int64_t( INT_MAX ); ++j )
{
int i = int( j );
std::string s = biuFmt( int( i ) );
int r = parseBIU( s.c_str() );
if( r != i )
{
printf( "i:%d biuFmt:%s r:%d\n", i, s.c_str(), r );
++mismatches;
}
if( !( i & 0xFFFFFF ) )
{
printf( " %08x", i );
fflush( stdout );
}
}
printf( "mismatches:%u\n", mismatches );
return 0;
}

View File

@ -99,6 +99,9 @@ indent_class = true # false/true
# Whether to indent the stuff after a leading class colon # Whether to indent the stuff after a leading class colon
indent_class_colon = false # false/true indent_class_colon = false # false/true
# Virtual indent from the ':' for member initializers. Default is 2
indent_ctor_init_leading = 2 # number
# Additional indenting for constructor initializer list # Additional indenting for constructor initializer list
indent_ctor_init = 0 # number indent_ctor_init = 0 # number
@ -199,7 +202,7 @@ indent_comma_paren = false # false/true
indent_bool_paren = false # false/true indent_bool_paren = false # false/true
# If 'indent_bool_paren' is true, controls the indent of the first expression. If TRUE, aligns the first expression to the following ones # If 'indent_bool_paren' is true, controls the indent of the first expression. If TRUE, aligns the first expression to the following ones
indent_first_bool_expr = true # false/true indent_first_bool_expr = true # false/true
# If an open square is followed by a newline, indent the next line so that it lines up after the open square (not recommended) # If an open square is followed by a newline, indent the next line so that it lines up after the open square (not recommended)
indent_square_nl = false # false/true indent_square_nl = false # false/true
@ -221,6 +224,12 @@ sp_arith = force # ignore/add/remove/force
# Add or remove space around assignment operator '=', '+=', etc # Add or remove space around assignment operator '=', '+=', etc
sp_assign = force # ignore/add/remove/force sp_assign = force # ignore/add/remove/force
# Add or remove space around '=' in C++11 lambda capture specifications. Overrides sp_assign
sp_cpp_lambda_assign = ignore # ignore/add/remove/force
# Add or remove space after the capture specification in C++11 lambda.
sp_cpp_lambda_paren = ignore # ignore/add/remove/force
# Add or remove space around assignment operator '=' in a prototype # Add or remove space around assignment operator '=' in a prototype
sp_assign_default = ignore # ignore/add/remove/force sp_assign_default = ignore # ignore/add/remove/force
@ -326,6 +335,10 @@ sp_angle_word = ignore # ignore/add/remove/force
# Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add # Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add
sp_angle_shift = add # ignore/add/remove/force sp_angle_shift = add # ignore/add/remove/force
# Permit removal of the space between '>>' in 'foo<bar<int> >' (C++11 only). Default=False
# sp_angle_shift cannot remove the space without this option.
sp_permit_cpp11_shift = false # false/true
# Add or remove space before '(' of 'if', 'for', 'switch', and 'while' # Add or remove space before '(' of 'if', 'for', 'switch', and 'while'
sp_before_sparen = remove # ignore/add/remove/force sp_before_sparen = remove # ignore/add/remove/force
@ -580,7 +593,7 @@ sp_before_send_oc_colon = ignore # ignore/add/remove/force
# Add or remove space after the (type) in message specs # Add or remove space after the (type) in message specs
# '-(int)f: (int) x;' vs '-(int)f: (int)x;' # '-(int)f: (int) x;' vs '-(int)f: (int)x;'
sp_after_oc_type = add # ignore/add/remove/force sp_after_oc_type = add # ignore/add/remove/force
# Add or remove space after the first (type) in message specs # Add or remove space after the first (type) in message specs
# '-(int) f:(int)x;' vs '-(int)f:(int)x;' # '-(int) f:(int)x;' vs '-(int)f:(int)x;'
@ -621,10 +634,10 @@ sp_case_label = force # ignore/add/remove/force
sp_range = ignore # ignore/add/remove/force sp_range = ignore # ignore/add/remove/force
# Control the space after the opening of a C++ comment '// A' vs '//A' # Control the space after the opening of a C++ comment '// A' vs '//A'
sp_cmt_cpp_start = force # ignore/add/remove/force sp_cmt_cpp_start = force # ignore/add/remove/force
# Controls the spaces between #else or #endif and a trailing comment # Controls the spaces between #else or #endif and a trailing comment
sp_endif_cmt = force # ignore/add/remove/force sp_endif_cmt = force # ignore/add/remove/force
# Controls the spaces after 'new', 'delete', and 'delete[]' # Controls the spaces after 'new', 'delete', and 'delete[]'
sp_after_new = force # ignore/add/remove/force sp_after_new = force # ignore/add/remove/force
@ -1076,10 +1089,10 @@ nl_define_macro = false # false/true
nl_squeeze_ifdef = false # false/true nl_squeeze_ifdef = false # false/true
# Add or remove blank line before 'if' # Add or remove blank line before 'if'
nl_before_if = add # ignore/add/remove/force nl_before_if = add # ignore/add/remove/force
# Add or remove blank line after 'if' statement # Add or remove blank line after 'if' statement
nl_after_if = add # ignore/add/remove/force nl_after_if = add # ignore/add/remove/force
# Add or remove blank line before 'for' # Add or remove blank line before 'for'
nl_before_for = add # ignore/add/remove/force nl_before_for = add # ignore/add/remove/force