diff --git a/bitmaps_png/cpp_26/post_compo.cpp b/bitmaps_png/cpp_26/post_compo.cpp index 3685ec2789..4fec67689d 100644 --- a/bitmaps_png/cpp_26/post_compo.cpp +++ b/bitmaps_png/cpp_26/post_compo.cpp @@ -8,77 +8,86 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, - 0xce, 0x00, 0x00, 0x04, 0x53, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x4b, 0x48, 0x5c, - 0x77, 0x14, 0xc6, 0x2d, 0x74, 0x21, 0x54, 0x89, 0x51, 0xc4, 0x62, 0x50, 0x2b, 0xa2, 0x68, 0xc0, - 0xc4, 0x10, 0x24, 0xb4, 0xd4, 0x14, 0xa7, 0xd0, 0x85, 0x8b, 0x6e, 0xdc, 0xb4, 0x60, 0xdc, 0x48, - 0x71, 0x23, 0x18, 0x1b, 0xa1, 0x5d, 0xb8, 0x92, 0xba, 0x90, 0x11, 0x22, 0x14, 0x2c, 0x8a, 0x2d, - 0x3e, 0xd1, 0x85, 0x22, 0x5a, 0x15, 0x51, 0xd3, 0xf1, 0x51, 0x45, 0x47, 0xeb, 0x13, 0xe2, 0x18, - 0xe3, 0x33, 0xbe, 0x67, 0xc6, 0xf7, 0x38, 0xea, 0xa8, 0x5f, 0xcf, 0xf7, 0x37, 0x57, 0xa6, 0xe3, - 0xb5, 0x35, 0xd0, 0x76, 0xe0, 0x70, 0xaf, 0xd7, 0x99, 0xf3, 0x3b, 0xe7, 0x3b, 0x8f, 0xfb, 0xf7, - 0x02, 0xe0, 0xf5, 0x7f, 0xd8, 0xe5, 0x4d, 0x5c, 0x5c, 0xdc, 0x37, 0xe9, 0xe9, 0xe9, 0xc6, 0x7f, - 0xdb, 0x62, 0x62, 0x62, 0x52, 0xfe, 0x02, 0xca, 0xcd, 0xcd, 0xad, 0xdf, 0xda, 0xde, 0x86, 0xcd, - 0x66, 0x83, 0xcd, 0x6e, 0x87, 0x7d, 0x6b, 0x1b, 0xfc, 0x7b, 0x7b, 0x67, 0x07, 0x3b, 0xbb, 0xbb, - 0xd8, 0xd5, 0x6c, 0x6f, 0x0f, 0x7b, 0xb4, 0xfd, 0x7d, 0x65, 0xfb, 0xb4, 0x83, 0x03, 0x65, 0x07, - 0x1e, 0x76, 0x78, 0x78, 0x88, 0xec, 0xec, 0xec, 0x5f, 0xae, 0x80, 0xac, 0x36, 0x3b, 0x36, 0xad, - 0x56, 0x58, 0x2f, 0x61, 0x5b, 0x17, 0x30, 0x4f, 0xa0, 0x1b, 0x6c, 0xdf, 0x03, 0xe6, 0x6e, 0x8e, - 0xeb, 0x40, 0x76, 0x71, 0xce, 0x8c, 0xec, 0xee, 0x10, 0x37, 0x40, 0x4f, 0x4f, 0x0f, 0x3a, 0x3a, - 0x3b, 0x31, 0x31, 0x31, 0x81, 0xee, 0xee, 0x6e, 0xec, 0xc8, 0xff, 0x4c, 0x5d, 0x5d, 0xb0, 0x4a, - 0x70, 0x9d, 0xf2, 0x7c, 0x74, 0x74, 0x14, 0x53, 0x53, 0x53, 0xea, 0x7e, 0x78, 0x78, 0x18, 0x4e, - 0xa7, 0x53, 0x1f, 0x44, 0xc7, 0x04, 0xac, 0x6f, 0x6c, 0x5c, 0x00, 0xc4, 0x08, 0xd0, 0xa2, 0x9f, - 0x9e, 0x9e, 0x46, 0x73, 0x73, 0x33, 0x06, 0x06, 0x07, 0x51, 0x59, 0x59, 0x89, 0x85, 0x85, 0x05, - 0x94, 0x95, 0x95, 0xe1, 0x8f, 0x91, 0x11, 0x8c, 0x8f, 0x8f, 0xa3, 0xa9, 0xa9, 0x09, 0xab, 0xab, - 0xab, 0x2a, 0x90, 0x8a, 0x8a, 0x0a, 0x1c, 0x1d, 0x1d, 0xe9, 0x83, 0xe8, 0x9c, 0xb0, 0x84, 0x84, - 0x04, 0x54, 0x55, 0x55, 0x5d, 0x48, 0xf4, 0x56, 0x16, 0x6a, 0x4e, 0x68, 0x4d, 0x4d, 0x8d, 0x0a, - 0xa0, 0xb5, 0xb5, 0x15, 0x0d, 0x0d, 0x0d, 0x28, 0x2d, 0x2d, 0xc5, 0xd0, 0xd0, 0x10, 0xce, 0xce, - 0xce, 0x60, 0x36, 0x9b, 0x55, 0x5d, 0xda, 0xda, 0xda, 0x30, 0x3f, 0x3f, 0x8f, 0xe3, 0xe3, 0x63, - 0x7d, 0x10, 0x25, 0x22, 0x2c, 0x32, 0x32, 0x12, 0x7e, 0x7e, 0x7e, 0x48, 0x4a, 0x4a, 0x52, 0x3f, - 0x38, 0x70, 0x38, 0x94, 0xde, 0x83, 0x92, 0xc9, 0xc0, 0xc0, 0x80, 0x8a, 0x94, 0x46, 0x47, 0xe5, - 0xe5, 0xe5, 0xb0, 0x58, 0x2c, 0xa8, 0xaf, 0xaf, 0x47, 0x5d, 0x5d, 0x9d, 0x82, 0x56, 0x57, 0x57, - 0xa3, 0xbd, 0xbd, 0x1d, 0x2e, 0x97, 0x4b, 0x1f, 0xc4, 0x0c, 0x18, 0x35, 0x41, 0x66, 0xf3, 0x30, - 0x9e, 0x3e, 0xcd, 0x46, 0x40, 0x40, 0x00, 0x4a, 0x4a, 0x4a, 0x94, 0xde, 0x2b, 0x2b, 0x2b, 0x2a, - 0x33, 0x02, 0x4e, 0x4e, 0x4e, 0x94, 0xad, 0xad, 0xad, 0xa9, 0x2b, 0x25, 0x63, 0xd3, 0x30, 0x5b, - 0xde, 0xaf, 0xaf, 0xaf, 0xe3, 0xf4, 0xf4, 0x54, 0x1f, 0x44, 0x99, 0x28, 0x47, 0x44, 0x44, 0x84, - 0xe8, 0x6c, 0x91, 0x6e, 0x02, 0xfa, 0xfb, 0x27, 0xf1, 0xe8, 0xd1, 0xa7, 0x48, 0x4c, 0x4c, 0xc4, - 0xdc, 0xdc, 0xdc, 0x25, 0x80, 0xd1, 0x7a, 0x1a, 0x1d, 0x7b, 0x9a, 0x2e, 0x88, 0xd1, 0x66, 0x64, - 0x64, 0x20, 0x34, 0x34, 0x54, 0x3a, 0xc8, 0x22, 0xd1, 0x41, 0x3a, 0x0a, 0x92, 0xc9, 0x39, 0x8c, - 0xc6, 0x9f, 0x11, 0x1c, 0x1c, 0x82, 0xc2, 0xc2, 0x42, 0x05, 0x1a, 0x1b, 0x1b, 0x53, 0x0d, 0xa0, - 0xe7, 0x5c, 0x33, 0xd6, 0xed, 0x5a, 0x10, 0x7f, 0x1c, 0x16, 0x16, 0x26, 0xed, 0x69, 0x91, 0x56, - 0x87, 0x48, 0x03, 0xbc, 0x79, 0x03, 0xc9, 0x06, 0x52, 0x23, 0x1b, 0x92, 0x93, 0xd3, 0x10, 0x12, - 0x12, 0x82, 0x7b, 0xf7, 0xee, 0xe3, 0xee, 0xdd, 0xfb, 0xc8, 0xc9, 0xc9, 0x51, 0x0e, 0xaf, 0x33, - 0x7d, 0x10, 0x8b, 0x2e, 0x16, 0x15, 0x15, 0x25, 0x4e, 0x2d, 0xa2, 0x33, 0xb0, 0xbc, 0x0c, 0x69, - 0x08, 0xe0, 0xd5, 0x2b, 0xe0, 0xe5, 0x4b, 0x48, 0x20, 0xc0, 0xed, 0xdb, 0x81, 0x12, 0xc8, 0x92, - 0x74, 0xde, 0x2c, 0x7c, 0x7d, 0x7d, 0x95, 0x51, 0x85, 0xf3, 0xf3, 0xf3, 0x2b, 0xa6, 0x0b, 0x62, - 0x67, 0xb1, 0x3d, 0x09, 0xea, 0xeb, 0xb3, 0x88, 0x64, 0x90, 0x59, 0x01, 0x66, 0x66, 0x20, 0x83, - 0x08, 0xe9, 0xb8, 0x7d, 0xa4, 0xa4, 0x3c, 0x83, 0xbf, 0xbf, 0xbf, 0xd4, 0xcd, 0x80, 0x07, 0x0f, - 0x12, 0x25, 0xc3, 0x64, 0x35, 0x3f, 0xac, 0x6d, 0x47, 0x47, 0xc7, 0xcd, 0x40, 0x84, 0x14, 0x14, - 0x14, 0xa8, 0x66, 0xe8, 0xed, 0xb5, 0x60, 0x71, 0x11, 0x78, 0xfd, 0x1a, 0xd2, 0xbe, 0xc0, 0xf3, - 0xe7, 0xf5, 0xb8, 0x73, 0xe7, 0x23, 0xa4, 0xa6, 0xa6, 0x2a, 0xa7, 0x46, 0xa3, 0x11, 0x79, 0x79, - 0x79, 0x0a, 0x32, 0xc3, 0x48, 0xde, 0x7e, 0x34, 0x80, 0xf6, 0xd1, 0x05, 0xb1, 0x85, 0xf3, 0xf3, - 0xf3, 0x95, 0x0c, 0x26, 0x93, 0x05, 0xb3, 0xb3, 0xc0, 0x8b, 0x17, 0x73, 0x78, 0xfc, 0x38, 0x09, - 0xd1, 0xd1, 0xd1, 0x28, 0x2a, 0x2a, 0x42, 0x4b, 0x4b, 0x8b, 0x3c, 0x9f, 0x55, 0xfa, 0x73, 0x55, - 0xb1, 0xa5, 0x79, 0xcf, 0xe2, 0xb3, 0x49, 0xd8, 0xfa, 0x5a, 0xfb, 0xbb, 0xae, 0xeb, 0x3a, 0xa7, - 0x0c, 0x21, 0xd7, 0x4a, 0x78, 0x78, 0xb8, 0xe8, 0x3f, 0x8e, 0xac, 0xac, 0x1f, 0x70, 0xeb, 0x96, - 0x1f, 0xd2, 0xd2, 0xd2, 0xd0, 0xd8, 0xd8, 0x28, 0x72, 0xf6, 0xa9, 0x39, 0xd2, 0x22, 0xe6, 0x95, - 0x00, 0x06, 0x48, 0xe0, 0x86, 0xac, 0x2e, 0xce, 0x1a, 0x8d, 0xf3, 0xc5, 0x37, 0x40, 0x66, 0xd6, - 0xb3, 0xab, 0x20, 0x6d, 0xe2, 0x59, 0xa3, 0xc0, 0xc0, 0x0f, 0x11, 0x1b, 0x1b, 0x8b, 0xe2, 0xe2, - 0x62, 0x95, 0x05, 0x37, 0x04, 0x23, 0x77, 0x87, 0x70, 0x76, 0xb8, 0x07, 0xe9, 0x94, 0x33, 0xc6, - 0x85, 0xca, 0x3d, 0xc7, 0xed, 0xd0, 0xd7, 0xdf, 0x0f, 0x53, 0x4f, 0xef, 0x61, 0xdc, 0xc3, 0x87, - 0x5f, 0xeb, 0x82, 0x98, 0x76, 0x7c, 0x7c, 0x3c, 0x32, 0x33, 0x33, 0x55, 0x2d, 0xb8, 0x72, 0xd8, - 0x89, 0x1a, 0x44, 0x03, 0x31, 0x13, 0xbe, 0x1e, 0x18, 0xfd, 0x88, 0x2c, 0x55, 0x6e, 0x6b, 0xd6, - 0x8a, 0xdb, 0xdf, 0xe9, 0x3c, 0x84, 0x79, 0x68, 0xe8, 0x54, 0x20, 0xc9, 0x57, 0xde, 0xb0, 0x04, - 0x69, 0xfa, 0x72, 0xed, 0x9b, 0x4c, 0x26, 0x69, 0x86, 0xc5, 0xcb, 0xc1, 0xf3, 0xcc, 0x86, 0x35, - 0xd8, 0xdc, 0xdc, 0x54, 0xce, 0xd9, 0x10, 0xda, 0x77, 0x1c, 0x8e, 0x03, 0xfc, 0xd6, 0x65, 0x72, - 0xc5, 0x7f, 0x1c, 0xff, 0xb9, 0xee, 0xab, 0xdc, 0x1d, 0x44, 0x27, 0xd4, 0xdd, 0x7d, 0xc2, 0xdd, - 0x41, 0x17, 0x0e, 0x1d, 0x32, 0x63, 0xcb, 0x98, 0x9c, 0x9c, 0x44, 0x6d, 0x6d, 0xad, 0x7a, 0xc6, - 0x3d, 0xd7, 0xd4, 0xfc, 0xeb, 0x89, 0xe1, 0x0b, 0xc3, 0x27, 0xd7, 0x9e, 0x19, 0x3c, 0x41, 0xee, - 0xbb, 0x4b, 0x4f, 0x36, 0xd6, 0x86, 0x19, 0x73, 0x15, 0x51, 0x62, 0x4a, 0xf6, 0xe3, 0x4f, 0x45, - 0x5b, 0x06, 0x83, 0x21, 0xea, 0x6f, 0x0f, 0x27, 0xef, 0x0a, 0x62, 0x7d, 0x96, 0x96, 0x96, 0x54, - 0x6d, 0x7a, 0x7a, 0x7f, 0xc7, 0xb7, 0xdf, 0x7f, 0x37, 0x1e, 0x14, 0x14, 0xf4, 0xc1, 0x3f, 0x9e, - 0x82, 0x08, 0xf2, 0xdc, 0xc2, 0xee, 0x92, 0xb9, 0x83, 0x78, 0x3d, 0x92, 0x80, 0x36, 0xac, 0x36, - 0xb4, 0x75, 0x9a, 0x5c, 0x5f, 0x3d, 0x79, 0x52, 0xe9, 0xe5, 0xe5, 0xf5, 0xfe, 0x8d, 0x8e, 0x5b, - 0xde, 0xde, 0xde, 0x9f, 0x05, 0x07, 0x07, 0x7f, 0xf9, 0xae, 0xe6, 0xe3, 0xe3, 0x93, 0x20, 0x90, - 0xf7, 0x6e, 0x7c, 0xae, 0xfb, 0xaf, 0xed, 0x4f, 0x3b, 0x6c, 0x44, 0xed, 0xb6, 0xad, 0x23, 0x6f, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0xce, 0x00, 0x00, 0x04, 0xe4, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0x6d, 0x4c, 0x5b, + 0x55, 0x18, 0xc7, 0x8b, 0x1f, 0x24, 0xe1, 0x03, 0x09, 0x1f, 0x74, 0x1a, 0x86, 0x63, 0x66, 0x95, + 0x10, 0x42, 0x1b, 0x21, 0x82, 0xd1, 0x64, 0xbc, 0x68, 0x60, 0x81, 0x30, 0x40, 0xc8, 0x30, 0xbc, + 0xcb, 0xc6, 0x4a, 0x4b, 0x24, 0x04, 0x75, 0x2a, 0x2c, 0x82, 0x15, 0x37, 0x40, 0x03, 0x68, 0xc8, + 0x60, 0x6c, 0x82, 0x23, 0x6c, 0x83, 0xe1, 0x20, 0x31, 0xb0, 0xe2, 0xe2, 0x60, 0xbc, 0x15, 0xfc, + 0x00, 0x92, 0x10, 0xf6, 0x09, 0x24, 0x8c, 0x77, 0x68, 0x81, 0x96, 0x97, 0x02, 0x05, 0xfe, 0x9e, + 0xe7, 0xd0, 0x5b, 0x2e, 0x05, 0xa3, 0xd3, 0x78, 0x93, 0x5f, 0x6e, 0x4f, 0x4f, 0xfa, 0xfc, 0xee, + 0x79, 0x9e, 0xe7, 0x9e, 0x53, 0x89, 0x44, 0x22, 0x39, 0xc6, 0x38, 0xfd, 0x3f, 0xe3, 0xcc, 0x90, + 0xbc, 0x35, 0x3c, 0x3c, 0x3c, 0xa3, 0xd3, 0xe9, 0xcc, 0x3a, 0xbd, 0xde, 0xac, 0x27, 0x16, 0x17, + 0xcd, 0x8b, 0xc4, 0xd2, 0x12, 0x67, 0x49, 0x60, 0x79, 0xd9, 0xbc, 0x2c, 0xc6, 0x60, 0xe0, 0x18, + 0x2c, 0x4c, 0x4d, 0x4d, 0x59, 0x3f, 0x0b, 0x8c, 0x8f, 0x8f, 0xeb, 0x99, 0xe3, 0x1d, 0x2e, 0x7a, + 0x3a, 0x39, 0x69, 0x9c, 0x9d, 0x9b, 0xc7, 0xdc, 0xfc, 0x02, 0x16, 0x74, 0x3a, 0x64, 0x67, 0x67, + 0x83, 0x49, 0xc1, 0x84, 0x60, 0x22, 0x0e, 0x93, 0x60, 0x99, 0x30, 0x18, 0x60, 0x20, 0x8c, 0x46, + 0x18, 0x05, 0x56, 0x56, 0x38, 0x72, 0xb9, 0x1c, 0xbd, 0xbd, 0xbd, 0x58, 0x61, 0x9f, 0x05, 0xd8, + 0x03, 0x6f, 0x58, 0x45, 0x93, 0x4c, 0x34, 0xbf, 0xb0, 0x27, 0x21, 0xc1, 0x69, 0x3f, 0xbf, 0x83, + 0x02, 0xdb, 0xe0, 0x42, 0xa0, 0xd5, 0x55, 0xce, 0xaa, 0x85, 0x53, 0x52, 0x29, 0x5c, 0x5c, 0x5c, + 0x70, 0xaf, 0xa1, 0x01, 0xab, 0x6b, 0x6b, 0x1c, 0x96, 0x09, 0x91, 0x68, 0x6a, 0xca, 0x58, 0x71, + 0xfd, 0x3a, 0x14, 0x0a, 0x05, 0x14, 0x69, 0x69, 0x70, 0x76, 0x76, 0x46, 0x1a, 0xbb, 0xa7, 0x29, + 0x95, 0x50, 0x0a, 0xa8, 0x54, 0x50, 0x89, 0x49, 0x4f, 0x47, 0xba, 0x0d, 0x4e, 0x4e, 0x4e, 0x60, + 0xf1, 0xe0, 0xe8, 0xe8, 0x88, 0xaa, 0xaa, 0x2a, 0xac, 0xaf, 0xaf, 0x53, 0x16, 0xf6, 0x45, 0x2c, + 0xb7, 0xc6, 0xdf, 0x07, 0x07, 0xd1, 0xd6, 0xd6, 0x86, 0xf6, 0xf6, 0x76, 0x78, 0x79, 0x79, 0xe1, + 0x71, 0x47, 0x07, 0x3a, 0x3a, 0x3b, 0xd1, 0x29, 0xd0, 0xd5, 0x85, 0xae, 0xee, 0x6e, 0x74, 0x13, + 0x3d, 0x3d, 0xe8, 0x21, 0xb4, 0x5a, 0x68, 0x45, 0xb8, 0xba, 0xba, 0xc2, 0xce, 0xce, 0x0e, 0xee, + 0xee, 0xee, 0x98, 0x98, 0x98, 0x80, 0x69, 0x63, 0xc3, 0x46, 0x34, 0x3d, 0x6d, 0x14, 0xd7, 0xc1, + 0x8f, 0xa5, 0x8e, 0x52, 0x24, 0xa4, 0x87, 0x52, 0xb0, 0xc6, 0xa0, 0x27, 0x5c, 0x37, 0x99, 0x60, + 0x22, 0x58, 0x90, 0x0d, 0x0b, 0x9b, 0x9b, 0x9b, 0x1c, 0x4a, 0x9b, 0xaf, 0xaf, 0x2f, 0x16, 0x58, + 0x19, 0x84, 0xef, 0x58, 0xca, 0xf7, 0x45, 0xd3, 0x4c, 0x64, 0xad, 0x05, 0x13, 0xf8, 0xfb, 0xfb, + 0x73, 0x09, 0xe5, 0x5d, 0x10, 0x34, 0xff, 0x50, 0x80, 0x96, 0xab, 0x49, 0xb8, 0x95, 0x9b, 0xcc, + 0x83, 0xdf, 0xb9, 0xa2, 0xc4, 0x83, 0x82, 0x64, 0xfc, 0x5c, 0x9e, 0x87, 0xb9, 0xb9, 0x39, 0x34, + 0xe4, 0xc5, 0x22, 0x37, 0xd2, 0x1d, 0x1d, 0x8d, 0x55, 0xd8, 0xda, 0xda, 0xb2, 0x72, 0x48, 0x24, + 0x48, 0xa8, 0xd0, 0x24, 0x12, 0xaf, 0x82, 0x56, 0xd0, 0xa2, 0x8e, 0xc6, 0xfa, 0xc7, 0x12, 0x68, + 0x52, 0x8f, 0xf3, 0x00, 0x0f, 0x54, 0x6e, 0x30, 0xd1, 0xf8, 0x8b, 0x10, 0x8c, 0x8c, 0x8c, 0x60, + 0x4c, 0x29, 0xe1, 0xe3, 0xb6, 0xf2, 0x4b, 0x30, 0x9b, 0xcd, 0x56, 0x0e, 0x8a, 0x66, 0x66, 0x8c, + 0x82, 0x84, 0x52, 0x45, 0xa2, 0x35, 0x4b, 0x9a, 0xa8, 0x6e, 0x09, 0x09, 0x09, 0xb8, 0x1c, 0x7a, + 0x02, 0x95, 0xea, 0x0c, 0x7c, 0x1d, 0xf1, 0x2a, 0x92, 0x92, 0x92, 0x90, 0x7f, 0xf6, 0x15, 0xdc, + 0xfa, 0x36, 0x07, 0x97, 0x43, 0x5c, 0x10, 0x15, 0x15, 0x85, 0x9a, 0x54, 0x39, 0x2a, 0x3e, 0x4f, + 0xc4, 0xa5, 0x70, 0x19, 0x9f, 0x2f, 0x2c, 0x2c, 0xc4, 0xf6, 0xf6, 0x36, 0x95, 0x60, 0x5f, 0x34, + 0xc3, 0x44, 0x46, 0x51, 0x3d, 0xfc, 0x03, 0x02, 0xf6, 0x6a, 0xc1, 0x52, 0x54, 0x50, 0x50, 0x80, + 0xfa, 0xfa, 0x7a, 0xdc, 0xce, 0x7a, 0x17, 0x8f, 0x15, 0xc7, 0xd0, 0x90, 0xf0, 0x12, 0xfa, 0xfa, + 0xfa, 0x70, 0x2f, 0xf9, 0x04, 0x1e, 0x5d, 0x7c, 0x19, 0x77, 0x33, 0xde, 0x46, 0x53, 0x53, 0x13, + 0xfa, 0x2f, 0x3c, 0x8f, 0xdf, 0x54, 0x2f, 0xe0, 0x4e, 0x5e, 0x22, 0x9f, 0x8f, 0x8d, 0x8d, 0x3d, + 0x5a, 0xc4, 0x6b, 0x42, 0xe9, 0x62, 0x2b, 0x09, 0x60, 0x22, 0xa1, 0xc8, 0xf4, 0x64, 0x24, 0xfa, + 0x3e, 0x23, 0x1c, 0x8d, 0xa9, 0xa7, 0x70, 0xf5, 0x9c, 0x07, 0x0f, 0x54, 0x18, 0xf7, 0x3a, 0x1f, + 0x97, 0x28, 0x83, 0xd1, 0xdc, 0xdc, 0x8c, 0x9b, 0x71, 0x27, 0xf9, 0xf8, 0x66, 0x5e, 0x1a, 0x9f, + 0x8f, 0x8b, 0x8b, 0xc3, 0xce, 0xce, 0xce, 0x61, 0x91, 0xb5, 0xf0, 0x6c, 0x25, 0x24, 0x22, 0x09, + 0xd5, 0x42, 0xad, 0x56, 0x23, 0x25, 0x25, 0x85, 0xb7, 0x2f, 0x05, 0xf8, 0xa7, 0x90, 0x68, 0x77, + 0x77, 0xd7, 0x46, 0x34, 0x3b, 0x6b, 0x14, 0x17, 0x9e, 0x44, 0x42, 0xd7, 0x94, 0x96, 0x96, 0x22, + 0x27, 0x27, 0x07, 0xc5, 0xc5, 0xc5, 0xff, 0x4a, 0xc4, 0x32, 0xb5, 0x2f, 0x9a, 0x25, 0x91, 0x45, + 0x42, 0x29, 0x13, 0x44, 0xd4, 0x35, 0x54, 0xa3, 0xa0, 0xa0, 0x20, 0xd4, 0xd6, 0xd6, 0x3e, 0xb3, + 0x88, 0xae, 0x43, 0x22, 0xbe, 0x1a, 0x4b, 0x5d, 0x02, 0x03, 0x03, 0xad, 0xed, 0x49, 0x35, 0x2a, + 0x2b, 0x2b, 0x7b, 0x26, 0x89, 0xb8, 0x19, 0x0c, 0xe2, 0xd4, 0x91, 0x48, 0x58, 0x8d, 0xad, 0xa8, + 0xa8, 0xa8, 0x88, 0x37, 0xc3, 0x77, 0x99, 0xef, 0xe1, 0xbe, 0xc2, 0x1d, 0x57, 0x62, 0x64, 0x7b, + 0xcd, 0x10, 0xff, 0x06, 0x1f, 0x97, 0xa4, 0x87, 0xa0, 0xa5, 0xa5, 0x05, 0x37, 0xe2, 0xa5, 0x7c, + 0x7c, 0xf3, 0x4b, 0x15, 0x9f, 0x8f, 0x89, 0x89, 0xa1, 0x0d, 0x15, 0xf3, 0x3a, 0xdd, 0x61, 0x91, + 0xd0, 0x00, 0x82, 0x88, 0x9e, 0x48, 0x10, 0x51, 0x7b, 0x3f, 0x4a, 0x3d, 0xd8, 0xde, 0x0f, 0x2f, + 0x1c, 0x6c, 0x6f, 0x6d, 0xda, 0x7e, 0x7b, 0x47, 0x47, 0x47, 0x63, 0xf8, 0xc9, 0x13, 0x74, 0x6a, + 0xb5, 0x74, 0x1e, 0xbd, 0x69, 0x15, 0x51, 0x8b, 0x7a, 0x7a, 0x7a, 0xc2, 0xc7, 0xc7, 0x87, 0xef, + 0xbe, 0x74, 0x97, 0xc9, 0x64, 0x28, 0x2f, 0x2f, 0xb7, 0xbc, 0xb0, 0xae, 0xa8, 0xfc, 0x2a, 0x13, + 0xf9, 0x11, 0x27, 0x91, 0x98, 0x98, 0x08, 0x75, 0x98, 0x0b, 0x6a, 0x4a, 0x72, 0x91, 0x73, 0xe6, + 0x38, 0x42, 0x43, 0x43, 0x51, 0x7d, 0x5e, 0x86, 0x6b, 0x9f, 0x25, 0x21, 0xe3, 0xcc, 0x6b, 0x88, + 0x8c, 0x8c, 0x44, 0x66, 0x66, 0x26, 0x3a, 0xba, 0xba, 0x36, 0x3d, 0x3c, 0x3c, 0x62, 0x58, 0xa9, + 0x24, 0x56, 0x11, 0xa5, 0x8d, 0xde, 0x68, 0x07, 0x07, 0x07, 0xbe, 0xd5, 0xd3, 0x9d, 0x8e, 0x03, + 0x7a, 0x17, 0x08, 0x4d, 0xfe, 0x39, 0x18, 0xb3, 0x24, 0x68, 0xbd, 0xe8, 0xc2, 0xc7, 0xb4, 0x05, + 0xad, 0xb0, 0x71, 0xe3, 0x27, 0x01, 0xa8, 0xae, 0xae, 0xc6, 0x1f, 0x6c, 0x0b, 0xa2, 0x71, 0x7b, + 0xc5, 0xa7, 0xac, 0x01, 0x8c, 0xf8, 0xe5, 0xd7, 0x87, 0x9b, 0x6e, 0x6e, 0x6e, 0x81, 0x24, 0x39, + 0x24, 0xa2, 0xb4, 0x85, 0x87, 0x87, 0xc3, 0xde, 0xde, 0x1e, 0x61, 0x61, 0x61, 0x3c, 0x75, 0x82, + 0xa8, 0xf5, 0xc7, 0x6f, 0xd0, 0x5a, 0x94, 0x82, 0x5a, 0xf5, 0x79, 0xfe, 0x7d, 0x6d, 0xbe, 0x02, + 0x8d, 0x79, 0xef, 0xa3, 0x3a, 0xff, 0x43, 0x2e, 0xba, 0xaf, 0x8e, 0x87, 0xa6, 0xf0, 0x03, 0xb4, + 0x35, 0xdc, 0xc0, 0x4f, 0x4d, 0x8d, 0x26, 0x6f, 0x6f, 0x6f, 0x2f, 0x41, 0x72, 0xa4, 0x88, 0x6a, + 0x45, 0x47, 0x39, 0xdd, 0xc5, 0x22, 0x7a, 0x27, 0x08, 0xba, 0xa8, 0x7e, 0xec, 0x88, 0xc6, 0xd8, + 0xd8, 0x18, 0x06, 0x06, 0x06, 0x50, 0x57, 0x57, 0xc7, 0x7f, 0xcb, 0xe2, 0xe0, 0x5a, 0x65, 0xc5, + 0x72, 0x70, 0x70, 0x80, 0x9b, 0x58, 0x72, 0x50, 0x64, 0x69, 0x04, 0xa1, 0xdb, 0x48, 0x62, 0x2b, + 0xa2, 0x8b, 0xee, 0x34, 0xcf, 0xfe, 0xc4, 0x60, 0x74, 0x74, 0x14, 0xfd, 0xfd, 0xfd, 0xd0, 0x68, + 0x34, 0x5c, 0x9a, 0xf1, 0x51, 0xd6, 0xa0, 0x54, 0x2a, 0x75, 0xb4, 0x95, 0x1c, 0xb9, 0x22, 0x41, + 0x76, 0x94, 0x48, 0xbc, 0x22, 0x6a, 0x5d, 0x0a, 0x4e, 0xbb, 0x3b, 0x3b, 0x8d, 0x77, 0x42, 0x23, + 0xce, 0x56, 0xb0, 0x58, 0xcf, 0x1d, 0x25, 0xb1, 0x8a, 0x86, 0x86, 0x86, 0xa6, 0xe8, 0xdc, 0xa0, + 0x7d, 0x49, 0x80, 0xde, 0x68, 0x31, 0x6c, 0x2f, 0xb4, 0x42, 0xf3, 0xf3, 0x3a, 0xfd, 0xc6, 0xe8, + 0xf8, 0xd3, 0x8d, 0x9a, 0xbb, 0xf5, 0x7a, 0xb9, 0xdc, 0x2b, 0xe1, 0xaf, 0x04, 0x62, 0xd1, 0x8b, + 0x24, 0xfb, 0x0f, 0x48, 0xff, 0x4e, 0x42, 0xfc, 0x09, 0x7a, 0x54, 0x50, 0xa3, 0xa0, 0x06, 0xf6, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE post_compo_xpm[1] = {{ png, sizeof( png ), "post_compo_xpm" }}; diff --git a/bitmaps_png/cpp_26/post_drill.cpp b/bitmaps_png/cpp_26/post_drill.cpp index 634854c3ed..3de850346c 100644 --- a/bitmaps_png/cpp_26/post_drill.cpp +++ b/bitmaps_png/cpp_26/post_drill.cpp @@ -8,76 +8,86 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, - 0xce, 0x00, 0x00, 0x04, 0x44, 0x49, 0x44, 0x41, 0x54, 0x48, 0x4b, 0xbd, 0x95, 0x49, 0x4c, 0x9c, - 0x65, 0x18, 0xc7, 0x07, 0x22, 0x06, 0x1d, 0x20, 0x40, 0x42, 0x58, 0x84, 0x70, 0x00, 0x09, 0x54, - 0x9a, 0x12, 0x6a, 0x0f, 0xd2, 0x18, 0x61, 0x94, 0x4d, 0xc4, 0xcb, 0x84, 0x82, 0x04, 0x08, 0x3b, - 0x27, 0x30, 0x2a, 0x42, 0x49, 0x43, 0x68, 0xe8, 0x91, 0x43, 0x0f, 0x26, 0x1a, 0x8a, 0xf5, 0xc2, - 0x05, 0x0e, 0x96, 0x04, 0x3d, 0x48, 0x62, 0xc0, 0x69, 0xb5, 0x24, 0x0e, 0x05, 0x84, 0x03, 0x08, - 0x0e, 0x3b, 0x61, 0x99, 0x85, 0x6d, 0x16, 0x60, 0x80, 0xbf, 0xef, 0xf3, 0x74, 0x5e, 0xfa, 0xcd, - 0xf0, 0xd1, 0xc4, 0x44, 0x25, 0xf9, 0xe7, 0x5b, 0xf8, 0xe6, 0xf9, 0x3d, 0xfb, 0xab, 0x01, 0xa0, - 0xf9, 0x3f, 0x74, 0x7e, 0x93, 0x96, 0x96, 0x56, 0xd7, 0xd0, 0xd0, 0xd0, 0xf5, 0x6f, 0x2b, 0x25, - 0x25, 0xa5, 0xcc, 0x0b, 0xd4, 0xd9, 0xd9, 0xf9, 0xbd, 0x6d, 0x67, 0x07, 0x16, 0x8b, 0x05, 0x16, - 0xab, 0x15, 0x56, 0xdb, 0x0e, 0xe8, 0x79, 0x67, 0x77, 0x17, 0xbb, 0x7b, 0x7b, 0xd8, 0x93, 0xda, - 0xdf, 0xc7, 0x3e, 0xe9, 0xe0, 0x80, 0x75, 0x40, 0xb2, 0xdb, 0x59, 0xb3, 0xb3, 0xb3, 0xfc, 0x6c, - 0x17, 0xf7, 0x24, 0xa7, 0xd3, 0x89, 0xe6, 0xe6, 0xe6, 0xef, 0x2e, 0x80, 0xcc, 0x16, 0x2b, 0xb6, - 0xcd, 0x66, 0x98, 0x05, 0xac, 0xa5, 0xb5, 0x15, 0x7f, 0x99, 0x4c, 0xcf, 0x61, 0xbe, 0x40, 0x05, - 0x8c, 0x41, 0x1e, 0xd8, 0xed, 0xb6, 0x36, 0x64, 0x66, 0x66, 0xf2, 0xef, 0xe9, 0xd9, 0x71, 0x19, - 0xc8, 0x2a, 0x22, 0xa1, 0x88, 0xe8, 0x5a, 0x59, 0x59, 0x89, 0x3f, 0xe7, 0xe6, 0xbc, 0x00, 0x5e, - 0xc6, 0x3d, 0x5e, 0xdb, 0x1d, 0x0e, 0x38, 0x3c, 0x12, 0x46, 0xe1, 0xef, 0xef, 0x8f, 0xf4, 0xf4, - 0x74, 0x2c, 0x2f, 0x2f, 0xc3, 0xe5, 0x72, 0xa9, 0x83, 0x26, 0x26, 0x27, 0x91, 0x93, 0x93, 0xc3, - 0x8a, 0x8d, 0x8b, 0x43, 0x56, 0x56, 0x16, 0x72, 0x73, 0x73, 0x5f, 0x28, 0x2f, 0x0f, 0x79, 0x6a, - 0xca, 0xcf, 0x47, 0xbe, 0x50, 0x42, 0x42, 0x82, 0xb0, 0xa8, 0x81, 0x9f, 0x9f, 0x1f, 0x0a, 0x0b, - 0x0b, 0x71, 0x78, 0x78, 0xa8, 0x0e, 0x22, 0xef, 0x65, 0x5d, 0xaa, 0xaa, 0xaa, 0x38, 0x75, 0x1c, - 0x81, 0xc7, 0x7b, 0xf6, 0x5c, 0xa4, 0x83, 0x72, 0x4f, 0xde, 0x92, 0xc8, 0x98, 0x54, 0x4b, 0x4b, - 0x0b, 0x02, 0x02, 0x02, 0x90, 0x9d, 0x9d, 0xcd, 0x51, 0x1f, 0x1d, 0x1d, 0xa9, 0x83, 0x28, 0x45, - 0x32, 0x55, 0xd5, 0xd5, 0xd5, 0x58, 0x58, 0x58, 0x78, 0x91, 0x1e, 0x05, 0x80, 0x8c, 0x76, 0x74, - 0x74, 0xb0, 0x21, 0xd2, 0xf1, 0xf1, 0x31, 0xab, 0xbd, 0xbd, 0x1d, 0x7a, 0xbd, 0x9e, 0xff, 0x4f, - 0xcf, 0x6e, 0xb7, 0x5b, 0x1d, 0x44, 0x45, 0x96, 0xb5, 0x20, 0xd0, 0xe2, 0xe2, 0x22, 0x47, 0xa1, - 0x04, 0x90, 0x61, 0x6a, 0x8e, 0x82, 0x82, 0x02, 0x7e, 0x2f, 0x0d, 0x92, 0xa8, 0x2e, 0xf2, 0x9e, - 0x74, 0x72, 0x72, 0xa2, 0x0e, 0xe2, 0x96, 0x15, 0x10, 0x0a, 0xbb, 0xa6, 0xa6, 0x06, 0x4b, 0x4b, - 0x4b, 0x5e, 0x90, 0xe1, 0xe1, 0x61, 0xd4, 0xd7, 0xd7, 0xa3, 0xa4, 0xa4, 0x04, 0x37, 0x6f, 0xbe, - 0x8d, 0xae, 0x2e, 0x3d, 0xee, 0xde, 0xfd, 0x12, 0xab, 0xab, 0xab, 0xe7, 0x86, 0x7d, 0xa5, 0x0a, - 0xa2, 0x34, 0xc9, 0x39, 0x20, 0xd0, 0xf2, 0xca, 0x0a, 0x5c, 0x9e, 0x28, 0xfa, 0xfb, 0xfb, 0x51, - 0x5a, 0x5a, 0x8a, 0xf8, 0xf8, 0x78, 0x24, 0x25, 0x25, 0xe1, 0xd6, 0xad, 0x0f, 0x30, 0x3d, 0xad, - 0x11, 0xb3, 0xf3, 0x1a, 0xee, 0xdd, 0x2b, 0xc6, 0xfc, 0xfc, 0xfc, 0x05, 0xc8, 0xe9, 0xe9, 0xe9, - 0xe5, 0x20, 0x59, 0xf4, 0x9a, 0xda, 0x5a, 0xf6, 0x94, 0x20, 0x54, 0x2b, 0x02, 0x87, 0x84, 0x84, - 0x70, 0x57, 0xc5, 0x89, 0x8e, 0x24, 0xd0, 0xc4, 0x84, 0x06, 0x06, 0x83, 0x46, 0xa4, 0xec, 0x55, - 0xb4, 0xb5, 0xd5, 0xb3, 0x61, 0x5f, 0xa9, 0x83, 0x3c, 0xf3, 0x40, 0xe9, 0xaa, 0x15, 0xa0, 0xb5, - 0xb5, 0x35, 0xae, 0x41, 0x4f, 0x4f, 0x0f, 0x0f, 0x62, 0x50, 0x50, 0x10, 0x2b, 0x31, 0x31, 0x91, - 0x41, 0x33, 0x33, 0x1a, 0x3c, 0x7b, 0x46, 0x51, 0x69, 0xd0, 0xdb, 0xfb, 0x11, 0x3b, 0x74, 0x76, - 0x76, 0xe6, 0x25, 0x55, 0x90, 0xb2, 0xb3, 0x08, 0x64, 0x30, 0x18, 0x50, 0x51, 0x51, 0x81, 0xd4, - 0xd4, 0x54, 0x5c, 0xb9, 0x92, 0x24, 0xae, 0xc9, 0xb8, 0x7a, 0x35, 0x05, 0xd7, 0xae, 0xbd, 0x85, - 0xd8, 0xd8, 0x37, 0x50, 0x54, 0xf4, 0xa1, 0x00, 0x16, 0xb0, 0xf2, 0xf2, 0x74, 0x3c, 0x7f, 0x34, - 0xe8, 0xbb, 0xa2, 0x73, 0x5f, 0x0a, 0x22, 0x88, 0xd3, 0x53, 0xf8, 0xba, 0xba, 0x3a, 0x8e, 0x88, - 0x8a, 0xdc, 0xdd, 0xdd, 0x2d, 0xbc, 0x7e, 0x93, 0xbd, 0x1f, 0x1b, 0xd3, 0xc0, 0x64, 0xd2, 0xf2, - 0x80, 0x46, 0x44, 0x44, 0x20, 0x38, 0x38, 0x18, 0x61, 0x61, 0x61, 0x0c, 0x30, 0x89, 0xb9, 0x93, - 0x00, 0xf9, 0xa7, 0x0a, 0x92, 0x43, 0x48, 0x75, 0x21, 0xd0, 0xfa, 0xfa, 0x3a, 0x83, 0xa8, 0xd0, - 0xf7, 0xef, 0x17, 0x61, 0x72, 0xf2, 0x79, 0x4d, 0xa8, 0x01, 0x08, 0xa4, 0xd5, 0x6a, 0xcf, 0x6b, - 0xd6, 0xd8, 0xd8, 0xc8, 0x69, 0x56, 0xce, 0x96, 0xfb, 0xb2, 0xae, 0xa3, 0x0e, 0x93, 0xb3, 0xa2, - 0x04, 0x51, 0x07, 0x3d, 0x7c, 0xf8, 0x2d, 0x1e, 0x3d, 0xd2, 0x31, 0x6c, 0x6e, 0xee, 0x75, 0x06, - 0x45, 0x47, 0x47, 0x43, 0x1c, 0x03, 0x28, 0x2f, 0x2f, 0x17, 0x91, 0x8e, 0x61, 0x6b, 0x6b, 0x8b, - 0x7f, 0x43, 0xda, 0xd8, 0xd8, 0xe0, 0x13, 0xe0, 0xd3, 0xcf, 0xbe, 0xb8, 0x08, 0xa2, 0xd4, 0x51, - 0x7e, 0xe5, 0xc0, 0xca, 0xcd, 0x40, 0x51, 0x52, 0x07, 0x0d, 0x0d, 0x0d, 0xe1, 0xce, 0x9d, 0x6a, - 0x3c, 0x78, 0x50, 0x84, 0x8c, 0x8c, 0x0c, 0x94, 0x95, 0x95, 0xa1, 0xa9, 0xa9, 0x09, 0xa3, 0xa3, - 0xa3, 0xfc, 0xed, 0xcc, 0xcc, 0x0c, 0xa6, 0xa6, 0xa6, 0x60, 0x34, 0x1a, 0xf1, 0xdb, 0xd3, 0xa7, - 0x18, 0x79, 0xfc, 0xc4, 0x99, 0x76, 0xfd, 0xfa, 0x27, 0x17, 0x40, 0x36, 0x9b, 0x0d, 0xe2, 0x00, - 0x44, 0x54, 0x54, 0x14, 0xa7, 0x25, 0x26, 0x26, 0x06, 0xa1, 0xa1, 0xa1, 0xdc, 0x14, 0x04, 0x92, - 0xf9, 0xdf, 0xdc, 0xdc, 0xe4, 0x65, 0x2a, 0x23, 0x18, 0x1f, 0x1f, 0xe7, 0x88, 0x28, 0xc5, 0xb4, - 0xfd, 0x5d, 0x2e, 0x27, 0x7e, 0x37, 0x1a, 0x4f, 0x04, 0x44, 0x2f, 0xed, 0x7b, 0x81, 0x28, 0x65, - 0x66, 0x71, 0x1e, 0x11, 0x8c, 0x72, 0x1f, 0x1e, 0x1e, 0xce, 0x8d, 0x20, 0x67, 0x42, 0x16, 0x99, - 0xae, 0xc5, 0xc5, 0xc5, 0xd8, 0xde, 0xde, 0x66, 0xe3, 0x83, 0x83, 0x83, 0xe7, 0xdf, 0x38, 0x1c, - 0x76, 0x0c, 0xff, 0x32, 0xe2, 0xbe, 0xf1, 0xce, 0x8d, 0xf7, 0xa5, 0x6d, 0x55, 0x10, 0x89, 0xbc, - 0x4c, 0x4e, 0x4e, 0xe6, 0x6d, 0x2c, 0x27, 0x5c, 0x09, 0xa2, 0x7b, 0x4a, 0x31, 0x75, 0xe5, 0xf4, - 0xf4, 0x34, 0xfa, 0xfa, 0xfa, 0xce, 0xdf, 0x0d, 0xfe, 0xf8, 0xc3, 0xb1, 0x2e, 0x47, 0x97, 0xa1, - 0x84, 0x5c, 0x0a, 0xa2, 0x8e, 0xa1, 0x14, 0x28, 0x57, 0x89, 0xb2, 0x6d, 0xe9, 0x1d, 0xd5, 0x91, - 0x96, 0xe8, 0xa4, 0x38, 0xc3, 0x06, 0x06, 0x06, 0xf8, 0xfb, 0xaf, 0xbe, 0xf9, 0xda, 0xa6, 0xd3, - 0xe9, 0x92, 0x7c, 0x21, 0x2f, 0x05, 0x29, 0x97, 0xa4, 0x1a, 0x88, 0x76, 0xe2, 0x8a, 0xd8, 0x85, - 0x54, 0x9b, 0xc7, 0x4f, 0x7e, 0xc5, 0xe7, 0xb7, 0x5b, 0xff, 0x88, 0x8c, 0x8c, 0xd4, 0xfa, 0x02, - 0x54, 0x41, 0xca, 0xf5, 0xee, 0x9b, 0x32, 0x25, 0x88, 0xae, 0x87, 0xc2, 0xa1, 0x2d, 0xb3, 0x05, - 0x3f, 0xfd, 0x3c, 0xe2, 0x2e, 0x29, 0x2f, 0xef, 0x15, 0x35, 0x7d, 0xc5, 0xd7, 0xb8, 0x2a, 0x28, - 0x30, 0x30, 0xf0, 0x3d, 0xd1, 0x65, 0x1f, 0xff, 0x53, 0x89, 0xdd, 0xf7, 0xae, 0x80, 0xf8, 0xf9, - 0x1a, 0xf6, 0xd5, 0x85, 0x17, 0xff, 0x95, 0xfe, 0x06, 0xd8, 0xdb, 0xd8, 0xd9, 0x0f, 0x89, 0xfd, - 0xaf, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0xce, 0x00, 0x00, 0x04, 0xe5, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x95, 0x59, 0x48, 0xdc, + 0x57, 0x14, 0x87, 0xc7, 0x14, 0x69, 0x68, 0x10, 0x97, 0x5a, 0xf3, 0xa2, 0xa2, 0x3e, 0x89, 0x7d, + 0x48, 0xc4, 0xda, 0x4a, 0x3a, 0xc1, 0xb8, 0x90, 0x2e, 0xc4, 0x25, 0xa9, 0x4b, 0x8b, 0xfa, 0xe0, + 0x43, 0xfb, 0xa2, 0xa5, 0x90, 0x4c, 0xd4, 0xd1, 0x5a, 0xf4, 0x49, 0x5c, 0xe2, 0x83, 0xa0, 0x42, + 0x1a, 0xd7, 0x8a, 0x2d, 0x88, 0xf5, 0x41, 0xb4, 0xb6, 0x9a, 0xb8, 0x44, 0x6b, 0x35, 0x71, 0x89, + 0x62, 0x46, 0x8d, 0x71, 0xaf, 0xcb, 0x8c, 0xdb, 0xa8, 0xa3, 0xe3, 0xfa, 0xeb, 0x39, 0x37, 0xf3, + 0x9f, 0xcc, 0x8c, 0x5a, 0x02, 0xa5, 0x03, 0x1f, 0xfa, 0xdf, 0xee, 0x77, 0xef, 0x39, 0xe7, 0x9e, + 0x2b, 0x93, 0xc9, 0x64, 0x6f, 0x13, 0xbe, 0xff, 0x33, 0x2e, 0x84, 0xec, 0xdd, 0xf2, 0xf2, 0xf2, + 0xa7, 0x4b, 0x6a, 0xb5, 0x7e, 0x99, 0x50, 0xab, 0x35, 0x7a, 0x8d, 0x86, 0x58, 0x59, 0x11, 0xac, + 0x30, 0xab, 0xab, 0x82, 0x55, 0x4b, 0xd6, 0xd6, 0x8c, 0xac, 0x9d, 0x01, 0x7d, 0xaf, 0x23, 0x47, + 0x94, 0x10, 0x35, 0x34, 0x34, 0xa8, 0x96, 0x96, 0x97, 0x41, 0x22, 0xa8, 0x35, 0x1a, 0x34, 0xb7, + 0xb4, 0x40, 0x35, 0x3a, 0x0a, 0x1a, 0x00, 0x6b, 0xcc, 0xfa, 0x3a, 0xd6, 0x37, 0x36, 0xb0, 0xc1, + 0x68, 0xb5, 0xd0, 0x32, 0x9b, 0x9b, 0x82, 0x4d, 0x66, 0x6b, 0x4b, 0x30, 0x32, 0x32, 0x82, 0xc4, + 0xc4, 0x44, 0x71, 0x6f, 0xcb, 0x70, 0x4f, 0xbf, 0xb7, 0x07, 0x33, 0x11, 0x0b, 0x68, 0x05, 0xa0, + 0x99, 0x43, 0x71, 0xf7, 0x2e, 0x7e, 0x6b, 0x6a, 0x3a, 0x29, 0x30, 0x19, 0x78, 0x4b, 0x62, 0x7b, + 0x1b, 0xdb, 0x06, 0x58, 0x64, 0x67, 0x67, 0x87, 0xc0, 0xc0, 0x40, 0x31, 0xe1, 0x6d, 0x9d, 0x0e, + 0x7b, 0x96, 0xa2, 0xa1, 0xe1, 0x61, 0xfc, 0xf8, 0xe0, 0x01, 0x1e, 0x94, 0x94, 0x20, 0x24, 0x24, + 0x04, 0xca, 0xd4, 0x54, 0x94, 0x96, 0x96, 0xa2, 0xb4, 0xac, 0x0c, 0x65, 0x06, 0x28, 0xc4, 0x28, + 0xaf, 0xa8, 0x40, 0x85, 0x25, 0x95, 0x95, 0xa8, 0x24, 0xf2, 0xf3, 0xf3, 0x61, 0x6b, 0x6b, 0x0b, + 0x2b, 0x2b, 0x2b, 0x78, 0x7a, 0x7a, 0x62, 0x62, 0x62, 0x02, 0xfb, 0xfb, 0xfb, 0xe6, 0xa2, 0xbe, + 0xfe, 0x7e, 0x64, 0x67, 0x67, 0x23, 0x3b, 0x27, 0x07, 0xc1, 0xc1, 0xc1, 0x48, 0x48, 0x48, 0x40, + 0x6e, 0x5e, 0x1e, 0xf2, 0x24, 0xee, 0xdd, 0xc3, 0x3d, 0x09, 0x1a, 0x30, 0xff, 0x14, 0xbe, 0x4f, + 0x4f, 0x87, 0x8d, 0x8d, 0x0d, 0x0f, 0x0c, 0x0f, 0x0f, 0x0f, 0x4c, 0xbc, 0x7c, 0x89, 0x83, 0x83, + 0x03, 0x73, 0x11, 0xe7, 0x62, 0x9d, 0x42, 0xc5, 0x61, 0x4a, 0x4a, 0x4a, 0xc2, 0x1f, 0xcd, 0xcd, + 0xaf, 0x42, 0x64, 0x08, 0x8b, 0x8e, 0xc2, 0xa0, 0xdb, 0xd9, 0xc1, 0x0e, 0xc1, 0xd7, 0xfc, 0xae, + 0x5e, 0xaf, 0x17, 0x70, 0x78, 0x98, 0xf1, 0xf1, 0x71, 0xd8, 0xdb, 0xdb, 0xc3, 0xd7, 0xd7, 0x17, + 0xcb, 0x94, 0x73, 0xbe, 0x77, 0x78, 0x78, 0x68, 0x2e, 0x92, 0x24, 0x9c, 0xe8, 0xe4, 0xe4, 0x64, + 0xb4, 0x50, 0x41, 0x58, 0x0a, 0x76, 0x77, 0x77, 0xc5, 0xc0, 0xfd, 0xb4, 0xfa, 0x3b, 0x77, 0xee, + 0x88, 0x81, 0x38, 0x34, 0x12, 0x2f, 0x5e, 0xbc, 0x40, 0x50, 0x50, 0x90, 0xc8, 0xa3, 0x74, 0xef, + 0x84, 0x48, 0x92, 0xf0, 0x4b, 0x2c, 0x7a, 0xf8, 0xf0, 0xa1, 0x90, 0x98, 0x0a, 0x98, 0xc5, 0xc5, + 0x45, 0x91, 0xab, 0x9b, 0x37, 0x6f, 0x62, 0x6c, 0x6c, 0x4c, 0x0c, 0xc6, 0xe1, 0x61, 0xf8, 0x5d, + 0x96, 0x4b, 0xd7, 0xcc, 0xd1, 0xd1, 0xd1, 0x6b, 0x51, 0x63, 0x63, 0xa3, 0x4a, 0x92, 0x70, 0x25, + 0xa5, 0xa4, 0xa4, 0x08, 0x91, 0xa9, 0x64, 0x7e, 0x7e, 0x1e, 0xa9, 0x54, 0x20, 0xd1, 0xd1, 0xd1, + 0x88, 0x89, 0x89, 0x41, 0x5c, 0xdc, 0x27, 0x54, 0x20, 0x9f, 0x53, 0x39, 0x7f, 0x85, 0x47, 0x8f, + 0x1e, 0x89, 0x41, 0x79, 0xf6, 0x96, 0x9c, 0x10, 0x49, 0x12, 0x0e, 0x17, 0x8b, 0xf8, 0x63, 0x49, + 0xc2, 0xf1, 0x8e, 0x8d, 0x8d, 0x15, 0xb1, 0xbf, 0x78, 0xf1, 0x22, 0xae, 0x5f, 0xbf, 0x8e, 0xdb, + 0xb7, 0x6f, 0x60, 0x60, 0x40, 0x86, 0xd1, 0xd1, 0x73, 0xb8, 0x7f, 0xff, 0x06, 0xea, 0xea, 0xea, + 0xde, 0x4c, 0x24, 0x49, 0x38, 0x5c, 0x4a, 0xa5, 0x12, 0xad, 0xad, 0xad, 0xc6, 0x44, 0x73, 0x71, + 0x5c, 0xba, 0x74, 0x49, 0x54, 0x13, 0x13, 0x10, 0x10, 0x20, 0x44, 0x4f, 0x9f, 0xca, 0xd0, 0xde, + 0x2e, 0xa3, 0xdc, 0xc8, 0x90, 0x9e, 0xfe, 0x25, 0x16, 0x16, 0x16, 0xc4, 0xc0, 0xa6, 0x1c, 0x1f, + 0x1f, 0x9b, 0x8b, 0x24, 0x09, 0x87, 0x8b, 0x45, 0x6d, 0x6d, 0x6d, 0x42, 0xc2, 0x13, 0x88, 0x8b, + 0x8b, 0x83, 0x83, 0x83, 0x03, 0x2e, 0x5c, 0xb8, 0x20, 0x90, 0x56, 0x34, 0x3c, 0x2c, 0x43, 0x6f, + 0xaf, 0x0c, 0x43, 0x43, 0xcc, 0x47, 0xa8, 0xaa, 0xaa, 0x12, 0x03, 0x5b, 0x62, 0x2e, 0x32, 0x49, + 0x3c, 0xe7, 0x82, 0x73, 0x14, 0x1e, 0x1e, 0x0e, 0x7f, 0x7f, 0x7f, 0x38, 0x39, 0x39, 0xc1, 0xd5, + 0xd5, 0x15, 0x6e, 0x6e, 0x6e, 0x70, 0x77, 0x77, 0x17, 0xff, 0x7b, 0x78, 0xb8, 0xd1, 0x73, 0x7f, + 0x2a, 0x8a, 0x6b, 0x82, 0xf0, 0xf0, 0x6b, 0xf0, 0xf2, 0xf2, 0xc2, 0xad, 0x5b, 0xb7, 0x50, 0x42, + 0x9b, 0xfe, 0x4c, 0x91, 0x58, 0x8d, 0x21, 0x27, 0x2c, 0x6a, 0x6f, 0x6f, 0x17, 0x09, 0x56, 0x53, + 0xff, 0xcb, 0xcd, 0x8d, 0xa0, 0x5d, 0x6e, 0x4d, 0xb3, 0x7e, 0x4b, 0xd0, 0xd5, 0x25, 0x47, 0x64, + 0x64, 0x24, 0x9c, 0x9d, 0x9d, 0x45, 0xce, 0x98, 0xd0, 0xd0, 0x50, 0x14, 0x15, 0x15, 0xe1, 0xb4, + 0x9f, 0x99, 0xc8, 0x58, 0x61, 0x14, 0xae, 0xb4, 0xb4, 0x34, 0xa3, 0x88, 0x51, 0x28, 0xbe, 0xc1, + 0xf4, 0xf4, 0x3b, 0x22, 0x1f, 0x4c, 0x67, 0xe7, 0x07, 0x88, 0x88, 0x88, 0xc0, 0xf9, 0xf3, 0xe7, + 0x45, 0xce, 0xf8, 0x6f, 0x7c, 0x7c, 0x3c, 0x9e, 0x3d, 0x7b, 0x66, 0x56, 0xda, 0xa7, 0x96, 0xb7, + 0xb4, 0x9a, 0x3d, 0x83, 0xa8, 0xa3, 0xa3, 0xc3, 0x58, 0xb2, 0x83, 0x83, 0x83, 0xc8, 0xc9, 0x89, + 0xa1, 0x9c, 0x9c, 0xc3, 0xe3, 0xc7, 0xaf, 0x45, 0xdc, 0x6e, 0x38, 0xac, 0xbc, 0x9a, 0xac, 0xac, + 0x2c, 0xd1, 0x2d, 0xe8, 0x58, 0x10, 0x51, 0xa0, 0xa3, 0x46, 0x74, 0xfe, 0xed, 0x9d, 0x5d, 0x73, + 0x91, 0x54, 0xca, 0xbc, 0x01, 0x2d, 0x45, 0x3c, 0x2b, 0x2e, 0x77, 0xa5, 0xf2, 0x6b, 0x2a, 0x12, + 0x39, 0x11, 0x8c, 0xa8, 0xa8, 0x28, 0x84, 0x85, 0x85, 0x89, 0x42, 0xc9, 0xcc, 0xcc, 0xc4, 0xcc, + 0xcc, 0x0c, 0x26, 0x27, 0x27, 0x45, 0x1b, 0x1a, 0xa5, 0x23, 0x86, 0x37, 0x33, 0x77, 0xf3, 0xde, + 0xbe, 0x01, 0x3e, 0x8f, 0x3e, 0x33, 0x8a, 0xa6, 0xe9, 0x45, 0xfe, 0x90, 0x5b, 0x3c, 0x27, 0xdd, + 0xc7, 0xc7, 0x47, 0x94, 0xf1, 0x5d, 0x3a, 0x32, 0x24, 0x19, 0x87, 0x97, 0xf7, 0x0b, 0xb7, 0x1f, + 0xb9, 0x5c, 0x8e, 0xe2, 0xe2, 0x62, 0x3c, 0x79, 0xf2, 0x04, 0x53, 0x53, 0x53, 0xe8, 0xe9, 0xe9, + 0xa1, 0x95, 0x76, 0x52, 0xfe, 0xba, 0xd0, 0xd7, 0xd7, 0x87, 0xe7, 0xcf, 0x47, 0xf0, 0x57, 0x4f, + 0xef, 0xe1, 0x95, 0x2b, 0x57, 0xbf, 0x25, 0x87, 0x95, 0x51, 0xc4, 0xab, 0x29, 0x2c, 0x2c, 0x14, + 0x89, 0x95, 0xf6, 0x0b, 0x57, 0x98, 0x4a, 0xa5, 0x32, 0xee, 0x07, 0x86, 0x7f, 0xc3, 0x74, 0xa4, + 0x28, 0x14, 0x0a, 0xd0, 0x29, 0x4b, 0xb9, 0x9b, 0x16, 0x32, 0x5e, 0x0d, 0x3f, 0xe7, 0x77, 0x75, + 0xba, 0x6d, 0x74, 0xfe, 0xd9, 0x75, 0x78, 0xd9, 0xe7, 0x72, 0x04, 0xd7, 0xc2, 0xab, 0x7a, 0x30, + 0x11, 0x71, 0x7e, 0x72, 0xe8, 0x98, 0x70, 0x74, 0x74, 0x84, 0x8b, 0x8b, 0x0b, 0xba, 0xbb, 0xbb, + 0xcd, 0x36, 0x9e, 0x24, 0xe2, 0x76, 0x54, 0x53, 0x53, 0x23, 0x36, 0x28, 0x4f, 0x84, 0xbe, 0x17, + 0xf9, 0xe0, 0x95, 0x73, 0xcf, 0x6c, 0xfc, 0xbd, 0x69, 0xdf, 0x4f, 0xee, 0x17, 0x2c, 0x49, 0x4e, + 0x88, 0xa4, 0x8e, 0x9b, 0x91, 0x91, 0x81, 0xfa, 0xfa, 0x7a, 0x63, 0xc8, 0x2c, 0x45, 0x7c, 0x9f, + 0x7b, 0x23, 0xe7, 0x85, 0x2b, 0xad, 0xba, 0xba, 0x9a, 0x26, 0xa9, 0x17, 0x05, 0x50, 0xf1, 0x53, + 0xa5, 0x2e, 0x24, 0xe4, 0x53, 0x3f, 0x53, 0xc9, 0x99, 0x22, 0xd3, 0x06, 0x79, 0x9a, 0x88, 0x9f, + 0xf3, 0xcc, 0x39, 0x6c, 0x03, 0x03, 0x03, 0xa8, 0xad, 0xad, 0xc5, 0xdc, 0xdc, 0x1c, 0x94, 0x3f, + 0xa4, 0x8f, 0x7b, 0x7b, 0x7b, 0xbf, 0x67, 0x29, 0x39, 0x35, 0x74, 0x6f, 0x22, 0xe2, 0xfb, 0xdc, + 0x84, 0x67, 0x67, 0x67, 0x45, 0x11, 0xd0, 0x21, 0x79, 0xf4, 0x45, 0x74, 0xd4, 0x2f, 0x34, 0x96, + 0xf5, 0x69, 0x12, 0xa3, 0xa8, 0xa0, 0xa0, 0xa0, 0x9b, 0xe2, 0xad, 0xa5, 0xb3, 0xc6, 0x8c, 0xa5, + 0xa5, 0x25, 0x23, 0xd4, 0xc1, 0x8d, 0xf0, 0xf5, 0xdc, 0xfc, 0xdf, 0x5a, 0xd5, 0xd8, 0xb8, 0xf6, + 0xe7, 0xda, 0x5f, 0x35, 0x1f, 0x5e, 0xfd, 0xf8, 0x3b, 0xae, 0xac, 0xb3, 0x24, 0x92, 0xc8, 0x9a, + 0x78, 0xff, 0x3f, 0xe0, 0xf1, 0x6f, 0x02, 0x89, 0x7f, 0x00, 0x2e, 0xa3, 0x62, 0xef, 0x4d, 0x9e, + 0x78, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE post_drill_xpm[1] = {{ png, sizeof( png ), "post_drill_xpm" }}; diff --git a/bitmaps_png/sources/post_compo.svg b/bitmaps_png/sources/post_compo.svg index 2604c6b47b..c7702de7d6 100644 --- a/bitmaps_png/sources/post_compo.svg +++ b/bitmaps_png/sources/post_compo.svg @@ -1,82 +1,636 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/post_drill.svg b/bitmaps_png/sources/post_drill.svg index 34c70a4b18..9f682055dd 100644 --- a/bitmaps_png/sources/post_drill.svg +++ b/bitmaps_png/sources/post_drill.svg @@ -1,105 +1,442 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index f2fa429907..6d116236cf 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -713,8 +713,46 @@ public: void InstallDialogLayerSetup(); - void GenModulesPosition( wxCommandEvent& event ); - void GenModuleReport( wxCommandEvent& event ); + /** + * Function GenFootprintsPositionFile + * Calls DoGenFootprintsPositionFile to create a footprint position file + * See DoGenFootprintsPositionFile for options and file format + */ + void GenFootprintsPositionFile( wxCommandEvent& event ); + + /** + * Function DoGenFootprintsPositionFile + * Creates an ascii footprint position file + * @param aFullFilename = the full file name of the file to create + * @param aUnitsMM = false to use inches, true to use mm in coordinates + * @param aForceSmdItems = true to force all footprints with smd pads in list + * = false to put only footprints with option "INSERT" in list + * @param aSide = 0 to list footprints on BACK side, + * 1 to list footprints on FRONT side + * 2 to list footprints on both sides + * @return the number of footprints found on aSide side, + * or -1 if the file could not be created + */ + int DoGenFootprintsPositionFile( const wxString& aFullFileName, bool aUnitsMM, + bool aForceSmdItems, int aSide ); + + /** + * Function GenFootprintsReport + * Calls DoGenFootprintsReport to create a footprint reprot file + * See DoGenFootprintsReport for file format + */ + void GenFootprintsReport( wxCommandEvent& event ); + + /** + * Function DoGenFootprintsReport + * Creates an ascii footprint report file giving some infos on footprints + * and board outlines + * @param aFullFilename = the full file name of the file to create + * @param aUnitsMM = false to use inches, true to use mm in coordinates + * @return true if OK, false if error + */ + bool DoGenFootprintsReport( const wxString& aFullFilename, bool aUnitsMM ); + void InstallDrillFrame( wxCommandEvent& event ); void ToPostProcess( wxCommandEvent& event ); diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 7f191e3777..92140becdc 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -43,6 +43,7 @@ set(PCBNEW_DIALOGS dialogs/dialog_freeroute_exchange_base.cpp dialogs/dialog_gendrill.cpp dialogs/dialog_gendrill_base.cpp + dialogs/dialog_gen_module_position_file_base.cpp dialogs/dialog_general_options.cpp dialogs/dialog_general_options_BoardEditor_base.cpp dialogs/dialog_global_edit_tracks_and_vias.cpp diff --git a/pcbnew/dialogs/dialog_gen_module_position_file_base.cpp b/pcbnew/dialogs/dialog_gen_module_position_file_base.cpp new file mode 100644 index 0000000000..77ee34bfd7 --- /dev/null +++ b/pcbnew/dialogs/dialog_gen_module_position_file_base.cpp @@ -0,0 +1,111 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Jun 30 2011) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_gen_module_position_file_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_GEN_MODULE_POSITION_BASE::DIALOG_GEN_MODULE_POSITION_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + + m_MainSizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bUpperSizer; + bUpperSizer = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bDirSizer; + bDirSizer = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDir = new wxStaticText( this, wxID_ANY, _("Output directory:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDir->Wrap( -1 ); + bDirSizer->Add( m_staticTextDir, 0, wxEXPAND|wxTOP|wxLEFT, 5 ); + + wxBoxSizer* bSizerdirBrowse; + bSizerdirBrowse = new wxBoxSizer( wxHORIZONTAL ); + + m_outputDirectoryName = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_outputDirectoryName->SetToolTip( _("Target directory for plot files. Can be absolute or relative to the board file location.") ); + m_outputDirectoryName->SetMinSize( wxSize( 350,-1 ) ); + + bSizerdirBrowse->Add( m_outputDirectoryName, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_browseButton = new wxButton( this, wxID_ANY, _("Browse..."), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerdirBrowse->Add( m_browseButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + bDirSizer->Add( bSizerdirBrowse, 1, wxEXPAND, 5 ); + + bUpperSizer->Add( bDirSizer, 1, 0, 5 ); + + m_MainSizer->Add( bUpperSizer, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizerOptions; + bSizerOptions = new wxBoxSizer( wxHORIZONTAL ); + + wxString m_radioBoxUnitsChoices[] = { _("Inches"), _("mm") }; + int m_radioBoxUnitsNChoices = sizeof( m_radioBoxUnitsChoices ) / sizeof( wxString ); + m_radioBoxUnits = new wxRadioBox( this, wxID_ANY, _("Units:"), wxDefaultPosition, wxDefaultSize, m_radioBoxUnitsNChoices, m_radioBoxUnitsChoices, 1, wxRA_SPECIFY_COLS ); + m_radioBoxUnits->SetSelection( 0 ); + bSizerOptions->Add( m_radioBoxUnits, 1, wxALL, 5 ); + + wxString m_radioBoxFilesCountChoices[] = { _("One file per side"), _("One file for board") }; + int m_radioBoxFilesCountNChoices = sizeof( m_radioBoxFilesCountChoices ) / sizeof( wxString ); + m_radioBoxFilesCount = new wxRadioBox( this, wxID_ANY, _("Files:"), wxDefaultPosition, wxDefaultSize, m_radioBoxFilesCountNChoices, m_radioBoxFilesCountChoices, 1, wxRA_SPECIFY_COLS ); + m_radioBoxFilesCount->SetSelection( 0 ); + m_radioBoxFilesCount->SetToolTip( _("Creates 2 files: one for each board side or\nCreates only one file containing all footprints to place\n") ); + + bSizerOptions->Add( m_radioBoxFilesCount, 1, wxALL, 5 ); + + wxString m_radioBoxForceSmdChoices[] = { _("With INSERT attribute set"), _("Force INSERT attribute for all SMD footprints") }; + int m_radioBoxForceSmdNChoices = sizeof( m_radioBoxForceSmdChoices ) / sizeof( wxString ); + m_radioBoxForceSmd = new wxRadioBox( this, wxID_ANY, _("Footprints:"), wxDefaultPosition, wxDefaultSize, m_radioBoxForceSmdNChoices, m_radioBoxForceSmdChoices, 1, wxRA_SPECIFY_COLS ); + m_radioBoxForceSmd->SetSelection( 0 ); + m_radioBoxForceSmd->SetToolTip( _("Only footprints with option INSERT are listed in placement file.\nThis option can force this option for all footprints having only SMD pads.\nWarning: this options will modify the board.") ); + + bSizerOptions->Add( m_radioBoxForceSmd, 0, wxALL, 5 ); + + m_MainSizer->Add( bSizerOptions, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxStaticBoxSizer* sbSizerMsg; + sbSizerMsg = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Messages:") ), wxVERTICAL ); + + m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); + m_messagesBox->SetMinSize( wxSize( -1,70 ) ); + + sbSizerMsg->Add( m_messagesBox, 1, wxEXPAND, 5 ); + + m_MainSizer->Add( sbSizerMsg, 1, wxEXPAND, 5 ); + + m_sdbSizerButtons = new wxStdDialogButtonSizer(); + m_sdbSizerButtonsOK = new wxButton( this, wxID_OK ); + m_sdbSizerButtons->AddButton( m_sdbSizerButtonsOK ); + m_sdbSizerButtonsCancel = new wxButton( this, wxID_CANCEL ); + m_sdbSizerButtons->AddButton( m_sdbSizerButtonsCancel ); + m_sdbSizerButtons->Realize(); + m_MainSizer->Add( m_sdbSizerButtons, 0, wxEXPAND|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + this->SetSizer( m_MainSizer ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnClose ) ); + this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnInitDialog ) ); + m_browseButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnOutputDirectoryBrowseClicked ), NULL, this ); + m_sdbSizerButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnCancelButton ), NULL, this ); + m_sdbSizerButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnOKButton ), NULL, this ); +} + +DIALOG_GEN_MODULE_POSITION_BASE::~DIALOG_GEN_MODULE_POSITION_BASE() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnClose ) ); + this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnInitDialog ) ); + m_browseButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnOutputDirectoryBrowseClicked ), NULL, this ); + m_sdbSizerButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnCancelButton ), NULL, this ); + m_sdbSizerButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_GEN_MODULE_POSITION_BASE::OnOKButton ), NULL, this ); + +} diff --git a/pcbnew/dialogs/dialog_gen_module_position_file_base.fbp b/pcbnew/dialogs/dialog_gen_module_position_file_base.fbp new file mode 100644 index 0000000000..90f43401bf --- /dev/null +++ b/pcbnew/dialogs/dialog_gen_module_position_file_base.fbp @@ -0,0 +1,840 @@ + + + + + + C++ + 1 + source_name + 0 + res + UTF-8 + connect + dialog_gen_module_position_file_base + 1000 + none + 1 + Dialog_Gen_Modules_Positions_base + + . + + 1 + 1 + 1 + 0 + + 1 + 1 + 1 + 1 + 0 + + + + + 1 + + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + impl_virtual + + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + + 0 + -1,-1 + 1 + DIALOG_GEN_MODULE_POSITION_BASE + 1 + + + 1 + + + Resizable + + 1 + 501,340 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Position Files: + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + OnClose + + + + + + OnInitDialog + + + + + + + + + + + + + + + + + + + + + + + m_MainSizer + wxVERTICAL + protected + + 5 + wxEXPAND + 0 + + + bUpperSizer + wxHORIZONTAL + none + + 5 + + 1 + + + bDirSizer + wxVERTICAL + none + + 5 + wxEXPAND|wxTOP|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Output directory: + + + 0 + + + 0 + + 1 + m_staticTextDir + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerdirBrowse + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + 350,-1 + 1 + m_outputDirectoryName + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + Target directory for plot files. Can be absolute or relative to the board file location. + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Browse... + + + 0 + + + 0 + + 1 + m_browseButton + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnOutputDirectoryBrowseClicked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxTOP|wxBOTTOM + 0 + + + bSizerOptions + wxHORIZONTAL + none + + 5 + wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + "Inches" "mm" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Units: + + 1 + + 0 + + + 0 + + 1 + m_radioBoxUnits + 1 + + + protected + 1 + + + Resizable + + 0 + 1 + + wxRA_SPECIFY_COLS + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + "One file per side" "One file for board" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Files: + + 1 + + 0 + + + 0 + + 1 + m_radioBoxFilesCount + 1 + + + protected + 1 + + + Resizable + + 0 + 1 + + wxRA_SPECIFY_COLS + + 0 + Creates 2 files: one for each board side or Creates only one file containing all footprints to place + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + "With INSERT attribute set" "Force INSERT attribute for all SMD footprints" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Footprints Selection: + + 1 + + 0 + + + 0 + + 1 + m_radioBoxForceSmd + 1 + + + protected + 1 + + + Resizable + + 0 + 1 + + wxRA_SPECIFY_COLS + + 0 + Only footprints with option INSERT are listed in placement file. This option can force this option for all footprints having only SMD pads. Warning: this options will modify the board. + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + wxID_ANY + Messages: + + sbSizerMsg + wxVERTICAL + none + + + 5 + wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + -1,70 + 1 + m_messagesBox + 1 + + + protected + 1 + + + Resizable + + 1 + + wxTE_MULTILINE|wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxRIGHT + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizerButtons + protected + + OnCancelButton + + + + OnOKButton + + + + + + + + diff --git a/pcbnew/dialogs/dialog_gen_module_position_file_base.h b/pcbnew/dialogs/dialog_gen_module_position_file_base.h new file mode 100644 index 0000000000..cb57d072e3 --- /dev/null +++ b/pcbnew/dialogs/dialog_gen_module_position_file_base.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Jun 30 2011) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __DIALOG_GEN_MODULE_POSITION_FILE_BASE_H__ +#define __DIALOG_GEN_MODULE_POSITION_FILE_BASE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_GEN_MODULE_POSITION_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_GEN_MODULE_POSITION_BASE : public wxDialog +{ + private: + + protected: + wxBoxSizer* m_MainSizer; + wxStaticText* m_staticTextDir; + wxTextCtrl* m_outputDirectoryName; + wxButton* m_browseButton; + wxRadioBox* m_radioBoxUnits; + wxRadioBox* m_radioBoxFilesCount; + wxRadioBox* m_radioBoxForceSmd; + wxTextCtrl* m_messagesBox; + wxStdDialogButtonSizer* m_sdbSizerButtons; + wxButton* m_sdbSizerButtonsOK; + wxButton* m_sdbSizerButtonsCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); } + virtual void OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancelButton( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOKButton( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_GEN_MODULE_POSITION_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Position Files:"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 501,340 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_GEN_MODULE_POSITION_BASE(); + +}; + +#endif //__DIALOG_GEN_MODULE_POSITION_FILE_BASE_H__ diff --git a/pcbnew/gen_modules_placefile.cpp b/pcbnew/gen_modules_placefile.cpp index e6d1860b5e..7740f9929d 100644 --- a/pcbnew/gen_modules_placefile.cpp +++ b/pcbnew/gen_modules_placefile.cpp @@ -1,6 +1,28 @@ /** * @file gen_modules_placefile.cpp */ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2012 KiCad Developers, see CHANGELOG.TXT for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ /* * 1 - create ascii files for automatic placement of smd components @@ -22,44 +44,264 @@ #include #include +#include + +#include -class LIST_MOD // Can list the elements of useful modules. +class LIST_MOD // An helper class used to build a list of useful footprints. { public: - MODULE* m_Module; - const wxChar* m_Reference; - const wxChar* m_Value; + MODULE* m_Module; // Link to the actual footprint + const wxChar* m_Reference; // Its schematic reference + const wxChar* m_Value; // Its schematic value + int m_Layer; // its side (LAYER_N_BACK, or LAYER_N_FRONT) }; +/* + * The dialog to create footprint position files, + * and choose options (one or 2 files, units and force all SMD footprints in list) + */ +class DIALOG_GEN_MODULE_POSITION : public DIALOG_GEN_MODULE_POSITION_BASE +{ +private: + PCB_EDIT_FRAME* m_parent; + static int m_unitsOpt; + static int m_fileOpt; -#if 1 -static const double conv_unit = 0.0001; // units = INCHES -static const char unit_text[] = "## Unit = inches, Angle = deg.\n"; -#else -static const double conv_unit = 0.00254; // units = mm -static const char unit_text[] = "## Unit = mm, Angle = deg.\n"; -#endif +public: + DIALOG_GEN_MODULE_POSITION( PCB_EDIT_FRAME * parent): + DIALOG_GEN_MODULE_POSITION_BASE( parent ) + { + m_parent = parent; + } + +private: + void OnInitDialog( wxInitDialogEvent& event ); + void OnOutputDirectoryBrowseClicked( wxCommandEvent& event ); + void OnCancelButton( wxCommandEvent& event ) + { + EndModal( wxID_CANCEL ); + } + void OnOKButton( wxCommandEvent& event ); + + bool CreateFiles(); + + // accessors to options: + wxString GetOutputDirectory() + { + return m_outputDirectoryName->GetValue(); + } + + bool UnitsMM() + { + return m_radioBoxUnits->GetSelection() == 1; + } + + bool OneFileOnly() + { + return m_radioBoxFilesCount->GetSelection() == 1; + } + + bool ForceAllSmd() + { + return m_radioBoxForceSmd->GetSelection() == 1; + } + + void AddMessage( const wxString & aMessage ) + { + m_messagesBox->AppendText( aMessage ); + } +}; + +// Static members to remember choices +int DIALOG_GEN_MODULE_POSITION::m_unitsOpt = 0; +int DIALOG_GEN_MODULE_POSITION::m_fileOpt = 0; + +void DIALOG_GEN_MODULE_POSITION::OnInitDialog( wxInitDialogEvent& event ) +{ + // Output directory + m_outputDirectoryName->SetValue( g_PcbPlotOptions.GetOutputDirectory() ); + m_radioBoxUnits->SetSelection( m_unitsOpt ); + m_radioBoxFilesCount->SetSelection( m_fileOpt ); + + m_sdbSizerButtonsOK->SetDefault(); + GetSizer()->SetSizeHints(this); + Centre(); +} + +void DIALOG_GEN_MODULE_POSITION::OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) +{ + // Build the absolute path of current output plot directory + // to preselect it when opening the dialog. + wxFileName fn( m_outputDirectoryName->GetValue() ); + wxString path; + + if( fn.IsRelative() ) + path = wxGetCwd() + fn.GetPathSeparator() + m_outputDirectoryName->GetValue(); + else + path = m_outputDirectoryName->GetValue(); + + wxDirDialog dirDialog( this, _( "Select Output Directory" ), path ); + + if( dirDialog.ShowModal() == wxID_CANCEL ) + return; + + wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() ); + + wxMessageDialog dialog( this, _( "Use a relative path? "), + _( "Plot Output Directory" ), + wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT ); + + if( dialog.ShowModal() == wxID_YES ) + { + wxString boardFilePath = ( (wxFileName) m_parent->GetScreen()->GetFileName()).GetPath(); + + if( !dirName.MakeRelativeTo( boardFilePath ) ) + wxMessageBox( _( "Cannot make path relative (target volume different from board file volume)!" ), + _( "Plot Output Directory" ), wxOK | wxICON_ERROR ); + } + + m_outputDirectoryName->SetValue( dirName.GetFullPath() ); +} + +void DIALOG_GEN_MODULE_POSITION::OnOKButton( wxCommandEvent& event ) +{ + m_unitsOpt = m_radioBoxUnits->GetSelection(); + m_fileOpt = m_radioBoxFilesCount->GetSelection(); + + // Set output directory and replace backslashes with forward ones + // (Keep unix convention in cfg files) + wxString dirStr; + dirStr = m_outputDirectoryName->GetValue(); + dirStr.Replace( wxT( "\\" ), wxT( "/" ) ); + g_PcbPlotOptions.SetOutputDirectory( dirStr ); + + CreateFiles(); +} + +bool DIALOG_GEN_MODULE_POSITION::CreateFiles() +{ + BOARD * brd = m_parent->GetBoard(); + PCB_SCREEN * screen = m_parent->GetScreen(); + wxFileName fn; + wxString msg; + wxString frontLayerName; + wxString backLayerName; + bool singleFile = OneFileOnly(); + int fullcount = 0; + + fn = screen->GetFileName(); + fn.SetPath( GetOutputDirectory() ); + frontLayerName = brd->GetLayerName( LAYER_N_FRONT ); + backLayerName = brd->GetLayerName( LAYER_N_BACK ); + + // Create the the Front or Top side placement file, + // or the single file + int side = 1; + if( singleFile ) + { + side = 2; + fn.SetName( fn.GetName() + wxT( "_" ) + wxT("all") ); + } + else + fn.SetName( fn.GetName() + wxT( "_" ) + frontLayerName ); + + fn.SetExt( wxT( "pos") ); + + int fpcount = m_parent->DoGenFootprintsPositionFile( fn.GetFullPath(), UnitsMM(), + ForceAllSmd(), side ); + if( fpcount < 0 ) + { + msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); + AddMessage( msg + wxT("\n") ); + wxMessageBox( msg ); + return false; + } + + if( fpcount == 0) + { + wxMessageBox( _( "No modules for automated placement." ) ); + return false; + } + + if( singleFile ) + msg.Printf( _( "Place file: %s\n" ), GetChars( fn.GetFullPath() ) ); + else + msg.Printf( _( "Component side place file: %s\n" ), GetChars( fn.GetFullPath() ) ); + + AddMessage( msg ); + msg.Printf( _( "Footprint count %d\n" ), fpcount ); + AddMessage( msg ); + + if( singleFile ) + return true; + + // Create the Back or Bottom side placement file + fullcount = fpcount; + side = 0; + fn = screen->GetFileName(); + fn.SetPath( GetOutputDirectory() ); + fn.SetName( fn.GetName() + wxT( "_" ) + backLayerName ); + fn.SetExt( wxT( "pos" ) ); + + fpcount = m_parent->DoGenFootprintsPositionFile( fn.GetFullPath(), UnitsMM(), + ForceAllSmd(), side ); + + if( fpcount < 0 ) + { + msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); + AddMessage( msg + wxT("\n") ); + wxMessageBox( msg ); + return false; + } + + // Display results + if( !singleFile ) + { + msg.Printf( _( "Copper side place file: %s\n" ), GetChars( fn.GetFullPath() ) ); + AddMessage( msg ); + msg.Printf( _( "Footprint count %d\n" ), fpcount ); + AddMessage( msg ); + } + + if( !singleFile ) + { + fullcount += fpcount; + msg.Printf( _( "Full footprint count %d\n" ), fullcount ); + AddMessage( msg ); + } + + return true; +} + +// Defined values to write coordinates using inches or mm: +static const double conv_unit_inch = 0.0001; // units = INCHES +static const char unit_text_inch[] = "## Unit = inches, Angle = deg.\n"; + +static const double conv_unit_mm = 0.00254; // units = mm +static const char unit_text_mm[] = "## Unit = mm, Angle = deg.\n"; static wxPoint File_Place_Offset; // Offset coordinates for generated file. -static void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile ); +static void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile, + double aConvUnit ); // Sort function use by GenereModulesPosition() -static int ListeModCmp( const void* o1, const void* o2 ) +// sort is made by side (layer) top layer first +// then by reference increasing order +static bool sortFPlist( const LIST_MOD& ref, const LIST_MOD& tst ) { - LIST_MOD* ref = (LIST_MOD*) o1; - LIST_MOD* cmp = (LIST_MOD*) o2; + if( ref.m_Layer == tst.m_Layer ) + return StrNumCmp( ref.m_Reference, tst.m_Reference, 16 ) < 0; - return StrNumCmp( ref->m_Reference, cmp->m_Reference, 16 ); + return ref.m_Layer > tst.m_Layer; } -#if defined(DEBUG) - /** - * Function HasNonSMDPins + * Helper function HasNonSMDPins * returns true if the given module has any non smd pins, such as through hole * and therefore cannot be placed automatically. */ @@ -76,24 +318,24 @@ static bool HasNonSMDPins( MODULE* aModule ) return false; } -#endif - - -void PCB_EDIT_FRAME::GenModulesPosition( wxCommandEvent& event ) +void PCB_EDIT_FRAME::GenFootprintsPositionFile( wxCommandEvent& event ) +{ + DIALOG_GEN_MODULE_POSITION dlg( this ); + dlg.ShowModal(); +} + +/* + * Creates a footprint position file + * aSide = 0 -> Back (bottom) side) + * aSide = 1 -> Front (top) side) + * aSide = 2 -> both sides + */ +int PCB_EDIT_FRAME::DoGenFootprintsPositionFile( const wxString& aFullFileName, + bool aUnitsMM, + bool aForceSmdItems, int aSide ) { - bool doBoardBack = false; MODULE* module; - LIST_MOD* list = NULL; char line[1024]; - wxFileName fnFront; - wxFileName fnBack; - wxString msg; - wxString frontLayerName; - wxString backLayerName; - wxString Title; - FILE* fpFront = 0; - FILE* fpBack = 0; - bool switchedLocale = false; File_Place_Offset = GetOriginAxisPosition(); @@ -102,6 +344,14 @@ void PCB_EDIT_FRAME::GenModulesPosition( wxCommandEvent& event ) for( module = GetBoard()->m_Modules; module; module = module->Next() ) { + if( aSide < 2 ) + { + if( module->GetLayer() == LAYER_N_BACK && aSide == 1) + continue; + if( module->GetLayer() == LAYER_N_FRONT && aSide == 0) + continue; + } + if( module->m_Attributs & MOD_VIRTUAL ) { D( printf( "skipping module %s because it's virtual\n", @@ -111,142 +361,88 @@ void PCB_EDIT_FRAME::GenModulesPosition( wxCommandEvent& event ) if( ( module->m_Attributs & MOD_CMS ) == 0 ) { -#if 1 && defined(DEBUG) // enable this code to fix a bunch of mis-labeled modules: - if( !HasNonSMDPins( module ) ) + if( aForceSmdItems ) // true to fix a bunch of mis-labeled modules: { - // all module's pins are SMD, mark the part for pick and place - module->m_Attributs |= MOD_CMS; + if( !HasNonSMDPins( module ) ) + { + // all module's pins are SMD, mark the part for pick and place + module->m_Attributs |= MOD_CMS; + OnModify(); + } + else + { + D(printf( "skipping %s because its attribute is not CMS and it has non SMD pins\n", + TO_UTF8(module->GetReference()) ) ); + continue; + } } - else - { - printf( "skipping %s because its attribute is not CMS and it has non SMD pins\n", - TO_UTF8(module->GetReference()) ); - continue; - } -#else continue; -#endif } - if( module->GetLayer() == LAYER_N_BACK ) - doBoardBack = true; - moduleCount++; } - if( moduleCount == 0 ) + FILE * file = wxFopen( aFullFileName, wxT( "wt" ) ); + if( file == NULL ) + return -1; + + // Select units: + double conv_unit = aUnitsMM ? conv_unit_mm : conv_unit_inch; + const char *unit_text = aUnitsMM ? unit_text_mm : unit_text_inch; + + // Build and sort the list of modules alphabetically + std::vector list; + list.reserve(moduleCount); + for( module = GetBoard()->m_Modules; module; module = module->Next() ) { - DisplayError( this, _( "No modules for automated placement." ) ); - return; - } - - wxString boardFilePath = ( (wxFileName) GetScreen()->GetFileName()).GetPath(); - wxDirDialog dirDialog( this, _( "Select Output Directory" ), boardFilePath ); - - if( dirDialog.ShowModal() == wxID_CANCEL ) - return; - - fnFront = GetScreen()->GetFileName(); - fnFront.SetPath( dirDialog.GetPath() ); - frontLayerName = GetBoard()->GetLayerName( LAYER_N_FRONT ); - fnFront.SetName( fnFront.GetName() + wxT( "_" ) + frontLayerName ); - fnFront.SetExt( wxT( "pos") ); - fpFront = wxFopen( fnFront.GetFullPath(), wxT( "wt" ) ); - - if( fpFront == 0 ) - { - msg = _( "Unable to create " ) + fnFront.GetFullPath(); - DisplayError( this, msg ); - goto exit; - } - - if( doBoardBack ) - { - fnBack = GetScreen()->GetFileName(); - fnBack.SetPath( dirDialog.GetPath() ); - backLayerName = GetBoard()->GetLayerName( LAYER_N_BACK ); - fnBack.SetName( fnBack.GetName() + wxT( "_" ) + backLayerName ); - fnBack.SetExt( wxT( "pos" ) ); - fpBack = wxFopen( fnBack.GetFullPath(), wxT( "wt" ) ); - - if( fpBack == 0 ) + if( aSide < 2 ) { - msg = _( "Unable to create " ) + fnBack.GetFullPath(); - DisplayError( this, msg ); - goto exit; + if( module->GetLayer() == LAYER_N_BACK && aSide == 1) + continue; + if( module->GetLayer() == LAYER_N_FRONT && aSide == 0) + continue; } - } - // Switch the locale to standard C (needed to print floating point - // numbers like 1.3) - SetLocaleTo_C_standard( ); - switchedLocale = true; - - // Display results - ClearMsgPanel(); - AppendMsgPanel( _( "Component side place file:" ), fnFront.GetFullPath(), BLUE ); - - if( doBoardBack ) - AppendMsgPanel( _( "Copper side place file:" ), fnBack.GetFullPath(), BLUE ); - - msg.Empty(); msg << moduleCount; - AppendMsgPanel( _( "Module count" ), msg, RED ); - - // Sort the list of modules alphabetically - list = new LIST_MOD[moduleCount]; - - module = GetBoard()->m_Modules; - - for( int ii = 0; module; module = module->Next() ) - { if( module->m_Attributs & MOD_VIRTUAL ) continue; if( (module->m_Attributs & MOD_CMS) == 0 ) continue; - - list[ii].m_Module = module; - list[ii].m_Reference = module->m_Reference->m_Text; - list[ii].m_Value = module->m_Value->m_Text; - ii++; + LIST_MOD item; + item.m_Module = module; + item.m_Reference = module->m_Reference->m_Text; + item.m_Value = module->m_Value->m_Text; + item.m_Layer = module->GetLayer(); + list.push_back( item ); } - qsort( list, moduleCount, sizeof(LIST_MOD), ListeModCmp ); + if( moduleCount > 1 ) + sort( list.begin(), list.end(), sortFPlist ); + + wxString frontLayerName = GetBoard()->GetLayerName( LAYER_N_FRONT ); + wxString backLayerName = GetBoard()->GetLayerName( LAYER_N_BACK ); + + // Switch the locale to standard C (needed to print floating point + // numbers like 1.3) + SetLocaleTo_C_standard( ); // Write file header sprintf( line, "### Module positions - created on %s ###\n", TO_UTF8( DateAndTime() ) ); - fputs( line, fpFront ); + fputs( line, file ); - if( doBoardBack ) - fputs( line, fpBack ); - - Title = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion(); + wxString Title = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion(); sprintf( line, "### Printed by Pcbnew version %s\n", TO_UTF8( Title ) ); - fputs( line, fpFront ); + fputs( line, file ); - if( doBoardBack ) - fputs( line, fpBack ); + fputs( unit_text, file ); - fputs( unit_text, fpFront ); - - if( doBoardBack ) - fputs( line, fpBack ); - - sprintf( line, "## Side : %s\n", TO_UTF8( frontLayerName ) ); - fputs( line, fpFront ); - - if( doBoardBack ) - { - sprintf( line, "## Side : %s\n", TO_UTF8( backLayerName ) ); - fputs( line, fpBack ); - } + sprintf( line, "## Side : %s\n", + ( aSide < 2 ) ? TO_UTF8( frontLayerName ) : "All" ); + fputs( line, file ); sprintf( line, "# Ref Val PosX PosY Rot Side\n" ); - fputs( line, fpFront ); - - if( doBoardBack ) - fputs( line, fpBack ); + fputs( line, file ); for( int ii = 0; ii < moduleCount; ii++ ) { @@ -256,8 +452,7 @@ void PCB_EDIT_FRAME::GenModulesPosition( wxCommandEvent& event ) sprintf( line, "%-8.8s %-16.16s ", TO_UTF8( ref ), TO_UTF8( val ) ); module_pos = list[ii].m_Module->m_Pos; - module_pos.x -= File_Place_Offset.x; - module_pos.y -= File_Place_Offset.y; + module_pos -= File_Place_Offset; char* text = line + strlen( line ); sprintf( text, " %9.4f %9.4f %8.1f ", @@ -273,63 +468,29 @@ void PCB_EDIT_FRAME::GenModulesPosition( wxCommandEvent& event ) { strcat( line, TO_UTF8( frontLayerName ) ); strcat( line, "\n" ); - fputs( line, fpFront ); + fputs( line, file ); } else if( layer == LAYER_N_BACK ) { strcat( line, TO_UTF8( backLayerName ) ); strcat( line, "\n" ); - fputs( line, fpBack ); + fputs( line, file ); } } // Write EOF - fputs( "## End\n", fpFront ); + fputs( "## End\n", file ); - if( doBoardBack ) - fputs( "## End\n", fpBack ); + SetLocaleTo_Default( ); // revert to the current locale - msg = _( "Module position files created:" ); - msg.Append( wxT( "\n\n" ) + frontLayerName + wxT( ":\n" ) ); - msg.Append( fnFront.GetFullPath() ); - - if( doBoardBack ) - { - msg.Append( wxT( "\n\n" ) + backLayerName + wxT( ":\n" ) ); - msg.Append( fnBack.GetFullPath() ); - } - - wxMessageBox( msg, _( "Module Position File" ), wxICON_INFORMATION ); - -exit: // the only safe way out of here, no returns please. - - if( list ) - delete[] list; - - if( switchedLocale ) - SetLocaleTo_Default( ); // revert to the current locale - - if( fpFront ) - fclose( fpFront ); - - if( fpBack ) - fclose( fpBack ); + fclose( file ); + return moduleCount; } -/* Print a module report. - */ -void PCB_EDIT_FRAME::GenModuleReport( wxCommandEvent& event ) +void PCB_EDIT_FRAME::GenFootprintsReport( wxCommandEvent& event ) { - MODULE* Module; - D_PAD* pad; - char line[1024]; wxFileName fn; - wxString fnFront, msg; - FILE* rptfile; - wxPoint module_pos; - - File_Place_Offset = wxPoint( 0, 0 ); wxString boardFilePath = ( (wxFileName) GetScreen()->GetFileName()).GetPath(); wxDirDialog dirDialog( this, _( "Select Output Directory" ), boardFilePath ); @@ -341,14 +502,44 @@ void PCB_EDIT_FRAME::GenModuleReport( wxCommandEvent& event ) fn.SetPath( dirDialog.GetPath() ); fn.SetExt( wxT( "rpt" ) ); - rptfile = wxFopen( fn.GetFullPath(), wxT( "wt" ) ); + bool success = DoGenFootprintsReport( fn.GetFullPath(), false ); + + wxString msg; + if( success ) + { + msg.Printf( _( "Module report file created:\n%s" ), + GetChars( fn.GetFullPath() ) ); + wxMessageBox( msg, _( "Module Report" ), wxICON_INFORMATION ); + } + + else + { + msg.Printf( _( "Unable to create <%s>" ), GetChars( fn.GetFullPath() ) ); + DisplayError( this, msg ); + } +} + +/* Print a module report. + */ +bool PCB_EDIT_FRAME::DoGenFootprintsReport( const wxString& aFullFilename, bool aUnitsMM ) +{ + MODULE* Module; + D_PAD* pad; + char line[1024]; + wxString fnFront, msg; + FILE* rptfile; + wxPoint module_pos; + + File_Place_Offset = wxPoint( 0, 0 ); + + rptfile = wxFopen( aFullFilename, wxT( "wt" ) ); if( rptfile == NULL ) - { - msg = _( "Unable to create " ) + fn.GetFullPath(); - DisplayError( this, msg ); - return; - } + return false; + + // Select units: + double conv_unit = aUnitsMM ? conv_unit_mm : conv_unit_inch; + const char *unit_text = aUnitsMM ? unit_text_mm : unit_text_inch; // Switch the locale to standard C (needed to print floating point // numbers like 1.3) @@ -489,7 +680,7 @@ void PCB_EDIT_FRAME::GenModuleReport( wxCommandEvent& event ) if( ( (DRAWSEGMENT*) PtStruct )->GetLayer() != EDGE_N ) continue; - WriteDrawSegmentPcb( (DRAWSEGMENT*) PtStruct, rptfile ); + WriteDrawSegmentPcb( (DRAWSEGMENT*) PtStruct, rptfile, conv_unit ); } // Generate EOF. @@ -497,10 +688,7 @@ void PCB_EDIT_FRAME::GenModuleReport( wxCommandEvent& event ) fclose( rptfile ); SetLocaleTo_Default( ); // revert to the current locale - msg = _( "Module report file created:" ); - msg.Append( wxT( "\n" ) + fn.GetFullPath() ); - - wxMessageBox( msg, _( "Module Report" ), wxICON_INFORMATION ); + return true; } @@ -510,19 +698,19 @@ void PCB_EDIT_FRAME::GenModuleReport( wxCommandEvent& event ) * Circle * Arc */ -void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile ) +void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile, double aConvUnit ) { double ux0, uy0, dx, dy; double radius, width; char line[1024]; - ux0 = PtDrawSegment->GetStart().x * conv_unit; - uy0 = PtDrawSegment->GetStart().y * conv_unit; + ux0 = PtDrawSegment->GetStart().x * aConvUnit; + uy0 = PtDrawSegment->GetStart().y * aConvUnit; - dx = PtDrawSegment->GetEnd().x * conv_unit; - dy = PtDrawSegment->GetEnd().y * conv_unit; + dx = PtDrawSegment->GetEnd().x * aConvUnit; + dy = PtDrawSegment->GetEnd().y * aConvUnit; - width = PtDrawSegment->GetWidth() * conv_unit; + width = PtDrawSegment->GetWidth() * aConvUnit; switch( PtDrawSegment->GetShape() ) { @@ -550,7 +738,7 @@ void WriteDrawSegmentPcb( DRAWSEGMENT* PtDrawSegment, FILE* rptfile ) fprintf( rptfile, "$ARC \n" ); fprintf( rptfile, "centre %.6lf %.6lf\n", ux0, uy0 ); fprintf( rptfile, "start %.6lf %.6lf\n", - endx * conv_unit, endy * conv_unit ); + endx * aConvUnit, endy * aConvUnit ); fprintf( rptfile, "end %.6lf %.6lf\n", dx, dy ); fprintf( rptfile, "width %.6lf\n", width ); fprintf( rptfile, "$EndARC \n" ); diff --git a/pcbnew/menubar_pcbframe.cpp b/pcbnew/menubar_pcbframe.cpp index 6cce55b283..b49d8931c6 100644 --- a/pcbnew/menubar_pcbframe.cpp +++ b/pcbnew/menubar_pcbframe.cpp @@ -127,18 +127,24 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() /* Fabrication Outputs submenu */ wxMenu* fabricationOutputsMenu = new wxMenu; AddMenuItem( fabricationOutputsMenu, ID_PCB_GEN_POS_MODULES_FILE, - _( "&Modules Position File" ), + _( "&Modules Position (.pos) File" ), _( "Generate modules position file for pick and place" ), KiBitmap( post_compo_xpm ) ); AddMenuItem( fabricationOutputsMenu, ID_PCB_GEN_DRILL_FILE, - _( "&Drill File" ), + _( "&Drill (.drl) File" ), _( "Generate excellon2 drill file" ), KiBitmap( post_drill_xpm ) ); + // Module Report + AddMenuItem( fabricationOutputsMenu, ID_GEN_EXPORT_FILE_MODULE_REPORT, + _( "&Module (.rpt) Report" ), + _( "Create a report of all modules on the current board" ), + KiBitmap( tools_xpm ) ); + // Component File AddMenuItem( fabricationOutputsMenu, ID_PCB_GEN_CMP_FILE, - _( "&Component File" ), + _( "&Component (.cmp) File" ), _( "(Re)create components file (*.cmp) for CvPcb" ), KiBitmap( create_cmp_file_xpm ) ); @@ -146,7 +152,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() AddMenuItem( fabricationOutputsMenu, ID_PCB_GEN_BOM_FILE_FROM_BOARD, _( "&BOM File" ), _( "Create a bill of materials from schematic" ), - KiBitmap( tools_xpm ) ); + KiBitmap( bom_xpm ) ); // Fabrications Outputs submenu append AddMenuItem( filesMenu, fabricationOutputsMenu, @@ -183,12 +189,6 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() _( "&GenCAD" ), _( "Export GenCAD format" ), KiBitmap( export_xpm ) ); - // Module Report - AddMenuItem( submenuexport, ID_GEN_EXPORT_FILE_MODULE_REPORT, - _( "&Module Report" ), - _( "Create a report of all modules on the current board" ), - KiBitmap( tools_xpm ) ); - // VRML AddMenuItem( submenuexport, ID_GEN_EXPORT_FILE_VRML, _( "&VRML" ), diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index 9573089c68..97a29a56d6 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -94,7 +94,7 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME ) EVT_MENU( ID_GEN_EXPORT_SPECCTRA, PCB_EDIT_FRAME::ExportToSpecctra ) EVT_MENU( ID_GEN_EXPORT_FILE_GENCADFORMAT, PCB_EDIT_FRAME::ExportToGenCAD ) - EVT_MENU( ID_GEN_EXPORT_FILE_MODULE_REPORT, PCB_EDIT_FRAME::GenModuleReport ) + EVT_MENU( ID_GEN_EXPORT_FILE_MODULE_REPORT, PCB_EDIT_FRAME::GenFootprintsReport ) EVT_MENU( ID_GEN_EXPORT_FILE_VRML, PCB_EDIT_FRAME::OnExportVRML ) EVT_MENU( ID_GEN_IMPORT_SPECCTRA_SESSION,PCB_EDIT_FRAME::ImportSpecctraSession ) @@ -127,7 +127,7 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME ) EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, PCB_EDIT_FRAME::SetLanguage ) // menu Postprocess - EVT_MENU( ID_PCB_GEN_POS_MODULES_FILE, PCB_EDIT_FRAME::GenModulesPosition ) + EVT_MENU( ID_PCB_GEN_POS_MODULES_FILE, PCB_EDIT_FRAME::GenFootprintsPositionFile ) EVT_MENU( ID_PCB_GEN_DRILL_FILE, PCB_EDIT_FRAME::InstallDrillFrame ) EVT_MENU( ID_PCB_GEN_CMP_FILE, PCB_EDIT_FRAME::RecreateCmpFileFromBoard ) EVT_MENU( ID_PCB_GEN_BOM_FILE_FROM_BOARD, PCB_EDIT_FRAME::RecreateBOMFileFromBoard )