Commit 8c6313ac authored by John Beard's avatar John Beard

Extend arrays and duplicate to pcbnew (GAL and legacy), covering modules,...

Extend arrays and duplicate to pcbnew (GAL and legacy), covering modules, text, lines, tracks, dimensions and targets.

Text arrays can now use "%s" as a placeholder to be substituted with the array index.

Also expand menu options for move exact, arrays and duplicate.

Minor fixes for arrays - use proper unit parsing, add numbering start for circular arrays

Add circle radius indicator to array dialogue
parent 3c5f3f70
......@@ -152,8 +152,11 @@ set( BMAPS_MID
annotate_right_down
annotate
array_line
array_module
array_pad
array_text
array_target
array_zone
auto_associe
auto_delete_track
auto_track_width
......@@ -221,8 +224,11 @@ set( BMAPS_MID
drc_off
drc
duplicate_line
duplicate_module
duplicate_pad
duplicate_target
duplicate_text
duplicate_zone
edges_sketch
edit_comp_footprint
edit_component
......@@ -369,9 +375,11 @@ set( BMAPS_MID
move_polygon
move_rectangle
move_sheet
move_target
move_text
move_track_segment
move_track
move_zone
move
mw_add_gap
mw_add_line
......
/* 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, 0x00, 0x79, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xdd, 0x94, 0x41, 0x0a, 0x00,
0x31, 0x08, 0x03, 0xfd, 0x4a, 0xff, 0x94, 0xff, 0xf6, 0xdc, 0xfd, 0x94, 0x7b, 0xda, 0x43, 0x65,
0x41, 0xad, 0x90, 0x82, 0x07, 0xc1, 0x8b, 0x0e, 0xc4, 0x18, 0x51, 0x55, 0x61, 0x94, 0xd0, 0x41,
0x00, 0xd4, 0x2b, 0x3b, 0x0c, 0x60, 0x7a, 0xb5, 0x81, 0xbe, 0x45, 0xb2, 0x86, 0x7a, 0xbd, 0x85,
0xc8, 0x33, 0xa6, 0xd7, 0xdf, 0x03, 0x65, 0xe4, 0x8b, 0xc8, 0xf6, 0x0b, 0x8a, 0x1c, 0xd4, 0x82,
0x82, 0x33, 0x97, 0x40, 0x34, 0xe9, 0x7a, 0xb9, 0x8e, 0xf6, 0xb0, 0x6d, 0xb3, 0x2e, 0x2c, 0x43,
0x25, 0xeb, 0x52, 0x87, 0xad, 0xb8, 0x8e, 0x0b, 0xca, 0x48, 0x71, 0xfa, 0xb0, 0xa9, 0x38, 0xa9,
0x44, 0x10, 0x0f, 0x44, 0x93, 0xae, 0x97, 0xeb, 0x68, 0x0f, 0xdb, 0x2a, 0xeb, 0x5e, 0x8c, 0x95,
0x3c, 0x73, 0x5c, 0xe2, 0x55, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82,
};
const BITMAP_OPAQUE array_footprint_xpm[1] = {{ png, sizeof( png ), "array_footprint_xpm" }};
//EOF
/* 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, 0x00, 0x79, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xdd, 0x94, 0x41, 0x0a, 0x00,
0x31, 0x08, 0x03, 0xfd, 0x4a, 0xff, 0x94, 0xff, 0xf6, 0xdc, 0xfd, 0x94, 0x7b, 0xda, 0x43, 0x65,
0x41, 0xad, 0x90, 0x82, 0x07, 0xc1, 0x8b, 0x0e, 0xc4, 0x18, 0x51, 0x55, 0x61, 0x94, 0xd0, 0x41,
0x00, 0xd4, 0x2b, 0x3b, 0x0c, 0x60, 0x7a, 0xb5, 0x81, 0xbe, 0x45, 0xb2, 0x86, 0x7a, 0xbd, 0x85,
0xc8, 0x33, 0xa6, 0xd7, 0xdf, 0x03, 0x65, 0xe4, 0x8b, 0xc8, 0xf6, 0x0b, 0x8a, 0x1c, 0xd4, 0x82,
0x82, 0x33, 0x97, 0x40, 0x34, 0xe9, 0x7a, 0xb9, 0x8e, 0xf6, 0xb0, 0x6d, 0xb3, 0x2e, 0x2c, 0x43,
0x25, 0xeb, 0x52, 0x87, 0xad, 0xb8, 0x8e, 0x0b, 0xca, 0x48, 0x71, 0xfa, 0xb0, 0xa9, 0x38, 0xa9,
0x44, 0x10, 0x0f, 0x44, 0x93, 0xae, 0x97, 0xeb, 0x68, 0x0f, 0xdb, 0x2a, 0xeb, 0x5e, 0x8c, 0x95,
0x3c, 0x73, 0x5c, 0xe2, 0x55, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82,
};
const BITMAP_OPAQUE array_module_xpm[1] = {{ png, sizeof( png ), "array_module_xpm" }};
//EOF
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0x22, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x94, 0x4f, 0x4b, 0x1b,
0x41, 0x18, 0x87, 0x67, 0xc1, 0x59, 0xdd, 0x4d, 0xb6, 0x69, 0x24, 0xb6, 0xb6, 0x62, 0xbd, 0x0a,
0x31, 0x15, 0x94, 0x5d, 0x12, 0x6a, 0xbd, 0xd9, 0xcf, 0xe1, 0xb9, 0x58, 0xe8, 0x27, 0x29, 0x3d,
0xf5, 0xd8, 0x4b, 0xa1, 0xe0, 0x45, 0xb1, 0xc1, 0x4b, 0xa1, 0x9d, 0x0f, 0xe0, 0xd5, 0x8b, 0x8a,
0x87, 0xf6, 0xa4, 0xa0, 0x87, 0xf6, 0x94, 0x16, 0xe9, 0x74, 0x9e, 0x25, 0x23, 0x13, 0x49, 0xc2,
0xfe, 0x09, 0x2e, 0xbc, 0x2c, 0x3b, 0xb3, 0xef, 0x3e, 0xf3, 0xbe, 0xbf, 0x77, 0x7f, 0x42, 0x6b,
0x2d, 0x86, 0x85, 0xb9, 0xf4, 0xa8, 0xbd, 0x31, 0x39, 0x6a, 0xe4, 0xde, 0x9d, 0x17, 0xa3, 0xa8,
0x22, 0xde, 0x35, 0x1e, 0xca, 0x73, 0x40, 0x73, 0xb3, 0xf2, 0x84, 0x67, 0xd6, 0xc7, 0x7c, 0x3c,
0xac, 0x86, 0xe2, 0x75, 0xa3, 0x26, 0x3f, 0x03, 0x6a, 0xd4, 0xe5, 0x27, 0x9e, 0x59, 0x1f, 0x0a,
0x32, 0x57, 0x1c, 0xcc, 0x78, 0x57, 0xeb, 0xab, 0xf3, 0x37, 0x9d, 0x76, 0xc2, 0x82, 0x3e, 0xea,
0x6e, 0xea, 0x37, 0xdb, 0x8b, 0xbd, 0x30, 0xf0, 0x2e, 0xd9, 0x1f, 0x02, 0x59, 0x0e, 0xa6, 0xbd,
0x83, 0xb5, 0xe7, 0xf3, 0xdf, 0x3a, 0xed, 0x58, 0x01, 0x3a, 0xea, 0xbe, 0x54, 0x3b, 0xdb, 0x8b,
0x5f, 0x4d, 0xce, 0x3e, 0xfb, 0x03, 0x20, 0x4e, 0x3c, 0xe3, 0x7b, 0xd7, 0xed, 0x64, 0x45, 0xb7,
0x5a, 0x2d, 0xbd, 0xb1, 0xf1, 0x22, 0x05, 0xf5, 0xce, 0x5e, 0xe9, 0x3f, 0x27, 0x1d, 0xdd, 0xfd,
0xb8, 0xae, 0xfb, 0xb0, 0xc8, 0xad, 0x64, 0xda, 0xf7, 0xbe, 0xb4, 0xe3, 0x15, 0x65, 0x72, 0x94,
0xc9, 0x49, 0x41, 0xbd, 0xb3, 0x2d, 0xf5, 0xf7, 0xb4, 0xa3, 0x4c, 0x8e, 0xea, 0xc3, 0xc2, 0x5b,
0x10, 0xed, 0x59, 0x7a, 0xf6, 0xf8, 0x1f, 0x10, 0x00, 0x2e, 0xe8, 0xe6, 0xb8, 0x96, 0xc2, 0xa8,
0x8c, 0xf7, 0x2c, 0x88, 0xf6, 0x98, 0x9c, 0xef, 0x40, 0x00, 0xb8, 0x20, 0x93, 0x93, 0xc2, 0xa8,
0x8c, 0xf7, 0x6e, 0x41, 0xf5, 0x9a, 0xfc, 0x91, 0x24, 0x49, 0x0a, 0xb0, 0x61, 0x41, 0x36, 0x68,
0x23, 0x9a, 0x59, 0x90, 0xc9, 0xd9, 0x8d, 0xe3, 0x38, 0x05, 0xd8, 0xb0, 0x20, 0x1b, 0xb4, 0x11,
0xcd, 0xfa, 0x1d, 0x10, 0xba, 0x40, 0xa8, 0xdc, 0x01, 0x8d, 0x93, 0x72, 0x62, 0xb7, 0x02, 0xdb,
0x42, 0x1b, 0x54, 0x1c, 0x55, 0xa6, 0x2e, 0x6c, 0x45, 0x9c, 0x94, 0x13, 0xbb, 0x15, 0xd8, 0x16,
0xda, 0xa0, 0xe2, 0x28, 0x9c, 0xda, 0x1b, 0xd0, 0x08, 0x0d, 0xd0, 0x02, 0x4d, 0x5c, 0x10, 0x77,
0xb4, 0x5b, 0x78, 0xfa, 0x48, 0x87, 0xa1, 0xf8, 0xe0, 0x6a, 0x84, 0x06, 0x68, 0x81, 0x26, 0x2e,
0x88, 0x3b, 0xda, 0x2d, 0x3c, 0x99, 0x53, 0x41, 0x20, 0xde, 0x0e, 0x4c, 0x1d, 0x53, 0xc5, 0x74,
0x01, 0x73, 0x41, 0x40, 0x9a, 0xcd, 0xa6, 0x96, 0xd2, 0xfb, 0x7d, 0x77, 0xea, 0x98, 0x2a, 0xa6,
0x0b, 0x98, 0x0b, 0x02, 0x62, 0x72, 0x94, 0xef, 0x7b, 0x87, 0x03, 0x53, 0x67, 0xff, 0x23, 0x60,
0x54, 0x46, 0x1b, 0x01, 0xd1, 0x2e, 0x2a, 0xf1, 0xa5, 0xf7, 0x6b, 0xd4, 0x7f, 0x04, 0x8c, 0xca,
0x68, 0x23, 0x20, 0xda, 0x45, 0x25, 0x7d, 0xc8, 0xf2, 0x58, 0x67, 0x40, 0x33, 0x40, 0xf5, 0x07,
0xf2, 0x67, 0xb5, 0x22, 0xde, 0x67, 0x72, 0x06, 0xa3, 0x19, 0x20, 0x93, 0xb3, 0x5b, 0x0d, 0xc4,
0xce, 0x48, 0x67, 0xb8, 0x57, 0xaf, 0xcb, 0x9a, 0x34, 0x09, 0x53, 0xcd, 0x64, 0x90, 0x65, 0x4d,
0x35, 0xb3, 0x41, 0x96, 0x31, 0xd5, 0x5c, 0x06, 0x59, 0xd8, 0x54, 0xf3, 0x1a, 0x64, 0x19, 0x53,
0xcd, 0x65, 0x90, 0x45, 0x4d, 0x55, 0xdd, 0x4b, 0x14, 0x31, 0xc8, 0xc2, 0xa6, 0x9a, 0xd7, 0x20,
0xcb, 0x98, 0x6a, 0x2e, 0x83, 0x2c, 0x6b, 0xaa, 0x99, 0x0d, 0x72, 0x12, 0xa6, 0x9a, 0xc9, 0x20,
0x27, 0x6d, 0xaa, 0x13, 0xf5, 0xba, 0xff, 0x0c, 0x96, 0xd3, 0x5f, 0x78, 0x1d, 0xd5, 0x5b, 0x00,
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE array_target_xpm[1] = {{ png, sizeof( png ), "array_target_xpm" }};
//EOF
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0x1a, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xcd, 0x94, 0x3d, 0x88, 0x13,
0x41, 0x18, 0x86, 0xe7, 0x40, 0xbb, 0x20, 0xe1, 0x1a, 0x13, 0x3b, 0xb1, 0xb3, 0xb0, 0xbf, 0x43,
0x0e, 0xe5, 0x38, 0xbd, 0xd2, 0x46, 0x10, 0x04, 0x0b, 0x0b, 0x4b, 0xb9, 0xce, 0x9f, 0xc2, 0xcc,
0x9a, 0x9d, 0x9d, 0x9f, 0x6c, 0x22, 0xc1, 0x22, 0x6a, 0x27, 0x07, 0x5a, 0x18, 0xb2, 0xe4, 0xe4,
0x20, 0x46, 0x4c, 0x8a, 0x6b, 0x6c, 0xc5, 0xeb, 0x4e, 0x2c, 0x6c, 0x44, 0x39, 0x72, 0x57, 0xa8,
0xa0, 0x98, 0x1b, 0xdf, 0xec, 0xae, 0x49, 0x30, 0xeb, 0xdd, 0x8e, 0x03, 0xc1, 0xe2, 0xdd, 0x6f,
0x77, 0x66, 0xbe, 0x79, 0xe7, 0xe7, 0xdb, 0x87, 0x68, 0xad, 0xc9, 0x34, 0x14, 0x3d, 0x1c, 0xf2,
0x93, 0x50, 0xa2, 0x0f, 0x14, 0xc6, 0x0d, 0x13, 0x29, 0xa9, 0x43, 0xdd, 0x14, 0xaa, 0x8f, 0x8c,
0xa2, 0x89, 0xde, 0x61, 0xa2, 0xf7, 0x88, 0x3b, 0xd0, 0xd7, 0x38, 0x7e, 0x08, 0xdb, 0x47, 0xd2,
0x63, 0x46, 0x83, 0x49, 0x6e, 0x42, 0xb7, 0xa1, 0x0a, 0x29, 0x90, 0x87, 0x61, 0xa4, 0xe4, 0x4e,
0xdc, 0xfe, 0x5b, 0xdd, 0x3f, 0x8d, 0x3e, 0x42, 0x7d, 0x98, 0xed, 0x22, 0x6e, 0x86, 0xd1, 0x21,
0x7b, 0x78, 0xff, 0x1c, 0x2f, 0x60, 0xd2, 0xa8, 0x40, 0x18, 0x62, 0x00, 0x55, 0xa1, 0x95, 0x38,
0xae, 0x43, 0x22, 0x5c, 0x80, 0x43, 0x6e, 0x25, 0x19, 0xf5, 0xa1, 0xfb, 0x9e, 0xef, 0x5d, 0x10,
0x92, 0xb5, 0xa5, 0x64, 0x67, 0xf1, 0xcd, 0x63, 0xb3, 0x41, 0xff, 0x5e, 0xc2, 0x8e, 0x02, 0xf4,
0x2f, 0x16, 0x4b, 0xc5, 0xe3, 0x52, 0xf2, 0xcb, 0x52, 0xd2, 0x63, 0x68, 0x3b, 0x1d, 0x9b, 0xbd,
0x84, 0xd6, 0x26, 0x8d, 0xb0, 0x03, 0xae, 0xf8, 0xc5, 0x52, 0x59, 0xe8, 0x46, 0xf0, 0x4c, 0x2b,
0x9f, 0x6b, 0xe1, 0xbb, 0x0b, 0x63, 0x13, 0xef, 0x26, 0x18, 0x55, 0x95, 0x52, 0x27, 0x54, 0x59,
0xb4, 0x91, 0xf3, 0x42, 0xfa, 0x5e, 0x9b, 0x31, 0x96, 0x1f, 0x1b, 0x53, 0x4d, 0xda, 0xd1, 0x5b,
0xe9, 0xf3, 0x8d, 0xe6, 0x5a, 0xa0, 0x7b, 0xbd, 0x6d, 0xfd, 0xe4, 0xe9, 0xaa, 0x16, 0x8a, 0x0d,
0x95, 0xbf, 0x7b, 0xf4, 0x5e, 0x82, 0xd1, 0x8a, 0x2a, 0xf3, 0xab, 0xcd, 0xe7, 0x8d, 0x0e, 0x72,
0xba, 0xc8, 0xe9, 0x0a, 0xe5, 0x45, 0x2a, 0xb1, 0x56, 0xae, 0x98, 0x3b, 0x93, 0x7a, 0x47, 0xe8,
0x3b, 0x82, 0xa3, 0xdc, 0x12, 0xca, 0x7d, 0x85, 0xf7, 0x53, 0x69, 0x76, 0x84, 0xb2, 0x38, 0x8c,
0xa3, 0xbf, 0x81, 0x05, 0x5e, 0xc1, 0x98, 0xd9, 0x34, 0x77, 0x34, 0x38, 0x6b, 0x7d, 0xde, 0x5b,
0x72, 0x90, 0xd4, 0xa7, 0x94, 0x66, 0x52, 0xdc, 0xd1, 0x25, 0xa8, 0xb3, 0xec, 0x2d, 0xcf, 0x21,
0xa7, 0x8e, 0x9c, 0x43, 0xc9, 0x55, 0x17, 0xdd, 0xc5, 0x1b, 0xe8, 0x7b, 0x5c, 0x85, 0x3f, 0x10,
0x5f, 0x23, 0xa9, 0x87, 0x23, 0x79, 0xb0, 0x4f, 0xd5, 0x5d, 0x87, 0x1e, 0xc7, 0xdf, 0xab, 0xd0,
0x35, 0x21, 0x58, 0x85, 0x73, 0x7e, 0x6e, 0xbf, 0xff, 0xe8, 0x0b, 0xf4, 0x29, 0x6c, 0x2b, 0x44,
0x0b, 0x28, 0x96, 0x1c, 0x17, 0x66, 0xdf, 0xfe, 0xfa, 0x1f, 0x51, 0x52, 0x0b, 0xcb, 0x3a, 0x2a,
0x69, 0x77, 0x60, 0x28, 0x84, 0x3b, 0x2f, 0xa4, 0xfb, 0xc8, 0x88, 0x0c, 0x19, 0x9a, 0x39, 0xc9,
0x15, 0xab, 0x0d, 0x8f, 0xe2, 0x20, 0x32, 0x38, 0xa4, 0x95, 0xa5, 0xd9, 0x2c, 0xae, 0x60, 0x09,
0xe3, 0x67, 0xc8, 0x54, 0x59, 0x37, 0x3d, 0xa8, 0x1a, 0x02, 0xd2, 0x06, 0xaa, 0x46, 0x80, 0xb4,
0x81, 0xaa, 0x11, 0x20, 0x6d, 0xa0, 0x6a, 0x04, 0x48, 0x1b, 0xa8, 0x1a, 0x01, 0xd2, 0x06, 0xaa,
0x46, 0x80, 0xb4, 0x81, 0xaa, 0x11, 0x20, 0x6d, 0xa0, 0x6a, 0x04, 0x48, 0x1b, 0xa8, 0x1a, 0x01,
0xd2, 0x06, 0xaa, 0x46, 0x80, 0xfc, 0x77, 0xa8, 0x1a, 0x02, 0xf2, 0xbf, 0x86, 0xea, 0x2f, 0x73,
0x29, 0x07, 0xb2, 0xe7, 0xc3, 0x61, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE array_zone_xpm[1] = {{ png, sizeof( png ), "array_zone_xpm" }};
//EOF
/* 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, 0x01, 0xa4, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x3d, 0x30, 0x0a, 0x27, 0x24, 0x24, 0xe4, 0x3f, 0x0c, 0x13, 0xc3, 0xa7, 0xc8, 0x22, 0x86,
0x93, 0x8a, 0x28, 0x06, 0xe3, 0xe2, 0x2f, 0x61, 0x60, 0xe0, 0x03, 0x62, 0x4f, 0x20, 0xae, 0x58,
0xcc, 0xc0, 0x10, 0xbc, 0x9c, 0x81, 0x41, 0x96, 0xa0, 0x45, 0xc8, 0x2e, 0x85, 0x19, 0x84, 0x8f,
0x9f, 0x65, 0x67, 0xf7, 0x7f, 0x31, 0x23, 0x23, 0xc8, 0x32, 0x30, 0x5e, 0xc3, 0xc2, 0xf2, 0x73,
0x19, 0x23, 0xe3, 0xb7, 0xa5, 0x0c, 0x0c, 0x76, 0x04, 0x2d, 0x22, 0x25, 0xe8, 0xc2, 0x03, 0x03,
0xff, 0x2f, 0x62, 0x60, 0xd0, 0xc9, 0xb0, 0xb7, 0xff, 0xbf, 0x8c, 0x89, 0xa9, 0x72, 0x39, 0x23,
0xe3, 0xe7, 0x63, 0x42, 0x42, 0x20, 0xf6, 0x27, 0xa0, 0xcf, 0x14, 0x08, 0xf9, 0x28, 0x28, 0x3a,
0x3a, 0x9a, 0x8f, 0x94, 0x70, 0x87, 0x39, 0x00, 0xe8, 0xab, 0xc0, 0x4d, 0xec, 0xec, 0x9f, 0x80,
0x96, 0xfd, 0x02, 0x5a, 0xd6, 0x45, 0xc8, 0xa2, 0x43, 0x40, 0xbc, 0x81, 0x1c, 0x8b, 0x80, 0xc6,
0x30, 0x02, 0x83, 0xee, 0xfb, 0x1d, 0x79, 0xf9, 0xff, 0x2b, 0x99, 0x98, 0x9e, 0xe1, 0xb5, 0xc8,
0xd7, 0xd7, 0x97, 0x0b, 0x48, 0xff, 0x26, 0xc5, 0x57, 0x20, 0x7d, 0xf3, 0x19, 0x18, 0x38, 0x40,
0xc1, 0xb8, 0x9c, 0x89, 0xe9, 0xe9, 0x5d, 0xa0, 0x45, 0xc0, 0xf8, 0xfa, 0xb2, 0x8a, 0x89, 0xe9,
0x0a, 0x30, 0xbe, 0x6e, 0xac, 0x62, 0x60, 0x10, 0xc2, 0xe6, 0xa3, 0xc3, 0x40, 0x7c, 0x80, 0x54,
0x1f, 0x01, 0x53, 0x5c, 0x0a, 0x30, 0xe8, 0xfe, 0xad, 0x63, 0x63, 0xfb, 0x71, 0x4f, 0x41, 0xe1,
0x3f, 0x08, 0xaf, 0x66, 0x61, 0xf9, 0x05, 0x14, 0xcb, 0xc6, 0x15, 0x74, 0x89, 0x0e, 0x0e, 0x0e,
0x2c, 0x64, 0xc6, 0x51, 0xf8, 0x0a, 0x26, 0xa6, 0x6f, 0x20, 0x4b, 0xae, 0x4a, 0x4b, 0xff, 0x07,
0xb2, 0x6f, 0x03, 0x7d, 0xc3, 0x4c, 0x71, 0xaa, 0x43, 0xe6, 0xc3, 0x0c, 0x02, 0x06, 0x95, 0x3b,
0x30, 0xf8, 0xbe, 0xac, 0x60, 0x66, 0xfe, 0x0e, 0xf4, 0xa5, 0x2d, 0x55, 0xf2, 0x11, 0xae, 0x12,
0x02, 0x68, 0x81, 0xd5, 0x32, 0x06, 0x86, 0x59, 0x54, 0x2d, 0x19, 0x80, 0x78, 0x3f, 0x54, 0x6c,
0x3f, 0x0c, 0x63, 0xe3, 0x53, 0x5c, 0xd6, 0x21, 0x1b, 0xcc, 0x70, 0x4a, 0x71, 0x3f, 0x2e, 0x3e,
0x56, 0x8b, 0x08, 0x44, 0x3c, 0xdc, 0xa5, 0x30, 0x83, 0x88, 0xe5, 0x93, 0x6c, 0x11, 0x31, 0x41,
0x85, 0x8d, 0x4f, 0x8e, 0x8f, 0x6c, 0xd3, 0xd2, 0xd2, 0xb8, 0x48, 0xcc, 0x02, 0x64, 0x59, 0x34,
0x31, 0x38, 0x38, 0xb8, 0x85, 0xe6, 0x16, 0x79, 0x7a, 0x7a, 0xb2, 0x03, 0xe9, 0x3d, 0xa4, 0xf8,
0x8a, 0x5c, 0x1f, 0x4d, 0x02, 0xfa, 0x68, 0x02, 0x3d, 0x82, 0xce, 0x33, 0x34, 0x34, 0x94, 0x99,
0xe6, 0x16, 0xd1, 0x33, 0xd5, 0xd1, 0x3e, 0x1f, 0x21, 0x5b, 0x88, 0xaf, 0x24, 0xa0, 0xb8, 0x64,
0xc0, 0xe6, 0x33, 0xb2, 0xcb, 0x3a, 0x5a, 0x62, 0x00, 0x66, 0x05, 0x94, 0x24, 0x1f, 0x97, 0xfe,
0x47, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE duplicate_footprint_xpm[1] = {{ png, sizeof( png ), "duplicate_footprint_xpm" }};
//EOF
/* 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, 0x01, 0xa4, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x3d, 0x30, 0x0a, 0x27, 0x24, 0x24, 0xe4, 0x3f, 0x0c, 0x13, 0xc3, 0xa7, 0xc8, 0x22, 0x86,
0x93, 0x8a, 0x28, 0x06, 0xe3, 0xe2, 0x2f, 0x61, 0x60, 0xe0, 0x03, 0x62, 0x4f, 0x20, 0xae, 0x58,
0xcc, 0xc0, 0x10, 0xbc, 0x9c, 0x81, 0x41, 0x96, 0xa0, 0x45, 0xc8, 0x2e, 0x85, 0x19, 0x84, 0x8f,
0x9f, 0x65, 0x67, 0xf7, 0x7f, 0x31, 0x23, 0x23, 0xc8, 0x32, 0x30, 0x5e, 0xc3, 0xc2, 0xf2, 0x73,
0x19, 0x23, 0xe3, 0xb7, 0xa5, 0x0c, 0x0c, 0x76, 0x04, 0x2d, 0x22, 0x25, 0xe8, 0xc2, 0x03, 0x03,
0xff, 0x2f, 0x62, 0x60, 0xd0, 0xc9, 0xb0, 0xb7, 0xff, 0xbf, 0x8c, 0x89, 0xa9, 0x72, 0x39, 0x23,
0xe3, 0xe7, 0x63, 0x42, 0x42, 0x20, 0xf6, 0x27, 0xa0, 0xcf, 0x14, 0x08, 0xf9, 0x28, 0x28, 0x3a,
0x3a, 0x9a, 0x8f, 0x94, 0x70, 0x87, 0x39, 0x00, 0xe8, 0xab, 0xc0, 0x4d, 0xec, 0xec, 0x9f, 0x80,
0x96, 0xfd, 0x02, 0x5a, 0xd6, 0x45, 0xc8, 0xa2, 0x43, 0x40, 0xbc, 0x81, 0x1c, 0x8b, 0x80, 0xc6,
0x30, 0x02, 0x83, 0xee, 0xfb, 0x1d, 0x79, 0xf9, 0xff, 0x2b, 0x99, 0x98, 0x9e, 0xe1, 0xb5, 0xc8,
0xd7, 0xd7, 0x97, 0x0b, 0x48, 0xff, 0x26, 0xc5, 0x57, 0x20, 0x7d, 0xf3, 0x19, 0x18, 0x38, 0x40,
0xc1, 0xb8, 0x9c, 0x89, 0xe9, 0xe9, 0x5d, 0xa0, 0x45, 0xc0, 0xf8, 0xfa, 0xb2, 0x8a, 0x89, 0xe9,
0x0a, 0x30, 0xbe, 0x6e, 0xac, 0x62, 0x60, 0x10, 0xc2, 0xe6, 0xa3, 0xc3, 0x40, 0x7c, 0x80, 0x54,
0x1f, 0x01, 0x53, 0x5c, 0x0a, 0x30, 0xe8, 0xfe, 0xad, 0x63, 0x63, 0xfb, 0x71, 0x4f, 0x41, 0xe1,
0x3f, 0x08, 0xaf, 0x66, 0x61, 0xf9, 0x05, 0x14, 0xcb, 0xc6, 0x15, 0x74, 0x89, 0x0e, 0x0e, 0x0e,
0x2c, 0x64, 0xc6, 0x51, 0xf8, 0x0a, 0x26, 0xa6, 0x6f, 0x20, 0x4b, 0xae, 0x4a, 0x4b, 0xff, 0x07,
0xb2, 0x6f, 0x03, 0x7d, 0xc3, 0x4c, 0x71, 0xaa, 0x43, 0xe6, 0xc3, 0x0c, 0x02, 0x06, 0x95, 0x3b,
0x30, 0xf8, 0xbe, 0xac, 0x60, 0x66, 0xfe, 0x0e, 0xf4, 0xa5, 0x2d, 0x55, 0xf2, 0x11, 0xae, 0x12,
0x02, 0x68, 0x81, 0xd5, 0x32, 0x06, 0x86, 0x59, 0x54, 0x2d, 0x19, 0x80, 0x78, 0x3f, 0x54, 0x6c,
0x3f, 0x0c, 0x63, 0xe3, 0x53, 0x5c, 0xd6, 0x21, 0x1b, 0xcc, 0x70, 0x4a, 0x71, 0x3f, 0x2e, 0x3e,
0x56, 0x8b, 0x08, 0x44, 0x3c, 0xdc, 0xa5, 0x30, 0x83, 0x88, 0xe5, 0x93, 0x6c, 0x11, 0x31, 0x41,
0x85, 0x8d, 0x4f, 0x8e, 0x8f, 0x6c, 0xd3, 0xd2, 0xd2, 0xb8, 0x48, 0xcc, 0x02, 0x64, 0x59, 0x34,
0x31, 0x38, 0x38, 0xb8, 0x85, 0xe6, 0x16, 0x79, 0x7a, 0x7a, 0xb2, 0x03, 0xe9, 0x3d, 0xa4, 0xf8,
0x8a, 0x5c, 0x1f, 0x4d, 0x02, 0xfa, 0x68, 0x02, 0x3d, 0x82, 0xce, 0x33, 0x34, 0x34, 0x94, 0x99,
0xe6, 0x16, 0xd1, 0x33, 0xd5, 0xd1, 0x3e, 0x1f, 0x21, 0x5b, 0x88, 0xaf, 0x24, 0xa0, 0xb8, 0x64,
0xc0, 0xe6, 0x33, 0xb2, 0xcb, 0x3a, 0x5a, 0x62, 0x00, 0x66, 0x05, 0x94, 0x24, 0x1f, 0x97, 0xfe,
0x47, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE duplicate_module_xpm[1] = {{ png, sizeof( png ), "duplicate_module_xpm" }};
//EOF
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0xda, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xcd, 0x96, 0xcf, 0x6b, 0x13,
0x41, 0x14, 0xc7, 0x67, 0x7f, 0x25, 0xdd, 0x4d, 0xb6, 0x69, 0x24, 0xd5, 0x26, 0xa5, 0x49, 0x0f,
0x1e, 0x5a, 0xd3, 0x58, 0xb0, 0x6c, 0x4c, 0xb0, 0xea, 0x41, 0xf4, 0xe0, 0xc1, 0xbf, 0xa1, 0x67,
0xa9, 0xe0, 0xdd, 0x8b, 0xb7, 0xde, 0xd4, 0x53, 0xd1, 0x83, 0x0a, 0xd6, 0xa6, 0x4d, 0x0a, 0x8a,
0x8d, 0x22, 0x28, 0xed, 0x1e, 0x7a, 0xb3, 0x37, 0x29, 0x6a, 0x8d, 0x0a, 0x7a, 0xb2, 0x50, 0x91,
0x16, 0x63, 0x62, 0x5b, 0x3b, 0xbe, 0xef, 0x92, 0x85, 0x6d, 0xd8, 0xfc, 0x16, 0x71, 0xe0, 0xb1,
0xd9, 0x99, 0x65, 0x3e, 0xf3, 0xfd, 0xbe, 0xf7, 0x86, 0x30, 0xce, 0x39, 0xfb, 0x17, 0x51, 0x7f,
0xd1, 0x5a, 0x76, 0x5f, 0x9b, 0x61, 0xec, 0x68, 0x86, 0xb1, 0xb3, 0xf4, 0x1c, 0xcd, 0x31, 0xa6,
0xfe, 0x75, 0xd0, 0x2c, 0x63, 0x17, 0xb3, 0x92, 0xf4, 0xea, 0x21, 0xad, 0xd1, 0xef, 0xfd, 0x05,
0x59, 0x2e, 0xce, 0x8b, 0xe2, 0x3b, 0x02, 0x86, 0x5b, 0x02, 0xd1, 0xd0, 0x75, 0x1f, 0xbb, 0x11,
0xea, 0x51, 0x3e, 0x02, 0xd4, 0x7b, 0x48, 0x59, 0xc7, 0x3b, 0xe6, 0xb1, 0x3e, 0x2f, 0xcb, 0x53,
0x39, 0x49, 0x7a, 0x4a, 0x9b, 0xdf, 0xce, 0x8a, 0xe2, 0xeb, 0x9c, 0x2c, 0x97, 0x56, 0x82, 0xc1,
0xdd, 0x8c, 0x20, 0x6c, 0xdc, 0xad, 0x7c, 0xd3, 0x10, 0x44, 0xc3, 0x50, 0xbb, 0x84, 0xcd, 0xb1,
0xd1, 0xbe, 0xbd, 0x74, 0x2a, 0x89, 0x09, 0xbe, 0x9a, 0x3f, 0xc3, 0xaf, 0x4c, 0x0c, 0x94, 0x35,
0x55, 0xd8, 0xc0, 0x7a, 0xf5, 0x06, 0x04, 0x9c, 0x5e, 0x0e, 0x04, 0x8a, 0x2f, 0xfd, 0xfe, 0x62,
0x46, 0x14, 0xaf, 0x35, 0x04, 0xe1, 0xc4, 0x5d, 0x1e, 0xe1, 0x5b, 0x2a, 0x39, 0xc2, 0x13, 0x89,
0x04, 0x1f, 0x1f, 0x3f, 0x65, 0x81, 0xca, 0x85, 0x0b, 0xfc, 0xd7, 0x7a, 0x9a, 0xe7, 0xef, 0x8d,
0xf1, 0x0a, 0xec, 0xc0, 0xa9, 0xc9, 0xc2, 0x6e, 0x52, 0x53, 0xfa, 0x34, 0x38, 0xc8, 0xe7, 0x44,
0x71, 0x0b, 0xd6, 0xd2, 0xdc, 0xcd, 0xfb, 0x8c, 0xf5, 0xb8, 0x82, 0x60, 0x4f, 0x2c, 0x7a, 0x64,
0x1f, 0x10, 0x00, 0x9c, 0xa0, 0xbd, 0xb5, 0x80, 0x05, 0x83, 0x32, 0x7c, 0x57, 0x55, 0x14, 0xe1,
0x39, 0x41, 0x78, 0xb3, 0x16, 0x89, 0xf0, 0x25, 0x5d, 0xff, 0x49, 0x0a, 0x77, 0x28, 0x87, 0x2b,
0x35, 0x15, 0x05, 0x03, 0xca, 0xe7, 0x64, 0x32, 0x69, 0x01, 0xec, 0xb0, 0x41, 0x76, 0xc0, 0x46,
0xe4, 0xcc, 0xa1, 0xe6, 0x1c, 0x29, 0x28, 0x2d, 0x48, 0xd2, 0xee, 0x87, 0x58, 0x8c, 0x7f, 0x1f,
0x1e, 0xe6, 0x8b, 0x5e, 0xef, 0x36, 0xc1, 0x2f, 0xb9, 0xe4, 0x9e, 0xf1, 0x76, 0xa3, 0x02, 0x3b,
0x46, 0x96, 0xbd, 0x7d, 0xae, 0x69, 0x3f, 0x0a, 0xd1, 0x28, 0xec, 0xdb, 0xa4, 0x72, 0x97, 0x6a,
0x2a, 0xc2, 0x49, 0x71, 0x62, 0xa7, 0x02, 0xdb, 0x42, 0x3b, 0xa0, 0x58, 0xf7, 0xc9, 0x5f, 0xab,
0x37, 0xb9, 0xc3, 0x98, 0x42, 0x85, 0x30, 0x45, 0xd0, 0xdf, 0xb3, 0xa2, 0x78, 0xbd, 0x6e, 0x31,
0xc0, 0x7b, 0xe4, 0x00, 0xb9, 0x40, 0x4e, 0x9c, 0x20, 0x3c, 0x91, 0xbb, 0xfe, 0xc8, 0x61, 0xae,
0x69, 0x6c, 0xda, 0xc5, 0x16, 0x13, 0xcf, 0x07, 0x8c, 0x9d, 0xac, 0xd5, 0x4f, 0x07, 0xaa, 0x0e,
0x55, 0x85, 0xea, 0x02, 0xcc, 0x09, 0x02, 0x24, 0x1e, 0x8f, 0x73, 0x45, 0x11, 0xb6, 0x99, 0x4b,
0xaf, 0xd8, 0xa0, 0xa6, 0x1b, 0x16, 0x7d, 0x02, 0x18, 0x94, 0xc1, 0x46, 0x80, 0x60, 0x17, 0x94,
0x78, 0x14, 0x61, 0xcb, 0xd9, 0x47, 0x34, 0x34, 0xbf, 0xc6, 0x2e, 0x87, 0x02, 0x4a, 0x06, 0xa0,
0x50, 0x50, 0x99, 0xc1, 0x3b, 0xe6, 0x5b, 0xba, 0x19, 0x90, 0x33, 0x80, 0x82, 0xdd, 0xca, 0x17,
0xbf, 0x8f, 0xdd, 0x72, 0x2a, 0xa1, 0x31, 0xa4, 0x7a, 0x85, 0x27, 0x27, 0x8e, 0xf7, 0x2d, 0xa5,
0x53, 0x86, 0x09, 0xd0, 0x6a, 0xfe, 0xb4, 0x39, 0x39, 0x31, 0xf0, 0x82, 0x0e, 0xfa, 0x18, 0xeb,
0x1d, 0xdf, 0x75, 0x38, 0xb1, 0xd7, 0x23, 0x2c, 0xa6, 0x8c, 0x11, 0x93, 0x2c, 0x35, 0xc9, 0x5a,
0x0b, 0x54, 0x2e, 0x9c, 0x37, 0x77, 0xde, 0xa7, 0x4d, 0xb2, 0xde, 0xac, 0xc0, 0xb4, 0x8e, 0x40,
0xb0, 0x87, 0x1a, 0x7b, 0x19, 0x10, 0x00, 0x9c, 0x20, 0x2a, 0x22, 0x0b, 0x06, 0x65, 0xf8, 0xae,
0x69, 0x90, 0x5b, 0x50, 0x63, 0x67, 0x0d, 0xc3, 0xb0, 0x00, 0x76, 0xd8, 0x20, 0x3b, 0x60, 0x23,
0x72, 0xd6, 0x16, 0x08, 0x9b, 0xb5, 0x1b, 0x6d, 0x29, 0xc2, 0x49, 0x71, 0x62, 0xa7, 0x02, 0xdb,
0x42, 0x3b, 0xa0, 0x58, 0xd7, 0xe4, 0x47, 0x1d, 0x59, 0x07, 0xef, 0x91, 0x03, 0xe4, 0x02, 0x39,
0x71, 0x82, 0xf0, 0x44, 0xee, 0xfa, 0xc3, 0xbd, 0xa6, 0xaa, 0xb2, 0xab, 0x1d, 0x81, 0x50, 0x4d,
0xa8, 0x2a, 0x54, 0x17, 0x60, 0x4e, 0x10, 0x20, 0xd4, 0xd8, 0xa6, 0xc7, 0x23, 0x3c, 0x6b, 0xa9,
0xea, 0xea, 0xc0, 0x86, 0x00, 0x83, 0x32, 0xd8, 0x08, 0x10, 0xec, 0x82, 0x92, 0x0a, 0xa4, 0xb5,
0x3e, 0x6a, 0xa4, 0xcc, 0xba, 0x19, 0x28, 0x67, 0x00, 0x51, 0x63, 0x67, 0xfd, 0x2a, 0x9b, 0x6c,
0xfa, 0x66, 0x68, 0x13, 0x6a, 0x76, 0xf4, 0x2f, 0xe8, 0xbf, 0x03, 0x35, 0x13, 0x7f, 0x00, 0x00,
0x4f, 0xfc, 0x7e, 0x5d, 0x89, 0x9f, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE duplicate_target_xpm[1] = {{ png, sizeof( png ), "duplicate_target_xpm" }};
//EOF
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0xde, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x94, 0x5d, 0x48, 0x14,
0x51, 0x14, 0xc7, 0xcf, 0xce, 0x8c, 0x48, 0xe2, 0x47, 0x42, 0x09, 0xfa, 0xa0, 0x46, 0xbd, 0xd8,
0x4b, 0xbd, 0x05, 0x51, 0x46, 0x4a, 0x06, 0x3e, 0x54, 0x2f, 0x41, 0x21, 0x14, 0xf4, 0x18, 0x61,
0x3e, 0x04, 0x69, 0x5f, 0xde, 0xd5, 0x9d, 0x9d, 0x3b, 0xe3, 0x6a, 0x48, 0x91, 0x59, 0x44, 0xe5,
0xc7, 0x6e, 0x7e, 0xa4, 0x68, 0x45, 0xa5, 0xe8, 0x3e, 0xf8, 0x16, 0xf4, 0x60, 0x49, 0x09, 0x9a,
0x0f, 0x11, 0x84, 0x21, 0x6a, 0xe2, 0x2a, 0x69, 0xeb, 0xed, 0x3f, 0xeb, 0x20, 0xeb, 0x92, 0xb9,
0xee, 0x68, 0x0f, 0xff, 0x39, 0x73, 0xef, 0x3d, 0x73, 0x7f, 0x73, 0xce, 0x3d, 0xf7, 0x90, 0x10,
0x82, 0xfe, 0x87, 0x96, 0x1f, 0x4e, 0xfa, 0x4d, 0x8c, 0x44, 0x54, 0x82, 0x6f, 0xec, 0xa0, 0xe5,
0x4d, 0x46, 0xb1, 0xc9, 0x18, 0xec, 0x14, 0x14, 0xb0, 0xec, 0xd7, 0xd0, 0xfc, 0x6a, 0x09, 0xbb,
0xa0, 0xef, 0x50, 0x10, 0xb0, 0x69, 0xd8, 0xa1, 0x90, 0x75, 0xd2, 0x12, 0xde, 0x7f, 0x58, 0x3f,
0xb0, 0x0a, 0xd4, 0x48, 0xb4, 0xc7, 0x4b, 0x74, 0x04, 0x76, 0x5f, 0x2b, 0xd1, 0xb6, 0x8d, 0x80,
0x82, 0xd0, 0x1d, 0xb7, 0xc7, 0x7d, 0x8a, 0xeb, 0x6a, 0x8f, 0xae, 0xab, 0x47, 0x31, 0xd6, 0x2c,
0x98, 0xb9, 0xbe, 0x44, 0xe5, 0xf4, 0x65, 0x7f, 0x11, 0x89, 0x16, 0x59, 0x7e, 0xd7, 0x84, 0x4f,
0x9b, 0x89, 0x96, 0xda, 0x14, 0x25, 0xf0, 0x4c, 0x92, 0x86, 0x01, 0x4c, 0x8f, 0x0e, 0x84, 0x08,
0x34, 0x43, 0x3b, 0x5d, 0x55, 0xcd, 0x45, 0x47, 0x67, 0x9b, 0x30, 0x3c, 0x9a, 0xe0, 0x1e, 0x57,
0xee, 0x8a, 0x23, 0xa3, 0x19, 0x68, 0xfa, 0x6c, 0xae, 0x24, 0x5a, 0x65, 0xf9, 0x25, 0x36, 0xbf,
0xdf, 0x22, 0x49, 0x1f, 0x5a, 0x15, 0x65, 0x7e, 0x20, 0x35, 0x75, 0xd1, 0xeb, 0x70, 0x8c, 0x3f,
0x22, 0x4a, 0x8a, 0x26, 0xa2, 0x8f, 0xba, 0x47, 0x1b, 0xe8, 0xea, 0xee, 0x14, 0x93, 0x93, 0x13,
0xc2, 0xeb, 0x6b, 0x14, 0xdc, 0x50, 0x57, 0xb4, 0x93, 0xed, 0x78, 0x08, 0x9f, 0xc5, 0xc8, 0x33,
0x02, 0xf0, 0x5e, 0x7f, 0x4a, 0x4a, 0xa0, 0x37, 0x31, 0x31, 0xe0, 0x95, 0xa4, 0xeb, 0x31, 0x47,
0x84, 0xb5, 0x64, 0xa4, 0x72, 0xc4, 0x65, 0x54, 0xf8, 0xad, 0xf4, 0xae, 0x02, 0x21, 0x85, 0xc9,
0x88, 0x66, 0x7e, 0x2c, 0x3b, 0x5b, 0xf8, 0x24, 0xe9, 0x27, 0xd2, 0x59, 0x88, 0xb9, 0xdb, 0x8f,
0x89, 0xb6, 0x6f, 0xe4, 0x8c, 0x5e, 0x99, 0x6b, 0x05, 0x6a, 0x9e, 0x0b, 0x51, 0x05, 0x15, 0xa6,
0xf4, 0x45, 0x82, 0xcc, 0xb3, 0xf1, 0x39, 0x1c, 0x9f, 0x86, 0x32, 0x32, 0x44, 0x5f, 0x52, 0xd2,
0x1c, 0x22, 0x5c, 0xc0, 0x19, 0x0e, 0xac, 0x5f, 0x75, 0x2c, 0x54, 0x75, 0x83, 0xd0, 0x2f, 0x6b,
0x6c, 0xda, 0x41, 0x80, 0x26, 0x2f, 0xf3, 0x4b, 0x3e, 0x44, 0x3e, 0x1c, 0x16, 0x4d, 0x3e, 0x22,
0x98, 0x6f, 0x93, 0xe5, 0xc5, 0xd1, 0xac, 0x2c, 0x31, 0x95, 0x93, 0x23, 0xba, 0xe3, 0xe3, 0x67,
0x00, 0x3f, 0x11, 0xed, 0x3d, 0x9a, 0x85, 0xc6, 0xad, 0x72, 0xfe, 0x66, 0x56, 0xde, 0x0d, 0xbd,
0xd4, 0x00, 0x6c, 0x2e, 0x72, 0x03, 0xc0, 0xf6, 0x22, 0x65, 0x9f, 0x5f, 0x27, 0x24, 0xcc, 0x8e,
0x64, 0x66, 0x9a, 0xe9, 0x9b, 0x40, 0xb9, 0xcb, 0xff, 0x06, 0xad, 0xad, 0x05, 0x89, 0x49, 0x4f,
0x34, 0x43, 0xad, 0x63, 0x8c, 0x29, 0x91, 0x9b, 0xd4, 0x13, 0xc5, 0xa1, 0x10, 0x34, 0x40, 0x83,
0xcd, 0x92, 0xc4, 0xec, 0xb6, 0xa0, 0xf7, 0xeb, 0x5d, 0xca, 0x06, 0xa2, 0x03, 0x6b, 0xdd, 0xa7,
0xd8, 0x1a, 0x24, 0xa3, 0x76, 0xc8, 0x1f, 0xa5, 0xda, 0xed, 0x80, 0xcc, 0x0d, 0x4a, 0xa1, 0x6b,
0x50, 0x0d, 0x3a, 0x46, 0x7d, 0xc8, 0x32, 0xba, 0x65, 0xcd, 0x87, 0xcb, 0x6f, 0x0f, 0x54, 0x4e,
0x2a, 0x6c, 0x27, 0x54, 0x0b, 0x95, 0x58, 0xd6, 0xbc, 0x0e, 0x3c, 0xf4, 0x03, 0x4e, 0x2a, 0xdb,
0x1c, 0x90, 0x09, 0x71, 0x52, 0x7e, 0x65, 0x55, 0xe5, 0x2e, 0x5d, 0xd7, 0x8a, 0x74, 0x9d, 0x65,
0x60, 0xee, 0x90, 0x05, 0xeb, 0x85, 0xba, 0x2d, 0x98, 0x6d, 0x50, 0xad, 0x61, 0x18, 0xbb, 0x8d,
0x6a, 0xde, 0x83, 0x4e, 0xf2, 0x56, 0xf7, 0xb8, 0x7b, 0x54, 0x55, 0x4d, 0x0f, 0xf3, 0xb9, 0x6b,
0x45, 0x69, 0x1b, 0x54, 0x62, 0x54, 0x6b, 0x17, 0xba, 0x5e, 0x74, 0xf4, 0xa3, 0x37, 0xfa, 0xd1,
0x1b, 0xfd, 0xdc, 0x70, 0x2f, 0xab, 0x4a, 0x7d, 0x93, 0xe6, 0x4c, 0x3b, 0x0e, 0x9f, 0x96, 0x2d,
0x8b, 0x08, 0x65, 0x11, 0x87, 0xf6, 0x75, 0xd5, 0xe5, 0x71, 0x9e, 0x87, 0xcf, 0xf3, 0xad, 0x3a,
0xa3, 0x33, 0x50, 0x7f, 0x01, 0xcf, 0x3b, 0x88, 0x2e, 0xd2, 0x2e, 0x33, 0xf9, 0xdc, 0x66, 0x57,
0x5d, 0x31, 0xf4, 0xd4, 0x82, 0x37, 0x98, 0x63, 0xce, 0xd5, 0x9a, 0x62, 0x5e, 0x7c, 0x12, 0xef,
0x57, 0x36, 0xef, 0x1e, 0x31, 0xaa, 0x0b, 0x95, 0xb5, 0x59, 0x65, 0xe5, 0x78, 0xa2, 0xf2, 0x6e,
0x1a, 0x65, 0x87, 0xb9, 0xee, 0x7a, 0x60, 0xb7, 0x33, 0xf8, 0xff, 0x72, 0x31, 0xc3, 0xd5, 0x84,
0xb4, 0x15, 0xe2, 0xac, 0x8e, 0xc1, 0xdf, 0xb1, 0xb5, 0x2d, 0xa8, 0x82, 0x2e, 0xda, 0xee, 0x75,
0xb1, 0xe8, 0x0f, 0xc0, 0x74, 0xed, 0xb7, 0x43, 0x22, 0xa0, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x49,
0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE duplicate_zone_xpm[1] = {{ png, sizeof( png ), "duplicate_zone_xpm" }};
//EOF
/* 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, 0x03, 0x21, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x94, 0x4b, 0x4c, 0x13,
0x51, 0x14, 0x86, 0x6f, 0xdb, 0x81, 0x96, 0xb6, 0xd8, 0x97, 0x7d, 0x4c, 0xa7, 0x9d, 0x3e, 0x10,
0x6c, 0x30, 0x02, 0x0b, 0x7c, 0xe0, 0x13, 0xad, 0xb4, 0x18, 0x4c, 0x04, 0x12, 0xa5, 0xc4, 0x85,
0x21, 0xb8, 0x75, 0x67, 0x5c, 0xb0, 0x76, 0x6f, 0x5c, 0xf9, 0x88, 0x89, 0xc1, 0x40, 0x81, 0xc6,
0x40, 0x14, 0x62, 0x5c, 0x01, 0x01, 0x0c, 0x0b, 0x13, 0x62, 0x10, 0x0d, 0x89, 0xdd, 0xb8, 0x37,
0x90, 0xa0, 0x96, 0x87, 0x8d, 0xc7, 0xfb, 0x8f, 0x14, 0x8b, 0xb1, 0xb1, 0xa5, 0xc8, 0x24, 0x7f,
0x32, 0x3d, 0x9d, 0x3b, 0xdf, 0x3d, 0xe7, 0xff, 0xef, 0x30, 0x22, 0x62, 0x7b, 0xa1, 0x7f, 0x3f,
0xc0, 0xd8, 0x65, 0xae, 0xe1, 0xbd, 0x00, 0xc5, 0xb8, 0x26, 0xff, 0x1b, 0x88, 0x5f, 0x36, 0xae,
0xae, 0x12, 0x81, 0x4d, 0x6b, 0xd4, 0x6c, 0x99, 0xdf, 0xf7, 0x70, 0xd5, 0xef, 0x2a, 0x88, 0x5f,
0x4d, 0xda, 0x12, 0xb6, 0xec, 0xf7, 0x6a, 0x37, 0x24, 0xc9, 0x41, 0x55, 0x41, 0x03, 0xdd, 0x88,
0xb9, 0xd6, 0xcb, 0x74, 0xaa, 0x35, 0x5e, 0xbf, 0xc7, 0xff, 0xd7, 0x16, 0x0d, 0x02, 0x44, 0xa7,
0x55, 0xaf, 0x57, 0x04, 0x25, 0xf2, 0xf9, 0x7c, 0x14, 0x0c, 0x06, 0xe8, 0x5c, 0x83, 0x95, 0x36,
0x16, 0x6b, 0xe8, 0xd3, 0x4c, 0x2d, 0x9d, 0x39, 0x66, 0x4a, 0xe9, 0x75, 0xec, 0x55, 0x51, 0x20,
0x8c, 0xab, 0x54, 0x60, 0x2b, 0x07, 0x2a, 0x7c, 0x64, 0x30, 0xe8, 0x51, 0x20, 0xbf, 0xdf, 0x4f,
0xe1, 0x13, 0x56, 0xfa, 0xfe, 0xc1, 0x47, 0xe9, 0x05, 0x33, 0x2d, 0xcd, 0xd5, 0x92, 0x68, 0x17,
0x56, 0x35, 0x1a, 0xd6, 0x5d, 0x0c, 0xa8, 0xcb, 0x69, 0xd7, 0xa5, 0x65, 0xd9, 0xab, 0x40, 0xb6,
0x40, 0x27, 0x33, 0x20, 0x13, 0xa5, 0xdf, 0x3b, 0x69, 0xe4, 0x41, 0x25, 0xed, 0x33, 0xaa, 0x92,
0x05, 0x83, 0x36, 0x23, 0x1c, 0xe3, 0xc6, 0xbf, 0x76, 0xb9, 0xec, 0x14, 0x08, 0x04, 0x14, 0x00,
0x24, 0x8a, 0x22, 0x1d, 0x0e, 0x19, 0x69, 0xe4, 0x61, 0x35, 0x07, 0x84, 0x14, 0xf5, 0xdd, 0xad,
0x26, 0xb5, 0x5a, 0xf5, 0x83, 0xaf, 0xb9, 0xbe, 0x99, 0x4a, 0x39, 0x5f, 0xd0, 0x30, 0x22, 0x8c,
0x74, 0x55, 0x72, 0xe3, 0xcf, 0x1e, 0xb5, 0x6e, 0x29, 0x54, 0x61, 0x24, 0x6d, 0xa9, 0x40, 0xa2,
0xcb, 0xfc, 0x5b, 0x4e, 0x33, 0xa9, 0x54, 0x2a, 0x2c, 0x9c, 0xc5, 0x3a, 0xae, 0xf3, 0x85, 0x8e,
0xae, 0xa7, 0xbb, 0xc3, 0xb9, 0xbe, 0xb1, 0x58, 0xa7, 0x8c, 0x0a, 0x7a, 0x76, 0xbf, 0x9a, 0x4c,
0x26, 0x13, 0x79, 0xbd, 0x5e, 0xb2, 0x58, 0x2c, 0x64, 0xb3, 0x71, 0x78, 0x28, 0x44, 0x82, 0xc0,
0x56, 0x8b, 0xf1, 0xa8, 0x1e, 0x11, 0x46, 0xba, 0xd2, 0x0b, 0x16, 0xc5, 0x13, 0x8c, 0xca, 0x6c,
0x36, 0x29, 0x10, 0x78, 0x26, 0x49, 0x12, 0x19, 0x8d, 0x7a, 0xd2, 0x6b, 0xd9, 0x48, 0x66, 0x5d,
0x34, 0x2e, 0x1f, 0xba, 0x38, 0xe8, 0xbe, 0x59, 0x50, 0xbc, 0x71, 0x4e, 0x4e, 0x1f, 0x31, 0xa4,
0x96, 0xe6, 0xea, 0xb8, 0xf1, 0x0e, 0x05, 0xb4, 0xdf, 0x66, 0x22, 0xab, 0xd5, 0x4a, 0x2e, 0x97,
0x93, 0x3c, 0x1e, 0x89, 0x04, 0x0d, 0x4b, 0x21, 0xa1, 0x78, 0xbe, 0x39, 0xee, 0xa9, 0x69, 0x19,
0x95, 0x92, 0xad, 0xe3, 0xde, 0xcf, 0x91, 0x21, 0xf7, 0xad, 0x42, 0xce, 0x91, 0x16, 0xe7, 0x04,
0x11, 0x46, 0xba, 0x60, 0xbc, 0xc3, 0x6e, 0xe2, 0xe3, 0x3a, 0x48, 0xe5, 0xe5, 0x06, 0x8c, 0xec,
0x2b, 0x7f, 0xe6, 0x14, 0x9e, 0x6d, 0xea, 0x97, 0xea, 0x5a, 0x46, 0x3d, 0xc9, 0xce, 0x77, 0x01,
0xea, 0x5c, 0x08, 0x50, 0xeb, 0x44, 0x6e, 0x58, 0xce, 0x56, 0x71, 0x4e, 0x10, 0x61, 0xa4, 0x0b,
0xc6, 0x97, 0x96, 0xb0, 0x2f, 0xc6, 0x32, 0x36, 0x94, 0xe9, 0xa4, 0x31, 0x61, 0x37, 0x46, 0xe2,
0xe2, 0xa3, 0xe6, 0x84, 0x38, 0xd9, 0x3e, 0xe3, 0x5b, 0x8b, 0x71, 0x58, 0x74, 0xc8, 0xfd, 0x31,
0x3a, 0xe0, 0x7e, 0x1e, 0xee, 0x95, 0xaa, 0x76, 0xf2, 0x51, 0x45, 0x84, 0x67, 0xb3, 0x6b, 0xe8,
0x04, 0x10, 0xdc, 0x5f, 0x78, 0xe2, 0x3c, 0xde, 0x36, 0x2d, 0x7f, 0x8b, 0xcd, 0x07, 0xa8, 0x39,
0xe1, 0x7e, 0x8c, 0x5a, 0xa4, 0x5f, 0xbc, 0xc6, 0xa1, 0xb7, 0x8b, 0xfa, 0x7a, 0xff, 0xf2, 0xc4,
0x93, 0x44, 0x27, 0x80, 0x84, 0x9f, 0x3a, 0xbb, 0x33, 0xa0, 0xc8, 0xa0, 0xeb, 0x05, 0x6a, 0x91,
0x3e, 0xf1, 0xce, 0xa5, 0x31, 0x69, 0x25, 0x7b, 0x8c, 0xf9, 0x80, 0xe4, 0xcc, 0x39, 0x41, 0xba,
0x60, 0x3c, 0x3c, 0xc1, 0xb8, 0x00, 0x80, 0x3a, 0xe6, 0xfc, 0x8a, 0x47, 0xed, 0x53, 0xf2, 0xaa,
0x52, 0x9b, 0x92, 0x53, 0x1d, 0x6f, 0xfd, 0xdb, 0x3c, 0x2b, 0xe8, 0xc3, 0x88, 0x08, 0x23, 0x5d,
0x78, 0x29, 0x3c, 0x41, 0x17, 0x10, 0x7e, 0x2b, 0xb5, 0xf9, 0xed, 0xb5, 0xab, 0x6f, 0x7c, 0xe9,
0x68, 0x42, 0x7c, 0x59, 0x30, 0x48, 0x99, 0x3f, 0xdf, 0x21, 0x76, 0x0a, 0xe3, 0xe1, 0x09, 0xc6,
0x85, 0x4e, 0xf0, 0xf2, 0x68, 0x5c, 0x5c, 0x44, 0x2d, 0x3a, 0x20, 0x4e, 0xb5, 0x4d, 0x7a, 0xd3,
0xfc, 0x7e, 0xac, 0x71, 0x82, 0x09, 0x3b, 0x02, 0x65, 0x60, 0x48, 0x57, 0xae, 0x30, 0x44, 0xe3,
0xee, 0x2e, 0xbe, 0x91, 0xf1, 0x2b, 0x09, 0xa6, 0xc9, 0xdb, 0xa3, 0x5c, 0x42, 0x84, 0x91, 0x2e,
0x18, 0x0f, 0x4f, 0x94, 0x8e, 0x78, 0x27, 0x80, 0x84, 0x7b, 0x1d, 0x0d, 0xd9, 0x90, 0xa2, 0x40,
0xca, 0xce, 0x79, 0x84, 0x91, 0x2e, 0x18, 0x0f, 0x4f, 0x30, 0xae, 0x3f, 0x3b, 0xd9, 0x15, 0x50,
0xb6, 0x67, 0x30, 0x1e, 0x9e, 0xfc, 0x0d, 0xb2, 0x2b, 0xa0, 0x2d, 0xcf, 0x78, 0xba, 0x32, 0xc6,
0xff, 0x37, 0x50, 0x3e, 0xfa, 0x09, 0x65, 0x16, 0x60, 0xbf, 0x0d, 0xb1, 0xac, 0x3b, 0x00, 0x00,
0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE move_target_xpm[1] = {{ png, sizeof( png ), "move_target_xpm" }};
//EOF
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0xcf, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x95, 0xcb, 0x4f, 0x13,
0x51, 0x14, 0xc6, 0x6f, 0xa2, 0x74, 0xd1, 0x44, 0x8c, 0x1b, 0x71, 0xa6, 0x50, 0x68, 0x54, 0x8c,
0xb2, 0x70, 0xa1, 0x46, 0xdc, 0x35, 0xa9, 0x76, 0x30, 0x43, 0x42, 0x21, 0xe1, 0x15, 0x56, 0x4d,
0x17, 0xd6, 0x08, 0xb2, 0x31, 0x04, 0x31, 0xd8, 0x19, 0xe2, 0x3f, 0x60, 0x7c, 0x2c, 0x94, 0x68,
0x6b, 0xa0, 0x85, 0x06, 0x5f, 0x05, 0x4d, 0x11, 0xd3, 0xd6, 0xc2, 0x46, 0x4c, 0x8c, 0x01, 0x8d,
0x24, 0xa2, 0xae, 0x74, 0x85, 0x1b, 0x12, 0x10, 0x23, 0xc9, 0xf8, 0x9d, 0xe1, 0x42, 0x0a, 0x42,
0xd2, 0x99, 0x41, 0x17, 0xbf, 0xde, 0x3b, 0xa7, 0x33, 0xe7, 0xbb, 0xe7, 0x7c, 0x67, 0x5a, 0xa6,
0x69, 0x1a, 0xfb, 0x1f, 0xac, 0x7c, 0x28, 0x4c, 0x64, 0x2a, 0x3b, 0x6f, 0x18, 0x85, 0x05, 0x41,
0x61, 0xfe, 0x42, 0x2b, 0x0f, 0x8d, 0x81, 0xc7, 0x06, 0x19, 0x07, 0x6e, 0xa3, 0x42, 0xf4, 0x60,
0x78, 0x8d, 0x10, 0x7b, 0x88, 0xb5, 0x6f, 0x5d, 0xec, 0x6f, 0x92, 0x56, 0x84, 0x5e, 0x82, 0x41,
0x70, 0x11, 0xdc, 0xe4, 0x95, 0xc6, 0xb7, 0x5b, 0x68, 0xcc, 0xae, 0xda, 0x6b, 0x54, 0x55, 0xf5,
0x2b, 0x8a, 0x32, 0x09, 0xee, 0xb6, 0x2a, 0xad, 0xc7, 0x11, 0x1f, 0xe6, 0x07, 0x20, 0xd1, 0x51,
0xab, 0x42, 0x94, 0x2c, 0x8c, 0xe4, 0x41, 0xa0, 0x81, 0x79, 0xbe, 0xfe, 0x90, 0x3b, 0xe5, 0x3d,
0xac, 0x87, 0x9d, 0xc4, 0xf7, 0x95, 0xb8, 0xb7, 0x1d, 0xeb, 0x33, 0x2b, 0x42, 0xe3, 0x58, 0xeb,
0x91, 0x78, 0x06, 0x7c, 0x03, 0xf6, 0x1c, 0xd1, 0xdf, 0x60, 0x09, 0x2c, 0x80, 0x03, 0x5c, 0xc0,
0xa4, 0x50, 0x88, 0xa5, 0xb1, 0x9e, 0x43, 0xa2, 0x31, 0xb0, 0x88, 0xf6, 0x9d, 0xc1, 0x7a, 0x8f,
0x0b, 0x65, 0xc0, 0x23, 0xbe, 0xbf, 0x85, 0xfb, 0xfc, 0xbc, 0x03, 0xa6, 0x2a, 0x7a, 0x02, 0x12,
0x10, 0xf0, 0x20, 0xd9, 0x2f, 0x9e, 0x94, 0x98, 0xb4, 0x75, 0xd8, 0x0e, 0xb3, 0xcb, 0xac, 0x1c,
0xfb, 0x09, 0x3a, 0x44, 0x57, 0x57, 0x57, 0x11, 0x9e, 0x49, 0x5a, 0x19, 0x86, 0x04, 0xb8, 0xde,
0xae, 0xb4, 0x3b, 0x91, 0xf0, 0x2a, 0xf0, 0x15, 0x74, 0x17, 0x1c, 0x45, 0xec, 0x15, 0x18, 0xc2,
0x21, 0x6a, 0xb8, 0xb8, 0x8a, 0xeb, 0x56, 0xf0, 0xda, 0xfc, 0x78, 0xab, 0x6c, 0x08, 0xeb, 0x0b,
0x30, 0xc0, 0xdb, 0x43, 0x93, 0x16, 0x01, 0x29, 0x9b, 0x62, 0x3b, 0x02, 0x91, 0x8f, 0x60, 0xae,
0x45, 0x69, 0x29, 0x44, 0xec, 0x0b, 0x09, 0x49, 0x51, 0x67, 0xc5, 0xd9, 0x01, 0xb1, 0xcd, 0xdc,
0x0b, 0xbb, 0x91, 0x10, 0xeb, 0xc7, 0x7d, 0x51, 0x54, 0x15, 0xa0, 0xaa, 0xb0, 0xb6, 0xe1, 0xfa,
0xc2, 0xa1, 0xdb, 0xbb, 0xeb, 0xe5, 0x61, 0xc7, 0xac, 0x2f, 0x55, 0x32, 0xe7, 0x1d, 0x14, 0x2f,
0x59, 0x17, 0x5a, 0x21, 0xed, 0x50, 0x1c, 0xe4, 0xd5, 0x77, 0xf0, 0x55, 0xee, 0xdf, 0x7f, 0x4c,
0x1e, 0x2e, 0x9e, 0x6d, 0x9e, 0x76, 0x69, 0xcd, 0xef, 0x5d, 0x9a, 0x2f, 0xbd, 0xb5, 0x98, 0x31,
0xa1, 0x10, 0x8b, 0xf1, 0x77, 0xad, 0xb3, 0xbb, 0xe7, 0x8a, 0xe6, 0x0b, 0x57, 0x8c, 0x56, 0xc5,
0x85, 0x4c, 0xdd, 0x44, 0xe9, 0x52, 0x13, 0xc4, 0xa4, 0x41, 0xf1, 0x93, 0x14, 0x13, 0x9f, 0x7a,
0x22, 0x8e, 0xf2, 0xad, 0x7e, 0xbd, 0x83, 0xfc, 0x07, 0x32, 0x99, 0x07, 0x1f, 0xdc, 0x77, 0x0e,
0x56, 0x37, 0xf4, 0x9e, 0x98, 0xa6, 0x77, 0xea, 0xf4, 0xfd, 0xa2, 0xca, 0xda, 0x71, 0xe7, 0x42,
0xd3, 0x94, 0x4b, 0xab, 0x8a, 0x8b, 0xbd, 0x94, 0xcf, 0xdb, 0x2f, 0xb4, 0x40, 0xb4, 0x63, 0x33,
0x21, 0x32, 0xd6, 0x9d, 0x0f, 0xae, 0x1b, 0xbb, 0x02, 0x72, 0xa2, 0xf8, 0x33, 0x55, 0x42, 0x22,
0x9e, 0x07, 0x45, 0x81, 0x55, 0x21, 0xef, 0xc0, 0xbe, 0x04, 0xc5, 0xbc, 0x7d, 0xc2, 0xb5, 0xea,
0x11, 0xc7, 0x7c, 0x6e, 0x1b, 0x0d, 0xfd, 0x79, 0xd1, 0x74, 0x91, 0xf1, 0xe4, 0x09, 0xb5, 0x8b,
0x04, 0x88, 0xc6, 0xb7, 0x65, 0xba, 0x47, 0x75, 0x59, 0xe7, 0x4f, 0x3d, 0x96, 0x75, 0x2e, 0x36,
0xbe, 0x2b, 0x5b, 0xe7, 0x99, 0x21, 0x21, 0x1a, 0x61, 0x9a, 0x2e, 0x4a, 0x4a, 0x9e, 0x50, 0x15,
0x04, 0x5d, 0xeb, 0xb1, 0xa9, 0xf5, 0xb1, 0x86, 0x37, 0xa5, 0xcb, 0x52, 0x5c, 0x78, 0x6e, 0x58,
0x48, 0xef, 0x3f, 0x4e, 0x48, 0x27, 0x25, 0xe3, 0xc9, 0x13, 0x6a, 0x17, 0x55, 0x42, 0xc9, 0xa5,
0xa8, 0x30, 0x43, 0x31, 0x29, 0x26, 0x64, 0x6b, 0x33, 0x25, 0xcb, 0xd8, 0x8f, 0xb8, 0xd3, 0x6c,
0xa7, 0x29, 0xa1, 0x55, 0x31, 0x9a, 0x2e, 0xda, 0x6f, 0x36, 0x0c, 0x52, 0x54, 0xf4, 0xe3, 0x20,
0xa9, 0xfa, 0x38, 0xdb, 0x61, 0xca, 0xa3, 0x5c, 0x68, 0x84, 0x69, 0xba, 0xc8, 0x78, 0xf2, 0x44,
0xaf, 0x08, 0x95, 0x90, 0x88, 0x27, 0xb2, 0xf7, 0x54, 0xae, 0x88, 0x25, 0x21, 0xfd, 0xe4, 0x18,
0x61, 0x9a, 0x2e, 0x32, 0x9e, 0x3c, 0xa1, 0x76, 0x6d, 0xac, 0x64, 0x5b, 0x84, 0x72, 0x3d, 0x23,
0xe3, 0xc9, 0x93, 0xcd, 0x44, 0xb6, 0x45, 0x68, 0xcd, 0x33, 0x4c, 0xd7, 0xaa, 0xf1, 0xff, 0x4c,
0x28, 0x1f, 0xfe, 0x00, 0x7b, 0xdc, 0xc2, 0x19, 0xcd, 0xc3, 0x9e, 0x72, 0x00, 0x00, 0x00, 0x00,
0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE move_zone_xpm[1] = {{ png, sizeof( png ), "move_zone_xpm" }};
//EOF
<?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="svg18970"
inkscape:version="0.48.4 r9939"
sodipodi:docname="duplicate_footprint.svg">
<metadata
id="metadata18987">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1005"
id="namedview18985"
showgrid="true"
inkscape:zoom="1"
inkscape:cx="18.169469"
inkscape:cy="8.9416575"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg18970"
inkscape:object-paths="true"
inkscape:object-nodes="true">
<inkscape:grid
type="xygrid"
id="grid3029"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs18972" />
<use
x="0"
y="0"
xlink:href="#g3527"
id="use3537"
transform="translate(0,12)"
width="26"
height="26"
style="opacity:0.75" />
<g
id="g3527"
transform="translate(-1,1)">
<rect
y="2.499999"
x="2.5"
height="7"
width="10"
id="rect3503"
style="fill:none;stroke:#545454;stroke-width:1;stroke-opacity:1" />
<rect
y="1.5"
x="3.5"
height="3"
width="2"
id="rect3505"
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1" />
<rect
y="1.5"
x="6.5"
height="3"
width="2"
id="rect3509"
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1"
id="rect3514"
width="2"
height="3"
x="9.5"
y="1.5" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1"
id="rect3516"
width="2"
height="3"
x="3.5"
y="7.5" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1"
id="rect3518"
width="2"
height="3"
x="6.5"
y="7.5" />
<rect
y="7.5"
x="9.5"
height="3"
width="2"
id="rect3520"
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1" />
</g>
<use
style="opacity:0.75"
height="26"
width="26"
transform="translate(13,12)"
id="use3539"
xlink:href="#g3527"
y="0"
x="0" />
<use
x="0"
y="0"
xlink:href="#g3527"
id="use3559"
transform="translate(13,0)"
width="26"
height="26"
style="opacity:0.75" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="26"
height="26"
id="svg18970">
<metadata
id="metadata18987">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs18972">
<mask
id="w">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3301"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="x">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3304"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="q">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3307"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="v">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3310"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="r">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3313"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="u">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3316"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="s">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3319"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="t">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3322"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
</defs>
<g
transform="translate(-1,-2)"
id="g3744">
<path
d="M 12,10 A 5,5 0 1 1 2,10 5,5 0 1 1 12,10 z"
transform="translate(0.5,-1.5)"
id="path3680"
style="fill:#fcd40f;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
<path
d="m 12.488902,8.4889022 -5.1095923,0 0.1095925,-5 c 0,0 -5.09534,1.1698255 -5,5 3.454097,-0.014719 4.7357278,0 4.7357278,0 L 7.4889022,13.488902 C 11.423077,13.335543 12.708024,9.9574012 12.488902,8.4889022"
id="path3736"
style="fill:#000000;stroke:none" />
<path
d="m 7.5,2 0,13"
id="path3676"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 14,8.5 1,8.5"
id="path3678"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 6.5,4.625 C 5.0912245,4.9882125 3.9882125,6.0912245 3.625,7.5 l 2.375,0 0.5,0 0,-0.5 0,-2.375 z"
id="path3733"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
d="M 11.375,7.5 C 11.011788,6.0912245 9.908776,4.9882125 8.5,4.625 l 0,2.375 0,0.5 0.5,0 2.375,0 z"
id="path3738"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
d="M 8.5,12.375 C 9.908776,12.011788 11.011788,10.908776 11.375,9.5 L 9,9.5 l -0.5,0 0,0.5 0,2.375 z"
id="path3740"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
d="m 3.625,9.5 c 0.363212,1.408776 1.466224,2.511788 2.875,2.875 L 6.5,10 6.5,9.5 6,9.5 3.625,9.5 z"
id="path3742"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
</g>
<use
transform="translate(13,0)"
id="use3755"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3744" />
<use
transform="translate(13,13)"
id="use3670"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3744" />
<use
transform="translate(0,13)"
id="use3672"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3744" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="26"
height="26"
id="svg18970">
<metadata
id="metadata18987">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs18972">
<mask
id="w">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3301"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="x">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3304"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="q">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3307"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="v">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3310"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="r">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3313"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="u">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3316"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="s">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3319"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="t">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3322"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
</defs>
<g
transform="translate(20,-1.5)"
id="g3939">
<path
d="m -15.5,8 5,0 2.1269625,4.84375"
id="path3917"
style="fill:none;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="m -18.5,3 0,10 8.25,0 -1.25,-3.25 c -0.781147,0.971226 -1.5,1.75 -3,1.75 -1.932997,0 -3.5,-1.5670035 -3.5,-3.5 0,-1.9329967 1.567003,-3.5 3.5,-3.5 1.295542,0 2.33235,0.4225334 2.9375,1.46875 l 1.9375,0 L -8.5,8.5 -8.5,3 z"
id="rect3811"
style="fill:#008000;fill-opacity:0.62745098;stroke:#008000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m -13.46875,7 a 1.53125,1.53125 0 1 1 -3.0625,0 1.53125,1.53125 0 1 1 3.0625,0 z"
transform="matrix(1.0081529,0,0,1.0081529,0.57855937,0.9429297)"
id="path3915"
style="fill:#eeeeec;stroke:#888a85;stroke-width:0.99191302;stroke-opacity:1" />
</g>
<use
id="use4178"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3939" />
<use
transform="translate(13,0)"
id="use4180"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3939" />
<use
transform="translate(13,13)"
id="use4182"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3939" />
<use
transform="translate(0,13)"
id="use4184"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3939" />
</svg>
<?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="svg18970"
inkscape:version="0.48.4 r9939"
sodipodi:docname="duplicate_footprint.svg">
<metadata
id="metadata18987">
<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>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1005"
id="namedview18985"
showgrid="false"
inkscape:zoom="8"
inkscape:cx="17.037549"
inkscape:cy="12.025341"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg18970"
inkscape:object-paths="true"
inkscape:object-nodes="true">
<inkscape:grid
type="xygrid"
id="grid3029"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs18972" />
<use
x="0"
y="0"
xlink:href="#g3527"
id="use3537"
transform="translate(9,11)"
width="26"
height="26"
style="opacity:0.75" />
<g
id="g3527">
<path
transform="matrix(2.5100458,0,0,2.3016337,-3.0200916,-8.6115753)"
sodipodi:open="true"
sodipodi:end="8.3331823"
sodipodi:start="4.5226534"
d="M 1.8770992,6.360044 A 0.65165043,0.65165043 0 1 1 1.6995435,7.578251"
sodipodi:ry="0.65165043"
sodipodi:rx="0.65165043"
sodipodi:cy="7"
sodipodi:cx="2"
id="path3525"
style="fill:none;fill-opacity:1;stroke:#545454;stroke-width:0.41604573000000000;stroke-opacity:1"
sodipodi:type="arc" />
<rect
y="3.4999998"
x="1.5"
height="7.9999995"
width="14"
id="rect3503"
style="fill:none;stroke:#545454;stroke-width:1;stroke-opacity:1" />
<rect
y="1.5"
x="3.5"
height="3"
width="2"
id="rect3505"
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1" />
<rect
y="1.5"
x="7.5"
height="3"
width="2"
id="rect3509"
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1"
id="rect3514"
width="2"
height="3"
x="11.5"
y="1.5" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1"
id="rect3516"
width="2"
height="3"
x="3.5"
y="10.5" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1"
id="rect3518"
width="2"
height="3"
x="7.5"
y="10.5" />
<rect
y="10.5"
x="11.5"
height="3"
width="2"
id="rect3520"
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-opacity:1" />
</g>
<g
id="g18103"
transform="matrix(0.96595582,-0.25870707,0.25870707,0.96595582,0.84350936,-11.031754)">
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
d="m 14.365778,23.401859 c 0.202438,-4.960549 -1.242615,-6.237163 -5.6595543,-5.884794 4.3461583,1.028691 4.0709493,2.218515 3.7207813,5.66635 l -1.626346,-0.20242 2.198044,3.513613 2.945419,-2.915713 z"
style="fill:#ef2929;fill-opacity:1;stroke:#a40000;stroke-width:1"
id="path17320" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="26"
height="26"
id="svg18970">
<metadata
id="metadata18987">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs18972">
<mask
id="w">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3301"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="x">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3304"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="q">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3307"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="v">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3310"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="r">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3313"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="u">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3316"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="s">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3319"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="t">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3322"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
</defs>
<g
transform="matrix(0.92021476,-0.39141384,0.39141384,0.92021476,-2.5098229,-9.469619)"
id="g18103">
<path
d="m 14.365778,23.401859 c 0.202438,-4.960549 -1.242615,-6.237163 -5.6595543,-5.884794 4.3461583,1.028691 4.0709493,2.218515 3.7207813,5.66635 l -1.626346,-0.20242 2.198044,3.513613 2.945419,-2.915713 z"
id="path17320"
style="fill:#ef2929;fill-opacity:1;stroke:#a40000;stroke-width:1" />
</g>
<g
transform="translate(-1,0)"
id="g3744">
<path
d="M 12,10 A 5,5 0 1 1 2,10 5,5 0 1 1 12,10 z"
transform="translate(1.5,-1.5)"
id="path3680"
style="fill:#fcd40f;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
<path
d="m 13.488902,8.4889022 -5.1095923,0 0.1095925,-5 c 0,0 -5.09534,1.1698255 -5,5 3.454097,-0.014719 4.7357278,0 4.7357278,0 L 8.4889022,13.488902 C 12.423077,13.335543 13.708024,9.9574012 13.488902,8.4889022"
id="path3736"
style="fill:#000000;stroke:none" />
<path
d="m 8.5,1 0,15"
id="path3676"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 16,8.5 1,8.5"
id="path3678"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 7.5,4.625 C 6.0912245,4.9882125 4.9882125,6.0912245 4.625,7.5 l 2.375,0 0.5,0 0,-0.5 0,-2.375 z"
id="path3733"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
d="M 12.375,7.5 C 12.011788,6.0912245 10.908776,4.9882125 9.5,4.625 l 0,2.375 0,0.5 0.5,0 2.375,0 z"
id="path3738"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
d="m 9.5,12.375 c 1.408776,-0.363212 2.511788,-1.466224 2.875,-2.875 l -2.375,0 -0.5,0 0,0.5 0,2.375 z"
id="path3740"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
d="m 4.625,9.5 c 0.363212,1.408776 1.466224,2.511788 2.875,2.875 L 7.5,10 7.5,9.5 7,9.5 4.625,9.5 z"
id="path3742"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
</g>
<use
transform="translate(10,9)"
id="use3755"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g3744" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="26"
height="26"
id="svg18970">
<metadata
id="metadata18987">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs18972">
<mask
id="w">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3301"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="x">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3304"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="q">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3307"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="v">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3310"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="r">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3313"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="u">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3316"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="s">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3319"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="t">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3322"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
</defs>
<g
transform="translate(20,-1.5)"
id="g3939">
<path
d="m -15.5,8 5,0 2.1269625,4.84375"
id="path3917"
style="fill:none;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="m -18.5,3 0,11 8.75,0 -1.75,-4.25 c -0.781147,0.971226 -1.5,1.75 -3,1.75 -1.932997,0 -3.5,-1.5670035 -3.5,-3.5 0,-1.9329967 1.567003,-3.5 3.5,-3.5 1.295542,0 2.33235,0.4225334 2.9375,1.46875 l 1.9375,0 L -7.5,11 l 0,-8 z"
id="rect3811"
style="fill:#008000;fill-opacity:0.62745098;stroke:#008000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m -13.46875,7 a 1.53125,1.53125 0 1 1 -3.0625,0 1.53125,1.53125 0 1 1 3.0625,0 z"
transform="matrix(1.0081529,0,0,1.0081529,0.57855937,0.9429297)"
id="path3915"
style="fill:#eeeeec;stroke:#888a85;stroke-width:0.99191302;stroke-opacity:1" />
</g>
<g
transform="translate(20,-1.5)"
id="g4253">
<path
d="m -15.5,8 5,0 2.1269625,4.84375"
id="path4255"
style="fill:none;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="m -18.5,3 0,11 8.75,0 -1.75,-4.25 c -0.781147,0.971226 -1.5,1.75 -3,1.75 -1.932997,0 -3.5,-1.5670035 -3.5,-3.5 0,-1.9329967 1.567003,-3.5 3.5,-3.5 1.295542,0 2.33235,0.4225334 2.9375,1.46875 l 1.9375,0 L -7.5,11 l 0,-8 z"
id="path4257"
style="fill:#008000;fill-opacity:0.62745098;stroke:#008000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m -13.46875,7 a 1.53125,1.53125 0 1 1 -3.0625,0 1.53125,1.53125 0 1 1 3.0625,0 z"
transform="matrix(1.0081529,0,0,1.0081529,0.57855937,0.9429297)"
id="path4259"
style="fill:#eeeeec;stroke:#888a85;stroke-width:0.99191302;stroke-opacity:1" />
</g>
<use
transform="translate(12,12)"
id="use4261"
style="opacity:0.75"
x="0"
y="0"
width="26"
height="26"
xlink:href="#g4253" />
<g
transform="matrix(0.92021476,-0.39141384,0.39141384,0.92021476,-2.5098229,-7.469619)"
id="g18103">
<path
d="m 14.365778,23.401859 c 0.202438,-4.960549 -1.242615,-6.237163 -5.6595543,-5.884794 4.3461583,1.028691 4.0709493,2.218515 3.7207813,5.66635 l -1.626346,-0.20242 2.198044,3.513613 2.945419,-2.915713 z"
id="path17320"
style="fill:#ef2929;fill-opacity:1;stroke:#a40000;stroke-width:1" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="48"
width="48"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="move_zone.svg">
<metadata
id="metadata66">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1005"
id="namedview64"
showgrid="false"
inkscape:object-nodes="true"
inkscape:zoom="11.313708"
inkscape:cx="10.835114"
inkscape:cy="24.527054"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
<inkscape:grid
type="xygrid"
id="grid3043" />
</sodipodi:namedview>
<defs
id="defs4">
<filter
id="c"
height="1.2585"
width="1.2406"
color-interpolation-filters="sRGB"
y="-.12927"
x="-.12029">
<feGaussianBlur
stdDeviation="1.6250782"
id="feGaussianBlur7" />
</filter>
<linearGradient
id="d"
y2="36.848"
gradientUnits="userSpaceOnUse"
x2="41.355"
gradientTransform="matrix(1.4411,0,0,2.9984,-102.04,-72.032)"
y1="32.207"
x1="39.182">
<stop
stop-color="#fff"
offset="0"
id="stop10" />
<stop
stop-color="#afadff"
offset="1"
id="stop12" />
</linearGradient>
<mask
id="t">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3322"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="s">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3319"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="u">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3316"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="r">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3313"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="v">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3310"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="q">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3307"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="x">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3304"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
<mask
id="w">
<rect
style="fill:#ffffff;fill-rule:evenodd"
id="rect3301"
y="-3.7337"
x="-4.6403999"
height="26.091999"
width="25.032" />
</mask>
</defs>
<path
style="fill:#59d421;fill-opacity:1;stroke:#44a118;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 33.5,21.5 -5,5 3,0 0,5 -5,0 0,-3 -5,5 5,5 0,-3 5,0 0,5 -3,0 5,5 5,-5 -3,0 0,-5 5,0 0,3 5,-5 -5,-5 0,3 -5,0 0,-5 3,0 z"
id="path3045"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccccccccccccc" />
<g
id="g3128"
transform="translate(6.75,4)">
<g
id="g3744"
transform="matrix(2,0,0,2,-6.75,-4)">
<path
style="fill:#fcd40f;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-opacity:1"
id="path3680"
transform="translate(1.5,-1.5)"
d="M 12,10 A 5,5 0 1 1 2,10 5,5 0 1 1 12,10 z"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:none"
id="path3736"
d="m 13.488902,8.4889022 -5.1095923,0 0.1095925,-5 c 0,0 -5.09534,1.1698255 -5,5 3.454097,-0.014719 4.7357278,0 4.7357278,0 L 8.4889022,13.488902 C 12.423077,13.335543 13.708024,9.9574012 13.488902,8.4889022"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3676"
d="m 8.5,1 0,15"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3678"
d="M 16,8.5 1,8.5"
inkscape:connector-curvature="0" />
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:0.5px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
id="path3738"
d="M 12.625,7.75 C 12.361225,6.2859818 11,4.7050669 9.25,4.375 l 0,3.375 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:0.5px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
id="path3742"
d="M 4.375,9.25 C 4.7271635,11 6.5,12.5 7.75,12.625 l 0,-3.375 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<g
id="g3147"
transform="matrix(0,1,-1,0,17,0)">
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:0.5px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
id="path3143"
d="M 12.625,7.75 C 12.361225,6.2859818 11,4.7050669 9.25,4.375 l 0,3.375 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.25;color:#000000;fill:none;stroke:#eeeeec;stroke-width:0.5px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
id="path3145"
d="M 4.375,9.25 C 4.7271635,11 6.5,12.5 7.75,12.625 l 0,-3.375 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="48"
height="48"
id="svg2">
<metadata
id="metadata66">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs4">
<filter
x="-0.12029"
y="-0.12927"
width="1.2406"
height="1.2585"
color-interpolation-filters="sRGB"
id="c">
<feGaussianBlur
id="feGaussianBlur7"
stdDeviation="1.6250782" />
</filter>
<linearGradient
x1="39.181999"
y1="32.207001"
x2="41.355"
y2="36.848"
id="d"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4411,0,0,2.9984,-102.04,-72.032)">
<stop
id="stop10"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop12"
style="stop-color:#afadff;stop-opacity:1"
offset="1" />
</linearGradient>
<mask
id="t">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3322"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="s">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3319"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="u">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3316"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="r">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3313"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="v">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3310"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="q">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3307"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="x">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3304"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
<mask
id="w">
<rect
width="25.032"
height="26.091999"
x="-4.6403999"
y="-3.7337"
id="rect3301"
style="fill:#ffffff;fill-rule:evenodd" />
</mask>
</defs>
<g
transform="translate(3.5,3.5)"
id="g3063">
<path
d="m 0,0 0,26 20.5,0 -5.5,-11.5 0.0625,0 C 13.8522,16.592433 11.591084,18 9,18 5.1340066,18 2,14.865993 2,11 2,7.1340066 5.1340066,4 9,4 c 2.591084,0 4.8522,1.4075669 6.0625,3.5 L 20,7.5 26,20 26,0 z"
id="rect3811"
style="fill:#008000;fill-opacity:0.62745098;stroke:#008000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g
transform="matrix(1.6382539,0,0,1.5572263,1.2572207,0.36314149)"
id="g16">
<rect
width="16"
height="16"
x="0"
y="0"
id="rect18"
style="fill-opacity:0" />
</g>
<path
d="m 13,11 4.5,0 6,13"
id="path3765"
style="fill:none;stroke:#808080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m 12.5,10 a 3.5,3.5 0 1 1 -7,0 3.5,3.5 0 1 1 7,0 z"
transform="translate(0,1)"
id="path3815"
style="fill:none;stroke:#808080;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<path
d="m 33.5,21.5 -5,5 3,0 0,5 -5,0 0,-3 -5,5 5,5 0,-3 5,0 0,5 -3,0 5,5 5,-5 -3,0 0,-5 5,0 0,3 5,-5 -5,-5 0,3 -5,0 0,-5 3,0 z"
id="path3045"
style="fill:#59d421;fill-opacity:1;stroke:#44a118;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>
......@@ -103,8 +103,11 @@ EXTERN_BITMAP( annotate_down_right_xpm )
EXTERN_BITMAP( annotate_right_down_xpm )
EXTERN_BITMAP( annotate_xpm )
EXTERN_BITMAP( array_line_xpm )
EXTERN_BITMAP( array_module_xpm )
EXTERN_BITMAP( array_pad_xpm )
EXTERN_BITMAP( array_target_xpm )
EXTERN_BITMAP( array_text_xpm )
EXTERN_BITMAP( array_zone_xpm )
EXTERN_BITMAP( auto_associe_xpm )
EXTERN_BITMAP( auto_delete_track_xpm )
EXTERN_BITMAP( auto_track_width_xpm )
......@@ -178,8 +181,11 @@ EXTERN_BITMAP( drag_track_segment_xpm )
EXTERN_BITMAP( drc_off_xpm )
EXTERN_BITMAP( drc_xpm )
EXTERN_BITMAP( duplicate_line_xpm )
EXTERN_BITMAP( duplicate_module_xpm )
EXTERN_BITMAP( duplicate_pad_xpm )
EXTERN_BITMAP( duplicate_target_xpm )
EXTERN_BITMAP( duplicate_text_xpm )
EXTERN_BITMAP( duplicate_zone_xpm )
EXTERN_BITMAP( edges_sketch_xpm )
EXTERN_BITMAP( edit_comp_footprint_xpm )
EXTERN_BITMAP( edit_component_xpm )
......@@ -338,8 +344,10 @@ EXTERN_BITMAP( move_polygon_xpm )
EXTERN_BITMAP( move_rectangle_xpm )
EXTERN_BITMAP( move_sheet_xpm )
EXTERN_BITMAP( move_text_xpm )
EXTERN_BITMAP( move_target_xpm )
EXTERN_BITMAP( move_track_segment_xpm )
EXTERN_BITMAP( move_track_xpm )
EXTERN_BITMAP( move_zone_xpm )
EXTERN_BITMAP( move_xpm )
EXTERN_BITMAP( mw_add_gap_xpm )
EXTERN_BITMAP( mw_add_line_xpm )
......
......@@ -78,6 +78,9 @@ class BOARD_ITEM : public EDA_ITEM
protected:
LAYER_ID m_Layer;
static int getTrailingInt( wxString aStr );
static int getNextNumberInSequence( std::set<int> aSeq, bool aFillSequenceGaps);
public:
BOARD_ITEM( BOARD_ITEM* aParent, KICAD_T idtype ) :
......
......@@ -193,6 +193,19 @@ protected:
*/
void duplicateZone( wxDC* aDC, ZONE_CONTAINER* aZone );
/**
* Function moveExact
* Move the selected item exactly
*/
void moveExact();
/**
* Function duplicateItems
* Duplicate selected item if possible and start a move
* @param aIncrement increment the item number if appropriate
*/
void duplicateItem( bool aIncrement );
// protected so that PCB::IFACE::CreateWindow() is the only factory.
PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent );
......@@ -459,6 +472,15 @@ public:
*/
int OnHotkeyCopyItem();
/**
* Function OnHotkeyDuplicateOrArrayItem
* Duplicate an item (optionally incrementing if necessary and possible)
* or invoke array dialog and create an array
* @param aIdCommand = the hotkey command id
* @return true if item duplicated or arrayed
*/
bool OnHotkeyDuplicateOrArrayItem( int aIdCommand );
/**
* Function OnHotkeyMoveItem
* Moves or drag the item (footprint, track, text .. ) found under the mouse cursor
......
......@@ -54,6 +54,10 @@
#include <class_track.h>
#include <class_zone.h>
#include <class_marker_pcb.h>
#include <class_drawsegment.h>
#include <class_pcb_text.h>
#include <class_mire.h>
#include <class_dimension.h>
/* This is an odd place for this, but CvPcb won't link if it is
......@@ -2593,6 +2597,131 @@ void BOARD::ReplaceNetlist( NETLIST& aNetlist, bool aDeleteSinglePadNets,
}
BOARD_ITEM* BOARD::DuplicateAndAddItem( const BOARD_ITEM* aItem,
bool aIncrementReferences )
{
BOARD_ITEM* new_item = NULL;
switch( aItem->Type() )
{
case PCB_MODULE_T:
{
MODULE* new_module = new MODULE( *static_cast<const MODULE*>( aItem ) );
if( aIncrementReferences )
{
// Take the next available module number
new_module->IncrementReference( true );
}
m_Modules.PushBack( new_module );
new_item = new_module;
break;
}
case PCB_TEXT_T:
{
const TEXTE_PCB* old_text = static_cast<const TEXTE_PCB*>( aItem );
TEXTE_PCB* new_text = new TEXTE_PCB( *old_text );
m_Drawings.PushBack( new_text );
new_item = new_text;
break;
}
case PCB_LINE_T:
{
DRAWSEGMENT* new_edge = new DRAWSEGMENT(
*static_cast<const DRAWSEGMENT*>(aItem) );
m_Drawings.PushBack( new_edge );
new_item = new_edge;
break;
}
case PCB_TRACE_T:
{
TRACK* new_track = new TRACK(
*static_cast<const TRACK*>(aItem) );
m_Track.PushBack( new_track );
new_item = new_track;
break;
}
case PCB_ZONE_AREA_T:
{
ZONE_CONTAINER* new_zone = new ZONE_CONTAINER(
*static_cast<const ZONE_CONTAINER*>(aItem) );
m_ZoneDescriptorList.push_back( new_zone );
new_item = new_zone;
break;
}
case PCB_TARGET_T:
{
PCB_TARGET* new_target = new PCB_TARGET(
*static_cast<const PCB_TARGET*>(aItem) );
m_Drawings.PushBack( new_target );
new_item = new_target;
break;
}
case PCB_DIMENSION_T:
{
DIMENSION* new_dim = new DIMENSION(
*static_cast<const DIMENSION*>(aItem) );
m_Drawings.PushBack( new_dim );
new_item = new_dim;
break;
}
default:
// Un-handled item for duplication
wxASSERT_MSG( false, "Duplication not supported for items of class "
+ aItem->GetClass() );
break;
}
return new_item;
}
wxString BOARD::GetNextModuleReferenceWithPrefix( const wxString& aPrefix,
bool aFillSequenceGaps )
{
wxString nextRef;
std::set<int> usedNumbers;
for( MODULE* module = m_Modules; module; module = module->Next() )
{
const wxString ref = module->GetReference();
wxString remainder;
// ONly interested in modules with the right prefix
if( !ref.StartsWith( aPrefix, &remainder ) )
continue;
// the suffix must be a number
if ( !remainder.IsNumber() )
continue;
long number;
if( remainder.ToCLong( &number ) )
usedNumbers.insert( number );
}
int nextNum = 1;
if( usedNumbers.size() )
{
nextNum = getNextNumberInSequence( usedNumbers, aFillSequenceGaps );
nextRef = wxString::Format( wxT( "%s%i" ), aPrefix, nextNum );
}
return nextRef;
}
/* Extracts the board outlines and build a closed polygon
* from lines, arcs and circle items on edge cut layer
* Any closed outline inside the main outline is a hole
......
......@@ -301,6 +301,16 @@ public:
*/
BOARD_ITEM* Remove( BOARD_ITEM* aBoardItem );
BOARD_ITEM* DuplicateAndAddItem( const BOARD_ITEM* aItem,
bool aIncrementReferences );
/**
* Function GetNextModuleReferenceWithPrefix
* Get the next available module reference with this prefix
*/
wxString GetNextModuleReferenceWithPrefix( const wxString& aPrefix,
bool aFillSequenceGaps );
/**
* Function GetRatsnest()
* returns list of missing connections between components/tracks.
......
......@@ -195,3 +195,51 @@ void BOARD_ITEM::ViewGetLayers( int aLayers[], int& aCount ) const
aCount = 1;
aLayers[0] = m_Layer;
}
int BOARD_ITEM::getTrailingInt( wxString aStr )
{
int number = 0;
int base = 1;
// Trim and extract the trailing numeric part
int index = aStr.Len() - 1;
while( index >= 0 )
{
const char chr = aStr.GetChar( index );
if( chr < '0' || chr > '9' )
break;
number += ( chr - '0' ) * base;
base *= 10;
index--;
}
return number;
}
int BOARD_ITEM::getNextNumberInSequence( std::set<int> aSeq, bool aFillSequenceGaps)
{
// By default go to the end of the sequence
int candidate = *aSeq.end();
// Filling in gaps in pad numbering
if( aFillSequenceGaps )
{
// start at the beginning
candidate = *aSeq.begin();
for( std::set<int>::iterator it = aSeq.begin(),
itEnd = aSeq.end(); it != itEnd; ++it )
{
if( *it - candidate > 1 )
break;
candidate = *it;
}
}
candidate++;
return candidate;
}
......@@ -1156,6 +1156,10 @@ BOARD_ITEM* MODULE::DuplicateAndAddItem( const BOARD_ITEM* aItem,
new_item = new_edge;
break;
}
case PCB_MODULE_T:
// Ignore the module itself
break;
default:
// Un-handled item for duplication
wxASSERT_MSG( false, "Duplication not supported for items of class "
......@@ -1166,6 +1170,7 @@ BOARD_ITEM* MODULE::DuplicateAndAddItem( const BOARD_ITEM* aItem,
return new_item;
}
wxString MODULE::GetNextPadName( bool aFillSequenceGaps ) const
{
std::set<int> usedNumbers;
......@@ -1173,39 +1178,55 @@ wxString MODULE::GetNextPadName( bool aFillSequenceGaps ) const
// Create a set of used pad numbers
for( D_PAD* pad = Pads(); pad; pad = pad->Next() )
{
wxString padName = pad->GetPadName();
int padNumber = 0;
int base = 1;
// Trim and extract the trailing numeric part
while( padName.Len() && padName.Last() >= '0' && padName.Last() <= '9' )
{
padNumber += ( padName.Last() - '0' ) * base;
padName.RemoveLast();
base *= 10;
}
int padNumber = getTrailingInt( pad->GetPadName() );
usedNumbers.insert( padNumber );
}
// By default go to the end of the sequence
int candidate = *usedNumbers.end();
const int nextNum = getNextNumberInSequence( usedNumbers, aFillSequenceGaps );
// Filling in gaps in pad numbering
if( aFillSequenceGaps )
return wxString::Format( wxT( "%i" ), nextNum );
}
wxString MODULE::GetReferencePrefix() const
{
wxString prefix = GetReference();
int strIndex = prefix.length() - 1;
while( strIndex >= 0 )
{
// start at the beginning
candidate = *usedNumbers.begin();
const wxUniChar chr = prefix.GetChar( strIndex );
for( std::set<int>::iterator it = usedNumbers.begin(),
itEnd = usedNumbers.end(); it != itEnd; ++it )
{
if( *it - candidate > 1 )
break;
// numeric suffix
if( chr >= '0' && chr <= '9' )
break;
candidate = *it;
}
strIndex--;
}
prefix = prefix.Mid( 0, strIndex );
return prefix;
}
bool MODULE::IncrementReference( bool aFillSequenceGaps )
{
BOARD* board = GetBoard();
if( !board )
return false;
bool success = false;
const wxString prefix = GetReferencePrefix();
const wxString newReference = board->GetNextModuleReferenceWithPrefix(
prefix, aFillSequenceGaps );
if( !newReference.IsEmpty() )
{
SetReference( newReference );
success = true;
}
return wxString::Format( wxT( "%i" ), ++candidate );
return success;
}
......@@ -396,6 +396,15 @@ public:
m_Reference->SetText( aReference );
}
/**
* Function GetReference prefix
* Gets the alphabetic prefix of the module reference - e.g.
* R1 -> R
* IC34 -> IC
* @return the reference prefix (may be empty)
*/
wxString GetReferencePrefix() const;
/**
* Function GetValue
* @return const wxString& - the value text.
......@@ -422,6 +431,17 @@ public:
TEXTE_MODULE& Value() const { return *m_Value; }
TEXTE_MODULE& Reference() const { return *m_Reference; }
/**
* Function INcrementReference
* Increments the module's reference, if possible. A reference with
* a numerical suffix and an optional alphabetical prefix can be
* incremented: "A1" and "1" can be, "B" can't.
*
* @param aFillSequenceGaps if true, the next reference in a sequence
* like A1,A3,A4 will be A2. If false, it will be A5.
* @return true if the reference was incremented.
*/
bool IncrementReference( bool aFillSequenceGaps );
/**
* Function FindPadByName
......@@ -474,6 +494,11 @@ public:
int GetPlacementCost90() const { return m_CntRot90; }
void SetPlacementCost90( int aCost ) { m_CntRot90 = aCost; }
/**
* Function DuplicateAndAddItem
* Duplicate a given item within the module
* @return the new item, or NULL if the item could not be duplicated
*/
BOARD_ITEM* DuplicateAndAddItem( const BOARD_ITEM* item,
bool aIncrementPadNumbers );
......
......@@ -46,13 +46,17 @@ static const wxString charSetDescriptions[] =
};
DIALOG_CREATE_ARRAY::DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, ARRAY_OPTIONS** settings ) :
DIALOG_CREATE_ARRAY::DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, wxPoint aOrigPos,
ARRAY_OPTIONS** aSettings ) :
DIALOG_CREATE_ARRAY_BASE( aParent ),
CONFIG_SAVE_RESTORE_WINDOW( m_options.m_optionsSet ),
m_settings( settings )
m_settings( aSettings ),
m_originalItemPosition( aOrigPos )
{
// Set up numbering scheme drop downs
m_choicePriAxisNumbering->Set( boost::size( charSetDescriptions ), charSetDescriptions );
m_choiceSecAxisNumbering->Set( boost::size( charSetDescriptions ), charSetDescriptions );
m_choiceCircNumberingType->Set( boost::size( charSetDescriptions ), charSetDescriptions );;
m_choicePriAxisNumbering->SetSelection( 0 );
m_choiceSecAxisNumbering->SetSelection( 0 );
......@@ -77,6 +81,7 @@ DIALOG_CREATE_ARRAY::DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, ARRAY_OPTIONS
Add( m_entryCircAngle, m_options.m_circAngle );
Add( m_entryCircCount, m_options.m_circCount );
Add( m_entryRotateItemsCb, m_options.m_circRotate );
Add( m_entryCircNumberingStart, m_options.m_circNumberingOffset );
Add( m_gridTypeNotebook, m_options.m_arrayTypeTab );
......@@ -90,7 +95,7 @@ DIALOG_CREATE_ARRAY::DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, ARRAY_OPTIONS
RestoreConfigToControls();
// load units into labels
// Load units into labels
{
const wxString lengthUnit = GetAbbreviatedUnitsLabel( g_UserUnit );
......@@ -102,7 +107,9 @@ DIALOG_CREATE_ARRAY::DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, ARRAY_OPTIONS
m_unitLabelOffsetY->SetLabelText( lengthUnit );
}
// Run the callbacks once to process the dialog contents
setControlEnablement();
calculateCircularArrayProperties();
}
......@@ -116,6 +123,10 @@ void DIALOG_CREATE_ARRAY::OnParameterChanged( wxCommandEvent& event )
{
setControlEnablement();
}
if( evObj == m_entryCentreX || evObj == m_entryCentreY )
{
calculateCircularArrayProperties();
}
}
......@@ -211,23 +222,16 @@ void DIALOG_CREATE_ARRAY::OnOkClick( wxCommandEvent& event )
{
ARRAY_GRID_OPTIONS* newGrid = new ARRAY_GRID_OPTIONS();
bool ok = true;
double x, y;
// ints
ok = ok && m_entryNx->GetValue().ToLong( &newGrid->m_nx );
ok = ok && m_entryNy->GetValue().ToLong( &newGrid->m_ny );
ok = ok && m_entryDx->GetValue().ToDouble( &x );
ok = ok && m_entryDy->GetValue().ToDouble( &y );
newGrid->m_delta.x = From_User_Unit( g_UserUnit, x );
newGrid->m_delta.y = From_User_Unit( g_UserUnit, y );
newGrid->m_delta.x = DoubleValueFromString( g_UserUnit, m_entryDx->GetValue() );
newGrid->m_delta.y = DoubleValueFromString( g_UserUnit, m_entryDy->GetValue() );
ok = ok && m_entryOffsetX->GetValue().ToDouble( &x );
ok = ok && m_entryOffsetY->GetValue().ToDouble( &y );
newGrid->m_offset.x = From_User_Unit( g_UserUnit, x );
newGrid->m_offset.y = From_User_Unit( g_UserUnit, y );
newGrid->m_offset.x = DoubleValueFromString( g_UserUnit, m_entryOffsetX->GetValue() );
newGrid->m_offset.y = DoubleValueFromString( g_UserUnit, m_entryOffsetY->GetValue() );
ok = ok && m_entryStagger->GetValue().ToLong( &newGrid->m_stagger );
......@@ -272,28 +276,26 @@ void DIALOG_CREATE_ARRAY::OnOkClick( wxCommandEvent& event )
ARRAY_CIRCULAR_OPTIONS* newCirc = new ARRAY_CIRCULAR_OPTIONS();
bool ok = true;
double x, y;
ok = ok && m_entryCentreX->GetValue().ToDouble( &x );
ok = ok &&m_entryCentreY->GetValue().ToDouble( &y );
newCirc->m_centre.x = From_User_Unit( g_UserUnit, x );
newCirc->m_centre.y = From_User_Unit( g_UserUnit, y );
newCirc->m_centre.x = DoubleValueFromString( g_UserUnit, m_entryCentreX->GetValue() );
newCirc->m_centre.y = DoubleValueFromString( g_UserUnit, m_entryCentreY->GetValue() );
ok = ok && m_entryCircAngle->GetValue().ToDouble( &newCirc->m_angle );
ok = ok && m_entryCircCount->GetValue().ToLong( &newCirc->m_nPts );
newCirc->m_angle = DoubleValueFromString( DEGREES, m_entryCircAngle->GetValue() );
ok = ok && m_entryCircCount->GetValue().ToLong( &newCirc->m_nPts );
newCirc->m_rotateItems = m_entryRotateItemsCb->GetValue();
newCirc->m_shouldRenumber = m_checkBoxCircRestartNumbering->GetValue();
// this is only correct if you set the choice up according to the enum size and order
// This is only correct if you set the choice up according to the enum size and order
ok = ok && m_choiceCircNumberingType->GetSelection() < NUMBERING_TYPE_Max;
// mind undefined casts to enums (should not be able to happen)
// Mind undefined casts to enums (should not be able to happen)
if( ok )
newCirc->m_numberingType =
(ARRAY_NUMBERING_TYPE_T) m_choiceCircNumberingType->GetSelection();
ok = ok && m_entryCircNumberingStart->GetValue().ToLong( &newCirc->m_numberingOffset );
// Only use settings if all values are good
if( ok )
newSettings = newCirc;
......@@ -343,6 +345,22 @@ void DIALOG_CREATE_ARRAY::setControlEnablement()
}
void DIALOG_CREATE_ARRAY::calculateCircularArrayProperties()
{
wxPoint centre;
centre.x = DoubleValueFromString( g_UserUnit, m_entryCentreX->GetValue() );
centre.y = DoubleValueFromString( g_UserUnit, m_entryCentreY->GetValue() );
// FInd the radius, etc of the circle
centre -= m_originalItemPosition;
const double radius = VECTOR2I(centre.x, centre.y).EuclideanNorm();
m_labelCircRadiusValue->SetLabelText( StringFromValue( g_UserUnit, int(radius), true ) );
}
// ARRAY OPTION implementation functions --------------------------------------
std::string DIALOG_CREATE_ARRAY::ARRAY_OPTIONS::getCoordinateNumber( int n,
......@@ -375,6 +393,16 @@ std::string DIALOG_CREATE_ARRAY::ARRAY_OPTIONS::getCoordinateNumber( int n,
}
wxString DIALOG_CREATE_ARRAY::ARRAY_OPTIONS::InterpolateNumberIntoString(
int aN, const wxString& aPattern ) const
{
wxString newStr( aPattern );
newStr.Replace( "%s", GetItemNumber( aN ), false );
return newStr;
}
int DIALOG_CREATE_ARRAY::ARRAY_GRID_OPTIONS::GetArraySize() const
{
return m_nx * m_ny;
......@@ -430,9 +458,9 @@ void DIALOG_CREATE_ARRAY::ARRAY_GRID_OPTIONS::TransformItem( int n, BOARD_ITEM*
}
std::string DIALOG_CREATE_ARRAY::ARRAY_GRID_OPTIONS::GetItemNumber( int n ) const
wxString DIALOG_CREATE_ARRAY::ARRAY_GRID_OPTIONS::GetItemNumber( int n ) const
{
std::string itemNum;
wxString itemNum;
if( m_2dArrayNumbering )
{
......@@ -466,7 +494,7 @@ void DIALOG_CREATE_ARRAY::ARRAY_CIRCULAR_OPTIONS::TransformItem( int n, BOARD_IT
angle = 3600.0 * n / float(m_nPts);
else
// n'th step
angle = m_angle * n * 10.0;
angle = m_angle * n;
item->Rotate( m_centre, angle );
......@@ -476,7 +504,7 @@ void DIALOG_CREATE_ARRAY::ARRAY_CIRCULAR_OPTIONS::TransformItem( int n, BOARD_IT
}
std::string DIALOG_CREATE_ARRAY::ARRAY_CIRCULAR_OPTIONS::GetItemNumber( int n ) const
wxString DIALOG_CREATE_ARRAY::ARRAY_CIRCULAR_OPTIONS::GetItemNumber( int aN ) const
{
return getCoordinateNumber( n, m_numberingType );
return getCoordinateNumber( aN + m_numberingOffset, m_numberingType );
}
......@@ -224,7 +224,8 @@ public:
virtual void TransformItem( int n, BOARD_ITEM* item,
const wxPoint& rotPoint ) const = 0;
virtual int GetArraySize() const = 0;
virtual std::string GetItemNumber( int n ) const = 0;
virtual wxString GetItemNumber( int n ) const = 0;
virtual wxString InterpolateNumberIntoString( int n, const wxString& pattern ) const;
bool ShouldRenumberItems() const
{
......@@ -263,7 +264,7 @@ protected:
void TransformItem( int n, BOARD_ITEM* item, const wxPoint& rotPoint ) const; // override virtual
int GetArraySize() const; // override virtual
std::string GetItemNumber( int n ) const; // override virtual
wxString GetItemNumber( int n ) const; // override virtual
private:
wxPoint getGridCoords( int n ) const;
......@@ -276,7 +277,8 @@ private:
m_nPts( 0 ),
m_angle( 0.0f ),
m_rotateItems( false ),
m_numberingType( NUMBERING_NUMERIC )
m_numberingType( NUMBERING_NUMERIC ),
m_numberingOffset( 0 )
{}
long m_nPts;
......@@ -284,27 +286,38 @@ private:
wxPoint m_centre;
bool m_rotateItems;
ARRAY_NUMBERING_TYPE_T m_numberingType;
long m_numberingOffset;
void TransformItem( int n, BOARD_ITEM* item, const wxPoint& rotPoint ) const; // override virtual
int GetArraySize() const; // override virtual
std::string GetItemNumber( int n ) const; // override virtual
wxString GetItemNumber( int n ) const; // override virtual
};
// Constructor and destructor
DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, ARRAY_OPTIONS** settings );
DIALOG_CREATE_ARRAY( PCB_BASE_FRAME* aParent, wxPoint aOrigPos, ARRAY_OPTIONS** settings );
virtual ~DIALOG_CREATE_ARRAY() {};
private:
// the settings object returned to the caller
// we update the caller's object and never have ownership
/**
* The settings object returned to the caller.
* We update the caller's object and never have ownership
*/
ARRAY_OPTIONS** m_settings;
/*
* The position of the original item(s), used for finding radius, etc
*/
const wxPoint m_originalItemPosition;
// Event callbacks
void OnParameterChanged( wxCommandEvent& event );
void OnCancelClick( wxCommandEvent& event );
void OnOkClick( wxCommandEvent& event );
// Internal callback handlers
void setControlEnablement();
void calculateCircularArrayProperties();
struct CREATE_ARRAY_DIALOG_ENTRIES
{
......@@ -334,13 +347,14 @@ private:
std::string m_gridPriNumberingOffset, m_gridSecNumberingOffset;
std::string m_circCentreX, m_circCentreY,
m_circAngle, m_circCount;
m_circAngle, m_circCount, m_circNumberingOffset;
bool m_circRotate;
int m_arrayTypeTab;
};
static CREATE_ARRAY_DIALOG_ENTRIES m_options;
};
#endif // __DIALOG_CREATE_ARRAY__
......@@ -203,37 +203,45 @@ DIALOG_CREATE_ARRAY_BASE::DIALOG_CREATE_ARRAY_BASE( wxWindow* parent, wxWindowID
m_unitLabelCentreY->Wrap( -1 );
gbSizer2->Add( m_unitLabelCentreY, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_labelCircRadius = new wxStaticText( m_circularPanel, wxID_ANY, _("Radius:"), wxDefaultPosition, wxDefaultSize, 0 );
m_labelCircRadius->Wrap( -1 );
gbSizer2->Add( m_labelCircRadius, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
m_labelCircRadiusValue = new wxStaticText( m_circularPanel, wxID_ANY, _("0 mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_labelCircRadiusValue->Wrap( -1 );
gbSizer2->Add( m_labelCircRadiusValue, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
m_labelCircAngle = new wxStaticText( m_circularPanel, wxID_ANY, _("Angle:"), wxDefaultPosition, wxDefaultSize, 0 );
m_labelCircAngle->Wrap( -1 );
gbSizer2->Add( m_labelCircAngle, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
gbSizer2->Add( m_labelCircAngle, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_entryCircAngle = new wxTextCtrl( m_circularPanel, wxID_ANY, _("0"), wxDefaultPosition, wxDefaultSize, 0 );
m_entryCircAngle->SetToolTip( _("Positive angles represent an anti-clockwise rotation. An angle of 0 will produce a full circle divided evenly into \"Count\" portions.") );
gbSizer2->Add( m_entryCircAngle, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
gbSizer2->Add( m_entryCircAngle, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
m_unitLabelCircAngle = new wxStaticText( m_circularPanel, wxID_ANY, _("deg"), wxDefaultPosition, wxDefaultSize, 0 );
m_unitLabelCircAngle->Wrap( -1 );
gbSizer2->Add( m_unitLabelCircAngle, wxGBPosition( 2, 2 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL, 5 );
gbSizer2->Add( m_unitLabelCircAngle, wxGBPosition( 3, 2 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_labelCircCount = new wxStaticText( m_circularPanel, wxID_ANY, _("Count:"), wxDefaultPosition, wxDefaultSize, 0 );
m_labelCircCount->Wrap( -1 );
gbSizer2->Add( m_labelCircCount, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
gbSizer2->Add( m_labelCircCount, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_entryCircCount = new wxTextCtrl( m_circularPanel, wxID_ANY, _("4"), wxDefaultPosition, wxDefaultSize, 0 );
m_entryCircCount->SetToolTip( _("How many items in the array.") );
gbSizer2->Add( m_entryCircCount, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
gbSizer2->Add( m_entryCircCount, wxGBPosition( 4, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
m_labelCircRotate = new wxStaticText( m_circularPanel, wxID_ANY, _("Rotate:"), wxDefaultPosition, wxDefaultSize, 0 );
m_labelCircRotate->Wrap( -1 );
gbSizer2->Add( m_labelCircRotate, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
gbSizer2->Add( m_labelCircRotate, wxGBPosition( 5, 0 ), wxGBSpan( 1, 1 ), wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_entryRotateItemsCb = new wxCheckBox( m_circularPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_entryRotateItemsCb->SetValue(true);
m_entryRotateItemsCb->SetToolTip( _("Rotate the item as well as move it - multi-selections will be rotated together") );
gbSizer2->Add( m_entryRotateItemsCb, wxGBPosition( 4, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
gbSizer2->Add( m_entryRotateItemsCb, wxGBPosition( 5, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
bSizer4->Add( gbSizer2, 1, wxEXPAND, 5 );
......@@ -254,6 +262,19 @@ DIALOG_CREATE_ARRAY_BASE::DIALOG_CREATE_ARRAY_BASE( wxWindow* parent, wxWindowID
m_choiceCircNumberingType->SetSelection( 0 );
bSizer6->Add( m_choiceCircNumberingType, 0, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizer7;
bSizer7 = new wxBoxSizer( wxHORIZONTAL );
m_labelCircNumStart = new wxStaticText( m_circularPanel, wxID_ANY, _("Numbering start:"), wxDefaultPosition, wxDefaultSize, 0 );
m_labelCircNumStart->Wrap( -1 );
bSizer7->Add( m_labelCircNumStart, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
m_entryCircNumberingStart = new wxTextCtrl( m_circularPanel, wxID_ANY, _("1"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer7->Add( m_entryCircNumberingStart, 0, wxALL, 5 );
bSizer6->Add( bSizer7, 0, wxEXPAND, 5 );
bSizer4->Add( bSizer6, 1, wxEXPAND, 5 );
......@@ -289,8 +310,8 @@ DIALOG_CREATE_ARRAY_BASE::DIALOG_CREATE_ARRAY_BASE( wxWindow* parent, wxWindowID
m_entryStagger->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_checkBoxGridRestartNumbering->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_radioBoxGridNumberingScheme->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreX->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreY->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreX->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreY->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCircAngle->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCircCount->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_stdButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnCancelClick ), NULL, this );
......@@ -310,8 +331,8 @@ DIALOG_CREATE_ARRAY_BASE::~DIALOG_CREATE_ARRAY_BASE()
m_entryStagger->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_checkBoxGridRestartNumbering->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_radioBoxGridNumberingScheme->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreX->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreY->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreX->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCentreY->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCircAngle->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_entryCircCount->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnParameterChanged ), NULL, this );
m_stdButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_CREATE_ARRAY_BASE::OnCancelClick ), NULL, this );
......
......@@ -3046,11 +3046,11 @@
</object>
</object>
</object>
<object class="notebookpage" expanded="0">
<object class="notebookpage" expanded="1">
<property name="bitmap"></property>
<property name="label">Circular</property>
<property name="select">0</property>
<object class="wxPanel" expanded="0">
<object class="wxPanel" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
......@@ -3124,16 +3124,16 @@
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="0">
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer4</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGridBagSizer" expanded="0">
<object class="wxGridBagSizer" expanded="1">
<property name="empty_cell_size"></property>
<property name="flexible_direction">wxBOTH</property>
<property name="growablecols"></property>
......@@ -3317,8 +3317,8 @@
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter">OnParameterChanged</event>
<event name="OnText">OnParameterChanged</event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
......@@ -3583,8 +3583,8 @@
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter">OnParameterChanged</event>
<event name="OnText">OnParameterChanged</event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
......@@ -3676,12 +3676,184 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="gbsizeritem" expanded="1">
<property name="border">5</property>
<property name="colspan">1</property>
<property name="column">0</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</property>
<property name="row">2</property>
<property name="rowspan">1</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">Radius:</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_labelCircRadius</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="gbsizeritem" expanded="1">
<property name="border">5</property>
<property name="colspan">1</property>
<property name="column">1</property>
<property name="flag">wxALL</property>
<property name="row">2</property>
<property name="rowspan">1</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">0 mm</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_labelCircRadiusValue</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="gbsizeritem" expanded="0">
<property name="border">5</property>
<property name="colspan">1</property>
<property name="column">0</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT</property>
<property name="row">2</property>
<property name="row">3</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
......@@ -3767,7 +3939,7 @@
<property name="colspan">1</property>
<property name="column">1</property>
<property name="flag">wxALL</property>
<property name="row">2</property>
<property name="row">3</property>
<property name="rowspan">1</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
......@@ -3861,7 +4033,7 @@
<property name="colspan">1</property>
<property name="column">2</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="row">2</property>
<property name="row">3</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
......@@ -3947,7 +4119,7 @@
<property name="colspan">1</property>
<property name="column">0</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT</property>
<property name="row">3</property>
<property name="row">4</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
......@@ -4033,7 +4205,7 @@
<property name="colspan">1</property>
<property name="column">1</property>
<property name="flag">wxALL</property>
<property name="row">3</property>
<property name="row">4</property>
<property name="rowspan">1</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
......@@ -4127,7 +4299,7 @@
<property name="colspan">1</property>
<property name="column">0</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT</property>
<property name="row">4</property>
<property name="row">5</property>
<property name="rowspan">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
......@@ -4213,7 +4385,7 @@
<property name="colspan">1</property>
<property name="column">1</property>
<property name="flag">wxALL</property>
<property name="row">4</property>
<property name="row">5</property>
<property name="rowspan">1</property>
<object class="wxCheckBox" expanded="0">
<property name="BottomDockable">1</property>
......@@ -4569,6 +4741,191 @@
<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="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer7</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL</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">Numbering start:</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_labelCircNumStart</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</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_entryCircNumberingStart</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">1</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="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
......
......@@ -86,6 +86,8 @@ class DIALOG_CREATE_ARRAY_BASE : public DIALOG_SHIM
wxStaticText* m_labelCentreY;
wxTextCtrl* m_entryCentreY;
wxStaticText* m_unitLabelCentreY;
wxStaticText* m_labelCircRadius;
wxStaticText* m_labelCircRadiusValue;
wxStaticText* m_labelCircAngle;
wxTextCtrl* m_entryCircAngle;
wxStaticText* m_unitLabelCircAngle;
......@@ -96,6 +98,8 @@ class DIALOG_CREATE_ARRAY_BASE : public DIALOG_SHIM
wxCheckBox* m_checkBoxCircRestartNumbering;
wxStaticText* m_labelCircNumbering;
wxChoice* m_choiceCircNumberingType;
wxStaticText* m_labelCircNumStart;
wxTextCtrl* m_entryCircNumberingStart;
wxStdDialogButtonSizer* m_stdButtons;
wxButton* m_stdButtonsOK;
wxButton* m_stdButtonsCancel;
......
......@@ -54,6 +54,9 @@
#include <dialog_global_edit_tracks_and_vias.h>
#include <invoke_pcb_dialog.h>
#include <dialog_move_exact.h>
#include <dialog_create_array.h>
#include <tool/tool_manager.h>
#include <tools/common_actions.h>
......@@ -1188,6 +1191,19 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
}
break;
case ID_POPUP_PCB_MOVE_EXACT:
moveExact();
break;
case ID_POPUP_PCB_DUPLICATE_ITEM:
case ID_POPUP_PCB_DUPLICATE_ITEM_AND_INCREMENT:
duplicateItem( id == ID_POPUP_PCB_DUPLICATE_ITEM_AND_INCREMENT );
break;
case ID_POPUP_PCB_CREATE_ARRAY:
createArray();
break;
case ID_MENU_PCB_CLEAN:
Clean_Pcb();
break;
......@@ -1486,3 +1502,196 @@ void PCB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
break;
}
}
void PCB_EDIT_FRAME::moveExact()
{
wxPoint translation;
double rotation = 0;
DIALOG_MOVE_EXACT dialog( this, translation, rotation );
int ret = dialog.ShowModal();
if( ret == DIALOG_MOVE_EXACT::MOVE_OK )
{
BOARD_ITEM* item = GetScreen()->GetCurItem();
// Could be moved or rotated
SaveCopyInUndoList( item, UR_CHANGED );
item->Move( translation );
item->Rotate( item->GetPosition(), rotation );
m_canvas->Refresh();
}
m_canvas->MoveCursorToCrossHair();
}
void PCB_EDIT_FRAME::duplicateItem( bool aIncrement )
{
BOARD_ITEM* item = GetScreen()->GetCurItem();
int move_cmd = 0;
BOARD_ITEM* new_item = GetBoard()->DuplicateAndAddItem(
item, aIncrement );
SaveCopyInUndoList( new_item, UR_NEW );
if( new_item )
{
switch( new_item->Type() )
{
case PCB_MODULE_T:
move_cmd = ID_POPUP_PCB_MOVE_MODULE_REQUEST;
break;
case PCB_TEXT_T:
move_cmd = ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST;
break;
case PCB_LINE_T:
move_cmd = ID_POPUP_PCB_MOVE_DRAWING_REQUEST;
break;
case PCB_ZONE_AREA_T:
move_cmd = ID_POPUP_PCB_MOVE_ZONE_OUTLINES;
break;
case PCB_TRACE_T:
move_cmd = ID_POPUP_PCB_MOVE_TRACK_SEGMENT;
break;
case PCB_TARGET_T:
move_cmd = ID_POPUP_PCB_MOVE_MIRE_REQUEST;
break;
case PCB_DIMENSION_T:
move_cmd = ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST;
break;
case PCB_PAD_T:
move_cmd = ID_POPUP_PCB_MOVE_PAD_REQUEST;
break;
default:
break;
}
if( move_cmd )
{
SetMsgPanel( new_item );
SetCurItem( new_item );
m_canvas->MoveCursorToCrossHair();
// pick up the item and start moving
PostCommandMenuEvent( move_cmd );
}
}
}
void PCB_BASE_EDIT_FRAME::createArray()
{
BOARD_ITEM* item = GetScreen()->GetCurItem();
if( !item )
return;
bool editingModule = NULL != dynamic_cast<FOOTPRINT_EDIT_FRAME*>( this );
BOARD* board = GetBoard();
MODULE* module = static_cast<MODULE*>( item->GetParent() );
DIALOG_CREATE_ARRAY::ARRAY_OPTIONS* array_opts = NULL;
const wxPoint rotPoint = item->GetCenter();
DIALOG_CREATE_ARRAY dialog( this, rotPoint, &array_opts );
int ret = dialog.ShowModal();
if( ret == DIALOG_CREATE_ARRAY::CREATE_ARRAY_OK && array_opts != NULL )
{
PICKED_ITEMS_LIST newItemsList;
if( editingModule )
{
// modedit saves everything upfront
SaveCopyInUndoList( board->m_Modules, UR_MODEDIT );
}
else
{
// We may also change the original item
SaveCopyInUndoList( item, UR_CHANGED );
}
wxString cachedString;
if( item->Type() == PCB_MODULE_T )
{
cachedString = static_cast<MODULE*>( item )->GetReferencePrefix();
}
else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( item ) )
{
// Copy the text (not just take a reference
cachedString = text->GetText();
}
for( int ptN = 0; ptN < array_opts->GetArraySize(); ptN++)
{
BOARD_ITEM* new_item = NULL;
if( ptN == 0 )
{
new_item = item;
}
else
{
if( editingModule )
new_item = module->DuplicateAndAddItem( item, true );
else
new_item = board->DuplicateAndAddItem( item, true );
if( new_item )
{
array_opts->TransformItem( ptN, new_item, rotPoint );
newItemsList.PushItem( new_item );
}
}
if( !new_item || !array_opts->ShouldRenumberItems() )
continue;
// Renumber items
switch( new_item->Type() )
{
case PCB_MODULE_TEXT_T:
case PCB_TEXT_T:
{
EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( new_item );
text->SetText( array_opts->InterpolateNumberIntoString( ptN, cachedString ) );
break;
}
case PCB_MODULE_T:
{
const wxString padName = array_opts->GetItemNumber( ptN );
static_cast<MODULE*>( new_item )->SetReference( cachedString + padName );
break;
}
case PCB_PAD_T:
{
const wxString padName = array_opts->GetItemNumber( ptN );
static_cast<D_PAD*>( new_item )->SetPadName( padName );
break;
}
default:
break;
}
}
if( !editingModule )
{
// pcbnew saves the new items like this
SaveCopyInUndoList( newItemsList, UR_NEW );
}
m_canvas->Refresh();
}
}
......@@ -282,7 +282,9 @@ EDA_HOTKEY* board_edit_Hotkey_List[] =
&HkPlaceItem, &HkCopyItem,
&HkMoveItem,
&HkFlipItem,
&HkRotateItem, &HkDragFootprint,
&HkRotateItem, &HkMoveItemExact,
&HkDuplicateItem, &HkDuplicateItemAndIncrement, &HkCreateArray,
&HkDragFootprint,
&HkGetAndMoveFootprint, &HkLock_Unlock_Footprint, &HkSavefile, &HkSavefileAs,
&HkLoadfile, &HkFindItem, &HkEditBoardItem,
&HkSwitch2CopperLayer, &HkSwitch2InnerLayer1,
......
......@@ -551,6 +551,13 @@ bool PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
OnHotkeyRotateItem( HK_FLIP_ITEM );
break;
case HK_MOVE_ITEM_EXACT:
case HK_DUPLICATE_ITEM:
case HK_DUPLICATE_ITEM_AND_INCREMENT:
case HK_CREATE_ARRAY:
OnHotkeyDuplicateOrArrayItem( HK_Descr->m_Idcommand );
break;
case HK_SWITCH_HIGHCONTRAST_MODE: // switch to high contrast mode and refresh the canvas
displ_opts->m_ContrastModeDisplay = !displ_opts->m_ContrastModeDisplay;
m_canvas->Refresh();
......@@ -1063,3 +1070,71 @@ bool PCB_EDIT_FRAME::OnHotkeyRotateItem( int aIdCommand )
return false;
}
bool PCB_EDIT_FRAME::OnHotkeyDuplicateOrArrayItem( int aIdCommand )
{
BOARD_ITEM* item = GetCurItem();
bool itemCurrentlyEdited = item && item->GetFlags();
if( itemCurrentlyEdited )
return false;
item = PcbGeneralLocateAndDisplay();
if( item == NULL )
return false;
SetCurItem( item );
int evt_type = 0; // Used to post a wxCommandEvent on demand
bool canDuplicate = true;
switch( item->Type() )
{
// Only handle items we know we can handle
case PCB_PAD_T:
canDuplicate = false;
// no break
case PCB_MODULE_T:
case PCB_LINE_T:
case PCB_TEXT_T:
case PCB_TRACE_T:
case PCB_ZONE_AREA_T:
case PCB_TARGET_T:
case PCB_DIMENSION_T:
switch( aIdCommand )
{
case HK_CREATE_ARRAY:
if( canDuplicate )
evt_type = ID_POPUP_PCB_CREATE_ARRAY;
break;
case HK_DUPLICATE_ITEM_AND_INCREMENT:
if( canDuplicate )
evt_type = ID_POPUP_PCB_DUPLICATE_ITEM_AND_INCREMENT;
break;
case HK_DUPLICATE_ITEM:
if( canDuplicate )
evt_type = ID_POPUP_PCB_DUPLICATE_ITEM;
break;
case HK_MOVE_ITEM_EXACT:
evt_type = ID_POPUP_PCB_MOVE_EXACT;
break;
default:
// We don't handle other commands here
break;
}
break;
default:
wxASSERT_MSG( false, "Unhandled move, duplicate or array for "
"object type " + item->Type() );
break;
}
return PostCommandMenuEvent( evt_type );
}
......@@ -211,21 +211,6 @@ BOARD_ITEM* FOOTPRINT_EDIT_FRAME::PrepareItemForHotkey( bool failIfCurrentlyEdit
}
bool FOOTPRINT_EDIT_FRAME::PostCommandMenuEvent( int evt_type )
{
if( evt_type != 0 )
{
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
evt.SetEventObject( this );
evt.SetId( evt_type );
wxPostEvent( this, evt );
return true;
}
return false;
}
bool FOOTPRINT_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand )
{
BOARD_ITEM* item = PrepareItemForHotkey( true );
......
......@@ -649,67 +649,12 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
break;
case ID_POPUP_PCB_MOVE_EXACT:
{
wxPoint translation;
double rotation = 0;
DIALOG_MOVE_EXACT dialog( this, translation, rotation );
int ret = dialog.ShowModal();
if( ret == DIALOG_MOVE_EXACT::MOVE_OK )
{
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
BOARD_ITEM* item = GetScreen()->GetCurItem();
item->Move( translation );
item->Rotate( item->GetPosition(), rotation );
m_canvas->Refresh();
}
m_canvas->MoveCursorToCrossHair();
moveExact();
break;
}
case ID_POPUP_PCB_CREATE_ARRAY:
{
BOARD_ITEM* item = GetScreen()->GetCurItem();
if( !item )
break;
MODULE* module = static_cast<MODULE*>( item->GetParent() );
if( !module )
break;
DIALOG_CREATE_ARRAY::ARRAY_OPTIONS* array_opts = NULL;
DIALOG_CREATE_ARRAY dialog( this, &array_opts );
int ret = dialog.ShowModal();
if( ret == DIALOG_CREATE_ARRAY::CREATE_ARRAY_OK && array_opts != NULL )
{
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
for( int i = 0; i < array_opts->GetArraySize(); i++)
{
BOARD_ITEM* new_item = module->DuplicateAndAddItem(
item, true );
array_opts->TransformItem( i, new_item, new_item->GetCenter() );
if( new_item->Type() == PCB_PAD_T && array_opts->ShouldRenumberItems() )
{
const std::string padName = array_opts->GetItemNumber( i );
static_cast<D_PAD*>( new_item )->SetPadName( padName );
}
}
m_canvas->Refresh();
}
createArray();
break;
}
case ID_POPUP_PCB_IMPORT_PAD_SETTINGS:
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
......@@ -895,7 +840,30 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
}
void FOOTPRINT_EDIT_FRAME::DuplicateItems( bool aIncrement )
void FOOTPRINT_EDIT_FRAME::moveExact()
{
wxPoint translation;
double rotation = 0;
DIALOG_MOVE_EXACT dialog( this, translation, rotation );
int ret = dialog.ShowModal();
if( ret == DIALOG_MOVE_EXACT::MOVE_OK )
{
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
BOARD_ITEM* item = GetScreen()->GetCurItem();
item->Move( translation );
item->Rotate( item->GetPosition(), rotation );
m_canvas->Refresh();
}
m_canvas->MoveCursorToCrossHair();
}
void FOOTPRINT_EDIT_FRAME::duplicateItems( bool aIncrement )
{
SaveCopyInUndoList( GetBoard()->m_Modules, UR_MODEDIT );
......
......@@ -35,6 +35,7 @@
class FP_LIB_TABLE;
class PCB_LAYER_WIDGET;
namespace PCB { struct IFACE; } // A KIFACE_I coded in pcbnew.c
......@@ -146,7 +147,6 @@ public:
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem = NULL );
BOARD_ITEM* PrepareItemForHotkey( bool failIfCurrentlyEdited );
bool PostCommandMenuEvent( int evt_type );
bool OnHotkeyEditItem( int aIdCommand );
bool OnHotkeyDeleteItem( int aIdCommand );
......@@ -371,7 +371,7 @@ public:
/**
* Function SelectFootprint
* Display the list of modules currently existing on the BOARD
* @return a pointer to a module if this module is selected or NULL otherwise
* @return a pointer to a modulvoid FOOTPRINT_EDIT_FRAME::moveExact()e if this module is selected or NULL otherwise
* @param aPcb = the board from modules can be loaded
*/
MODULE* SelectFootprint( BOARD* aPcb );
......@@ -539,6 +539,14 @@ protected:
private:
/**
* Function moveExact
* Move the selected item exactly, popping up a dialog to allow the
* user the enter the move delta
*/
void moveExact();
/**
* Function duplicateItems
* Duplicate the item under the cursor
* @param aIncrement increment the number of pad (if that is what is selected)
*/
......
......@@ -200,8 +200,27 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
HK_MOVE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_DRAWING_REQUEST,
msg, KiBitmap( move_xpm ) );
AddMenuItem( aPopMenu, ID_POPUP_PCB_EDIT_DRAWING, _( "Edit Drawing" ),
KiBitmap( edit_xpm ) );
msg = AddHotkeyName( _( "Duplicate Drawing" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( duplicate_line_xpm ) );
msg = AddHotkeyName( _("Move Drawing Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_line_xpm ) );
msg = AddHotkeyName( _("Create Drawing Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( aPopMenu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_line_xpm ) );
msg = AddHotkeyName( _( "Edit Drawing" ), g_Module_Editor_Hokeys_Descr,
HK_EDIT_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_EDIT_DRAWING,
msg, KiBitmap( edit_xpm ) );
AddMenuItem( aPopMenu, ID_POPUP_PCB_DELETE_DRAWING,
_( "Delete Drawing" ), KiBitmap( delete_xpm ) );
......@@ -252,12 +271,30 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
msg = AddHotkeyName( _( "Edit Dimension" ), g_Board_Editor_Hokeys_Descr,
HK_EDIT_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_EDIT_DIMENSION, msg, KiBitmap( edit_xpm ) );
msg = AddHotkeyName( _( "Move Dimension Text" ), g_Board_Editor_Hokeys_Descr,
HK_MOVE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST,
msg, KiBitmap( move_text_xpm ) );
msg = AddHotkeyName( _( "Duplicate Dimension" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( duplicate_text_xpm ) );
msg = AddHotkeyName( _("Move Dimension Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_text_xpm ) );
msg = AddHotkeyName( _("Create Dimension Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( aPopMenu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_text_xpm ) );
msg = AddHotkeyName( _( "Delete Dimension" ), g_Board_Editor_Hokeys_Descr,
HK_DELETE );
AddMenuItem( aPopMenu, ID_POPUP_PCB_DELETE_DIMENSION,
msg, KiBitmap( delete_xpm ) );
}
......@@ -268,10 +305,28 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
{
msg = AddHotkeyName( _( "Move Target" ), g_Board_Editor_Hokeys_Descr,
HK_MOVE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_MIRE_REQUEST, msg, KiBitmap( move_xpm ) );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_MIRE_REQUEST,
msg, KiBitmap( move_target_xpm ) );
msg = AddHotkeyName( _("Move Target Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_target_xpm ) );
msg = AddHotkeyName( _( "Duplicate Target" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( duplicate_target_xpm ) );
msg = AddHotkeyName( _("Create Target Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( aPopMenu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_target_xpm ) );
msg = AddHotkeyName( _( "Edit Target" ), g_Board_Editor_Hokeys_Descr,
HK_EDIT_ITEM );
AddMenuItem( aPopMenu, ID_POPUP_PCB_EDIT_MIRE, msg, KiBitmap( edit_xpm ) );
msg = AddHotkeyName( _( "Delete Target" ), g_Board_Editor_Hokeys_Descr, HK_DELETE );
AddMenuItem( aPopMenu, ID_POPUP_PCB_DELETE_MIRE,
msg, KiBitmap( delete_xpm ) );
......@@ -316,7 +371,6 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
switch( GetToolId() )
{
case ID_PCB_ZONES_BUTT:
if( GetBoard()->m_ZoneDescriptorList.size() > 0 )
{
aPopMenu->AppendSeparator();
msg = AddHotkeyName( _( "Fill or Refill All Zones" ),
......@@ -500,10 +554,27 @@ void PCB_EDIT_FRAME::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu )
HK_DRAG_TRACK_KEEP_SLOPE );
AddMenuItem( PopMenu, ID_POPUP_PCB_DRAG_TRACK_SEGMENT_KEEP_SLOPE,
msg, KiBitmap( drag_segment_withslope_xpm ) );
msg = AddHotkeyName( _( "Drag Segment" ), g_Board_Editor_Hokeys_Descr,
HK_DRAG_ITEM );
AddMenuItem( PopMenu, ID_POPUP_PCB_DRAG_TRACK_SEGMENT,
msg, KiBitmap( drag_track_segment_xpm ) );
msg = AddHotkeyName( _( "Duplicate Track" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( PopMenu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( duplicate_line_xpm ) );
msg = AddHotkeyName( _("Move Track Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( PopMenu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_line_xpm ) );
msg = AddHotkeyName( _("Create Track Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( PopMenu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_line_xpm ) );
AddMenuItem( PopMenu, ID_POPUP_PCB_BREAK_TRACK,
_( "Break Track" ), KiBitmap( break_line_xpm ) );
}
......@@ -688,7 +759,17 @@ void PCB_EDIT_FRAME::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu*
_( "Add Cutout Area" ), KiBitmap( add_zone_cutout_xpm ) );
AddMenuItem( zones_menu, ID_POPUP_PCB_ZONE_DUPLICATE,
_( "Duplicate Zone" ), KiBitmap( zone_duplicate_xpm ) );
_( "Duplicate Zone Onto Layer" ), KiBitmap( zone_duplicate_xpm ) );
msg = AddHotkeyName( _( "Duplicate Zone" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( zones_menu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( zone_duplicate_xpm ) );
msg = AddHotkeyName( _("Create Zone Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( zones_menu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_zone_xpm ) );
zones_menu->AppendSeparator();
......@@ -705,6 +786,11 @@ void PCB_EDIT_FRAME::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu*
msg = AddHotkeyName( _( "Move Zone" ), g_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM );
AddMenuItem( zones_menu, ID_POPUP_PCB_MOVE_ZONE_OUTLINES, msg, KiBitmap( move_xpm ) );
msg = AddHotkeyName( _("Move Zone Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( zones_menu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_zone_xpm ) );
msg = AddHotkeyName( _( "Edit Zone Properties" ), g_Board_Editor_Hokeys_Descr,
HK_EDIT_ITEM );
AddMenuItem( zones_menu, ID_POPUP_PCB_EDIT_ZONE_PARAMS,
......@@ -741,6 +827,22 @@ void PCB_EDIT_FRAME::createPopUpMenuForFootprints( MODULE* aModule, wxMenu* menu
msg = AddHotkeyName( _( "Move" ), g_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM );
AddMenuItem( sub_menu_footprint, ID_POPUP_PCB_MOVE_MODULE_REQUEST,
msg, KiBitmap( move_module_xpm ) );
msg = AddHotkeyName( _( "Duplicate" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( menu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( duplicate_module_xpm ) );
msg = AddHotkeyName( _("Move Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( menu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_module_xpm ) );
msg = AddHotkeyName( _("Create Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( menu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_module_xpm ) );
msg = AddHotkeyName( _( "Drag" ), g_Board_Editor_Hokeys_Descr, HK_DRAG_ITEM );
AddMenuItem( sub_menu_footprint, ID_POPUP_PCB_DRAG_MODULE_REQUEST,
msg, KiBitmap( drag_module_xpm ) );
......@@ -791,6 +893,21 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpTexts( TEXTE_MODULE* FpText, wxMenu* me
msg = AddHotkeyName( _( "Move" ), g_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM );
AddMenuItem( sub_menu_Fp_text, ID_POPUP_PCB_MOVE_TEXTMODULE_REQUEST,
msg, KiBitmap( move_field_xpm ) );
msg = AddHotkeyName( _( "Duplicate" ), g_Module_Editor_Hokeys_Descr,
HK_DUPLICATE_ITEM );
AddMenuItem( menu, ID_POPUP_PCB_DUPLICATE_ITEM,
msg, KiBitmap( duplicate_text_xpm ) );
msg = AddHotkeyName( _("Move Exactly" ), g_Module_Editor_Hokeys_Descr,
HK_MOVE_ITEM_EXACT );
AddMenuItem( menu, ID_POPUP_PCB_MOVE_EXACT,
msg, KiBitmap( move_text_xpm ) );
msg = AddHotkeyName( _("Create Array" ), g_Module_Editor_Hokeys_Descr,
HK_CREATE_ARRAY );
AddMenuItem( menu, ID_POPUP_PCB_CREATE_ARRAY,
msg, KiBitmap( array_text_xpm ) );
}
msg = AddHotkeyName( _( "Rotate" ), g_Board_Editor_Hokeys_Descr, HK_ROTATE_ITEM );
......
......@@ -31,3 +31,17 @@ void PCB_BASE_EDIT_FRAME::SetRotationAngle( int aRotationAngle )
m_rotationAngle = aRotationAngle;
}
bool PCB_BASE_EDIT_FRAME::PostCommandMenuEvent( int evt_type )
{
if( evt_type != 0 )
{
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
evt.SetEventObject( this );
evt.SetId( evt_type );
wxPostEvent( this, evt );
return true;
}
return false;
}
......@@ -69,9 +69,19 @@ public:
int GetRotationAngle() const { return m_rotationAngle; }
void SetRotationAngle( int aRotationAngle );
bool PostCommandMenuEvent( int evt_type );
protected:
/// User defined rotation angle (in tenths of a degree).
int m_rotationAngle;
/**
* Function createArray
* Create an array of the selected item (invokes the dialogue)
* This function is shared between pcbnew and modedit, as it is virtually
* the same
*/
void createArray();
};
#endif
......@@ -76,6 +76,10 @@ TOOL_ACTION COMMON_ACTIONS::moveExact( "pcbnew.InteractiveEdit.moveExact",
AS_GLOBAL, MD_CTRL + int( 'M' ),
"Move Exactly...", "Moves the selected item(s) by an exact amount" );
TOOL_ACTION COMMON_ACTIONS::createArray( "pcbnew.InteractiveEdit.createArray",
AS_GLOBAL, MD_CTRL + int('N'),
"Create array", "Create array", AF_ACTIVATE );
TOOL_ACTION COMMON_ACTIONS::rotate( "pcbnew.InteractiveEdit.rotate",
AS_GLOBAL, 'R',
"Rotate", "Rotates selected item(s)" );
......@@ -341,10 +345,6 @@ TOOL_ACTION COMMON_ACTIONS::enumeratePads( "pcbnew.ModuleEditor.enumeratePads",
AS_GLOBAL, 0,
"Enumerate pads", "Enumerate pads", AF_ACTIVATE );
TOOL_ACTION COMMON_ACTIONS::createArray( "pcbnew.ModuleEditor.createArray",
AS_GLOBAL, MD_CTRL + int('N'),
"Create array", "Create array", AF_ACTIVATE );
TOOL_ACTION COMMON_ACTIONS::copyItems( "pcbnew.ModuleEditor.copyItems",
AS_GLOBAL, MD_CTRL + int( 'C' ),
"Copy items", "Copy items", AF_ACTIVATE );
......
......@@ -26,6 +26,8 @@
#include <class_module.h>
#include <class_edge_mod.h>
#include <class_zone.h>
#include <class_draw_panel_gal.h>
#include <module_editor_frame.h>
#include <wxPcbStruct.h>
#include <tool/tool_manager.h>
......@@ -42,6 +44,7 @@
#include "selection_tool.h"
#include "edit_tool.h"
#include <dialogs/dialog_create_array.h>
#include <dialogs/dialog_move_exact.h>
EDIT_TOOL::EDIT_TOOL() :
......@@ -74,6 +77,8 @@ bool EDIT_TOOL::Init()
m_selectionTool->AddMenuItem( COMMON_ACTIONS::remove, SELECTION_CONDITIONS::NotEmpty );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::properties, SELECTION_CONDITIONS::NotEmpty );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::moveExact, SELECTION_CONDITIONS::NotEmpty );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::duplicate, SELECTION_CONDITIONS::NotEmpty );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::createArray, SELECTION_CONDITIONS::NotEmpty );
m_offset.x = 0;
m_offset.y = 0;
......@@ -187,7 +192,8 @@ int EDIT_TOOL::Main( TOOL_EVENT& aEvent )
}
}
else if( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) )
else if( evt->IsAction( &COMMON_ACTIONS::editActivate )
|| evt->IsMotion() || evt->IsDrag( BUT_LEFT ) )
{
m_cursor = controls->GetCursorPosition();
......@@ -647,6 +653,255 @@ int EDIT_TOOL::MoveExact( TOOL_EVENT& aEvent )
}
int EDIT_TOOL::Duplicate( TOOL_EVENT& aEvent )
{
bool increment = aEvent.IsAction( &COMMON_ACTIONS::duplicateIncrement );
// first, check if we have a selection, or try to get one
SELECTION_TOOL* selTool = m_toolMgr->GetTool<SELECTION_TOOL>();
const SELECTION& selection = selTool->GetSelection();
// Be sure that there is at least one item that we can modify
if( !makeSelection( selection ) || selTool->CheckLock() )
{
setTransitions();
return 0;
}
// we have a selection to work on now, so start the tool process
PCB_BASE_FRAME* editFrame = getEditFrame<PCB_BASE_FRAME>();
editFrame->OnModify();
// prevent other tools making undo points while the duplicate is going on
// so that if you cancel, you don't get a duplicate object hiding over
// the original
m_toolMgr->IncUndoInhibit();
std::vector<BOARD_ITEM*> old_items;
for( int i = 0; i < selection.Size(); ++i )
{
BOARD_ITEM* item = selection.Item<BOARD_ITEM>( i );
if( item )
old_items.push_back( item );
}
for( unsigned i = 0; i < old_items.size(); ++i )
{
BOARD_ITEM* item = old_items[i];
// Unselect the item, so we won't pick it up again
// Do this first, so a single-item duplicate will correctly call
// SetCurItem and show the item properties
m_toolMgr->RunAction( COMMON_ACTIONS::unselectItem, true, item );
BOARD_ITEM* new_item = NULL;
if ( PCB_EDIT_FRAME* frame = dynamic_cast<PCB_EDIT_FRAME*>( editFrame ) )
new_item = frame->GetBoard()->DuplicateAndAddItem( item, increment );
else if ( FOOTPRINT_EDIT_FRAME* frame = dynamic_cast<FOOTPRINT_EDIT_FRAME*>( editFrame ) )
new_item = frame->GetBoard()->m_Modules->DuplicateAndAddItem( item, increment );
if( new_item )
{
if( new_item->Type() == PCB_MODULE_T )
{
static_cast<MODULE*>( new_item )->RunOnChildren( boost::bind( &KIGFX::VIEW::Add,
getView(), _1 ) );
}
editFrame->GetGalCanvas()->GetView()->Add( new_item );
// Select the new item, so we can pick it up
m_toolMgr->RunAction( COMMON_ACTIONS::selectItem, true, new_item );
}
}
// record the new items as added
editFrame->SaveCopyInUndoList( selection.items, UR_NEW );
editFrame->DisplayToolMsg( wxString::Format( _( "Duplicated %d item(s)" ),
(int) old_items.size() ) );
// pick up the selected item(s) and start moving
// this works well for "dropping" copies around
TOOL_EVENT evt = COMMON_ACTIONS::editActivate.MakeEvent();
Main( evt );
// and re-enable undos
m_toolMgr->DecUndoInhibit();
setTransitions();
return 0;
}
int EDIT_TOOL::CreateArray( TOOL_EVENT& aEvent )
{
// first, check if we have a selection, or try to get one
SELECTION_TOOL* selTool = m_toolMgr->GetTool<SELECTION_TOOL>();
const SELECTION& selection = selTool->GetSelection();
// Be sure that there is at least one item that we can modify
if( !makeSelection( selection ) || selTool->CheckLock() )
{
setTransitions();
return 0;
}
bool originalItemsModified = false;
// we have a selection to work on now, so start the tool process
PCB_BASE_FRAME* editFrame = getEditFrame<PCB_BASE_FRAME>();
editFrame->OnModify();
const bool editingModule = NULL != dynamic_cast<FOOTPRINT_EDIT_FRAME*>( editFrame );
if( editingModule )
{
// Module editors do their undo point upfront for the whole module
editFrame->SaveCopyInUndoList( editFrame->GetBoard()->m_Modules, UR_MODEDIT );
}
else
{
// We may also change the original item
editFrame->SaveCopyInUndoList( selection.items, UR_CHANGED );
}
DIALOG_CREATE_ARRAY::ARRAY_OPTIONS* array_opts = NULL;
const wxPoint rotPoint = selection.GetCenter();
DIALOG_CREATE_ARRAY dialog( editFrame, rotPoint, &array_opts );
int ret = dialog.ShowModal();
if( ret == DIALOG_CREATE_ARRAY::CREATE_ARRAY_OK && array_opts != NULL )
{
PICKED_ITEMS_LIST newItemList;
for( int i = 0; i < selection.Size(); ++i )
{
BOARD_ITEM* item = selection.Item<BOARD_ITEM>( i );
if( !item )
continue;
wxString cachedString;
if( item->Type() == PCB_MODULE_T )
{
cachedString = static_cast<MODULE*>( item )->GetReferencePrefix();
}
else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( item ) )
{
// Copy the text (not just take a reference
cachedString = text->GetText();
}
// iterate across the array, laying out the item at the
// correct position
const unsigned nPoints = array_opts->GetArraySize();
for( unsigned ptN = 0; ptN < nPoints; ++ptN )
{
BOARD_ITEM* newItem = NULL;
if( ptN == 0 )
{
newItem = item;
}
else
{
// if renumbering, no need to increment
const bool increment = !array_opts->ShouldRenumberItems();
if ( PCB_EDIT_FRAME* frame = dynamic_cast<PCB_EDIT_FRAME*>( editFrame ) )
newItem = frame->GetBoard()->DuplicateAndAddItem( item, increment );
else if ( FOOTPRINT_EDIT_FRAME* frame = dynamic_cast<FOOTPRINT_EDIT_FRAME*>( editFrame ) )
newItem = frame->GetBoard()->m_Modules->DuplicateAndAddItem( item, increment );
if( newItem )
{
array_opts->TransformItem( ptN, newItem, rotPoint );
m_toolMgr->RunAction( COMMON_ACTIONS::unselectItem, true, newItem );
newItemList.PushItem( newItem );
if( newItem->Type() == PCB_MODULE_T)
{
static_cast<MODULE*>( newItem )->RunOnChildren( boost::bind( &KIGFX::VIEW::Add,
getView(), _1 ) );
}
editFrame->GetGalCanvas()->GetView()->Add( newItem );
}
}
// set the number if needed:
if( array_opts->ShouldRenumberItems() )
{
switch( newItem->Type() )
{
case PCB_PAD_T:
{
const wxString padName = array_opts->GetItemNumber( ptN );
static_cast<D_PAD*>( newItem )->SetPadName( padName );
originalItemsModified = true;
break;
}
case PCB_MODULE_T:
{
const wxString moduleName = array_opts->GetItemNumber( ptN );
MODULE* module = static_cast<MODULE*>( newItem );
module->SetReference( cachedString + moduleName );
originalItemsModified = true;
break;
}
case PCB_MODULE_TEXT_T:
case PCB_TEXT_T:
{
EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( newItem );
text->SetText( array_opts->InterpolateNumberIntoString( ptN, cachedString ) );
originalItemsModified = true;
break;
}
default:
// no renumbering of other items
break;
}
}
}
}
if( !editingModule )
{
if( originalItemsModified )
{
// Update the appearance of the original items
selection.group->ItemsViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
// Add all items as a single undo point for PCB editors
// TODO: Can this be merged into the previous undo point (where
// we saved the original items)
editFrame->SaveCopyInUndoList( newItemList, UR_NEW );
}
}
setTransitions();
return 0;
}
void EDIT_TOOL::setTransitions()
{
Go( &EDIT_TOOL::Main, COMMON_ACTIONS::editActivate.MakeEvent() );
......@@ -655,6 +910,9 @@ void EDIT_TOOL::setTransitions()
Go( &EDIT_TOOL::Remove, COMMON_ACTIONS::remove.MakeEvent() );
Go( &EDIT_TOOL::Properties, COMMON_ACTIONS::properties.MakeEvent() );
Go( &EDIT_TOOL::MoveExact, COMMON_ACTIONS::moveExact.MakeEvent() );
Go( &EDIT_TOOL::Duplicate, COMMON_ACTIONS::duplicate.MakeEvent() );
Go( &EDIT_TOOL::Duplicate, COMMON_ACTIONS::duplicateIncrement.MakeEvent() );
Go( &EDIT_TOOL::CreateArray,COMMON_ACTIONS::createArray.MakeEvent() );
}
......
......@@ -94,7 +94,7 @@ public:
/**
* Function Duplicate()
*
* Duplicates a component and starts a move action
* Duplicates a selection and starts a move action
*/
int Duplicate( TOOL_EVENT& aEvent );
......@@ -105,6 +105,14 @@ public:
*/
int MoveExact( TOOL_EVENT& aEvent );
/**
* Function CreateArray()
*
* Creates an array of the selected items, invoking the array editor dialog
* to set the array options
*/
int CreateArray( TOOL_EVENT& aEvent );
/**
* Function EditModules()
*
......
......@@ -75,8 +75,6 @@ bool MODULE_TOOLS::Init()
}
selectionTool->AddMenuItem( COMMON_ACTIONS::enumeratePads );
selectionTool->AddMenuItem( COMMON_ACTIONS::duplicate );
selectionTool->AddMenuItem( COMMON_ACTIONS::createArray );
setTransitions();
......@@ -491,175 +489,6 @@ int MODULE_TOOLS::PasteItems( TOOL_EVENT& aEvent )
return 0;
}
int MODULE_TOOLS::DuplicateItems( TOOL_EVENT& aEvent )
{
bool increment = aEvent.IsAction( &COMMON_ACTIONS::duplicateIncrement );
MODULE* module = m_board->m_Modules;
assert( module );
// first, check if we have a selection, or try to get one
SELECTION_TOOL* selTool = m_toolMgr->GetTool<SELECTION_TOOL>();
if( selTool->GetSelection().Empty() )
{
m_toolMgr->RunAction( COMMON_ACTIONS::selectionCursor, true );
}
const SELECTION& selection = selTool->GetSelection();
// if we don't have a selection by now, this tool can't do anything
if( selection.Empty() || selTool->CheckLock() )
{
setTransitions();
return 0;
}
// we have a selection to work on now, so start the tool process
m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
// prevent other tools making undo points while the duplicate is going on
// so that if you cancel, you don't get a duplicate object hiding over
// the original
m_toolMgr->IncUndoInhibit();
std::vector<BOARD_ITEM*> old_items;
for( int i = 0; i < selection.Size(); ++i )
{
BOARD_ITEM* item = selection.Item<BOARD_ITEM>( i );
if( item )
old_items.push_back( item );
}
for( unsigned i = 0; i < old_items.size(); ++i )
{
BOARD_ITEM* item = old_items[i];
// Unselect the item, so we won't pick it up again
// Do this first, so a single-item duplicate will correctly call
// SetCurItem and show the item properties
m_toolMgr->RunAction( COMMON_ACTIONS::unselectItem, true, item );
BOARD_ITEM* new_item = module->DuplicateAndAddItem( item, increment );
if( new_item )
{
m_view->Add( new_item );
// Select the new item, so we can pick it up
m_toolMgr->RunAction( COMMON_ACTIONS::selectItem, true, new_item );
}
}
m_frame->DisplayToolMsg( wxString::Format( _( "Duplicated %d item(s)" ),
(int) old_items.size() ) );
// pick up the selected item(s) and start moving
// this works well for "dropping" copies around
m_toolMgr->RunAction( COMMON_ACTIONS::editActivate, true );
// and re-enable undos
m_toolMgr->DecUndoInhibit();
setTransitions();
return 0;
}
int MODULE_TOOLS::CreateArray( TOOL_EVENT& aEvent )
{
MODULE* module = m_board->m_Modules;
assert( module );
// first, check if we have a selection, or try to get one
SELECTION_TOOL* selTool = m_toolMgr->GetTool<SELECTION_TOOL>();
if( selTool->GetSelection().Empty() )
{
m_toolMgr->RunAction( COMMON_ACTIONS::selectionCursor, true );
}
const SELECTION& selection = selTool->GetSelection();
// if we don't have a selection by now, this tool can't do anything
if( selection.Empty() || selTool->CheckLock() )
{
setTransitions();
return 0;
}
// we have a selection to work on now, so start the tool process
m_frame->OnModify();
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
DIALOG_CREATE_ARRAY::ARRAY_OPTIONS* array_opts = NULL;
PCB_BASE_FRAME* baseFrame = getEditFrame<PCB_BASE_FRAME>();
DIALOG_CREATE_ARRAY dialog( baseFrame, &array_opts );
int ret = dialog.ShowModal();
if( ret == DIALOG_CREATE_ARRAY::CREATE_ARRAY_OK && array_opts != NULL )
{
wxPoint rotPoint = selection.GetCenter();
for( int i = 0; i < selection.Size(); ++i )
{
BOARD_ITEM* item = selection.Item<BOARD_ITEM>( i );
if( !item )
continue;
// iterate across the array, laying out the item at the
// correct position
// skip the first one - we already have that object
const unsigned nPoints = array_opts->GetArraySize();
for( unsigned ptN = 0; ptN < nPoints; ++ptN )
{
BOARD_ITEM* newItem = NULL;
if( ptN == 0 )
{
newItem = item;
}
else
{
newItem = module->DuplicateAndAddItem( item, true );
if( newItem )
{
array_opts->TransformItem( ptN, newItem, rotPoint );
m_toolMgr->RunAction( COMMON_ACTIONS::unselectItem, true, newItem );
m_view->Add( newItem );
}
}
// set the number if needed:
if( newItem->Type() == PCB_PAD_T && array_opts->ShouldRenumberItems() )
{
const std::string padName = array_opts->GetItemNumber( ptN );
static_cast<D_PAD*>( newItem )->SetPadName( padName );
}
}
}
m_frame->GetGalCanvas()->Refresh();
}
setTransitions();
return 0;
}
int MODULE_TOOLS::ModuleTextOutlines( TOOL_EVENT& aEvent )
{
......@@ -736,9 +565,6 @@ void MODULE_TOOLS::setTransitions()
Go( &MODULE_TOOLS::EnumeratePads, COMMON_ACTIONS::enumeratePads.MakeEvent() );
Go( &MODULE_TOOLS::CopyItems, COMMON_ACTIONS::copyItems.MakeEvent() );
Go( &MODULE_TOOLS::PasteItems, COMMON_ACTIONS::pasteItems.MakeEvent() );
Go( &MODULE_TOOLS::DuplicateItems, COMMON_ACTIONS::duplicate.MakeEvent() );
Go( &MODULE_TOOLS::DuplicateItems, COMMON_ACTIONS::duplicateIncrement.MakeEvent() );
Go( &MODULE_TOOLS::ModuleTextOutlines, COMMON_ACTIONS::moduleTextOutlines.MakeEvent() );
Go( &MODULE_TOOLS::ModuleEdgeOutlines, COMMON_ACTIONS::moduleEdgeOutlines.MakeEvent() );
Go( &MODULE_TOOLS::CreateArray, COMMON_ACTIONS::createArray.MakeEvent() );
}
......@@ -77,9 +77,6 @@ public:
*/
int PasteItems( TOOL_EVENT& aEvent );
int DuplicateItems ( TOOL_EVENT& aEvent );
/**
* Function CreateArray
*
......
......@@ -32,6 +32,8 @@
#include <class_zone.h>
#include <class_draw_panel_gal.h>
#include <dialogs/dialog_create_array.h>
class ZONE_CONTEXT_MENU : public CONTEXT_MENU
{
......@@ -68,6 +70,7 @@ bool PCB_EDITOR_CONTROL::Init()
SELECTION_CONDITIONS::OnlyType( PCB_ZONE_AREA_T ) );
}
setTransitions();
return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment