diff --git a/AUTHORS.txt b/AUTHORS.txt index 5dec1f2cf0..32b3e7c3ac 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -29,17 +29,17 @@ Igor Plyatov Fabrizio Tappero == Translators -Czech (CZ) Martin Kratoška +Czech (CZ) Martin KratoÅ¡ka Dutch (NL) Jerry Jacobs Finnish (FI) Vesa Solonen French (FR) Jean-Pierre Charras -Polish (PL) Mateusz Skowroski +Polish (PL) Mateusz Skowro¿ski Polish (PL) Kerusey Karyu Portuguese (PT) Renie Marquet " Russian (RU) Igor Plyatov Russian (RU) Andrey Fedorushkov Spanish (ES) Pedro Martin del Valle -Spanish (ES) Iigo Zuluaga +Spanish (ES) Iñigo Zuluaga German (DE) Rafael Sokolowski Japanese (JA) yoneken @@ -47,7 +47,7 @@ Japanese (JA) yoneken Remy Halvick, David Briscoe, Dominique Laigle, Paul Burke == Programm credits for icons and others -Icons by Iigo Zuluagaz +Icons by Iñigo Zuluagaz New Icons by Fabrizio Tappero 3D modules by Renie Marquet 3D modules by Christophe Boschat diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f157217c1..04208882d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -390,6 +390,7 @@ add_subdirectory(kicad) add_subdirectory(pcbnew) add_subdirectory(pcbnew/pcad2kicadpcb_plugin) add_subdirectory(polygon) +add_subdirectory(pagelayout_editor) add_subdirectory(potrace) add_subdirectory(bitmap2component) add_subdirectory(pcb_calculator) @@ -407,6 +408,7 @@ add_dependencies( pcbcommon boost ) add_dependencies( 3d-viewer boost ) add_dependencies( pcad2kicadpcb boost ) add_dependencies( polygon boost ) +add_dependencies( pl_editor boost ) ############# diff --git a/Doxyfile b/Doxyfile index 3cf8189132..eb1f77c06c 100644 --- a/Doxyfile +++ b/Doxyfile @@ -668,6 +668,7 @@ INPUT = kicad \ 3d-viewer \ common \ gerbview \ + pagelayout_editor \ include \ polygon \ potrace @@ -703,8 +704,8 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = include/boost \ - polygon/kbool +EXCLUDE = include/boost + # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt index 741cc9c7ed..3999822f4e 100644 --- a/bitmaps_png/CMakeLists.txt +++ b/bitmaps_png/CMakeLists.txt @@ -43,9 +43,6 @@ # # 1) inkscape - command line mode is used, must be on your PATH # 2) pngcrush - this program must be on your PATH -# 3) Under Windows only: -# dos2unix - to convert End Of Lines to unix EOL (CRLF to LF) -# this program must be on your PATH # # lower case is used for local variables, uppercase for global variables @@ -71,21 +68,8 @@ option( MAINTAIN_PNGS "Set to true if you are a PNG maintainer and have the required tools given in the bitmaps_png/CMakeLists.txt file (default OFF)." OFF) - # Used Only to maintain PNG files (and therefore to recreate .cpp files) # The png2cpp creates files with native End of Line format. -# To avoid mixed EOF formats in these .cpp files, it is good to -# convert them in Unix EOL format (LF) -# Under Windows, the well known dos2unix.exe does the conversion -# It is installed with MinGW and MSYS. -# It is very easy to install (just an executable to copy in a known path) if it is missing - -if( WIN32 ) - set( CONVERT_EOL true ) - set( eol2unix_converter dos2unix ) -else() - set( CONVERT_EOL false ) -endif( WIN32 ) include_directories(BEFORE ${INC_BEFORE}) include_directories( @@ -431,6 +415,12 @@ set( BMAPS_MID pad pad_dimensions pads_mask_layers + pagelayout_load + pagelayout_load_default + pagelayout_new + pagelayout_recent + pagelayout_normal_view_mode + pagelayout_special_view_mode palette part_properties paste @@ -555,6 +545,7 @@ set( BMAPS_BIG icon_pcbcalculator libedit_icon viewlibs_icon + icon_pagelayout_editor ) @@ -596,25 +587,6 @@ endfunction() # Function png2cpp # converts a single *.png to *.cpp -if( CONVERT_EOL ) -function( png2cpp inputFile outFile ) - add_custom_command( - OUTPUT ${outFile} - - COMMAND rm -f ${outFile}.tmp - COMMAND ${CMAKE_COMMAND} -DinputFile=${inputFile} -DoutCppFile=${outFile} - -P ${CMAKE_MODULE_PATH}/PNG2cpp.cmake - - DEPENDS ${inputFile} ${CMAKE_MODULE_PATH}/PNG2cpp.cmake - - POST_BUILD - COMMAND ${eol2unix_EXECUTABLE} ${outFile} - - COMMENT "Creating (with unix eol) ${outFile}" - ) -endfunction() - -else( CONVERT_EOL ) function( png2cpp inputFile outFile ) add_custom_command( OUTPUT ${outFile} @@ -627,8 +599,6 @@ function( png2cpp inputFile outFile ) ) endfunction() -endif(CONVERT_EOL) - # Function bitmap_dir # converts all the basenames in bmapList found in hardcoded 'sources' dir diff --git a/bitmaps_png/cpp_26/icon_gerbview_small.cpp b/bitmaps_png/cpp_26/icon_gerbview_small.cpp index bdc739724f..723b29ffcd 100644 --- a/bitmaps_png/cpp_26/icon_gerbview_small.cpp +++ b/bitmaps_png/cpp_26/icon_gerbview_small.cpp @@ -8,124 +8,124 @@ 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, 0x07, 0x39, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x7b, 0x4c, 0x53, - 0x79, 0x16, 0xc7, 0xbb, 0x8e, 0x3b, 0x31, 0x71, 0xb2, 0xf3, 0xcf, 0x26, 0xbb, 0x26, 0x33, 0x09, - 0x4e, 0x8c, 0xbb, 0x59, 0x35, 0xbe, 0xe2, 0x38, 0x31, 0x71, 0xc6, 0xa8, 0x19, 0x75, 0x13, 0xcd, - 0x4e, 0x5c, 0x8d, 0x6f, 0x0d, 0xa2, 0x46, 0xa3, 0x6b, 0xcc, 0xaa, 0xa3, 0xa2, 0xc0, 0xaa, 0xa8, - 0xc4, 0xc0, 0x28, 0x3b, 0xc8, 0x5b, 0x1e, 0x03, 0x15, 0x28, 0xef, 0x37, 0x7d, 0xd9, 0x22, 0x2d, - 0x85, 0x02, 0xad, 0xa5, 0x2f, 0x4a, 0x29, 0xa5, 0x2d, 0x8f, 0xb6, 0x20, 0xb4, 0xe5, 0xd2, 0xc7, - 0xbd, 0xf7, 0x77, 0xf6, 0x5c, 0x22, 0x04, 0xd6, 0xcd, 0x66, 0x77, 0x27, 0xd9, 0x9b, 0x7c, 0x93, - 0x7b, 0xfb, 0xbb, 0xf9, 0x7d, 0x7a, 0xce, 0xf9, 0x9e, 0x73, 0x7f, 0x3c, 0x00, 0xe0, 0xfd, 0x3f, - 0xf4, 0xc1, 0x0f, 0xe7, 0xcf, 0x9f, 0x4f, 0xba, 0x75, 0xeb, 0x56, 0xfd, 0xb1, 0x63, 0xc7, 0x12, - 0xf6, 0xec, 0xd9, 0xf3, 0xe5, 0xe6, 0xcd, 0x9b, 0x7f, 0xb9, 0x63, 0xc7, 0x8e, 0xa5, 0x97, 0x2f, - 0x5f, 0xe6, 0x9f, 0x39, 0x73, 0xe6, 0xd9, 0xee, 0xdd, 0xbb, 0x3f, 0xfd, 0xd9, 0x20, 0xdc, 0xf0, - 0x93, 0xba, 0xba, 0x3a, 0x13, 0xde, 0x77, 0xf8, 0xfd, 0x7e, 0xbd, 0xd1, 0x68, 0xb4, 0x94, 0x95, - 0x95, 0xf5, 0xde, 0xbb, 0x77, 0xaf, 0xef, 0xf9, 0xf3, 0xe7, 0x53, 0x62, 0xb1, 0xd8, 0x5e, 0x5a, - 0x5d, 0x6b, 0xaf, 0x94, 0x76, 0x9a, 0xa4, 0xbd, 0x76, 0x91, 0x50, 0x67, 0x7f, 0x29, 0xd6, 0x5a, - 0x2f, 0xe0, 0x3b, 0x1f, 0xfd, 0x57, 0xa0, 0xfd, 0xfb, 0xf7, 0x7f, 0xdb, 0xdf, 0xdf, 0x6f, 0xc1, - 0xfb, 0x82, 0x98, 0x98, 0x18, 0xcd, 0xb9, 0x73, 0xe7, 0xb4, 0xe5, 0xe5, 0xe5, 0x8a, 0x91, 0x91, - 0x91, 0x69, 0xa7, 0x7b, 0x22, 0xa8, 0x32, 0x0f, 0x91, 0x26, 0xfd, 0x28, 0xe1, 0xab, 0x47, 0x49, - 0xa6, 0x6c, 0x80, 0xc9, 0x91, 0x5b, 0x7d, 0x95, 0x5d, 0x4e, 0xb7, 0xa4, 0xbb, 0xcf, 0x53, 0xad, - 0x32, 0xfd, 0xed, 0x3f, 0x06, 0x61, 0xba, 0x52, 0x28, 0x8a, 0x7a, 0xdb, 0xd3, 0xd3, 0x53, 0x81, - 0xd1, 0xd9, 0xe2, 0xe2, 0xe2, 0x94, 0xf1, 0xf1, 0xf1, 0x43, 0xb9, 0x7c, 0x01, 0x23, 0x33, 0x0d, - 0xb3, 0xf9, 0xea, 0x71, 0xba, 0x54, 0xe7, 0x8b, 0x54, 0x19, 0x02, 0xb4, 0x64, 0x90, 0xa5, 0x9b, - 0xfb, 0x29, 0x36, 0xff, 0x8d, 0x83, 0x49, 0x69, 0xd0, 0x4f, 0x0b, 0xde, 0x18, 0x83, 0x3f, 0xd5, - 0xbe, 0x36, 0xec, 0xda, 0xb5, 0x6b, 0xf5, 0xbf, 0x04, 0x9d, 0x3d, 0x7b, 0xf6, 0xfb, 0xac, 0xac, - 0xac, 0xae, 0x9c, 0x9c, 0x1c, 0x75, 0x7a, 0x7a, 0xba, 0x0f, 0x23, 0xf0, 0xa7, 0xa6, 0xa6, 0x52, - 0xb1, 0xb1, 0xb1, 0x70, 0xf7, 0xee, 0x5d, 0x48, 0x4e, 0x79, 0x46, 0x5a, 0xd4, 0x66, 0x48, 0x93, - 0x39, 0xc9, 0x0b, 0xa1, 0x09, 0x32, 0xa5, 0x56, 0x92, 0x21, 0x34, 0x92, 0x7c, 0x59, 0x1f, 0xe1, - 0x2b, 0x6c, 0x4c, 0x49, 0xbb, 0x8d, 0xcd, 0x68, 0xe9, 0x25, 0xf5, 0x86, 0x49, 0xba, 0x56, 0xd5, - 0xc7, 0xd4, 0x8a, 0x94, 0xfe, 0xc3, 0x87, 0x0f, 0xff, 0xe5, 0x03, 0xd0, 0x93, 0x27, 0x4f, 0xc4, - 0x78, 0x63, 0xf4, 0xf9, 0x7c, 0x7a, 0x93, 0xc9, 0x14, 0x72, 0xb9, 0x5c, 0x81, 0xae, 0xae, 0x2e, - 0x5a, 0xab, 0xd5, 0x02, 0x27, 0x91, 0xb2, 0x07, 0x2a, 0x7b, 0xfd, 0xa4, 0xc6, 0x18, 0x80, 0xe6, - 0x81, 0x10, 0x34, 0x9b, 0x7d, 0xf0, 0xc6, 0x1e, 0x84, 0x56, 0xab, 0x1f, 0xba, 0xdd, 0xc0, 0x74, - 0x0d, 0x87, 0x48, 0xbd, 0xc6, 0xc5, 0x0a, 0x4d, 0xef, 0x82, 0x52, 0x2b, 0x15, 0xa9, 0x14, 0x2a, - 0xc9, 0xd1, 0xa3, 0x47, 0x0b, 0x3e, 0x00, 0x3d, 0x7e, 0xfc, 0x58, 0x82, 0x37, 0x3a, 0x04, 0xd8, - 0x3b, 0x3a, 0x3a, 0xe8, 0xce, 0xce, 0x4e, 0x4a, 0x20, 0x10, 0x90, 0xfa, 0xfa, 0x7a, 0x68, 0x6b, - 0x6b, 0x83, 0x86, 0xd6, 0x6e, 0x28, 0x33, 0x04, 0x49, 0xae, 0x6c, 0x00, 0x64, 0x03, 0x14, 0x08, - 0x4d, 0x93, 0x20, 0x34, 0x78, 0xa0, 0x45, 0x37, 0x02, 0x6f, 0x3d, 0x84, 0xe9, 0x1c, 0x0a, 0x80, - 0x58, 0x3f, 0xca, 0x56, 0xa9, 0x2c, 0xc1, 0x1e, 0x37, 0xf8, 0x6a, 0x5a, 0x7b, 0xc9, 0x4f, 0x82, - 0xba, 0xc9, 0xab, 0x57, 0xaf, 0xd6, 0xed, 0xdb, 0xb7, 0xef, 0x0f, 0xf3, 0xa0, 0x47, 0x8f, 0x1e, - 0xcd, 0x82, 0x6a, 0x6b, 0x6b, 0xa7, 0xd1, 0x59, 0x04, 0xc5, 0x66, 0x67, 0x67, 0x43, 0x55, 0x55, - 0x15, 0xe0, 0x6f, 0x50, 0x27, 0xeb, 0x82, 0x97, 0x8a, 0x61, 0x68, 0x30, 0xf9, 0xa1, 0x50, 0xa2, - 0x07, 0x85, 0xcd, 0x0f, 0x62, 0x83, 0x9b, 0x08, 0x75, 0x2e, 0xe8, 0x9f, 0x04, 0xa6, 0x7b, 0xc8, - 0x07, 0x9d, 0x03, 0xe3, 0x6c, 0x73, 0xa7, 0x25, 0x82, 0xcf, 0xfe, 0x06, 0x95, 0x89, 0x29, 0x6f, - 0x90, 0x8f, 0xd1, 0x34, 0xdd, 0xd9, 0xda, 0xda, 0x6a, 0xbe, 0x78, 0xf1, 0x62, 0x09, 0xd6, 0xfb, - 0xb3, 0x79, 0x10, 0x5a, 0x34, 0xf2, 0xf0, 0xe1, 0x43, 0xe0, 0x94, 0x98, 0x98, 0x38, 0x0b, 0xca, - 0xcf, 0xcf, 0x87, 0x1a, 0x71, 0x3b, 0xe4, 0xb5, 0x39, 0xa0, 0xc9, 0xe4, 0x83, 0xa2, 0xd7, 0x06, - 0x50, 0x0c, 0x06, 0xc8, 0x6b, 0xc3, 0x28, 0x51, 0xf4, 0xb9, 0xc9, 0xe0, 0x14, 0x30, 0xc6, 0x11, - 0x3f, 0x18, 0x9c, 0x93, 0x6c, 0xbb, 0xc1, 0x11, 0x71, 0x06, 0xd8, 0x99, 0xc6, 0x36, 0x2d, 0x9d, - 0xf8, 0x34, 0xdd, 0xcf, 0x39, 0x17, 0x55, 0x16, 0x0a, 0x85, 0x74, 0x0f, 0x1e, 0x3c, 0xe8, 0xe4, - 0xe1, 0xc6, 0xb3, 0xa0, 0x8a, 0x8a, 0x0a, 0x66, 0x0e, 0xc4, 0x09, 0xd3, 0x07, 0xc5, 0xc5, 0xc5, - 0x50, 0x51, 0x2f, 0x81, 0x32, 0x95, 0x1d, 0xe4, 0x83, 0x41, 0xe0, 0xcb, 0xf4, 0xa0, 0xb4, 0x4e, - 0x82, 0x54, 0x37, 0x04, 0x6a, 0xeb, 0x18, 0x0c, 0x78, 0x67, 0xc8, 0xd0, 0xc4, 0x0c, 0xb1, 0xb9, - 0xfd, 0xac, 0x6e, 0xc0, 0x45, 0x7b, 0x28, 0x36, 0x5c, 0x23, 0x52, 0x30, 0x99, 0xb9, 0xfc, 0x81, - 0xf7, 0xa0, 0x82, 0x70, 0x38, 0xdc, 0x75, 0xe1, 0xc2, 0x85, 0xea, 0x59, 0x50, 0x24, 0x12, 0x31, - 0x57, 0x56, 0x56, 0xb2, 0xff, 0x0c, 0xe2, 0xf3, 0xf9, 0x50, 0x5b, 0xd7, 0x08, 0xaf, 0x1a, 0xda, - 0x40, 0xd2, 0xef, 0x07, 0xfe, 0xeb, 0x5e, 0xd0, 0x38, 0xfd, 0xd0, 0xa6, 0x1f, 0x02, 0xf3, 0xc8, - 0x14, 0xb1, 0x7b, 0xa7, 0xc1, 0x35, 0x49, 0x81, 0x6b, 0x22, 0x40, 0x5c, 0x13, 0xfe, 0xf0, 0xd8, - 0xd4, 0x0c, 0x93, 0x96, 0x51, 0x44, 0x02, 0x81, 0x00, 0xff, 0x3d, 0x48, 0x20, 0x12, 0x89, 0x4c, - 0x98, 0xba, 0xdf, 0xcf, 0x82, 0x70, 0xc1, 0x59, 0x5d, 0x5d, 0xcd, 0x5e, 0xb9, 0x72, 0x05, 0x4e, - 0x9f, 0x3e, 0x0d, 0xd8, 0x4f, 0x70, 0xff, 0xfe, 0x7d, 0x48, 0x4b, 0x4b, 0x03, 0xce, 0x14, 0x29, - 0xa9, 0x59, 0x50, 0x2e, 0x52, 0x43, 0x99, 0xdc, 0x08, 0x72, 0x1d, 0x46, 0xa7, 0xb1, 0x80, 0xda, - 0x38, 0x08, 0x0e, 0xaf, 0x1f, 0xbc, 0x81, 0x10, 0xb8, 0x7d, 0xd3, 0x30, 0x1e, 0x98, 0xa1, 0x6b, - 0x9a, 0x64, 0xe4, 0xc7, 0xb4, 0x3c, 0xc7, 0x5c, 0x34, 0xd8, 0x93, 0x1a, 0x1c, 0x5b, 0x25, 0xb3, - 0x66, 0xe0, 0x40, 0xd8, 0xf9, 0xe3, 0x38, 0xcb, 0xc2, 0x3c, 0xec, 0xdf, 0x39, 0xad, 0x5c, 0xb9, - 0x12, 0x56, 0xaf, 0x5e, 0x0d, 0x68, 0x79, 0xc0, 0x26, 0x84, 0xd2, 0x8a, 0x06, 0xc8, 0x7b, 0x55, - 0x0f, 0x0a, 0xa3, 0x8b, 0x74, 0x5b, 0x5c, 0xa0, 0xb7, 0x0d, 0x23, 0x68, 0x12, 0x26, 0xa8, 0x10, - 0xd8, 0x47, 0x3c, 0x50, 0x58, 0x54, 0x85, 0x99, 0x48, 0x26, 0x2c, 0xcb, 0x16, 0xbc, 0x07, 0x55, - 0xe2, 0x38, 0x33, 0x62, 0x34, 0x51, 0xf3, 0xa0, 0xe1, 0xe1, 0x61, 0xdf, 0xc9, 0x93, 0x27, 0xa9, - 0x85, 0x20, 0x0e, 0xb2, 0x71, 0xe3, 0x46, 0x28, 0x2a, 0x2a, 0x82, 0xa8, 0xa8, 0x28, 0x68, 0x69, - 0x69, 0x61, 0xf6, 0xee, 0xfd, 0x23, 0x9b, 0x95, 0xfb, 0x8a, 0x49, 0xcf, 0x29, 0x21, 0x99, 0x39, - 0xa5, 0x50, 0x50, 0x54, 0x4d, 0x5e, 0x64, 0x14, 0x43, 0x56, 0xf6, 0x2b, 0x68, 0x12, 0xca, 0x21, - 0xe5, 0x59, 0x26, 0x6b, 0xb3, 0xd9, 0xca, 0x38, 0x10, 0x66, 0x49, 0x87, 0xfd, 0x94, 0x3f, 0x6f, - 0x6f, 0x4c, 0x91, 0x6c, 0x62, 0x62, 0x82, 0x3a, 0x71, 0xe2, 0xc4, 0x22, 0xd0, 0xa6, 0x4d, 0x9b, - 0x00, 0xd3, 0x39, 0x2b, 0x8c, 0x8a, 0x14, 0x16, 0x16, 0xc2, 0xd4, 0xd4, 0x54, 0x10, 0xdd, 0xc9, - 0xea, 0x74, 0xba, 0x10, 0x1a, 0x25, 0x14, 0x77, 0x37, 0x3e, 0x52, 0xdf, 0xd0, 0x1c, 0x91, 0x29, - 0xd4, 0xd0, 0xdd, 0x6b, 0x80, 0x94, 0x1f, 0xb2, 0xd9, 0x7e, 0x7d, 0x47, 0x53, 0xc8, 0xab, 0x11, - 0x97, 0x96, 0x96, 0x1a, 0xb6, 0x6f, 0xdf, 0xbe, 0x62, 0x1e, 0x84, 0xf3, 0x4c, 0x33, 0x83, 0xd7, - 0xf1, 0xe3, 0xc7, 0xe9, 0x85, 0xa0, 0x2d, 0x5b, 0xb6, 0x90, 0xcc, 0xcc, 0x4c, 0x22, 0x14, 0x0a, - 0x09, 0x3a, 0x92, 0x6d, 0x6c, 0x6c, 0x24, 0x16, 0x8b, 0x85, 0xca, 0xcb, 0xcb, 0x03, 0xb3, 0xd9, - 0x1c, 0x4e, 0x4a, 0x4a, 0x62, 0xef, 0xdc, 0xb9, 0xc3, 0xda, 0xed, 0x76, 0x0a, 0x1b, 0x3b, 0x52, - 0x5c, 0x54, 0x0c, 0x4a, 0xfe, 0x25, 0x70, 0xe6, 0x7c, 0x0e, 0x7d, 0xcf, 0x7e, 0xc3, 0x1c, 0xfa, - 0xf3, 0x9f, 0x32, 0x17, 0x4d, 0x06, 0x7c, 0xd9, 0x89, 0x79, 0x0d, 0x20, 0x28, 0xb2, 0x10, 0xb4, - 0x76, 0xed, 0x5a, 0xc2, 0xa5, 0xaf, 0xaf, 0xaf, 0x2f, 0xbc, 0x64, 0xc9, 0x12, 0x2e, 0x32, 0x76, - 0xd5, 0xaa, 0x55, 0xdc, 0xfc, 0x23, 0x18, 0x3d, 0xa6, 0x71, 0x2f, 0x5c, 0xbb, 0x76, 0x8d, 0x60, - 0xc1, 0x29, 0x95, 0xbc, 0x81, 0xd1, 0x65, 0x6f, 0x04, 0x26, 0x60, 0x07, 0xd0, 0x46, 0xc3, 0xbb, - 0x8c, 0x5f, 0x83, 0x2a, 0x61, 0xe9, 0xfd, 0x45, 0x20, 0xfc, 0xd6, 0x78, 0x11, 0x44, 0x61, 0x8d, - 0x66, 0x16, 0x82, 0xd6, 0xad, 0x5b, 0x47, 0xb6, 0x6e, 0xdd, 0xca, 0x4c, 0xe3, 0xb5, 0x62, 0xc5, - 0x0a, 0xce, 0xb2, 0x01, 0xac, 0x19, 0x41, 0x27, 0x72, 0xee, 0x64, 0xd7, 0xaf, 0x5f, 0x4f, 0xb0, - 0xbe, 0x8c, 0x5a, 0xad, 0x26, 0x4a, 0xa5, 0x92, 0x54, 0xc4, 0x7e, 0xc1, 0x86, 0x1c, 0x02, 0x00, - 0x4f, 0x0b, 0xd0, 0x92, 0x1d, 0x60, 0x4b, 0xe4, 0x45, 0xde, 0x26, 0xf1, 0x3e, 0x9b, 0x07, 0x25, - 0x24, 0x24, 0xb4, 0x39, 0x9d, 0x4e, 0xc7, 0x81, 0x03, 0x07, 0xe6, 0x6b, 0xb4, 0x6c, 0xd9, 0x32, - 0x72, 0xf0, 0xe0, 0x41, 0x16, 0xeb, 0x44, 0x70, 0x53, 0x1a, 0x37, 0x65, 0x38, 0x57, 0x6e, 0xd8, - 0xb0, 0x81, 0x3d, 0x72, 0xe4, 0x08, 0x83, 0x6b, 0x04, 0xdd, 0x44, 0xf0, 0xcf, 0x31, 0xed, 0xed, - 0xed, 0xac, 0x46, 0xa3, 0x21, 0x37, 0xaf, 0x9e, 0xb5, 0x99, 0x5f, 0xae, 0x65, 0xd9, 0x90, 0x07, - 0xa0, 0x3f, 0x11, 0x66, 0x4a, 0x7e, 0x07, 0x9a, 0x04, 0x9e, 0x7c, 0xa1, 0x19, 0xb8, 0xc9, 0x20, - 0x91, 0xc9, 0x64, 0x35, 0x38, 0x97, 0x7a, 0xb0, 0x8b, 0xcd, 0x37, 0x6e, 0xdc, 0x70, 0xe2, 0xe7, - 0xc3, 0x57, 0x50, 0x50, 0x10, 0x72, 0xbb, 0xdd, 0xcc, 0xa5, 0x4b, 0x97, 0x08, 0xbe, 0x13, 0x96, - 0x48, 0x24, 0x21, 0x4c, 0x5d, 0x18, 0xeb, 0x12, 0xe2, 0x0c, 0x81, 0xb3, 0x2c, 0x6c, 0xb5, 0x5a, - 0x69, 0x9c, 0xf6, 0x04, 0xc7, 0xd5, 0x9b, 0xa6, 0x8c, 0x98, 0xf1, 0x77, 0xaa, 0xeb, 0x00, 0x14, - 0x0e, 0x06, 0xf5, 0x77, 0x30, 0x9a, 0xb2, 0x1c, 0x94, 0x71, 0xbc, 0xef, 0x16, 0x81, 0x0c, 0x06, - 0x83, 0x20, 0x3a, 0x3a, 0x5a, 0x3b, 0x27, 0x74, 0x4d, 0x33, 0x67, 0x53, 0xaf, 0xd7, 0x5b, 0x87, - 0x73, 0x6f, 0x0c, 0x37, 0xe3, 0x36, 0x65, 0xb0, 0x56, 0xcc, 0xed, 0xdb, 0xb7, 0x59, 0x3c, 0x57, - 0x10, 0x14, 0x67, 0x86, 0xa0, 0x4a, 0xa5, 0x62, 0x71, 0xbd, 0x23, 0x3e, 0x2e, 0xae, 0x57, 0x7c, - 0x6f, 0xb9, 0x9d, 0xf6, 0x60, 0x20, 0xc3, 0x25, 0x10, 0x6e, 0xdc, 0x0a, 0xbd, 0x71, 0xbf, 0xf0, - 0xb5, 0x5c, 0xe7, 0x2d, 0xe7, 0x6a, 0x24, 0xc5, 0x0d, 0x35, 0x1c, 0xec, 0xdf, 0x09, 0xa7, 0xb1, - 0x1c, 0x53, 0xec, 0x1c, 0x1b, 0x1b, 0xa3, 0x10, 0x1e, 0x74, 0x38, 0x1c, 0x41, 0x7c, 0x8c, 0x8c, - 0x8e, 0x8e, 0x12, 0x74, 0x1d, 0x2d, 0x95, 0x4a, 0xed, 0x68, 0x90, 0x5b, 0xe7, 0xbe, 0xe1, 0xed, - 0xeb, 0x2f, 0xf9, 0x9a, 0xcb, 0x00, 0x80, 0xe1, 0xaf, 0x30, 0xf2, 0xe2, 0xb7, 0x50, 0x75, 0xf3, - 0xd3, 0x47, 0x3c, 0xcc, 0x77, 0x34, 0x46, 0x25, 0xc2, 0x89, 0x2d, 0xe4, 0x84, 0x05, 0x5e, 0x24, - 0x5c, 0x5b, 0x24, 0x6c, 0x07, 0x19, 0x46, 0x34, 0x9c, 0x9c, 0x9c, 0x3c, 0x9d, 0x9b, 0x9b, 0xeb, - 0xc3, 0xaf, 0xb2, 0xfb, 0xe9, 0xd3, 0xa7, 0x1e, 0xfc, 0x22, 0x6b, 0xd7, 0xac, 0x59, 0xf3, 0x31, - 0xd6, 0xf8, 0xe3, 0x97, 0x31, 0xbc, 0xd2, 0x31, 0x45, 0x2c, 0xa8, 0x0b, 0x4f, 0x42, 0xc9, 0xdf, - 0x6f, 0x42, 0xec, 0xcd, 0xd8, 0xf3, 0xff, 0xf3, 0x39, 0x0d, 0xfb, 0xec, 0x8b, 0x53, 0xa7, 0x4e, - 0x09, 0xe4, 0x72, 0xb9, 0x09, 0xeb, 0x65, 0xc5, 0x63, 0xd8, 0xe5, 0xb9, 0xb5, 0xaf, 0xa2, 0x78, - 0x51, 0x3f, 0x5e, 0xff, 0xba, 0xbc, 0x49, 0x28, 0x9c, 0xf8, 0x21, 0x35, 0xad, 0x1b, 0x0d, 0xb7, - 0xec, 0x67, 0x1f, 0x0c, 0xb7, 0x6d, 0xdb, 0xb6, 0x61, 0xe7, 0xce, 0x9d, 0x31, 0x87, 0x0e, 0x1d, - 0x5a, 0x74, 0xe4, 0xc2, 0xeb, 0x23, 0xd4, 0xaf, 0x50, 0x4b, 0xb9, 0xe7, 0x7f, 0x00, 0x20, 0xc3, - 0x6d, 0x47, 0xb5, 0x30, 0xbb, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, - 0x60, 0x82, + 0xce, 0x00, 0x00, 0x07, 0x3f, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x7d, 0x4c, 0x53, + 0xfb, 0x19, 0xc7, 0x3b, 0xaf, 0xbb, 0x31, 0xbb, 0xcb, 0xee, 0x3f, 0xcb, 0x32, 0x93, 0xbb, 0x04, + 0x17, 0xe3, 0x96, 0xa9, 0xf1, 0x2d, 0xce, 0xc5, 0xc4, 0x3b, 0xa3, 0x66, 0x4a, 0x16, 0xcd, 0x6e, + 0x8c, 0xc6, 0x77, 0x0d, 0xa2, 0x46, 0xa3, 0x33, 0x66, 0xea, 0x54, 0x04, 0x99, 0x8a, 0x4a, 0x9c, + 0x78, 0xf5, 0x5e, 0x94, 0x37, 0x11, 0xb8, 0x50, 0x0b, 0xe5, 0xbd, 0x50, 0x69, 0x69, 0xa1, 0x45, + 0xda, 0x02, 0x05, 0x5a, 0x5a, 0xfa, 0x42, 0x29, 0xd0, 0x17, 0x0a, 0x6d, 0x01, 0x69, 0x4f, 0x5b, + 0xfa, 0x76, 0xce, 0xef, 0xd9, 0x73, 0x88, 0x10, 0x98, 0xcb, 0xb2, 0xed, 0x26, 0x3b, 0xc9, 0x37, + 0x39, 0xa7, 0xe7, 0xe4, 0xf7, 0xe9, 0xf3, 0x3c, 0xdf, 0xe7, 0xf9, 0xfd, 0x38, 0x00, 0xc0, 0xf9, + 0x7f, 0xe8, 0xa3, 0x1f, 0xce, 0x9e, 0x3d, 0x9b, 0x79, 0xe3, 0xc6, 0x8d, 0x86, 0x23, 0x47, 0x8e, + 0xa4, 0xef, 0xde, 0xbd, 0xfb, 0xb7, 0x9b, 0x36, 0x6d, 0xfa, 0xe1, 0xf6, 0xed, 0xdb, 0x97, 0x5e, + 0xbc, 0x78, 0x91, 0x7b, 0xea, 0xd4, 0xa9, 0xaf, 0x77, 0xed, 0xda, 0xf5, 0xf9, 0xf7, 0x06, 0xe1, + 0x82, 0x3f, 0x16, 0x08, 0x04, 0x26, 0xbc, 0xef, 0xa4, 0x28, 0xaa, 0xdf, 0x68, 0x34, 0x5a, 0x2a, + 0x2a, 0x2a, 0xf4, 0xa9, 0xa9, 0xa9, 0x03, 0xcf, 0x9e, 0x3d, 0xf3, 0x49, 0x24, 0x12, 0x5b, 0x45, + 0x8d, 0xc0, 0x56, 0xd5, 0xda, 0x65, 0x6a, 0xd5, 0xdb, 0x9b, 0xc5, 0x3a, 0x5b, 0xa1, 0x44, 0x6b, + 0x3d, 0x87, 0xdf, 0x7c, 0xf2, 0x5f, 0x81, 0xf6, 0xee, 0xdd, 0xfb, 0x87, 0xc1, 0xc1, 0x41, 0x0b, + 0xde, 0x17, 0x27, 0x27, 0x27, 0x6b, 0xce, 0x9c, 0x39, 0xa3, 0xad, 0xac, 0xac, 0x54, 0x8c, 0x8d, + 0x8d, 0x05, 0x9d, 0x9e, 0xc9, 0x70, 0x87, 0x69, 0x84, 0x34, 0xe9, 0xdd, 0x84, 0xdb, 0xed, 0x66, + 0xf2, 0xe4, 0x43, 0xf1, 0x7c, 0xd9, 0x20, 0x55, 0xdd, 0x3d, 0xea, 0x91, 0xf6, 0x0c, 0x78, 0x6b, + 0x3b, 0x4c, 0x7f, 0xfb, 0x8f, 0x41, 0x98, 0xae, 0xac, 0x50, 0x28, 0xd4, 0xd7, 0xdb, 0xdb, 0x5b, + 0x85, 0xd1, 0x0d, 0xa7, 0xa5, 0xa5, 0x29, 0xef, 0xdc, 0xb9, 0x63, 0x2f, 0x7c, 0x53, 0x49, 0xcb, + 0x8c, 0xa3, 0x4c, 0x89, 0x7a, 0x2a, 0xce, 0xd7, 0xf9, 0x63, 0x75, 0x86, 0x60, 0x5c, 0x62, 0xa3, + 0xe3, 0x4d, 0xd6, 0x10, 0x5d, 0xd4, 0xee, 0xa0, 0xb3, 0x1a, 0xfb, 0x83, 0xfc, 0x77, 0xa6, 0x70, + 0x49, 0x6d, 0xab, 0x71, 0xe7, 0xce, 0x9d, 0xab, 0xfe, 0x25, 0xe8, 0xf4, 0xe9, 0xd3, 0x7f, 0xcd, + 0xcb, 0xcb, 0xeb, 0x2e, 0x28, 0x28, 0x50, 0xbf, 0x7c, 0xf9, 0xd2, 0x8f, 0x11, 0x50, 0xcf, 0x9f, + 0x3f, 0x0f, 0xa5, 0xa4, 0xa4, 0xc0, 0xed, 0xdb, 0xb7, 0xe1, 0xef, 0x59, 0x59, 0x44, 0xdc, 0x6d, + 0x86, 0x17, 0xf2, 0x51, 0x92, 0x2d, 0x36, 0x43, 0x5e, 0xcb, 0x10, 0xc9, 0x11, 0x1b, 0x49, 0x91, + 0xcc, 0x42, 0xde, 0x28, 0x46, 0xe8, 0x72, 0xd5, 0x30, 0x93, 0xd3, 0xa4, 0x27, 0x0d, 0x06, 0x5f, + 0xac, 0x5e, 0x65, 0xa1, 0xeb, 0x9a, 0x95, 0xd4, 0xc1, 0x83, 0x07, 0xff, 0xfc, 0x11, 0xe8, 0xd1, + 0xa3, 0x47, 0x12, 0xbc, 0x31, 0xfa, 0xfd, 0xfe, 0x7e, 0x93, 0xc9, 0x14, 0x19, 0x1d, 0x1d, 0x0d, + 0x74, 0x77, 0x77, 0xc7, 0xb5, 0x5a, 0x2d, 0xb0, 0x6a, 0x56, 0xf6, 0x42, 0xb5, 0x9e, 0x22, 0xf5, + 0xc6, 0x20, 0x11, 0x0d, 0x85, 0xa1, 0xc9, 0xe4, 0x83, 0x76, 0x7b, 0x98, 0xb4, 0x59, 0x29, 0xd2, + 0xeb, 0x01, 0xba, 0x67, 0x2c, 0xca, 0x08, 0xb4, 0x2e, 0x46, 0x64, 0x7a, 0x1f, 0x6e, 0xb5, 0x86, + 0x62, 0xd5, 0x62, 0x15, 0x39, 0x7c, 0xf8, 0x70, 0xd1, 0x47, 0xa0, 0x87, 0x0f, 0x1f, 0x4a, 0xf1, + 0x46, 0x87, 0x00, 0x5b, 0x67, 0x67, 0x67, 0xbc, 0xab, 0xab, 0x2b, 0xc4, 0xe7, 0xf3, 0x49, 0x43, + 0x43, 0x03, 0xb4, 0xb7, 0xb7, 0x43, 0x63, 0x5b, 0x0f, 0xf0, 0x8d, 0x11, 0x52, 0x20, 0xb3, 0x82, + 0x6c, 0x38, 0x04, 0x62, 0xf3, 0x34, 0x88, 0x0d, 0x5e, 0x10, 0xe9, 0xc7, 0x49, 0x9f, 0x97, 0xd0, + 0x6a, 0x47, 0x90, 0x48, 0xfa, 0xdd, 0x4c, 0xb5, 0xca, 0x12, 0xd6, 0x78, 0xc1, 0x57, 0xf7, 0x4e, + 0x4f, 0xbe, 0xe3, 0x0b, 0xa6, 0x2f, 0x5f, 0xbe, 0x2c, 0x48, 0x4c, 0x4c, 0xfc, 0xcd, 0x3c, 0xe8, + 0xc1, 0x83, 0x07, 0xb3, 0xa0, 0xfa, 0xfa, 0xfa, 0x20, 0x3a, 0x8b, 0xa0, 0x98, 0xfc, 0xfc, 0x7c, + 0xa8, 0xa9, 0xa9, 0x01, 0x74, 0x20, 0x08, 0x64, 0x3d, 0x50, 0xa8, 0x74, 0x41, 0xa3, 0x89, 0x82, + 0x12, 0x69, 0x3f, 0x28, 0x47, 0x28, 0x90, 0x1a, 0x3d, 0xa4, 0x59, 0x37, 0x0a, 0xd6, 0x69, 0xa0, + 0x7b, 0x1d, 0x7e, 0xa2, 0x1e, 0x9a, 0x62, 0x44, 0x5d, 0x03, 0xb1, 0xc1, 0x69, 0xa0, 0x1a, 0x55, + 0x26, 0x9a, 0xdf, 0x20, 0x77, 0xc7, 0xe3, 0xf1, 0xae, 0xb6, 0xb6, 0x36, 0xf3, 0xf9, 0xf3, 0xe7, + 0x79, 0x58, 0xef, 0x2f, 0xe6, 0x41, 0x68, 0xd1, 0xd8, 0xfd, 0xfb, 0xf7, 0x81, 0x55, 0x46, 0x46, + 0xc6, 0x2c, 0xa8, 0xa8, 0xa8, 0x08, 0xea, 0x24, 0x1d, 0x50, 0xd8, 0xee, 0x80, 0x26, 0x33, 0x05, + 0xa5, 0xad, 0x06, 0x50, 0xd9, 0x82, 0xa4, 0xc5, 0x30, 0x4e, 0x14, 0x03, 0x1e, 0x62, 0xf3, 0x03, + 0x6d, 0x1a, 0xa7, 0x88, 0x71, 0xd4, 0xc7, 0xa8, 0x8c, 0xf6, 0x98, 0x93, 0x62, 0xc2, 0xc2, 0xf6, + 0xbe, 0x78, 0xc6, 0xe3, 0x97, 0x14, 0xeb, 0x5c, 0x54, 0x45, 0x24, 0x12, 0xd1, 0xdd, 0xbb, 0x77, + 0xaf, 0x8b, 0x83, 0x0b, 0xcf, 0x82, 0xaa, 0xaa, 0xaa, 0xe8, 0x39, 0x10, 0x2b, 0x4c, 0x1f, 0x94, + 0x95, 0x95, 0x01, 0x5f, 0x20, 0x81, 0x8a, 0x0e, 0x1b, 0xc8, 0x46, 0xc2, 0xc0, 0x95, 0xf5, 0x83, + 0x62, 0xe8, 0x3d, 0xb4, 0xea, 0xec, 0xd0, 0x6d, 0x75, 0x93, 0xa1, 0x89, 0x19, 0x62, 0x9f, 0x9a, + 0x21, 0x23, 0x5e, 0x8a, 0xe9, 0x1b, 0x72, 0xc5, 0x27, 0x66, 0x98, 0x68, 0xad, 0x48, 0xc1, 0xe4, + 0x16, 0x94, 0x0d, 0x7f, 0x00, 0x15, 0x47, 0xa3, 0xd1, 0xee, 0x73, 0xe7, 0xce, 0xd5, 0xce, 0x82, + 0x62, 0xb1, 0x98, 0xb9, 0xba, 0xba, 0x9a, 0xf9, 0x67, 0x10, 0x97, 0xcb, 0x05, 0x41, 0xc3, 0x5b, + 0xe0, 0x09, 0x15, 0x20, 0xb5, 0x04, 0x80, 0xdb, 0xaa, 0x03, 0x8d, 0x93, 0x22, 0xed, 0xfd, 0x76, + 0x30, 0x8f, 0xf9, 0x88, 0x7d, 0x32, 0x08, 0xae, 0xe9, 0x10, 0x19, 0x9d, 0x0a, 0xa0, 0xa8, 0xa8, + 0xdb, 0x3f, 0x43, 0x67, 0xe7, 0x96, 0x31, 0x7e, 0x7f, 0x80, 0xfb, 0x01, 0xc4, 0x6f, 0x6e, 0x6e, + 0x36, 0x61, 0xea, 0x7e, 0x3d, 0x0b, 0x0a, 0x04, 0x02, 0xce, 0xda, 0xda, 0x5a, 0xe6, 0xd2, 0xa5, + 0x4b, 0x70, 0xf2, 0xe4, 0x49, 0xc0, 0x7e, 0x82, 0xbb, 0x77, 0xef, 0x42, 0x76, 0x76, 0x36, 0xb0, + 0xa6, 0x78, 0xfa, 0x4d, 0x3e, 0x54, 0x36, 0xab, 0xa1, 0x42, 0x6e, 0x00, 0x99, 0xce, 0x06, 0x72, + 0x8d, 0x05, 0xba, 0x8c, 0x23, 0xe0, 0x98, 0xa4, 0x60, 0x22, 0x10, 0x06, 0x8f, 0x2f, 0x00, 0x93, + 0x81, 0x99, 0xb8, 0xa0, 0x49, 0x46, 0xbe, 0xcd, 0x2e, 0x72, 0xce, 0x45, 0x83, 0x3d, 0xa9, 0xc1, + 0xb1, 0xc5, 0x9b, 0x35, 0x03, 0x0b, 0xc2, 0xce, 0x9f, 0xc4, 0x59, 0x16, 0xe5, 0x60, 0xff, 0xce, + 0x69, 0xc5, 0x8a, 0x15, 0xb0, 0x6a, 0xd5, 0x2a, 0x40, 0xcb, 0x03, 0x36, 0x21, 0x54, 0x54, 0x09, + 0xc9, 0x2b, 0x6e, 0x03, 0x28, 0xb1, 0x71, 0x7b, 0x2c, 0x2e, 0xd2, 0x3f, 0xe2, 0x02, 0x87, 0x77, + 0x1a, 0xa6, 0x42, 0x61, 0x18, 0x19, 0xf3, 0x92, 0xef, 0x4a, 0x6b, 0xe0, 0x7e, 0x46, 0x16, 0x83, + 0x57, 0xf1, 0x07, 0x50, 0x35, 0x9a, 0xc9, 0x88, 0xd1, 0x24, 0xcc, 0x83, 0x5c, 0x2e, 0x97, 0xff, + 0xf8, 0xf1, 0xe3, 0xa1, 0x85, 0x20, 0x16, 0xb2, 0x61, 0xc3, 0x06, 0x28, 0x2d, 0x2d, 0x85, 0x84, + 0x84, 0x04, 0x10, 0x89, 0x44, 0x74, 0x62, 0xe2, 0x1f, 0xe9, 0xbc, 0x02, 0x1e, 0x9d, 0x53, 0xc0, + 0x23, 0xb9, 0x05, 0xe5, 0x50, 0x54, 0x5a, 0x0b, 0x2f, 0x72, 0xcb, 0x20, 0x2f, 0xff, 0x0d, 0x08, + 0x45, 0x72, 0x78, 0xfa, 0x75, 0x0e, 0x33, 0x3c, 0x3c, 0x5c, 0xc1, 0x82, 0x30, 0x4b, 0xba, 0x85, + 0xfd, 0xc4, 0xc1, 0x14, 0xc9, 0xa6, 0xa6, 0xa6, 0x42, 0xc7, 0x8e, 0x1d, 0x5b, 0x04, 0xda, 0xb8, + 0x71, 0x23, 0x60, 0x3a, 0x67, 0x85, 0x51, 0x91, 0x92, 0x92, 0x12, 0xf0, 0xf9, 0x7c, 0x61, 0x74, + 0x27, 0xd3, 0xd7, 0xd7, 0x17, 0xe1, 0x72, 0xdf, 0x44, 0x52, 0x53, 0xd3, 0x62, 0x8d, 0x42, 0x51, + 0x4c, 0xae, 0x54, 0x93, 0x1e, 0xbd, 0x11, 0x41, 0x79, 0xcc, 0x60, 0x7f, 0xd7, 0xdb, 0x88, 0x47, + 0x2b, 0x29, 0x2f, 0x2f, 0x37, 0x6c, 0xdb, 0xb6, 0x6d, 0xf9, 0x3c, 0x08, 0xe7, 0x99, 0x66, 0x06, + 0xaf, 0xa3, 0x47, 0x8f, 0xc6, 0x17, 0x82, 0x36, 0x6f, 0xde, 0x4c, 0x72, 0x73, 0x73, 0x89, 0x58, + 0x2c, 0x26, 0xe8, 0x48, 0x46, 0x28, 0x14, 0x12, 0x8b, 0xc5, 0x12, 0x7a, 0xfd, 0xfa, 0x35, 0x98, + 0xcd, 0xe6, 0x68, 0x66, 0x66, 0x26, 0x73, 0xeb, 0xd6, 0x2d, 0xc6, 0x6e, 0xb7, 0x87, 0x14, 0x0a, + 0x45, 0xac, 0xb4, 0xb4, 0x8c, 0x28, 0xb9, 0x17, 0xc0, 0x59, 0xf0, 0x0b, 0x18, 0xc8, 0xfa, 0x19, + 0x7d, 0x60, 0xff, 0x9f, 0x72, 0x17, 0x4d, 0x06, 0xfc, 0xd8, 0x89, 0x79, 0x0d, 0x20, 0x28, 0xb6, + 0x10, 0xb4, 0x66, 0xcd, 0x1a, 0xc2, 0xa6, 0x6f, 0x60, 0x60, 0x20, 0xba, 0x64, 0xc9, 0x12, 0x36, + 0x32, 0x66, 0xe5, 0xca, 0x95, 0xec, 0xfc, 0x23, 0x18, 0x3d, 0xbd, 0x67, 0xcf, 0x1e, 0xb8, 0x72, + 0xe5, 0x0a, 0xc1, 0x82, 0x87, 0x3a, 0xdb, 0x84, 0xb4, 0x2e, 0x7f, 0x03, 0xd0, 0x01, 0x1b, 0x80, + 0x36, 0x09, 0xde, 0xe7, 0xfc, 0x14, 0x94, 0xe9, 0x4b, 0xef, 0x2e, 0x02, 0xe1, 0x5e, 0x33, 0x81, + 0xa0, 0x10, 0xd6, 0x68, 0x66, 0x21, 0x68, 0xed, 0xda, 0xb5, 0x64, 0xcb, 0x96, 0x2d, 0x74, 0x10, + 0xaf, 0xe5, 0xcb, 0x97, 0x13, 0xcc, 0x79, 0x00, 0x6b, 0x46, 0xd0, 0x89, 0xac, 0x3b, 0x99, 0x75, + 0xeb, 0xd6, 0x11, 0xac, 0x2f, 0xad, 0x56, 0xab, 0x89, 0x52, 0xa9, 0x24, 0x95, 0x29, 0x2b, 0x98, + 0x88, 0x83, 0x0f, 0xe0, 0x15, 0x41, 0x5c, 0xba, 0x1d, 0x86, 0x33, 0x38, 0xb1, 0xbe, 0x4c, 0xce, + 0x17, 0xf3, 0xa0, 0xf4, 0xf4, 0xf4, 0x76, 0xa7, 0xd3, 0xe9, 0xd8, 0xb7, 0x6f, 0xdf, 0x7c, 0x8d, + 0x96, 0x2d, 0x5b, 0x46, 0xf6, 0xef, 0xdf, 0xcf, 0x60, 0x9d, 0x08, 0x2e, 0x1a, 0xc7, 0x45, 0x69, + 0xd6, 0x95, 0xeb, 0xd7, 0xaf, 0x67, 0x0e, 0x1d, 0x3a, 0x44, 0xe3, 0x3b, 0x82, 0x6e, 0x22, 0xf8, + 0xe7, 0x68, 0x95, 0x4a, 0xc5, 0x68, 0x34, 0x1a, 0x72, 0xf5, 0xd2, 0xe9, 0x61, 0x73, 0xe1, 0x6a, + 0x86, 0x89, 0x78, 0x01, 0x06, 0x33, 0x60, 0x86, 0xf7, 0x2b, 0xd0, 0xa4, 0x73, 0xe4, 0x0b, 0xcd, + 0xc0, 0x4e, 0x06, 0xa9, 0x4c, 0x26, 0xab, 0xc3, 0xb9, 0xd4, 0x8b, 0x5d, 0x6c, 0xbe, 0x76, 0xed, + 0x9a, 0x13, 0xb7, 0x0f, 0x7f, 0x71, 0x71, 0x71, 0xc4, 0xe3, 0xf1, 0xd0, 0x17, 0x2e, 0x5c, 0x20, + 0xf8, 0x4d, 0x54, 0x2a, 0x95, 0x46, 0x30, 0x75, 0x51, 0x9b, 0xcd, 0x16, 0xd1, 0xe9, 0x74, 0x11, + 0x9c, 0x65, 0x51, 0xab, 0xd5, 0x1a, 0xc7, 0x69, 0x4f, 0xf0, 0xdb, 0x77, 0x4d, 0x39, 0xc9, 0x93, + 0xef, 0x3b, 0xae, 0x02, 0x84, 0x86, 0x00, 0xd4, 0x5f, 0xc1, 0x78, 0xd6, 0x67, 0xa0, 0x4c, 0xe3, + 0x7c, 0xb5, 0x08, 0x64, 0x30, 0x18, 0xf8, 0x49, 0x49, 0x49, 0xda, 0x39, 0xa1, 0x6b, 0x9a, 0x58, + 0x9b, 0x4e, 0x4c, 0x4c, 0x08, 0x70, 0xee, 0xb9, 0x71, 0x31, 0x76, 0x51, 0x1a, 0x6b, 0x45, 0xdf, + 0xbc, 0x79, 0x93, 0xc1, 0x73, 0x05, 0x41, 0x31, 0x08, 0x0d, 0x77, 0x74, 0x74, 0x30, 0xf8, 0xbe, + 0x13, 0x37, 0x49, 0xbd, 0x24, 0xf5, 0x47, 0xb6, 0xb8, 0x17, 0x03, 0x71, 0xf1, 0x20, 0x2a, 0xdc, + 0x02, 0xfa, 0xb4, 0x1f, 0xf8, 0x45, 0x57, 0x39, 0x9f, 0xb1, 0x35, 0x6a, 0xc1, 0x05, 0x35, 0x2c, + 0xec, 0xdf, 0x09, 0xa7, 0xb1, 0x1c, 0x53, 0xec, 0x74, 0xbb, 0xdd, 0x21, 0x84, 0x87, 0x1d, 0x0e, + 0x47, 0x18, 0x1f, 0x63, 0xe3, 0xe3, 0xe3, 0x04, 0xb7, 0x93, 0x78, 0x4b, 0x4b, 0x8b, 0x0d, 0x0d, + 0x72, 0xe3, 0xcc, 0xef, 0x39, 0x89, 0x83, 0xbc, 0x2f, 0xd9, 0x0c, 0x00, 0x18, 0xfe, 0x02, 0x63, + 0x2f, 0x7e, 0x0e, 0x35, 0xd7, 0x3f, 0x7f, 0xc0, 0xc1, 0x7c, 0x27, 0x61, 0x54, 0xcd, 0x38, 0xb1, + 0xc5, 0xac, 0xb0, 0xc0, 0x8b, 0x84, 0xef, 0x16, 0x09, 0xdb, 0x41, 0x86, 0x11, 0xb9, 0x9e, 0x3c, + 0x79, 0x12, 0x7c, 0xf5, 0xea, 0x95, 0x1f, 0x77, 0x65, 0xcf, 0xe3, 0xc7, 0x8f, 0xbd, 0xb8, 0x23, + 0x6b, 0x57, 0xaf, 0x5e, 0xfd, 0x29, 0xd6, 0xf8, 0xd3, 0xc2, 0x64, 0x4e, 0xb9, 0x5b, 0x91, 0x02, + 0xea, 0x92, 0xe3, 0xc0, 0xfb, 0xe6, 0x3a, 0xa4, 0x5c, 0x4f, 0x39, 0xfb, 0x3f, 0x9f, 0xd3, 0xb0, + 0xcf, 0x7e, 0x79, 0xe2, 0xc4, 0x09, 0xbe, 0x5c, 0x2e, 0x37, 0x61, 0xbd, 0xac, 0x78, 0x0c, 0xbb, + 0x38, 0xf7, 0xee, 0x77, 0x09, 0x9c, 0x84, 0x6f, 0xaf, 0x7e, 0x59, 0xf9, 0x56, 0x2c, 0x9e, 0x7a, + 0xfa, 0x3c, 0xbb, 0x07, 0x0d, 0xb7, 0xec, 0x7b, 0x1f, 0x0c, 0xb7, 0x6e, 0xdd, 0xba, 0x7e, 0xc7, + 0x8e, 0x1d, 0xc9, 0x07, 0x0e, 0x1c, 0x58, 0x74, 0xe4, 0xc2, 0xeb, 0x13, 0xd4, 0x4f, 0x50, 0x4b, + 0xd9, 0xe7, 0x7f, 0x00, 0xb6, 0xba, 0x6d, 0x7f, 0x53, 0x45, 0x95, 0x9a, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE icon_gerbview_small_xpm[1] = {{ png, sizeof( png ), "icon_gerbview_small_xpm" }}; diff --git a/bitmaps_png/cpp_26/pagelayout_load.cpp b/bitmaps_png/cpp_26/pagelayout_load.cpp new file mode 100644 index 0000000000..28addf3fd7 --- /dev/null +++ b/bitmaps_png/cpp_26/pagelayout_load.cpp @@ -0,0 +1,74 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +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, 0x96, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x9d, 0x56, 0xdf, 0x6b, 0x1c, + 0x55, 0x14, 0xfe, 0xce, 0x99, 0x99, 0xed, 0x6e, 0x36, 0xd3, 0x75, 0xd7, 0x92, 0x44, 0x30, 0xa5, + 0xd5, 0x56, 0x93, 0x56, 0xa1, 0x6d, 0x04, 0x45, 0x14, 0x8b, 0x10, 0x1a, 0x29, 0x52, 0x91, 0xa2, + 0xf5, 0x4d, 0xf0, 0x55, 0xec, 0x8f, 0x07, 0x97, 0x40, 0xeb, 0x8f, 0x8a, 0xa4, 0x55, 0x5f, 0x7c, + 0x12, 0x14, 0x91, 0x42, 0x44, 0x7d, 0x51, 0xf0, 0x49, 0xa1, 0xfe, 0x07, 0x62, 0x25, 0x8a, 0x68, + 0x43, 0x5b, 0xb6, 0x94, 0x40, 0xd2, 0x26, 0x99, 0x6d, 0x76, 0x76, 0x67, 0x33, 0xb3, 0xf7, 0xf8, + 0xb0, 0x33, 0xb3, 0x77, 0x67, 0x67, 0xd7, 0xd4, 0x0b, 0x97, 0x33, 0x73, 0xb9, 0xdc, 0xef, 0x7e, + 0xdf, 0xf9, 0xce, 0xbd, 0x97, 0x00, 0xcc, 0x00, 0x98, 0x04, 0xc0, 0x00, 0x14, 0xee, 0xad, 0x51, + 0xd8, 0x97, 0x00, 0x5c, 0x16, 0x91, 0xdb, 0x83, 0x26, 0x9f, 0x9a, 0x9f, 0x9f, 0xbf, 0xe6, 0x54, + 0xab, 0xea, 0xee, 0xc6, 0x46, 0xab, 0x56, 0xab, 0xa9, 0x9a, 0xeb, 0xaa, 0x7a, 0xbd, 0xae, 0x3c, + 0xcf, 0x53, 0x9e, 0xe7, 0xa9, 0x66, 0xb3, 0x19, 0xf7, 0xcd, 0xcd, 0x4d, 0xe5, 0xfb, 0xbe, 0xf2, + 0x7d, 0x5f, 0x05, 0x41, 0xa0, 0x1a, 0x8d, 0x86, 0xba, 0xb5, 0xb4, 0xe4, 0x1f, 0x7f, 0xe5, 0xc4, + 0x1c, 0x80, 0xed, 0x22, 0x82, 0xb4, 0x6e, 0x02, 0xe0, 0x62, 0xa9, 0x94, 0x63, 0x8a, 0x1b, 0x88, + 0x19, 0x4c, 0x04, 0x66, 0x06, 0x11, 0xb5, 0xb7, 0xae, 0xc5, 0xe8, 0x3b, 0xfa, 0x37, 0x88, 0xcc, + 0xd9, 0xd9, 0x72, 0xf9, 0x7a, 0xa5, 0x72, 0x83, 0x88, 0x2e, 0x89, 0x48, 0x33, 0xc9, 0x86, 0x01, + 0x28, 0x22, 0x92, 0x2d, 0xe9, 0xa4, 0x01, 0xe8, 0x4d, 0x29, 0x05, 0x06, 0xd1, 0x85, 0xb9, 0x0f, + 0x3f, 0xdb, 0x3d, 0xb1, 0x7f, 0x9a, 0x88, 0x8c, 0x34, 0xa0, 0x2d, 0x37, 0x91, 0xf4, 0xfd, 0x30, + 0x33, 0x36, 0x6a, 0x1b, 0x78, 0x72, 0xea, 0x10, 0xbf, 0xfb, 0xce, 0xb9, 0xef, 0xef, 0x1f, 0x7d, + 0x70, 0x2a, 0x1d, 0x48, 0x04, 0x72, 0x8f, 0x8b, 0x47, 0x0c, 0x99, 0x19, 0x99, 0x4c, 0x06, 0x96, + 0x69, 0xa1, 0xd1, 0xf0, 0xf0, 0xe2, 0x91, 0x69, 0xeb, 0xf4, 0xec, 0xdb, 0x97, 0xb3, 0x85, 0xc2, + 0x5e, 0x7d, 0xae, 0x99, 0x58, 0x15, 0x20, 0x8a, 0xa3, 0x88, 0xf4, 0x95, 0x4b, 0x07, 0x33, 0x4d, + 0x13, 0x85, 0xc2, 0x76, 0xdc, 0x59, 0x5d, 0xc5, 0xe4, 0xc4, 0x04, 0x5e, 0x3f, 0xfe, 0xb2, 0xed, + 0xf9, 0xf4, 0x13, 0x11, 0x3d, 0x2d, 0x22, 0xcb, 0xbd, 0x40, 0x00, 0x24, 0xf4, 0x6b, 0x14, 0xfb, + 0xb1, 0x8c, 0x36, 0xc0, 0xcc, 0xb0, 0x2c, 0x0b, 0xa5, 0x52, 0x09, 0x57, 0xaf, 0x2e, 0x62, 0x61, + 0xe1, 0x0f, 0x8c, 0x8e, 0x8e, 0xe0, 0xb5, 0xa3, 0xcf, 0x3f, 0x94, 0xcd, 0x7d, 0xf1, 0x2d, 0x11, + 0x1d, 0x13, 0x91, 0xbb, 0xac, 0xb3, 0x91, 0x88, 0x95, 0x1e, 0x07, 0x48, 0x28, 0x22, 0x31, 0xd0, + 0xd0, 0xd0, 0x10, 0xc6, 0x77, 0x8e, 0xa3, 0xd9, 0xf4, 0xf0, 0xdb, 0x95, 0xdf, 0xb1, 0xbe, 0xe6, + 0xe0, 0xf0, 0x13, 0x8f, 0x1f, 0xfe, 0xf4, 0xf3, 0x4b, 0x1f, 0x13, 0x51, 0xde, 0x4c, 0xdd, 0xf1, + 0x00, 0x56, 0x69, 0x72, 0x32, 0x33, 0xb2, 0xd9, 0x2c, 0x4a, 0xc5, 0x22, 0x2c, 0xd3, 0x84, 0x6d, + 0xdb, 0x68, 0x34, 0x3c, 0x10, 0x11, 0xa6, 0x1e, 0x7b, 0xf4, 0x55, 0x00, 0x73, 0x66, 0xd7, 0xe2, + 0x22, 0x10, 0xa2, 0xae, 0xd8, 0x2f, 0x57, 0xd1, 0x58, 0xc4, 0x0a, 0x00, 0x72, 0xb9, 0x1c, 0x0c, + 0xc3, 0x40, 0x3e, 0x9f, 0x47, 0x10, 0x04, 0x50, 0x4a, 0xa1, 0x5e, 0x6f, 0x58, 0x00, 0xb2, 0x66, + 0x0f, 0x93, 0x04, 0x98, 0x0e, 0xa2, 0x2f, 0x9e, 0x8c, 0x51, 0x71, 0x47, 0x2e, 0x6c, 0xb5, 0x5a, + 0xba, 0xe4, 0x62, 0xf6, 0xec, 0x30, 0x09, 0x36, 0xa0, 0x50, 0xd3, 0x18, 0x1a, 0x86, 0x01, 0x66, + 0x86, 0x61, 0xb4, 0x6b, 0xd6, 0xb2, 0xac, 0x4e, 0x1d, 0x89, 0x9e, 0x70, 0xcd, 0x14, 0xfa, 0x78, + 0x64, 0x86, 0x7e, 0x51, 0x9f, 0x17, 0x31, 0xd3, 0x8f, 0x30, 0x4e, 0xba, 0x4a, 0x12, 0x0e, 0x94, + 0x04, 0x60, 0xbf, 0x98, 0x06, 0xa8, 0x8f, 0xb3, 0x6e, 0xe5, 0x1e, 0x46, 0x89, 0xef, 0xff, 0x3a, + 0x39, 0x64, 0xc0, 0xbc, 0xee, 0x1c, 0x01, 0x90, 0xf0, 0x64, 0x90, 0x76, 0xd9, 0xc7, 0x79, 0x4a, + 0x9e, 0x06, 0xd1, 0x82, 0xc9, 0xef, 0x7e, 0x35, 0x67, 0x76, 0xc9, 0x15, 0x82, 0xe8, 0x80, 0x3f, + 0x5c, 0xfc, 0x04, 0x37, 0x17, 0xfe, 0xfc, 0x5f, 0xa7, 0x3a, 0x00, 0xec, 0x3a, 0x74, 0x20, 0xd3, + 0x61, 0xa4, 0x49, 0xa4, 0x83, 0x10, 0x80, 0xea, 0xf2, 0x6d, 0xec, 0xd8, 0x39, 0x8e, 0xc9, 0x67, + 0x9f, 0x01, 0x31, 0xb7, 0xaf, 0xd4, 0xc4, 0x1d, 0x35, 0xa8, 0x59, 0xf6, 0x70, 0x10, 0x03, 0xa9, + 0x14, 0xe9, 0x74, 0x37, 0x8e, 0xed, 0xdd, 0x83, 0x83, 0x47, 0x67, 0xe2, 0x4b, 0x8f, 0x88, 0xb6, + 0x0c, 0xe8, 0x38, 0x8e, 0xea, 0x30, 0x52, 0x61, 0x22, 0x35, 0x90, 0xe8, 0x08, 0x8a, 0xbb, 0x08, + 0xbe, 0x39, 0x5f, 0xc6, 0xf5, 0x2b, 0xbf, 0xf6, 0xbe, 0x05, 0xbe, 0xfc, 0x0e, 0xf7, 0x8d, 0x8c, + 0x81, 0x88, 0xf0, 0xd5, 0xc9, 0x37, 0xb0, 0x76, 0xeb, 0x26, 0x00, 0xe0, 0x58, 0xf9, 0x7d, 0xec, + 0x78, 0x64, 0x9f, 0x9e, 0x23, 0xd5, 0x6b, 0xd1, 0xd0, 0x0c, 0x88, 0x9c, 0x28, 0x82, 0x6d, 0x43, + 0x79, 0xe4, 0x6c, 0xbb, 0x27, 0x3f, 0xba, 0x09, 0x46, 0x76, 0xef, 0x41, 0x36, 0xdf, 0x9e, 0x93, + 0x1d, 0x1e, 0xee, 0x36, 0xc3, 0xda, 0xea, 0x7a, 0x53, 0x07, 0x4a, 0x93, 0x50, 0x44, 0xf0, 0xd2, + 0x99, 0xb3, 0x5d, 0xb2, 0xe9, 0xd2, 0xa9, 0x50, 0xfa, 0x17, 0xde, 0x2a, 0x77, 0xc9, 0x59, 0xa9, + 0x54, 0xbc, 0x08, 0x88, 0x16, 0x17, 0xff, 0x71, 0x67, 0xe4, 0x48, 0xa7, 0x00, 0x35, 0x10, 0x68, + 0x75, 0xf4, 0xf3, 0x8f, 0x1f, 0x60, 0x75, 0xe5, 0x5a, 0x6a, 0x5e, 0x76, 0x3d, 0xfc, 0x14, 0x9e, + 0x9b, 0x7e, 0x13, 0xbf, 0x7c, 0xf4, 0x1e, 0x56, 0xfe, 0xfe, 0x2b, 0x1e, 0x0f, 0x0a, 0x45, 0x8e, + 0x80, 0x0c, 0xc7, 0x71, 0x94, 0xeb, 0xba, 0x01, 0x11, 0x83, 0xb9, 0xf3, 0xfa, 0x21, 0x22, 0x14, + 0x1e, 0x18, 0xe3, 0x6d, 0xb6, 0x0d, 0xd7, 0x75, 0x55, 0xd5, 0x59, 0xe6, 0xf5, 0xf5, 0x25, 0xd2, + 0x5f, 0x75, 0x21, 0x27, 0x14, 0xab, 0x2b, 0x52, 0xab, 0xd5, 0x54, 0x4b, 0x84, 0x61, 0x18, 0xf1, + 0x9c, 0xa6, 0x1f, 0x04, 0x61, 0x12, 0x70, 0x02, 0xc0, 0x41, 0x00, 0x46, 0xca, 0x03, 0xb2, 0xef, + 0x53, 0x62, 0x8b, 0x63, 0x19, 0x00, 0x77, 0x00, 0x7c, 0xfd, 0x2f, 0xaa, 0x54, 0x34, 0x60, 0xb0, + 0x2e, 0xe7, 0xea, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pagelayout_load_xpm[1] = {{ png, sizeof( png ), "pagelayout_load_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_26/pagelayout_load_default.cpp b/bitmaps_png/cpp_26/pagelayout_load_default.cpp new file mode 100644 index 0000000000..987766dc1b --- /dev/null +++ b/bitmaps_png/cpp_26/pagelayout_load_default.cpp @@ -0,0 +1,100 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x05, 0x29, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x95, 0x95, 0x6b, 0x6c, 0x53, + 0x65, 0x18, 0xc7, 0x97, 0x60, 0x42, 0x22, 0x09, 0x5f, 0x8c, 0xf2, 0xc5, 0x20, 0x7e, 0x30, 0x92, + 0x18, 0x82, 0xd1, 0xc8, 0x18, 0x06, 0x37, 0x25, 0x8c, 0x99, 0x2c, 0x30, 0x22, 0x43, 0x40, 0x81, + 0xc4, 0x08, 0x04, 0x50, 0x23, 0x53, 0x26, 0x0c, 0xd8, 0x64, 0x1d, 0xdb, 0xb8, 0x18, 0xd8, 0xd8, + 0x50, 0xdc, 0x8d, 0x4b, 0x51, 0xe2, 0x94, 0x4b, 0x69, 0x3b, 0x04, 0xc5, 0xb0, 0x8d, 0x51, 0x75, + 0x63, 0x12, 0xd8, 0x00, 0xa1, 0xeb, 0x2e, 0xbd, 0xad, 0xf7, 0x7b, 0xd7, 0x9d, 0xf6, 0xfc, 0x7d, + 0xde, 0xd7, 0x9d, 0xae, 0xa7, 0xeb, 0x88, 0x9e, 0xe4, 0x97, 0x73, 0xd2, 0xad, 0xcf, 0xef, 0x3c, + 0xff, 0xf7, 0x79, 0xdf, 0xa6, 0xa5, 0xa5, 0xa5, 0xe5, 0x10, 0xdb, 0x88, 0xcf, 0xc6, 0xee, 0xff, + 0x87, 0x82, 0xb1, 0xef, 0xad, 0x26, 0x9e, 0x06, 0x90, 0x36, 0x19, 0xec, 0xfa, 0x54, 0xa9, 0x54, + 0xea, 0x3d, 0x5e, 0xaf, 0xe8, 0xf3, 0xfb, 0x63, 0x81, 0x40, 0x40, 0x0c, 0x04, 0x83, 0x62, 0x28, + 0x14, 0x12, 0x47, 0x46, 0x46, 0x38, 0x91, 0x48, 0x84, 0xee, 0x03, 0xfc, 0x3e, 0x3a, 0x3a, 0x2a, + 0x0a, 0x82, 0xc0, 0x89, 0x46, 0xa3, 0x62, 0x38, 0x1c, 0x16, 0x8d, 0x66, 0xb3, 0xb0, 0x62, 0xe5, + 0xaa, 0x0a, 0xaa, 0x35, 0xfd, 0x71, 0xa2, 0x02, 0x8d, 0x56, 0x6b, 0xf6, 0xf9, 0x7c, 0xf0, 0x07, + 0x02, 0x08, 0x06, 0x83, 0x08, 0x85, 0xc3, 0x20, 0x01, 0xa8, 0x28, 0xa8, 0x20, 0x3d, 0xff, 0x09, + 0x97, 0x2b, 0x1d, 0x54, 0x18, 0xb1, 0x58, 0x0c, 0xa2, 0x28, 0xc6, 0x61, 0xff, 0x67, 0xb1, 0x58, + 0xd0, 0xd5, 0xdd, 0x2d, 0xbe, 0x92, 0x9e, 0xb1, 0x91, 0xea, 0x4d, 0x9d, 0xb4, 0x23, 0x6d, 0x4b, + 0x8b, 0xe9, 0x71, 0x22, 0x8f, 0x67, 0x09, 0xec, 0xf6, 0x34, 0xfa, 0x4c, 0x9d, 0x52, 0x64, 0x32, + 0x99, 0xd0, 0xdd, 0xfd, 0x17, 0xae, 0x5c, 0xbb, 0x16, 0x7b, 0x7e, 0xf6, 0x4b, 0xb9, 0x54, 0x73, + 0xca, 0x7f, 0x12, 0x05, 0x43, 0x2e, 0x6c, 0x58, 0x37, 0x17, 0xfd, 0xf7, 0xca, 0xe1, 0xf7, 0x2b, + 0xb8, 0x84, 0xe1, 0x72, 0xcd, 0xa1, 0xc2, 0xe7, 0x49, 0x7e, 0x97, 0x84, 0x21, 0x59, 0x47, 0xad, + 0x6d, 0x6d, 0xf0, 0x7a, 0x3d, 0x38, 0xf1, 0xdd, 0xd9, 0xd1, 0xa7, 0x66, 0x3c, 0x3b, 0x2f, 0xb5, + 0x48, 0xab, 0x35, 0x79, 0x13, 0x44, 0xfe, 0x80, 0x16, 0x16, 0xf3, 0x13, 0x71, 0x41, 0x2a, 0xdc, + 0xee, 0xf9, 0x24, 0xf2, 0xf1, 0xae, 0x9d, 0x4e, 0x27, 0x6e, 0xde, 0xd4, 0xc1, 0x6a, 0xb5, 0xf2, + 0xe7, 0xb2, 0x23, 0xd5, 0xbe, 0xa9, 0xd3, 0xa7, 0xbf, 0x30, 0xb9, 0xc8, 0xef, 0xff, 0x37, 0xba, + 0x50, 0x08, 0xd6, 0x8e, 0x8d, 0xb0, 0xdb, 0xa6, 0xa5, 0x94, 0x78, 0x3c, 0xd9, 0xd4, 0x91, 0x0f, + 0xec, 0x62, 0xd1, 0x7a, 0xbd, 0x5e, 0xf4, 0xf6, 0xf6, 0xe2, 0x6e, 0x4f, 0x0f, 0x8f, 0xd6, 0x68, + 0x34, 0x62, 0xf7, 0xc1, 0xa3, 0x7a, 0xaa, 0x3d, 0x63, 0x52, 0x51, 0x60, 0x4c, 0x64, 0xff, 0xbd, + 0x09, 0xb6, 0x3f, 0xde, 0x9e, 0x20, 0x71, 0x3a, 0x9f, 0xa3, 0x62, 0x23, 0x3c, 0x36, 0x76, 0xb1, + 0xc2, 0xfc, 0xc5, 0xa8, 0x9b, 0xd6, 0xd6, 0x36, 0xbe, 0x56, 0x66, 0xb3, 0x19, 0x3d, 0xbd, 0x3d, + 0x28, 0xab, 0xa9, 0xfb, 0x4d, 0x9a, 0xc4, 0x71, 0x11, 0xbd, 0x95, 0x8f, 0x89, 0x28, 0x3e, 0xf6, + 0x45, 0x9f, 0xf9, 0x01, 0x06, 0xd5, 0x33, 0x27, 0x88, 0x1c, 0x8e, 0x27, 0xa9, 0xb8, 0x10, 0x1f, + 0x06, 0xa9, 0x2b, 0xb6, 0xc6, 0x86, 0xfe, 0x7e, 0xe8, 0x74, 0x3a, 0xa8, 0x35, 0x5a, 0xb4, 0xb7, + 0xdf, 0x40, 0x3b, 0x3d, 0x57, 0x7d, 0x7b, 0xf2, 0x38, 0x39, 0xa6, 0xa5, 0x14, 0x05, 0x49, 0x44, + 0xfb, 0x03, 0xf6, 0xfe, 0xd7, 0x61, 0x33, 0x4e, 0x81, 0xa3, 0x7d, 0x16, 0x42, 0xd7, 0xe7, 0xc2, + 0xa9, 0x7f, 0x86, 0xcb, 0x46, 0x47, 0xff, 0x96, 0x89, 0x58, 0x57, 0x6c, 0xad, 0x58, 0x0d, 0x16, + 0x5b, 0x0f, 0x45, 0xd8, 0xd9, 0xd9, 0x85, 0xae, 0xae, 0x5b, 0x68, 0xef, 0xd0, 0x79, 0xc8, 0x31, + 0x2b, 0x2e, 0xf2, 0x30, 0x51, 0xd2, 0x88, 0xfb, 0xfd, 0xa7, 0x60, 0x3a, 0x57, 0x08, 0xc3, 0xc1, + 0x2c, 0xb8, 0x1a, 0x32, 0x10, 0xbd, 0x94, 0x03, 0xcf, 0xd5, 0x37, 0x61, 0xd1, 0x7c, 0x20, 0x1b, + 0xf3, 0x44, 0x19, 0x7b, 0x51, 0xb7, 0xdb, 0x4d, 0x2f, 0x64, 0xc7, 0xf0, 0xf0, 0x30, 0x0c, 0x86, + 0xfe, 0x20, 0x39, 0x66, 0xcb, 0x44, 0xc9, 0xeb, 0x14, 0xa6, 0xd1, 0xa5, 0xd3, 0x00, 0x8f, 0x0e, + 0xe7, 0x61, 0xa8, 0x6a, 0x11, 0xbc, 0x8d, 0xf3, 0x10, 0x6d, 0xc9, 0xc3, 0x70, 0x43, 0x2e, 0xdc, + 0xba, 0xef, 0x27, 0xc8, 0xd8, 0x9d, 0x6d, 0x6a, 0x26, 0x64, 0x89, 0x30, 0x68, 0xed, 0x98, 0xe8, + 0xc5, 0xb8, 0xc8, 0xed, 0xf1, 0x70, 0x51, 0x72, 0x7c, 0x6c, 0x9f, 0x44, 0x42, 0x01, 0xdc, 0x2f, + 0x49, 0x87, 0xf9, 0x58, 0x36, 0xfc, 0x27, 0x5e, 0x43, 0xf4, 0xca, 0x1a, 0x0c, 0x1d, 0xc9, 0x44, + 0xd0, 0x70, 0x4b, 0xb6, 0x79, 0xa5, 0x8b, 0x3d, 0xb3, 0x97, 0x60, 0xd0, 0xb8, 0x8f, 0x8b, 0x34, + 0x63, 0xa2, 0x54, 0xf1, 0x8d, 0x8c, 0x75, 0x15, 0x72, 0x9a, 0xd0, 0xbb, 0x73, 0x0e, 0x86, 0xeb, + 0x72, 0x10, 0x52, 0xa6, 0x43, 0xb8, 0xba, 0x1e, 0x7d, 0x95, 0xf3, 0x11, 0xf1, 0x58, 0x65, 0xb2, + 0x44, 0x21, 0xbb, 0x5c, 0x2e, 0x97, 0x5c, 0xe4, 0xa2, 0x5c, 0x53, 0xc6, 0xc7, 0x64, 0x24, 0x62, + 0x71, 0xf8, 0xf4, 0x9d, 0x78, 0xb0, 0xe7, 0x65, 0x38, 0x1a, 0x16, 0x23, 0xd2, 0xbc, 0x10, 0x91, + 0xcb, 0xeb, 0x60, 0x38, 0x90, 0x89, 0x68, 0x24, 0x3c, 0xe1, 0x68, 0x92, 0x90, 0x77, 0xa4, 0xd1, + 0x70, 0x11, 0x8f, 0x2f, 0x71, 0xfa, 0x92, 0xba, 0x62, 0x32, 0x5b, 0xdb, 0x69, 0x3c, 0x2a, 0x4b, + 0x87, 0xb3, 0x81, 0x04, 0xaa, 0xc5, 0x08, 0x5c, 0x58, 0x83, 0xdb, 0xb5, 0xeb, 0xf8, 0xdf, 0xa4, + 0xb8, 0x1e, 0x2b, 0x72, 0xba, 0x5c, 0x7c, 0x5a, 0x26, 0xed, 0x2a, 0x41, 0x36, 0xa8, 0x2c, 0xa0, + 0x49, 0x7c, 0x03, 0xee, 0x86, 0x05, 0x88, 0x6a, 0x72, 0xf1, 0x6b, 0x63, 0x21, 0x9a, 0xeb, 0x0f, + 0xc6, 0x45, 0x89, 0xc8, 0x44, 0x6a, 0x26, 0xa2, 0x33, 0x2a, 0xb9, 0x2b, 0xb6, 0x56, 0x67, 0x8a, + 0xf7, 0xa2, 0x22, 0x2f, 0x7f, 0x02, 0x8a, 0xcc, 0x05, 0x28, 0xcb, 0xca, 0xc0, 0xbe, 0xb7, 0xe6, + 0x63, 0xd7, 0xa2, 0xc5, 0x28, 0xc9, 0xc9, 0x45, 0x49, 0xd6, 0x22, 0x54, 0x2e, 0x5f, 0x29, 0xe3, + 0xac, 0xa2, 0x5c, 0x18, 0x17, 0xa9, 0xd5, 0x26, 0x07, 0x89, 0x52, 0x75, 0x75, 0x6c, 0xd3, 0x47, + 0xa8, 0xfb, 0xa4, 0x00, 0xed, 0xcd, 0xe7, 0x70, 0xe3, 0xa7, 0x0b, 0xe8, 0x20, 0x6e, 0x9e, 0xbb, + 0x88, 0x8e, 0xe6, 0x1f, 0x51, 0xb5, 0x69, 0x35, 0xca, 0x37, 0x6f, 0x40, 0xcd, 0xae, 0x3d, 0x68, + 0x69, 0x68, 0x42, 0x63, 0x7e, 0x3e, 0x5a, 0x4b, 0x8b, 0xa1, 0x3b, 0xaf, 0x8a, 0xd3, 0xf5, 0xcb, + 0xb5, 0x70, 0x5c, 0xa4, 0x22, 0x91, 0xdd, 0xe1, 0x40, 0x62, 0x57, 0xd2, 0x04, 0x32, 0xd1, 0xa5, + 0xa3, 0xc7, 0xf8, 0xb8, 0xb3, 0xf5, 0x62, 0x7b, 0x8b, 0x0d, 0x07, 0x8b, 0xd1, 0x36, 0x70, 0x1f, + 0xf5, 0x87, 0x15, 0x50, 0x94, 0x7e, 0x89, 0xc6, 0x8a, 0x52, 0xdc, 0xd9, 0xb7, 0x0f, 0xf6, 0x77, + 0x97, 0xf1, 0x23, 0x49, 0x82, 0x36, 0xee, 0x78, 0x74, 0x2a, 0x95, 0xda, 0x64, 0xa3, 0x9d, 0x2c, + 0x75, 0xc5, 0x27, 0x70, 0x2c, 0xc2, 0x5a, 0x12, 0xa9, 0x48, 0xc4, 0xd6, 0xab, 0x7e, 0xc7, 0xc7, + 0x28, 0x5a, 0x92, 0x21, 0xa3, 0x70, 0xe1, 0x1c, 0x68, 0x56, 0x2d, 0x43, 0x67, 0x49, 0x31, 0x1c, + 0xd5, 0xd5, 0xf8, 0x3a, 0xf3, 0x55, 0x54, 0x2e, 0xcd, 0xe2, 0xdc, 0xbb, 0x71, 0x5d, 0x2e, 0xba, + 0xa8, 0x52, 0x99, 0x86, 0x6d, 0x36, 0xb0, 0xae, 0x92, 0x23, 0xac, 0xdd, 0xb8, 0x15, 0xaa, 0xea, + 0x5a, 0xbe, 0x5e, 0xa7, 0x4b, 0x77, 0x40, 0xb1, 0x22, 0x5b, 0x46, 0x59, 0xfe, 0x12, 0xe8, 0x8f, + 0xee, 0x86, 0x75, 0x69, 0x36, 0xdc, 0x6b, 0xdf, 0xc7, 0xf9, 0xe2, 0xed, 0x38, 0xb5, 0x7d, 0x2b, + 0xc7, 0x70, 0xbb, 0x4b, 0x2e, 0x6a, 0x6a, 0x3a, 0xd9, 0x67, 0xa5, 0x73, 0x89, 0x75, 0x95, 0x1c, + 0x21, 0x13, 0x5d, 0x24, 0x91, 0x34, 0x1c, 0xac, 0xb3, 0x60, 0xc2, 0x34, 0x4a, 0x13, 0x29, 0xc5, + 0x29, 0xc1, 0xa6, 0x93, 0xf1, 0xf0, 0xe1, 0x43, 0xa7, 0x24, 0xda, 0x56, 0x54, 0x54, 0x74, 0xc7, + 0x42, 0xbf, 0x27, 0xac, 0xab, 0xe4, 0x08, 0xb9, 0xa8, 0xaa, 0x86, 0x0f, 0x47, 0xf3, 0x99, 0x42, + 0x7c, 0x73, 0xf8, 0x1d, 0xce, 0xf1, 0x23, 0x2b, 0x64, 0xfc, 0x7c, 0xe9, 0x10, 0x17, 0x6a, 0xa8, + 0xeb, 0xa6, 0x35, 0x4b, 0xe3, 0xd4, 0x6d, 0x5e, 0xef, 0x96, 0x44, 0x9f, 0x6f, 0xd9, 0xb2, 0xe5, + 0xf6, 0x23, 0xbd, 0x5e, 0xd0, 0xf7, 0x19, 0x04, 0xfa, 0x4d, 0x11, 0x06, 0x06, 0x07, 0x85, 0xc1, + 0xa1, 0x21, 0x61, 0xc8, 0x68, 0x14, 0x94, 0x25, 0x8a, 0xd8, 0xe5, 0xc6, 0x93, 0x31, 0xb3, 0xc5, + 0x22, 0xd4, 0xd7, 0xae, 0x8f, 0x55, 0x14, 0x67, 0x88, 0x71, 0x4a, 0x32, 0xc4, 0x4a, 0xce, 0x02, + 0xf1, 0x07, 0x65, 0x61, 0xcc, 0xe1, 0x70, 0x08, 0xaa, 0xbd, 0x5f, 0xc4, 0x9a, 0xd6, 0x2e, 0x17, + 0x25, 0x6a, 0x3e, 0x7c, 0xcf, 0x2e, 0x9d, 0xde, 0xab, 0x88, 0xfd, 0xc4, 0x21, 0xe2, 0x40, 0x12, + 0xfb, 0x27, 0xa1, 0x32, 0x05, 0x15, 0x29, 0xf8, 0x8a, 0xd8, 0x49, 0xcc, 0xfc, 0x07, 0x82, 0xed, + 0xc0, 0x33, 0xfd, 0xb3, 0x30, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, + 0x60, 0x82, +}; + +const BITMAP_OPAQUE pagelayout_load_default_xpm[1] = {{ png, sizeof( png ), "pagelayout_load_default_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_26/pagelayout_new.cpp b/bitmaps_png/cpp_26/pagelayout_new.cpp new file mode 100644 index 0000000000..cae6e4611a --- /dev/null +++ b/bitmaps_png/cpp_26/pagelayout_new.cpp @@ -0,0 +1,103 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x05, 0x5c, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x95, 0x96, 0x69, 0x6c, 0x54, + 0x55, 0x14, 0xc7, 0x6f, 0xd0, 0x04, 0x0d, 0x8a, 0x46, 0x6d, 0x48, 0xd4, 0xa0, 0xc6, 0x18, 0x30, + 0x24, 0x7c, 0xe0, 0x83, 0x58, 0x3f, 0x99, 0x98, 0x88, 0x26, 0x86, 0xb4, 0x61, 0x09, 0x4a, 0x94, + 0x2f, 0x04, 0x63, 0x11, 0x43, 0x51, 0x11, 0x1b, 0xc3, 0xd2, 0x36, 0xb6, 0x6c, 0x11, 0x68, 0xcb, + 0x1e, 0x4b, 0xb5, 0x28, 0x29, 0xd2, 0xe5, 0x75, 0x96, 0xce, 0x14, 0x5a, 0xec, 0x46, 0x93, 0x52, + 0x4b, 0x29, 0x5d, 0xa0, 0x33, 0x5d, 0xa6, 0xb3, 0xb4, 0x9d, 0xe9, 0x74, 0x66, 0x3a, 0xfb, 0x9b, + 0x79, 0xc7, 0x73, 0xee, 0xeb, 0x7b, 0x74, 0xa6, 0x33, 0x26, 0xbe, 0xe4, 0x9f, 0xf7, 0xfa, 0xfa, + 0xee, 0xfd, 0xdd, 0xf3, 0x3f, 0xe7, 0x9e, 0x3b, 0x8c, 0x31, 0xf6, 0x11, 0x2a, 0x17, 0xf5, 0xed, + 0xfc, 0x3d, 0xa5, 0x32, 0x32, 0xd8, 0x8f, 0x29, 0xde, 0xef, 0x9b, 0x1f, 0xf7, 0x29, 0x2a, 0x03, + 0x00, 0x58, 0x3a, 0xd1, 0xb5, 0xb7, 0xb2, 0xb2, 0xd2, 0xec, 0xf1, 0x7a, 0x25, 0xdf, 0xdc, 0x5c, + 0xdc, 0xef, 0xf7, 0x4b, 0xfe, 0x40, 0x40, 0x0a, 0x06, 0x83, 0x52, 0x38, 0x1c, 0xe6, 0x0a, 0x85, + 0xfc, 0xd2, 0xed, 0xdb, 0xeb, 0x21, 0x18, 0xf4, 0x4a, 0xd1, 0x68, 0x54, 0x12, 0x45, 0x91, 0x2b, + 0x16, 0x8b, 0xe1, 0xff, 0x42, 0x92, 0xd5, 0x6e, 0x17, 0x37, 0x6f, 0xdd, 0x56, 0x84, 0x73, 0x2d, + 0xff, 0x2f, 0xd0, 0x3e, 0xad, 0x4e, 0x67, 0xf7, 0xf9, 0x7c, 0x30, 0xe7, 0xf7, 0x43, 0x20, 0x10, + 0x80, 0x60, 0x28, 0x04, 0x08, 0x00, 0x9c, 0x14, 0x70, 0x42, 0x30, 0x9b, 0xcf, 0x41, 0x4d, 0x0d, + 0x03, 0x93, 0xa9, 0x04, 0xe2, 0xf1, 0x38, 0x48, 0x92, 0xa4, 0x8a, 0xbe, 0x73, 0x38, 0x1c, 0xd0, + 0xdd, 0xd3, 0x23, 0xad, 0x5b, 0x9f, 0xb9, 0x0b, 0xe7, 0x5b, 0x9a, 0x36, 0x22, 0x9d, 0x5e, 0x6f, + 0x4b, 0x07, 0x8a, 0x44, 0x02, 0xd0, 0xd0, 0xb0, 0x12, 0x9a, 0x9a, 0x18, 0x18, 0x0c, 0xaf, 0x41, + 0x2c, 0x16, 0x59, 0x04, 0xb2, 0xd9, 0x6c, 0xd0, 0xd3, 0x73, 0x0f, 0x8c, 0x4d, 0x4d, 0xf1, 0x37, + 0x56, 0xaf, 0xf9, 0x04, 0xe7, 0x7c, 0xe2, 0x7f, 0x83, 0x4c, 0xa6, 0x52, 0xd0, 0xeb, 0x19, 0x4c, + 0x4d, 0x31, 0xd0, 0xe9, 0x18, 0x8c, 0x8d, 0x95, 0xa7, 0x8c, 0xa8, 0xa5, 0xb5, 0x15, 0xbc, 0x5e, + 0x0f, 0x5c, 0xf9, 0xe3, 0x5a, 0xf4, 0xc5, 0x15, 0xaf, 0xbe, 0x93, 0x1a, 0xa4, 0xd3, 0xd9, 0xbc, + 0x29, 0x40, 0xe1, 0xf0, 0x1c, 0x42, 0x5e, 0x81, 0x07, 0x0f, 0x18, 0x38, 0x9d, 0x0c, 0xee, 0xdf, + 0x67, 0xd0, 0xd8, 0xb8, 0x0a, 0xed, 0x8b, 0x71, 0x08, 0x5d, 0xb4, 0x98, 0x99, 0x99, 0x19, 0xb8, + 0x73, 0xa7, 0x13, 0x26, 0x27, 0x27, 0xf9, 0x73, 0xe1, 0xa9, 0x33, 0xbe, 0xa5, 0xcb, 0x97, 0xbf, + 0x95, 0x1e, 0x34, 0x37, 0xc7, 0x41, 0x3e, 0x9f, 0x1d, 0x23, 0x68, 0x87, 0x7b, 0xf7, 0x72, 0x79, + 0x34, 0xd3, 0xd3, 0x0c, 0x2d, 0x94, 0xa3, 0xd2, 0x6a, 0x19, 0x3c, 0x7a, 0x74, 0x02, 0xbf, 0x1b, + 0xc3, 0xf1, 0x12, 0xcf, 0xa1, 0xd7, 0xeb, 0x85, 0x81, 0x81, 0x01, 0x78, 0xd0, 0xdf, 0xcf, 0x73, + 0x68, 0xb5, 0x5a, 0xe1, 0xa7, 0xe3, 0x25, 0x66, 0x9c, 0x7b, 0x85, 0x0a, 0x5a, 0xb2, 0x84, 0xe5, + 0x0a, 0xc2, 0x76, 0x6f, 0x7b, 0xc7, 0x26, 0xb8, 0x75, 0x6b, 0x1d, 0xd4, 0xd7, 0x3f, 0x0f, 0x82, + 0xc0, 0xc0, 0x68, 0x64, 0xd0, 0xd2, 0x42, 0x93, 0x32, 0x04, 0xcb, 0x0b, 0xf3, 0x7a, 0x19, 0x0c, + 0x0e, 0x32, 0x68, 0x6e, 0x96, 0x81, 0x82, 0xf0, 0x34, 0x8e, 0x59, 0x0b, 0x1d, 0x1d, 0xd9, 0xd0, + 0xd5, 0xb5, 0x17, 0x6e, 0xde, 0x3c, 0xcc, 0x73, 0x65, 0xb7, 0xdb, 0xa1, 0x7f, 0xa0, 0x1f, 0x0a, + 0x4b, 0x2f, 0x35, 0x2b, 0x95, 0xc8, 0x23, 0xd2, 0x68, 0x8a, 0x9d, 0x82, 0xb0, 0x0c, 0x34, 0x1a, + 0xca, 0x81, 0x6c, 0x93, 0xdb, 0x2d, 0x03, 0xfc, 0x7e, 0x86, 0xab, 0x94, 0x41, 0xb1, 0x18, 0xc3, + 0xa8, 0x19, 0x78, 0x3c, 0x0c, 0x2d, 0x62, 0x68, 0x95, 0xbc, 0x10, 0x5a, 0x98, 0x20, 0x3c, 0x05, + 0xbd, 0xf7, 0x2b, 0xa0, 0xb3, 0xb3, 0x13, 0x34, 0x5a, 0x1d, 0xb4, 0xb5, 0xb5, 0x43, 0x1b, 0x3e, + 0x9f, 0xbe, 0x58, 0x71, 0x01, 0x19, 0xcb, 0x54, 0xeb, 0xc6, 0xc7, 0x1b, 0x80, 0x60, 0x06, 0x03, + 0xc3, 0x15, 0x31, 0x98, 0x9d, 0x65, 0x98, 0x87, 0xd4, 0xfb, 0x8f, 0xc0, 0xb4, 0x10, 0xfa, 0x8e, + 0x22, 0xa7, 0x71, 0x0e, 0x87, 0x91, 0x5b, 0x48, 0xb6, 0xf5, 0xa3, 0x85, 0x77, 0xef, 0x76, 0x43, + 0x77, 0xf7, 0x3f, 0xd0, 0xd6, 0xd1, 0xe9, 0x41, 0xc6, 0xeb, 0x2a, 0x08, 0x37, 0x2c, 0x58, 0x2c, + 0x86, 0x45, 0x30, 0x25, 0x9a, 0x64, 0x88, 0xcd, 0xc6, 0xb0, 0xec, 0x19, 0xba, 0xf0, 0x1c, 0x46, + 0xd7, 0xce, 0x73, 0x43, 0x85, 0x81, 0x1b, 0x1e, 0xc7, 0xcd, 0xa2, 0x2b, 0x4e, 0xcc, 0xe9, 0x14, + 0x8c, 0x8e, 0x8e, 0x05, 0x90, 0xb1, 0x3a, 0x01, 0x44, 0x05, 0x31, 0x31, 0x61, 0x04, 0xa1, 0xfe, + 0x19, 0x0e, 0x23, 0x0b, 0xa3, 0xd1, 0x44, 0x50, 0x38, 0x2c, 0x5b, 0x46, 0x45, 0xa2, 0xd5, 0xbe, + 0x80, 0xd0, 0x2e, 0xb5, 0x02, 0xe9, 0x8e, 0xdd, 0x82, 0x03, 0xb1, 0x63, 0x70, 0x61, 0x25, 0x12, + 0x68, 0x95, 0x0a, 0x9a, 0xf5, 0x78, 0x38, 0x08, 0xdb, 0x10, 0x96, 0x73, 0x3e, 0x9f, 0x88, 0x40, + 0x64, 0x1f, 0x89, 0x00, 0x74, 0x17, 0x45, 0xb9, 0xfa, 0x6a, 0x6b, 0x19, 0xda, 0xf4, 0x57, 0xc2, + 0x9e, 0x52, 0x2e, 0x7a, 0xa6, 0x08, 0x49, 0x58, 0xee, 0x8f, 0x41, 0xda, 0x79, 0x10, 0x45, 0x45, + 0x1b, 0xb7, 0xab, 0x6b, 0x27, 0xaf, 0x38, 0x4a, 0x78, 0x20, 0xc0, 0xc0, 0xe5, 0x92, 0xa1, 0xf4, + 0x77, 0x28, 0x24, 0x3f, 0x93, 0x6d, 0x23, 0x23, 0xe7, 0x16, 0xb5, 0xa4, 0x85, 0x40, 0xba, 0xdc, + 0x6e, 0x77, 0x22, 0xc8, 0x8d, 0xbe, 0x2a, 0xf6, 0x35, 0x37, 0xbf, 0x8b, 0x89, 0x94, 0x27, 0xa4, + 0x3d, 0xd4, 0xd7, 0x27, 0x97, 0x34, 0x55, 0x18, 0xbd, 0x23, 0xd1, 0x42, 0x7a, 0x7b, 0xf7, 0xa8, + 0x2b, 0x4f, 0x05, 0x24, 0x25, 0x46, 0xa4, 0xd5, 0x72, 0x10, 0xb7, 0x0f, 0x61, 0x82, 0xf0, 0x2c, + 0x0c, 0x0d, 0x31, 0xde, 0x11, 0xc8, 0x42, 0x6a, 0xa8, 0x54, 0x24, 0x74, 0xa7, 0x9e, 0x67, 0x36, + 0x33, 0xac, 0x2a, 0x06, 0xad, 0xad, 0x1f, 0xf0, 0x9c, 0x2c, 0x84, 0x25, 0x03, 0x17, 0x81, 0x66, + 0xdc, 0x6e, 0x5e, 0x2d, 0x93, 0x53, 0x7d, 0x7c, 0x42, 0xda, 0x53, 0x74, 0x6f, 0x6c, 0x5c, 0x03, + 0xe3, 0xe3, 0x55, 0x74, 0x44, 0xc0, 0xc3, 0x87, 0x27, 0xb1, 0x00, 0x5e, 0xe2, 0xef, 0xa9, 0xef, + 0xe9, 0xf5, 0x2f, 0x73, 0x90, 0xa2, 0x64, 0xe0, 0xa2, 0x1c, 0x69, 0x08, 0x84, 0x3d, 0x8a, 0xa2, + 0x32, 0x99, 0xff, 0xe4, 0x13, 0x19, 0x0c, 0x6f, 0xc2, 0xb0, 0xa9, 0x1c, 0xae, 0x1e, 0x3c, 0x0c, + 0x45, 0x59, 0x5b, 0x54, 0x1d, 0xdb, 0x9a, 0x05, 0x97, 0x8f, 0xbc, 0x0d, 0x37, 0xaa, 0x9e, 0xe4, + 0xdf, 0x1d, 0xdd, 0x92, 0x05, 0xc5, 0xd9, 0x5b, 0xd3, 0xea, 0x5a, 0xc1, 0xcf, 0xe2, 0x63, 0x90, + 0x46, 0x63, 0x73, 0x21, 0x88, 0xa2, 0x1a, 0x1a, 0x3a, 0x8f, 0x6d, 0xa6, 0x04, 0xf3, 0xe5, 0xe6, + 0xbd, 0xef, 0xec, 0x97, 0x5f, 0xc3, 0xa5, 0x6f, 0xf6, 0x41, 0xdb, 0xf5, 0x6a, 0x68, 0xbf, 0x51, + 0x0b, 0x1d, 0xa8, 0x3b, 0xd5, 0x75, 0xd0, 0x56, 0x7d, 0x05, 0x8c, 0x35, 0x1f, 0x43, 0x4b, 0xcd, + 0x49, 0xe8, 0xac, 0x11, 0xd2, 0xaa, 0xfb, 0x66, 0x53, 0x48, 0x05, 0x09, 0x08, 0x72, 0xba, 0x5c, + 0xa0, 0x44, 0xb5, 0xb0, 0x02, 0x09, 0x54, 0x5f, 0x72, 0x16, 0x02, 0xc1, 0x20, 0xef, 0xea, 0x21, + 0xea, 0xea, 0x91, 0x08, 0x36, 0xd9, 0x08, 0xdf, 0x2f, 0xca, 0xe1, 0x98, 0x4e, 0xb8, 0x71, 0x1f, + 0x5b, 0x27, 0x08, 0x1a, 0xdb, 0x34, 0xee, 0x64, 0x25, 0x2a, 0x5e, 0x81, 0xf3, 0x85, 0x51, 0x86, + 0x20, 0x01, 0x41, 0x78, 0xbc, 0xc3, 0xe5, 0x03, 0x7b, 0x20, 0x6f, 0x43, 0xe6, 0x22, 0x4d, 0x5b, + 0x2d, 0x2a, 0xf0, 0x62, 0xce, 0x17, 0x50, 0xbc, 0xf1, 0x7d, 0xae, 0xc1, 0xf6, 0xbf, 0x13, 0x41, + 0x75, 0x82, 0x60, 0x9b, 0x9a, 0x9e, 0x06, 0x8a, 0x4a, 0x81, 0xcd, 0xce, 0x97, 0x7b, 0xd9, 0xae, + 0xdd, 0x20, 0x9c, 0x29, 0xe3, 0x67, 0xd5, 0xef, 0xf9, 0x07, 0xa0, 0x60, 0xf3, 0x87, 0x09, 0x2a, + 0xdc, 0xb2, 0x01, 0x9c, 0xb6, 0x09, 0x35, 0xba, 0xda, 0xe3, 0xf9, 0xf0, 0xdb, 0xf7, 0xbb, 0xb9, + 0x46, 0x7b, 0xbb, 0x13, 0x41, 0xe5, 0xe5, 0x15, 0x23, 0x93, 0xd8, 0x97, 0x28, 0xaa, 0x64, 0x0b, + 0x09, 0x54, 0x87, 0x20, 0xea, 0x18, 0x04, 0xa3, 0xc8, 0xf8, 0xe1, 0x88, 0x56, 0x2a, 0x6d, 0x26, + 0xbc, 0xc0, 0xce, 0x48, 0x92, 0xad, 0xc3, 0xc3, 0xc3, 0x33, 0x0a, 0x28, 0x37, 0x2f, 0x2f, 0xaf, + 0xcf, 0x81, 0xa7, 0x23, 0x45, 0x95, 0x6c, 0x21, 0x07, 0x9d, 0x2e, 0xe5, 0x1b, 0xf9, 0xfa, 0xd5, + 0xfd, 0x70, 0xfe, 0x97, 0x4d, 0x5c, 0x17, 0x4e, 0x6d, 0x4e, 0x90, 0xa1, 0xfe, 0x04, 0x07, 0x6a, + 0x31, 0xea, 0xf2, 0xcf, 0x36, 0xaa, 0xba, 0xf4, 0xd5, 0x8e, 0x59, 0x05, 0xf4, 0x5d, 0x4e, 0x4e, + 0x4e, 0xaf, 0xc9, 0x6c, 0x16, 0xcd, 0x23, 0xa3, 0xe2, 0xe8, 0xd8, 0x98, 0x38, 0x6e, 0xb1, 0x88, + 0x96, 0x89, 0x09, 0x71, 0xc2, 0x6a, 0x15, 0x2b, 0x0f, 0x15, 0xc4, 0x1b, 0x7e, 0xad, 0x88, 0xdb, + 0x1d, 0x0e, 0xf1, 0x72, 0xd9, 0x8e, 0x78, 0xd1, 0xc1, 0x4c, 0x49, 0xd5, 0xa1, 0x4c, 0xa9, 0x98, + 0xeb, 0x3d, 0xa9, 0xaa, 0x72, 0x7f, 0xdc, 0xe5, 0x72, 0x89, 0xc2, 0x91, 0x1f, 0xe2, 0xe5, 0x9f, + 0x67, 0x4b, 0x8a, 0x4a, 0x77, 0x6e, 0x77, 0x2a, 0xdd, 0x7b, 0x1b, 0xea, 0x28, 0xea, 0x04, 0xea, + 0x58, 0x92, 0x8e, 0xa6, 0x51, 0x71, 0x0a, 0x15, 0xa5, 0xd0, 0x49, 0x14, 0xfd, 0xf0, 0x5c, 0xf9, + 0x2f, 0xb1, 0x1e, 0x76, 0x45, 0x80, 0x57, 0x13, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, + 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pagelayout_new_xpm[1] = {{ png, sizeof( png ), "pagelayout_new_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_26/pagelayout_normal_view_mode.cpp b/bitmaps_png/cpp_26/pagelayout_normal_view_mode.cpp new file mode 100644 index 0000000000..9d619877ad --- /dev/null +++ b/bitmaps_png/cpp_26/pagelayout_normal_view_mode.cpp @@ -0,0 +1,98 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x05, 0x17, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x9d, 0x95, 0x6d, 0x4c, 0x53, + 0x57, 0x18, 0xc7, 0xc1, 0x99, 0x98, 0x48, 0xe2, 0x07, 0x01, 0x35, 0xb0, 0xe0, 0x46, 0xf6, 0x62, + 0x34, 0x86, 0x6c, 0x99, 0x53, 0x98, 0x1f, 0x4c, 0x36, 0xc7, 0x88, 0x44, 0x66, 0xa8, 0x46, 0x24, + 0x9b, 0x7c, 0x58, 0x5c, 0x28, 0x1b, 0x99, 0x6e, 0x38, 0x25, 0x46, 0xa3, 0x25, 0xf2, 0xe6, 0xa2, + 0x22, 0xb0, 0x09, 0x0c, 0x86, 0x56, 0x34, 0x12, 0x1c, 0x56, 0x8a, 0x83, 0x38, 0xb6, 0x55, 0x2a, + 0x5d, 0x02, 0x43, 0x44, 0x98, 0x0b, 0x50, 0x2a, 0xf4, 0x05, 0xda, 0x52, 0x5a, 0x68, 0x29, 0x70, + 0xe9, 0xfd, 0xef, 0x9c, 0x03, 0xf7, 0x42, 0x4b, 0x61, 0x2f, 0x27, 0xf9, 0xa5, 0xcd, 0xbd, 0xe7, + 0x9c, 0x5f, 0x9f, 0xe7, 0x3c, 0xe7, 0x69, 0x40, 0x40, 0x40, 0xc0, 0x07, 0x84, 0xa3, 0x84, 0x2f, + 0xe7, 0x3e, 0xff, 0x0b, 0xc7, 0xe6, 0xd6, 0x25, 0x11, 0x42, 0x01, 0x04, 0x2c, 0x05, 0x1d, 0x5f, + 0xc8, 0xe5, 0xf2, 0x3e, 0xbb, 0xc3, 0xc1, 0x8f, 0x8d, 0x8f, 0x7b, 0x9c, 0x4e, 0x27, 0xef, 0x74, + 0xb9, 0xf8, 0x89, 0x89, 0x09, 0x7e, 0x72, 0x72, 0x92, 0x31, 0x35, 0x35, 0x25, 0x32, 0x3d, 0x3d, + 0xcd, 0x73, 0x1c, 0xc7, 0x98, 0x99, 0x99, 0xe1, 0xdd, 0x6e, 0x37, 0xaf, 0x37, 0x1a, 0x39, 0xc9, + 0x81, 0x83, 0xd9, 0x64, 0xaf, 0x35, 0xcb, 0x89, 0x8e, 0x29, 0xeb, 0xeb, 0x8d, 0x63, 0x63, 0x63, + 0x18, 0x77, 0x3a, 0xe1, 0x72, 0xb9, 0x30, 0xe1, 0x76, 0x83, 0x08, 0x40, 0x36, 0x05, 0xd9, 0x90, + 0x41, 0x36, 0x65, 0x78, 0x3c, 0x1e, 0xf0, 0x3c, 0x2f, 0x42, 0xe7, 0x99, 0x4c, 0x26, 0xb4, 0xb5, + 0xb7, 0xf3, 0x6f, 0x6e, 0x8f, 0x3e, 0x42, 0xf6, 0x5b, 0xb5, 0x64, 0x44, 0xf5, 0xf7, 0xef, 0x1b, + 0xfe, 0x8d, 0x88, 0x4a, 0xfc, 0x89, 0x0c, 0x06, 0x03, 0xda, 0xdb, 0x1f, 0xa3, 0xb1, 0xa9, 0xc9, + 0xf3, 0xf2, 0xa6, 0x2d, 0xf1, 0x64, 0xcf, 0x17, 0xfe, 0x97, 0xc8, 0x62, 0xb1, 0x80, 0xa4, 0x17, + 0xa9, 0xa9, 0xa9, 0xc8, 0xc8, 0xc8, 0x40, 0x5e, 0x5e, 0x1e, 0x6a, 0x6a, 0x6a, 0x98, 0x5c, 0x88, + 0x48, 0xf5, 0xf0, 0x21, 0x1c, 0x0e, 0x3b, 0x7e, 0xa8, 0xba, 0x35, 0x1d, 0xbc, 0xfe, 0xc5, 0xb7, + 0xfd, 0x8b, 0xea, 0xeb, 0x0d, 0x0e, 0x3f, 0xa2, 0xde, 0xde, 0x5e, 0x24, 0x24, 0x24, 0x60, 0xe5, + 0xca, 0x95, 0x74, 0xe6, 0x22, 0x36, 0x6f, 0xde, 0x8c, 0xea, 0xea, 0x6a, 0x8c, 0x8c, 0x8c, 0xa0, + 0xa5, 0x45, 0x83, 0xa1, 0xa1, 0x21, 0xf6, 0x3d, 0xeb, 0x52, 0xc1, 0xd8, 0xaa, 0x35, 0x6b, 0x5e, + 0x5d, 0x5a, 0x34, 0x3e, 0x3e, 0x2b, 0x9a, 0x98, 0x40, 0x6e, 0x6e, 0x2e, 0x56, 0xaf, 0x5e, 0xcd, + 0x36, 0x8c, 0x8c, 0x8c, 0x44, 0xee, 0xf9, 0x1a, 0xdc, 0xbe, 0x6e, 0xc1, 0xad, 0x6b, 0x66, 0x54, + 0x7e, 0xdf, 0x82, 0xe8, 0xe8, 0x18, 0x51, 0xb8, 0x6d, 0xdb, 0x36, 0xa8, 0xd5, 0x6a, 0x3c, 0xed, + 0xea, 0x62, 0xa9, 0xd5, 0xeb, 0xf5, 0x38, 0x95, 0x7f, 0xa5, 0x8f, 0xbc, 0x5b, 0xbf, 0xa4, 0xc8, + 0x36, 0x3a, 0x8a, 0xa4, 0xa4, 0x24, 0xb6, 0x41, 0x60, 0x60, 0x20, 0xd2, 0xd3, 0xd3, 0xa1, 0xfa, + 0x79, 0x06, 0xd7, 0x4b, 0xe0, 0x85, 0xea, 0x01, 0xa0, 0x54, 0x2a, 0x11, 0x1e, 0x1e, 0xce, 0xe6, + 0x46, 0x45, 0x45, 0xa1, 0xa1, 0xa1, 0x91, 0x9d, 0x95, 0xd1, 0x68, 0x44, 0x57, 0x77, 0x17, 0xb2, + 0x0a, 0x4b, 0x7f, 0x11, 0x2a, 0x71, 0x5e, 0xe4, 0x70, 0x30, 0xc9, 0xee, 0xdd, 0xbb, 0xd9, 0xc2, + 0x0d, 0x1b, 0x36, 0xa0, 0xb1, 0xb1, 0x11, 0xfa, 0xe7, 0xb3, 0x1b, 0xe7, 0xcb, 0xfe, 0xc2, 0x96, + 0x4d, 0xef, 0xe2, 0xb5, 0x57, 0x76, 0xe2, 0xfc, 0xe9, 0x0e, 0xf6, 0xec, 0xb9, 0x16, 0x78, 0xf6, + 0xec, 0x19, 0xd6, 0xad, 0x5b, 0xc7, 0xd6, 0xbc, 0xb3, 0x73, 0x27, 0x1e, 0x92, 0xb3, 0xaa, 0x53, + 0xd6, 0xa3, 0xb9, 0x59, 0x8d, 0x66, 0x8d, 0x06, 0x97, 0x4b, 0x2a, 0xaf, 0x92, 0x77, 0x41, 0x5e, + 0xa2, 0x94, 0x94, 0x14, 0xb6, 0x20, 0x38, 0x38, 0x18, 0xdd, 0xdd, 0xdd, 0xa0, 0xa3, 0x55, 0x33, + 0x2b, 0x8a, 0xd9, 0x9e, 0x2c, 0xa6, 0xea, 0xad, 0x37, 0xf6, 0xb1, 0x67, 0x1a, 0x15, 0x9b, 0x82, + 0x27, 0x4f, 0x9e, 0x60, 0xed, 0xda, 0xb5, 0xec, 0x5d, 0x7c, 0x7c, 0x3c, 0x3a, 0x3b, 0x3b, 0xd1, + 0xda, 0xda, 0x86, 0xb6, 0xb6, 0x3f, 0xd0, 0xfc, 0x48, 0x63, 0x27, 0xcf, 0x5f, 0x12, 0x45, 0xe4, + 0xc2, 0x8a, 0x29, 0xa3, 0x22, 0x3a, 0x99, 0x8e, 0x8e, 0xd6, 0x59, 0xd1, 0x9e, 0xd8, 0xe3, 0xa2, + 0xe8, 0xbd, 0x5d, 0x52, 0xf6, 0x8c, 0xfe, 0x08, 0x3a, 0x68, 0xd1, 0x44, 0x44, 0x44, 0xb0, 0x77, + 0x3b, 0x76, 0xec, 0x60, 0xa9, 0xa3, 0x95, 0x3a, 0x3c, 0x3c, 0x8c, 0xfe, 0x7e, 0x9d, 0x8b, 0x3c, + 0xdf, 0xe4, 0x25, 0x1a, 0xb1, 0xd9, 0x10, 0x17, 0x17, 0xc7, 0x16, 0x84, 0x84, 0x84, 0xb0, 0x8a, + 0xb2, 0x59, 0x01, 0x79, 0x19, 0x50, 0x52, 0xe0, 0x80, 0x24, 0x41, 0x86, 0x84, 0x3d, 0xa7, 0xf0, + 0xed, 0x45, 0x2b, 0xe4, 0xa5, 0x80, 0xd5, 0x0c, 0x16, 0x79, 0x58, 0x58, 0x18, 0x5b, 0x13, 0x13, + 0x13, 0x83, 0x51, 0x92, 0x7e, 0x7a, 0x2d, 0x48, 0xc7, 0x60, 0x90, 0x4a, 0xa4, 0xa2, 0xd7, 0x45, + 0xd1, 0xa8, 0xdd, 0x0e, 0x5a, 0x10, 0xf4, 0x33, 0x2d, 0x2d, 0x4d, 0xfc, 0xf5, 0x89, 0x89, 0x89, + 0x68, 0xfd, 0xdd, 0x81, 0x1b, 0x65, 0xf3, 0x85, 0x40, 0xc5, 0x4f, 0x1f, 0xcf, 0xa0, 0xbc, 0xbc, + 0x1c, 0xa1, 0xa1, 0xa1, 0x62, 0x24, 0x34, 0xfd, 0x74, 0xd0, 0x8b, 0x2c, 0x5c, 0x6e, 0x52, 0xee, + 0xf3, 0x22, 0xe5, 0x9c, 0x88, 0x46, 0x25, 0x5c, 0xdc, 0x9b, 0x37, 0x6f, 0x62, 0xe3, 0xc6, 0x8d, + 0x6c, 0x93, 0xa0, 0xa0, 0x20, 0x24, 0x1f, 0x92, 0xa2, 0xb8, 0xe0, 0x57, 0x14, 0x5e, 0x6c, 0xc2, + 0xc9, 0x13, 0x79, 0x62, 0x14, 0xb4, 0x32, 0xe9, 0x8f, 0xb1, 0x93, 0xf5, 0x42, 0xb7, 0x58, 0x38, + 0x6c, 0x36, 0x9b, 0xb7, 0x88, 0x56, 0x1c, 0x15, 0x09, 0x65, 0x4e, 0x1a, 0x2b, 0x9d, 0x04, 0x99, + 0x4c, 0x86, 0xad, 0x5b, 0xb7, 0x2e, 0xba, 0xac, 0x2b, 0x56, 0xac, 0x80, 0x44, 0x22, 0x21, 0xe5, + 0xdc, 0xee, 0xb7, 0x35, 0x09, 0x78, 0x47, 0xa4, 0x54, 0x32, 0x11, 0x4b, 0x1f, 0x8d, 0x8a, 0x8a, + 0x7c, 0xba, 0x84, 0x56, 0xab, 0x45, 0x55, 0x55, 0x15, 0x6a, 0x6b, 0x6b, 0xa1, 0x52, 0xa9, 0xa0, + 0xd3, 0xe9, 0xbc, 0x1a, 0xed, 0x42, 0x96, 0x15, 0xd1, 0x42, 0x18, 0xf5, 0x13, 0x15, 0xed, 0x12, + 0xee, 0x39, 0x19, 0xf9, 0x9b, 0xf0, 0x6a, 0xb4, 0x0b, 0xbb, 0xba, 0x3f, 0xe1, 0xa2, 0x33, 0xaa, + 0xa3, 0x22, 0xd2, 0xa3, 0x7c, 0xa3, 0xa2, 0x67, 0x75, 0xe3, 0xf4, 0x59, 0x64, 0x7f, 0xb8, 0x7f, + 0x59, 0x72, 0xf6, 0x1d, 0x58, 0x92, 0x5b, 0xb2, 0xf3, 0xdc, 0xbc, 0xa8, 0xae, 0xce, 0x60, 0x25, + 0x22, 0x7f, 0x51, 0x15, 0x7f, 0xfa, 0x19, 0x4a, 0xd3, 0x8f, 0xa1, 0xb9, 0xfa, 0x0e, 0xd4, 0x35, + 0xb5, 0x78, 0x44, 0x68, 0xb9, 0x73, 0x97, 0xa1, 0xf9, 0x51, 0xf1, 0x8f, 0xb4, 0x3d, 0x68, 0x72, + 0x8b, 0x22, 0x05, 0x11, 0x59, 0xac, 0x56, 0x2c, 0x8c, 0x4a, 0xa8, 0x40, 0x2a, 0xba, 0x77, 0xa5, + 0x18, 0x2e, 0x92, 0x42, 0x7a, 0x5e, 0x6e, 0x92, 0xc2, 0x49, 0x92, 0x42, 0x21, 0x8d, 0xbe, 0xa9, + 0xf4, 0x85, 0x5c, 0xdc, 0xf9, 0xd4, 0x29, 0x14, 0x75, 0x06, 0x33, 0xb9, 0xc9, 0x42, 0x54, 0xac, + 0x02, 0xe7, 0x52, 0x58, 0x44, 0x44, 0x0a, 0x22, 0xa2, 0xe7, 0x55, 0x76, 0xe2, 0x73, 0x64, 0xc6, + 0x46, 0x2f, 0xc2, 0xac, 0x1f, 0x10, 0x85, 0x25, 0xd2, 0x8f, 0x91, 0xb3, 0x77, 0x17, 0xe3, 0x4f, + 0xf5, 0x6f, 0xde, 0xa2, 0xbb, 0x0a, 0x85, 0x61, 0xd8, 0x6c, 0x06, 0x8d, 0xca, 0x37, 0x85, 0x45, + 0x47, 0xd2, 0xa0, 0x28, 0x28, 0x62, 0xe7, 0x75, 0xfd, 0xdc, 0x09, 0xc8, 0x24, 0xef, 0x7b, 0x91, + 0xb5, 0x3f, 0x16, 0x16, 0xc3, 0xa0, 0x18, 0x5d, 0x6d, 0xfe, 0x39, 0x5c, 0xcb, 0x48, 0x63, 0xf4, + 0x77, 0xb4, 0x79, 0x8b, 0x2a, 0x2a, 0x2a, 0xb5, 0x43, 0xa4, 0x2f, 0xd1, 0xa8, 0x7c, 0x53, 0x48, + 0x45, 0x77, 0x89, 0x48, 0x28, 0x0e, 0x1a, 0x99, 0x6b, 0x41, 0x35, 0x0a, 0x15, 0x29, 0xa4, 0x73, + 0xca, 0x27, 0xad, 0x3d, 0x3d, 0x3d, 0x23, 0x82, 0xe8, 0x68, 0x66, 0x66, 0x66, 0xa7, 0x89, 0xfc, + 0x3b, 0xd2, 0xa8, 0x7c, 0x53, 0xc8, 0x44, 0x97, 0x0b, 0x59, 0x71, 0x54, 0xdf, 0x38, 0x8e, 0xef, + 0x2e, 0x26, 0x32, 0xae, 0x5e, 0x92, 0x78, 0xd1, 0x70, 0xef, 0x02, 0x13, 0x2a, 0x49, 0xd4, 0x15, + 0x87, 0xf6, 0x8a, 0x94, 0xa6, 0x1e, 0x1e, 0x15, 0x44, 0x5f, 0x49, 0xa5, 0xd2, 0x8e, 0xde, 0xbe, + 0x3e, 0xae, 0x4f, 0xdb, 0xcf, 0xf5, 0xeb, 0x74, 0xdc, 0xf3, 0x81, 0x01, 0x6e, 0x60, 0x70, 0x90, + 0x1b, 0xd4, 0xeb, 0x39, 0xf9, 0x19, 0x99, 0xe7, 0xa7, 0xf2, 0x4a, 0x8f, 0xd1, 0x64, 0xe2, 0xca, + 0x8a, 0x0e, 0x7b, 0xb2, 0x4f, 0x47, 0xf3, 0x22, 0x67, 0xa2, 0xf9, 0x1c, 0x46, 0x0c, 0x7f, 0x5b, + 0x7e, 0xdc, 0x63, 0xb5, 0x5a, 0x39, 0xc5, 0xd9, 0xaf, 0x3d, 0x15, 0x1f, 0xed, 0xe3, 0x05, 0x0a, + 0x3f, 0x49, 0xb6, 0x08, 0xdd, 0xfb, 0x20, 0x21, 0x97, 0x70, 0x81, 0x90, 0xe7, 0x43, 0xee, 0x12, + 0xe4, 0xf8, 0x21, 0xdb, 0x0f, 0xdf, 0x10, 0x4e, 0x12, 0x22, 0xfe, 0x06, 0x07, 0xf6, 0x34, 0x4a, + 0xcd, 0xd3, 0x93, 0xba, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pagelayout_normal_view_mode_xpm[1] = {{ png, sizeof( png ), "pagelayout_normal_view_mode_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_26/pagelayout_recent.cpp b/bitmaps_png/cpp_26/pagelayout_recent.cpp new file mode 100644 index 0000000000..9467e16ef1 --- /dev/null +++ b/bitmaps_png/cpp_26/pagelayout_recent.cpp @@ -0,0 +1,105 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x05, 0x80, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x95, 0x96, 0x5b, 0x6c, 0x1c, + 0x57, 0x19, 0xc7, 0x7f, 0xdf, 0x99, 0xcb, 0xce, 0x78, 0x77, 0xbc, 0xf6, 0xc6, 0xf1, 0x26, 0xce, + 0x85, 0x86, 0x5c, 0x6a, 0xb7, 0x05, 0xd1, 0x1a, 0x91, 0x10, 0x40, 0xa4, 0x0d, 0x26, 0xa9, 0x42, + 0x14, 0x54, 0x2a, 0x01, 0x12, 0x0f, 0xa8, 0xf0, 0x02, 0x4a, 0x21, 0x44, 0x04, 0x2b, 0x08, 0x08, + 0xb4, 0x42, 0xe1, 0xd2, 0x17, 0x44, 0xa1, 0x15, 0x08, 0x55, 0x95, 0x82, 0x80, 0x17, 0x90, 0x40, + 0xa2, 0xa9, 0x48, 0xc5, 0x43, 0xda, 0xaa, 0x95, 0x22, 0x92, 0x86, 0x16, 0x99, 0x24, 0x4d, 0xf1, + 0xd2, 0x38, 0x5e, 0x5f, 0x76, 0xd7, 0xeb, 0xbd, 0xef, 0xcc, 0x1c, 0x1e, 0x66, 0x3d, 0xd9, 0x4d, + 0x9d, 0xa8, 0x7c, 0xd2, 0x48, 0x33, 0x73, 0x8e, 0xce, 0xef, 0x7c, 0xff, 0xef, 0x7f, 0xbe, 0x19, + 0x01, 0xf6, 0x03, 0x63, 0x80, 0x02, 0x42, 0xfe, 0xbf, 0x90, 0xce, 0x35, 0x03, 0x9c, 0xd1, 0x5a, + 0xcf, 0xdf, 0x6a, 0xa2, 0x09, 0x8c, 0x9e, 0x3a, 0x75, 0xea, 0xf0, 0xa7, 0x0e, 0x1e, 0xdc, 0xa2, + 0x94, 0xd2, 0x4a, 0x44, 0x10, 0x81, 0x5a, 0x89, 0xe6, 0xa5, 0x33, 0x50, 0xf9, 0xaf, 0x88, 0x32, + 0x08, 0x13, 0x6b, 0xb4, 0xbb, 0x63, 0x2f, 0x56, 0x66, 0x13, 0x22, 0x12, 0x51, 0x44, 0x68, 0xb7, + 0xdb, 0x2c, 0x16, 0x8b, 0xc1, 0x91, 0x23, 0x47, 0x9f, 0x10, 0x91, 0x93, 0x5a, 0xeb, 0xf2, 0xad, + 0x40, 0x6a, 0x30, 0x93, 0x71, 0x95, 0x44, 0x41, 0x18, 0x50, 0x7b, 0xe9, 0x49, 0xdc, 0xfa, 0x14, + 0x9e, 0x59, 0xa5, 0x55, 0x2e, 0x42, 0x18, 0x62, 0x0f, 0xac, 0x91, 0xd6, 0xcb, 0x7f, 0x67, 0xd9, + 0xde, 0x46, 0xfa, 0x81, 0x6f, 0xa2, 0x1c, 0x2f, 0x86, 0x19, 0x22, 0xe6, 0xf1, 0xe3, 0x93, 0x93, + 0x57, 0xa7, 0xa7, 0xdf, 0x12, 0x91, 0x67, 0xb5, 0xd6, 0xcd, 0x9b, 0x41, 0x0a, 0x08, 0x45, 0x44, + 0x03, 0x84, 0xf5, 0x12, 0xcd, 0x33, 0xdf, 0x26, 0x5d, 0x7d, 0x91, 0xb9, 0x6b, 0xd7, 0xb9, 0x90, + 0x5f, 0xc7, 0xc5, 0xc1, 0x2f, 0xf0, 0xda, 0xd0, 0x23, 0xbc, 0xb6, 0xb0, 0x99, 0xd9, 0xd9, 0x65, + 0x92, 0xb5, 0x57, 0x59, 0x3e, 0x7d, 0x8c, 0xe6, 0xec, 0x54, 0xbc, 0x48, 0x18, 0x86, 0x28, 0x44, + 0x7e, 0x74, 0xf2, 0x87, 0x4f, 0x6d, 0x19, 0xbd, 0x7b, 0x42, 0x44, 0x8c, 0xd5, 0x40, 0x71, 0x34, + 0x5f, 0x7e, 0x92, 0xdc, 0x7c, 0x9e, 0x73, 0xd7, 0x86, 0x98, 0xda, 0xfa, 0x28, 0xd9, 0x4f, 0x1e, + 0x23, 0x57, 0x4b, 0x42, 0x66, 0x2b, 0x03, 0xf7, 0x7f, 0x85, 0xda, 0x9e, 0xc7, 0x79, 0xa3, 0x76, + 0x37, 0x56, 0xed, 0x0a, 0xb5, 0x57, 0x9f, 0x06, 0x1d, 0x95, 0x54, 0x29, 0xc5, 0x72, 0x65, 0x99, + 0x9d, 0xe3, 0xf7, 0xa9, 0x13, 0xdf, 0xfb, 0xee, 0x1f, 0xd7, 0x64, 0x37, 0x8e, 0xaf, 0x0e, 0xd2, + 0x9a, 0xd6, 0xd4, 0x69, 0x3c, 0xfe, 0x43, 0x65, 0xf8, 0x13, 0xf4, 0xef, 0x3d, 0xc6, 0xae, 0x9d, + 0xbb, 0x99, 0x9d, 0xcb, 0x33, 0x3f, 0xbf, 0x40, 0xb1, 0x58, 0xa2, 0xcf, 0xe9, 0x23, 0x95, 0xf4, + 0x70, 0x77, 0x3f, 0x42, 0xae, 0xbe, 0x91, 0xa4, 0xbc, 0xcd, 0xd2, 0xd9, 0x5f, 0xa2, 0x94, 0xc2, + 0xb6, 0x6d, 0x2c, 0xd3, 0xa2, 0x5e, 0x6f, 0x70, 0x70, 0xdf, 0x84, 0xf5, 0x8d, 0xe3, 0xdf, 0x3a, + 0xe3, 0xa4, 0xd3, 0xdb, 0x6f, 0xae, 0x51, 0x14, 0x85, 0x29, 0xda, 0x0b, 0x6f, 0x91, 0xb8, 0xeb, + 0xab, 0x6c, 0x18, 0x19, 0x61, 0x66, 0xe6, 0x3a, 0x6b, 0x87, 0x86, 0x10, 0x51, 0x94, 0x4a, 0x65, + 0x9c, 0x84, 0x83, 0x46, 0x13, 0x04, 0x3e, 0xe5, 0xf1, 0x2f, 0x53, 0x39, 0xff, 0x18, 0xa6, 0x93, + 0x47, 0x44, 0x30, 0x4d, 0x93, 0x74, 0xba, 0x9f, 0x85, 0xc5, 0x45, 0xc6, 0x46, 0x47, 0xf9, 0xe2, + 0xc3, 0x0f, 0x79, 0x8d, 0xb6, 0x9c, 0x16, 0x91, 0xdd, 0x5a, 0xeb, 0x7c, 0x0f, 0x48, 0x5a, 0x45, + 0xca, 0x75, 0x93, 0xf9, 0x52, 0x19, 0x79, 0xf3, 0x0a, 0x7e, 0x10, 0xd0, 0x68, 0x35, 0x68, 0x34, + 0x1a, 0x34, 0x9b, 0x4d, 0x4c, 0xd3, 0xc4, 0x68, 0x1b, 0x51, 0x06, 0xae, 0x47, 0xd3, 0xca, 0x62, + 0xd6, 0xae, 0xa3, 0x94, 0xc2, 0xb2, 0x2c, 0x32, 0x99, 0x0c, 0x97, 0x2e, 0x5d, 0xe6, 0xe2, 0xc5, + 0x7f, 0x92, 0xcd, 0x0e, 0xf3, 0xf9, 0x03, 0x0f, 0xbc, 0xd7, 0x71, 0x7f, 0xfd, 0x7b, 0x11, 0x39, + 0xa4, 0xb5, 0x2e, 0x77, 0x81, 0xca, 0x68, 0xcb, 0x63, 0x28, 0x9b, 0x21, 0xe5, 0xa5, 0xf0, 0x92, + 0xfd, 0xb8, 0xae, 0xcb, 0xcf, 0x7f, 0xf1, 0x14, 0x85, 0x42, 0x01, 0x1d, 0x86, 0x8c, 0x6c, 0x58, + 0xcf, 0xfa, 0x0d, 0x59, 0x0c, 0x25, 0xf8, 0x76, 0x1a, 0x69, 0xcf, 0x43, 0xab, 0x86, 0x65, 0x39, + 0xf4, 0xf5, 0xf5, 0xb1, 0x69, 0xf3, 0x26, 0xf2, 0xb3, 0xb3, 0xfc, 0xe3, 0xfc, 0x05, 0x06, 0xd2, + 0x69, 0xf6, 0x7c, 0xf0, 0x7d, 0x7b, 0x7e, 0xf6, 0xab, 0x67, 0x7f, 0x2a, 0x22, 0x47, 0x63, 0x50, + 0x68, 0x0f, 0x60, 0x07, 0x6f, 0x60, 0x2a, 0xd0, 0x5a, 0xd3, 0xf6, 0x5b, 0x48, 0x43, 0x50, 0xa2, + 0xb0, 0xed, 0x04, 0x73, 0xf3, 0x73, 0xe4, 0x17, 0xe6, 0x28, 0x2e, 0x6d, 0x66, 0x6c, 0x6c, 0x3b, + 0x2e, 0x35, 0xb4, 0x95, 0x46, 0x39, 0x29, 0x08, 0x43, 0x1c, 0xc7, 0x21, 0x33, 0x38, 0x88, 0x65, + 0x9a, 0x78, 0x9e, 0x47, 0xbd, 0xde, 0x40, 0x44, 0x18, 0xbf, 0xe7, 0xce, 0xcf, 0x02, 0x27, 0x63, + 0x90, 0xb6, 0x06, 0xf0, 0x06, 0x2c, 0xb8, 0x7a, 0x96, 0xd6, 0x9d, 0x7b, 0x11, 0x11, 0xc2, 0x30, + 0xe4, 0xc4, 0x89, 0xe3, 0x80, 0x10, 0x84, 0x01, 0xed, 0x76, 0x8b, 0x66, 0xab, 0x41, 0x6b, 0xf6, + 0x12, 0xae, 0xd9, 0xc0, 0x4f, 0xbc, 0x07, 0xad, 0x35, 0x4a, 0x45, 0x9e, 0x72, 0x5d, 0x17, 0xc3, + 0x30, 0x48, 0x26, 0x93, 0xf8, 0xbe, 0x4f, 0x18, 0x86, 0xd4, 0x6a, 0x75, 0x0b, 0x70, 0x6e, 0x48, + 0xb7, 0x75, 0x1f, 0xed, 0xf3, 0x17, 0x18, 0x29, 0x9e, 0x25, 0x57, 0x19, 0x47, 0xf7, 0xa5, 0xf1, + 0x7d, 0x1f, 0xc3, 0x50, 0xf1, 0x59, 0x69, 0xfb, 0x6d, 0xda, 0xad, 0x06, 0x23, 0x33, 0x7f, 0xc3, + 0x70, 0x5a, 0xe8, 0x8d, 0x1f, 0xe9, 0x98, 0x36, 0x82, 0x89, 0x48, 0xec, 0xc2, 0x20, 0x08, 0xe2, + 0x31, 0x40, 0xc7, 0x20, 0x63, 0x78, 0x07, 0x8d, 0xcc, 0x6e, 0x32, 0xd6, 0x0b, 0xb4, 0x5e, 0x7f, + 0x9a, 0xd9, 0x0d, 0x0f, 0xd2, 0x1a, 0x1e, 0x8d, 0x77, 0xab, 0x75, 0x48, 0x58, 0xbe, 0x4e, 0x36, + 0xf7, 0x1c, 0x6b, 0xbd, 0x02, 0x65, 0xbd, 0x8d, 0xcc, 0x3d, 0x07, 0x62, 0xd3, 0x6a, 0xad, 0xa3, + 0x2e, 0x61, 0x44, 0x86, 0x31, 0x8c, 0xe8, 0xcc, 0x5a, 0x96, 0x75, 0xc3, 0xde, 0xba, 0x33, 0xb9, + 0xb1, 0xe3, 0x61, 0x72, 0x2f, 0xe6, 0x58, 0x9b, 0x98, 0xa2, 0xbf, 0xf0, 0x17, 0x16, 0x17, 0x5e, + 0xa1, 0x11, 0x24, 0x08, 0x34, 0xa4, 0xac, 0x80, 0x7e, 0x29, 0xd0, 0x97, 0x58, 0x26, 0xbf, 0x3c, + 0x82, 0x7d, 0xff, 0xa3, 0x51, 0x47, 0xe8, 0x64, 0xd2, 0xb5, 0x7b, 0xa2, 0x76, 0x79, 0xa3, 0x1f, + 0xf6, 0xd8, 0x5b, 0x6b, 0x4d, 0x22, 0x91, 0xa0, 0xf9, 0xa1, 0xc3, 0xe4, 0xae, 0x9c, 0x25, 0x75, + 0xed, 0xaf, 0x24, 0x83, 0xcb, 0x8c, 0x0c, 0x26, 0x50, 0xa6, 0x49, 0x79, 0xb1, 0x42, 0x55, 0x06, + 0x59, 0x1c, 0x9e, 0xc0, 0xdd, 0xf9, 0x10, 0x4e, 0x2a, 0xbd, 0x2a, 0xa0, 0xfb, 0xb9, 0xfb, 0xde, + 0x5c, 0xe9, 0x0c, 0x00, 0x09, 0xc7, 0x21, 0xeb, 0xba, 0xe8, 0xe1, 0xcf, 0x10, 0xf8, 0x87, 0xf0, + 0x5b, 0x0d, 0x16, 0xa6, 0xcf, 0x41, 0xd0, 0xc4, 0xd9, 0xf5, 0x61, 0x32, 0xa9, 0x34, 0xb6, 0x6d, + 0x63, 0x18, 0x46, 0xcf, 0xa2, 0xb7, 0x02, 0xae, 0xda, 0x19, 0xb4, 0xd6, 0x08, 0xa0, 0x3b, 0x69, + 0xdb, 0xb6, 0x4d, 0xc2, 0x71, 0xf0, 0xde, 0x3f, 0x11, 0x4b, 0xd1, 0x2d, 0x49, 0xf7, 0xa2, 0xb7, + 0xcb, 0xa8, 0x07, 0xa4, 0x3b, 0x59, 0x69, 0x11, 0xe8, 0x02, 0xa2, 0x35, 0x7f, 0xfa, 0xf1, 0x13, + 0xe4, 0x2e, 0xbe, 0x7e, 0xfb, 0xaf, 0xdf, 0x2a, 0x19, 0xac, 0xc4, 0x1d, 0xf7, 0x7d, 0xc0, 0xee, + 0x91, 0x6e, 0x05, 0xd6, 0x0d, 0x11, 0x60, 0x29, 0x3f, 0xcf, 0xd0, 0xe6, 0x4d, 0x8c, 0x7d, 0xec, + 0xa3, 0x88, 0x52, 0xd1, 0x27, 0xf5, 0xa6, 0x42, 0xdf, 0x2e, 0x2c, 0x2f, 0xe5, 0xc7, 0xa0, 0xf0, + 0x26, 0xe9, 0x56, 0x6a, 0xb6, 0x22, 0xc0, 0xba, 0xed, 0xdb, 0xb8, 0xf7, 0xc0, 0xfe, 0x5e, 0x09, + 0xdf, 0x25, 0xb0, 0x54, 0x2a, 0x85, 0x37, 0x32, 0x0a, 0x23, 0x50, 0x37, 0x44, 0x3a, 0xa0, 0xf8, + 0xd2, 0x9a, 0xdf, 0x3d, 0x36, 0xc9, 0xd5, 0xf3, 0xe7, 0xde, 0xb1, 0xd8, 0x91, 0xdf, 0xfc, 0x81, + 0x81, 0xe1, 0x75, 0x88, 0x08, 0xcf, 0x7c, 0xfd, 0x4b, 0x14, 0xde, 0xce, 0x01, 0x70, 0x68, 0xf2, + 0x07, 0x0c, 0xed, 0xb8, 0xab, 0xbb, 0x46, 0x61, 0x04, 0xea, 0xb6, 0x65, 0xb4, 0xd5, 0x08, 0xdc, + 0x19, 0x4b, 0xf4, 0x25, 0x71, 0x3d, 0xef, 0x1d, 0xf5, 0xe9, 0x36, 0xc1, 0xf0, 0x96, 0x6d, 0x38, + 0xc9, 0x68, 0x8e, 0x93, 0x4a, 0xf5, 0x9a, 0xa1, 0xb0, 0x58, 0x6c, 0x76, 0x83, 0x56, 0x93, 0x50, + 0x6b, 0xcd, 0xa7, 0x8f, 0x7e, 0xa7, 0x47, 0xb6, 0x6e, 0xe9, 0xc2, 0x8e, 0xf4, 0x0f, 0x7e, 0x6d, + 0xb2, 0x47, 0xce, 0xe9, 0xe9, 0xe9, 0xc6, 0x0a, 0x48, 0x2e, 0x5f, 0xfe, 0x77, 0x75, 0xbf, 0xde, + 0x17, 0x83, 0xba, 0x21, 0xb1, 0x59, 0xb4, 0xe6, 0xf9, 0x3f, 0x3f, 0xce, 0xe2, 0xdc, 0x9b, 0xab, + 0xd6, 0xe5, 0x8e, 0xad, 0xbb, 0xf8, 0xf8, 0xc4, 0x61, 0x5e, 0xf8, 0xc9, 0xf7, 0x99, 0x9b, 0xfa, + 0x57, 0xfc, 0xde, 0x4f, 0x0f, 0xaa, 0x15, 0x90, 0x51, 0x2a, 0x95, 0xc2, 0x6a, 0xb5, 0xea, 0x8b, + 0x28, 0x94, 0x92, 0xb8, 0xad, 0x88, 0x08, 0xe9, 0xf5, 0xeb, 0x54, 0xc2, 0xf3, 0xa8, 0x56, 0xab, + 0xe1, 0x52, 0x29, 0xaf, 0x8a, 0xc5, 0x19, 0xe9, 0xfe, 0xab, 0xeb, 0xe4, 0xc4, 0xe0, 0xd2, 0x9c, + 0xae, 0x54, 0x2a, 0x61, 0xa0, 0xb5, 0xc2, 0x30, 0xe2, 0x39, 0xcd, 0xb6, 0xef, 0x77, 0x8a, 0xc0, + 0xe7, 0x80, 0x7b, 0x01, 0x63, 0x95, 0x1f, 0x48, 0x7d, 0x0b, 0x33, 0xe9, 0x77, 0xf9, 0xce, 0x06, + 0x16, 0x80, 0xdf, 0xfe, 0x0f, 0x57, 0x06, 0x6f, 0x93, 0x73, 0x44, 0x23, 0x29, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE pagelayout_recent_xpm[1] = {{ png, sizeof( png ), "pagelayout_recent_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_26/pagelayout_special_view_mode.cpp b/bitmaps_png/cpp_26/pagelayout_special_view_mode.cpp new file mode 100644 index 0000000000..0f1d6ac274 --- /dev/null +++ b/bitmaps_png/cpp_26/pagelayout_special_view_mode.cpp @@ -0,0 +1,98 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x05, 0x09, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x95, 0x96, 0x6b, 0x4c, 0x53, + 0x67, 0x18, 0xc7, 0x49, 0xf6, 0xc1, 0x98, 0x25, 0x7c, 0x99, 0x06, 0x63, 0xa6, 0x32, 0xaf, 0x78, + 0xd7, 0x29, 0x20, 0x68, 0x70, 0x6a, 0x82, 0xc4, 0x2c, 0x64, 0x64, 0x60, 0x74, 0xc6, 0x19, 0x93, + 0x21, 0x19, 0x6c, 0x66, 0xa0, 0x20, 0xa0, 0xc1, 0x4d, 0xae, 0x4e, 0x88, 0x20, 0xe0, 0x54, 0xc8, + 0x3a, 0x26, 0x1a, 0x33, 0x23, 0x8c, 0x03, 0x2d, 0xbb, 0x18, 0xb6, 0x21, 0x1d, 0x24, 0x6b, 0xc7, + 0xe4, 0xb6, 0x0f, 0x8a, 0x38, 0x68, 0xcb, 0xbd, 0x14, 0x68, 0x29, 0x70, 0xe8, 0xf9, 0xef, 0x79, + 0xdf, 0xd0, 0x03, 0xa7, 0x58, 0xc6, 0x4e, 0xf2, 0x4b, 0x0f, 0x70, 0xfa, 0xfe, 0xce, 0x73, 0x79, + 0x9f, 0x17, 0x0f, 0x0f, 0x0f, 0x8f, 0x10, 0x22, 0x96, 0x38, 0x37, 0xfd, 0xf9, 0x7f, 0x88, 0x9b, + 0xfe, 0xde, 0x71, 0x62, 0x29, 0x00, 0x0f, 0x77, 0xb0, 0xeb, 0xb3, 0xd2, 0xd2, 0xd2, 0x76, 0xcb, + 0xf0, 0xb0, 0x34, 0x32, 0x3a, 0xea, 0xb0, 0x5a, 0xad, 0x92, 0xd5, 0x66, 0x93, 0xc6, 0xc6, 0xc6, + 0xa4, 0xf1, 0xf1, 0x71, 0x49, 0xa7, 0xd3, 0x49, 0x17, 0x63, 0x62, 0x10, 0x1b, 0x12, 0x82, 0x73, + 0xc4, 0xd9, 0xd3, 0xa7, 0x51, 0x59, 0x59, 0x29, 0x89, 0xa2, 0x28, 0x4d, 0x4d, 0x4d, 0x49, 0x76, + 0xbb, 0x5d, 0x32, 0x98, 0x4c, 0x62, 0xf8, 0xd1, 0x63, 0x99, 0xb4, 0x96, 0xe7, 0x7c, 0xa2, 0x38, + 0xb5, 0x46, 0x63, 0x1a, 0x19, 0x19, 0xc1, 0xa8, 0xd5, 0x0a, 0x9b, 0xcd, 0x86, 0x31, 0xbb, 0x1d, + 0x24, 0x41, 0x7a, 0x62, 0x22, 0x72, 0x03, 0x03, 0x31, 0xb6, 0x69, 0x13, 0x30, 0x8d, 0x44, 0x94, + 0xed, 0xde, 0x8d, 0xf8, 0xa8, 0x28, 0x38, 0x1c, 0x0e, 0xfe, 0x5c, 0x77, 0x77, 0x37, 0xf4, 0x8d, + 0x8d, 0xd2, 0xdb, 0xfe, 0x01, 0x67, 0x68, 0xbd, 0x45, 0x6e, 0x23, 0xd2, 0x54, 0x57, 0x1b, 0x5d, + 0x45, 0x79, 0x19, 0x19, 0xf8, 0xd5, 0xdf, 0x5f, 0x16, 0xb8, 0xa2, 0xdd, 0xb7, 0x0f, 0xf9, 0x39, + 0x39, 0x5c, 0x64, 0x34, 0x1a, 0xd1, 0xd8, 0xf8, 0x17, 0x7e, 0xaa, 0xa9, 0x71, 0xbc, 0xe5, 0xb3, + 0xf9, 0x5d, 0x5a, 0xf3, 0xb5, 0x05, 0x89, 0x3a, 0x5e, 0xbe, 0x44, 0xfa, 0xfe, 0xfd, 0x6e, 0x25, + 0x4e, 0x92, 0x82, 0x82, 0x30, 0x30, 0x30, 0xc0, 0x23, 0xaa, 0x7d, 0xf2, 0x04, 0xc3, 0xc3, 0x16, + 0x7c, 0x73, 0xff, 0xc1, 0xe4, 0x1b, 0x5e, 0x6f, 0xfa, 0xbd, 0x5a, 0xa4, 0xd1, 0x18, 0x87, 0x67, + 0x89, 0xd2, 0x2e, 0x5d, 0xc2, 0xc0, 0xd6, 0xad, 0x8a, 0x45, 0x9f, 0xaf, 0x5d, 0x8b, 0x3d, 0x8b, + 0x17, 0xa3, 0x65, 0xcd, 0x1a, 0xd8, 0x7c, 0x7c, 0x50, 0xb5, 0x72, 0x25, 0x9a, 0x7d, 0x7d, 0xa1, + 0x52, 0xa9, 0x30, 0x38, 0x38, 0x88, 0xfa, 0xfa, 0x06, 0xf4, 0xf4, 0xf4, 0xf0, 0xfb, 0xb4, 0xdc, + 0x1b, 0x23, 0x8b, 0x3c, 0x3d, 0xd7, 0xb9, 0x17, 0x8d, 0x8e, 0x72, 0x51, 0xc2, 0x91, 0x23, 0x73, + 0xde, 0x9e, 0x2d, 0x4c, 0xcf, 0xe2, 0xc6, 0xb2, 0x65, 0x78, 0xb1, 0x6e, 0x1d, 0x92, 0x97, 0x2c, + 0xe1, 0xbf, 0x8f, 0x8f, 0x8c, 0xa4, 0x48, 0x86, 0xd1, 0xd6, 0xd6, 0x86, 0x96, 0xd6, 0x56, 0x5e, + 0x37, 0x83, 0xc1, 0x80, 0x4b, 0xd7, 0xf2, 0xdb, 0xe9, 0x79, 0x2f, 0xb7, 0xa2, 0xa6, 0xa6, 0x26, + 0x14, 0xed, 0xd9, 0x33, 0x47, 0x34, 0xb9, 0x71, 0x23, 0xae, 0x7a, 0x79, 0xa1, 0x6f, 0xc3, 0x06, + 0x65, 0xfa, 0x42, 0x43, 0x41, 0x1d, 0xca, 0xa3, 0xa9, 0xad, 0x7d, 0xc2, 0x6b, 0x65, 0x32, 0x99, + 0xd0, 0xda, 0xd6, 0x8a, 0xb4, 0x82, 0xa2, 0x5f, 0x9c, 0x9d, 0x38, 0x23, 0xa2, 0xb7, 0xa2, 0xf6, + 0x46, 0x5e, 0x6e, 0x2e, 0x3a, 0x5c, 0xd2, 0x36, 0x1f, 0x19, 0x7b, 0xf7, 0xf2, 0x74, 0xb1, 0x1a, + 0xb3, 0xda, 0x36, 0x34, 0x34, 0xa0, 0x4a, 0xad, 0x41, 0x5d, 0x9d, 0x16, 0x75, 0x74, 0x9f, 0x77, + 0xa7, 0xe4, 0x36, 0x39, 0x5e, 0x9f, 0x23, 0x4a, 0xa0, 0xb6, 0x5d, 0xa8, 0x84, 0x71, 0x8f, 0x5e, + 0xaa, 0xb9, 0xb9, 0x19, 0x93, 0x93, 0x93, 0x3c, 0x85, 0x2c, 0x6d, 0xad, 0x94, 0x42, 0x9d, 0x4e, + 0x0f, 0xbd, 0xfe, 0x4f, 0xd4, 0xfd, 0xde, 0x60, 0x21, 0x87, 0xb7, 0x2c, 0xb2, 0x30, 0x11, 0xbd, + 0x55, 0x62, 0x44, 0x84, 0x62, 0x21, 0xc3, 0xfa, 0xf5, 0x73, 0xd2, 0x35, 0x9b, 0x7a, 0x6a, 0x0e, + 0xa1, 0xbc, 0x9c, 0xd7, 0x86, 0xc9, 0x68, 0xc3, 0x63, 0x68, 0x68, 0x08, 0xfd, 0xfd, 0xfd, 0xe8, + 0xed, 0xed, 0x45, 0x47, 0xc7, 0x4b, 0x1b, 0x39, 0x7c, 0x14, 0x22, 0x56, 0xa7, 0x0b, 0x07, 0x0e, + 0xc8, 0x8b, 0xa4, 0x2c, 0x5d, 0x8a, 0xf2, 0x15, 0x2b, 0xa0, 0x5f, 0xbd, 0xda, 0xad, 0xc8, 0x4c, + 0x2f, 0x71, 0x2d, 0x29, 0x09, 0xec, 0x92, 0x24, 0x09, 0x34, 0x2d, 0xb8, 0x90, 0x26, 0x06, 0x87, + 0x6a, 0xc7, 0x44, 0x1b, 0x64, 0xd1, 0x90, 0xc5, 0x82, 0x6e, 0x2a, 0x68, 0x3a, 0xb5, 0xac, 0x73, + 0x91, 0xe2, 0xe5, 0xcb, 0x11, 0xee, 0xe9, 0xc9, 0x17, 0x9b, 0x77, 0x3f, 0x85, 0x87, 0x73, 0x89, + 0xf3, 0x62, 0xf7, 0x2c, 0x42, 0x06, 0xd5, 0x6f, 0x46, 0xa4, 0x9e, 0x16, 0xb5, 0x52, 0x8b, 0xde, + 0xda, 0xb9, 0x53, 0x31, 0x6e, 0x74, 0xf3, 0x44, 0x23, 0x8b, 0xa8, 0x21, 0x68, 0xf6, 0x71, 0xc1, + 0x6c, 0x21, 0xbb, 0xcc, 0x66, 0xb3, 0x52, 0x64, 0xa6, 0xbc, 0xaa, 0xd5, 0x6a, 0x68, 0x16, 0xd8, + 0x04, 0x0e, 0xf6, 0x39, 0xdd, 0x9d, 0x15, 0x3b, 0x76, 0x40, 0xab, 0xd5, 0xca, 0xa2, 0xd9, 0x28, + 0x23, 0x52, 0xab, 0xb9, 0x28, 0x3b, 0x25, 0x05, 0x5d, 0xb4, 0x19, 0x17, 0x22, 0xaa, 0xf6, 0xf6, + 0x46, 0x6f, 0x70, 0x30, 0xbf, 0x67, 0x1b, 0xb8, 0x38, 0x3f, 0x5f, 0x4e, 0xd7, 0xbc, 0x22, 0x56, + 0x9f, 0xa8, 0x83, 0x07, 0x15, 0x8b, 0xb1, 0xd4, 0xb5, 0x6c, 0xdf, 0x8e, 0xec, 0xcd, 0x9b, 0x61, + 0xdd, 0xb5, 0x4b, 0xf1, 0xb7, 0x9a, 0x55, 0xab, 0xa0, 0xa5, 0xc6, 0x99, 0xda, 0xb6, 0x0d, 0x3f, + 0xb3, 0xa8, 0x1e, 0x3d, 0x92, 0x45, 0xb3, 0x51, 0x88, 0xaa, 0x48, 0x74, 0xf2, 0xf8, 0x71, 0x5c, + 0xf7, 0xf3, 0x83, 0x69, 0xcb, 0x16, 0xb4, 0xd3, 0xd1, 0x90, 0x4f, 0x63, 0x28, 0x32, 0x2c, 0x0c, + 0x9f, 0x1f, 0x3b, 0x81, 0x8b, 0x87, 0xe8, 0x2c, 0x0a, 0x08, 0xc2, 0x79, 0xbf, 0xbd, 0x48, 0xf2, + 0x0d, 0x44, 0x1c, 0xc1, 0x7e, 0xbe, 0x10, 0x74, 0x08, 0xe7, 0x02, 0xf7, 0x23, 0x9e, 0x3e, 0x33, + 0xdf, 0x8b, 0x40, 0x56, 0xd8, 0xd1, 0x39, 0x3c, 0x48, 0xcd, 0x10, 0x67, 0x44, 0x55, 0x55, 0xc6, + 0xde, 0xbe, 0x3e, 0x08, 0x82, 0x80, 0xf4, 0xf4, 0x74, 0x5c, 0xa7, 0xe9, 0xf0, 0x87, 0x4e, 0xc7, + 0x47, 0xd2, 0xcd, 0xa8, 0x4f, 0x50, 0x74, 0x36, 0x0e, 0x75, 0x0f, 0xcb, 0xf0, 0xf8, 0xee, 0x7d, + 0x3c, 0x2a, 0xf8, 0x8a, 0xdf, 0xd7, 0x97, 0x55, 0xa0, 0xa1, 0x5c, 0xf8, 0x4f, 0xf4, 0x8f, 0x6b, + 0xec, 0xb2, 0x48, 0x20, 0x51, 0x3f, 0x8d, 0x7b, 0x36, 0x4a, 0x58, 0xad, 0x58, 0x07, 0x3a, 0x37, + 0x30, 0x13, 0x55, 0xe6, 0xdf, 0x84, 0x8d, 0xe6, 0x19, 0x3b, 0xa7, 0xec, 0x74, 0xfe, 0x8c, 0x4f, + 0x4c, 0x60, 0x82, 0x60, 0xfb, 0x85, 0xc1, 0x3a, 0xce, 0x1d, 0xb4, 0x71, 0x67, 0x52, 0x27, 0x08, + 0x55, 0xc6, 0x3e, 0xda, 0xc9, 0x03, 0x24, 0x1a, 0x34, 0x9b, 0xb9, 0xcc, 0x42, 0x32, 0x36, 0x52, + 0x0a, 0x49, 0x24, 0x90, 0x88, 0x8e, 0x77, 0x14, 0x27, 0x7e, 0x8a, 0xe4, 0xc3, 0x01, 0x73, 0xe8, + 0x33, 0x74, 0xca, 0xc2, 0x3b, 0xd1, 0x1f, 0x22, 0x2b, 0xf4, 0x1d, 0xce, 0xdf, 0xda, 0xdf, 0x94, + 0xa2, 0x0a, 0x41, 0xe0, 0xa9, 0x63, 0x51, 0x39, 0x65, 0x6c, 0x8c, 0xb0, 0xa8, 0x0a, 0xcf, 0xc4, + 0x40, 0xb8, 0x51, 0xc8, 0xcf, 0xaa, 0xbb, 0x57, 0x12, 0x91, 0x1a, 0x1e, 0xac, 0x20, 0x2d, 0xe2, + 0x30, 0xfa, 0x8d, 0x5d, 0x72, 0x74, 0xdf, 0x5f, 0xbb, 0x82, 0x6f, 0xe3, 0x63, 0x38, 0x1d, 0x4f, + 0xf5, 0x4a, 0x91, 0x4a, 0x55, 0xf2, 0xa2, 0x87, 0xe6, 0x12, 0x8b, 0xca, 0x35, 0x85, 0x4c, 0x54, + 0x41, 0x22, 0x36, 0x70, 0x99, 0x8c, 0x45, 0xc6, 0x8f, 0x7b, 0x4a, 0xa5, 0x73, 0xcc, 0x8c, 0xcf, + 0x4a, 0xe7, 0x84, 0x4b, 0x5a, 0x9f, 0x3d, 0x7b, 0x36, 0xe8, 0x14, 0xc5, 0x26, 0x27, 0x27, 0x37, + 0xb3, 0xf6, 0x66, 0x51, 0xb9, 0xa6, 0x90, 0x8b, 0xf2, 0x0a, 0xf8, 0x1c, 0x7c, 0x78, 0x2f, 0x01, + 0xb7, 0xae, 0xbf, 0xcf, 0xb9, 0x9d, 0x1b, 0xae, 0xe0, 0xc7, 0xca, 0x6c, 0x2e, 0x54, 0x53, 0xd4, + 0xaa, 0x0f, 0x42, 0x65, 0x8a, 0x3e, 0x3e, 0x35, 0xe4, 0x14, 0x9d, 0x8f, 0x8e, 0x8e, 0x7e, 0xfa, + 0xbc, 0xbd, 0x5d, 0x6c, 0x7f, 0xd1, 0x21, 0xd2, 0x99, 0x22, 0xfe, 0xd3, 0xd9, 0x29, 0x76, 0x76, + 0x75, 0x89, 0x5d, 0x06, 0x83, 0x58, 0x7a, 0x39, 0xd5, 0xf1, 0xc3, 0xd7, 0x25, 0x0e, 0x53, 0x77, + 0xb7, 0x58, 0x5c, 0x78, 0xca, 0x91, 0x99, 0x12, 0x20, 0xc9, 0x5c, 0x0e, 0x90, 0xb2, 0x38, 0x81, + 0xd2, 0x77, 0xa5, 0x09, 0x0e, 0xfa, 0xff, 0x41, 0x14, 0xbe, 0xb8, 0xe0, 0x50, 0x9d, 0x0c, 0x93, + 0x9c, 0x14, 0x7c, 0x74, 0xa2, 0xdf, 0x39, 0xbd, 0x8f, 0x11, 0x57, 0x89, 0x6c, 0xe2, 0x4b, 0x17, + 0xae, 0xba, 0x21, 0xeb, 0x15, 0x64, 0xbe, 0x82, 0x1c, 0x22, 0x89, 0x58, 0xf9, 0x2f, 0xfa, 0x67, + 0xd2, 0x81, 0xc6, 0xe4, 0x27, 0x77, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, + 0x60, 0x82, +}; + +const BITMAP_OPAQUE pagelayout_special_view_mode_xpm[1] = {{ png, sizeof( png ), "pagelayout_special_view_mode_xpm" }}; + +//EOF diff --git a/bitmaps_png/cpp_48/icon_gerbview.cpp b/bitmaps_png/cpp_48/icon_gerbview.cpp index f4fb4ffa1b..a286c88e44 100644 --- a/bitmaps_png/cpp_48/icon_gerbview.cpp +++ b/bitmaps_png/cpp_48/icon_gerbview.cpp @@ -8,320 +8,320 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, - 0x87, 0x00, 0x00, 0x13, 0x83, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xdd, 0x5a, 0x09, 0x78, 0x5b, - 0xe5, 0x95, 0x15, 0x5b, 0x18, 0x42, 0xf9, 0x12, 0xca, 0xb4, 0x53, 0x92, 0xf6, 0xa3, 0x30, 0xe9, - 0x74, 0x01, 0x66, 0x4a, 0x42, 0x58, 0xcb, 0xd0, 0x00, 0x01, 0x12, 0x48, 0x3e, 0x48, 0x87, 0xad, - 0xd0, 0x0e, 0x6b, 0xd8, 0x97, 0x00, 0x49, 0x48, 0x08, 0xd9, 0x57, 0x92, 0x38, 0x31, 0x59, 0xec, - 0x90, 0x85, 0x24, 0x76, 0xbc, 0xc6, 0xf1, 0xbe, 0xc4, 0x96, 0x77, 0xcb, 0x96, 0x37, 0xc9, 0xbb, - 0x56, 0x4b, 0xb6, 0x24, 0x5b, 0x96, 0x2c, 0x5b, 0xd6, 0xbe, 0xbc, 0xf7, 0xfe, 0x33, 0xf7, 0xd7, - 0x34, 0x69, 0x42, 0xec, 0x94, 0xce, 0xd0, 0x65, 0x46, 0xdf, 0x77, 0xad, 0xf7, 0xac, 0x27, 0xe9, - 0x9e, 0xff, 0xbf, 0xf7, 0x9c, 0x73, 0x25, 0xc9, 0x00, 0xc8, 0xfe, 0x2f, 0x87, 0xec, 0xff, 0x35, - 0x80, 0x59, 0xb3, 0x66, 0x5d, 0xb1, 0x70, 0xe1, 0xc2, 0xa3, 0x4f, 0x3c, 0xf1, 0x44, 0xf9, 0xa3, - 0x8f, 0x3e, 0xba, 0x6a, 0xde, 0xbc, 0x79, 0xf7, 0x3f, 0xf5, 0xd4, 0x53, 0x57, 0x8d, 0x77, 0x2d, - 0x3d, 0xf6, 0x43, 0xba, 0x36, 0x77, 0xc1, 0x82, 0x05, 0x47, 0x1e, 0x7a, 0xe8, 0xa1, 0x9b, 0xfe, - 0x2e, 0x00, 0x3c, 0xfc, 0xf0, 0xc3, 0x8b, 0x57, 0xad, 0x5a, 0x65, 0xd7, 0xeb, 0xf5, 0xfd, 0xd9, - 0xd9, 0xd9, 0x96, 0x25, 0x4b, 0x96, 0x38, 0x29, 0xd1, 0x08, 0x25, 0xaa, 0x9e, 0x3f, 0x7f, 0xfe, - 0x4e, 0x7a, 0x7c, 0xc1, 0x23, 0x8f, 0x3c, 0xf2, 0x5d, 0x7e, 0x2d, 0x25, 0x2e, 0x4f, 0x4f, 0x4f, - 0xb7, 0x14, 0x15, 0x15, 0x59, 0x08, 0x70, 0x90, 0xce, 0x0f, 0xd0, 0x35, 0x3f, 0xf8, 0x9b, 0x02, - 0xa0, 0x44, 0xb3, 0xd4, 0x6a, 0x75, 0x3f, 0x1d, 0x77, 0x53, 0xb4, 0x53, 0x58, 0x44, 0x51, 0x74, - 0x0c, 0x0c, 0x0c, 0x58, 0xca, 0xca, 0xca, 0x2c, 0x6b, 0xd7, 0xae, 0x1d, 0xa4, 0x44, 0x23, 0x8f, - 0x3f, 0xfe, 0xb8, 0x6d, 0xd1, 0xa2, 0x45, 0x91, 0x92, 0x92, 0x92, 0x31, 0x9b, 0xcd, 0x66, 0x88, - 0x44, 0x22, 0x83, 0x19, 0x19, 0x19, 0xd6, 0x27, 0x17, 0x2d, 0x0a, 0x6c, 0xdb, 0xb5, 0x3b, 0xbb, - 0xae, 0x4b, 0x7f, 0x5c, 0xa9, 0x31, 0x6d, 0x6f, 0xd0, 0x9a, 0xdf, 0x53, 0x75, 0x1b, 0x16, 0xaa, - 0x3a, 0xb5, 0xb7, 0xd7, 0x77, 0x77, 0x7f, 0xf7, 0x2f, 0x0e, 0xe0, 0xb1, 0xc7, 0x1e, 0x1b, 0xf2, - 0x7a, 0xbd, 0x56, 0x3a, 0xce, 0xa7, 0x38, 0xe6, 0xf3, 0xf9, 0x92, 0xe9, 0x3e, 0x9d, 0xa2, 0x8c, - 0xa2, 0x95, 0xc2, 0xc4, 0x18, 0x73, 0x9a, 0x4c, 0xa6, 0x48, 0x43, 0x43, 0x83, 0x78, 0xe0, 0xc0, - 0x81, 0xe8, 0x2b, 0xaf, 0xbc, 0x22, 0xec, 0xda, 0x97, 0x28, 0x94, 0x2b, 0x5b, 0xa5, 0x36, 0xad, - 0x0e, 0x6d, 0x06, 0x13, 0x6a, 0xbb, 0xcd, 0xa8, 0xd3, 0x58, 0x04, 0xa5, 0xc6, 0x1c, 0x6d, 0xd6, - 0x18, 0x85, 0x16, 0x8d, 0x5e, 0x6c, 0x6a, 0xef, 0x16, 0xcb, 0x5b, 0xb5, 0x45, 0xd5, 0x8d, 0xed, - 0x37, 0xfe, 0x45, 0x00, 0xf0, 0x9a, 0x7e, 0xf2, 0xc9, 0x27, 0x43, 0x74, 0xec, 0xa0, 0x48, 0x1e, - 0x1d, 0x1d, 0x3d, 0x31, 0x79, 0xf2, 0xe4, 0xc8, 0xb4, 0x69, 0xd3, 0x3c, 0x04, 0x4c, 0xb7, 0x6d, - 0xdb, 0xb6, 0x1a, 0x8d, 0x46, 0x93, 0x69, 0xb7, 0xdb, 0x2b, 0xba, 0xbb, 0xbb, 0xa3, 0x74, 0x4d, - 0x34, 0x10, 0x0c, 0x05, 0xda, 0x74, 0x46, 0xa8, 0x8d, 0xfd, 0xa8, 0xd5, 0xd9, 0x51, 0xd4, 0xe5, - 0xc2, 0x81, 0x06, 0x27, 0xb6, 0x9f, 0x36, 0x62, 0x5b, 0x81, 0x96, 0xad, 0x3d, 0xd5, 0x21, 0x6d, - 0x2c, 0xb1, 0x38, 0xe3, 0x14, 0x5e, 0x7d, 0x86, 0x6a, 0x78, 0xb8, 0xba, 0xa3, 0x37, 0x5c, 0xd7, - 0xa4, 0x62, 0xa7, 0x95, 0x1d, 0xd5, 0x65, 0xd5, 0x0d, 0x3f, 0xff, 0x56, 0x01, 0x50, 0x7d, 0x3f, - 0xbb, 0x75, 0xeb, 0x56, 0x1b, 0x1d, 0x1b, 0xf8, 0xea, 0xf3, 0xa0, 0xd2, 0x38, 0x9e, 0x9f, 0x9f, - 0x5f, 0xf8, 0xde, 0x7b, 0xef, 0xb5, 0xdc, 0x79, 0xe7, 0x9d, 0xd6, 0xab, 0xaf, 0xbe, 0x3a, 0x32, - 0x7d, 0xfa, 0x74, 0xa9, 0xa6, 0xa6, 0x26, 0x38, 0xe0, 0x1c, 0x09, 0xa8, 0x7b, 0x74, 0x68, 0x30, - 0xda, 0x59, 0x52, 0x47, 0x88, 0x25, 0xa9, 0x3d, 0xc8, 0xd5, 0x85, 0xa5, 0xb2, 0x3e, 0x26, 0xc9, - 0xfb, 0x24, 0xa9, 0x48, 0x1f, 0x60, 0x69, 0xcd, 0x83, 0x6c, 0x47, 0x76, 0x33, 0xfb, 0x60, 0x6f, - 0x3e, 0x96, 0x1c, 0x28, 0xf1, 0xae, 0xc9, 0xee, 0xee, 0x4f, 0x6d, 0x1e, 0x1c, 0xad, 0x68, 0xd5, - 0x85, 0xca, 0xeb, 0x1a, 0xa5, 0xc2, 0xca, 0xe6, 0xd7, 0xbf, 0x35, 0x00, 0xd4, 0x80, 0x09, 0x55, - 0x55, 0x55, 0x16, 0x3a, 0x6e, 0xe2, 0xc9, 0x53, 0x4d, 0x17, 0x5f, 0x7b, 0xed, 0xb5, 0x81, 0xd9, - 0xb3, 0x67, 0x5b, 0x97, 0x2e, 0x5d, 0xda, 0x48, 0xf5, 0x9e, 0x6f, 0x30, 0x18, 0xaa, 0x3f, 0xf8, - 0xe0, 0x03, 0x61, 0xef, 0xa1, 0xa3, 0x4c, 0xd5, 0xa3, 0x45, 0xb9, 0xd6, 0x29, 0xed, 0xa9, 0x73, - 0x48, 0xc7, 0x9a, 0x9c, 0x91, 0x42, 0xa3, 0x10, 0x48, 0x6e, 0x71, 0x0a, 0x5f, 0x56, 0xf7, 0xb1, - 0x8c, 0x0e, 0x4f, 0xa4, 0xd4, 0xcc, 0x42, 0x55, 0x36, 0x08, 0x8a, 0x41, 0xb0, 0x1a, 0xab, 0xc4, - 0x4e, 0xb5, 0xbb, 0xd9, 0xe1, 0x6a, 0x93, 0xb4, 0x29, 0x43, 0x19, 0x5e, 0x95, 0x54, 0x27, 0x65, - 0xd5, 0x6b, 0xa4, 0x92, 0xf2, 0x5a, 0xb6, 0xe1, 0xf3, 0x7d, 0x5f, 0x3c, 0xf0, 0xc0, 0x03, 0xd3, - 0xbf, 0x31, 0x00, 0xa2, 0xc5, 0xcb, 0x88, 0x49, 0x5e, 0xa2, 0xd8, 0x7a, 0x26, 0xe6, 0xce, 0x9d, - 0xbb, 0x95, 0x68, 0xd3, 0xb5, 0x73, 0xe7, 0x4e, 0x4f, 0x5c, 0x5c, 0x9c, 0x69, 0xcb, 0x96, 0x2d, - 0x9d, 0x54, 0x36, 0xae, 0x9f, 0xfc, 0xe4, 0x27, 0x98, 0x31, 0x63, 0x06, 0x7e, 0xfa, 0xd3, 0x9f, - 0xb2, 0x9f, 0xfd, 0xec, 0x67, 0xd2, 0xcc, 0x99, 0x33, 0x59, 0x4a, 0xc6, 0x49, 0x51, 0xa9, 0xee, - 0xc4, 0x49, 0xd5, 0x00, 0xdb, 0x53, 0x37, 0x2c, 0xae, 0x4f, 0x53, 0x60, 0xe5, 0x57, 0x72, 0x6c, - 0xcb, 0x51, 0xb3, 0x3d, 0xa5, 0xda, 0xe8, 0xda, 0x13, 0x35, 0xd2, 0xe6, 0x4c, 0x25, 0xdb, 0x9d, - 0xa7, 0x66, 0x07, 0xcb, 0xf5, 0x91, 0xc3, 0x15, 0x86, 0x48, 0x52, 0x8d, 0x41, 0x3c, 0x52, 0xa1, - 0x65, 0xfb, 0x4a, 0xba, 0xd8, 0xe1, 0x4a, 0x03, 0xca, 0x7a, 0xc3, 0x12, 0x95, 0x54, 0xb8, 0xb8, - 0x59, 0x2f, 0xe5, 0x16, 0x57, 0x62, 0xf1, 0x5b, 0xef, 0x86, 0x29, 0x87, 0x81, 0x39, 0x73, 0xe6, - 0x3c, 0xf6, 0x27, 0x01, 0x50, 0xa2, 0x2f, 0x2e, 0x5e, 0xbc, 0xd8, 0x79, 0xfa, 0xf4, 0x69, 0x6b, - 0x69, 0x69, 0xa9, 0x95, 0xdf, 0x53, 0x0c, 0x9c, 0x3a, 0x75, 0x8a, 0xd1, 0x0e, 0x88, 0x15, 0x15, - 0x15, 0xc1, 0xf2, 0xf2, 0xf2, 0x00, 0x51, 0xa4, 0x74, 0xe2, 0xc4, 0x09, 0x9c, 0x1b, 0x29, 0xa9, - 0xa9, 0xa8, 0x6b, 0x56, 0xa1, 0xaa, 0xab, 0x0f, 0x7b, 0x1b, 0xc6, 0x70, 0xb4, 0xde, 0x86, 0x13, - 0x8d, 0x03, 0x38, 0x5c, 0xdb, 0x8f, 0xa3, 0x75, 0x16, 0x24, 0x2b, 0x07, 0x70, 0xa2, 0xc1, 0x8a, - 0xa4, 0x5a, 0x23, 0x52, 0xeb, 0xcd, 0x38, 0xd9, 0x64, 0x61, 0xa7, 0x9a, 0xad, 0x52, 0x56, 0x93, - 0x45, 0xca, 0x57, 0x0f, 0x48, 0x69, 0x4a, 0x0b, 0xfb, 0x3c, 0xa3, 0x0e, 0x5f, 0x55, 0x52, 0xe2, - 0xed, 0xc3, 0x52, 0xa6, 0xca, 0x11, 0x2d, 0x69, 0xd4, 0xb0, 0x53, 0xf9, 0x72, 0xa6, 0x52, 0xb5, - 0x59, 0x69, 0x31, 0xbb, 0xfe, 0x24, 0x00, 0xbe, 0xe2, 0x3c, 0x69, 0x3a, 0xe9, 0xa3, 0xd0, 0xf0, - 0x08, 0x06, 0x83, 0x96, 0xe1, 0xe1, 0x61, 0x91, 0x37, 0x26, 0xc5, 0x18, 0x31, 0x8d, 0x47, 0xab, - 0xd5, 0x82, 0x9a, 0xf6, 0xbc, 0xa8, 0x56, 0x28, 0x51, 0xdb, 0xac, 0x46, 0x6e, 0x8f, 0x17, 0x29, - 0x9d, 0x41, 0x56, 0xa0, 0x0d, 0xa0, 0xdc, 0x1c, 0x45, 0xa1, 0x3e, 0x8c, 0xdc, 0x2e, 0x0f, 0x2a, - 0x4c, 0x21, 0x54, 0xf7, 0x85, 0x51, 0x61, 0xf0, 0xb1, 0x6a, 0x93, 0x1f, 0x4d, 0x83, 0x22, 0x53, - 0x39, 0x20, 0x29, 0x6d, 0x02, 0x6b, 0x77, 0x8a, 0xac, 0xca, 0xe8, 0x65, 0xa7, 0x9a, 0xfa, 0x58, - 0x62, 0x91, 0x5a, 0xac, 0x1f, 0x64, 0x62, 0x45, 0x6f, 0x50, 0x48, 0x56, 0x98, 0x59, 0xbe, 0xbc, - 0x1e, 0xc5, 0x15, 0x0d, 0x01, 0xca, 0xad, 0xf2, 0xcf, 0x01, 0xc0, 0x93, 0xef, 0xe8, 0xeb, 0xeb, - 0x33, 0xd2, 0x8a, 0x7b, 0xa9, 0x31, 0xc5, 0xa6, 0xa6, 0xa6, 0x28, 0x45, 0xa0, 0xb6, 0xb6, 0x36, - 0x4c, 0x3b, 0x81, 0x8e, 0x8e, 0x8e, 0xb3, 0x41, 0x3a, 0x00, 0x6a, 0x3c, 0x54, 0xb4, 0x9b, 0x71, - 0xa2, 0x47, 0x62, 0x47, 0x95, 0x76, 0x14, 0xeb, 0x02, 0xa8, 0x30, 0x47, 0x70, 0xda, 0x10, 0x46, - 0x89, 0x76, 0x0c, 0xe5, 0x7a, 0x2f, 0x14, 0x96, 0x30, 0xaa, 0x0c, 0x1e, 0x56, 0xda, 0xed, 0x84, - 0xd2, 0x1a, 0x82, 0xda, 0x09, 0xb1, 0x65, 0x50, 0x94, 0xda, 0x06, 0x23, 0x28, 0xa3, 0xff, 0xe5, - 0xb5, 0x5a, 0xa4, 0x7d, 0x39, 0x8a, 0x70, 0x93, 0x1d, 0x9e, 0xe6, 0x21, 0x84, 0xeb, 0xad, 0x82, - 0x50, 0xa8, 0xe8, 0xc2, 0xf1, 0xb4, 0x3c, 0x3c, 0xf8, 0xe0, 0x83, 0x4d, 0x14, 0xff, 0x74, 0x51, - 0x00, 0xbc, 0xde, 0xcf, 0x05, 0xd0, 0xda, 0xda, 0x6a, 0x49, 0x4d, 0x4d, 0x15, 0xa8, 0x84, 0x24, - 0x52, 0x5f, 0x7e, 0x1f, 0x49, 0x49, 0x49, 0x11, 0xb7, 0x6f, 0xdf, 0x8e, 0xbc, 0xbc, 0xbc, 0x58, - 0xf2, 0xed, 0xed, 0xed, 0xd8, 0x19, 0xb7, 0x0b, 0x65, 0x55, 0x0a, 0x14, 0x76, 0x39, 0x91, 0x63, - 0x90, 0x58, 0x7c, 0x51, 0x37, 0x0e, 0x55, 0x1a, 0x51, 0xd3, 0x1f, 0x41, 0xa5, 0x39, 0x44, 0xff, - 0x77, 0xa1, 0xd2, 0xe8, 0x43, 0x7d, 0x7f, 0x08, 0xa9, 0x35, 0x3d, 0x28, 0x69, 0x1f, 0x40, 0x8d, - 0x61, 0x2c, 0x06, 0xa0, 0xcd, 0xc9, 0xc4, 0x56, 0x9b, 0x1f, 0xd5, 0xba, 0x11, 0x56, 0xa4, 0xb6, - 0x48, 0x5b, 0x8f, 0x15, 0xb0, 0x46, 0x6b, 0x78, 0xac, 0xd5, 0x81, 0xb1, 0x96, 0x21, 0xf8, 0xca, - 0x34, 0x2e, 0xea, 0xad, 0x7c, 0xec, 0xda, 0xbd, 0xd7, 0x4d, 0x0b, 0xec, 0xa7, 0x1c, 0x37, 0x91, - 0x3d, 0x99, 0xf2, 0x8d, 0x00, 0x48, 0x92, 0xd4, 0x59, 0x57, 0x57, 0xc7, 0xa8, 0x64, 0xc4, 0x9e, - 0x9e, 0x9e, 0x00, 0x95, 0x8a, 0xaf, 0xb9, 0xb9, 0x59, 0x54, 0x28, 0x14, 0x38, 0x17, 0x44, 0x61, - 0x51, 0x09, 0x8a, 0xe5, 0xd5, 0xc8, 0x69, 0xb3, 0x23, 0xbb, 0x27, 0x84, 0x74, 0x95, 0x0b, 0x09, - 0x65, 0x1a, 0xa4, 0x29, 0x8c, 0xa8, 0xb7, 0x84, 0x90, 0xdf, 0x36, 0x84, 0x1a, 0x53, 0x20, 0x06, - 0xe0, 0x58, 0x59, 0x3b, 0xcb, 0x69, 0x34, 0x41, 0x61, 0xf6, 0xb1, 0x8e, 0x61, 0x88, 0x9a, 0x51, - 0x88, 0x8d, 0x66, 0x0f, 0x94, 0x66, 0x2f, 0x2b, 0x6b, 0xb7, 0x4a, 0x7b, 0xd2, 0x4a, 0xa5, 0xaa, - 0x1e, 0x47, 0xb0, 0x67, 0x04, 0xa3, 0x6d, 0x4e, 0xf8, 0x94, 0xfd, 0x01, 0x31, 0x2d, 0xaf, 0x12, - 0xd9, 0x05, 0x95, 0xc1, 0x40, 0x20, 0x60, 0x23, 0x81, 0xec, 0x27, 0x00, 0x63, 0xd4, 0xd4, 0x4b, - 0x7f, 0xfd, 0xeb, 0x5f, 0xff, 0xc3, 0x45, 0x01, 0x50, 0xb2, 0x76, 0x62, 0x9d, 0x58, 0xb2, 0x14, - 0x8c, 0x07, 0x3f, 0xa7, 0x06, 0xc7, 0xb9, 0x20, 0x0a, 0x0a, 0x8b, 0x91, 0x5f, 0x5c, 0x81, 0x53, - 0x2a, 0x3b, 0x0e, 0xd5, 0xf4, 0x23, 0x87, 0x6a, 0xbe, 0xc4, 0x10, 0x44, 0x62, 0x51, 0x2b, 0x32, - 0x6b, 0xb5, 0xa8, 0xd4, 0xb9, 0x28, 0xf9, 0x20, 0x94, 0x04, 0xe6, 0xb8, 0x9c, 0x00, 0x28, 0x8d, - 0x68, 0x1b, 0x12, 0x24, 0x9d, 0x1b, 0xa2, 0x81, 0xa2, 0xc9, 0x34, 0x8a, 0x8e, 0xc1, 0x20, 0xab, - 0xe9, 0x19, 0x90, 0x92, 0x8a, 0x14, 0x51, 0xb9, 0xaa, 0x57, 0x30, 0xba, 0xe1, 0xa6, 0xc7, 0x02, - 0xaa, 0x81, 0x80, 0x90, 0x56, 0x50, 0xc5, 0xbe, 0x3c, 0x92, 0x19, 0xa6, 0x9c, 0x8a, 0xb9, 0xe2, - 0x8f, 0x8d, 0x8d, 0x59, 0x28, 0x0f, 0x2b, 0xe5, 0xeb, 0xb8, 0xff, 0xfe, 0xfb, 0x5f, 0x23, 0x20, - 0x97, 0x8f, 0x0b, 0x80, 0x56, 0xdf, 0x4d, 0x02, 0x86, 0x8d, 0x1b, 0x37, 0x9e, 0x17, 0x9b, 0x37, - 0x6f, 0x8e, 0x81, 0x20, 0x66, 0xc2, 0x8e, 0x1d, 0x3b, 0x90, 0x9b, 0x57, 0x88, 0xdc, 0x42, 0x39, - 0xf2, 0x7a, 0x3c, 0xd8, 0x99, 0xa3, 0x46, 0x3e, 0x35, 0x72, 0xb9, 0x89, 0xea, 0xdd, 0xe8, 0x47, - 0xfc, 0xa9, 0x3a, 0x94, 0x76, 0xda, 0xd1, 0x66, 0x0f, 0xa3, 0x6b, 0x58, 0x94, 0xb2, 0xea, 0xba, - 0x21, 0xef, 0xb0, 0xa0, 0x77, 0x0c, 0xa2, 0xc9, 0x0b, 0x91, 0x12, 0x15, 0x9b, 0x8d, 0xc3, 0x30, - 0x8e, 0x08, 0xac, 0x51, 0x6f, 0x97, 0x72, 0xaa, 0x55, 0x91, 0xb2, 0x56, 0x1d, 0x7a, 0xdd, 0xa2, - 0xa7, 0xcf, 0x8b, 0x70, 0x83, 0xc1, 0x29, 0x64, 0xe4, 0x57, 0x4b, 0xbb, 0xf7, 0x1c, 0x15, 0x89, - 0xed, 0x4e, 0x53, 0x5e, 0xc7, 0x29, 0xe4, 0xdc, 0x8b, 0x39, 0x1c, 0x8e, 0xfe, 0xe5, 0xcb, 0x97, - 0x0f, 0x52, 0xde, 0xe6, 0x7f, 0xa7, 0xdb, 0x05, 0x00, 0xaa, 0xab, 0xab, 0x83, 0x64, 0x13, 0x2e, - 0x00, 0xc0, 0x83, 0x74, 0x01, 0x4a, 0xa5, 0x32, 0xb6, 0x0b, 0x39, 0xb9, 0xf9, 0x38, 0x99, 0x5d, - 0x82, 0xfc, 0xce, 0x61, 0xec, 0xca, 0x53, 0x21, 0xbb, 0xdd, 0x85, 0x12, 0x8d, 0x07, 0x95, 0x06, - 0x2f, 0xf6, 0xe7, 0x36, 0xa0, 0xa4, 0xc3, 0x8e, 0x26, 0x6a, 0xda, 0xce, 0x61, 0x26, 0xa6, 0x57, - 0xb6, 0xa1, 0xb2, 0xd3, 0x1a, 0x03, 0x60, 0xa6, 0x30, 0xb8, 0x22, 0xac, 0xc3, 0x32, 0x0a, 0x9b, - 0x0f, 0x92, 0xba, 0xd7, 0x21, 0x9d, 0x6e, 0xe8, 0x8c, 0x34, 0x6a, 0x2c, 0xa2, 0x6e, 0xc8, 0x17, - 0x1c, 0xf4, 0x23, 0x2a, 0x6f, 0xd1, 0x8b, 0xe9, 0xb9, 0x15, 0xd2, 0x96, 0x6d, 0xfb, 0xc1, 0x05, - 0xf3, 0x8c, 0x13, 0xf8, 0x03, 0x90, 0x2a, 0x0a, 0x1b, 0xd9, 0x17, 0x13, 0x95, 0x95, 0x43, 0x46, - 0x7f, 0xce, 0x03, 0x20, 0x97, 0xcb, 0xa5, 0x89, 0x00, 0xf0, 0x95, 0x3f, 0x03, 0x80, 0x5e, 0x18, - 0xe9, 0x59, 0x85, 0x28, 0x68, 0xd0, 0x60, 0x7f, 0x99, 0x0e, 0xc5, 0x5a, 0x2f, 0x4a, 0xb5, 0x1e, - 0x94, 0x76, 0x0f, 0x23, 0x21, 0xb7, 0x1e, 0x85, 0x2a, 0x0b, 0xea, 0x8c, 0x63, 0xac, 0xc5, 0xe2, - 0x47, 0x56, 0x75, 0x3b, 0x1a, 0x74, 0x43, 0xac, 0x9f, 0x56, 0xdf, 0xea, 0x87, 0xa4, 0x1f, 0xf2, - 0xc3, 0xe0, 0xf0, 0x61, 0x28, 0x00, 0xa9, 0xdb, 0x32, 0xcc, 0xaa, 0x5a, 0xba, 0x85, 0x66, 0x6d, - 0x3f, 0xb3, 0xfb, 0x25, 0xff, 0x70, 0x10, 0x62, 0x5e, 0x55, 0x13, 0x3b, 0x91, 0x59, 0xcc, 0xd6, - 0x6e, 0xd8, 0x1d, 0x3d, 0x27, 0xf9, 0x73, 0xa3, 0x81, 0x5c, 0x00, 0xef, 0x8b, 0xee, 0xf3, 0x00, - 0x44, 0xa3, 0x51, 0x0d, 0xd1, 0x25, 0xfb, 0x26, 0x00, 0xea, 0xeb, 0xeb, 0x91, 0x71, 0x32, 0x07, - 0x99, 0x05, 0x15, 0x48, 0x6a, 0xb0, 0xa1, 0x54, 0xef, 0x8f, 0x71, 0x7e, 0x6d, 0xaf, 0x17, 0x89, - 0x79, 0xf5, 0xa8, 0xe8, 0x71, 0x80, 0x37, 0x2a, 0xaf, 0xf5, 0xbc, 0xda, 0x0e, 0xd4, 0xf7, 0x58, - 0xa1, 0xb5, 0xfb, 0x98, 0xc9, 0x15, 0x62, 0x46, 0x87, 0x17, 0xd6, 0xb1, 0x30, 0xa3, 0x64, 0x25, - 0xfd, 0xe0, 0x08, 0xab, 0x6e, 0xee, 0x64, 0x66, 0x87, 0x27, 0x32, 0x12, 0x46, 0x70, 0xc8, 0x17, - 0x15, 0xe5, 0xca, 0x0e, 0xe9, 0xe0, 0x91, 0x0c, 0x24, 0x24, 0x26, 0xf5, 0x8f, 0x93, 0x7c, 0x2a, - 0xe9, 0x92, 0xfd, 0xe5, 0x97, 0x5f, 0x76, 0x51, 0x05, 0x2d, 0x3a, 0x0f, 0x80, 0xc7, 0xe3, 0xb1, - 0x50, 0x0f, 0x88, 0xdf, 0x04, 0x00, 0xa7, 0xd2, 0xc2, 0xc2, 0x22, 0x1c, 0xfe, 0x2a, 0x1d, 0xd9, - 0x0a, 0x3d, 0xca, 0x8d, 0x41, 0xd4, 0x10, 0x00, 0xce, 0xed, 0x5f, 0xe6, 0xd7, 0x43, 0x61, 0x70, - 0xb3, 0xae, 0x21, 0xea, 0x81, 0xc1, 0x00, 0x8a, 0x1b, 0xba, 0xd0, 0x66, 0x72, 0xa2, 0x77, 0x38, - 0x00, 0x93, 0xd3, 0x87, 0xde, 0xa1, 0x31, 0x58, 0x47, 0x03, 0x6c, 0x34, 0xc4, 0x24, 0xd3, 0xd0, - 0x28, 0xab, 0x6f, 0xeb, 0xc6, 0x68, 0x84, 0x05, 0xdd, 0x11, 0x44, 0xac, 0x23, 0x5e, 0x31, 0xb7, - 0xa4, 0x86, 0xad, 0x5b, 0xb7, 0x9b, 0xc4, 0xd2, 0x58, 0x30, 0x0e, 0x80, 0x26, 0x2a, 0x9f, 0x3e, - 0xf2, 0x4b, 0x9d, 0xb1, 0x26, 0x3e, 0x17, 0x00, 0x35, 0xc8, 0x08, 0x09, 0xd7, 0x37, 0x02, 0xc0, - 0xa9, 0xb4, 0xa5, 0xa5, 0x05, 0xc7, 0x92, 0x4e, 0x22, 0x25, 0xbb, 0x8c, 0xca, 0x67, 0x0c, 0xb5, - 0x7d, 0xa1, 0x58, 0x09, 0x1d, 0x22, 0x00, 0x8d, 0xbd, 0x6e, 0x74, 0x0f, 0x91, 0x70, 0xf5, 0x8d, - 0x40, 0xde, 0x4c, 0xca, 0x3d, 0xe0, 0x66, 0x83, 0x5e, 0x81, 0xd9, 0xdc, 0x21, 0xf4, 0x0f, 0x7b, - 0x31, 0x30, 0x1a, 0xc0, 0xb0, 0x3f, 0xca, 0xfa, 0x9d, 0x6e, 0x74, 0xe8, 0xcd, 0x92, 0x57, 0x40, - 0x90, 0x42, 0xd4, 0xf6, 0x0f, 0x48, 0xfb, 0x12, 0x92, 0xb1, 0x79, 0xcb, 0xbe, 0xc0, 0x38, 0xc9, - 0xa7, 0xf3, 0xd5, 0xff, 0xed, 0x6f, 0x7f, 0xeb, 0xbe, 0xef, 0xbe, 0xfb, 0x1e, 0xb9, 0x00, 0x80, - 0xc5, 0x62, 0x09, 0x93, 0x90, 0x4d, 0x08, 0xe0, 0xf3, 0xcf, 0x3f, 0xc7, 0xc1, 0x83, 0x07, 0xcf, - 0x9e, 0xd3, 0x44, 0x86, 0xf7, 0xdf, 0xff, 0x00, 0xf1, 0x7b, 0x8e, 0xe0, 0x44, 0x4e, 0x39, 0x52, - 0x6b, 0xf5, 0x38, 0x54, 0xd4, 0x82, 0xc3, 0x05, 0xf5, 0x38, 0x5e, 0xa4, 0x40, 0x46, 0x59, 0x23, - 0x72, 0xaa, 0x5b, 0x50, 0xac, 0x68, 0x83, 0xa2, 0x4d, 0x0f, 0xd3, 0x90, 0x07, 0x16, 0x4a, 0x9e, - 0x56, 0x19, 0x0e, 0x6f, 0x08, 0x2e, 0x7f, 0x18, 0x03, 0x23, 0x1e, 0x18, 0x6d, 0x76, 0xd1, 0x2f, - 0x22, 0xec, 0x13, 0x20, 0xe5, 0x14, 0x56, 0x60, 0xe5, 0x8a, 0xcf, 0xd1, 0xd8, 0xd8, 0x7a, 0x7a, - 0x1c, 0x00, 0xad, 0x44, 0xf3, 0xbc, 0xf6, 0x95, 0x67, 0x75, 0x80, 0x03, 0xa0, 0x86, 0xb4, 0x12, - 0x32, 0x9d, 0xd9, 0x6c, 0x66, 0x6d, 0x6d, 0x6d, 0xd2, 0xba, 0x75, 0xeb, 0xd8, 0x6f, 0x7e, 0xf3, - 0x1b, 0x90, 0x0a, 0x82, 0xf8, 0x16, 0x77, 0xdd, 0x75, 0x17, 0xee, 0xb8, 0xe3, 0x0e, 0xd0, 0xe8, - 0x08, 0xae, 0x09, 0x2b, 0x57, 0xae, 0x8c, 0x95, 0x10, 0xf9, 0x25, 0xe8, 0x74, 0x3a, 0x2c, 0x59, - 0xf2, 0x11, 0xf6, 0x25, 0x24, 0x21, 0xb3, 0x58, 0x81, 0x6a, 0x83, 0x07, 0x19, 0xd5, 0x9d, 0xb4, - 0x03, 0x2e, 0xe8, 0x1c, 0x41, 0xd6, 0xd1, 0xe7, 0x42, 0x8d, 0x5a, 0x0b, 0xb5, 0xde, 0x8a, 0xe6, - 0x6e, 0x63, 0x2c, 0x79, 0xbb, 0xdb, 0x8f, 0x91, 0x60, 0x94, 0x8d, 0x06, 0x23, 0x18, 0x72, 0x7b, - 0xd1, 0x3b, 0x60, 0x67, 0xbe, 0x88, 0x28, 0x94, 0x56, 0x2a, 0xb1, 0x66, 0x75, 0x1c, 0xe2, 0xe3, - 0x0f, 0xe9, 0xc7, 0x49, 0x3e, 0x93, 0x44, 0x76, 0x88, 0x86, 0x2c, 0xcf, 0xaf, 0xe8, 0x76, 0x16, - 0x00, 0xd5, 0x52, 0x0c, 0x00, 0x37, 0x70, 0xfd, 0xfd, 0xfd, 0x51, 0xb2, 0x0f, 0x91, 0x6b, 0xae, - 0xb9, 0x86, 0xc9, 0x68, 0x54, 0xf8, 0x7a, 0x5c, 0x72, 0xc9, 0x25, 0xa0, 0xad, 0x8b, 0x1d, 0xd3, - 0xb0, 0x0f, 0xab, 0xd5, 0x0a, 0xb2, 0x1d, 0xa0, 0x99, 0x00, 0xfb, 0xf7, 0x27, 0x92, 0xf4, 0x1f, - 0x41, 0x4a, 0x4e, 0x05, 0xb2, 0x89, 0x75, 0x2a, 0x3a, 0xfb, 0x39, 0xeb, 0x48, 0x3a, 0xbb, 0x87, - 0x55, 0x36, 0x77, 0xa1, 0xa5, 0xc7, 0x84, 0x4e, 0xa3, 0x05, 0xe6, 0xa1, 0x11, 0x0c, 0xfb, 0xf8, - 0xea, 0x87, 0xe0, 0x0e, 0x45, 0x31, 0xe2, 0x0f, 0x32, 0x93, 0xd5, 0xce, 0xd2, 0x4f, 0x16, 0x63, - 0xc5, 0xf2, 0x6d, 0x58, 0xb4, 0xe8, 0xb9, 0x08, 0x1f, 0x9c, 0xc6, 0x01, 0xd0, 0x46, 0xfd, 0xc9, - 0x6b, 0xbf, 0xfc, 0x3c, 0x25, 0x3e, 0x03, 0x80, 0xea, 0x7f, 0x90, 0x06, 0x72, 0x3f, 0x95, 0x88, - 0xff, 0xaa, 0xab, 0xae, 0x1a, 0x17, 0xc0, 0xa5, 0x97, 0x5e, 0x0a, 0x0e, 0x9e, 0x1f, 0x7f, 0xf8, - 0xe1, 0x87, 0xa0, 0x81, 0x1f, 0x34, 0x9d, 0xc5, 0x80, 0xbd, 0xfe, 0xfa, 0xeb, 0x44, 0xad, 0xa5, - 0x6c, 0xef, 0xde, 0xaf, 0xd8, 0xa6, 0x4d, 0x7b, 0x90, 0x94, 0x59, 0x02, 0x45, 0x67, 0x1f, 0x33, - 0x38, 0xfd, 0x4c, 0xd1, 0xa6, 0x43, 0xab, 0xd6, 0x04, 0xad, 0x65, 0x08, 0x36, 0x97, 0x07, 0x63, - 0x61, 0x91, 0x39, 0xbd, 0x7e, 0x98, 0x07, 0x9d, 0xa8, 0x52, 0xb4, 0x20, 0xf1, 0xc0, 0x09, 0xac, - 0xfa, 0x74, 0x3b, 0x8e, 0x1e, 0xcf, 0xc0, 0x33, 0xcf, 0x3c, 0xef, 0x1d, 0x27, 0xf9, 0x2c, 0x51, - 0x14, 0xed, 0x34, 0x93, 0xf8, 0x69, 0x01, 0x67, 0x8e, 0x0b, 0x80, 0x56, 0xdf, 0xe7, 0xa7, 0x1b, - 0xf9, 0x8e, 0xb1, 0x8b, 0x01, 0xe0, 0x25, 0xc5, 0x8f, 0xdf, 0x7d, 0xf7, 0x5d, 0x1c, 0x3b, 0x76, - 0x0c, 0x6f, 0xbc, 0xf1, 0x46, 0xec, 0x9c, 0x68, 0x0d, 0x54, 0x9f, 0x91, 0xf5, 0xeb, 0xd7, 0x0b, - 0x3f, 0xfe, 0xf1, 0x4d, 0xf8, 0x78, 0xe9, 0x1a, 0xb6, 0x76, 0xcd, 0x2e, 0x1c, 0x3e, 0x9e, 0x8d, - 0xa3, 0x29, 0x05, 0x48, 0xcf, 0x2e, 0x45, 0x5e, 0x71, 0x0d, 0x4a, 0xab, 0x9b, 0x50, 0x78, 0xba, - 0x16, 0x07, 0x8f, 0xa4, 0xc7, 0x92, 0x5e, 0xbe, 0x6c, 0x33, 0xf6, 0xee, 0x3b, 0x86, 0xfa, 0x46, - 0x15, 0x4e, 0xcb, 0x6b, 0xb0, 0xf2, 0xd3, 0x8d, 0xac, 0xb3, 0xb3, 0x33, 0xeb, 0x6b, 0x00, 0xba, - 0xc8, 0xfd, 0xf6, 0xd1, 0x7b, 0xe7, 0x5d, 0x60, 0xe6, 0x38, 0x80, 0xe2, 0xe2, 0x62, 0x9b, 0x5e, - 0xaf, 0xa7, 0x12, 0x93, 0x82, 0x09, 0x09, 0x09, 0xae, 0x8b, 0x01, 0xd8, 0xb4, 0x69, 0x53, 0xac, - 0x37, 0x78, 0xf2, 0x3c, 0x72, 0x73, 0x73, 0xf1, 0xfc, 0xf3, 0xcf, 0x23, 0x2d, 0x2d, 0x8d, 0xf1, - 0x73, 0x22, 0x04, 0xbc, 0xf8, 0xe2, 0x8b, 0x02, 0x9d, 0x87, 0xb2, 0xb3, 0x73, 0x23, 0xa9, 0x29, - 0xd9, 0xd1, 0xf7, 0xdf, 0x5f, 0x29, 0x6d, 0x58, 0x1f, 0x27, 0x2d, 0x59, 0xb2, 0x9a, 0xad, 0xf8, - 0x64, 0x2b, 0x5b, 0xb3, 0x7a, 0x27, 0xb6, 0x6e, 0x89, 0x87, 0xba, 0x5b, 0x87, 0x01, 0x17, 0x79, - 0x22, 0x8d, 0x11, 0xb9, 0x45, 0xe5, 0x48, 0x3c, 0x98, 0x8c, 0x6b, 0xae, 0x99, 0xc2, 0xf8, 0x07, - 0x08, 0xe7, 0x24, 0x9f, 0x23, 0x08, 0x82, 0x9d, 0xbb, 0x52, 0xea, 0xc5, 0x9f, 0x8f, 0x0b, 0xa0, - 0xb0, 0xb0, 0xd0, 0x41, 0x73, 0x00, 0x1f, 0x60, 0x82, 0xfb, 0xf7, 0xef, 0x77, 0x4c, 0x9e, 0x3c, - 0x19, 0x13, 0x01, 0x38, 0x7e, 0xfc, 0x38, 0xc8, 0x62, 0x23, 0x29, 0x29, 0x29, 0x06, 0x80, 0x38, - 0x19, 0x46, 0xa3, 0x11, 0x34, 0xec, 0xc7, 0x00, 0x34, 0x34, 0x34, 0x80, 0x16, 0xc2, 0x47, 0x64, - 0x10, 0x4e, 0x4c, 0x4c, 0x04, 0xcd, 0x16, 0x51, 0xea, 0x15, 0x1f, 0x5d, 0xe3, 0x27, 0x13, 0x26, - 0x12, 0x73, 0x45, 0xb2, 0xb2, 0xb2, 0x84, 0xc2, 0xc2, 0xe2, 0x68, 0xa3, 0xaa, 0x8b, 0x4a, 0xa8, - 0x19, 0xca, 0xb6, 0x0e, 0xa8, 0x7b, 0x34, 0x31, 0x6f, 0xf5, 0xd4, 0x7f, 0xbc, 0xe0, 0xff, 0xef, - 0xc4, 0xa5, 0x63, 0x52, 0x64, 0x8c, 0x03, 0xd1, 0xe4, 0xe4, 0xe4, 0xf4, 0xd1, 0x73, 0x53, 0xc6, - 0xb5, 0xd3, 0xb4, 0x2d, 0x5b, 0xc9, 0x5d, 0xba, 0x47, 0x46, 0x46, 0x22, 0x7c, 0xfa, 0xda, 0xbb, - 0x77, 0xaf, 0x9b, 0x76, 0x60, 0x42, 0x00, 0x3c, 0x71, 0x1a, 0x2f, 0x41, 0x43, 0x3e, 0x0a, 0x0a, - 0x0a, 0xd0, 0xdb, 0xdb, 0x1b, 0x03, 0xc0, 0x47, 0x4c, 0x0e, 0x80, 0x92, 0xe5, 0xaf, 0xe3, 0xa5, - 0x5d, 0x15, 0xf9, 0x39, 0xe9, 0x06, 0xe3, 0xe7, 0xd4, 0x2f, 0x91, 0x3b, 0xef, 0xbc, 0x13, 0xc4, - 0x70, 0x02, 0x11, 0x85, 0x44, 0x00, 0x83, 0xa7, 0x4b, 0x2b, 0x84, 0xaf, 0xbe, 0x3a, 0x2e, 0x66, - 0x9c, 0xca, 0x87, 0xd6, 0x6c, 0xc6, 0xa9, 0xdc, 0x92, 0x18, 0x9b, 0x1d, 0xdd, 0xfe, 0xb6, 0xd0, - 0x1e, 0xff, 0xc3, 0x80, 0x35, 0x6b, 0xee, 0x40, 0x38, 0x1c, 0x1e, 0xa4, 0x45, 0x0e, 0x90, 0xea, - 0xde, 0x38, 0x21, 0x00, 0x7a, 0xc1, 0x60, 0x28, 0x14, 0xe2, 0x6f, 0xec, 0xd8, 0xbd, 0x7b, 0xb7, - 0x70, 0xb1, 0x1d, 0xa0, 0xc4, 0x59, 0x51, 0x51, 0x91, 0xc8, 0x77, 0x82, 0x97, 0x0b, 0xe9, 0x06, - 0xeb, 0xea, 0xea, 0x92, 0x68, 0x55, 0xb9, 0x5b, 0x95, 0x78, 0xb2, 0x3e, 0xba, 0xd1, 0x10, 0x14, - 0x03, 0x64, 0x32, 0x99, 0x04, 0x7e, 0xce, 0x01, 0x9d, 0x01, 0x40, 0x60, 0x19, 0x95, 0x85, 0xd7, - 0xed, 0x76, 0x87, 0x69, 0x87, 0x84, 0x55, 0x9f, 0x6e, 0x90, 0x72, 0x0a, 0xe4, 0x50, 0x57, 0x1d, - 0x46, 0x53, 0xfc, 0x2f, 0x60, 0x3e, 0xf0, 0x7d, 0xb8, 0x29, 0xcc, 0xdb, 0x64, 0x28, 0x38, 0xfc, - 0x91, 0x83, 0x1a, 0xf7, 0xcb, 0x09, 0x27, 0x32, 0x0e, 0x20, 0x33, 0x93, 0x53, 0xac, 0x14, 0x21, - 0x2d, 0xb0, 0xc5, 0xc5, 0xc5, 0x61, 0xa2, 0x1d, 0xb8, 0xec, 0xb2, 0xcb, 0xf0, 0xe9, 0xa7, 0x9f, - 0x32, 0xce, 0x3a, 0xab, 0x57, 0xaf, 0x66, 0xa4, 0xc4, 0x51, 0xa2, 0x53, 0xe9, 0x8f, 0x2c, 0x54, - 0xc2, 0x88, 0x56, 0xa3, 0x57, 0x5c, 0x71, 0x05, 0x9e, 0x7e, 0xfa, 0x69, 0x50, 0xd2, 0x7c, 0x77, - 0x02, 0x53, 0xa6, 0x4c, 0x61, 0x9c, 0xbd, 0x38, 0x00, 0x7a, 0x9e, 0x44, 0xd7, 0xf1, 0x72, 0xe5, - 0x6c, 0x13, 0x22, 0x4f, 0x25, 0x1c, 0xdc, 0xf1, 0x31, 0x53, 0x7d, 0x79, 0x2f, 0x74, 0x69, 0x4f, - 0x20, 0xd4, 0xb5, 0x8d, 0xe4, 0xea, 0x19, 0x84, 0xb3, 0xff, 0x0d, 0xa3, 0xf1, 0x93, 0x51, 0xb7, - 0xee, 0x4a, 0xf6, 0xfa, 0x93, 0x37, 0x4f, 0xf8, 0x61, 0xb1, 0x8c, 0xb6, 0x26, 0xe1, 0xe4, 0xc9, - 0x93, 0x7c, 0x9b, 0x05, 0x8a, 0xde, 0x2f, 0xbe, 0xf8, 0x22, 0x74, 0x31, 0x00, 0x34, 0xa3, 0xc6, - 0x1a, 0x7c, 0xe9, 0xd2, 0xa5, 0xcc, 0xe9, 0x74, 0x52, 0x83, 0xbe, 0x1f, 0x7b, 0xec, 0xd1, 0x47, - 0x1f, 0xe5, 0x2c, 0x24, 0x2c, 0x59, 0xb2, 0x24, 0x76, 0x7e, 0xeb, 0xad, 0xb7, 0xf2, 0x1d, 0xe2, - 0x65, 0x14, 0xe1, 0xe7, 0x37, 0xdc, 0x70, 0x43, 0x4c, 0x10, 0xdf, 0x7a, 0xeb, 0x2d, 0x46, 0x4e, - 0x32, 0x44, 0xa5, 0x11, 0x20, 0xd2, 0x13, 0xab, 0x8a, 0xd3, 0xc5, 0xca, 0xcf, 0xae, 0x80, 0xab, - 0xee, 0x6d, 0x88, 0x3e, 0x23, 0xe0, 0xe9, 0x00, 0x0c, 0x9b, 0x21, 0xd5, 0x3c, 0x8c, 0x40, 0xf2, - 0x4d, 0xb0, 0x6e, 0x96, 0xa1, 0x6d, 0xb3, 0x6c, 0xcb, 0x84, 0x00, 0xa8, 0x39, 0xa8, 0xff, 0xf2, - 0xf9, 0x8a, 0xf0, 0xe9, 0xa7, 0x97, 0x37, 0xf1, 0x44, 0x2c, 0xc4, 0x01, 0x90, 0x1a, 0x8b, 0xfc, - 0x98, 0x86, 0x9e, 0x28, 0x2f, 0x81, 0x15, 0x2b, 0x56, 0x44, 0xf9, 0x39, 0x29, 0x77, 0xac, 0x7c, - 0x0e, 0x1d, 0x3a, 0x14, 0xe2, 0xe7, 0xb7, 0xdc, 0x72, 0x0b, 0x07, 0x24, 0xc6, 0xc7, 0xc7, 0xc7, - 0xae, 0xff, 0xde, 0xf7, 0xbe, 0x17, 0xdb, 0x01, 0xa2, 0x5d, 0x46, 0x7a, 0x13, 0xa4, 0xde, 0x61, - 0x5c, 0xc9, 0xa9, 0x41, 0xa5, 0x9d, 0x6f, 0xfe, 0x2b, 0xcc, 0x69, 0x33, 0x11, 0xe9, 0x4b, 0x06, - 0x18, 0xbd, 0x8c, 0xa3, 0x10, 0xe8, 0x7c, 0x13, 0xd1, 0xe2, 0xbb, 0xe0, 0x4d, 0xfc, 0x47, 0xf4, - 0x6c, 0x92, 0x89, 0xed, 0x9b, 0x64, 0xb7, 0x4c, 0xb4, 0x03, 0x72, 0xa2, 0x42, 0x91, 0xca, 0x87, - 0xf7, 0x40, 0x88, 0x84, 0x2c, 0x48, 0x3d, 0x30, 0xa1, 0x12, 0x13, 0x8b, 0x08, 0x1c, 0x08, 0xff, - 0xb4, 0x82, 0x27, 0x5c, 0x5b, 0x5b, 0x1b, 0xe0, 0xff, 0x27, 0x83, 0xc7, 0xbd, 0xbb, 0x97, 0x66, - 0xe8, 0xe0, 0xe5, 0x97, 0x5f, 0x4e, 0x82, 0xf4, 0x8c, 0xc4, 0x3f, 0xf0, 0xa5, 0xfe, 0x60, 0xd7, - 0x5f, 0x7f, 0x3d, 0xe3, 0x7d, 0x45, 0x20, 0x18, 0x11, 0x40, 0x84, 0x7a, 0x8e, 0x25, 0x27, 0x27, - 0xc3, 0xe5, 0x72, 0xb1, 0x9a, 0x9a, 0x1a, 0xf6, 0xf8, 0xfc, 0x87, 0xa5, 0xc2, 0x95, 0x53, 0x05, - 0xaf, 0xf2, 0x75, 0x08, 0xc3, 0xf5, 0x94, 0x85, 0x0d, 0xe8, 0x4f, 0x24, 0xdf, 0xb9, 0x10, 0xa1, - 0xcc, 0x5f, 0xc0, 0xb9, 0x63, 0x12, 0x5a, 0xd6, 0xcb, 0xc8, 0xff, 0xc8, 0x2e, 0xb9, 0x00, 0x00, - 0x35, 0xc8, 0x2e, 0xa2, 0xc5, 0x20, 0xe9, 0x80, 0x48, 0xc9, 0x44, 0x68, 0x74, 0x0c, 0x4f, 0xd4, - 0xc4, 0x57, 0x5f, 0x7d, 0x35, 0xa6, 0x4f, 0x9f, 0x1e, 0xbb, 0x27, 0x3d, 0x88, 0x92, 0xa1, 0x0b, - 0xf3, 0xe0, 0x80, 0xc8, 0x1f, 0x45, 0xf8, 0x31, 0xed, 0x88, 0x74, 0xdd, 0x75, 0xd7, 0xb1, 0x57, - 0x5f, 0x7d, 0x35, 0xfa, 0xec, 0xb3, 0xcf, 0xb2, 0x65, 0xcb, 0x96, 0x09, 0xdc, 0x6a, 0x4c, 0x9b, - 0x36, 0x0d, 0x57, 0x5e, 0x79, 0x25, 0x36, 0x6c, 0xd8, 0x10, 0xa1, 0x3e, 0x12, 0xf9, 0x68, 0x4a, - 0xf6, 0x45, 0xa0, 0xf7, 0xe4, 0xf6, 0x44, 0x4a, 0x8d, 0x7f, 0x47, 0xad, 0xda, 0xf5, 0x7d, 0x84, - 0xb4, 0xbb, 0x20, 0x85, 0xec, 0x80, 0x9b, 0xf2, 0xd5, 0xae, 0x82, 0x58, 0x31, 0x07, 0xfe, 0xa3, - 0x3f, 0x82, 0x71, 0x83, 0x0c, 0x8d, 0xeb, 0x65, 0x6f, 0x8c, 0xb7, 0x03, 0x5c, 0xc8, 0xb8, 0x1b, - 0x6d, 0x26, 0x01, 0xc9, 0xa5, 0x44, 0x8c, 0xb4, 0x82, 0x17, 0xec, 0x00, 0xef, 0x0b, 0x52, 0x5b, - 0x89, 0x9a, 0x34, 0xb6, 0x9a, 0x64, 0x21, 0x18, 0x85, 0x44, 0x8a, 0x1c, 0xdb, 0x91, 0xd7, 0x5e, - 0x7b, 0x2d, 0xfa, 0xce, 0x3b, 0xef, 0x44, 0xa8, 0x44, 0x84, 0xa9, 0x53, 0xa7, 0x32, 0xda, 0x81, - 0xe8, 0x0b, 0x2f, 0xbc, 0x20, 0x52, 0xc9, 0xb1, 0x79, 0xf3, 0xe6, 0x61, 0xcd, 0x9a, 0x35, 0x31, - 0x93, 0xf8, 0xdc, 0x73, 0xcf, 0xf1, 0x6b, 0x45, 0x62, 0x2c, 0x46, 0x83, 0x3a, 0x23, 0x00, 0x8c, - 0x00, 0x88, 0x2a, 0x95, 0x2a, 0xab, 0x60, 0xe3, 0x6c, 0xdb, 0x40, 0xde, 0x43, 0x88, 0xd8, 0x72, - 0x48, 0x06, 0x42, 0xc0, 0x60, 0x26, 0x39, 0xa0, 0xff, 0x44, 0x24, 0x7f, 0x16, 0xdc, 0x7b, 0xa7, - 0xa0, 0x75, 0xad, 0xcc, 0xdb, 0xb4, 0x56, 0xf6, 0x83, 0x09, 0x01, 0x70, 0x01, 0x21, 0x61, 0xca, - 0x9c, 0x33, 0x67, 0x8e, 0x89, 0xfe, 0xcf, 0x87, 0x66, 0x2b, 0xc5, 0x30, 0x85, 0xf7, 0x77, 0xbf, - 0xfb, 0x5d, 0x98, 0x7a, 0x45, 0xba, 0xe7, 0x9e, 0x7b, 0x44, 0x4a, 0x48, 0x22, 0xb0, 0x9c, 0x0a, - 0x79, 0xf3, 0x33, 0xbe, 0xb2, 0xbc, 0x1f, 0xe8, 0x98, 0x8b, 0x90, 0x97, 0x83, 0xb9, 0xf7, 0xde, - 0x7b, 0x45, 0x4e, 0x9f, 0xfc, 0x9c, 0xea, 0x5d, 0x22, 0x36, 0x0a, 0x73, 0xab, 0xc1, 0x5f, 0x83, - 0x6b, 0x09, 0xe9, 0x02, 0x0b, 0x04, 0x02, 0x8c, 0x66, 0x70, 0x46, 0x1e, 0xc7, 0x47, 0xbb, 0x91, - 0x54, 0x27, 0xcf, 0x55, 0xcb, 0x3f, 0x9b, 0xca, 0x02, 0xea, 0xe5, 0x10, 0xdd, 0xed, 0xf4, 0x6a, - 0x64, 0x4a, 0x4d, 0xbb, 0xc0, 0xea, 0xe7, 0x23, 0x98, 0xfa, 0x2f, 0xb0, 0x6d, 0xbe, 0x14, 0xb5, - 0xab, 0x64, 0xe9, 0x17, 0x05, 0x40, 0xa6, 0x2e, 0x85, 0x86, 0xf7, 0x6a, 0xaa, 0xe9, 0x0b, 0x62, - 0xf6, 0xec, 0xd9, 0x03, 0x33, 0x67, 0xce, 0x74, 0x35, 0x36, 0x36, 0x76, 0xd3, 0x1b, 0x8f, 0xd2, - 0xf3, 0x18, 0x39, 0x44, 0x4c, 0x9a, 0x34, 0x89, 0x0b, 0x18, 0x23, 0xc3, 0xc5, 0x01, 0xd1, 0x9d, - 0x18, 0xa1, 0x95, 0x16, 0xe9, 0xb5, 0x45, 0xaa, 0xf5, 0x20, 0xf9, 0x2b, 0x81, 0x2c, 0x8a, 0x48, - 0x89, 0x87, 0xf8, 0x39, 0xdd, 0x07, 0x07, 0x07, 0x07, 0x03, 0xc4, 0x44, 0x8c, 0xcf, 0xd6, 0x0b, - 0x16, 0x2c, 0x18, 0xa5, 0xe7, 0x25, 0x0d, 0x0d, 0x0d, 0x0d, 0xae, 0x7e, 0xe5, 0x2e, 0x6f, 0xc7, - 0xfe, 0x9b, 0x10, 0x36, 0x1e, 0x00, 0x13, 0x88, 0x69, 0x5d, 0x15, 0x40, 0xf7, 0x47, 0x10, 0x4a, - 0x7f, 0x05, 0xdf, 0xa1, 0xeb, 0xd1, 0xb1, 0x46, 0x86, 0xaa, 0x95, 0xb2, 0x79, 0x13, 0x02, 0xa0, - 0xc4, 0x72, 0x69, 0x95, 0x2d, 0xe3, 0x05, 0x79, 0x71, 0x0d, 0x51, 0x5f, 0xf2, 0x19, 0x9f, 0x42, - 0x89, 0x26, 0xd3, 0x0c, 0x51, 0x45, 0x13, 0x52, 0x90, 0x83, 0xe1, 0xc9, 0xf0, 0x0f, 0xc5, 0xf8, - 0x8a, 0x53, 0x83, 0x0a, 0x1f, 0x7f, 0xfc, 0xb1, 0xb4, 0x70, 0xe1, 0x42, 0x46, 0x09, 0xb2, 0xf9, - 0xf3, 0xe7, 0x33, 0xee, 0xa1, 0xf8, 0xee, 0xd1, 0xb9, 0x40, 0xfc, 0xcf, 0x49, 0x40, 0xe2, 0x16, - 0x84, 0x7a, 0x65, 0x90, 0x8e, 0x6b, 0x89, 0x9d, 0xfa, 0x67, 0xde, 0x76, 0x9b, 0x23, 0xe9, 0x35, - 0x59, 0x9b, 0x53, 0xfe, 0x14, 0xa2, 0xf6, 0x32, 0x20, 0x4a, 0xd8, 0xac, 0xe4, 0xae, 0x5b, 0x9f, - 0x8e, 0x69, 0x83, 0x2b, 0x6e, 0x32, 0x6a, 0x57, 0xc8, 0xfa, 0xf3, 0xd7, 0xca, 0x26, 0xc7, 0x00, - 0x90, 0xc0, 0x6c, 0x25, 0x65, 0x3d, 0x0b, 0xe0, 0x7f, 0x1a, 0x54, 0x52, 0x39, 0xc4, 0x3a, 0x56, - 0xae, 0xac, 0x54, 0x86, 0x61, 0xaa, 0x69, 0x51, 0x2e, 0x97, 0x33, 0x3a, 0x67, 0xc4, 0x4c, 0x02, - 0x51, 0xa6, 0x40, 0x65, 0x22, 0x92, 0xd7, 0x67, 0xb4, 0x08, 0xa0, 0x7b, 0x81, 0x98, 0x8f, 0x7f, - 0x7c, 0xc9, 0x96, 0x2f, 0x5f, 0xae, 0xa3, 0xd7, 0x18, 0x78, 0xfb, 0xed, 0xb7, 0xed, 0xbf, 0xfc, - 0xe5, 0x2f, 0x17, 0x3f, 0x3d, 0x4b, 0xf6, 0x84, 0xfc, 0xb3, 0xef, 0x08, 0xc1, 0xae, 0x8d, 0x90, - 0x62, 0xda, 0x40, 0xe5, 0x64, 0xd8, 0x44, 0xda, 0x30, 0x17, 0x81, 0xa4, 0x1b, 0x61, 0x58, 0x27, - 0x43, 0xe9, 0x52, 0xd9, 0xb6, 0xaf, 0x03, 0x20, 0x05, 0x41, 0xee, 0xff, 0x36, 0x08, 0x48, 0x0d, - 0x25, 0x3f, 0x42, 0x16, 0x23, 0x4a, 0x2d, 0x10, 0xb3, 0x28, 0x54, 0x1a, 0x7e, 0xad, 0x56, 0xeb, - 0xe7, 0x42, 0xa7, 0x50, 0x28, 0x38, 0x20, 0x89, 0x56, 0x9b, 0x0b, 0x21, 0xff, 0x94, 0x4f, 0xa2, - 0x06, 0xb7, 0x93, 0xe5, 0xe8, 0xa3, 0xbe, 0xe9, 0xe5, 0xdf, 0x57, 0x10, 0x69, 0x4c, 0xdf, 0xf9, - 0xb4, 0xec, 0x4b, 0xcd, 0xb1, 0xdb, 0x48, 0x1b, 0xb8, 0x9f, 0xa3, 0xca, 0x74, 0xd0, 0x7c, 0xdf, - 0x41, 0xda, 0x50, 0x74, 0x17, 0x46, 0xf7, 0x5f, 0x87, 0x8a, 0x65, 0x97, 0x88, 0x65, 0xcb, 0x65, - 0xb7, 0xca, 0xe8, 0x49, 0x2b, 0xa8, 0xbe, 0x6d, 0xfc, 0xcb, 0x3c, 0x7a, 0xc3, 0x6f, 0x2d, 0xa8, - 0x84, 0x9c, 0x7c, 0xc2, 0xa3, 0x44, 0x25, 0x8f, 0xc7, 0x23, 0x72, 0xd5, 0xa5, 0x08, 0xd3, 0x63, - 0x01, 0x7a, 0x2c, 0x4c, 0xa0, 0xf8, 0x63, 0x22, 0x99, 0xc7, 0x10, 0xf9, 0x2f, 0xdf, 0x4b, 0x2f, - 0xbd, 0xe4, 0x98, 0x35, 0x6b, 0xd6, 0x53, 0xb1, 0x55, 0x95, 0xc9, 0x2e, 0x9b, 0x36, 0x55, 0x76, - 0x5b, 0xfa, 0x9b, 0x97, 0xda, 0xc6, 0xea, 0xff, 0xa8, 0x0d, 0xa2, 0xe1, 0x0b, 0xe8, 0x8f, 0xfc, - 0x02, 0xf9, 0xcb, 0xbe, 0x8b, 0x7d, 0xcb, 0x1e, 0xb6, 0x67, 0xac, 0x95, 0x4d, 0xe2, 0x3a, 0x70, - 0x3d, 0xd9, 0x83, 0x5a, 0x62, 0x1e, 0x3b, 0x0f, 0xf2, 0x46, 0x67, 0x83, 0x54, 0xfa, 0xbc, 0xa0, - 0x7e, 0x39, 0x2f, 0xe8, 0xb9, 0xe7, 0x05, 0xed, 0xe6, 0xd9, 0xa0, 0x85, 0x39, 0x13, 0x6e, 0xce, - 0x48, 0x74, 0xbd, 0x44, 0xf5, 0x2f, 0x12, 0xe3, 0x88, 0x64, 0x3b, 0x22, 0x73, 0xe7, 0xce, 0x0d, - 0xf2, 0xf8, 0xfd, 0xef, 0x7f, 0xef, 0x23, 0x4d, 0xb0, 0xd1, 0x35, 0xdd, 0x94, 0xf8, 0x59, 0xa1, - 0xa2, 0xdb, 0x94, 0xf7, 0x1e, 0x92, 0x2d, 0xae, 0xdb, 0xf2, 0x7d, 0xf8, 0xbb, 0xb6, 0x43, 0x53, - 0xbc, 0x1e, 0xf9, 0x2b, 0x6f, 0x42, 0x5e, 0xc2, 0xdb, 0x38, 0x7a, 0x2c, 0x85, 0x4c, 0xe1, 0x16, - 0xc3, 0x5f, 0xed, 0xa7, 0x06, 0xbc, 0x2c, 0xee, 0xb8, 0xe3, 0x8e, 0x57, 0xee, 0xbe, 0xfb, 0xee, - 0x21, 0x52, 0xf2, 0x01, 0xa2, 0x5c, 0xdb, 0x1f, 0xbe, 0x50, 0x21, 0x8a, 0x81, 0x9d, 0x8c, 0x9f, - 0xeb, 0xf6, 0xdb, 0x6f, 0x9f, 0x7f, 0x81, 0x48, 0xc9, 0x64, 0x37, 0x26, 0x3c, 0x2f, 0xcb, 0xcf, - 0xfa, 0xf0, 0x5a, 0x51, 0x5d, 0xb8, 0x1e, 0x5a, 0xa3, 0x06, 0x55, 0xf5, 0x4d, 0x38, 0x9a, 0x94, - 0x81, 0x4f, 0x3e, 0x59, 0xb9, 0xe4, 0xaf, 0xfe, 0x5b, 0x89, 0x19, 0x33, 0x66, 0x5c, 0x49, 0x54, - 0xfc, 0x11, 0x01, 0x71, 0x93, 0x47, 0xb2, 0x52, 0x49, 0xd9, 0x88, 0x92, 0x4d, 0xc4, 0x70, 0x4d, - 0xe3, 0xfa, 0x1c, 0x99, 0x6c, 0xd2, 0x2d, 0xd3, 0x64, 0xf7, 0xcc, 0x9e, 0xf1, 0x9d, 0xfb, 0x77, - 0xc4, 0xc5, 0xa5, 0xa7, 0x66, 0x64, 0xda, 0x13, 0x0e, 0x1c, 0x32, 0xbf, 0xf3, 0xce, 0x7b, 0x6b, - 0xce, 0xec, 0xd6, 0xdf, 0xe4, 0x07, 0x1a, 0x54, 0x2e, 0xd7, 0x90, 0xb1, 0xdb, 0x40, 0xbb, 0x12, - 0xa0, 0x7b, 0x1f, 0x81, 0x9a, 0x3d, 0xa1, 0xdb, 0x94, 0xc9, 0xae, 0xa0, 0xb8, 0x92, 0xe2, 0x47, - 0x14, 0xff, 0xcc, 0x1b, 0x9c, 0xe2, 0xf2, 0xbf, 0x8b, 0x5f, 0xab, 0xdc, 0x7c, 0xf3, 0xcd, 0x93, - 0xbe, 0xfe, 0x85, 0xc5, 0x9f, 0x1b, 0xff, 0x05, 0x15, 0x63, 0xa5, 0xc9, 0x16, 0xbd, 0x27, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0x87, 0x00, 0x00, 0x13, 0x81, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xdd, 0x5a, 0x07, 0x74, 0x5b, + 0x65, 0x96, 0x16, 0x25, 0xc9, 0x12, 0x86, 0x13, 0xca, 0xc2, 0x0e, 0xc9, 0x72, 0x58, 0xd8, 0xb0, + 0x30, 0x94, 0xb3, 0x90, 0x90, 0x02, 0x0c, 0x0b, 0x01, 0x02, 0x24, 0x90, 0x1c, 0xca, 0x10, 0x3a, + 0x2c, 0x2d, 0x94, 0x84, 0x34, 0x52, 0x48, 0x99, 0xf4, 0x4a, 0x48, 0x2f, 0x8e, 0x49, 0x21, 0x8e, + 0xed, 0x38, 0xb6, 0xe3, 0xb8, 0x97, 0xd8, 0xb2, 0xe3, 0x26, 0x17, 0xd9, 0x96, 0x6d, 0xb9, 0x48, + 0x96, 0x25, 0xd9, 0x2a, 0xb6, 0x2c, 0xb9, 0xc8, 0x92, 0xd5, 0xdf, 0x7b, 0xff, 0xdd, 0xef, 0xd7, + 0x4e, 0x32, 0x09, 0xb1, 0x33, 0xcc, 0x2e, 0x53, 0x76, 0x75, 0xce, 0xf5, 0x7b, 0xbf, 0xf5, 0xf4, + 0x74, 0xbf, 0xff, 0xde, 0xfb, 0xdd, 0xef, 0x4a, 0x92, 0x11, 0x91, 0xec, 0xff, 0xb2, 0xc9, 0xfe, + 0x5f, 0x03, 0x18, 0x3f, 0x7e, 0xfc, 0xb0, 0x99, 0x33, 0x67, 0x1e, 0x7f, 0xe5, 0x95, 0x57, 0xf2, + 0x5f, 0x7c, 0xf1, 0xc5, 0x55, 0xd3, 0xa6, 0x4d, 0x7b, 0xea, 0x8d, 0x37, 0xde, 0xb8, 0x6e, 0xb0, + 0x6b, 0xf1, 0xdc, 0x3f, 0xe3, 0xda, 0xd4, 0x19, 0x33, 0x66, 0x1c, 0x7b, 0xee, 0xb9, 0xe7, 0xee, + 0xfe, 0xbb, 0x00, 0xf0, 0xfc, 0xf3, 0xcf, 0xcf, 0x5e, 0xb5, 0x6a, 0x95, 0x4d, 0xa7, 0xd3, 0x99, + 0x92, 0x93, 0x93, 0xcd, 0x0b, 0x17, 0x2e, 0x74, 0xc0, 0xd1, 0x20, 0x1c, 0xad, 0x9d, 0x3e, 0x7d, + 0xfa, 0x0e, 0x3c, 0x3f, 0xe3, 0x85, 0x17, 0x5e, 0xb8, 0x99, 0x5f, 0x0b, 0xc7, 0xe5, 0xf1, 0xf1, + 0xf1, 0xe6, 0xac, 0xac, 0x2c, 0x33, 0x00, 0xfb, 0xb0, 0x8e, 0xc4, 0x35, 0xbf, 0xfe, 0x9b, 0x02, + 0x80, 0xa3, 0x49, 0xb5, 0xb5, 0xb5, 0x26, 0x9c, 0x37, 0xc1, 0xea, 0x61, 0x66, 0x51, 0x14, 0xed, + 0x1d, 0x1d, 0x1d, 0xe6, 0xbc, 0xbc, 0x3c, 0xf3, 0xda, 0xb5, 0x6b, 0x3b, 0xe1, 0x68, 0xf0, 0xe5, + 0x97, 0x5f, 0xb6, 0xbe, 0xf6, 0xda, 0x6b, 0xc1, 0x9c, 0x9c, 0x9c, 0x7e, 0xab, 0xd5, 0xda, 0x1a, + 0x0c, 0x06, 0x3b, 0x13, 0x12, 0x12, 0x2c, 0xaf, 0xbe, 0xfa, 0xaa, 0x77, 0xdb, 0xae, 0xdd, 0xc9, + 0x8a, 0x86, 0xd6, 0x13, 0x15, 0x1a, 0xe3, 0xf6, 0x72, 0x6d, 0xdb, 0x3c, 0x55, 0x53, 0xeb, 0x4c, + 0x55, 0x83, 0xf6, 0xd1, 0xb2, 0xa6, 0xa6, 0x9b, 0xff, 0xe2, 0x00, 0x5e, 0x7a, 0xe9, 0xa5, 0x2e, + 0xb7, 0xdb, 0x6d, 0xc1, 0x79, 0x3a, 0x2c, 0x6a, 0x60, 0x60, 0x20, 0x06, 0xc7, 0x78, 0x58, 0x1e, + 0xac, 0x06, 0x66, 0x64, 0x8c, 0x39, 0x8c, 0x46, 0x63, 0xb0, 0xbc, 0xbc, 0x5c, 0x8c, 0x8c, 0x8c, + 0x0c, 0x7d, 0xf2, 0xe9, 0xa7, 0xc2, 0xae, 0x03, 0x91, 0xa2, 0xbc, 0x52, 0x25, 0xd5, 0x69, 0x75, + 0x54, 0xa7, 0x33, 0x50, 0x49, 0x53, 0x3b, 0x2b, 0x6d, 0x36, 0x09, 0x15, 0x9a, 0xb6, 0x50, 0x95, + 0x46, 0x2f, 0x54, 0x6b, 0x74, 0xa2, 0xb2, 0xbe, 0x49, 0xcc, 0xaf, 0xd1, 0x66, 0x15, 0x55, 0xd6, + 0xdf, 0xf5, 0x17, 0x01, 0xc0, 0x73, 0x1a, 0x3b, 0xe8, 0xc7, 0xb9, 0x1d, 0x16, 0xd3, 0xd7, 0xd7, + 0x17, 0x3b, 0x72, 0xe4, 0xc8, 0xe0, 0xe8, 0xd1, 0xa3, 0x5d, 0x00, 0xd6, 0xb2, 0x6d, 0xdb, 0xb6, + 0x62, 0x8d, 0x46, 0x93, 0x68, 0xb3, 0xd9, 0x0a, 0x9a, 0x9a, 0x9a, 0x42, 0xb8, 0x26, 0xe4, 0xf1, + 0xfb, 0xbd, 0xb5, 0xda, 0x56, 0xaa, 0xd5, 0x9b, 0xa8, 0x54, 0x67, 0x67, 0xd9, 0x9a, 0x5e, 0x16, + 0x59, 0xde, 0x4d, 0x3b, 0x72, 0x0d, 0x6c, 0x5b, 0x86, 0x86, 0xad, 0x49, 0x6a, 0x90, 0x36, 0x64, + 0x9b, 0x1d, 0x3b, 0xcb, 0xdc, 0xba, 0x04, 0x55, 0x77, 0x77, 0x91, 0xda, 0x10, 0x28, 0x55, 0xaa, + 0xd8, 0xd9, 0x0a, 0x75, 0x51, 0x5e, 0x51, 0xf9, 0x6f, 0x7e, 0x51, 0x00, 0xc8, 0xef, 0xb7, 0xb6, + 0x6e, 0xdd, 0x6a, 0xc5, 0x79, 0x2b, 0xdf, 0x7d, 0x6e, 0x48, 0x8d, 0x13, 0xe9, 0xe9, 0xe9, 0x99, + 0xf3, 0xe6, 0xcd, 0xab, 0x9e, 0x34, 0x69, 0x92, 0xe5, 0xfa, 0xeb, 0xaf, 0x0f, 0x8e, 0x19, 0x33, + 0x46, 0x2a, 0x2e, 0x2e, 0xf6, 0x75, 0x76, 0xf7, 0x7a, 0x6a, 0x9b, 0xb5, 0x54, 0xae, 0xb7, 0xb1, + 0xe8, 0x06, 0xbf, 0x14, 0x5b, 0x3f, 0xc0, 0xd2, 0x5a, 0x43, 0xa2, 0xdc, 0x4c, 0xa2, 0xdc, 0xc4, + 0xc4, 0xec, 0x16, 0x2f, 0x8b, 0xaf, 0xee, 0x64, 0xdb, 0x93, 0x95, 0x6c, 0xc1, 0xc1, 0x0c, 0xb6, + 0x20, 0x32, 0xc7, 0xbd, 0x26, 0xb9, 0xd1, 0x14, 0x57, 0xd9, 0xd9, 0x97, 0xaf, 0x6a, 0x09, 0xe4, + 0x97, 0x56, 0x4a, 0x99, 0xe7, 0xaa, 0x3e, 0xff, 0xc5, 0x00, 0xa0, 0x00, 0x23, 0x0a, 0x0b, 0x0b, + 0xcd, 0x38, 0x57, 0x72, 0xe7, 0x91, 0xd3, 0xd9, 0x37, 0xdd, 0x74, 0x93, 0x77, 0xc2, 0x84, 0x09, + 0x96, 0x25, 0x4b, 0x96, 0x54, 0x22, 0xdf, 0xd3, 0x5b, 0x5b, 0x5b, 0x8b, 0xe6, 0xcf, 0x9f, 0x2f, + 0x1c, 0x3c, 0x1a, 0xc5, 0x6a, 0x1a, 0x35, 0x24, 0xd7, 0x76, 0x4b, 0xfb, 0x14, 0x0e, 0xe9, 0x44, + 0x55, 0x77, 0x30, 0xd3, 0x20, 0x78, 0xa3, 0x95, 0x0e, 0xe1, 0x87, 0xa2, 0x76, 0x96, 0xa8, 0x76, + 0x05, 0xcf, 0xb6, 0x31, 0xff, 0x39, 0x0b, 0x09, 0x8a, 0x4e, 0x62, 0xc5, 0x56, 0x89, 0x25, 0xab, + 0x9d, 0xec, 0x68, 0xb1, 0x51, 0xda, 0x94, 0x50, 0x19, 0x58, 0x15, 0x53, 0x2a, 0x25, 0x29, 0xb4, + 0x52, 0x4e, 0x7e, 0x09, 0x5b, 0xbf, 0x6d, 0xdf, 0xbe, 0x67, 0x9e, 0x79, 0x66, 0xcc, 0xcf, 0x06, + 0x00, 0x5a, 0xbc, 0x06, 0x4c, 0xf2, 0x11, 0x6c, 0xeb, 0x79, 0x9b, 0x3a, 0x75, 0xea, 0x56, 0xd0, + 0x66, 0xcf, 0x8e, 0x1d, 0x3b, 0x5c, 0x3b, 0x77, 0xee, 0x34, 0x6e, 0xd9, 0xb2, 0xa5, 0x01, 0x69, + 0xd3, 0x73, 0xcf, 0x3d, 0xf7, 0xd0, 0xd8, 0xb1, 0x63, 0xe9, 0xde, 0x7b, 0xef, 0x65, 0xf7, 0xdd, + 0x77, 0x9f, 0x34, 0x6e, 0xdc, 0x38, 0x76, 0x32, 0xe1, 0xb4, 0x58, 0x59, 0xd7, 0x40, 0x49, 0xaa, + 0x4e, 0xb6, 0xbf, 0xa4, 0x5b, 0x5c, 0x1f, 0xa7, 0xa0, 0x15, 0x3f, 0xe6, 0xd1, 0xb6, 0x94, 0x3a, + 0x69, 0x5f, 0xae, 0x36, 0xb4, 0x2e, 0xb6, 0x44, 0xdc, 0x92, 0x58, 0xc1, 0x76, 0xa7, 0xd7, 0x49, + 0x87, 0x0b, 0x74, 0xc1, 0x63, 0x85, 0xad, 0xc1, 0xe8, 0x62, 0x9d, 0x78, 0xac, 0x40, 0xcb, 0x0e, + 0xe6, 0x34, 0xb0, 0x63, 0x85, 0x7a, 0x96, 0x6b, 0x08, 0x48, 0xf1, 0x2a, 0x47, 0x20, 0x4b, 0xd9, + 0xc2, 0x52, 0xb3, 0x0a, 0x68, 0xf6, 0x97, 0x73, 0xfd, 0xf0, 0xa1, 0x63, 0xca, 0x94, 0x29, 0x2f, + 0xfd, 0x49, 0x00, 0x70, 0xf4, 0x3f, 0x67, 0xcf, 0x9e, 0xed, 0x38, 0x7b, 0xf6, 0xac, 0x25, 0x37, + 0x37, 0xd7, 0xc2, 0x8f, 0xb0, 0x8e, 0x33, 0x67, 0xce, 0x30, 0x44, 0x40, 0x2c, 0x28, 0x28, 0xf0, + 0xe5, 0xe7, 0xe7, 0x7b, 0x41, 0x91, 0x52, 0x6c, 0x6c, 0x2c, 0x5d, 0x6c, 0x71, 0x71, 0xa7, 0xa8, + 0xb4, 0x4a, 0x45, 0x85, 0x8d, 0xed, 0x74, 0xa0, 0xbc, 0x9f, 0xa2, 0xca, 0x3b, 0x58, 0xac, 0xb2, + 0x83, 0x8e, 0x96, 0x98, 0xe8, 0x47, 0x85, 0x99, 0x62, 0x2a, 0x3b, 0x28, 0xb6, 0xc2, 0xc2, 0x4e, + 0x94, 0x18, 0xd8, 0xa9, 0xb2, 0x36, 0x4a, 0xaa, 0xb2, 0x48, 0x49, 0xd5, 0x56, 0x29, 0xa9, 0xca, + 0x2c, 0x65, 0xd4, 0x75, 0x48, 0xf1, 0x15, 0x66, 0xb6, 0x3d, 0x51, 0xc1, 0x8e, 0x9f, 0x6b, 0x15, + 0x53, 0xd5, 0x3d, 0x52, 0x42, 0x8d, 0x3d, 0x94, 0x53, 0xd1, 0xcc, 0xce, 0xa4, 0xe7, 0x33, 0x95, + 0xaa, 0xd6, 0x82, 0xcd, 0x6c, 0xfc, 0x93, 0x00, 0xf8, 0x8e, 0x73, 0xa7, 0xb1, 0x68, 0x87, 0x69, + 0xb8, 0xf9, 0x7c, 0x3e, 0x73, 0x77, 0x77, 0xb7, 0xc8, 0x0b, 0x13, 0xd6, 0x0f, 0xa6, 0x71, 0x69, + 0xb5, 0x5a, 0x42, 0xd1, 0x5e, 0x62, 0x45, 0x8a, 0x0a, 0x2a, 0xa9, 0xaa, 0xa5, 0x34, 0xcd, 0x00, + 0x3b, 0xd9, 0xe0, 0x67, 0x99, 0x2d, 0x5e, 0xca, 0x33, 0x86, 0x28, 0x53, 0x17, 0xa0, 0xb4, 0xa6, + 0x7e, 0x2a, 0x30, 0xfa, 0xa9, 0xb8, 0x3d, 0x40, 0x05, 0x7a, 0x37, 0x2b, 0x36, 0x78, 0x59, 0x95, + 0x4d, 0x92, 0x54, 0x0e, 0x12, 0x2b, 0xac, 0x02, 0x53, 0x77, 0x4b, 0x52, 0x91, 0x7e, 0x80, 0x25, + 0x29, 0x4d, 0x52, 0x64, 0x4e, 0xad, 0x50, 0xd6, 0xc9, 0xc4, 0x02, 0x83, 0x2f, 0x14, 0x5b, 0xd6, + 0xc6, 0x32, 0xf2, 0xcb, 0x59, 0x76, 0x7e, 0xb9, 0x17, 0xbe, 0x9d, 0xfb, 0x73, 0x00, 0x70, 0xe7, + 0xd5, 0xed, 0xed, 0xed, 0x7a, 0xec, 0xb8, 0x1b, 0x85, 0x29, 0x2a, 0x95, 0xca, 0x10, 0xcc, 0x5b, + 0x52, 0x52, 0x12, 0x40, 0x24, 0x48, 0xad, 0x56, 0x5f, 0x30, 0xf4, 0x01, 0x42, 0xe1, 0x51, 0x41, + 0xbd, 0x91, 0x62, 0x9b, 0x25, 0x76, 0xbc, 0xc2, 0x46, 0x59, 0x00, 0x50, 0xd0, 0x16, 0xa4, 0x9c, + 0xd6, 0x00, 0xe5, 0x68, 0xfb, 0x49, 0xae, 0x73, 0x91, 0xc2, 0x1c, 0xa0, 0xc2, 0x56, 0x17, 0xcb, + 0x6d, 0x72, 0x90, 0xd2, 0x1a, 0x60, 0xb5, 0x00, 0x50, 0xdd, 0x29, 0x4a, 0xf5, 0x5d, 0x41, 0x96, + 0x87, 0xff, 0xa5, 0xd5, 0x98, 0xa5, 0xfd, 0xc9, 0xa5, 0x01, 0x65, 0x17, 0xb9, 0xaa, 0xba, 0x28, + 0x50, 0x66, 0x11, 0x84, 0xac, 0xb2, 0x26, 0x76, 0x22, 0x2e, 0x95, 0x9e, 0x7d, 0xf6, 0x59, 0x25, + 0xec, 0x9f, 0xae, 0x08, 0x80, 0xe7, 0xfb, 0xc5, 0x00, 0x6a, 0x6a, 0x6a, 0xcc, 0x71, 0x71, 0x71, + 0x02, 0x52, 0x48, 0x42, 0xf7, 0xe5, 0xc7, 0xe0, 0xc9, 0x93, 0x27, 0xc5, 0xed, 0xdb, 0xb7, 0x53, + 0x5a, 0x5a, 0x5a, 0xd8, 0xf9, 0xfa, 0xfa, 0x7a, 0xda, 0xb1, 0x73, 0x27, 0xe5, 0x15, 0x2a, 0x28, + 0xa3, 0xc1, 0x41, 0x29, 0x7a, 0x26, 0xed, 0xc9, 0x6e, 0xa6, 0xa3, 0x85, 0x06, 0x2a, 0x6a, 0x0f, + 0xd2, 0x39, 0xa3, 0x8f, 0xb2, 0x1a, 0x7b, 0xa8, 0xd0, 0xe0, 0xa1, 0x32, 0xb3, 0x9f, 0xe2, 0x8a, + 0x9b, 0xe9, 0xac, 0xba, 0x83, 0x15, 0xeb, 0xfb, 0x89, 0x03, 0xa8, 0x73, 0x30, 0xb1, 0xc6, 0xea, + 0xa5, 0x62, 0x5d, 0x1f, 0xcb, 0xac, 0x35, 0x4b, 0xdb, 0xa2, 0x32, 0x58, 0x95, 0x35, 0xe8, 0xac, + 0x71, 0x90, 0xb3, 0xda, 0x4e, 0x03, 0xf2, 0xe6, 0x6e, 0x76, 0x32, 0x31, 0x9d, 0x76, 0xed, 0x39, + 0xe0, 0xc4, 0x06, 0x7b, 0xe0, 0xe3, 0x26, 0xc8, 0x93, 0x51, 0x3f, 0x0b, 0x80, 0x24, 0x49, 0x0d, + 0xa5, 0xa5, 0xa5, 0x0c, 0x29, 0x23, 0x36, 0x37, 0x37, 0x7b, 0x91, 0x2a, 0x03, 0x55, 0x55, 0x55, + 0xa2, 0x42, 0xa1, 0xa0, 0x8b, 0x41, 0x64, 0x66, 0xe5, 0x50, 0xb6, 0xbc, 0x88, 0x52, 0xeb, 0xbb, + 0x28, 0x55, 0x1b, 0x60, 0x09, 0xb5, 0x3d, 0x74, 0x30, 0x57, 0x43, 0x71, 0x0a, 0x43, 0xd8, 0xe9, + 0x0c, 0xfc, 0xbf, 0xc4, 0xe8, 0xa5, 0x32, 0x93, 0x9f, 0xa2, 0xe5, 0xf5, 0x2c, 0x45, 0x69, 0xa4, + 0xb2, 0x76, 0x0f, 0x52, 0x87, 0x44, 0xad, 0x93, 0x44, 0x65, 0xbb, 0x9b, 0x55, 0xb6, 0xbb, 0x58, + 0x9e, 0xda, 0x22, 0xed, 0x8b, 0xcf, 0x13, 0x8b, 0x34, 0x76, 0x2f, 0x30, 0xf7, 0xe1, 0x79, 0x77, + 0xb9, 0xc9, 0x2b, 0xc6, 0xa7, 0x9f, 0xa3, 0xe4, 0xf4, 0x42, 0x9f, 0xd7, 0xeb, 0xb5, 0xa2, 0x41, + 0x9a, 0x00, 0xa0, 0x1f, 0x45, 0xbd, 0xe4, 0xe9, 0xa7, 0x9f, 0xfe, 0x87, 0x2b, 0x02, 0x80, 0xb3, + 0x36, 0xb0, 0x4e, 0xd8, 0x59, 0x18, 0xe3, 0xc6, 0xd7, 0x28, 0x70, 0xba, 0x18, 0x44, 0x06, 0x00, + 0xa4, 0x67, 0x17, 0xd0, 0x99, 0x5a, 0x5b, 0xb8, 0x68, 0x53, 0x1a, 0x5d, 0x94, 0xa3, 0xf3, 0xd1, + 0xa1, 0x2c, 0x15, 0x25, 0x96, 0x6a, 0xe9, 0x5c, 0x4b, 0x0f, 0x80, 0xf8, 0xa8, 0xc2, 0x02, 0x00, + 0xf9, 0x00, 0x50, 0xa1, 0xa7, 0xba, 0x2e, 0x41, 0xd2, 0xc1, 0x79, 0x04, 0x42, 0x54, 0x1a, 0xfb, + 0x58, 0x7d, 0xa7, 0x8f, 0x95, 0x68, 0x3a, 0xa4, 0xe8, 0x2c, 0x85, 0x20, 0x57, 0x19, 0x05, 0xbd, + 0x93, 0x9c, 0xba, 0x3e, 0xf2, 0xaa, 0xac, 0xbe, 0xd0, 0xa9, 0x8c, 0x22, 0xf6, 0xc3, 0xb1, 0xc4, + 0x00, 0x7c, 0xca, 0xe6, 0x1d, 0xbf, 0xbf, 0xbf, 0xdf, 0x0c, 0x3f, 0x2c, 0xf0, 0xd7, 0xfe, 0xd4, + 0x53, 0x4f, 0x7d, 0x06, 0x20, 0xd7, 0x0e, 0x0a, 0x00, 0xbb, 0xef, 0x44, 0x03, 0xa3, 0x8d, 0x1b, + 0x37, 0x5e, 0x62, 0x9b, 0x37, 0x6f, 0x0e, 0x83, 0x00, 0x33, 0xd1, 0xf7, 0xdf, 0x7f, 0x4f, 0xa9, + 0x69, 0x19, 0x94, 0x9a, 0x29, 0x0f, 0x17, 0xeb, 0x8e, 0xd4, 0x5a, 0x4a, 0x6f, 0x76, 0x53, 0xbe, + 0x11, 0xf9, 0xae, 0xf7, 0xd0, 0xde, 0x33, 0xa5, 0x74, 0xb6, 0xd1, 0x46, 0x75, 0xb6, 0x00, 0x35, + 0xa1, 0x58, 0xcf, 0x94, 0x36, 0x31, 0xb9, 0xda, 0x44, 0x06, 0x17, 0x89, 0x46, 0x98, 0xa1, 0x9f, + 0x89, 0x55, 0x86, 0x6e, 0xd2, 0xf7, 0x09, 0x92, 0xb2, 0xd5, 0x26, 0xa5, 0x14, 0xab, 0x82, 0xf2, + 0xea, 0x16, 0x66, 0x74, 0x4a, 0xae, 0x36, 0x17, 0x05, 0x2a, 0x5b, 0xbb, 0x85, 0x84, 0xf4, 0x42, + 0x69, 0xcf, 0xbe, 0xe3, 0x22, 0xd8, 0xee, 0x2c, 0xfc, 0x3a, 0x01, 0x93, 0x73, 0x2d, 0x66, 0xb7, + 0xdb, 0x4d, 0xcb, 0x96, 0x2d, 0xeb, 0x84, 0xdf, 0x6d, 0xff, 0x81, 0xc7, 0x65, 0x00, 0x8a, 0x8a, + 0x8a, 0x7c, 0x90, 0x09, 0x97, 0x01, 0xe0, 0x86, 0xbe, 0x40, 0x15, 0x15, 0x15, 0xe1, 0x28, 0x70, + 0x00, 0xa7, 0x93, 0xb3, 0x29, 0x1d, 0x31, 0xdf, 0x95, 0xa6, 0xa2, 0x14, 0x75, 0x0f, 0xe5, 0x68, + 0x5c, 0x28, 0x58, 0x37, 0x1d, 0x4c, 0x2d, 0xa7, 0x1c, 0xb5, 0x8d, 0x94, 0xd8, 0xfd, 0x86, 0x6e, + 0x26, 0x26, 0x14, 0xd6, 0x51, 0x61, 0x83, 0x85, 0x19, 0xb1, 0xf3, 0xed, 0x00, 0xa0, 0xef, 0x0d, + 0x49, 0x6a, 0x73, 0x2f, 0x59, 0x07, 0x48, 0xaa, 0x33, 0xda, 0xa5, 0xb3, 0x95, 0x0d, 0xc1, 0x4a, + 0xad, 0x45, 0x6c, 0xe9, 0xf2, 0xf8, 0x3a, 0x3d, 0x14, 0xca, 0xaf, 0xd1, 0x89, 0x09, 0x69, 0x05, + 0xe2, 0xe6, 0x6d, 0x07, 0x89, 0x37, 0xcc, 0xf3, 0x4a, 0xe0, 0x0f, 0x40, 0x0a, 0x61, 0x56, 0xc8, + 0x17, 0x23, 0xd2, 0xca, 0x2e, 0xc3, 0x9f, 0x4b, 0x00, 0xc8, 0xe5, 0x72, 0x69, 0x28, 0x00, 0x7c, + 0xe7, 0xcf, 0x03, 0xc0, 0x8d, 0x29, 0x3e, 0x29, 0x93, 0x32, 0x2b, 0xb4, 0x74, 0x20, 0x57, 0x4b, + 0xd9, 0x1a, 0x37, 0x9d, 0xd5, 0xba, 0x28, 0xb7, 0xa9, 0x9b, 0x22, 0x52, 0x15, 0x94, 0xa9, 0x32, + 0x93, 0x02, 0x5b, 0x5d, 0x63, 0xf6, 0xb2, 0xa4, 0xa2, 0x7a, 0xaa, 0x68, 0xe9, 0x62, 0x70, 0x5e, + 0x32, 0xc3, 0x69, 0x5d, 0x97, 0x87, 0x5a, 0xed, 0x1e, 0xd6, 0xe5, 0x25, 0xa9, 0xc9, 0xe4, 0x60, + 0xe7, 0xaa, 0x1a, 0x85, 0x2a, 0xad, 0x89, 0xd9, 0x3c, 0x92, 0xc7, 0xe1, 0x23, 0x31, 0xbd, 0xa8, + 0x8a, 0xc5, 0x9e, 0xce, 0x66, 0x6b, 0x37, 0xec, 0x0e, 0x5d, 0xe4, 0xfc, 0xc5, 0x56, 0x0e, 0x15, + 0xc0, 0xeb, 0xa2, 0xe9, 0x12, 0x00, 0xa1, 0x50, 0x48, 0x03, 0xba, 0x64, 0x3f, 0x07, 0x40, 0x59, + 0x59, 0x19, 0x25, 0x24, 0xa6, 0xd0, 0xe9, 0xcc, 0x73, 0x14, 0x5d, 0x61, 0xa1, 0x3c, 0x9d, 0x87, + 0x8a, 0xda, 0x02, 0x54, 0x62, 0x70, 0xd3, 0x21, 0x00, 0x28, 0x68, 0xb6, 0x53, 0x25, 0xf2, 0xa5, + 0xd2, 0xd8, 0x47, 0xa9, 0x25, 0x6a, 0x2a, 0x6b, 0x32, 0x13, 0x76, 0x98, 0x19, 0x7b, 0xfc, 0xac, + 0xb5, 0xcb, 0x4d, 0x16, 0x67, 0x80, 0xf5, 0xf8, 0x49, 0x6a, 0xe9, 0xe8, 0x65, 0x85, 0x55, 0x6a, + 0x66, 0xb4, 0xbb, 0x42, 0xbd, 0x01, 0xf2, 0xd9, 0x3d, 0x82, 0x90, 0x5f, 0x59, 0x2f, 0x1e, 0x3e, + 0x96, 0x40, 0x87, 0x22, 0xa3, 0x4d, 0x83, 0x38, 0x1f, 0x87, 0xbe, 0x64, 0xfb, 0xf8, 0xe3, 0x8f, + 0x7b, 0x90, 0x41, 0xaf, 0x5d, 0x02, 0xc0, 0xe5, 0x72, 0x99, 0x51, 0x03, 0xe2, 0xcf, 0x01, 0xc0, + 0xa9, 0x34, 0x33, 0x33, 0x9b, 0x8e, 0xfe, 0x18, 0x4f, 0xc9, 0x65, 0x3a, 0x92, 0xeb, 0x7d, 0xe1, + 0xa6, 0xc5, 0xb9, 0x3d, 0x32, 0x4d, 0x41, 0x65, 0xfa, 0x3e, 0xd6, 0xd8, 0x85, 0x1a, 0xe8, 0xf2, + 0xb1, 0xec, 0x8a, 0x26, 0xaa, 0x33, 0x3a, 0xc8, 0xd0, 0xed, 0x25, 0x83, 0x7d, 0x80, 0xf4, 0x5d, + 0xfd, 0x64, 0xe9, 0xf3, 0xb2, 0xbe, 0x00, 0x49, 0x6d, 0x5d, 0x7d, 0xac, 0xbc, 0xbe, 0x19, 0xe7, + 0xcc, 0xe7, 0x0c, 0x52, 0xc8, 0xdc, 0xe3, 0x16, 0x53, 0x73, 0x8a, 0xd9, 0xba, 0x75, 0xbb, 0xa9, + 0x45, 0x63, 0xc8, 0x18, 0x04, 0x80, 0x12, 0xe9, 0xd3, 0x0e, 0xbd, 0xd4, 0x10, 0x2e, 0xe2, 0x8b, + 0x01, 0xa0, 0x40, 0x7a, 0xd1, 0xb8, 0x7e, 0x16, 0x00, 0x4e, 0xa5, 0xd5, 0xd5, 0xd5, 0x14, 0x15, + 0x73, 0x9a, 0x4e, 0x9e, 0xc9, 0xa3, 0xdc, 0x16, 0x17, 0x95, 0xb4, 0xf9, 0xc3, 0x29, 0x74, 0x38, + 0x5d, 0x41, 0x4a, 0xa3, 0x93, 0x35, 0xd9, 0xfd, 0x54, 0xdb, 0xde, 0x4b, 0x72, 0x25, 0x3a, 0x77, + 0x87, 0x93, 0xd9, 0x06, 0x04, 0x66, 0x75, 0xfa, 0xc9, 0xe4, 0x70, 0x51, 0x67, 0xbf, 0x8f, 0x75, + 0x7b, 0x43, 0xcc, 0x64, 0xef, 0x23, 0xb5, 0xae, 0x4d, 0x72, 0x87, 0xc8, 0x0f, 0x13, 0x5b, 0xda, + 0x3b, 0xa5, 0x03, 0x11, 0x31, 0xb4, 0x65, 0xcb, 0x01, 0xcf, 0x20, 0xce, 0xc7, 0xf3, 0xdd, 0x7f, + 0xe7, 0x9d, 0x77, 0x9c, 0x4f, 0x3e, 0xf9, 0xe4, 0x0b, 0x97, 0x01, 0x30, 0x9b, 0xcd, 0x01, 0x34, + 0xb2, 0x21, 0x01, 0x7c, 0xf7, 0xdd, 0x77, 0x74, 0xf8, 0xf0, 0xe1, 0x0b, 0x6b, 0x4c, 0x64, 0x34, + 0x7f, 0xfe, 0x02, 0xda, 0xbb, 0xef, 0x18, 0xc5, 0xa6, 0xe4, 0x53, 0x5c, 0xa9, 0x8e, 0x8e, 0x64, + 0x57, 0xd3, 0xb1, 0x8c, 0x32, 0x02, 0x35, 0x52, 0x42, 0x5e, 0x25, 0xa5, 0x16, 0x56, 0x53, 0xb6, + 0xa2, 0x8e, 0x14, 0xf5, 0x3a, 0x42, 0x9a, 0x90, 0xa9, 0x07, 0xe9, 0xd3, 0x3b, 0x40, 0x0e, 0xb7, + 0x9f, 0xba, 0x07, 0xfc, 0x64, 0xed, 0xe9, 0x27, 0xbd, 0xd5, 0x26, 0x7a, 0x44, 0x0a, 0xc0, 0xa4, + 0x94, 0xac, 0x73, 0xb4, 0x62, 0xf9, 0x77, 0x54, 0x59, 0x59, 0x93, 0x33, 0x08, 0x80, 0x1a, 0xd0, + 0x3c, 0xcf, 0xfd, 0x8a, 0x0b, 0x7d, 0x80, 0x03, 0x40, 0x41, 0x5a, 0x80, 0xac, 0xa5, 0xad, 0xad, + 0x8d, 0xd5, 0xd5, 0xd5, 0x49, 0xeb, 0xd6, 0xad, 0x63, 0xaf, 0xbf, 0xfe, 0x3a, 0xa1, 0x0b, 0x12, + 0xf8, 0x96, 0x26, 0x4f, 0x9e, 0x4c, 0x13, 0x27, 0x4e, 0x24, 0x8c, 0x8e, 0xc4, 0x7b, 0xc2, 0x8a, + 0x15, 0x2b, 0xc2, 0x29, 0x04, 0xbd, 0x44, 0x2d, 0x2d, 0x2d, 0xb4, 0x68, 0xd1, 0x37, 0x74, 0x20, + 0x22, 0x9a, 0x12, 0xb2, 0x4a, 0xa9, 0x08, 0x24, 0x1f, 0x5f, 0xd4, 0x88, 0x08, 0xf4, 0xb2, 0x16, + 0xbb, 0x8f, 0x35, 0x98, 0x7a, 0xa8, 0xb8, 0x56, 0x4b, 0xb5, 0xad, 0x16, 0xc4, 0xbe, 0x95, 0x90, + 0x22, 0x64, 0x73, 0x7a, 0xa8, 0xcf, 0x17, 0x62, 0x7d, 0xde, 0x20, 0x75, 0xf5, 0xbb, 0xc9, 0xd0, + 0x61, 0x63, 0xee, 0x90, 0x28, 0xe4, 0x15, 0x56, 0xb2, 0xb5, 0xab, 0x77, 0xd2, 0x9e, 0x3d, 0x47, + 0x74, 0x83, 0x38, 0x9f, 0x88, 0x26, 0xdb, 0x85, 0x21, 0xcb, 0xf5, 0x5b, 0x3c, 0x2e, 0x00, 0x40, + 0x2e, 0x85, 0x01, 0x70, 0x01, 0x67, 0x32, 0x99, 0x42, 0x90, 0x0f, 0xc1, 0x1b, 0x6e, 0xb8, 0x81, + 0xc9, 0x30, 0x2a, 0xfc, 0xd4, 0xae, 0xba, 0xea, 0x2a, 0x42, 0xe8, 0xc2, 0xe7, 0x18, 0xf6, 0xc9, + 0x62, 0xb1, 0x40, 0x91, 0xc6, 0xd1, 0x82, 0x05, 0x0b, 0x28, 0x22, 0x22, 0x92, 0x76, 0xef, 0x46, + 0x24, 0x92, 0xf3, 0x29, 0x19, 0xac, 0x73, 0xae, 0xc1, 0xc4, 0x4c, 0x6e, 0x92, 0xb4, 0x9d, 0x2e, + 0xce, 0x32, 0x54, 0xdd, 0x6c, 0xa4, 0x06, 0xbd, 0x85, 0xda, 0x6c, 0xbd, 0xe1, 0xdd, 0xef, 0xf1, + 0xf8, 0xa9, 0x3f, 0x10, 0xa2, 0x5e, 0x8f, 0x8f, 0x19, 0xac, 0x9d, 0x2c, 0xfe, 0x74, 0x16, 0x7d, + 0xbb, 0x6c, 0x2b, 0xbd, 0xfe, 0xfa, 0xdb, 0x41, 0x90, 0xc9, 0x89, 0x41, 0x00, 0xd4, 0xa1, 0x3e, + 0x79, 0xee, 0xe7, 0x5f, 0xd2, 0x89, 0xcf, 0x03, 0x40, 0xfe, 0x77, 0x62, 0x20, 0xf7, 0x20, 0x45, + 0x3c, 0xd7, 0x5d, 0x77, 0xdd, 0xa0, 0x00, 0xae, 0xbe, 0xfa, 0x6a, 0xe2, 0xe0, 0xf9, 0xf9, 0xa2, + 0x45, 0x8b, 0x08, 0x03, 0x3f, 0x61, 0x3a, 0x0b, 0x03, 0xfb, 0xfc, 0xf3, 0xcf, 0x41, 0xad, 0xb9, + 0x6c, 0xff, 0x81, 0xe3, 0xd2, 0xa6, 0xcd, 0xfb, 0x29, 0x26, 0x21, 0x87, 0x14, 0xea, 0x76, 0xc6, + 0xe9, 0xb2, 0xb4, 0xbe, 0x85, 0x6a, 0x34, 0x46, 0xd2, 0x59, 0xec, 0x8c, 0xa7, 0x8c, 0x3b, 0x28, + 0x31, 0x87, 0xcb, 0x43, 0xed, 0x36, 0x07, 0x14, 0x6d, 0x0d, 0x8b, 0x38, 0x14, 0x43, 0x2b, 0x57, + 0x7c, 0x47, 0xc7, 0x4f, 0x24, 0xd0, 0x9b, 0x6f, 0xbe, 0xeb, 0x1e, 0xc4, 0xf9, 0x24, 0x51, 0x14, + 0x6d, 0x98, 0x49, 0x3c, 0xd8, 0xc0, 0x71, 0x83, 0x02, 0xc0, 0xee, 0x0f, 0x78, 0xf0, 0x80, 0xee, + 0xe8, 0xbf, 0x12, 0x00, 0x9e, 0x52, 0xfc, 0xfc, 0xeb, 0xaf, 0xbf, 0xa6, 0xa8, 0xa8, 0x28, 0xfa, + 0xe2, 0x8b, 0x2f, 0xc2, 0x6b, 0xd0, 0x1a, 0x2f, 0xea, 0xe0, 0xfa, 0xf5, 0xeb, 0x85, 0x7f, 0xb9, + 0xf3, 0x6e, 0x5a, 0xbc, 0x78, 0x35, 0x5b, 0xb3, 0x66, 0x17, 0x1d, 0x3d, 0x91, 0x4c, 0x51, 0x71, + 0xe9, 0x94, 0x90, 0x22, 0x67, 0x69, 0x60, 0x17, 0x79, 0x71, 0x15, 0xcb, 0xcc, 0x2d, 0xa1, 0x23, + 0xc7, 0xe2, 0x69, 0xd5, 0x8a, 0xed, 0xb4, 0x6c, 0xe9, 0x16, 0xda, 0xbf, 0xff, 0x38, 0x29, 0x2a, + 0x55, 0x74, 0x36, 0xaf, 0x98, 0x56, 0xac, 0xdc, 0xcc, 0x1a, 0x1a, 0x1a, 0x92, 0x7e, 0x02, 0xa0, + 0x11, 0xea, 0xb7, 0x1d, 0xef, 0x9d, 0x76, 0x99, 0x98, 0xe3, 0x00, 0xb2, 0xb3, 0xb3, 0xad, 0x3a, + 0x9d, 0x0e, 0x29, 0x26, 0xf9, 0x22, 0x22, 0x22, 0x7a, 0xae, 0x04, 0x60, 0xd3, 0xa6, 0x4d, 0xe1, + 0xda, 0xe0, 0xce, 0x73, 0x4b, 0x4d, 0x4d, 0xa5, 0x77, 0xdf, 0x7d, 0x97, 0x4e, 0x9d, 0x3a, 0xc5, + 0xf8, 0x9a, 0xcb, 0x8d, 0x0f, 0x3f, 0xfc, 0x50, 0x40, 0x6a, 0xf9, 0xcf, 0x24, 0xa5, 0x04, 0x4f, + 0xc5, 0x25, 0x07, 0x17, 0xcc, 0x5f, 0x2e, 0x6d, 0xdc, 0xb8, 0x4b, 0x5c, 0xb8, 0x70, 0x35, 0x43, + 0x9a, 0xf0, 0x3c, 0x87, 0xbe, 0xda, 0x43, 0xaa, 0x06, 0x2d, 0x59, 0xbb, 0x7b, 0x49, 0xad, 0xd1, + 0x53, 0x4a, 0x66, 0x3e, 0x1d, 0x3a, 0x1c, 0x4b, 0x37, 0xdc, 0x30, 0x8a, 0xf1, 0x0f, 0x10, 0x2e, + 0x72, 0x3e, 0x45, 0x10, 0x04, 0x1b, 0x57, 0xa5, 0xa8, 0xc5, 0xdf, 0x0c, 0x0a, 0x20, 0x33, 0x33, + 0xd3, 0x8e, 0x39, 0x80, 0x0f, 0x30, 0xbe, 0x83, 0x07, 0x0f, 0xda, 0x47, 0x8e, 0x1c, 0x49, 0x43, + 0x01, 0x38, 0x71, 0xe2, 0x04, 0x41, 0x62, 0x53, 0x74, 0x74, 0x74, 0x18, 0x00, 0x38, 0x99, 0xf4, + 0x7a, 0x3d, 0x61, 0xd8, 0x0f, 0x03, 0x28, 0x2f, 0x2f, 0x27, 0x6c, 0xc4, 0x00, 0xc8, 0x20, 0x70, + 0xe8, 0xd0, 0x21, 0xc2, 0x6c, 0x11, 0x42, 0x6a, 0x0e, 0xa0, 0x73, 0x7a, 0x20, 0xc2, 0x44, 0x30, + 0x57, 0x30, 0x29, 0x29, 0x49, 0x40, 0x0f, 0x09, 0x55, 0xa8, 0x1a, 0xa8, 0x50, 0x51, 0x45, 0x7c, + 0x24, 0xad, 0x6d, 0xd6, 0x50, 0x6a, 0x96, 0x9c, 0x7e, 0xf7, 0xbb, 0xf7, 0xbc, 0xff, 0xed, 0xb8, + 0x14, 0x25, 0xfa, 0xfb, 0x39, 0x10, 0x4d, 0x4a, 0x4a, 0x4a, 0x3b, 0x5e, 0x7b, 0x72, 0x50, 0x39, + 0x8d, 0xb0, 0x6c, 0x85, 0xba, 0x74, 0xf6, 0xf6, 0xf6, 0x06, 0xf9, 0xf4, 0xb5, 0x7f, 0xff, 0x7e, + 0x27, 0x22, 0x30, 0x24, 0x00, 0xee, 0x38, 0xc6, 0x4b, 0xc2, 0x90, 0x4f, 0x19, 0x19, 0x19, 0x64, + 0x30, 0x18, 0xc2, 0x00, 0xf8, 0x88, 0xc9, 0x01, 0xa0, 0xb0, 0xf9, 0x7d, 0xdc, 0x88, 0xaa, 0xc8, + 0xd7, 0xe8, 0x1b, 0x8c, 0xaf, 0x51, 0x2f, 0xc1, 0x49, 0x93, 0x26, 0x11, 0x18, 0x4e, 0x00, 0x51, + 0x48, 0x00, 0xe8, 0xcb, 0xcd, 0x2d, 0x08, 0xfd, 0xf8, 0x63, 0x94, 0x98, 0x90, 0x94, 0x46, 0xda, + 0xb6, 0x36, 0x3a, 0x93, 0x7a, 0x36, 0xcc, 0x66, 0xc7, 0xb7, 0xcf, 0x11, 0xea, 0xf7, 0xde, 0xe1, + 0xb5, 0x9c, 0x7e, 0xce, 0x1a, 0x08, 0x04, 0x3a, 0xb1, 0xc9, 0x5e, 0x74, 0xdd, 0xbb, 0x86, 0x04, + 0x80, 0x1b, 0xfa, 0xfc, 0x7e, 0x3f, 0x7f, 0x63, 0xfb, 0xee, 0xdd, 0xbb, 0x85, 0x2b, 0x45, 0x00, + 0x8e, 0xb3, 0xac, 0xac, 0x2c, 0x91, 0x47, 0x02, 0xfd, 0x83, 0xd0, 0x37, 0x58, 0x63, 0x63, 0xa3, + 0x84, 0x5d, 0xe5, 0xe9, 0x23, 0x71, 0x67, 0x07, 0xf0, 0xc0, 0x10, 0x14, 0x06, 0x64, 0x34, 0x1a, + 0x05, 0xbe, 0xe6, 0x80, 0xce, 0x03, 0x00, 0x58, 0x86, 0xb4, 0x70, 0x43, 0x22, 0xfb, 0x11, 0x21, + 0x61, 0xe5, 0xca, 0x0d, 0x52, 0x4a, 0x86, 0x9c, 0x6a, 0x0b, 0x8f, 0x92, 0x72, 0xcf, 0xfd, 0xd4, + 0x16, 0x79, 0x1b, 0x39, 0x61, 0x6d, 0xdb, 0x64, 0x94, 0x79, 0x6c, 0xb1, 0x1d, 0x85, 0xfb, 0xc3, + 0x90, 0x13, 0x19, 0x07, 0x90, 0x98, 0xc8, 0x29, 0x56, 0x0a, 0xa2, 0x17, 0x58, 0x77, 0x62, 0xd2, + 0x1a, 0x2a, 0x02, 0xd7, 0x5c, 0x73, 0x0d, 0xad, 0x5c, 0xb9, 0x92, 0x71, 0xd6, 0x59, 0xbd, 0x7a, + 0x35, 0x43, 0xd1, 0x86, 0x40, 0xa7, 0xd2, 0x1f, 0x59, 0x28, 0x87, 0x21, 0xf7, 0x43, 0xc3, 0x86, + 0x0d, 0xa3, 0x59, 0xb3, 0x66, 0x11, 0x9c, 0xe6, 0xd1, 0xf1, 0x8e, 0x1a, 0x35, 0x8a, 0x71, 0xf6, + 0xe2, 0x00, 0xf0, 0x3a, 0x09, 0xd7, 0xf1, 0x74, 0xe5, 0x6c, 0xe3, 0x87, 0xa6, 0x12, 0x8e, 0xec, + 0xf8, 0x86, 0xa9, 0x7e, 0x78, 0x82, 0x5a, 0x4e, 0xbd, 0x42, 0xfe, 0xc6, 0x6d, 0x68, 0x57, 0x6f, + 0x52, 0x20, 0xf9, 0xdf, 0xa9, 0x6f, 0xcf, 0x48, 0x2a, 0x5d, 0x37, 0x82, 0x7d, 0xfc, 0xfa, 0x43, + 0x43, 0x7e, 0x58, 0x2c, 0x43, 0x68, 0x22, 0x4e, 0x9f, 0x3e, 0xcd, 0xc3, 0x2c, 0xc0, 0x0c, 0x7b, + 0xf7, 0xee, 0xf5, 0x5f, 0x09, 0x00, 0x66, 0xd4, 0x70, 0x81, 0x2f, 0x59, 0xb2, 0x84, 0x39, 0x1c, + 0x8e, 0xd0, 0xfc, 0xf9, 0xf3, 0xc3, 0xcf, 0xbd, 0xf8, 0xe2, 0x8b, 0x84, 0x2e, 0x29, 0x2c, 0x5c, + 0xb8, 0x30, 0xbc, 0x7e, 0xe8, 0xa1, 0x87, 0x78, 0x84, 0x78, 0x1a, 0x05, 0xf9, 0xfa, 0xce, 0x3b, + 0xef, 0x0c, 0x37, 0xc4, 0xaf, 0xbe, 0xfa, 0x8a, 0xa1, 0x1e, 0xfc, 0x48, 0x0d, 0x2f, 0x48, 0x4f, + 0x2c, 0xcc, 0x8e, 0x17, 0xcf, 0xad, 0x1a, 0x46, 0x3d, 0xa5, 0x73, 0x48, 0x1c, 0xd0, 0x13, 0xb9, + 0xd4, 0x44, 0xad, 0x9b, 0x49, 0x2a, 0x7e, 0x9e, 0xbc, 0x31, 0x77, 0x93, 0x65, 0xb3, 0x8c, 0xea, + 0x36, 0xcb, 0xb6, 0x0c, 0x09, 0x00, 0xc5, 0x81, 0xfa, 0x4b, 0xe7, 0x3b, 0xc2, 0xa7, 0x1f, 0x03, + 0x2f, 0xe2, 0xa1, 0x58, 0x88, 0x03, 0x40, 0x37, 0x16, 0xf9, 0x39, 0x86, 0x9e, 0x90, 0xd3, 0xe9, + 0x0c, 0x2c, 0x5f, 0xbe, 0x3c, 0xc4, 0xd7, 0xe8, 0xdc, 0xe1, 0xf4, 0x39, 0x72, 0xe4, 0x88, 0x9f, + 0xaf, 0x1f, 0x7c, 0xf0, 0x41, 0x0e, 0x48, 0xdc, 0xb3, 0x67, 0x4f, 0xf8, 0xfa, 0x5b, 0x6f, 0xbd, + 0x35, 0x1c, 0x01, 0xd0, 0x2e, 0x43, 0x51, 0xfb, 0x50, 0x3b, 0x8c, 0x77, 0x72, 0x14, 0xa8, 0xf4, + 0xfd, 0x97, 0x0f, 0x51, 0xdb, 0xa9, 0x71, 0x14, 0x6c, 0x8f, 0x21, 0x62, 0xb8, 0x8d, 0x3d, 0x93, + 0xa8, 0xe1, 0x4b, 0x0a, 0x65, 0x4f, 0x26, 0xf7, 0xa1, 0x7f, 0xa4, 0xe6, 0x4d, 0x32, 0xb1, 0x7e, + 0x93, 0xec, 0xc1, 0xa1, 0x22, 0x20, 0x07, 0x15, 0x8a, 0x48, 0x1f, 0x5e, 0x03, 0x7e, 0x34, 0x32, + 0x1f, 0x6a, 0x60, 0xc8, 0x4e, 0x0c, 0x16, 0x11, 0x38, 0x10, 0xfe, 0x69, 0x05, 0x77, 0xb8, 0xa4, + 0xa4, 0xc4, 0xcb, 0xff, 0x0f, 0x81, 0xc7, 0xb5, 0xbb, 0x1b, 0x33, 0xb4, 0xef, 0xda, 0x6b, 0xaf, + 0x45, 0x43, 0x7a, 0x53, 0xe2, 0x1f, 0xf8, 0xa2, 0x3e, 0xd8, 0xed, 0xb7, 0xdf, 0xce, 0x78, 0x5d, + 0x01, 0x04, 0x03, 0x01, 0x04, 0x51, 0x73, 0x2c, 0x26, 0x26, 0x86, 0x7a, 0x7a, 0x7a, 0x58, 0x71, + 0x71, 0x31, 0x7b, 0x79, 0xfa, 0x0b, 0x52, 0xd6, 0x8a, 0x1b, 0x43, 0xee, 0x8a, 0xcf, 0x49, 0xe8, + 0x2e, 0x83, 0x17, 0x56, 0x22, 0xd3, 0x21, 0xe8, 0xce, 0x99, 0xe4, 0x4f, 0xbc, 0x9f, 0x1c, 0xdf, + 0x0f, 0xa7, 0xea, 0xf5, 0x32, 0xe8, 0x1f, 0xd9, 0x55, 0x97, 0x01, 0x40, 0x81, 0xec, 0x02, 0x2d, + 0xfa, 0xd0, 0x07, 0x44, 0x38, 0x13, 0xc4, 0xe8, 0x18, 0x18, 0xaa, 0x88, 0xaf, 0xbf, 0xfe, 0x7a, + 0x1a, 0x33, 0x66, 0x4c, 0xf8, 0x88, 0x7e, 0x10, 0x82, 0xa0, 0x0b, 0x70, 0xe3, 0x80, 0xa0, 0x8f, + 0x82, 0xfc, 0x1c, 0x11, 0x91, 0x6e, 0xb9, 0xe5, 0x16, 0xf6, 0xe9, 0xa7, 0x9f, 0x86, 0xde, 0x7a, + 0xeb, 0x2d, 0xb6, 0x74, 0xe9, 0x52, 0x81, 0x4b, 0x8d, 0xd1, 0xa3, 0x47, 0xd3, 0x88, 0x11, 0x23, + 0x68, 0xc3, 0x86, 0x0d, 0x41, 0xd4, 0x91, 0xc8, 0x47, 0x53, 0xc8, 0x17, 0x01, 0xef, 0xc9, 0xbb, + 0xbb, 0x74, 0x6a, 0xcf, 0xdc, 0x5a, 0xd5, 0xae, 0xdb, 0xc8, 0xaf, 0xdd, 0x45, 0x92, 0xdf, 0x46, + 0xe4, 0x84, 0xbf, 0xda, 0x55, 0x24, 0x16, 0x4c, 0x21, 0xcf, 0xf1, 0x3b, 0x48, 0xbf, 0x41, 0x46, + 0x95, 0xeb, 0x65, 0x5f, 0x0c, 0x16, 0x01, 0xde, 0xc8, 0xb8, 0x1a, 0xad, 0x42, 0x03, 0x49, 0x85, + 0x23, 0x7a, 0xec, 0xe0, 0x65, 0x11, 0xe0, 0x75, 0x81, 0x6e, 0x2b, 0xa1, 0x48, 0xc3, 0xbb, 0x09, + 0x09, 0xc1, 0x60, 0x12, 0x3a, 0x72, 0x38, 0x22, 0x9f, 0x7d, 0xf6, 0x59, 0x68, 0xee, 0xdc, 0xb9, + 0x41, 0xa4, 0x88, 0x70, 0xe3, 0x8d, 0x37, 0x32, 0x44, 0x20, 0xf4, 0xde, 0x7b, 0xef, 0x89, 0x48, + 0x39, 0x36, 0x6d, 0xda, 0x34, 0x5a, 0xb3, 0x66, 0x4d, 0x58, 0x24, 0xbe, 0xfd, 0xf6, 0xdb, 0xfc, + 0x5a, 0x11, 0x8c, 0xc5, 0xc0, 0x42, 0x0c, 0x00, 0x18, 0x36, 0x51, 0x54, 0xa9, 0x54, 0x49, 0x19, + 0x1b, 0x27, 0x58, 0x3b, 0xd2, 0x9e, 0xa3, 0xa0, 0x35, 0x05, 0x6d, 0xc0, 0x4f, 0xd4, 0x99, 0x08, + 0x05, 0xf4, 0x21, 0x05, 0xd3, 0xc7, 0x93, 0x73, 0xff, 0x28, 0xaa, 0x59, 0x2b, 0x73, 0x2b, 0xd7, + 0xca, 0x7e, 0x3d, 0x24, 0x00, 0xde, 0x40, 0xd0, 0x98, 0x12, 0xa7, 0x4c, 0x99, 0x62, 0xc4, 0xff, + 0xf9, 0xd0, 0x6c, 0x81, 0x75, 0xc3, 0xdc, 0xef, 0xbf, 0xff, 0x7e, 0x00, 0xb5, 0x22, 0x3d, 0xfe, + 0xf8, 0xe3, 0x22, 0x1c, 0x92, 0x00, 0x96, 0x53, 0x21, 0x2f, 0x7e, 0xc6, 0x77, 0x96, 0xd7, 0x03, + 0xce, 0xb9, 0x86, 0x77, 0x73, 0x30, 0x4f, 0x3c, 0xf1, 0x84, 0xc8, 0xe9, 0x93, 0xaf, 0x91, 0xef, + 0x12, 0xd8, 0x28, 0x80, 0x9a, 0x08, 0xf2, 0x7b, 0xf0, 0x5e, 0x82, 0xbe, 0xc0, 0xbc, 0x5e, 0x2f, + 0xc3, 0x0c, 0xce, 0xa0, 0x71, 0x06, 0x10, 0x8d, 0xe8, 0x12, 0x79, 0x4a, 0xad, 0xfc, 0xf7, 0xa3, + 0x24, 0x6f, 0xed, 0x32, 0x12, 0x9d, 0xf5, 0xb8, 0x1b, 0x44, 0xa9, 0x71, 0x17, 0xb1, 0xb2, 0xe9, + 0xe4, 0x8b, 0xfb, 0x37, 0xb2, 0x6e, 0xbe, 0x9a, 0x4a, 0x56, 0xc9, 0xe2, 0xaf, 0x08, 0x00, 0xa2, + 0xee, 0x24, 0x86, 0xf7, 0x22, 0xe4, 0xf4, 0x65, 0x36, 0x61, 0xc2, 0x84, 0x8e, 0x71, 0xe3, 0xc6, + 0xf5, 0x54, 0x56, 0x56, 0x36, 0xe1, 0x8d, 0xfb, 0xf0, 0x3a, 0x06, 0x85, 0x48, 0xc3, 0x87, 0x0f, + 0xe7, 0x0d, 0x8c, 0x41, 0x70, 0x71, 0x40, 0x38, 0x88, 0x41, 0xec, 0xb4, 0x88, 0x7b, 0x8b, 0xc8, + 0x75, 0x1f, 0xf4, 0x95, 0x00, 0x89, 0x22, 0xc2, 0x71, 0x3f, 0x5f, 0xe3, 0xe8, 0xeb, 0xec, 0xec, + 0xf4, 0x82, 0x89, 0x18, 0x9f, 0xad, 0x67, 0xcc, 0x98, 0xd1, 0x87, 0xd7, 0x45, 0x77, 0x75, 0x75, + 0x75, 0xae, 0xfe, 0x64, 0xb2, 0x5b, 0x7d, 0xf0, 0x6e, 0x0a, 0xe8, 0x23, 0x89, 0x09, 0x60, 0xda, + 0x9e, 0x02, 0xa2, 0xa6, 0x6f, 0x48, 0xc8, 0xfd, 0x2d, 0x0d, 0x1c, 0xb9, 0x9d, 0xd4, 0x6b, 0x64, + 0x54, 0xb8, 0x42, 0x36, 0x6d, 0x48, 0x00, 0x70, 0x2c, 0x15, 0xbb, 0x6c, 0x1e, 0xcc, 0xa0, 0xc5, + 0x35, 0xa0, 0xbe, 0x98, 0xf3, 0x3a, 0x05, 0x8e, 0xc6, 0x60, 0x86, 0x28, 0xc4, 0x84, 0xe4, 0xe3, + 0x60, 0xb8, 0x33, 0xfc, 0x43, 0x31, 0xbe, 0xe3, 0x28, 0x50, 0x61, 0xf1, 0xe2, 0xc5, 0xd2, 0xcc, + 0x99, 0x33, 0x19, 0x1c, 0x64, 0xd3, 0xa7, 0x4f, 0x67, 0x5c, 0x43, 0xf1, 0xe8, 0x61, 0x2d, 0x80, + 0xff, 0x39, 0x09, 0x48, 0x5c, 0x82, 0xa0, 0x56, 0x3a, 0x71, 0x5e, 0x02, 0x76, 0x32, 0x3d, 0xf2, + 0xc8, 0x23, 0xf6, 0x98, 0xcf, 0x64, 0x75, 0x0e, 0xf9, 0x1b, 0x14, 0xb2, 0xe5, 0x11, 0x85, 0x80, + 0xcd, 0x02, 0x75, 0x5d, 0x33, 0x2b, 0xdc, 0x1b, 0x7a, 0x76, 0x8e, 0xa4, 0x92, 0xe5, 0x32, 0x53, + 0xfa, 0x5a, 0xd9, 0xc8, 0x30, 0x00, 0x14, 0xd0, 0x56, 0x74, 0xd6, 0x0b, 0x00, 0xfe, 0xa7, 0x86, + 0x94, 0x4a, 0x01, 0xeb, 0x58, 0x78, 0x67, 0x45, 0x1a, 0x06, 0x90, 0xd3, 0xa2, 0x5c, 0x2e, 0x67, + 0x58, 0x33, 0x30, 0x93, 0x00, 0xca, 0x14, 0x90, 0x26, 0x62, 0x30, 0x18, 0x64, 0xd8, 0x04, 0xc2, + 0x51, 0x00, 0xf3, 0xf1, 0x8f, 0x2f, 0xd9, 0xb2, 0x65, 0xcb, 0x5a, 0x70, 0x8f, 0x8e, 0x39, 0x73, + 0xe6, 0xd8, 0x1e, 0x7e, 0xf8, 0xe1, 0xd9, 0xb3, 0xc6, 0xcb, 0x5e, 0x91, 0xff, 0xfe, 0x57, 0x82, + 0xaf, 0x71, 0x23, 0x49, 0xe1, 0xde, 0x80, 0x74, 0x6a, 0xdd, 0x84, 0xde, 0x30, 0x95, 0xbc, 0xd1, + 0x77, 0x51, 0xeb, 0x3a, 0x19, 0xe5, 0x2e, 0x91, 0x6d, 0xfb, 0x29, 0x00, 0x74, 0x10, 0x4a, 0xfd, + 0xdf, 0x1a, 0x80, 0x14, 0xc3, 0xf9, 0x5e, 0x48, 0x8c, 0x10, 0x4a, 0x20, 0x2c, 0x51, 0x90, 0x1a, + 0x1e, 0xad, 0x56, 0xeb, 0xe1, 0x8d, 0x4e, 0xa1, 0x50, 0x70, 0x40, 0x12, 0x76, 0x9b, 0x37, 0x42, + 0xfe, 0x29, 0x9f, 0x84, 0x02, 0xb7, 0x41, 0x72, 0xb4, 0xa3, 0x6e, 0x0c, 0xfc, 0xfb, 0x0a, 0x90, + 0xc6, 0x98, 0x1d, 0xb3, 0x64, 0x3f, 0x68, 0xa2, 0x1e, 0x41, 0x6f, 0xe0, 0x7a, 0x0e, 0x99, 0x69, + 0xc7, 0x7c, 0xaf, 0x46, 0x6f, 0xc8, 0x9a, 0x4c, 0x7d, 0x07, 0x6f, 0xa1, 0x82, 0xa5, 0x57, 0x89, + 0x79, 0xcb, 0x64, 0x0f, 0xc9, 0xf0, 0xa2, 0xe5, 0xc8, 0x6f, 0x2b, 0xff, 0x32, 0x0f, 0x6f, 0xf8, + 0x8b, 0x19, 0x52, 0xc8, 0xc1, 0x27, 0x3c, 0x38, 0x2a, 0xb9, 0x5c, 0x2e, 0x91, 0x77, 0x5d, 0x58, + 0x00, 0xcf, 0x79, 0xf1, 0x5c, 0x00, 0xa0, 0xf8, 0x73, 0x22, 0xc4, 0xa3, 0x1f, 0xfa, 0x6b, 0xe0, + 0xa3, 0x8f, 0x3e, 0xb2, 0x8f, 0x1f, 0x3f, 0xfe, 0x8d, 0xf0, 0xae, 0xca, 0x64, 0xd7, 0x8c, 0xbe, + 0x51, 0xf6, 0x48, 0xfc, 0x97, 0x57, 0x5b, 0xfb, 0xcb, 0xfe, 0xd8, 0x1b, 0xc4, 0xd6, 0xbd, 0xa4, + 0x3b, 0x76, 0x3f, 0xa5, 0x2f, 0xbd, 0x99, 0x0e, 0x2c, 0x7d, 0xde, 0x96, 0xb0, 0x56, 0x36, 0x9c, + 0xf7, 0x81, 0xdb, 0x21, 0x0f, 0x4a, 0xc0, 0x3c, 0x36, 0x6e, 0xd0, 0x46, 0x17, 0x0c, 0x5d, 0xfa, + 0x12, 0x43, 0xbd, 0x5c, 0x62, 0x78, 0xed, 0x25, 0x86, 0x68, 0x5e, 0x30, 0x6c, 0xcc, 0x79, 0x73, + 0x72, 0x46, 0xc2, 0xf5, 0x12, 0xf2, 0x5f, 0x04, 0xe3, 0x88, 0x90, 0x1d, 0xc1, 0xa9, 0x53, 0xa7, + 0xfa, 0xb8, 0x7d, 0xf0, 0xc1, 0x07, 0x03, 0xe8, 0x09, 0x56, 0x5c, 0xd3, 0x04, 0xc7, 0x2f, 0x34, + 0x2a, 0x3c, 0x46, 0xcd, 0x7b, 0x4e, 0x36, 0xbb, 0x74, 0xcb, 0x6d, 0xe4, 0x69, 0xdc, 0x4e, 0x9a, + 0xec, 0xf5, 0x94, 0xbe, 0xe2, 0x6e, 0x4a, 0x8b, 0x98, 0x43, 0xc7, 0xa3, 0x4e, 0x42, 0x14, 0x6e, + 0x69, 0xfd, 0xab, 0xfd, 0xd4, 0x80, 0xa7, 0xc5, 0xc4, 0x89, 0x13, 0x3f, 0x79, 0xec, 0xb1, 0xc7, + 0xba, 0xd0, 0xc9, 0x3b, 0x40, 0xb9, 0xd6, 0x3f, 0x7c, 0xa1, 0x02, 0x8a, 0x21, 0x1b, 0x84, 0x5f, + 0xcf, 0xa3, 0x8f, 0x3e, 0x3a, 0xfd, 0xb2, 0x26, 0x25, 0x93, 0xdd, 0x15, 0xf1, 0xae, 0x2c, 0x3d, + 0x69, 0xd1, 0x4d, 0x62, 0x6d, 0xe6, 0x7a, 0xd2, 0xea, 0x35, 0x54, 0x58, 0xa6, 0xa4, 0xe3, 0xd1, + 0x09, 0xf4, 0xed, 0xb7, 0x2b, 0x16, 0xfe, 0xd5, 0x7f, 0x2b, 0x31, 0x76, 0xec, 0xd8, 0x11, 0xa0, + 0xe2, 0x6f, 0x00, 0xc4, 0x09, 0x8d, 0x64, 0x41, 0x4a, 0x59, 0x41, 0xc9, 0x46, 0x30, 0x9c, 0x72, + 0x50, 0x9d, 0x23, 0x93, 0x0d, 0x7f, 0x70, 0xb4, 0xec, 0xf1, 0x09, 0x63, 0x7f, 0xf5, 0xd4, 0xf7, + 0x3b, 0x77, 0xc6, 0xc7, 0x25, 0x24, 0xda, 0x22, 0x22, 0x8f, 0xb4, 0xcd, 0x9d, 0x3b, 0x6f, 0xcd, + 0xf9, 0x68, 0xfd, 0x4d, 0x7e, 0xa0, 0x81, 0x74, 0xb9, 0x01, 0xc2, 0x6e, 0x03, 0xa2, 0xe2, 0xc5, + 0x71, 0x00, 0xa0, 0x26, 0x0c, 0xa9, 0x36, 0x65, 0xb2, 0x61, 0xb0, 0x11, 0xb0, 0x3b, 0x60, 0xff, + 0xca, 0x0b, 0x1c, 0x76, 0xed, 0xdf, 0xc5, 0xaf, 0x55, 0x1e, 0x78, 0xe0, 0x81, 0xe1, 0x3f, 0xfd, + 0xc2, 0xe2, 0xcf, 0xb5, 0xff, 0x02, 0x32, 0xee, 0xa6, 0x45, 0xe4, 0x1e, 0x1c, 0xf3, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE icon_gerbview_xpm[1] = {{ png, sizeof( png ), "icon_gerbview_xpm" }}; diff --git a/bitmaps_png/cpp_48/icon_kicad.cpp b/bitmaps_png/cpp_48/icon_kicad.cpp index 1f3faa7a5c..356d5bc4fa 100644 --- a/bitmaps_png/cpp_48/icon_kicad.cpp +++ b/bitmaps_png/cpp_48/icon_kicad.cpp @@ -8,150 +8,148 @@ static const unsigned char png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, - 0x87, 0x00, 0x00, 0x08, 0xdd, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x9a, 0x7b, 0x70, 0xd4, - 0xd5, 0x15, 0xc7, 0x3f, 0xf7, 0xb7, 0xef, 0x4d, 0x36, 0x4f, 0x76, 0x09, 0x81, 0x54, 0xe3, 0x23, - 0x8a, 0xbc, 0x44, 0x50, 0x08, 0x19, 0x2b, 0x38, 0x88, 0xa2, 0x62, 0xa7, 0xce, 0xd8, 0xd1, 0x3a, - 0x32, 0x2a, 0x15, 0xa8, 0x0f, 0xd4, 0x76, 0x6a, 0xa5, 0x76, 0xb4, 0x0c, 0x8f, 0x8e, 0xa3, 0x08, - 0x3e, 0x80, 0x16, 0x14, 0xa8, 0x4a, 0x9d, 0x5a, 0xc5, 0xb1, 0x38, 0x6a, 0xb4, 0x88, 0x55, 0x29, - 0xa9, 0x42, 0x19, 0x14, 0x2d, 0x6d, 0xa4, 0x80, 0x26, 0x46, 0x24, 0xca, 0xee, 0x66, 0xf3, 0xd8, - 0xec, 0xee, 0x3d, 0xfd, 0x23, 0x6c, 0xf2, 0xdb, 0xf7, 0x2e, 0x4d, 0xa6, 0xf6, 0x37, 0x73, 0x66, - 0x7e, 0x7b, 0x9f, 0xe7, 0x75, 0xbf, 0xe7, 0x9c, 0xfb, 0x5b, 0x25, 0x22, 0xfc, 0x3f, 0x3f, 0xd6, - 0xe4, 0x86, 0xf7, 0xd6, 0xa9, 0x72, 0x97, 0x85, 0xe1, 0x83, 0xb9, 0x49, 0xd4, 0x20, 0x34, 0xe5, - 0x47, 0xd2, 0x92, 0x6d, 0xcc, 0xfb, 0x1b, 0x54, 0x9d, 0x45, 0x30, 0x72, 0xad, 0x15, 0xb1, 0xd3, - 0x33, 0xf5, 0x46, 0x39, 0x1c, 0xff, 0xad, 0xe2, 0x16, 0xd8, 0xb9, 0x51, 0x79, 0xac, 0x31, 0x16, - 0xa3, 0x58, 0x04, 0x14, 0x0d, 0x81, 0xb2, 0x3e, 0x14, 0x78, 0xbe, 0xc7, 0xca, 0xca, 0xe9, 0x37, - 0x4a, 0x8f, 0xb9, 0xa3, 0x69, 0x83, 0x7a, 0x44, 0x29, 0xee, 0x2e, 0x60, 0xad, 0x9d, 0xdd, 0xad, - 0x4c, 0x9f, 0xfe, 0x80, 0x44, 0xfb, 0x25, 0x56, 0x31, 0xee, 0xd4, 0xb0, 0x58, 0x0b, 0x45, 0x5a, - 0x60, 0x08, 0x68, 0xbc, 0x08, 0xcb, 0x9c, 0x11, 0x76, 0xbc, 0xbb, 0x49, 0x79, 0x93, 0x18, 0xaa, - 0x2f, 0x70, 0xad, 0x06, 0xfb, 0x48, 0xbe, 0x9b, 0xe8, 0x42, 0xc2, 0xbc, 0xf8, 0x69, 0x70, 0x94, - 0x4d, 0xc0, 0xe2, 0x1c, 0x31, 0xa8, 0xea, 0xef, 0x69, 0x7f, 0x17, 0x1d, 0xed, 0x44, 0x60, 0xaa, - 0x35, 0xc2, 0xdf, 0x76, 0xad, 0x57, 0x97, 0xd7, 0xcf, 0x97, 0x03, 0x00, 0xa2, 0x59, 0x22, 0x8a, - 0x17, 0x01, 0x77, 0xbe, 0xeb, 0x29, 0x8d, 0x3d, 0x41, 0x00, 0x2d, 0xf4, 0x73, 0xec, 0x39, 0x6d, - 0x21, 0xc5, 0xd5, 0x57, 0x0d, 0xaa, 0x00, 0xe1, 0xc0, 0x7e, 0xbe, 0x7c, 0x7f, 0x2e, 0xb1, 0x9e, - 0xa3, 0x00, 0xb5, 0xc0, 0xae, 0x9d, 0xeb, 0xd5, 0xd5, 0x0d, 0xf3, 0x65, 0x47, 0xfd, 0x02, 0x79, - 0xfd, 0xaf, 0x1b, 0xd4, 0x74, 0xad, 0xd9, 0x06, 0x85, 0x9d, 0xbf, 0x7e, 0x17, 0x12, 0x6d, 0x26, - 0x41, 0x44, 0xb0, 0x58, 0x2c, 0xb8, 0x5c, 0xae, 0xbc, 0x48, 0x02, 0x47, 0x39, 0xbe, 0xfb, 0x75, - 0x08, 0x7d, 0x9d, 0xd2, 0x67, 0xb5, 0x5a, 0xb1, 0x97, 0x8c, 0xa1, 0xba, 0xe1, 0x15, 0x6c, 0xc5, - 0xa3, 0xe3, 0xfb, 0x94, 0xe9, 0x18, 0x8d, 0xef, 0xae, 0x55, 0x37, 0x02, 0x4c, 0xbb, 0x45, 0x3e, - 0x88, 0x0a, 0x53, 0x45, 0xf8, 0x44, 0x04, 0x72, 0x51, 0x8a, 0x00, 0x89, 0x3e, 0x26, 0x68, 0xad, - 0xb1, 0xd9, 0x6c, 0x78, 0x3c, 0x9e, 0xbc, 0xa8, 0xe3, 0x40, 0x13, 0x7b, 0x57, 0xce, 0xa7, 0xe7, - 0xc8, 0x47, 0x29, 0x7d, 0xe5, 0xe5, 0xe5, 0x38, 0x9d, 0x4e, 0x2c, 0xce, 0x2a, 0x46, 0x34, 0x6c, - 0xc5, 0xe9, 0xbd, 0x28, 0xbe, 0x97, 0x4d, 0xc3, 0xa6, 0xb7, 0xd7, 0xaa, 0x65, 0xa0, 0xd4, 0xf4, - 0x85, 0x72, 0x38, 0x6c, 0x30, 0x4d, 0x60, 0x7b, 0x2e, 0x01, 0xa2, 0xb1, 0x64, 0x0b, 0x24, 0x0c, - 0x90, 0x82, 0x29, 0xae, 0x96, 0x74, 0xf3, 0x01, 0x4a, 0x4a, 0x4a, 0x28, 0x2a, 0x2a, 0x02, 0xc3, - 0x8d, 0xef, 0xfc, 0x8d, 0x78, 0xbe, 0xf3, 0xc3, 0x01, 0x6d, 0x0a, 0xf7, 0xbd, 0xbd, 0x86, 0xdf, - 0xbf, 0xf6, 0xb8, 0x72, 0xcc, 0x9c, 0x2f, 0x81, 0x22, 0x83, 0xd9, 0x31, 0xcd, 0x26, 0xad, 0x21, - 0x13, 0x65, 0xb5, 0x80, 0x99, 0x89, 0xc1, 0x7c, 0x8a, 0x8b, 0x8b, 0x29, 0x2d, 0x2d, 0x45, 0x29, - 0x2b, 0x95, 0xe3, 0x56, 0x50, 0x7e, 0xf6, 0xbd, 0x68, 0x51, 0xf1, 0x7d, 0xaf, 0x75, 0x28, 0xb6, - 0xbf, 0xbd, 0x5e, 0x0d, 0x9b, 0x34, 0x5f, 0x22, 0x33, 0x6e, 0x93, 0x9b, 0x11, 0x7e, 0x69, 0xd6, - 0x4f, 0x56, 0x17, 0x32, 0x77, 0x6a, 0xad, 0xd1, 0x5a, 0x17, 0x66, 0x85, 0xfe, 0x75, 0xb2, 0x8f, - 0x73, 0xb9, 0x5c, 0x54, 0x54, 0x54, 0xa0, 0x94, 0xa2, 0xf4, 0xf4, 0x05, 0xf8, 0xce, 0x7b, 0x02, - 0x94, 0x23, 0xbe, 0x77, 0x43, 0x2c, 0x4c, 0xd3, 0xf6, 0x35, 0xaa, 0x0e, 0x60, 0xfa, 0xed, 0xb2, - 0x5c, 0x84, 0xeb, 0xb5, 0x10, 0x4e, 0x86, 0xd2, 0x58, 0x34, 0x4f, 0x0b, 0x14, 0xe4, 0x46, 0x27, - 0xf0, 0x38, 0xd7, 0x38, 0x9b, 0xcd, 0x46, 0x65, 0x65, 0x25, 0x86, 0x61, 0xe0, 0xae, 0xba, 0x8c, - 0xaa, 0xa9, 0x5b, 0x50, 0xb6, 0x8a, 0xf8, 0xfe, 0xa7, 0xeb, 0x18, 0xbb, 0xde, 0x7c, 0x5c, 0x5d, - 0x04, 0x70, 0xf1, 0x1d, 0xf2, 0x9c, 0x08, 0x33, 0x45, 0xf8, 0x3a, 0xc9, 0x0a, 0x92, 0x19, 0x85, - 0x52, 0x98, 0x1a, 0x82, 0x1c, 0xc6, 0x6a, 0xc5, 0xeb, 0xf5, 0x62, 0xb7, 0xdb, 0x71, 0x94, 0x9d, - 0x4b, 0x75, 0xc3, 0x8b, 0x58, 0xdd, 0xa7, 0xc5, 0x79, 0xa8, 0x90, 0x18, 0x6f, 0x34, 0xae, 0x56, - 0x37, 0x00, 0xcc, 0x5c, 0x24, 0xef, 0x49, 0x5f, 0xb0, 0xdb, 0xaf, 0x05, 0xd1, 0xc2, 0xc1, 0x88, - 0xc1, 0xae, 0xcc, 0x28, 0xa4, 0x25, 0x6f, 0x17, 0xea, 0x68, 0x3d, 0x48, 0xd3, 0xf2, 0xb9, 0x1c, - 0x7a, 0x6d, 0x33, 0x00, 0xcd, 0x2f, 0xad, 0xa5, 0x69, 0xf9, 0x5c, 0xba, 0xda, 0xbf, 0xc8, 0x39, - 0x57, 0x29, 0x45, 0x65, 0x65, 0x65, 0x1f, 0xd4, 0xba, 0x46, 0x51, 0xdd, 0xf0, 0x3c, 0x8e, 0x8a, - 0xf3, 0xe3, 0x7c, 0xd8, 0x45, 0x78, 0xba, 0x71, 0x95, 0x5a, 0x02, 0x70, 0xc9, 0x22, 0x69, 0x9e, - 0x75, 0xa7, 0x8c, 0x0b, 0xf8, 0x71, 0x56, 0xba, 0x18, 0x3d, 0xfb, 0x0e, 0x09, 0x26, 0xe4, 0x42, - 0xaf, 0x3d, 0xa2, 0x7a, 0x00, 0x07, 0xc0, 0xf0, 0xf3, 0x56, 0x51, 0x5c, 0x7d, 0x39, 0x1e, 0x8f, - 0x87, 0xb2, 0xb2, 0xb2, 0xac, 0x9a, 0xfc, 0xe6, 0xc0, 0x07, 0xec, 0xb8, 0xeb, 0xe2, 0x94, 0xf6, - 0x59, 0x1b, 0xf6, 0xe0, 0xa9, 0xa9, 0xcb, 0xdb, 0x22, 0x81, 0x40, 0x80, 0x60, 0x30, 0x88, 0xe8, - 0x08, 0x5f, 0xed, 0x5b, 0x4c, 0xa8, 0x75, 0x9b, 0xb9, 0x7b, 0x4b, 0xa8, 0x83, 0x9b, 0xaf, 0x79, - 0x40, 0x7a, 0x33, 0x06, 0xb2, 0xc4, 0x33, 0x50, 0xb8, 0xef, 0xd7, 0x5e, 0x31, 0x8f, 0xcb, 0x36, - 0xef, 0xa7, 0x66, 0xc6, 0x35, 0x79, 0x1d, 0xe6, 0x64, 0x2a, 0x29, 0x29, 0xa1, 0xbc, 0xbc, 0x1c, - 0x65, 0xd8, 0xf0, 0x9d, 0xfb, 0x10, 0x65, 0x67, 0xdc, 0x6a, 0xe6, 0xe9, 0x7a, 0xb7, 0x87, 0x3f, - 0x37, 0xae, 0x52, 0x15, 0x99, 0x23, 0x71, 0x02, 0x0a, 0x49, 0x41, 0x48, 0x04, 0x60, 0x73, 0x7b, - 0x70, 0xf9, 0x6a, 0xb0, 0xba, 0x8a, 0x4f, 0x4a, 0x00, 0x11, 0xc1, 0xed, 0x76, 0x33, 0x6c, 0xd8, - 0x30, 0x94, 0x52, 0x94, 0xd7, 0xdd, 0x81, 0x6f, 0xc2, 0xaf, 0x01, 0x6b, 0x1f, 0x5f, 0x9a, 0x0b, - 0x23, 0x31, 0x9a, 0xfe, 0xb4, 0x4a, 0x9d, 0x31, 0x24, 0x16, 0x18, 0x40, 0xae, 0x7e, 0x2c, 0x3a, - 0x29, 0x21, 0xec, 0x76, 0x3b, 0x3e, 0x9f, 0x0f, 0xc3, 0x30, 0x28, 0xaa, 0xbe, 0x8a, 0xaa, 0x0b, - 0xd6, 0x83, 0xd5, 0x13, 0xe7, 0xed, 0x4c, 0xa2, 0x34, 0xbd, 0xf2, 0x90, 0x3a, 0x2f, 0xab, 0x05, - 0x86, 0x2a, 0x90, 0x15, 0x82, 0x50, 0xc3, 0x87, 0x0f, 0xc7, 0x6e, 0xb7, 0xe3, 0xac, 0xb8, 0x80, - 0x91, 0xf5, 0x5b, 0xb0, 0x3a, 0x47, 0xc6, 0x79, 0xab, 0x8c, 0x69, 0x1e, 0x4c, 0xb5, 0x40, 0x42, - 0xa8, 0x2e, 0xc0, 0x7d, 0x4c, 0x32, 0x26, 0x08, 0x7c, 0x92, 0xb1, 0x24, 0x4e, 0x86, 0x61, 0xe0, - 0xf3, 0xf9, 0x70, 0xb9, 0x5c, 0xd8, 0x8a, 0x6a, 0x19, 0x31, 0xe5, 0xa9, 0x01, 0xfe, 0x84, 0x99, - 0x2f, 0xad, 0x50, 0x63, 0x13, 0xd2, 0xe9, 0x84, 0xbd, 0x25, 0xff, 0x58, 0x10, 0x8f, 0xc1, 0x47, - 0xde, 0x7c, 0x96, 0xd6, 0x77, 0xb6, 0x12, 0xed, 0x0e, 0x25, 0x9c, 0x81, 0xc1, 0x48, 0x3f, 0x42, - 0xa1, 0x10, 0xca, 0xea, 0x49, 0xe0, 0x51, 0x19, 0x8c, 0x02, 0xf6, 0x9b, 0xeb, 0x01, 0x06, 0xde, - 0xa5, 0x80, 0x60, 0xa6, 0x30, 0x6c, 0x0e, 0x22, 0x21, 0x3f, 0xbd, 0x81, 0x76, 0x0c, 0xab, 0x0d, - 0xc3, 0xe6, 0x00, 0xd4, 0xa0, 0x08, 0x60, 0xe6, 0xc3, 0xcc, 0xa3, 0xa8, 0xa4, 0xa2, 0x5e, 0x92, - 0x5c, 0xc1, 0xec, 0x46, 0xd9, 0x9e, 0xd2, 0x33, 0x27, 0x72, 0xf9, 0x0b, 0xad, 0x7c, 0xfa, 0xe2, - 0xa3, 0x1c, 0x78, 0x7a, 0x29, 0xf5, 0x2b, 0xb6, 0x51, 0x7e, 0xd6, 0xe4, 0x54, 0x97, 0x32, 0x17, - 0xc7, 0x4f, 0xdc, 0xcd, 0x37, 0x9f, 0xec, 0x3a, 0xd1, 0x7f, 0x22, 0x2f, 0xe8, 0x7f, 0xef, 0x63, - 0xa6, 0xaa, 0xfe, 0x4a, 0xce, 0xb9, 0x69, 0x49, 0x92, 0x6b, 0x99, 0x6f, 0x0a, 0x92, 0x04, 0x38, - 0x79, 0x0b, 0x24, 0x69, 0x20, 0x8f, 0x39, 0xdd, 0xed, 0x2d, 0x84, 0x5a, 0x3f, 0x3d, 0x61, 0x40, - 0x85, 0x52, 0x06, 0x28, 0x05, 0x28, 0x94, 0x52, 0x88, 0x8e, 0xf1, 0xef, 0x97, 0xd7, 0x12, 0xf6, - 0x7f, 0xc5, 0x59, 0xf3, 0x1f, 0xea, 0x57, 0x66, 0x02, 0x8f, 0xe4, 0xb0, 0x40, 0xa1, 0x02, 0xc4, - 0x47, 0xfd, 0xfd, 0xe1, 0x5b, 0x30, 0xec, 0xce, 0xac, 0x63, 0x2d, 0x76, 0x17, 0x00, 0x33, 0x7e, - 0xbb, 0x07, 0x97, 0xaf, 0x26, 0xa5, 0xbf, 0xeb, 0xe8, 0x67, 0x34, 0xdd, 0x77, 0x15, 0xad, 0x7f, - 0x79, 0x81, 0x9e, 0xc0, 0x37, 0x78, 0xaf, 0x5f, 0x9a, 0x6a, 0x81, 0x6c, 0x2e, 0x64, 0xce, 0x85, - 0xb4, 0xb9, 0x7a, 0x48, 0xd2, 0xb8, 0x8e, 0xf6, 0xa2, 0x0c, 0x03, 0x65, 0xb1, 0xf5, 0x0b, 0x1a, - 0xed, 0x0e, 0x61, 0x44, 0xc2, 0xd9, 0xeb, 0x58, 0x9b, 0x03, 0x80, 0xb6, 0x5d, 0xdb, 0x70, 0x94, - 0x7a, 0x51, 0x86, 0x05, 0x0c, 0xa3, 0x6f, 0x2d, 0x65, 0xd0, 0x75, 0xf4, 0x08, 0x61, 0xff, 0x57, - 0xa0, 0x14, 0xe5, 0x63, 0xa6, 0x81, 0x61, 0x41, 0xa2, 0x92, 0x50, 0xc8, 0xa8, 0x64, 0x0b, 0xc4, - 0x04, 0x94, 0xe4, 0x6f, 0x81, 0xce, 0xd6, 0x4f, 0x79, 0xef, 0xce, 0x0b, 0xa9, 0x6a, 0xf8, 0x1e, - 0x13, 0xee, 0xfe, 0x0d, 0xdd, 0x47, 0x8f, 0x00, 0x30, 0xf6, 0xf6, 0xc7, 0xf0, 0x4d, 0xbe, 0x24, - 0xab, 0x00, 0x7b, 0x96, 0x5d, 0x47, 0x07, 0x70, 0x60, 0xf3, 0xaf, 0xb2, 0x0a, 0x39, 0xfe, 0xae, - 0xb5, 0x94, 0x4d, 0xbc, 0x84, 0xb6, 0xb6, 0xb6, 0x13, 0x0a, 0x35, 0x29, 0x39, 0xc5, 0x02, 0x1a, - 0x53, 0x51, 0x92, 0x1b, 0x46, 0xc5, 0xe4, 0xf3, 0x6d, 0x3b, 0x5f, 0xa6, 0x75, 0xc7, 0x1f, 0x50, - 0x16, 0x1b, 0x45, 0xd5, 0xa7, 0xe5, 0x74, 0xbb, 0xea, 0x19, 0xd7, 0xf6, 0x69, 0x56, 0x6b, 0x44, - 0xfa, 0x88, 0x98, 0xe9, 0x5d, 0x6b, 0xbc, 0xe7, 0x5f, 0x4a, 0x59, 0xdd, 0x24, 0x7a, 0x7a, 0x7a, - 0xd2, 0xa2, 0x90, 0xca, 0xee, 0x42, 0x3a, 0x27, 0x0a, 0xc5, 0xdb, 0xbb, 0x8e, 0x1e, 0xe6, 0xa3, - 0xd5, 0xb7, 0x62, 0x71, 0x15, 0x71, 0xee, 0xcf, 0x7f, 0x87, 0xab, 0xaa, 0x36, 0xa7, 0x00, 0xc3, - 0xeb, 0xe7, 0x14, 0x0c, 0xa1, 0xc9, 0x67, 0x20, 0x16, 0xcd, 0x7a, 0x88, 0x07, 0x26, 0x7f, 0xfe, - 0xc6, 0xd3, 0x69, 0x17, 0xef, 0xf5, 0x1f, 0x03, 0x20, 0x78, 0xf0, 0x43, 0xec, 0xa5, 0x5e, 0x26, - 0xfe, 0xe2, 0x59, 0x3c, 0xa7, 0x8e, 0x19, 0xf4, 0xf4, 0xc3, 0x0c, 0xe9, 0x5a, 0xb2, 0x5c, 0xee, - 0xea, 0x0c, 0x28, 0x74, 0xe0, 0xc9, 0xc5, 0x39, 0xe2, 0x98, 0x62, 0xf2, 0x92, 0xad, 0xb8, 0x47, - 0xd4, 0x0e, 0x49, 0x5e, 0x94, 0xc9, 0x02, 0x2a, 0x5f, 0x14, 0x1a, 0xbb, 0x68, 0x4d, 0xfa, 0x9b, - 0xb6, 0xe3, 0x5f, 0xd2, 0xfc, 0xcc, 0x52, 0x10, 0xe1, 0xd0, 0xd6, 0x47, 0x19, 0xbd, 0xf0, 0xe1, - 0x3e, 0x34, 0x19, 0x32, 0x21, 0x12, 0x95, 0x4c, 0x2c, 0x4f, 0x0b, 0xf8, 0x32, 0xf8, 0x6b, 0xd7, - 0x17, 0x07, 0x69, 0x7e, 0x66, 0x29, 0xb6, 0xe2, 0x32, 0xda, 0xde, 0x79, 0x81, 0x48, 0x57, 0x90, - 0xb1, 0x8b, 0xd6, 0x62, 0xd8, 0xec, 0x83, 0xca, 0x7c, 0xc2, 0x79, 0xcc, 0x06, 0xa3, 0xe6, 0xce, - 0x42, 0x82, 0x58, 0xf9, 0x98, 0x69, 0x44, 0xbb, 0x43, 0xb4, 0xef, 0x7e, 0x83, 0x7d, 0x0f, 0xce, - 0x65, 0xfc, 0xcf, 0x36, 0x62, 0x71, 0xa4, 0xbf, 0xa3, 0xed, 0x6c, 0x69, 0xa6, 0xe5, 0xf5, 0x8d, - 0x85, 0xa5, 0xd6, 0x15, 0xd5, 0xc8, 0xb8, 0xcb, 0xfa, 0xad, 0x20, 0x99, 0x72, 0x21, 0x9d, 0xc1, - 0x85, 0xcc, 0x42, 0xa8, 0xb8, 0xe3, 0x99, 0x8f, 0x80, 0x61, 0x61, 0xc2, 0x3d, 0x9b, 0xd9, 0xbf, - 0xfa, 0xc7, 0x1c, 0xdb, 0xdd, 0x88, 0xff, 0x93, 0x26, 0x2a, 0x27, 0x5e, 0x9c, 0xfe, 0x86, 0xfa, - 0xeb, 0x56, 0xda, 0xf7, 0x6e, 0xa7, 0x7a, 0xc6, 0x75, 0x79, 0x0b, 0xa0, 0xdc, 0x25, 0xc4, 0xd2, - 0xc0, 0x68, 0x3c, 0x97, 0xc8, 0x89, 0x42, 0x69, 0xb1, 0x1f, 0x70, 0x56, 0x9d, 0xca, 0x85, 0x4f, - 0x7e, 0x84, 0xb2, 0xd8, 0xc0, 0xb0, 0xe0, 0xab, 0x9f, 0xc3, 0xb1, 0xdd, 0x8d, 0xe8, 0x58, 0x24, - 0xb3, 0xe5, 0x44, 0x70, 0x54, 0x8c, 0x60, 0xd4, 0xec, 0x9b, 0xf9, 0xc7, 0xba, 0x9f, 0xf6, 0x37, - 0x9f, 0x39, 0xf7, 0x7e, 0x9c, 0xde, 0x1a, 0x3e, 0x7f, 0x75, 0x03, 0x5d, 0x6d, 0x87, 0x12, 0x93, - 0xc5, 0xda, 0xf1, 0xf4, 0xa4, 0x41, 0x21, 0xc9, 0x17, 0x85, 0x32, 0xbb, 0x91, 0xc2, 0xe2, 0xf2, - 0xa4, 0xe4, 0xfe, 0xf1, 0x9b, 0xed, 0xcc, 0xf9, 0x9e, 0x29, 0xf3, 0x4c, 0xda, 0xaf, 0xeb, 0xcb, - 0xc3, 0x84, 0x8e, 0x7c, 0x9c, 0x30, 0xc7, 0x7d, 0xc6, 0x24, 0xc4, 0x5d, 0x5d, 0x60, 0x2e, 0x24, - 0x92, 0x57, 0x2a, 0x7d, 0xd2, 0x25, 0xa3, 0xbb, 0x84, 0xb1, 0x3f, 0xd9, 0x90, 0xd2, 0x5e, 0x77, - 0xd3, 0xb2, 0x54, 0xb0, 0xe8, 0xea, 0x22, 0xf4, 0xd9, 0x67, 0xa9, 0x30, 0x1a, 0xfb, 0xaf, 0x2d, - 0x70, 0x62, 0x6c, 0x34, 0x42, 0xa0, 0x79, 0x0f, 0x9d, 0x2d, 0xff, 0x02, 0x20, 0xd4, 0xf2, 0x4f, - 0x2c, 0x6e, 0x0f, 0xc5, 0xa7, 0x9c, 0x83, 0xd5, 0x5d, 0x92, 0x5a, 0xbd, 0x09, 0xf4, 0x06, 0xda, - 0x89, 0x84, 0xfc, 0xfd, 0xed, 0x8e, 0x8a, 0x2a, 0x2c, 0xce, 0x81, 0xcf, 0x72, 0xc1, 0xe6, 0x3d, - 0xe8, 0x68, 0xa4, 0x6f, 0x8e, 0xbb, 0x22, 0x6d, 0x20, 0x93, 0xac, 0x28, 0xa4, 0xf3, 0x47, 0xa1, - 0x48, 0xa7, 0x9f, 0x7d, 0xcb, 0x07, 0x0e, 0xe5, 0xe1, 0x3f, 0xae, 0x04, 0x60, 0xc2, 0x7d, 0xcf, - 0x51, 0x36, 0x7a, 0x6a, 0xda, 0x39, 0x47, 0x5e, 0x5e, 0x43, 0x6b, 0xe3, 0xa6, 0xfe, 0xdf, 0xa3, - 0x6f, 0x7b, 0x2c, 0x01, 0xae, 0x3f, 0x5e, 0xbd, 0x90, 0xde, 0x40, 0x3b, 0x00, 0x55, 0x97, 0xce, - 0x43, 0x26, 0x5d, 0xdd, 0xc7, 0x8f, 0xce, 0xe2, 0x42, 0x3a, 0x83, 0x0b, 0xe5, 0x12, 0xc2, 0x70, - 0xb8, 0xa9, 0xfd, 0xc1, 0x3d, 0x29, 0xed, 0x4e, 0x6f, 0x4d, 0xca, 0x5c, 0xc3, 0xe1, 0xc6, 0xe1, - 0x1d, 0xc5, 0xb0, 0xc9, 0xb3, 0x70, 0x0e, 0x1b, 0x39, 0x50, 0xf7, 0x26, 0xa5, 0x20, 0xde, 0x29, - 0x57, 0x12, 0xed, 0xee, 0x00, 0xa0, 0xe8, 0x94, 0x73, 0x08, 0xa4, 0x2b, 0x29, 0x75, 0x9e, 0x05, - 0x4d, 0xae, 0xc7, 0xe2, 0x70, 0x53, 0x33, 0x67, 0x61, 0x5e, 0xbe, 0x5f, 0x5a, 0x37, 0x99, 0xd2, - 0xba, 0xbe, 0x72, 0xb3, 0xf4, 0xec, 0x29, 0x19, 0xc7, 0x9d, 0x7e, 0xc3, 0xfd, 0x03, 0xb1, 0xa3, - 0xb3, 0x93, 0xe3, 0x87, 0x0e, 0xa5, 0xa4, 0xd3, 0x59, 0x73, 0xa1, 0xf8, 0xe5, 0x56, 0x38, 0x1c, - 0xc6, 0xef, 0xf7, 0xff, 0x4f, 0xbf, 0xc4, 0x87, 0xc3, 0xe1, 0xb4, 0xe9, 0xb4, 0xa1, 0xf2, 0xb0, - 0x40, 0x30, 0x18, 0x24, 0x18, 0x0c, 0x7e, 0x2b, 0xfe, 0x52, 0x90, 0x8c, 0x42, 0xd1, 0x34, 0x28, - 0xd4, 0x1b, 0xbf, 0x9d, 0xee, 0x38, 0xb6, 0x9b, 0x68, 0xf8, 0xf8, 0xb7, 0xea, 0x3f, 0x11, 0x3a, - 0xd6, 0x9b, 0x9c, 0x4e, 0x87, 0x93, 0x2d, 0xf0, 0x0e, 0x70, 0x05, 0x80, 0xbf, 0xe5, 0x2d, 0xfc, - 0xbc, 0x35, 0xc8, 0x2a, 0x1c, 0xd4, 0xd5, 0x82, 0x2a, 0xcc, 0xee, 0x84, 0xab, 0xc5, 0x58, 0x94, - 0x5b, 0x04, 0x5e, 0x15, 0x21, 0x96, 0xcf, 0x77, 0xda, 0x82, 0x89, 0x41, 0xa3, 0x7d, 0x22, 0x7c, - 0xff, 0x9e, 0xa7, 0xa4, 0x23, 0xe1, 0x03, 0x47, 0xfc, 0x59, 0xb1, 0x40, 0x8d, 0x30, 0x0c, 0x66, - 0xa3, 0xb0, 0x7f, 0x9b, 0x5c, 0x48, 0xf5, 0x1d, 0x81, 0xf7, 0xef, 0x5d, 0x27, 0x7b, 0xcd, 0xed, - 0xff, 0x01, 0xf0, 0x3e, 0x79, 0xb4, 0x19, 0x63, 0x64, 0xed, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + 0x87, 0x00, 0x00, 0x08, 0xbc, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x99, 0x7b, 0x70, 0xd4, + 0xd5, 0x15, 0xc7, 0x3f, 0xf7, 0xb7, 0xbf, 0xdd, 0x6c, 0x36, 0x64, 0xf3, 0xd8, 0x6c, 0xb2, 0x1b, + 0x90, 0xa7, 0xad, 0x0f, 0x94, 0x42, 0x29, 0xcf, 0x58, 0x8c, 0xc5, 0x16, 0x33, 0x36, 0x8e, 0x7d, + 0x30, 0x2a, 0xf8, 0xb6, 0x2d, 0x6a, 0xc5, 0x3a, 0x5a, 0x9d, 0x0a, 0xad, 0x1d, 0x75, 0x98, 0xc1, + 0x57, 0x1d, 0xa5, 0xc2, 0x48, 0xc8, 0xd0, 0x51, 0x74, 0xb4, 0xa0, 0xd5, 0x82, 0x40, 0x3b, 0xd2, + 0x32, 0x45, 0x41, 0xa8, 0x5a, 0xed, 0xd4, 0xf0, 0xe8, 0x50, 0x12, 0xa1, 0x96, 0x24, 0xc0, 0xc2, + 0x86, 0x25, 0xcb, 0x3e, 0xee, 0xe9, 0x1f, 0x9b, 0x7d, 0xb1, 0xbb, 0xd9, 0x07, 0x30, 0x83, 0x67, + 0xe6, 0x37, 0x49, 0xee, 0xef, 0xfe, 0xee, 0x39, 0xe7, 0x9e, 0xf3, 0x3d, 0xe7, 0x7b, 0x6f, 0x94, + 0x88, 0xf0, 0xf7, 0x36, 0x35, 0x49, 0x1b, 0x3c, 0x8a, 0xd0, 0xc2, 0xd9, 0x91, 0x00, 0x8a, 0x8d, + 0xa2, 0xf9, 0x83, 0xb3, 0x9a, 0xd5, 0x17, 0xcf, 0x96, 0x50, 0xea, 0xcb, 0x8e, 0xd5, 0xca, 0xd6, + 0xe7, 0x67, 0x35, 0xc2, 0x35, 0x45, 0xac, 0xf9, 0x1f, 0x25, 0xfc, 0x5c, 0x6d, 0x7b, 0x91, 0x29, + 0x28, 0x3e, 0x28, 0xd5, 0x32, 0x29, 0xfe, 0x93, 0xf7, 0x25, 0xca, 0xf7, 0xa7, 0xdf, 0x29, 0x3d, + 0xf1, 0x81, 0xad, 0x6d, 0x6a, 0x92, 0x01, 0x3b, 0x4a, 0x50, 0xdf, 0x69, 0x68, 0x61, 0xbe, 0x16, + 0x28, 0xf5, 0x91, 0xe2, 0x9f, 0x26, 0x0c, 0x76, 0x6c, 0x5b, 0xae, 0x2e, 0x8d, 0x5b, 0x31, 0xfd, + 0xc7, 0x7c, 0xa8, 0x61, 0x47, 0x09, 0xfa, 0x6b, 0x4c, 0x81, 0x6f, 0xc4, 0xb7, 0xb1, 0xbc, 0xfe, + 0x0a, 0x3c, 0x53, 0x56, 0xe5, 0x74, 0x57, 0x29, 0x55, 0x72, 0x0e, 0xf5, 0xed, 0x7f, 0x9d, 0x43, + 0x9f, 0x3e, 0x84, 0xe8, 0x30, 0xc0, 0x08, 0x81, 0xad, 0xef, 0xbd, 0xa8, 0xe6, 0x5c, 0x36, 0x4f, + 0xd6, 0x82, 0x48, 0x99, 0xa8, 0x2b, 0x82, 0xc2, 0x2a, 0xe0, 0x7b, 0xc5, 0xac, 0x6b, 0xa4, 0xef, + 0xa6, 0x24, 0x9e, 0xac, 0xe9, 0x92, 0xf2, 0xbe, 0x98, 0x47, 0x6b, 0x4d, 0xc5, 0xd0, 0xd9, 0x34, + 0x4c, 0x7d, 0x1d, 0x65, 0xad, 0x8d, 0xeb, 0x1b, 0x22, 0xc2, 0x5b, 0x5b, 0x96, 0xa9, 0x07, 0x01, + 0x26, 0xfe, 0x44, 0x4e, 0x34, 0xcd, 0xe3, 0x07, 0x22, 0x2c, 0x2e, 0x34, 0x9a, 0x08, 0xa8, 0xcd, + 0x4b, 0xd9, 0xa5, 0xe0, 0x02, 0x00, 0x47, 0x7d, 0x33, 0x9e, 0x29, 0x2f, 0x03, 0xe0, 0x76, 0xbb, + 0xb1, 0x58, 0x2c, 0x05, 0xef, 0xc4, 0x5b, 0x3f, 0x1c, 0x8e, 0xc5, 0x66, 0xa7, 0xf5, 0xd5, 0x3d, + 0x19, 0xef, 0xc2, 0xe1, 0x30, 0x3e, 0x9f, 0x0f, 0xad, 0x35, 0x91, 0x13, 0xfb, 0x39, 0xb8, 0xe3, + 0x16, 0x42, 0x7d, 0xff, 0x4e, 0x6e, 0x8c, 0xe2, 0x77, 0x6e, 0x17, 0xf3, 0xe2, 0xe0, 0xfe, 0xdb, + 0x52, 0x75, 0x33, 0x8a, 0x36, 0xc0, 0x96, 0x47, 0xed, 0x31, 0x43, 0x32, 0x72, 0xba, 0xb4, 0x5d, + 0x8e, 0x86, 0x4e, 0x12, 0x0d, 0x05, 0xb3, 0xbe, 0x33, 0x4d, 0x13, 0x97, 0xcb, 0x85, 0x69, 0x9a, + 0x58, 0xca, 0x87, 0xe1, 0x6d, 0x7a, 0x1b, 0x7b, 0xdd, 0xe5, 0x49, 0x9d, 0x9a, 0x5b, 0x7b, 0x7a, + 0xd9, 0xb4, 0x65, 0x89, 0x72, 0x03, 0xcc, 0xb8, 0x5b, 0x5e, 0xd2, 0xc2, 0x4c, 0x11, 0x0e, 0xe5, + 0x8b, 0x82, 0x91, 0x36, 0xa0, 0x63, 0xe1, 0xd6, 0x5a, 0x9f, 0xf1, 0x3a, 0x6a, 0x18, 0x06, 0xb5, + 0xb5, 0xb5, 0x94, 0x95, 0x95, 0xa1, 0x2c, 0x15, 0x78, 0x26, 0xaf, 0xc4, 0x39, 0xe2, 0x56, 0x44, + 0x13, 0x7f, 0x2e, 0x8b, 0x28, 0xb6, 0x6f, 0x7e, 0x5e, 0x5d, 0x02, 0xd0, 0x7c, 0xb7, 0xbc, 0xa7, + 0x34, 0x93, 0xb5, 0xd0, 0x31, 0x18, 0x90, 0x8d, 0x94, 0x05, 0x06, 0x1c, 0x29, 0x2d, 0x02, 0xf1, + 0x82, 0x3a, 0xf8, 0x1c, 0xa8, 0xae, 0xae, 0xc6, 0xe1, 0x70, 0xa0, 0x45, 0x51, 0x3b, 0xf6, 0xd7, + 0xb8, 0x2e, 0x79, 0x1c, 0xb0, 0xc4, 0x37, 0x71, 0x94, 0x56, 0x6c, 0xfd, 0xeb, 0x12, 0x75, 0x35, + 0xc0, 0x8c, 0x7b, 0x64, 0x5f, 0x50, 0x33, 0x0d, 0xcd, 0xc6, 0x9c, 0x11, 0xd0, 0x83, 0xa4, 0xd0, + 0xd9, 0x12, 0xa7, 0xd3, 0x49, 0x75, 0x75, 0x35, 0x00, 0x95, 0x23, 0xe6, 0xd2, 0x30, 0x79, 0x25, + 0x98, 0xce, 0xb8, 0x0d, 0x95, 0x51, 0xe1, 0x8f, 0x9b, 0x9e, 0x57, 0xf7, 0x03, 0xb4, 0xcc, 0x17, + 0xff, 0x21, 0x0f, 0xdf, 0x05, 0x96, 0x64, 0x75, 0x80, 0xb4, 0x81, 0x74, 0xe3, 0x8b, 0x8b, 0x40, + 0x71, 0x95, 0xaa, 0xbc, 0xbc, 0x1c, 0x97, 0xcb, 0x85, 0x52, 0x0a, 0x7b, 0x5d, 0x13, 0x43, 0x9b, + 0xd6, 0x60, 0x3a, 0x86, 0xc7, 0x6d, 0x31, 0xb4, 0xf0, 0xcc, 0xbb, 0xcf, 0xab, 0xf6, 0x8f, 0x96, + 0x2b, 0xeb, 0xec, 0xd9, 0x12, 0xfd, 0xd6, 0x3d, 0x72, 0xaf, 0xc0, 0xdd, 0x5a, 0x88, 0xa4, 0x6c, + 0x78, 0xc0, 0x88, 0xa6, 0x46, 0x40, 0x93, 0xc0, 0x40, 0xf1, 0x29, 0x54, 0x7c, 0xa9, 0xb5, 0x5a, + 0xad, 0x89, 0x6a, 0x67, 0x71, 0x8c, 0xc2, 0x3b, 0xfd, 0x0d, 0xca, 0x6a, 0x27, 0x27, 0xec, 0x89, + 0x6a, 0x6e, 0x3f, 0x74, 0x82, 0x77, 0xd7, 0x3d, 0xa3, 0xea, 0x00, 0xae, 0x9c, 0x2f, 0xcb, 0xb4, + 0xa6, 0x45, 0x84, 0x4f, 0x44, 0xd8, 0x29, 0x9a, 0x9f, 0xa9, 0x0d, 0xbf, 0x61, 0x17, 0xf1, 0x32, + 0xea, 0x9e, 0x81, 0x77, 0xca, 0x0a, 0x00, 0xbc, 0x5e, 0x2f, 0xa6, 0x69, 0xe6, 0x4d, 0x87, 0x3f, + 0xdd, 0x31, 0x9e, 0xa0, 0xaf, 0x87, 0xf0, 0x89, 0x3e, 0x00, 0xac, 0x8e, 0x4a, 0xec, 0x35, 0xf5, + 0xcc, 0x6a, 0xff, 0xa4, 0xe0, 0x94, 0xd2, 0x5a, 0x73, 0xe4, 0xc8, 0x11, 0xfa, 0xfb, 0xfb, 0x11, + 0x89, 0xd0, 0xfb, 0xcf, 0x47, 0xe8, 0xdb, 0xbf, 0x26, 0x8d, 0xf7, 0x88, 0xa6, 0xb5, 0xe5, 0x01, + 0xe9, 0xc8, 0x28, 0x0e, 0x49, 0xf0, 0x96, 0x06, 0xe0, 0x50, 0xc0, 0x4f, 0x38, 0xe0, 0xc7, 0xb0, + 0x98, 0x18, 0x16, 0x93, 0x70, 0xc0, 0x4f, 0x28, 0xe0, 0x2f, 0x6a, 0x0d, 0xa5, 0x14, 0x2e, 0x97, + 0x8b, 0x21, 0x43, 0x86, 0x00, 0x16, 0xdc, 0xe3, 0x16, 0x51, 0x7b, 0xe1, 0x43, 0x68, 0x8c, 0x78, + 0x34, 0x46, 0x8b, 0x62, 0xdb, 0x86, 0x67, 0x54, 0x06, 0xd9, 0x34, 0xa2, 0x64, 0x07, 0x71, 0xa1, + 0xe9, 0x00, 0x60, 0x58, 0xcb, 0xb8, 0x76, 0xed, 0x61, 0xae, 0x5d, 0x7b, 0x18, 0xc3, 0x5a, 0x56, + 0x72, 0xd7, 0xae, 0xaa, 0xaa, 0xa2, 0xa6, 0xa6, 0x06, 0x80, 0xaa, 0xd1, 0xb7, 0xe3, 0x99, 0xf8, + 0x5b, 0x94, 0xc5, 0x11, 0xdf, 0x60, 0xa7, 0x86, 0xb5, 0xef, 0x3c, 0xad, 0xee, 0x4b, 0x73, 0xe0, + 0x54, 0x10, 0x17, 0x8b, 0x81, 0x38, 0x8f, 0x4a, 0xc3, 0xc2, 0x69, 0x94, 0x63, 0x87, 0xc3, 0x41, + 0x5d, 0x5d, 0x5d, 0x8c, 0x9b, 0xb9, 0x9b, 0x69, 0x9c, 0xfa, 0x0a, 0x16, 0xbb, 0x27, 0x6e, 0xa3, + 0x45, 0xe0, 0xd9, 0x75, 0x4f, 0xa9, 0xb6, 0x8f, 0x96, 0x2b, 0x6b, 0x06, 0x17, 0x2a, 0xa5, 0x13, + 0x9f, 0x0a, 0xde, 0xd3, 0xe5, 0x4d, 0x22, 0x82, 0xcd, 0x66, 0xc3, 0xe3, 0xf1, 0x60, 0x9a, 0x26, + 0xd6, 0xca, 0xaf, 0x32, 0x74, 0xfa, 0xef, 0xb1, 0x55, 0x8d, 0x4b, 0xda, 0x09, 0x3f, 0xfa, 0xe2, + 0x18, 0x7f, 0x5e, 0xf7, 0xa8, 0x72, 0x18, 0x99, 0xb5, 0xf5, 0xec, 0xf7, 0x81, 0x42, 0xc4, 0x62, + 0xb1, 0xd0, 0xd0, 0xd0, 0x80, 0xdd, 0x6e, 0xc7, 0xb0, 0xd5, 0xd2, 0x38, 0x75, 0x25, 0x15, 0xde, + 0x96, 0x84, 0x9d, 0x5a, 0x68, 0x8e, 0xda, 0x59, 0x6c, 0xea, 0x14, 0x3b, 0xf5, 0x40, 0x0a, 0x65, + 0xdb, 0xd1, 0xbc, 0x07, 0x9b, 0x53, 0xe6, 0x9e, 0x89, 0x0d, 0x50, 0x4a, 0xe1, 0x76, 0xbb, 0xf1, + 0xf9, 0x7c, 0xf8, 0xfd, 0x42, 0xc3, 0xf8, 0x27, 0x89, 0x86, 0x8e, 0x13, 0xe8, 0xd9, 0x12, 0x9f, + 0x72, 0x8d, 0x19, 0xc7, 0x00, 0xc4, 0xe9, 0x84, 0x14, 0xe9, 0x80, 0x20, 0x91, 0x30, 0x5b, 0x1e, + 0x6a, 0x41, 0x59, 0x4c, 0x24, 0x12, 0x8e, 0x8d, 0x9d, 0xc1, 0x08, 0x56, 0x55, 0x55, 0x71, 0xf4, + 0xe8, 0xd1, 0x81, 0x82, 0x51, 0x4b, 0xca, 0xd2, 0xd5, 0x66, 0x2a, 0x6f, 0x8b, 0xa7, 0x50, 0xb1, + 0x11, 0x10, 0xd1, 0x1c, 0xe9, 0xf8, 0xe0, 0x8c, 0x47, 0x20, 0x1b, 0xbe, 0x62, 0xbf, 0x27, 0xdf, + 0x65, 0xa4, 0x50, 0xb1, 0x0e, 0x4c, 0x5f, 0xbc, 0x1e, 0x89, 0x46, 0xd8, 0xfc, 0xd3, 0x69, 0x54, + 0x8e, 0x1c, 0xcb, 0xc4, 0x07, 0x57, 0xc4, 0x22, 0x31, 0xc8, 0xb7, 0xbd, 0xff, 0xf8, 0x0b, 0x5d, + 0x1b, 0x56, 0x26, 0x1d, 0x1d, 0x20, 0x83, 0xc9, 0xdf, 0x63, 0xe3, 0xde, 0xa9, 0x57, 0x33, 0x7c, + 0xd6, 0xcd, 0x69, 0xb6, 0xc4, 0x81, 0x9c, 0x70, 0x20, 0x55, 0x8f, 0x08, 0x45, 0x63, 0xc0, 0xe1, + 0x19, 0x99, 0x04, 0x9e, 0xcd, 0x4e, 0xc5, 0xd0, 0xf3, 0xf3, 0x46, 0x20, 0x70, 0xb0, 0x8b, 0x83, + 0xdb, 0x37, 0xe4, 0x5d, 0xbb, 0xf7, 0xe3, 0x4d, 0x04, 0xba, 0xbb, 0xb8, 0x60, 0xee, 0x82, 0x94, + 0x8d, 0x25, 0x3d, 0x02, 0x51, 0x01, 0x95, 0x88, 0x40, 0x69, 0x29, 0x14, 0x97, 0xfe, 0xde, 0xfd, + 0x7c, 0xb6, 0x62, 0x61, 0xde, 0x79, 0xe1, 0x3e, 0x1f, 0x00, 0x0d, 0x53, 0x5a, 0x18, 0x71, 0xd5, + 0x6d, 0xa0, 0x14, 0xa0, 0x62, 0x67, 0x6e, 0x05, 0xa0, 0x08, 0x7c, 0xb1, 0x97, 0x8e, 0xf6, 0x85, + 0xec, 0x7d, 0xe3, 0x39, 0xfa, 0x7b, 0x0f, 0xe0, 0x6c, 0xbd, 0x1f, 0x65, 0x31, 0x63, 0x85, 0x26, + 0xd5, 0x01, 0x92, 0xbd, 0x28, 0x6b, 0x17, 0x2e, 0x46, 0x4e, 0xfa, 0x7a, 0xe8, 0x5c, 0xb7, 0x3c, + 0x3f, 0x9d, 0x1e, 0x39, 0x16, 0x00, 0xbb, 0xab, 0x91, 0xda, 0x4b, 0xa6, 0x83, 0x32, 0x50, 0xca, + 0x18, 0x70, 0x64, 0xe0, 0x82, 0xc1, 0x7d, 0x1e, 0xf6, 0x5a, 0x2f, 0x27, 0xba, 0xbb, 0x38, 0xf2, + 0xd9, 0x56, 0xec, 0x4d, 0x37, 0x60, 0xab, 0x1b, 0x96, 0x89, 0x81, 0x53, 0x53, 0xa8, 0x50, 0x07, + 0x3e, 0x7e, 0xe2, 0x56, 0x0c, 0xd3, 0xca, 0xf8, 0x07, 0xda, 0x52, 0x94, 0x0e, 0x63, 0xec, 0xbc, + 0x27, 0xf3, 0x3a, 0x70, 0x64, 0xe7, 0x76, 0xfc, 0x9d, 0x9f, 0xd1, 0xb5, 0xbe, 0x9d, 0xae, 0xf5, + 0xed, 0xa9, 0x75, 0x73, 0xc0, 0x11, 0x03, 0x44, 0x23, 0x3a, 0x8a, 0x73, 0xf4, 0xa5, 0x7c, 0xfd, + 0x17, 0x2f, 0xf1, 0x3f, 0x7f, 0xec, 0xb8, 0x9a, 0x81, 0x01, 0x9d, 0x72, 0x3b, 0x55, 0x4c, 0x1f, + 0xe8, 0xd9, 0xb1, 0x11, 0xc3, 0x6a, 0x43, 0x44, 0xf8, 0x7c, 0x63, 0x0c, 0x90, 0x91, 0x60, 0x00, + 0xd7, 0xf8, 0x2b, 0xf2, 0x3a, 0x10, 0xf4, 0x75, 0x63, 0x3a, 0x9c, 0x20, 0x82, 0x0c, 0x1c, 0x07, + 0x45, 0x0f, 0xfc, 0x14, 0x01, 0x1d, 0x45, 0x44, 0x53, 0x3f, 0xe9, 0x2a, 0xc6, 0xdd, 0xb7, 0x14, + 0xc3, 0x66, 0x47, 0x8e, 0x75, 0x66, 0x62, 0x40, 0x81, 0x29, 0xa7, 0x59, 0x46, 0x77, 0xbf, 0xfc, + 0x38, 0x9d, 0x6f, 0x2f, 0xc5, 0x52, 0xe6, 0x60, 0xdc, 0xbd, 0x2f, 0x14, 0xf4, 0x4d, 0x63, 0xf3, + 0x75, 0x34, 0x36, 0x5f, 0x57, 0x54, 0x19, 0x4d, 0x6c, 0xac, 0x4e, 0x49, 0x21, 0x19, 0x48, 0x21, + 0xc9, 0xe2, 0x40, 0x9c, 0xd0, 0x0d, 0xba, 0x70, 0x34, 0x42, 0xe7, 0xdb, 0x4b, 0xb1, 0x39, 0x5d, + 0x4c, 0x78, 0xf8, 0x25, 0x9c, 0x63, 0xc6, 0x9f, 0x15, 0x0a, 0x92, 0x51, 0x46, 0x75, 0x6a, 0x0a, + 0xa5, 0x46, 0x20, 0xa5, 0x13, 0x77, 0xbf, 0xff, 0x16, 0xfb, 0x56, 0x3f, 0x3d, 0xf8, 0xc2, 0x5a, + 0x53, 0x5e, 0x7f, 0x1e, 0x13, 0x16, 0xbc, 0x8a, 0xc3, 0x3b, 0xea, 0xac, 0xf1, 0xa7, 0x41, 0x1b, + 0x99, 0xe4, 0xe0, 0x42, 0x91, 0xfe, 0xe3, 0x04, 0x7b, 0x0f, 0xe4, 0x5d, 0x7c, 0xe4, 0xb5, 0xf3, + 0x29, 0xf7, 0x8c, 0xcc, 0x69, 0xfc, 0xbe, 0x35, 0xcf, 0x12, 0x0d, 0x05, 0x4b, 0xe0, 0x41, 0xe9, + 0xa9, 0x1d, 0x74, 0x36, 0xe2, 0xb8, 0xf8, 0x9b, 0x71, 0x22, 0x77, 0x4a, 0x04, 0x54, 0x66, 0x0a, + 0x35, 0xce, 0x9c, 0xcb, 0xf0, 0x59, 0xb7, 0xe4, 0x54, 0xb0, 0xe9, 0xfa, 0xf3, 0x00, 0xd8, 0xb5, + 0xe2, 0x61, 0x24, 0x1a, 0x61, 0xe8, 0xb7, 0x6f, 0xca, 0x3a, 0xef, 0xf3, 0xf5, 0x6d, 0x44, 0x06, + 0x8e, 0x9b, 0xa7, 0x23, 0x95, 0x93, 0x5a, 0xb1, 0x5f, 0xd8, 0x84, 0xd6, 0xa7, 0x46, 0x20, 0xa5, + 0x0a, 0x15, 0xdb, 0x07, 0x94, 0xc5, 0xc4, 0x30, 0xad, 0xec, 0x6a, 0x5f, 0x40, 0xd0, 0xd7, 0xcd, + 0xe8, 0xd9, 0x0f, 0x64, 0x9d, 0xe7, 0x9e, 0xdc, 0xc2, 0x45, 0xf3, 0x9e, 0x3a, 0xad, 0x14, 0xea, + 0xfc, 0xfc, 0x40, 0x22, 0x7d, 0x72, 0x73, 0x21, 0x4d, 0x51, 0xb7, 0x72, 0xca, 0x30, 0x98, 0xf0, + 0xcb, 0xd7, 0xf8, 0xf4, 0xc9, 0xdb, 0xe8, 0x7c, 0xf3, 0x39, 0xa2, 0xc1, 0x00, 0x5f, 0xb9, 0xe9, + 0x91, 0xcc, 0x5b, 0x39, 0x8b, 0x89, 0xe9, 0x70, 0x72, 0x60, 0xe3, 0x4a, 0x4e, 0xfa, 0x0e, 0x26, + 0x95, 0x57, 0x54, 0x33, 0xe2, 0x9a, 0xbb, 0x00, 0x08, 0xf9, 0x0f, 0xd3, 0xbb, 0x63, 0x43, 0x6e, + 0x0c, 0x78, 0xc7, 0x81, 0x69, 0x4b, 0xf4, 0x82, 0xd3, 0x6e, 0x64, 0xb6, 0xaa, 0x3a, 0x0c, 0x6b, + 0x19, 0x95, 0x63, 0xc6, 0x33, 0xf1, 0xd1, 0x37, 0xf9, 0x70, 0x61, 0x2b, 0x3d, 0x1f, 0xac, 0xe3, + 0xfc, 0x1b, 0x7f, 0x95, 0xf5, 0x9f, 0x20, 0x22, 0xc2, 0x17, 0x9b, 0x5f, 0xe3, 0x78, 0xd7, 0xce, + 0xc4, 0xb8, 0xbd, 0x6e, 0x28, 0xc3, 0x5b, 0xef, 0x8c, 0xd1, 0x90, 0xee, 0x2e, 0x76, 0xb7, 0x2f, + 0xc8, 0xa9, 0xcf, 0x73, 0xdf, 0x2a, 0x2c, 0x56, 0x7b, 0xe2, 0x7f, 0x12, 0x05, 0xb1, 0xd1, 0xc1, + 0xa4, 0x69, 0xd9, 0x47, 0xc9, 0x0e, 0xec, 0x19, 0x85, 0x59, 0xe1, 0xcc, 0x5f, 0xff, 0x67, 0xde, + 0x48, 0xe8, 0x58, 0x6f, 0x52, 0xb9, 0x23, 0xf9, 0x8d, 0xb5, 0xb2, 0x86, 0xfa, 0x69, 0xad, 0xb9, + 0x72, 0x08, 0xac, 0x65, 0xc9, 0xeb, 0xfa, 0x42, 0x22, 0x50, 0x2a, 0xa7, 0xcf, 0xfa, 0xcd, 0x80, + 0xe2, 0xc6, 0x99, 0x73, 0x73, 0xce, 0xb7, 0xd7, 0x8f, 0xe0, 0xe2, 0x7b, 0x96, 0xe4, 0x5c, 0x73, + 0xcf, 0x9e, 0x3d, 0xd9, 0x31, 0x30, 0x18, 0x9d, 0x3e, 0x97, 0x24, 0xd9, 0xc8, 0x64, 0x70, 0x2e, + 0x54, 0x2c, 0x95, 0x38, 0xde, 0xd5, 0x41, 0xe4, 0x84, 0x1f, 0x1d, 0x3e, 0x09, 0x80, 0xaf, 0x63, + 0x5b, 0xec, 0xac, 0x77, 0xd1, 0xd4, 0x0c, 0x0c, 0x14, 0x2a, 0xe1, 0x3e, 0x1f, 0xd1, 0x60, 0x20, + 0xf5, 0xd0, 0x4a, 0x34, 0x14, 0x44, 0x99, 0xb6, 0x2c, 0x11, 0xd0, 0xb9, 0x53, 0xa8, 0x10, 0xd9, + 0xbb, 0xea, 0x31, 0x8e, 0xee, 0xdc, 0x9e, 0xf8, 0xfb, 0xd3, 0x45, 0x37, 0x00, 0x70, 0xf9, 0xaa, + 0x7d, 0x69, 0xf3, 0xf6, 0xbf, 0xd3, 0x46, 0xe7, 0x9a, 0xcc, 0xce, 0x3e, 0xed, 0x85, 0x0f, 0x31, + 0x1d, 0x95, 0xe9, 0x6b, 0xbe, 0xba, 0x88, 0xee, 0x2d, 0x6f, 0xa4, 0x9f, 0x8b, 0xaf, 0x7f, 0x0c, + 0xdb, 0xe8, 0x89, 0x31, 0x2e, 0x94, 0x8b, 0x4a, 0xe8, 0x12, 0x0e, 0xf5, 0xb5, 0x13, 0xae, 0xa4, + 0xdc, 0x3b, 0x26, 0xff, 0x2d, 0x45, 0x34, 0x82, 0x0e, 0x87, 0xb2, 0x9e, 0xa7, 0x0b, 0xd1, 0x93, + 0x0a, 0xe0, 0x41, 0x40, 0x2c, 0x45, 0x63, 0x60, 0x58, 0xcb, 0x1d, 0x05, 0xcd, 0xab, 0x19, 0x37, + 0x03, 0xb3, 0xa2, 0x32, 0xf3, 0xfe, 0xc7, 0x56, 0x9e, 0x31, 0x36, 0x64, 0xe4, 0x58, 0x22, 0x01, + 0x7f, 0x5a, 0x21, 0x8e, 0x38, 0xaa, 0x33, 0x41, 0xac, 0x32, 0xca, 0x68, 0xd2, 0xf0, 0x70, 0x38, + 0x7c, 0x46, 0xc0, 0xf7, 0xb5, 0x45, 0xb1, 0x73, 0x83, 0xa5, 0xbc, 0x12, 0x97, 0xf7, 0xfc, 0xcc, + 0x7c, 0xd7, 0x02, 0xa1, 0xf4, 0xc8, 0xb8, 0x9b, 0xe7, 0xe0, 0x6e, 0x9e, 0x93, 0x51, 0x85, 0xb4, + 0xd6, 0xe9, 0x20, 0x96, 0x38, 0x06, 0xb2, 0x70, 0xa1, 0xbd, 0x7b, 0xf7, 0x72, 0x2e, 0x4a, 0x26, + 0x1b, 0x8d, 0x81, 0x3c, 0x16, 0x81, 0xe8, 0x49, 0xc2, 0xfd, 0x3d, 0x9c, 0xcb, 0xa2, 0x23, 0xc1, + 0x54, 0x07, 0xc4, 0xd4, 0xc2, 0x6e, 0xe0, 0x42, 0x80, 0xe3, 0x87, 0xff, 0xc5, 0x9e, 0xcd, 0x77, + 0xf0, 0x25, 0x92, 0xdd, 0x66, 0x54, 0xf1, 0x98, 0xa1, 0xf9, 0x0e, 0x50, 0xce, 0x97, 0x4b, 0xc2, + 0x5a, 0xf1, 0xb0, 0x12, 0x11, 0x9e, 0xbe, 0x4b, 0xd5, 0x87, 0xe1, 0x7a, 0xa5, 0x98, 0x03, 0x78, + 0xce, 0x65, 0xab, 0x95, 0x70, 0x58, 0x1b, 0xbc, 0xae, 0x35, 0xaf, 0x2c, 0x5c, 0x26, 0xff, 0xfd, + 0x3f, 0x14, 0xf4, 0x82, 0x81, 0xaa, 0xdf, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, + 0x44, 0xae, 0x42, 0x60, 0x82, }; const BITMAP_OPAQUE icon_kicad_xpm[1] = {{ png, sizeof( png ), "icon_kicad_xpm" }}; diff --git a/bitmaps_png/cpp_48/icon_pagelayout_editor.cpp b/bitmaps_png/cpp_48/icon_pagelayout_editor.cpp new file mode 100644 index 0000000000..4b1175139d --- /dev/null +++ b/bitmaps_png/cpp_48/icon_pagelayout_editor.cpp @@ -0,0 +1,198 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, + 0x87, 0x00, 0x00, 0x0b, 0x52, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x99, 0x09, 0x54, 0x94, + 0xe5, 0x1a, 0xc7, 0xa9, 0xe3, 0xed, 0xda, 0x4d, 0xd3, 0xf2, 0xea, 0xb5, 0xa3, 0xa6, 0xe6, 0x92, + 0x27, 0xcb, 0x15, 0x17, 0xd4, 0xb2, 0xcc, 0xad, 0x3c, 0x79, 0x5d, 0x50, 0x49, 0x73, 0x89, 0xbc, + 0x75, 0xbb, 0x5a, 0x9d, 0xec, 0x5e, 0x0d, 0x2d, 0xbd, 0x5a, 0x89, 0x4b, 0x79, 0x2c, 0x20, 0x05, + 0x52, 0x13, 0x50, 0x60, 0x40, 0x16, 0x95, 0x65, 0x58, 0x4c, 0xf6, 0x7d, 0x90, 0xd8, 0x84, 0x61, + 0x0b, 0x66, 0x61, 0x16, 0xd6, 0x11, 0x44, 0x41, 0xff, 0xf7, 0x7d, 0xde, 0xf8, 0xc6, 0xcf, 0xd9, + 0x00, 0xeb, 0x66, 0xcd, 0x39, 0xff, 0x33, 0xce, 0x30, 0xdf, 0x7c, 0xcf, 0xef, 0x7d, 0xfe, 0xcf, + 0xf3, 0x3e, 0xef, 0x68, 0x67, 0x67, 0x67, 0xd7, 0x9b, 0x69, 0x38, 0xd3, 0x18, 0xa6, 0x51, 0xbf, + 0xb1, 0xc6, 0x74, 0xde, 0xfb, 0x11, 0x00, 0x76, 0xf7, 0x22, 0x7a, 0x8c, 0x60, 0x7a, 0x8f, 0xe9, + 0x33, 0xa6, 0x3d, 0xbf, 0xb1, 0xf6, 0x32, 0xfd, 0x9b, 0x69, 0xee, 0xbd, 0x42, 0xd0, 0xe3, 0x39, + 0xa6, 0x63, 0x4c, 0x91, 0x3b, 0x77, 0xee, 0xbc, 0xe2, 0xe7, 0xe7, 0x57, 0x2e, 0xe8, 0xcc, 0x99, + 0x33, 0x66, 0x3a, 0x7b, 0xf6, 0xec, 0x5d, 0x0a, 0x08, 0x08, 0xa8, 0x91, 0x48, 0x24, 0x6a, 0x5b, + 0x0a, 0x0a, 0x0a, 0x52, 0xb1, 0xcf, 0x55, 0x30, 0x95, 0x0b, 0x3a, 0xc3, 0xae, 0xf5, 0xf1, 0xf5, + 0xab, 0xf0, 0x3e, 0x79, 0xb2, 0xcc, 0xde, 0x7e, 0xba, 0x17, 0xbb, 0xbf, 0x03, 0xd3, 0x43, 0xf7, + 0x0a, 0xe0, 0xc9, 0x24, 0xd5, 0x68, 0xb5, 0xed, 0x4d, 0xcd, 0xcd, 0x68, 0x66, 0x32, 0x18, 0x0c, + 0xb8, 0x76, 0xed, 0x1a, 0x5a, 0x5a, 0x5a, 0xd0, 0xd2, 0xda, 0x8a, 0xd6, 0xeb, 0xd7, 0x71, 0x9d, + 0xa9, 0xad, 0xad, 0x0d, 0x37, 0x6e, 0xdc, 0xc0, 0xcd, 0x9b, 0x37, 0xb9, 0xda, 0xdb, 0xdb, 0x8d, + 0xea, 0xe8, 0xe8, 0x30, 0xea, 0xd6, 0xad, 0x5b, 0x46, 0xdd, 0xbe, 0x7d, 0x9b, 0xab, 0xa5, 0xc9, + 0x80, 0xca, 0xe2, 0x0a, 0xdc, 0xbc, 0xf1, 0xf3, 0x75, 0xad, 0xec, 0x7b, 0xeb, 0xeb, 0xeb, 0x71, + 0xb5, 0x44, 0x7e, 0x6b, 0xd2, 0xe4, 0xa9, 0xdf, 0xb0, 0x18, 0x26, 0x32, 0xf5, 0xba, 0x57, 0x80, + 0x68, 0x23, 0x00, 0x0b, 0xfe, 0xd7, 0x06, 0xc8, 0x94, 0xa6, 0x22, 0xd8, 0xd9, 0x1b, 0xd2, 0x0f, + 0x03, 0x11, 0xf2, 0xce, 0x09, 0x44, 0x7c, 0x1b, 0x02, 0x43, 0xb3, 0x01, 0x75, 0x75, 0x75, 0x28, + 0x2f, 0xaf, 0x40, 0x4a, 0x5a, 0xfa, 0xad, 0xa1, 0x23, 0x46, 0xee, 0x63, 0x71, 0x8c, 0x65, 0x7a, + 0xf0, 0x57, 0x05, 0x68, 0xfd, 0x85, 0x00, 0x9a, 0x6a, 0x35, 0x24, 0xce, 0x9e, 0x50, 0x78, 0xfc, + 0x08, 0x8d, 0x77, 0x31, 0x5a, 0xce, 0x56, 0x23, 0x75, 0xe7, 0x45, 0xf8, 0xbd, 0xe5, 0x81, 0x4a, + 0x79, 0x25, 0x8a, 0x8b, 0x8b, 0x59, 0x16, 0x4a, 0x10, 0x21, 0x95, 0x76, 0xfc, 0x75, 0xd0, 0xe0, + 0x8f, 0x58, 0x2c, 0xc3, 0x98, 0x1e, 0xf8, 0x5d, 0x00, 0x74, 0xb4, 0x77, 0xc0, 0xc7, 0xd9, 0x0d, + 0x05, 0x5f, 0x24, 0x40, 0x77, 0xa2, 0x04, 0x1d, 0x21, 0x5a, 0xe8, 0x4f, 0x96, 0x42, 0xf1, 0xed, + 0x8f, 0x28, 0x3a, 0x98, 0x8c, 0x80, 0x7f, 0x1c, 0x87, 0x2c, 0x53, 0x86, 0xb4, 0xf4, 0x74, 0x96, + 0x89, 0x72, 0xf8, 0x49, 0x82, 0x6f, 0xf4, 0xed, 0xdf, 0xdf, 0x99, 0xc5, 0x33, 0xe8, 0x77, 0x01, + 0xf0, 0xf1, 0xb6, 0xed, 0x38, 0xf5, 0xe6, 0x51, 0x5c, 0x39, 0x92, 0x00, 0xed, 0xa9, 0xab, 0xd0, + 0x33, 0x08, 0x85, 0x47, 0x1e, 0x94, 0xc7, 0xf2, 0x51, 0x77, 0x4a, 0xce, 0xc0, 0x12, 0xe1, 0xf9, + 0xce, 0x57, 0x48, 0x4c, 0x4a, 0x82, 0x5c, 0x2e, 0x67, 0x2a, 0xc5, 0xd7, 0xdf, 0x9d, 0xba, 0xf6, + 0xd0, 0xc3, 0x7d, 0x1c, 0x59, 0x4c, 0xfd, 0xee, 0x6b, 0x0d, 0x84, 0x87, 0x87, 0xe3, 0xb5, 0xd7, + 0x5e, 0x83, 0xaf, 0xaf, 0x2f, 0xce, 0x9f, 0x3f, 0x8f, 0x8c, 0x98, 0x14, 0xc4, 0xec, 0x94, 0x20, + 0xdf, 0x35, 0x91, 0x83, 0x50, 0x46, 0xca, 0x8e, 0x64, 0xc2, 0x6f, 0xa3, 0x3b, 0x92, 0x53, 0x52, + 0x90, 0x92, 0x92, 0x8a, 0xc6, 0xc6, 0x06, 0xe4, 0xe7, 0xff, 0x88, 0x3d, 0x5f, 0x7d, 0x53, 0xd7, + 0xab, 0x57, 0xaf, 0x85, 0x2c, 0xae, 0xbf, 0xdc, 0x17, 0x80, 0x8a, 0x8a, 0x0a, 0xbc, 0xf4, 0xd2, + 0x4b, 0x38, 0x7a, 0xf4, 0x28, 0xdc, 0xdc, 0xdc, 0x90, 0x9d, 0x9d, 0x8d, 0xd3, 0xa7, 0x4f, 0x83, + 0xb5, 0x6a, 0x5c, 0x72, 0x0d, 0x47, 0xa5, 0x5b, 0x0e, 0xaa, 0xbe, 0x91, 0x21, 0xe6, 0x83, 0x00, + 0x78, 0x7f, 0xf8, 0x35, 0xd2, 0xd3, 0x33, 0x70, 0xe1, 0xe2, 0x45, 0x0e, 0x40, 0x85, 0x9d, 0x95, + 0x9d, 0x89, 0x0f, 0xf6, 0x1e, 0x50, 0x76, 0xd5, 0x5e, 0x2d, 0x03, 0xfc, 0xc2, 0x36, 0x4a, 0xd7, + 0xcc, 0x9d, 0x3b, 0x17, 0x3b, 0x76, 0xec, 0xc0, 0xe1, 0xc3, 0x87, 0x51, 0x54, 0x54, 0xc4, 0xb3, + 0xe1, 0xe1, 0xe1, 0x01, 0xb6, 0x77, 0x20, 0x48, 0x12, 0x84, 0x28, 0x97, 0x40, 0xa4, 0xee, 0xb8, + 0xc0, 0xed, 0x55, 0x59, 0x59, 0x85, 0x9c, 0x1c, 0x19, 0x22, 0x22, 0xa3, 0x50, 0x5a, 0x2a, 0x67, + 0xdf, 0xdf, 0x06, 0xad, 0x56, 0xc3, 0xb2, 0x92, 0x84, 0xb7, 0x77, 0x7d, 0x5e, 0x64, 0xab, 0xbd, + 0x76, 0x09, 0x70, 0x4d, 0x00, 0x60, 0xea, 0x2e, 0xc0, 0xea, 0xd5, 0xab, 0x31, 0x6b, 0xd6, 0x2c, + 0xb0, 0x8d, 0x8f, 0xad, 0x68, 0x23, 0x62, 0x63, 0x63, 0x79, 0x26, 0xc2, 0xc2, 0xc2, 0xe0, 0xe3, + 0xe3, 0x83, 0xfd, 0xfb, 0xf7, 0xe3, 0x9d, 0x25, 0x9b, 0x20, 0x79, 0xd3, 0x13, 0x55, 0xac, 0x0b, + 0xa9, 0x54, 0x2a, 0xe4, 0x17, 0x14, 0xb0, 0xcf, 0xc5, 0x41, 0x96, 0x2b, 0xe3, 0xf6, 0x6b, 0x6b, + 0xbb, 0x0e, 0xa5, 0x52, 0x81, 0x8b, 0x51, 0x51, 0xd8, 0xb0, 0x7d, 0xef, 0xe5, 0xce, 0xb1, 0xe3, + 0xc1, 0xae, 0x01, 0x9a, 0x9a, 0x8c, 0x00, 0x86, 0x7b, 0x00, 0x38, 0x76, 0xec, 0x18, 0x1e, 0x7f, + 0xfc, 0x71, 0x2c, 0x59, 0xb2, 0x04, 0x9b, 0x37, 0x6f, 0xe6, 0x81, 0x6f, 0xdf, 0xbe, 0x1d, 0x81, + 0x81, 0x81, 0xfc, 0x6f, 0x5e, 0x5e, 0x5e, 0xfc, 0xfd, 0x27, 0x9f, 0x7c, 0x12, 0x69, 0x49, 0x69, + 0x7c, 0x91, 0xc8, 0x32, 0x72, 0x79, 0x19, 0x92, 0x93, 0x53, 0x90, 0x94, 0x9c, 0xc4, 0xf7, 0x0d, + 0x82, 0x68, 0x6d, 0x6d, 0x41, 0x55, 0x55, 0x25, 0x02, 0xce, 0x9d, 0xc3, 0xc6, 0xff, 0x7c, 0x16, + 0x64, 0xa9, 0xbd, 0x5a, 0x05, 0x68, 0x16, 0x03, 0x74, 0x76, 0x22, 0x31, 0x80, 0x25, 0x88, 0xbc, + 0xbc, 0x3c, 0xf4, 0xef, 0xdf, 0x1f, 0x2f, 0xbf, 0xfc, 0x32, 0x16, 0x2d, 0x5a, 0x84, 0x95, 0x2b, + 0x57, 0x62, 0xea, 0xd4, 0xa9, 0xbc, 0x16, 0xdc, 0xdd, 0xdd, 0xe1, 0xef, 0xef, 0x8f, 0x2d, 0x5b, + 0xb6, 0x60, 0xf6, 0xec, 0xd9, 0xdc, 0x5a, 0xc2, 0x6e, 0xdc, 0xd0, 0xd0, 0x00, 0x85, 0x42, 0x81, + 0xdc, 0x2b, 0xb9, 0x90, 0xc6, 0x48, 0xf9, 0x7b, 0x04, 0x41, 0x0b, 0x62, 0x30, 0x34, 0xf3, 0xce, + 0xf4, 0x7d, 0x50, 0x28, 0xde, 0xfe, 0x78, 0x9f, 0xb7, 0x69, 0x7b, 0xbd, 0x1b, 0x40, 0xa3, 0xe9, + 0x16, 0x40, 0x9b, 0x05, 0x00, 0x1a, 0x09, 0x9e, 0x78, 0xe2, 0x09, 0x4c, 0x9e, 0x3c, 0x19, 0x0e, + 0x0e, 0x0e, 0x58, 0xb7, 0x6e, 0x1d, 0xb7, 0xd1, 0xa4, 0x49, 0x93, 0xf8, 0xeb, 0x8d, 0x1b, 0x37, + 0x62, 0xeb, 0xd6, 0xad, 0x78, 0xe5, 0x95, 0x57, 0x38, 0x98, 0x10, 0x20, 0x5d, 0x4f, 0xd9, 0xa6, + 0x2c, 0x94, 0x95, 0x95, 0xe3, 0xf2, 0xe5, 0x04, 0x84, 0x84, 0x86, 0x22, 0x22, 0x22, 0x12, 0x29, + 0xa9, 0xa9, 0xcc, 0x5e, 0x4a, 0x6e, 0xc3, 0x82, 0x82, 0x7c, 0x04, 0x46, 0x5f, 0xba, 0xfd, 0xc1, + 0xee, 0x2f, 0x0e, 0x89, 0xdb, 0xab, 0x45, 0x80, 0x26, 0x31, 0x80, 0x68, 0x2f, 0x20, 0x80, 0xeb, + 0x04, 0x60, 0xc1, 0x46, 0x14, 0xe4, 0x88, 0x11, 0x23, 0xf0, 0xe2, 0x8b, 0x2f, 0xc2, 0xd9, 0xd9, + 0x19, 0xf3, 0xe6, 0xcd, 0xe3, 0xc1, 0x4f, 0x9f, 0x3e, 0x1d, 0x0b, 0x17, 0x2e, 0xe4, 0x99, 0x18, + 0x3d, 0x7a, 0x34, 0xc6, 0x8f, 0x1f, 0xcf, 0xbf, 0x8f, 0x1e, 0x64, 0x13, 0xba, 0x96, 0xbe, 0x97, + 0xee, 0xcb, 0xee, 0x8f, 0x92, 0x92, 0x52, 0x64, 0x64, 0x64, 0x22, 0x2e, 0x2e, 0x9e, 0x77, 0x25, + 0x82, 0x49, 0x4c, 0x4c, 0x62, 0x56, 0xaa, 0x42, 0x46, 0x66, 0x3a, 0x62, 0xb3, 0xf2, 0x3b, 0x5c, + 0x3e, 0x3f, 0xf0, 0x31, 0x8b, 0xf7, 0x61, 0x8b, 0x00, 0x8d, 0x62, 0x80, 0x6e, 0x6e, 0x66, 0xbb, + 0x76, 0xed, 0xc2, 0xc0, 0x81, 0x03, 0xb1, 0x78, 0xf1, 0x62, 0x6c, 0xd8, 0xb0, 0x81, 0xaf, 0xf2, + 0xc4, 0x89, 0x13, 0x31, 0x65, 0xca, 0x14, 0x0e, 0x42, 0x70, 0x43, 0x87, 0x0e, 0xe5, 0xf6, 0x2a, + 0x61, 0x23, 0x03, 0xad, 0x3e, 0x3d, 0xc4, 0x59, 0xa0, 0x7b, 0x90, 0x95, 0xd4, 0x6a, 0x35, 0xaf, + 0x87, 0xdc, 0xdc, 0x2b, 0x2c, 0x03, 0x69, 0x88, 0x8f, 0xbf, 0x84, 0xa8, 0x68, 0x29, 0xa2, 0xa5, + 0x31, 0xc8, 0xcd, 0x63, 0xef, 0xa5, 0xa5, 0x22, 0xaf, 0x4c, 0x71, 0x73, 0xda, 0x34, 0x87, 0xf9, + 0x2c, 0xe6, 0x3f, 0xdd, 0x05, 0x50, 0x2b, 0x06, 0xe8, 0x66, 0x27, 0x8a, 0x8f, 0x8f, 0xe7, 0x81, + 0xbd, 0xfa, 0xea, 0xab, 0x58, 0xba, 0x74, 0x29, 0x96, 0x2d, 0x5b, 0xc6, 0x57, 0x9e, 0xac, 0xf4, + 0xc2, 0x0b, 0x2f, 0xf0, 0x76, 0x4a, 0x2b, 0xdf, 0xa7, 0x4f, 0x1f, 0xde, 0x95, 0x84, 0xc9, 0x54, + 0x78, 0x88, 0x21, 0xe8, 0x5e, 0x04, 0x41, 0x99, 0xa8, 0xa8, 0xa8, 0xe4, 0xed, 0x57, 0x26, 0xcb, + 0xe5, 0x19, 0x21, 0x98, 0x64, 0xb6, 0xd1, 0xe5, 0xc8, 0x64, 0xc8, 0xc9, 0xcd, 0xc3, 0xbc, 0xf9, + 0x0b, 0x0f, 0x53, 0x3d, 0x74, 0x09, 0x60, 0xab, 0x0e, 0xa8, 0xf0, 0x06, 0x0c, 0x18, 0x80, 0x99, + 0x33, 0x67, 0xe2, 0xf9, 0xe7, 0x9f, 0x87, 0x93, 0x93, 0x13, 0xff, 0x37, 0x05, 0x4f, 0x85, 0x4a, + 0xd6, 0x79, 0xe6, 0x99, 0x67, 0x78, 0xf0, 0xeb, 0xd7, 0xaf, 0x37, 0x06, 0x6f, 0x0a, 0x21, 0x58, + 0x89, 0x16, 0x85, 0xee, 0x43, 0x76, 0xa2, 0x9a, 0xa0, 0xf6, 0x5a, 0xc9, 0xac, 0x43, 0x7b, 0x03, + 0x0d, 0x7c, 0x04, 0x44, 0xcf, 0xf4, 0x7a, 0xd9, 0xf2, 0x95, 0x41, 0x9d, 0x87, 0x31, 0x0b, 0x00, + 0xa6, 0x85, 0x6c, 0xa1, 0x0e, 0xe8, 0x35, 0x05, 0x37, 0x76, 0xec, 0x58, 0x1e, 0xfc, 0xa6, 0x4d, + 0x9b, 0xf8, 0x6a, 0xd3, 0xea, 0xcf, 0x98, 0x31, 0x83, 0x77, 0x21, 0x02, 0x79, 0xec, 0xb1, 0xc7, + 0x30, 0x6e, 0xdc, 0x38, 0x1e, 0x9c, 0xf8, 0x6c, 0x20, 0x06, 0x10, 0x20, 0x84, 0x4c, 0xd0, 0x7d, + 0x68, 0xf1, 0xa8, 0x78, 0x09, 0x44, 0xa7, 0xd3, 0xa1, 0xb6, 0xb6, 0x96, 0xdb, 0x8b, 0x9e, 0xe9, + 0xb5, 0xa3, 0xa3, 0xe3, 0x39, 0x16, 0xf3, 0x48, 0x73, 0x00, 0x76, 0x91, 0xb5, 0x3a, 0x10, 0xef, + 0xc8, 0xd4, 0x55, 0x06, 0x0f, 0x1e, 0x8c, 0x05, 0x0b, 0x16, 0xf0, 0xbe, 0x4e, 0xab, 0x4d, 0xc1, + 0x53, 0xb1, 0xce, 0x9f, 0x3f, 0x9f, 0x43, 0x50, 0x57, 0x22, 0x00, 0xa5, 0x52, 0x69, 0x76, 0xb8, + 0xb1, 0x05, 0x21, 0x64, 0x83, 0x40, 0xe8, 0xde, 0xb4, 0x98, 0x4d, 0x9d, 0x0b, 0x2b, 0x2c, 0xee, + 0x9a, 0x35, 0x6b, 0xce, 0x99, 0x67, 0xa0, 0xb6, 0xb6, 0xbd, 0x41, 0x0c, 0x60, 0xa5, 0x0e, 0x68, + 0x1c, 0xa0, 0xc0, 0x68, 0x50, 0x63, 0x2b, 0xc1, 0xbd, 0x2f, 0x14, 0x2d, 0x75, 0x21, 0xca, 0xc8, + 0x53, 0x4f, 0x3d, 0x85, 0xbe, 0x7d, 0xfb, 0xb2, 0x6e, 0x12, 0x67, 0xf5, 0x84, 0x66, 0x09, 0x42, + 0xd8, 0xc4, 0x04, 0x10, 0xca, 0x48, 0x5b, 0x67, 0xe7, 0x33, 0xda, 0x97, 0xe9, 0xf5, 0xd7, 0x5f, + 0xef, 0x02, 0xc0, 0xca, 0x7e, 0x50, 0x58, 0x58, 0xc8, 0x8b, 0x96, 0xec, 0x42, 0x1b, 0x16, 0x8d, + 0x0d, 0xf6, 0xf6, 0xf6, 0xdc, 0x2e, 0x73, 0xe6, 0xcc, 0xe1, 0xef, 0x91, 0x65, 0x28, 0x78, 0x17, + 0x17, 0x17, 0x8b, 0x07, 0x9c, 0xae, 0x20, 0x4c, 0x41, 0x04, 0x18, 0xf1, 0x8e, 0x6f, 0x1b, 0x80, + 0xa9, 0xc9, 0x82, 0x8d, 0xc8, 0x8f, 0xc3, 0x86, 0x0d, 0xc3, 0xb3, 0xcf, 0x3e, 0xcb, 0x37, 0x29, + 0x2a, 0x4c, 0x0a, 0x9a, 0xac, 0x43, 0xc5, 0x4b, 0x6d, 0x74, 0xc2, 0x84, 0x09, 0xe8, 0xd7, 0xaf, + 0x1f, 0xb7, 0x90, 0x78, 0x3a, 0xed, 0x0e, 0x84, 0x35, 0x10, 0x41, 0xe2, 0x6b, 0xac, 0x03, 0xb0, + 0x36, 0xd6, 0x68, 0xc5, 0x46, 0xe4, 0x73, 0x02, 0xa0, 0xde, 0x4e, 0xbe, 0x27, 0xaf, 0x53, 0xf0, + 0xd3, 0xa6, 0x4d, 0xe3, 0xb5, 0x40, 0x99, 0x18, 0x34, 0x68, 0x10, 0x97, 0x5e, 0xaf, 0x37, 0x1b, + 0xb1, 0xbb, 0x0b, 0x61, 0x09, 0xc4, 0xf4, 0x61, 0x15, 0xa0, 0x9e, 0x01, 0x58, 0xb2, 0xd1, 0xc1, + 0x43, 0x87, 0x78, 0xcb, 0xa4, 0x7e, 0xbf, 0x76, 0xed, 0x5a, 0x3e, 0xac, 0x09, 0xbe, 0xa7, 0x59, + 0x87, 0xda, 0x26, 0x0d, 0x68, 0x64, 0x1d, 0x19, 0xeb, 0xd5, 0xd6, 0xce, 0x09, 0x3d, 0x81, 0xb0, + 0x05, 0x63, 0x11, 0x40, 0x2d, 0x06, 0x10, 0xd9, 0x88, 0x4e, 0x4b, 0x64, 0x0b, 0xca, 0x00, 0x01, + 0xac, 0x58, 0xb1, 0x82, 0x07, 0x2e, 0x6c, 0x56, 0x04, 0x40, 0xed, 0x94, 0xfa, 0x3d, 0x1d, 0x5e, + 0x6c, 0x1d, 0x74, 0xac, 0x41, 0x74, 0x07, 0x44, 0x2c, 0xdb, 0x00, 0xa2, 0x2c, 0xd4, 0xb0, 0xcd, + 0x8a, 0xc6, 0x04, 0x6a, 0x8f, 0x34, 0x12, 0xd0, 0xea, 0x93, 0xff, 0x29, 0x78, 0x7a, 0xa6, 0x7e, + 0x4f, 0x35, 0x41, 0x2b, 0x4f, 0x5d, 0xc9, 0xd2, 0x98, 0xfd, 0xff, 0x80, 0xb0, 0x0a, 0x50, 0xc7, + 0xa6, 0x4a, 0xb1, 0x8d, 0x7c, 0xbc, 0xe6, 0xc3, 0xd7, 0x73, 0x32, 0xf6, 0xef, 0x9e, 0x08, 0xe7, + 0x37, 0x9d, 0xf8, 0x6a, 0x8b, 0x87, 0x34, 0xca, 0x04, 0xcd, 0xff, 0xc3, 0x87, 0x0f, 0xe7, 0x76, + 0xb3, 0x76, 0x56, 0xe8, 0x09, 0x44, 0x77, 0x60, 0x2c, 0x02, 0xa8, 0xd4, 0xea, 0x3b, 0x00, 0x4c, + 0x3a, 0x4d, 0x11, 0x0a, 0xb3, 0x9c, 0xd0, 0xa0, 0x8d, 0xc0, 0x4f, 0xa5, 0x07, 0x11, 0x21, 0xb1, + 0xc7, 0xbf, 0x36, 0x3f, 0x6d, 0x1c, 0xd2, 0xa8, 0xf3, 0x0c, 0x19, 0x32, 0x84, 0xdb, 0x8b, 0x86, + 0x34, 0xd3, 0x21, 0xef, 0xd7, 0x80, 0xb0, 0x26, 0xdb, 0x00, 0x9d, 0x10, 0x95, 0xa5, 0x9e, 0x50, + 0x96, 0x7f, 0x09, 0x43, 0x43, 0x12, 0x1a, 0x75, 0x91, 0xd0, 0xab, 0xfc, 0xf1, 0x43, 0xc4, 0x72, + 0xbc, 0xff, 0xee, 0xd3, 0x7c, 0x1f, 0x18, 0x35, 0x6a, 0x14, 0xf7, 0xbd, 0x44, 0x22, 0xb1, 0x7a, + 0xd8, 0xe9, 0x2e, 0x44, 0x4f, 0x41, 0xac, 0x02, 0xe8, 0x59, 0xaf, 0x17, 0xb2, 0x50, 0x98, 0xb5, + 0x16, 0x8d, 0xfa, 0x68, 0x34, 0xe9, 0xa5, 0xa8, 0xaf, 0x0d, 0x86, 0x4e, 0x79, 0x12, 0x9a, 0x9f, + 0xbe, 0xc6, 0xf9, 0x80, 0x05, 0x78, 0x63, 0xf5, 0x48, 0xf4, 0x65, 0xc1, 0x2f, 0x5f, 0xb8, 0x18, + 0xc9, 0x41, 0x21, 0x48, 0x09, 0x0e, 0x45, 0xca, 0xb9, 0x30, 0xa4, 0x8a, 0x94, 0x16, 0x12, 0x6e, + 0x54, 0x7a, 0xe8, 0xf9, 0x1e, 0x29, 0x23, 0xec, 0x82, 0x4d, 0xad, 0x5d, 0xb3, 0x26, 0xcc, 0x0c, + 0x40, 0xa9, 0x52, 0x19, 0x01, 0xf4, 0xba, 0x1a, 0x14, 0x64, 0xae, 0x40, 0x53, 0x5d, 0x1c, 0x1a, + 0x34, 0xa1, 0xd0, 0x2b, 0x4f, 0x43, 0x53, 0xed, 0x0e, 0x55, 0x85, 0x2b, 0x6a, 0x4a, 0x77, 0xe2, + 0xa8, 0xeb, 0x68, 0x8c, 0x61, 0xe3, 0xc2, 0x87, 0x93, 0x67, 0x60, 0xdb, 0x7d, 0xd0, 0x7a, 0x47, + 0xc7, 0x08, 0xeb, 0x00, 0x4c, 0xd5, 0x15, 0xc1, 0x28, 0xcb, 0xdf, 0xc1, 0xfc, 0x7f, 0x1e, 0x75, + 0x2a, 0x3f, 0x68, 0x6b, 0x8e, 0x41, 0x5d, 0x79, 0x88, 0x05, 0xbf, 0x0b, 0xa9, 0xf1, 0x4e, 0x38, + 0xe1, 0xf6, 0x1c, 0x2e, 0xb1, 0xc3, 0x36, 0x7d, 0xd9, 0x47, 0x53, 0x1d, 0xe0, 0xba, 0x6c, 0xd5, + 0x2f, 0xd2, 0x81, 0xe5, 0xab, 0x7b, 0xa4, 0x37, 0x56, 0xad, 0xba, 0x60, 0x0e, 0xa0, 0x54, 0xb5, + 0xeb, 0xd8, 0x0e, 0x4a, 0x10, 0x85, 0xd9, 0x5b, 0xa0, 0xfe, 0xc9, 0x1b, 0x75, 0x6a, 0x7f, 0x16, + 0xbc, 0x17, 0x6a, 0xab, 0xbe, 0x62, 0x96, 0x7a, 0x17, 0xc1, 0xbe, 0xb3, 0x91, 0x7c, 0x69, 0x37, + 0x2b, 0x72, 0x2d, 0x64, 0xf1, 0x3f, 0x70, 0x00, 0x97, 0x39, 0xf3, 0x8c, 0x83, 0x9e, 0xf8, 0xd4, + 0xd6, 0xdd, 0x9a, 0xe8, 0x4e, 0x7d, 0x98, 0xca, 0x62, 0x0d, 0xb0, 0xb1, 0x97, 0x03, 0x68, 0xb4, + 0xb5, 0xf8, 0xce, 0x7d, 0x26, 0xf3, 0xbd, 0x04, 0x3a, 0xc5, 0x09, 0x54, 0xcb, 0x5d, 0x11, 0x1d, + 0xb2, 0x04, 0x17, 0x83, 0x57, 0x41, 0xa5, 0x28, 0x34, 0xce, 0x48, 0xb2, 0xb8, 0x4b, 0x77, 0x00, + 0x4c, 0x4e, 0x6d, 0x5d, 0x41, 0x74, 0x05, 0xd2, 0x15, 0x90, 0x45, 0x00, 0x05, 0x03, 0xd0, 0xb2, + 0xc3, 0x42, 0x68, 0xb0, 0x1b, 0x7a, 0xf7, 0xee, 0x05, 0xc7, 0x15, 0x0e, 0xc8, 0x48, 0xd8, 0x8c, + 0x73, 0xbe, 0x73, 0x51, 0x5c, 0x10, 0x6e, 0x36, 0x23, 0x89, 0x01, 0x84, 0x69, 0xb5, 0xa7, 0x10, + 0xdd, 0x05, 0x31, 0x95, 0x4d, 0x80, 0x55, 0xcb, 0xa7, 0xe0, 0x81, 0x07, 0xec, 0xf0, 0xc8, 0x23, + 0xbd, 0xf0, 0xad, 0xdb, 0xdb, 0x6c, 0x30, 0xd3, 0x42, 0x3c, 0x62, 0x08, 0x10, 0x77, 0x01, 0x88, + 0x46, 0xee, 0x23, 0x9b, 0x9d, 0xb0, 0x65, 0xea, 0x28, 0x6c, 0xb1, 0x1f, 0x8d, 0xad, 0x5d, 0xa8, + 0x4e, 0xad, 0x32, 0x03, 0x91, 0x67, 0xa5, 0x61, 0xd7, 0xac, 0xf1, 0x66, 0x0a, 0x3d, 0xf8, 0x5f, + 0xdb, 0x00, 0x35, 0x0a, 0x65, 0xbb, 0x46, 0xab, 0xc5, 0xdf, 0x06, 0xf6, 0xc6, 0x74, 0xfb, 0x21, + 0xc8, 0xcd, 0x49, 0xe4, 0x05, 0x2d, 0xde, 0xdc, 0xc4, 0x83, 0x5e, 0x8e, 0x08, 0x40, 0x38, 0x7a, + 0x12, 0xc4, 0x81, 0xb5, 0x4b, 0xf1, 0xd6, 0xd3, 0x83, 0xba, 0x25, 0x9d, 0x4a, 0x61, 0x96, 0x91, + 0xe2, 0x94, 0x04, 0xbc, 0xcf, 0xfe, 0x66, 0x2a, 0xff, 0x4f, 0xb6, 0x75, 0x05, 0xa0, 0x68, 0x2f, + 0x2b, 0x2b, 0xc2, 0xa9, 0x13, 0xfb, 0x41, 0xb5, 0x20, 0x14, 0x34, 0x01, 0x88, 0x47, 0x0c, 0x01, + 0x22, 0x27, 0x36, 0xfe, 0x0e, 0x80, 0xe8, 0xfc, 0xec, 0xda, 0x43, 0x00, 0x53, 0x6b, 0x55, 0xe6, + 0xe5, 0xe0, 0xcb, 0x55, 0x8b, 0xcc, 0x24, 0x3d, 0x7e, 0xd4, 0xf8, 0x19, 0x8b, 0x00, 0xd5, 0x35, + 0x8a, 0x76, 0x76, 0x2e, 0x06, 0x65, 0x81, 0xac, 0x24, 0x00, 0x18, 0x37, 0x37, 0xf1, 0x9c, 0xc4, + 0x94, 0x2d, 0x02, 0x10, 0x0e, 0x3e, 0x04, 0xd1, 0x48, 0x9f, 0x61, 0x9f, 0x6d, 0xec, 0x54, 0x13, + 0x7b, 0x4d, 0x6a, 0x66, 0xd7, 0x70, 0x31, 0x78, 0x43, 0xa7, 0xc4, 0xf5, 0x61, 0xab, 0x4e, 0x4c, + 0x65, 0x11, 0xa0, 0xa8, 0xb8, 0xb8, 0x55, 0x5d, 0xab, 0x41, 0xad, 0x46, 0xcb, 0x20, 0x74, 0x96, + 0x21, 0x58, 0x20, 0x02, 0x44, 0x76, 0x4c, 0x9c, 0x11, 0x40, 0x28, 0x6c, 0xf1, 0x09, 0xce, 0xf8, + 0x63, 0x80, 0xa8, 0xb8, 0x85, 0x36, 0x2b, 0xfe, 0x95, 0xcf, 0x28, 0x13, 0x10, 0x5b, 0x62, 0x07, + 0x28, 0x7f, 0x33, 0x80, 0x84, 0xc4, 0xc4, 0x7a, 0x36, 0x91, 0xc2, 0x34, 0x0b, 0x46, 0x2b, 0x99, + 0x40, 0xdc, 0x05, 0x20, 0xea, 0x4e, 0x65, 0xf2, 0x1c, 0x94, 0x14, 0xa5, 0xa0, 0xa4, 0x38, 0x15, + 0xa5, 0xa4, 0xab, 0x69, 0x90, 0x93, 0x4a, 0xd2, 0x51, 0x26, 0xa8, 0x34, 0x03, 0xe5, 0x22, 0x55, + 0xc8, 0xb3, 0x8c, 0x20, 0xd7, 0xd8, 0x77, 0xe5, 0x86, 0x4a, 0x90, 0x1b, 0x16, 0x84, 0x2b, 0x56, + 0xf4, 0xdc, 0x98, 0xd1, 0x3e, 0xe6, 0x00, 0x09, 0x89, 0xf5, 0x2a, 0x75, 0x2d, 0x7e, 0xce, 0x82, + 0x15, 0x08, 0x51, 0x3d, 0x88, 0x01, 0x84, 0xc2, 0x26, 0x88, 0x4f, 0xb7, 0x8d, 0xc1, 0x3f, 0xd7, + 0xd9, 0xf5, 0x48, 0x5b, 0x37, 0xfd, 0xd9, 0x98, 0x19, 0xbd, 0xb2, 0x06, 0xfb, 0x58, 0x7d, 0xd8, + 0xd2, 0xac, 0x31, 0x23, 0x83, 0x2d, 0x00, 0x24, 0x30, 0x00, 0x35, 0x28, 0x0b, 0x77, 0xac, 0x64, + 0xb9, 0x1e, 0x48, 0x59, 0x62, 0x00, 0x51, 0x77, 0xba, 0x57, 0x00, 0xc1, 0x5e, 0x7a, 0x45, 0x75, + 0x8f, 0x00, 0x26, 0x30, 0xd1, 0xef, 0xee, 0xb1, 0x7b, 0xf6, 0xee, 0xbd, 0x7a, 0x31, 0x22, 0x52, + 0x1b, 0x11, 0x19, 0xa9, 0x8d, 0x24, 0x45, 0x45, 0x31, 0x45, 0x6b, 0xa3, 0xa2, 0xa5, 0xda, 0x68, + 0xa9, 0x54, 0x2b, 0x25, 0xc5, 0xc4, 0x70, 0xc5, 0xc4, 0xc6, 0x6a, 0xc3, 0x03, 0x25, 0x75, 0x9e, + 0x9f, 0xec, 0x36, 0x78, 0xef, 0xd9, 0x67, 0x88, 0x8d, 0x8b, 0xd3, 0xc6, 0x91, 0xe2, 0xe3, 0xb5, + 0x27, 0xbd, 0x5c, 0x9a, 0x8e, 0xbb, 0xbd, 0x67, 0xf0, 0x34, 0x95, 0xbb, 0x48, 0x1e, 0xef, 0x1b, + 0xbc, 0x44, 0xfa, 0xee, 0xf8, 0xb6, 0xe6, 0xc4, 0xc4, 0x44, 0x2d, 0xe9, 0x72, 0x5c, 0x9c, 0x2e, + 0xf0, 0x8b, 0x4f, 0x9b, 0xad, 0xe9, 0xf4, 0xa7, 0xdb, 0x9b, 0x06, 0x3f, 0xda, 0xe7, 0x94, 0xf0, + 0xcb, 0xdc, 0x38, 0xa6, 0x83, 0x4c, 0x67, 0x98, 0xe8, 0xcd, 0xef, 0xff, 0x00, 0xa2, 0x58, 0x3f, + 0xef, 0xfc, 0x1f, 0x1b, 0xbb, 0x01, 0x4c, 0xf4, 0x53, 0xf5, 0x72, 0xa6, 0xbf, 0xff, 0x41, 0xb4, + 0x82, 0x69, 0x1e, 0xd3, 0xa3, 0xff, 0x03, 0xc7, 0x89, 0x1e, 0x3b, 0x7a, 0xe5, 0x3e, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE icon_pagelayout_editor_xpm[1] = {{ png, sizeof( png ), "icon_pagelayout_editor_xpm" }}; + +//EOF diff --git a/bitmaps_png/icons/icon_pagelayout_editor.ico b/bitmaps_png/icons/icon_pagelayout_editor.ico new file mode 100644 index 0000000000..c04615b611 Binary files /dev/null and b/bitmaps_png/icons/icon_pagelayout_editor.ico differ diff --git a/bitmaps_png/icons/mk_icn.sh b/bitmaps_png/icons/mk_icn.sh index eeb54de903..e269588874 100644 --- a/bitmaps_png/icons/mk_icn.sh +++ b/bitmaps_png/icons/mk_icn.sh @@ -17,6 +17,7 @@ ICON_FILES="icon_3d.svg icon_kicad.svg icon_bitmap2component.svg icon_pcbcalculator.svg + icon_pl_editor.svg icon_cvpcb.svg icon_pcbnew.svg icon_eeschema.svg" diff --git a/bitmaps_png/sources/icon_gerbview.svg b/bitmaps_png/sources/icon_gerbview.svg index a60a93064c..65816979a1 100644 --- a/bitmaps_png/sources/icon_gerbview.svg +++ b/bitmaps_png/sources/icon_gerbview.svg @@ -1,109 +1,761 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - diff --git a/bitmaps_png/sources/icon_gerbview_small.svg b/bitmaps_png/sources/icon_gerbview_small.svg index a60a93064c..8eb9094289 100644 --- a/bitmaps_png/sources/icon_gerbview_small.svg +++ b/bitmaps_png/sources/icon_gerbview_small.svg @@ -1,109 +1,761 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - diff --git a/bitmaps_png/sources/icon_kicad.svg b/bitmaps_png/sources/icon_kicad.svg index f4f1e94b61..ceef127970 100644 --- a/bitmaps_png/sources/icon_kicad.svg +++ b/bitmaps_png/sources/icon_kicad.svg @@ -8,11 +8,11 @@ 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" + height="48" + width="48" version="1.1" id="svg2" - inkscape:version="0.48.1 r9760" + inkscape:version="0.48.2 r9819" sodipodi:docname="icon_kicad.svg" inkscape:export-filename="F:\kicad-launchpad\testing\bitmaps_png\sources\icon_kicad.png" inkscape:export-xdpi="60" @@ -25,7 +25,7 @@ image/svg+xml - + @@ -38,15 +38,15 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1600" - inkscape:window-height="876" + inkscape:window-width="1280" + inkscape:window-height="977" id="namedview579" showgrid="true" - inkscape:zoom="22.774716" - inkscape:cx="23.593222" - inkscape:cy="12.172521" - inkscape:window-x="0" - inkscape:window-y="24" + inkscape:zoom="15.729167" + inkscape:cx="13.637086" + inkscape:cy="24" + inkscape:window-x="-4" + inkscape:window-y="-4" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:snap-grids="false" @@ -155,36 +155,85 @@ id="linearGradient8673" xlink:href="#linearGradient15606-1" inkscape:collect="always" /> + + + + + + transform="matrix(1.1951831,0,0,0.99788751,70.658084,893.71693)"> + style="fill:url(#linearGradient3049);fill-opacity:1;display:inline"> + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#000000;fill:url(#linearGradient3045);fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono" /> + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#000000;fill:url(#linearGradient3047);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono" /> + + + + + + + - - - - - diff --git a/bitmaps_png/sources/icon_pagelayout_editor.svg b/bitmaps_png/sources/icon_pagelayout_editor.svg new file mode 100644 index 0000000000..d424e7c644 --- /dev/null +++ b/bitmaps_png/sources/icon_pagelayout_editor.svg @@ -0,0 +1,833 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/kicad_logo_for_patch.svg b/bitmaps_png/sources/kicad_logo_for_patch.svg new file mode 100644 index 0000000000..dfc2061e03 --- /dev/null +++ b/bitmaps_png/sources/kicad_logo_for_patch.svg @@ -0,0 +1,131 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + KiCad + + + + diff --git a/bitmaps_png/sources/pagelayout_load.svg b/bitmaps_png/sources/pagelayout_load.svg new file mode 100644 index 0000000000..96860ef531 --- /dev/null +++ b/bitmaps_png/sources/pagelayout_load.svg @@ -0,0 +1,389 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pagelayout_load_default.svg b/bitmaps_png/sources/pagelayout_load_default.svg new file mode 100644 index 0000000000..c2ca5abd16 --- /dev/null +++ b/bitmaps_png/sources/pagelayout_load_default.svg @@ -0,0 +1,583 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pagelayout_new.svg b/bitmaps_png/sources/pagelayout_new.svg new file mode 100644 index 0000000000..d7b64cfcfa --- /dev/null +++ b/bitmaps_png/sources/pagelayout_new.svg @@ -0,0 +1,411 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pagelayout_normal_view_mode.svg b/bitmaps_png/sources/pagelayout_normal_view_mode.svg new file mode 100644 index 0000000000..ac5c853130 --- /dev/null +++ b/bitmaps_png/sources/pagelayout_normal_view_mode.svg @@ -0,0 +1,414 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pagelayout_recent.svg b/bitmaps_png/sources/pagelayout_recent.svg new file mode 100644 index 0000000000..4c49d56ef6 --- /dev/null +++ b/bitmaps_png/sources/pagelayout_recent.svg @@ -0,0 +1,621 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/pagelayout_special_view_mode.svg b/bitmaps_png/sources/pagelayout_special_view_mode.svg new file mode 100644 index 0000000000..1527a4b845 --- /dev/null +++ b/bitmaps_png/sources/pagelayout_special_view_mode.svg @@ -0,0 +1,449 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 9b7c285168..837ce50e81 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -76,14 +76,19 @@ set(COMMON_ABOUT_DLG_SRCS dialogs/dialog_page_settings_base.cpp ) -if(KICAD_GOST) - set( TITLE_BLOCK_SHAPES title_block_shapes_gost ) -else() - set( TITLE_BLOCK_SHAPES title_block_shapes ) -endif() +set(COMMON_PAGE_LAYOUT_SRCS + page_layout/title_block_shapes.cpp + page_layout/class_worksheet_dataitem.cpp + page_layout/class_worksheet_layout.cpp + page_layout/page_layout_default_description.cpp + page_layout/page_layout_graphic_items.cpp + page_layout/page_layout_reader_keywords.cpp + page_layout/page_layout_reader.cpp + ) set(COMMON_SRCS ${COMMON_ABOUT_DLG_SRCS} + ${COMMON_PAGE_LAYOUT_SRCS} base_struct.cpp basicframe.cpp bezier_curves.cpp @@ -126,16 +131,12 @@ set(COMMON_SRCS msgpanel.cpp netlist_keywords.cpp newstroke_font.cpp - page_layout_default_description.cpp - page_layout_reader_keywords.cpp - page_layout_reader.cpp projet_config.cpp ptree.cpp reporter.cpp richio.cpp selcolor.cpp string.cpp - ${TITLE_BLOCK_SHAPES}.cpp trigo.cpp wildcards_and_files_ext.cpp worksheet.cpp @@ -257,9 +258,9 @@ make_lexer( # auto-generate page layout reader s-expression page_layout_reader_lexer.h # and title_block_reader_keywords.cpp. make_lexer( - ${CMAKE_CURRENT_SOURCE_DIR}/page_layout_reader.keywords + ${CMAKE_CURRENT_SOURCE_DIR}/page_layout/page_layout_reader.keywords ${PROJECT_SOURCE_DIR}/include/page_layout_reader_lexer.h - ${CMAKE_CURRENT_SOURCE_DIR}/page_layout_reader_keywords.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/page_layout/page_layout_reader_keywords.cpp TB_READER_T ) diff --git a/common/base_screen.cpp b/common/base_screen.cpp index 0aa24fac66..efd6b3efe3 100644 --- a/common/base_screen.cpp +++ b/common/base_screen.cpp @@ -36,6 +36,8 @@ #include #include +wxString BASE_SCREEN::m_PageLayoutDescrFileName; // the name of the page layout descr file. + BASE_SCREEN::BASE_SCREEN( KICAD_T aType ) : EDA_ITEM( aType ) { diff --git a/common/base_units.cpp b/common/base_units.cpp index 9f9dddad2a..e0d602812e 100644 --- a/common/base_units.cpp +++ b/common/base_units.cpp @@ -40,7 +40,7 @@ #include -#if defined( PCBNEW ) || defined( CVPCB ) || defined( EESCHEMA ) || defined( GERBVIEW ) +#if defined( PCBNEW ) || defined( CVPCB ) || defined( EESCHEMA ) || defined( GERBVIEW ) || defined( PL_EDITOR ) #define IU_TO_MM( x ) ( x / IU_PER_MM ) #define IU_TO_IN( x ) ( x / IU_PER_MILS / 1000 ) #define MM_TO_IU( x ) ( x * IU_PER_MM ) @@ -50,6 +50,42 @@ #endif +// Helper function to print a float number without using scientific notation +// and no trailing 0 +// So we cannot always just use the %g or the %f format to print a fp number +// this helper function uses the %f format when needed, or %g when %f is +// not well working and then removes trailing 0 + +std::string Double2Str( double aValue ) +{ + char buf[50]; + int len; + + if( aValue != 0.0 && fabs( aValue ) <= 0.0001 ) + { + // For these small values, %f works fine, + // and %g gives an exponent + len = sprintf( buf, "%.16f", aValue ); + + while( --len > 0 && buf[len] == '0' ) + buf[len] = '\0'; + + if( buf[len] == '.' ) + buf[len] = '\0'; + else + ++len; + } + else + { + // For these values, %g works fine, and sometimes %f + // gives a bad value (try aValue = 1.222222222222, with %.16f format!) + len = sprintf( buf, "%.16g", aValue ); + } + + return std::string( buf, len );; +} + + double To_User_Unit( EDA_UNITS_T aUnit, double aValue ) { switch( aUnit ) @@ -226,7 +262,6 @@ double From_User_Unit( EDA_UNITS_T aUnit, double aValue ) default: case UNSCALED_UNITS: - value = aValue; } @@ -243,8 +278,9 @@ int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue ) // Acquire the 'right' decimal point separator const struct lconv* lc = localeconv(); - wxChar decimal_point = lc->decimal_point[0]; - wxString buf( aTextValue.Strip( wxString::both ) ); + + wxChar decimal_point = lc->decimal_point[0]; + wxString buf( aTextValue.Strip( wxString::both ) ); // Convert the period in decimal point buf.Replace( wxT( "." ), wxString( decimal_point, 1 ) ); @@ -270,7 +306,9 @@ int ReturnValueFromString( EDA_UNITS_T aUnits, const wxString& aTextValue ) } // Extract the numeric part - buf.Left( brk_point ).ToDouble( &dtmp ); + buf.Left( brk_point ); + + buf.ToDouble( &dtmp ); // Check the optional unit designator (2 ch significant) wxString unit( buf.Mid( brk_point ).Strip( wxString::leading ).Left( 2 ).Lower() ); diff --git a/common/basicframe.cpp b/common/basicframe.cpp index 149a232a8e..0c06bde3b2 100644 --- a/common/basicframe.cpp +++ b/common/basicframe.cpp @@ -509,13 +509,6 @@ void EDA_BASE_FRAME::CopyVersionInfoToClipboard( wxCommandEvent& event ) tmp << wxT( "OFF\n" ); #endif - tmp << wxT( " KICAD_GOST=" ); -#ifdef KICAD_GOST - tmp << wxT( "ON\n" ); -#else - tmp << wxT( "OFF\n" ); -#endif - tmp << wxT( " USE_WX_GRAPHICS_CONTEXT=" ); #ifdef USE_WX_GRAPHICS_CONTEXT tmp << wxT( "ON\n" ); diff --git a/common/build_version.cpp b/common/build_version.cpp index 52867e07c6..9ad25196e8 100644 --- a/common/build_version.cpp +++ b/common/build_version.cpp @@ -6,11 +6,7 @@ #endif #ifndef KICAD_BUILD_VERSION -#if defined KICAD_GOST -# define KICAD_BUILD_VERSION "(2013-jun-18 GOST)" -#else -# define KICAD_BUILD_VERSION "(2013-jun-18)" -#endif +# define KICAD_BUILD_VERSION "(2013-jul-14)" #endif diff --git a/common/class_bitmap_base.cpp b/common/class_bitmap_base.cpp index 56411f6169..c59999b9a3 100644 --- a/common/class_bitmap_base.cpp +++ b/common/class_bitmap_base.cpp @@ -116,9 +116,6 @@ bool BITMAP_BASE::SaveData( FILE* aFile ) const if( fprintf( aFile, "%2.2X ", *begin & 0xFF ) == EOF ) return false; } - - if( fprintf( aFile, "$EndBitmap" ) == EOF ) - return false; } return true; diff --git a/common/class_page_info.cpp b/common/class_page_info.cpp index cc3df246ca..6e0671dd69 100644 --- a/common/class_page_info.cpp +++ b/common/class_page_info.cpp @@ -63,7 +63,6 @@ const wxString PAGE_INFO::Custom( wxT( "User" ) ); #define MMsize( x, y ) wxSize( Mm2mils( x ), Mm2mils( y ) ) // All MUST be defined as landscape. -// If IsGOST() is true, A4 is dynamically rotated later. const PAGE_INFO PAGE_INFO::pageA4( MMsize( 297, 210 ), wxT( "A4" ), wxPAPER_A4 ); const PAGE_INFO PAGE_INFO::pageA3( MMsize( 420, 297 ), wxT( "A3" ), wxPAPER_A3 ); const PAGE_INFO PAGE_INFO::pageA2( MMsize( 594, 420 ), wxT( "A2" ), wxPAPER_A2 ); @@ -126,38 +125,14 @@ inline void PAGE_INFO::updatePortrait() } -void PAGE_INFO::setMargins() -{ - if( IsGOST() ) - { - m_left_margin = Mm2mils( 20 ); // 20mm - m_right_margin = // 5mm - m_top_margin = // 5mm - m_bottom_margin = Mm2mils( 5 ); // 5mm - } - else - { - m_left_margin = - m_right_margin = - m_top_margin = - m_bottom_margin = Mm2mils( 10 ); - } -} - - PAGE_INFO::PAGE_INFO( const wxSize& aSizeMils, const wxString& aType, wxPaperSize aPaperId ) : - m_type( aType ), - m_size( aSizeMils ), - m_paper_id( aPaperId ) + m_type( aType ), m_size( aSizeMils ), m_paper_id( aPaperId ) { updatePortrait(); - setMargins(); - // This constructor is protected, and only used by const PAGE_INFO's known // only to class implementation, so no further changes to "this" object are - // expected. Therefore we should also setMargin() again when copying this - // object in SetType() so that a runtime IsGOST() change does not break. + // expected. } @@ -222,8 +197,6 @@ bool PAGE_INFO::SetType( const wxString& aType, bool IsPortrait ) updatePortrait(); } - setMargins(); - return rc; } diff --git a/common/class_undoredo_container.cpp b/common/class_undoredo_container.cpp index 5d51e2216c..e56d765139 100644 --- a/common/class_undoredo_container.cpp +++ b/common/class_undoredo_container.cpp @@ -102,7 +102,7 @@ void PICKED_ITEMS_LIST::ClearListAndDeleteItems() { case UR_UNSPECIFIED: if( show_error_message ) - wxMessageBox( wxT( "ClearUndoORRedoList() error: UR_UNSPECIFIED command type" ) ); + wxMessageBox( wxT( "ClearListAndDeleteItems() error: UR_UNSPECIFIED command type" ) ); show_error_message = false; break; diff --git a/common/common.cpp b/common/common.cpp index 383eb80350..ee779e7698 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -69,16 +69,6 @@ EDA_UNITS_T g_UserUnit; EDA_COLOR_T g_GhostColor; -bool IsGOST() -{ -#if defined(KICAD_GOST) - return true; -#else - return false; -#endif -} - - /** * The predefined colors used in KiCad. * Please: if you change a value, remember these values are carefully chosen diff --git a/common/common_plot_functions.cpp b/common/common_plot_functions.cpp index e090dd2af2..4ef644430a 100644 --- a/common/common_plot_functions.cpp +++ b/common/common_plot_functions.cpp @@ -77,35 +77,26 @@ void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock, /* Note: Page sizes values are given in mils */ double iusPerMil = plotter->GetIUsPerDecimil() * 10.0; - wxSize pageSize = aPageInfo.GetSizeMils(); // in mils - - wxPoint LTmargin; - LTmargin.x = aPageInfo.GetLeftMarginMils() * iusPerMil; - LTmargin.y = aPageInfo.GetTopMarginMils() * iusPerMil; - - wxPoint RBmargin; - RBmargin.x = aPageInfo.GetRightMarginMils() * iusPerMil; - RBmargin.y = aPageInfo.GetBottomMarginMils() * iusPerMil; EDA_COLOR_T plotColor = plotter->GetColorMode() ? RED : BLACK; plotter->SetColor( plotColor ); plotter->SetCurrentLineWidth( PLOTTER::DEFAULT_LINE_WIDTH ); WS_DRAW_ITEM_LIST drawList; - // Prepare plot parameters - drawList.SetMargins( LTmargin, RBmargin); - drawList.SetPenSize(PLOTTER::DEFAULT_LINE_WIDTH ); - drawList.SetMilsToIUfactor( iusPerMil ); - drawList.SetPageSize( pageSize ); - drawList.SetSheetNumber( aSheetNumber ); - drawList.SetSheetCount( aNumberOfSheets ); - // Print only a short filename, if aFilename is the full filename - wxFileName fn( aFilename ); - drawList.BuildWorkSheetGraphicList( aPageInfo.GetType(), fn.GetFullName(), - aSheetDesc, aTitleBlock, plotColor, plotColor ); + // Prepare plot parameters + drawList.SetPenSize(PLOTTER::DEFAULT_LINE_WIDTH ); + drawList.SetMilsToIUfactor( iusPerMil ); + drawList.SetSheetNumber( aSheetNumber ); + drawList.SetSheetCount( aNumberOfSheets ); + drawList.SetFileName( fn.GetFullName() ); // Print only the short filename + drawList.SetSheetName( aSheetDesc ); + + + drawList.BuildWorkSheetGraphicList( aPageInfo, + aTitleBlock, plotColor, plotColor ); // Draw item list for( WS_DRAW_ITEM_BASE* item = drawList.GetFirst(); item; diff --git a/common/dialogs/dialog_page_settings.cpp b/common/dialogs/dialog_page_settings.cpp index 9eb6f33be4..7ab002480b 100644 --- a/common/dialogs/dialog_page_settings.cpp +++ b/common/dialogs/dialog_page_settings.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KICAD, a free EDA CAD application. * - * Copyright (C) 1992-2010 Kicad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 1992-2013 Kicad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -28,11 +28,13 @@ #include #include // DIM() #include +#include #include #include #include #include #include +#include #include #include @@ -72,8 +74,9 @@ static const wxString pageFmts[] = void EDA_DRAW_FRAME::Process_PageSettings( wxCommandEvent& event ) { - DIALOG_PAGES_SETTINGS frame( this ); - int diag = frame.ShowModal(); + DIALOG_PAGES_SETTINGS dlg( this ); + dlg.SetWksFileName( BASE_SCREEN::m_PageLayoutDescrFileName ); + int diag = dlg.ShowModal(); if( m_canvas && diag ) m_canvas->Refresh(); @@ -84,12 +87,12 @@ DIALOG_PAGES_SETTINGS::DIALOG_PAGES_SETTINGS( EDA_DRAW_FRAME* parent ) : DIALOG_PAGES_SETTINGS_BASE( parent ), m_initialized( false ) { - m_Parent = parent; - m_Screen = m_Parent->GetScreen(); - m_modified = false; + m_parent = parent; + m_screen = m_parent->GetScreen(); m_page_bitmap = NULL; - m_tb = m_Parent->GetTitleBlock(); + m_tb = m_parent->GetTitleBlock(); m_customFmt = false; + m_localPrjConfigChanged = false; initDialog(); @@ -121,22 +124,26 @@ void DIALOG_PAGES_SETTINGS::initDialog() m_paperSizeComboBox->Append( wxGetTranslation( pageFmts[ii] ) ); } + // initialize the page layout descr filename + m_plDescrFileName = BASE_SCREEN::m_PageLayoutDescrFileName; + m_filePicker->SetPath( m_plDescrFileName ); + #ifdef EESCHEMA // Init display value for schematic sub-sheet number wxString format = m_TextSheetCount->GetLabel(); - msg.Printf( format, m_Screen->m_NumberOfScreens ); + msg.Printf( format, m_screen->m_NumberOfScreens ); m_TextSheetCount->SetLabel( msg ); format = m_TextSheetNumber->GetLabel(); - msg.Printf( format, m_Screen->m_ScreenNumber ); + msg.Printf( format, m_screen->m_ScreenNumber ); m_TextSheetNumber->SetLabel( msg ); #else m_TextSheetCount->Show( false ); m_TextSheetNumber->Show( false ); #endif - m_pageInfo = m_Parent->GetPageSettings(); + m_pageInfo = m_parent->GetPageSettings(); SetCurrentPageSizeSelection( m_pageInfo.GetType() ); m_orientationComboBox->SetSelection( m_pageInfo.IsPortrait() ); @@ -210,28 +217,24 @@ void DIALOG_PAGES_SETTINGS::initDialog() } -void DIALOG_PAGES_SETTINGS::OnCloseWindow( wxCloseEvent& event ) -{ - EndModal( m_modified ); -} - - void DIALOG_PAGES_SETTINGS::OnOkClick( wxCommandEvent& event ) { - m_save_flag = false; - SavePageSettings( event ); - - if( m_save_flag ) + if( SavePageSettings() ) { - m_modified = true; - Close( true ); + m_screen->SetModify(); + m_parent->GetCanvas()->Refresh(); + + if( m_localPrjConfigChanged ) + m_parent->SaveProjectSettings( true ); + + EndModal( true ); } } void DIALOG_PAGES_SETTINGS::OnCancelClick( wxCommandEvent& event ) { - Close( true ); + EndModal( false ); } @@ -393,11 +396,50 @@ void DIALOG_PAGES_SETTINGS::OnDateApplyClick( wxCommandEvent& event ) m_TextDate->SetValue( FormatDateLong( m_PickDate->GetValue() ) ); } -void DIALOG_PAGES_SETTINGS::SavePageSettings( wxCommandEvent& event ) + +bool DIALOG_PAGES_SETTINGS::SavePageSettings() { bool retSuccess = false; - m_save_flag = true; + m_plDescrFileName = m_filePicker->GetPath(); + + if( m_plDescrFileName != BASE_SCREEN::m_PageLayoutDescrFileName ) + { + if( !m_plDescrFileName.IsEmpty() ) + { + wxString fullFileName = WORKSHEET_LAYOUT::MakeFullFileName( m_plDescrFileName ); + if( !wxFileExists( fullFileName ) ) + { + wxString msg; + msg.Printf( _("Page layout description file <%s> not found. Abort"), + GetChars( fullFileName ) ); + wxMessageBox( msg ); + return false; + } + } + + // Try to remove the path, if the path is the current working dir, + // or the dir of kicad.pro (template) + wxString shortFileName = WORKSHEET_LAYOUT::MakeShortFileName( m_plDescrFileName ); + wxFileName fn = shortFileName; + + // For Win/Linux/macOS compatibility, a relative path is a good idea + if( fn.IsAbsolute() ) + { + fn.MakeRelativeTo( wxGetCwd() ); + wxString msg; + msg.Printf( _( "The page layout descr filename has changed\n" + "Do you want to use the relative path:\n%s"), + fn.GetFullPath().GetData() ); + if( IsOK( this, msg ) ) + shortFileName = fn.GetFullPath(); + } + + BASE_SCREEN::m_PageLayoutDescrFileName = shortFileName; + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.SetPageLayout( shortFileName ); + m_localPrjConfigChanged = true; + } int idx = m_paperSizeComboBox->GetSelection(); @@ -425,8 +467,7 @@ limits\n%.1f - %.1f %s!\nSelect another custom paper size?" ), if( wxMessageBox( msg, _( "Warning!" ), wxYES_NO | wxICON_EXCLAMATION, this ) == wxYES ) { - m_save_flag = false; - return; + return false; } m_layout_size.x = Clamp( MIN_PAGE_SIZE, m_layout_size.x, MAX_PAGE_SIZE ); @@ -485,7 +526,7 @@ limits\n%.1f - %.1f %s!\nSelect another custom paper size?" ), m_pageInfo.SetType( PAGE_INFO::A4 ); } - m_Parent->SetPageSettings( m_pageInfo ); + m_parent->SetPageSettings( m_pageInfo ); m_tb.SetRevision( m_TextRevision->GetValue() ); m_tb.SetDate( m_TextDate->GetValue() ); @@ -496,7 +537,8 @@ limits\n%.1f - %.1f %s!\nSelect another custom paper size?" ), m_tb.SetComment3( m_TextComment3->GetValue() ); m_tb.SetComment4( m_TextComment4->GetValue() ); - m_Parent->SetTitleBlock( m_tb ); + m_parent->SetTitleBlock( m_tb ); + #ifdef EESCHEMA // Exports settings to other sheets if requested: @@ -508,7 +550,7 @@ limits\n%.1f - %.1f %s!\nSelect another custom paper size?" ), // Update title blocks for all screens for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) { - if( screen == m_Screen ) + if( screen == m_screen ) continue; TITLE_BLOCK tb2 = screen->GetTitleBlock(); @@ -542,8 +584,7 @@ limits\n%.1f - %.1f %s!\nSelect another custom paper size?" ), #endif - m_Screen->SetModify(); - m_Parent->GetCanvas()->Refresh(); + return true; } @@ -600,7 +641,7 @@ void DIALOG_PAGES_SETTINGS::UpdatePageLayoutExample() if( m_page_bitmap->IsOk() ) { // Calculate layout preview scale. - int appScale = m_Screen->MilsToIuScalar(); + int appScale = m_screen->MilsToIuScalar(); double scaleW = (double) lyWidth / clamped_layout_size.x / appScale; double scaleH = (double) lyHeight / clamped_layout_size.y / appScale; @@ -637,8 +678,8 @@ void DIALOG_PAGES_SETTINGS::UpdatePageLayoutExample() DrawPageLayout( &memDC, NULL, pageDUMMY, emptyString, emptyString, - m_tb, m_Screen->m_NumberOfScreens, - m_Screen->m_ScreenNumber, 1, appScale, DARKGRAY, RED ); + m_tb, m_screen->m_NumberOfScreens, + m_screen->m_ScreenNumber, 1, appScale, DARKGRAY, RED ); memDC.SelectObject( wxNullBitmap ); m_PageLayoutExampleBitmap->SetBitmap( *m_page_bitmap ); @@ -750,3 +791,9 @@ void DIALOG_PAGES_SETTINGS::GetCustomSizeMilsFromDialog() customSizeY = Clamp( double( INT_MIN ), customSizeY, double( INT_MAX ) ); m_layout_size = wxSize( KiROUND( customSizeX ), KiROUND( customSizeY ) ); } + +// Called on .kicad_wks file description selection change +void DIALOG_PAGES_SETTINGS::OnWksFileSelection( wxFileDirPickerEvent& event ) +{ + // Currently: Nothing to do. +} diff --git a/common/dialogs/dialog_page_settings.h b/common/dialogs/dialog_page_settings.h index e0ffc56e14..cdb2c02297 100644 --- a/common/dialogs/dialog_page_settings.h +++ b/common/dialogs/dialog_page_settings.h @@ -35,86 +35,90 @@ class DIALOG_PAGES_SETTINGS: public DIALOG_PAGES_SETTINGS_BASE { private: - EDA_DRAW_FRAME* m_Parent; - BASE_SCREEN* m_Screen; + EDA_DRAW_FRAME* m_parent; + BASE_SCREEN* m_screen; wxArrayString m_pageFmt; /// list of page sizes (not translated) bool m_initialized; - bool m_modified; - bool m_save_flag; + bool m_localPrjConfigChanged; /// the page layuout filename was changed wxBitmap* m_page_bitmap; /// Temporary bitmap for the page layout example. wxSize m_layout_size; /// Logical page layout size. PAGE_INFO m_pageInfo; /// Temporary page info. bool m_customFmt; /// true if the page selection is custom TITLE_BLOCK m_tb; /// Temporary title block (basic inscriptions). + wxString m_plDescrFileName; /// Temporary BASE_SCREEN::m_PageLayoutDescrFileName copy + + public: DIALOG_PAGES_SETTINGS( EDA_DRAW_FRAME* parent ); ~DIALOG_PAGES_SETTINGS(); + const wxString GetWksFileName() + { + return m_filePicker->GetPath(); + } + + void SetWksFileName(const wxString& aFilename ) + { + m_filePicker->SetPath( aFilename ); + } + + void EnableWksFileNamePicker( bool aEnable ) + { + m_filePicker->Enable( aEnable ); + } + private: - /// Initialises member variables - void initDialog(); + void initDialog(); // Initialisation of member variables - /// wxEVT_CLOSE_WINDOW event handler for ID_DIALOG - void OnCloseWindow( wxCloseEvent& event ); +// void OnCloseWindow( wxCloseEvent& event ); - /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK + // event handler for wxID_OK void OnOkClick( wxCommandEvent& event ); - /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL + // event handler for wxID_CANCEL void OnCancelClick( wxCommandEvent& event ); - /// exEVT_COMMAND_CHOICE_SELECTED event handler for ID_CHICE_PAGE_SIZE + // event handlers for page size choice void OnPaperSizeChoice( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_USER_PAGE_SIZE_X void OnUserPageSizeXTextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_USER_PAGE_SIZE_Y void OnUserPageSizeYTextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_CHOICE_SELECTED event handler for ID_CHOICE_PAGE_ORIENTATION void OnPageOrientationChoice( wxCommandEvent& event ); - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_REVISION + // event handler for texts in title block void OnRevisionTextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_DATE void OnDateTextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_TITLE void OnTitleTextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_COMPANY void OnCompanyTextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_COMMENT1 void OnComment1TextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_COMMENT2 void OnComment2TextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_COMMENT3 void OnComment3TextUpdated( wxCommandEvent& event ); - - /// exEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_COMMENT4 void OnComment4TextUpdated( wxCommandEvent& event ); - /// Handle button click for setting the date from the picker - virtual void OnDateApplyClick( wxCommandEvent& event ); + // Handle button click for setting the date from the picker + void OnDateApplyClick( wxCommandEvent& event ); + + // .kicad_wks file description selection + void OnWksFileSelection( wxFileDirPickerEvent& event ); + + // Save in the current title block the new page settings + // return true if changes are made, or false if not + bool SavePageSettings(); void SetCurrentPageSizeSelection( const wxString& aPaperSize ); - void SavePageSettings( wxCommandEvent& event ); - - /// Update page layout example + // Update page layout example void UpdatePageLayoutExample(); - /// Get page layout info from selected dialog items + // Get page layout info from selected dialog items void GetPageLayoutInfoFromDialog(); - /// Get custom page size in mils from dialog + // Get custom page size in mils from dialog void GetCustomSizeMilsFromDialog(); + + /// @return true if the local prj config is chande + /// i.e. if the page layout descr file has chnaged + bool LocalPrjConfigChanged() { return m_localPrjConfigChanged; } }; #endif // _DIALOG_PAGES_SETTINGS_H_ diff --git a/common/dialogs/dialog_page_settings_base.cpp b/common/dialogs/dialog_page_settings_base.cpp index c960a020d1..28865814ec 100644 --- a/common/dialogs/dialog_page_settings_base.cpp +++ b/common/dialogs/dialog_page_settings_base.cpp @@ -139,7 +139,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticTextDate = new wxStaticText( this, wxID_ANY, _("Issue Date"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextDate->Wrap( -1 ); - bSizerDate->Add( m_staticTextDate, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerDate->Add( m_staticTextDate, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizerissuedate; bSizerissuedate = new wxBoxSizer( wxHORIZONTAL ); @@ -195,7 +195,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticTextTitle = new wxStaticText( this, wxID_ANY, _("Title"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextTitle->Wrap( -1 ); - bSizerTitle->Add( m_staticTextTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerTitle->Add( m_staticTextTitle, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizer12; bSizer12 = new wxBoxSizer( wxHORIZONTAL ); @@ -220,7 +220,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticText13 = new wxStaticText( this, wxID_ANY, _("Company"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText13->Wrap( -1 ); - bSizerCompany->Add( m_staticText13, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerCompany->Add( m_staticText13, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizer14; bSizer14 = new wxBoxSizer( wxHORIZONTAL ); @@ -245,7 +245,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticTextComment1 = new wxStaticText( this, wxID_ANY, _("Comment1"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextComment1->Wrap( -1 ); - bSizerComment1->Add( m_staticTextComment1, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerComment1->Add( m_staticTextComment1, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizercmt1; bSizercmt1 = new wxBoxSizer( wxHORIZONTAL ); @@ -270,7 +270,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticTextComment2 = new wxStaticText( this, wxID_ANY, _("Comment2"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextComment2->Wrap( -1 ); - bSizerComment2->Add( m_staticTextComment2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerComment2->Add( m_staticTextComment2, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizercmt2; bSizercmt2 = new wxBoxSizer( wxHORIZONTAL ); @@ -295,7 +295,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticTextComment3 = new wxStaticText( this, wxID_ANY, _("Comment3"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextComment3->Wrap( -1 ); - bSizerComment12->Add( m_staticTextComment3, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerComment12->Add( m_staticTextComment3, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizercmt3; bSizercmt3 = new wxBoxSizer( wxHORIZONTAL ); @@ -320,7 +320,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_staticTextComment4 = new wxStaticText( this, wxID_ANY, _("Comment4"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextComment4->Wrap( -1 ); - bSizerComment4->Add( m_staticTextComment4, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizerComment4->Add( m_staticTextComment4, 0, wxRIGHT|wxLEFT, 5 ); wxBoxSizer* bSizercmt4; bSizercmt4 = new wxBoxSizer( wxHORIZONTAL ); @@ -340,6 +340,25 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind bSizerRight->Add( bSizerComment4, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + wxBoxSizer* bSizerFilename; + bSizerFilename = new wxBoxSizer( wxVERTICAL ); + + m_staticTextfilename = new wxStaticText( this, wxID_ANY, _("Page layout file description"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextfilename->Wrap( -1 ); + bSizerFilename->Add( m_staticTextfilename, 0, wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizerfileSelection; + bSizerfileSelection = new wxBoxSizer( wxHORIZONTAL ); + + m_filePicker = new wxFilePickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a file"), wxT("*.kicad_wks"), wxDefaultPosition, wxDefaultSize, wxFLP_OPEN|wxFLP_USE_TEXTCTRL ); + bSizerfileSelection->Add( m_filePicker, 1, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerFilename->Add( bSizerfileSelection, 1, wxEXPAND, 5 ); + + + bSizerRight->Add( bSizerFilename, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + bUpperSizerH->Add( bSizerRight, 1, wxEXPAND, 5 ); @@ -360,7 +379,6 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind this->Layout(); // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnCloseWindow ) ); m_paperSizeComboBox->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnPaperSizeChoice ), NULL, this ); m_orientationComboBox->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnPageOrientationChoice ), NULL, this ); m_TextUserSizeY->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnUserPageSizeYTextUpdated ), NULL, this ); @@ -375,6 +393,7 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind m_TextComment2->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnComment2TextUpdated ), NULL, this ); m_TextComment3->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnComment3TextUpdated ), NULL, this ); m_TextComment4->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnComment4TextUpdated ), NULL, this ); + m_filePicker->Connect( wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnWksFileSelection ), NULL, this ); m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnCancelClick ), NULL, this ); m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnOkClick ), NULL, this ); } @@ -382,7 +401,6 @@ DIALOG_PAGES_SETTINGS_BASE::DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWind DIALOG_PAGES_SETTINGS_BASE::~DIALOG_PAGES_SETTINGS_BASE() { // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnCloseWindow ) ); m_paperSizeComboBox->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnPaperSizeChoice ), NULL, this ); m_orientationComboBox->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnPageOrientationChoice ), NULL, this ); m_TextUserSizeY->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnUserPageSizeYTextUpdated ), NULL, this ); @@ -397,6 +415,7 @@ DIALOG_PAGES_SETTINGS_BASE::~DIALOG_PAGES_SETTINGS_BASE() m_TextComment2->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnComment2TextUpdated ), NULL, this ); m_TextComment3->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnComment3TextUpdated ), NULL, this ); m_TextComment4->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnComment4TextUpdated ), NULL, this ); + m_filePicker->Disconnect( wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnWksFileSelection ), NULL, this ); m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnCancelClick ), NULL, this ); m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PAGES_SETTINGS_BASE::OnOkClick ), NULL, this ); diff --git a/common/dialogs/dialog_page_settings_base.fbp b/common/dialogs/dialog_page_settings_base.fbp index f08221fe40..90b35d6158 100644 --- a/common/dialogs/dialog_page_settings_base.fbp +++ b/common/dialogs/dialog_page_settings_base.fbp @@ -42,7 +42,7 @@ DIALOG_PAGES_SETTINGS_BASE - 748,464 + 748,470 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER DIALOG_SHIM; dialog_shim.h Page Settings @@ -59,7 +59,7 @@ - OnCloseWindow + @@ -1697,7 +1697,7 @@ none 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -2439,7 +2439,7 @@ none 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -2723,7 +2723,7 @@ none 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -3007,7 +3007,7 @@ none 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -3291,7 +3291,7 @@ none 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -3575,7 +3575,7 @@ none 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 1 @@ -3857,11 +3857,11 @@ bSizerComment4 wxVERTICAL none - + 5 - wxTOP|wxRIGHT|wxLEFT + wxRIGHT|wxLEFT 0 - + 1 1 1 @@ -3940,11 +3940,11 @@ - + 5 wxEXPAND 1 - + bSizercmt4 wxHORIZONTAL @@ -4132,6 +4132,200 @@ + + 5 + wxEXPAND|wxRIGHT|wxLEFT + 0 + + + bSizerFilename + wxVERTICAL + none + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Page layout file description + + 0 + + + 0 + + 1 + m_staticTextfilename + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerfileSelection + wxHORIZONTAL + none + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + Select a file + + 0 + + 1 + m_filePicker + 1 + + + protected + 1 + + Resizable + 1 + + wxFLP_OPEN|wxFLP_USE_TEXTCTRL + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + *.kicad_wks + + + + + + + OnWksFileSelection + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/dialogs/dialog_page_settings_base.h b/common/dialogs/dialog_page_settings_base.h index 4e8ab1d343..689f553d37 100644 --- a/common/dialogs/dialog_page_settings_base.h +++ b/common/dialogs/dialog_page_settings_base.h @@ -33,6 +33,7 @@ class DIALOG_SHIM; #include #include #include +#include #include /////////////////////////////////////////////////////////////////////////// @@ -111,12 +112,13 @@ class DIALOG_PAGES_SETTINGS_BASE : public DIALOG_SHIM wxStaticText* m_staticTextComment4; wxTextCtrl* m_TextComment4; wxCheckBox* m_Comment4Export; + wxStaticText* m_staticTextfilename; + wxFilePickerCtrl* m_filePicker; wxStdDialogButtonSizer* m_sdbSizer1; wxButton* m_sdbSizer1OK; wxButton* m_sdbSizer1Cancel; // Virtual event handlers, overide them in your derived class - virtual void OnCloseWindow( wxCloseEvent& event ) { event.Skip(); } virtual void OnPaperSizeChoice( wxCommandEvent& event ) { event.Skip(); } virtual void OnPageOrientationChoice( wxCommandEvent& event ) { event.Skip(); } virtual void OnUserPageSizeYTextUpdated( wxCommandEvent& event ) { event.Skip(); } @@ -131,13 +133,14 @@ class DIALOG_PAGES_SETTINGS_BASE : public DIALOG_SHIM virtual void OnComment2TextUpdated( wxCommandEvent& event ) { event.Skip(); } virtual void OnComment3TextUpdated( wxCommandEvent& event ) { event.Skip(); } virtual void OnComment4TextUpdated( wxCommandEvent& event ) { event.Skip(); } + virtual void OnWksFileSelection( wxFileDirPickerEvent& event ) { event.Skip(); } virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); } public: - DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Page Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 748,464 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + DIALOG_PAGES_SETTINGS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Page Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 748,470 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~DIALOG_PAGES_SETTINGS_BASE(); }; diff --git a/common/drawpanel.cpp b/common/drawpanel.cpp index c2e3cfefaf..0fc2374e13 100644 --- a/common/drawpanel.cpp +++ b/common/drawpanel.cpp @@ -564,13 +564,14 @@ void EDA_DRAW_PANEL::ReDraw( wxDC* DC, bool erasebg ) g_GhostColor = WHITE; } + GRResetPenAndBrush( DC ); + + DC->SetBackground( g_DrawBgColor == BLACK ? *wxBLACK_BRUSH : *wxWHITE_BRUSH ); + DC->SetBackgroundMode( wxSOLID ); + if( erasebg ) EraseScreen( DC ); - GRResetPenAndBrush( DC ); - - DC->SetBackground( *wxBLACK_BRUSH ); - DC->SetBackgroundMode( wxSOLID ); GetParent()->RedrawActiveWindow( DC, erasebg ); // Verfies that the clipping is working correctly. If these two sets of numbers are @@ -881,6 +882,9 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetEventObject( this ); + bool offCenterReq = event.ControlDown() && event.ShiftDown(); + offCenterReq = offCenterReq || m_enableZoomNoCenter; + // This is a zoom in or out command if( event.GetWheelRotation() > 0 ) { @@ -888,8 +892,7 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) cmd.SetId( ID_PAN_UP ); else if( event.ControlDown() && !event.ShiftDown() ) cmd.SetId( ID_PAN_LEFT ); - else if( (event.ControlDown() && event.ShiftDown() ) - || m_enableZoomNoCenter) + else if( offCenterReq ) cmd.SetId( ID_OFFCENTER_ZOOM_IN ); else cmd.SetId( ID_POPUP_ZOOM_IN ); @@ -900,7 +903,7 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) cmd.SetId( ID_PAN_DOWN ); else if( event.ControlDown() && !event.ShiftDown() ) cmd.SetId( ID_PAN_RIGHT ); - else if( event.AltDown() || m_enableZoomNoCenter) + else if( offCenterReq ) cmd.SetId( ID_OFFCENTER_ZOOM_OUT ); else cmd.SetId( ID_POPUP_ZOOM_OUT ); diff --git a/common/dsnlexer.cpp b/common/dsnlexer.cpp index 42a9f2bb9c..11d8b0452e 100644 --- a/common/dsnlexer.cpp +++ b/common/dsnlexer.cpp @@ -396,7 +396,7 @@ static bool isSpace( char cc ) // Treat negative as large positive to exclude rapidly. if( (unsigned char) cc <= ' ' ) { - switch( cc ) + switch( (unsigned char) cc ) { case ' ': case '\n': diff --git a/common/eda_text.cpp b/common/eda_text.cpp index 2c90aa4891..a08ba35527 100644 --- a/common/eda_text.cpp +++ b/common/eda_text.cpp @@ -259,7 +259,7 @@ void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC, if( aFillMode == LINE ) width = 0; - if( aDrawMode != -1 ) + if( aDrawMode != UNSPECIFIED_DRAWMODE ) GRSetDrawMode( aDC, aDrawMode ); // Draw text anchor, if requested diff --git a/common/edaappl.cpp b/common/edaappl.cpp index 12933f0296..84a52c7606 100644 --- a/common/edaappl.cpp +++ b/common/edaappl.cpp @@ -452,17 +452,16 @@ bool EDA_APP::SetBinDir() m_BinDir = FROM_UTF8( native_str ); delete[] native_str; - // Linux and Unix -#elif defined(__UNIX__) +#elif defined(__UNIX__) // Linux and non-Apple Unix m_BinDir = wxStandardPaths::Get().GetExecutablePath(); + #else m_BinDir = argv[0]; -#endif // __UNIX__ +#endif - /* Use unix notation for paths. I am not sure this is a good idea, - * but it simplify compatibility between Windows and Unices - * However it is a potential problem in path handling under Windows - */ + // Use unix notation for paths. I am not sure this is a good idea, + // but it simplify compatibility between Windows and Unices + // However it is a potential problem in path handling under Windows m_BinDir.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP ); // Remove file name form command line: @@ -886,7 +885,6 @@ wxString EDA_APP::FindFileInSearchPaths( const wxString& filename, for( i = 0; i < m_searchPaths.GetCount(); i++ ) { fn = wxFileName( m_searchPaths[i], wxEmptyString ); - if( subdirs ) { for( j = 0; j < subdirs->GetCount(); j++ ) @@ -1133,11 +1131,13 @@ void EDA_APP::InsertLibraryPath( const wxString& aPaths, size_t aIndex ) } } + bool EDA_APP::LockFile( const wxString& fileName ) { // first make absolute and normalize, to avoid that different lock files // for the same file can be created wxFileName fn = fileName; + fn.MakeAbsolute(); // semaphore to protect the edition of the file by more than one instance @@ -1146,11 +1146,16 @@ bool EDA_APP::LockFile( const wxString& fileName ) // it means that we had an open file and we are opening a different one delete m_oneInstancePerFileChecker; } + wxString lockFileName = fn.GetFullPath() + wxT( ".lock" ); + lockFileName.Replace( wxT( "/" ), wxT( "_" ) ); + // We can have filenames coming from Windows, so also convert Windows separator lockFileName.Replace( wxT( "\\" ), wxT( "_" ) ); + m_oneInstancePerFileChecker = new wxSingleInstanceChecker( lockFileName ); + if( m_oneInstancePerFileChecker && m_oneInstancePerFileChecker->IsAnotherRunning() ) { diff --git a/common/gr_basic.cpp b/common/gr_basic.cpp index 624ecc6642..7eaef89d57 100644 --- a/common/gr_basic.cpp +++ b/common/gr_basic.cpp @@ -15,6 +15,7 @@ #include static const bool FILLED = true; +static const bool NOT_FILLED = false; /* Important Note: * These drawing functions clip draw item before send these items to wxDC draw @@ -50,11 +51,8 @@ GR_DRAWMODE g_XorMode = GR_NXOR; EDA_COLOR_T g_DrawBgColor = WHITE; -#define USE_CLIP_FILLED_POLYGONS - -#ifdef USE_CLIP_FILLED_POLYGONS -static void ClipAndDrawFilledPoly( EDA_RECT * ClipBox, wxDC * DC, wxPoint Points[], int n ); -#endif +static void ClipAndDrawPoly( EDA_RECT * ClipBox, wxDC * DC, wxPoint Points[], + int n ); /* These functions are used by corresponding functions * ( GRSCircle is called by GRCircle for instance) after mapping coordinates @@ -857,14 +855,9 @@ static bool IsGRSPolyDrawable( EDA_RECT* ClipBox, int n, wxPoint Points[] ) /* * Draw a new polyline and fill it if Fill, in screen space. */ -static void GRSPoly( EDA_RECT* ClipBox, - wxDC* DC, - int n, - wxPoint Points[], - bool Fill, - int width, - EDA_COLOR_T Color, - EDA_COLOR_T BgColor ) +static void GRSPoly( EDA_RECT* ClipBox, wxDC* DC, int n, wxPoint Points[], + bool Fill, int width, + EDA_COLOR_T Color, EDA_COLOR_T BgColor ) { if( !IsGRSPolyDrawable( ClipBox, n, Points ) ) return; @@ -878,12 +871,9 @@ static void GRSPoly( EDA_RECT* ClipBox, /* clip before send the filled polygon to wxDC, because under linux * (GTK?) polygons having large coordinates are incorrectly drawn + * (integer overflow in coordinates, I am guessing) */ -#ifdef USE_CLIP_FILLED_POLYGONS - ClipAndDrawFilledPoly( ClipBox, DC, Points, n ); -#else - DC->DrawPolygon( n, Points ); // does not work very well under linux -#endif + ClipAndDrawPoly( ClipBox, DC, Points, n ); } else { @@ -903,47 +893,36 @@ static void GRSPoly( EDA_RECT* ClipBox, /* * Draw a new closed polyline and fill it if Fill, in screen space. */ -static void GRSClosedPoly( EDA_RECT* ClipBox, - wxDC* DC, - int aPointCount, - wxPoint aPoints[], - bool Fill, - int width, - EDA_COLOR_T Color, - EDA_COLOR_T BgColor ) +static void GRSClosedPoly( EDA_RECT* aClipBox, wxDC* aDC, + int aPointCount, wxPoint aPoints[], + bool aFill, int aWidth, + EDA_COLOR_T aColor, + EDA_COLOR_T aBgColor ) { - if( !IsGRSPolyDrawable( ClipBox, aPointCount, aPoints ) ) + if( !IsGRSPolyDrawable( aClipBox, aPointCount, aPoints ) ) return; - GRSetColorPen( DC, Color, width ); + GRSetColorPen( aDC, aColor, aWidth ); - if( Fill && ( aPointCount > 2 ) ) + if( aFill && ( aPointCount > 2 ) ) { GRLastMoveToX = aPoints[aPointCount - 1].x; GRLastMoveToY = aPoints[aPointCount - 1].y; - GRSetBrush( DC, BgColor, FILLED ); -#ifdef USE_CLIP_FILLED_POLYGONS - ClipAndDrawFilledPoly( ClipBox, DC, aPoints, aPointCount ); -#else - DC->DrawPolygon( aPointCount, aPoints ); // does not work very well under linux -#endif + GRSetBrush( aDC, aBgColor, FILLED ); + ClipAndDrawPoly( aClipBox, aDC, aPoints, aPointCount ); } else { - GRSetBrush( DC, BgColor ); - DC->DrawLines( aPointCount, aPoints ); + GRSetBrush( aDC, aBgColor ); + aDC->DrawLines( aPointCount, aPoints ); + int lastpt = aPointCount - 1; /* Close the polygon. */ - if( aPoints[aPointCount - 1] != aPoints[0] ) + if( aPoints[lastpt] != aPoints[0] ) { - GRLine( ClipBox, - DC, - aPoints[0].x, - aPoints[0].y, - aPoints[aPointCount - 1].x, - aPoints[aPointCount - 1].y, - width, - Color ); + GRLine( aClipBox, aDC, aPoints[0].x, aPoints[0].y, + aPoints[lastpt].x, aPoints[lastpt].y, + aWidth, aColor ); } } } @@ -1153,7 +1132,7 @@ void GRFilledArc( EDA_RECT* ClipBox, void GRFilledArc( EDA_RECT* ClipBox, wxDC* DC, int x, int y, - double StAngle, double EndAngle, int r, + double StAngle, double EndAngle, int r, EDA_COLOR_T Color, EDA_COLOR_T BgColor ) { GRFilledArc( ClipBox, DC, x, y, StAngle, EndAngle, r, 0, Color, BgColor ); @@ -1322,30 +1301,20 @@ void GRFilledRect( EDA_RECT* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, void GRSRect( EDA_RECT* aClipBox, wxDC* aDC, int x1, int y1, int x2, int y2, int aWidth, EDA_COLOR_T aColor, wxPenStyle aStyle ) { - wxPoint points[5]; points[0] = wxPoint(x1, y1); points[1] = wxPoint(x1, y2); points[2] = wxPoint(x2, y2); points[3] = wxPoint(x2, y1); points[4] = points[0]; - GRSetColorPen( aDC, aColor, aWidth, aStyle ); - GRSetBrush( aDC, BLACK ); - if( aClipBox ) - { - EDA_RECT clipbox(*aClipBox); - clipbox.Inflate(aWidth); - ClipAndDrawFilledPoly(&clipbox, aDC, points, 5); // polygon approach is more accurate - } - else - ClipAndDrawFilledPoly(aClipBox, aDC, points, 5); + GRSClosedPoly( aClipBox, aDC, 5, points, NOT_FILLED, aWidth, + aColor, aColor ); } void GRSFilledRect( EDA_RECT* aClipBox, wxDC* aDC, int x1, int y1, int x2, int y2, int aWidth, EDA_COLOR_T aColor, EDA_COLOR_T aBgColor ) { - wxPoint points[5]; points[0] = wxPoint(x1, y1); points[1] = wxPoint(x1, y2); @@ -1354,21 +1323,19 @@ void GRSFilledRect( EDA_RECT* aClipBox, wxDC* aDC, int x1, int y1, int x2, int y points[4] = points[0]; GRSetBrush( aDC, aBgColor, FILLED ); GRSetColorPen( aDC, aBgColor, aWidth ); + if( aClipBox && (aWidth > 0) ) { EDA_RECT clipbox(*aClipBox); clipbox.Inflate(aWidth); - ClipAndDrawFilledPoly(&clipbox, aDC, points, 5); // polygon approach is more accurate + ClipAndDrawPoly(&clipbox, aDC, points, 5); // polygon approach is more accurate } else - ClipAndDrawFilledPoly(aClipBox, aDC, points, 5); + ClipAndDrawPoly(aClipBox, aDC, points, 5 ); } - -#ifdef USE_CLIP_FILLED_POLYGONS - /** - * Function ClipAndDrawFilledPoly + * Function ClipAndDrawPoly * Used to clip a polygon and draw it as Filled Polygon * uses the Sutherland and Hodgman algo to clip the given poly against a * rectangle. This rectangle is the drawing area this is useful under @@ -1382,7 +1349,7 @@ void GRSFilledRect( EDA_RECT* aClipBox, wxDC* aDC, int x1, int y1, int x2, int y */ #include -void ClipAndDrawFilledPoly( EDA_RECT* aClipBox, wxDC* aDC, wxPoint aPoints[], int n ) +void ClipAndDrawPoly( EDA_RECT* aClipBox, wxDC* aDC, wxPoint aPoints[], int n ) { if( aClipBox == NULL ) { @@ -1417,9 +1384,6 @@ void ClipAndDrawFilledPoly( EDA_RECT* aClipBox, wxDC* aDC, wxPoint aPoints[], in } -#endif - - void GRBezier( EDA_RECT* ClipBox, wxDC* DC, int x1, @@ -1561,7 +1525,7 @@ EDA_COLOR_T ColorFindNearest( const wxColour &aColor ) return candidate; } -void GRDrawAnchor( EDA_RECT *aClipBox, wxDC *aDC, int x, int y, +void GRDrawAnchor( EDA_RECT *aClipBox, wxDC *aDC, int x, int y, int aSize, EDA_COLOR_T aColor ) { int anchor_size = aDC->DeviceToLogicalXRel( aSize ); diff --git a/common/hotkeys_basic.cpp b/common/hotkeys_basic.cpp index 025168e920..4bda133b72 100644 --- a/common/hotkeys_basic.cpp +++ b/common/hotkeys_basic.cpp @@ -682,7 +682,7 @@ void EDA_BASE_FRAME::ImportHotkeyConfigFromFile( struct EDA_HOTKEY_CONFIG* aDesc wxString ext = DEFAULT_HOTKEY_FILENAME_EXT; wxString mask = wxT( "*." ) + ext; wxString path = wxGetCwd(); - wxString filename; + wxString filename = wxGetApp().GetAppName() + wxT( "." ) + ext; filename = EDA_FileSelector( _( "Read Hotkey Configuration File:" ), path, @@ -710,7 +710,7 @@ void EDA_BASE_FRAME::ExportHotkeyConfigToFile( struct EDA_HOTKEY_CONFIG* aDescLi wxString ext = DEFAULT_HOTKEY_FILENAME_EXT; wxString mask = wxT( "*." ) + ext; wxString path = wxGetCwd(); - wxString filename; + wxString filename = wxGetApp().GetAppName() + wxT( "." ) + ext; filename = EDA_FileSelector( _( "Write Hotkey Configuration File:" ), path, diff --git a/common/page_layout/class_worksheet_dataitem.cpp b/common/page_layout/class_worksheet_dataitem.cpp new file mode 100644 index 0000000000..c141960e20 --- /dev/null +++ b/common/page_layout/class_worksheet_dataitem.cpp @@ -0,0 +1,503 @@ +/** + * @file class_worksheet_dataitem.cpp + * @brief description of graphic items and texts to build a title block + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + */ + + +/* + * the class WORKSHEET_DATAITEM (and derived) defines + * a basic shape of a page layout ( frame references and title block ) + * Basic shapes are line, rect and texts + * the WORKSHEET_DATAITEM coordinates units is the mm, and are relative to + * one of 4 page corners. + * + * These items cannot be drawn or plot "as this". they should be converted + * to a "draw list" (WS_DRAW_ITEM_BASE and derived items) + + * The list of these items is stored in a WORKSHEET_LAYOUT instance. + * + * When building the draw list: + * the WORKSHEET_LAYOUT is used to create a WS_DRAW_ITEM_LIST + * coordinates are converted to draw/plot coordinates. + * texts are expanded if they contain format symbols. + * Items with m_RepeatCount > 1 are created m_RepeatCount times + * + * the WORKSHEET_LAYOUT is created only once. + * the WS_DRAW_ITEM_LIST is created each time the page layout is plot/drawn + * + * the WORKSHEET_LAYOUT instance is created from a S expression which + * describes the page layout (can be the default page layout or a custom file). + */ + +#include +#include +#include +#include +#include +#include + + +// Static members of class WORKSHEET_DATAITEM: +double WORKSHEET_DATAITEM::m_WSunits2Iu = 1.0; +DPOINT WORKSHEET_DATAITEM::m_RB_Corner; +DPOINT WORKSHEET_DATAITEM::m_LT_Corner; +double WORKSHEET_DATAITEM::m_DefaultLineWidth = 0.0; +DSIZE WORKSHEET_DATAITEM::m_DefaultTextSize( TB_DEFAULT_TEXTSIZE, TB_DEFAULT_TEXTSIZE ); +double WORKSHEET_DATAITEM::m_DefaultTextThickness = 0.0; +bool WORKSHEET_DATAITEM::m_SpecialMode = false; +EDA_COLOR_T WORKSHEET_DATAITEM::m_Color = RED; // the default color to draw items +EDA_COLOR_T WORKSHEET_DATAITEM::m_AltColor = RED; // an alternate color to draw items +EDA_COLOR_T WORKSHEET_DATAITEM::m_SelectedColor = BROWN; // the color to draw selected items + +// The constructor: +WORKSHEET_DATAITEM::WORKSHEET_DATAITEM( WS_ItemType aType ) +{ + m_type = aType; + m_flags = 0; + m_RepeatCount = 1; + m_IncrementLabel = 1; + m_LineWidth = 0; +} + +// move item to aPosition +// starting point is moved to aPosition +// the Ending point is moved to a position which keeps the item size +// (if both coordinates have the same corner reference) +// MoveToUi and MoveTo takes the graphic position (i.e relative to the left top +// paper corner +void WORKSHEET_DATAITEM::MoveToUi( wxPoint aPosition ) +{ + DPOINT pos_mm; + pos_mm.x = aPosition.x / m_WSunits2Iu; + pos_mm.y = aPosition.y / m_WSunits2Iu; + + MoveTo( pos_mm ); +} + +void WORKSHEET_DATAITEM::MoveTo( DPOINT aPosition ) +{ + DPOINT vector = aPosition - GetStartPos(); + DPOINT endpos = vector + GetEndPos(); + + MoveStartPointTo( aPosition ); + MoveEndPointTo( endpos ); +} + +/* move the starting point of the item to a new position + * aPosition = the new position of the starting point, in mm + */ +void WORKSHEET_DATAITEM::MoveStartPointTo( DPOINT aPosition ) +{ + DPOINT position; + + // Calculate the position of the starting point + // relative to the reference corner + // aPosition is the position relative to the right top paper corner + switch( m_Pos.m_Anchor ) + { + case RB_CORNER: + position = m_RB_Corner - aPosition; + break; + + case RT_CORNER: + position.x = m_RB_Corner.x - aPosition.x; + position.y = aPosition.y - m_LT_Corner.y; + break; + + case LB_CORNER: + position.x = aPosition.x - m_LT_Corner.x; + position.y = m_RB_Corner.y - aPosition.y; + break; + + case LT_CORNER: + position = aPosition - m_LT_Corner; + break; + } + + m_Pos.m_Pos = position; +} + +/* move the starting point of the item to a new position + * aPosition = the new position of the starting point in graphic units + */ +void WORKSHEET_DATAITEM::MoveStartPointToUi( wxPoint aPosition ) +{ + DPOINT pos_mm; + pos_mm.x = aPosition.x / m_WSunits2Iu; + pos_mm.y = aPosition.y / m_WSunits2Iu; + + MoveStartPointTo( pos_mm ); +} + +/** + * move the ending point of the item to a new position + * has meaning only for items defined by 2 points + * (segments and rectangles) + * aPosition = the new position of the ending point, in mm + */ +void WORKSHEET_DATAITEM::MoveEndPointTo( DPOINT aPosition ) +{ + DPOINT position; + + // Calculate the position of the starting point + // relative to the reference corner + // aPosition is the position relative to the right top paper corner + switch( m_End.m_Anchor ) + { + case RB_CORNER: + position = m_RB_Corner - aPosition; + break; + + case RT_CORNER: + position.x = m_RB_Corner.x - aPosition.x; + position.y = aPosition.y - m_LT_Corner.y; + break; + + case LB_CORNER: + position.x = aPosition.x - m_LT_Corner.x; + position.y = m_RB_Corner.y - aPosition.y; + break; + + case LT_CORNER: + position = aPosition - m_LT_Corner; + break; + } + + // Modify m_End only for items having 2 coordinates + switch( GetType() ) + { + case WS_SEGMENT: + case WS_RECT: + m_End.m_Pos = position; + break; + + default: + break; + } +} + +/* move the ending point of the item to a new position + * has meaning only for items defined by 2 points + * (segments and rectangles) + * aPosition = the new position of the ending point in graphic units + */ +void WORKSHEET_DATAITEM::MoveEndPointToUi( wxPoint aPosition ) +{ + DPOINT pos_mm; + pos_mm.x = aPosition.x / m_WSunits2Iu; + pos_mm.y = aPosition.y / m_WSunits2Iu; + + MoveEndPointTo( pos_mm ); +} + +const DPOINT WORKSHEET_DATAITEM::GetStartPos( int ii ) const +{ + DPOINT pos; + pos.x = m_Pos.m_Pos.x + ( m_IncrementVector.x * ii ); + pos.y = m_Pos.m_Pos.y + ( m_IncrementVector.y * ii ); + + switch( m_Pos.m_Anchor ) + { + case RB_CORNER: // right bottom corner + pos = m_RB_Corner - pos; + break; + + case RT_CORNER: // right top corner + pos.x = m_RB_Corner.x - pos.x; + pos.y = m_LT_Corner.y + pos.y; + break; + + case LB_CORNER: // left bottom corner + pos.x = m_LT_Corner.x + pos.x; + pos.y = m_RB_Corner.y - pos.y; + break; + + case LT_CORNER: // left top corner + pos = m_LT_Corner + pos; + break; + } + + return pos; +} + +const wxPoint WORKSHEET_DATAITEM::GetStartPosUi( int ii ) const +{ + DPOINT pos = GetStartPos( ii ); + pos = pos * m_WSunits2Iu; + return wxPoint( int(pos.x), int(pos.y) ); +} + +const DPOINT WORKSHEET_DATAITEM::GetEndPos( int ii ) const +{ + DPOINT pos; + pos.x = m_End.m_Pos.x + ( m_IncrementVector.x * ii ); + pos.y = m_End.m_Pos.y + ( m_IncrementVector.y * ii ); + switch( m_End.m_Anchor ) + { + case RB_CORNER: // right bottom corner + pos = m_RB_Corner - pos; + break; + + case RT_CORNER: // right top corner + pos.x = m_RB_Corner.x - pos.x; + pos.y = m_LT_Corner.y + pos.y; + break; + + case LB_CORNER: // left bottom corner + pos.x = m_LT_Corner.x + pos.x; + pos.y = m_RB_Corner.y - pos.y; + break; + + case LT_CORNER: // left top corner + pos = m_LT_Corner + pos; + break; + } + + return pos; +} + +const wxPoint WORKSHEET_DATAITEM::GetEndPosUi( int ii ) const +{ + DPOINT pos = GetEndPos( ii ); + pos = pos * m_WSunits2Iu; + return wxPoint( int(pos.x), int(pos.y) ); +} + + +bool WORKSHEET_DATAITEM::IsInsidePage( int ii ) const +{ + DPOINT pos = GetStartPos( ii ); + + for( int kk = 0; kk < 1; kk++ ) + { + if( m_RB_Corner.x < pos.x || m_LT_Corner.x > pos.x ) + return false; + + if( m_RB_Corner.y < pos.y || m_LT_Corner.y > pos.y ) + return false; + + pos = GetEndPos( ii ); + } + + return true; +} + +const wxString WORKSHEET_DATAITEM::GetClassName() const +{ + wxString name; + switch( GetType() ) + { + case WS_TEXT: name = wxT("Text"); break; + case WS_SEGMENT: name = wxT("Line"); break; + case WS_RECT: name = wxT("Rect"); break; + case WS_POLYPOLYGON: name = wxT("Poly"); break; + } + + return name; +} + +/* return 0 if the item has no specific option for page 1 + * 1 if the item is only on page 1 + * -1 if the item is not on page 1 + */ +int WORKSHEET_DATAITEM::GetPage1Option() +{ + if(( m_flags & PAGE1OPTION) == PAGE1OPTION_NOTONPAGE1 ) + return -1; + + if(( m_flags & PAGE1OPTION) == PAGE1OPTION_PAGE1ONLY ) + return 1; + + return 0; +} + +/* Set the option for page 1 + * aChoice = 0 if the item has no specific option for page 1 + * > 0 if the item is only on page 1 + * < 0 if the item is not on page 1 + */ +void WORKSHEET_DATAITEM::SetPage1Option( int aChoice ) +{ + ClearFlags( PAGE1OPTION ); + + if( aChoice > 0) + SetFlags( PAGE1OPTION_PAGE1ONLY ); + + else if( aChoice < 0) + SetFlags( PAGE1OPTION_NOTONPAGE1 ); + +} + + +WORKSHEET_DATAITEM_POLYPOLYGON::WORKSHEET_DATAITEM_POLYPOLYGON() : + WORKSHEET_DATAITEM( WS_POLYPOLYGON ) +{ + m_Orient = 0.0; +} + +const DPOINT WORKSHEET_DATAITEM_POLYPOLYGON::GetCornerPosition( unsigned aIdx, + int aRepeat ) const +{ + DPOINT pos = m_Corners[aIdx]; + + // Rotation: + RotatePoint( &pos.x, &pos.y, m_Orient * 10 ); + pos += GetStartPos( aRepeat ); + return pos; +} + +void WORKSHEET_DATAITEM_POLYPOLYGON::SetBoundingBox() +{ + if( m_Corners.size() == 0 ) + { + m_minCoord.x = m_maxCoord.x = 0.0; + m_minCoord.y = m_maxCoord.y = 0.0; + return; + } + + DPOINT pos; + pos = m_Corners[0]; + RotatePoint( &pos.x, &pos.y, m_Orient * 10 ); + m_minCoord = m_maxCoord = pos; + + for( unsigned ii = 1; ii < m_Corners.size(); ii++ ) + { + pos = m_Corners[ii]; + RotatePoint( &pos.x, &pos.y, m_Orient * 10 ); + + if( m_minCoord.x > pos.x ) + m_minCoord.x = pos.x; + + if( m_minCoord.y > pos.y ) + m_minCoord.y = pos.y; + + if( m_maxCoord.x < pos.x ) + m_maxCoord.x = pos.x; + + if( m_maxCoord.y < pos.y ) + m_maxCoord.y = pos.y; + } +} + +bool WORKSHEET_DATAITEM_POLYPOLYGON::IsInsidePage( int ii ) const +{ + DPOINT pos = GetStartPos( ii ); + pos += m_minCoord; // left top pos of bounding box + + if( m_LT_Corner.x > pos.x || m_LT_Corner.y > pos.y ) + return false; + + pos = GetStartPos( ii ); + pos += m_maxCoord; // rignt bottom pos of bounding box + + if( m_RB_Corner.x < pos.x || m_RB_Corner.y < pos.y ) + return false; + + return true; +} + +const wxPoint WORKSHEET_DATAITEM_POLYPOLYGON::GetCornerPositionUi( unsigned aIdx, + int aRepeat ) const +{ + DPOINT pos = GetCornerPosition( aIdx, aRepeat ); + pos = pos * m_WSunits2Iu; + return wxPoint( int(pos.x), int(pos.y) ); +} + +WORKSHEET_DATAITEM_TEXT::WORKSHEET_DATAITEM_TEXT( const wxChar* aTextBase ) : + WORKSHEET_DATAITEM( WS_TEXT ) +{ + m_TextBase = aTextBase; + m_IncrementLabel = 1; + m_Hjustify = GR_TEXT_HJUSTIFY_LEFT; + m_Vjustify = GR_TEXT_VJUSTIFY_CENTER; + m_Orient = 0.0; + m_LineWidth = 0.0; // 0.0 means use default value +} + +void WORKSHEET_DATAITEM_TEXT::TransfertSetupToGraphicText( WS_DRAW_ITEM_TEXT* aGText ) +{ + aGText->SetHorizJustify( m_Hjustify ) ; + aGText->SetVertJustify( m_Vjustify ); + aGText->SetOrientation( m_Orient * 10 ); // graphic text orient unit = 0.1 degree +} + +void WORKSHEET_DATAITEM_TEXT::IncrementLabel( int aIncr ) +{ + int last = m_TextBase.Len() -1; + + wxChar lbchar = m_TextBase[last]; + m_FullText = m_TextBase; + m_FullText.RemoveLast(); + + if( lbchar >= '0' && lbchar <= '9' ) + // A number is expected: + m_FullText << (int)( aIncr + lbchar - '0' ); + else + m_FullText << (wxChar) ( aIncr + lbchar ); +} + +void WORKSHEET_DATAITEM_TEXT::SetConstrainedTextSize() +{ + m_ConstrainedTextSize = m_TextSize; + + if( m_ConstrainedTextSize.x == 0 ) + m_ConstrainedTextSize.x = m_DefaultTextSize.x; + + if( m_ConstrainedTextSize.y == 0 ) + m_ConstrainedTextSize.y = m_DefaultTextSize.y; + + if( m_BoundingBoxSize.x || m_BoundingBoxSize.y ) + { + int linewidth = 0; + // to know the X and Y size of the line, we should use + // EDA_TEXT::GetTextBox() + // but this function uses integers + // So, to avoid truncations with our unit in mm, use microns. + wxSize size_micron; + size_micron.x = KiROUND( m_ConstrainedTextSize.x * 1000.0 ); + size_micron.y = KiROUND( m_ConstrainedTextSize.y * 1000.0 ); + WS_DRAW_ITEM_TEXT dummy( WS_DRAW_ITEM_TEXT( this, this->m_FullText, + wxPoint(0,0), + size_micron, + linewidth, BLACK, + IsItalic(), IsBold() ) ); + dummy.SetMultilineAllowed( true ); + TransfertSetupToGraphicText( &dummy ); + EDA_RECT rect = dummy.GetTextBox(); + DSIZE size; + size.x = rect.GetWidth() / 1000.0; + size.y = rect.GetHeight() / 1000.0; + + if( m_BoundingBoxSize.x && size.x > m_BoundingBoxSize.x ) + m_ConstrainedTextSize.x *= m_BoundingBoxSize.x / size.x; + + if( m_BoundingBoxSize.y && size.y > m_BoundingBoxSize.y ) + m_ConstrainedTextSize.y *= m_BoundingBoxSize.y / size.y; + } +} diff --git a/common/page_layout/class_worksheet_layout.cpp b/common/page_layout/class_worksheet_layout.cpp new file mode 100644 index 0000000000..6f2cad1662 --- /dev/null +++ b/common/page_layout/class_worksheet_layout.cpp @@ -0,0 +1,203 @@ +/** + * @file class_worksheet_layuout.cpp + * @brief description of graphic items and texts to build a title block + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + */ + + +/* + * the class WORKSHEET_DATAITEM (and derived ) defines + * a basic shape of a page layout ( frame references and title block ) + * The list of these items is stored in a WORKSHEET_LAYOUT instance. + * + * + * These items cannot be drawn or plot "as this". they should be converted + * to a "draw list". When building the draw list: + * the WORKSHEET_LAYOUT is used to create a WS_DRAW_ITEM_LIST + * coordinates are converted to draw/plot coordinates. + * texts are expanded if they contain format symbols. + * Items with m_RepeatCount > 1 are created m_RepeatCount times + * + * the WORKSHEET_LAYOUT is created only once. + * the WS_DRAW_ITEM_LIST is created each time the page layout is plot/drawn + * + * the WORKSHEET_LAYOUT instance is created from a S expression which + * describes the page layout (can be the default page layout or a custom file). + */ + +#include +#include +#include +#include +#include +#include +#include + +// The layout shape used in the application +// It is accessible by WORKSHEET_LAYOUT::GetTheInstance() +WORKSHEET_LAYOUT wksTheInstance; + +WORKSHEET_LAYOUT::WORKSHEET_LAYOUT() +{ + m_allowVoidList = false; + m_leftMargin = 10.0; // the left page margin in mm + m_rightMargin = 10.0; // the right page margin in mm + m_topMargin = 10.0; // the top page margin in mm + m_bottomMargin = 10.0; // the bottom page margin in mm +} + +void WORKSHEET_LAYOUT::SetLeftMargin( double aMargin ) +{ + m_leftMargin = aMargin; // the left page margin in mm +} + +void WORKSHEET_LAYOUT::SetRightMargin( double aMargin ) +{ + m_rightMargin = aMargin; // the right page margin in mm +} + +void WORKSHEET_LAYOUT::SetTopMargin( double aMargin ) +{ + m_topMargin = aMargin; // the top page margin in mm +} + +void WORKSHEET_LAYOUT::SetBottomMargin( double aMargin ) +{ + m_bottomMargin = aMargin; // the bottom page margin in mm +} + + +void WORKSHEET_LAYOUT::ClearList() +{ + for( unsigned ii = 0; ii < m_list.size(); ii++ ) + delete m_list[ii]; + m_list.clear(); +} + +/* Insert an item to the list of items at position aIdx + */ +void WORKSHEET_LAYOUT::Insert( WORKSHEET_DATAITEM* aItem, unsigned aIdx ) +{ + if ( aIdx >= GetCount() ) + Append( aItem ); + else + m_list.insert( m_list.begin() + aIdx, aItem ); +} + +/* Remove the item to the list of items at position aIdx + */ +bool WORKSHEET_LAYOUT::Remove( unsigned aIdx ) +{ + if ( aIdx >= GetCount() ) + return false; + m_list.erase( m_list.begin() + aIdx ); + return true; +} + +/* Remove the item to the list of items at position aIdx + */ +bool WORKSHEET_LAYOUT::Remove( WORKSHEET_DATAITEM* aItem ) +{ + unsigned idx = 0; + + while( idx < m_list.size() ) + { + if( m_list[idx] == aItem ) + break; + + idx++; + } + + return Remove( idx ); +} + +/* return the index of aItem, or -1 if does not exist + */ +int WORKSHEET_LAYOUT::GetItemIndex( WORKSHEET_DATAITEM* aItem ) const +{ + unsigned idx = 0; + while( idx < m_list.size() ) + { + if( m_list[idx] == aItem ) + return (int) idx; + + idx++; + } + + return -1; +} + +/* return the item from its index aIdx, or NULL if does not exist + */ +WORKSHEET_DATAITEM* WORKSHEET_LAYOUT::GetItem( unsigned aIdx ) const +{ + if( aIdx < m_list.size() ) + return m_list[aIdx]; + else + return NULL; +} + +/* return a short filename from a full filename: + * if the path is the current path,or if the path is the same + * as kicad.pro (in template), returns a shortname + * else do nothing and returns the full filename + */ +const wxString WORKSHEET_LAYOUT::MakeShortFileName( const wxString& aFullFileName ) +{ + wxFileName fn = aFullFileName; + wxString shortFileName = aFullFileName; + + wxString fileName = wxGetApp().GetLibraryPathList().FindValidPath( fn.GetFullName() ); + if( !fileName.IsEmpty() ) + { + fn = fileName; + shortFileName = fn.GetFullName(); + return shortFileName; + } + + return shortFileName; +} + +/** + * @return a full filename from a short filename, + * if the short filename path is void + * In this case the path is the same as kicad.pro (in template) + * else return the short filename (which have an absolute os relative path + */ +const wxString WORKSHEET_LAYOUT::MakeFullFileName( const wxString& aShortFileName ) +{ + wxFileName fn = aShortFileName; + wxString fullFileName = aShortFileName; + if( fn.GetPath().IsEmpty() && !fn.GetFullName().IsEmpty() ) + { + wxString name = wxGetApp().GetLibraryPathList().FindValidPath( fn.GetFullName() ); + if( !name.IsEmpty() ) + fullFileName = name; + } + + return fullFileName; +} diff --git a/common/page_layout/page_layout_default_description.cpp b/common/page_layout/page_layout_default_description.cpp new file mode 100644 index 0000000000..8e5d2ae283 --- /dev/null +++ b/common/page_layout/page_layout_default_description.cpp @@ -0,0 +1,164 @@ +/** + * @file page_layout_default_description.cpp + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + */ + +/* keyword used in page layout description are listed + * in page_layout_reader.keywords file + */ + +/* + * Items use coordinates. + * A coordinate is defined relative to a page corner + * A coordinate is the X pos, the Y pos, and the corner which is the coordinate origin + * the default is the bottom right corner + * example: (start 10 0 ltcorner) or (start 20 10) + * The direction depends on the corner: a positive coordinate define a point + * from the corner origin, to the opposite corner. + * + * Items are defined by a name, coordinates in mm and some attributes, + * and can be repeated. + * for instance (repeat 2) (incrx 2) (incry 2) repeat the item 2 times, + * and coordinates are incremented by 2 on X direction, and 2 on Y direction + * Comments are allowed. they are inside (), and start by the keyword comment + * example: + * (comment rect around the title block) + * + * Lines and rect are defined by 2 coordinates start and end, and attributes. + * Attributes are linewidth and repeat parameters. + * example: + * (line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) ) + * (rect (comment rect around the title block) (linewidth 0.15) (start 110 34) (end 2 2) ) + * + * Texts are defined by the text (between quotes), the position, and attributes + * example + * "(tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )" + * the text can be rotated by (rotation ) with value = rot angle in degrees + * (font (size 1.3 1.3) bold italic) defines a specific size, + * with bold and italic options + * (justify ) controls the text justification (the default is left) + * justif keyword is center, left, right, top and bottom + * (justify center top) is a text centered on X axis and top aligned on vertical axis + * The text size can be constrained: + * (maxlen ) and (maxheight ) force the actual text x and/or y size to be + * reduced to limit the text height to the maxheight value, + * and the full text x size to the maxlen value. + * If the actual text size is smaller than limits, its size is not modified. + * + * Texts can include a format symbol, a la printf. + * At run time these format symbols will be replaced by their actual value. + * + * format symbols are: + * + * %% = replaced by % + * %K = Kicad version + * %Z = paper format name (A4, USLetter ...) + * %Y = company name + * %D = date + * %R = revision + * %S = sheet number + * %N = number of sheets + * %Cx = comment (x = 0 to 9 to identify the comment) + * %F = filename + * %P = sheet path (sheet full name) + * %T = title + * + * example: + * (tbtext \"Size: %Z\" ...) displays "Size A4" or Size USLetter" + * + * Poly Polygons + * Set of filled polygons are supported. + * + * The main purpose is to allow logos, or complex shapes + * They support the repeat and rotation options + * They are defined by + * (polygon (position ..) + * the parameter linewidth defines the pen size used to draw/plot + * the polygon outlines (default = 0) + * example: + * (polygon (pos 134 18 rbcorner) (rotate 20) (linewidth 0.00254) + * + * and a list of corners like + * (pts (xy 20.574 8.382) (xy 19.9009 8.382) (xy 19.9009 6.26364) (xy 19.7485 5.98932) + * .... ) + * + * each sequence like + * (pts (xy 20.574 8.382) (xy 19.9009 8.382) (xy 19.9009 6.26364) (xy 19.7485 5.98932) + * .... ) + * defines a polygon. + * Each coordinate is relative to the polygon position. + * Therefore a "polygon" is in fact a set of polygons, of a poly polygon + * + */ + +#include // defaultPageLayout + + +// height of the band reference grid 2.0 mm +// worksheet frame reference text size 1.3 mm +// default text size 1.5 mm +// default line width 0.15 mm +// frame ref pitch 50 mm + +// export defaultPageLayout: +extern const char defaultPageLayout[]; + +// Default page layout (sizes are in mm) +const char defaultPageLayout[] = "( page_layout\n" + "(setup (textsize 1.5 1.5) (linewidth 0.15) (textlinewidth 0.15)\n" + "(left_margin 10)(right_margin 10)(top_margin 10)(bottom_margin 10))\n" + "(rect (comment \"rect around the title block\") (linewidth 0.15) (start 110 34) (end 2 2) )\n" + "(rect (start 0 0 ltcorner) (end 0 0 rbcorner) (repeat 2) (incrx 2) (incry 2) )\n" + "(line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) )\n" + "(tbtext \"1\" (pos 25 1 ltcorner) (font (size 1.3 1.3))(repeat 100) (incrx 50) )\n" + "(line (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50) )\n" + "(tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )\n" + "(line (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50) )\n" + "(tbtext \"A\" (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center)(repeat 100) (incry 50) )\n" + "(line (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50) )\n" + "(tbtext \"A\" (pos 1 25 rtcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50) )\n" + "(tbtext \"Date: %D\" (pos 87 6.9) )\n" + "(line (start 110 5.5) end 2 5.5) )\n" + "(tbtext \"%K\" (pos 109 4.1) (comment \"Kicad version\" ) )\n" + "(line (start 110 8.5) end 2 8.5) )\n" + "(tbtext \"Rev: %R\" (pos 24 6.9)(font bold)(justify left) )\n" + "(tbtext \"Size: %Z\" (comment \"Paper format name\")(pos 109 6.9) )\n" + "(tbtext \"Id: %S/%N\" (comment \"Sheet id\")(pos 24 4.1) )\n" + "(line (start 110 12.5) end 2 12.5) )\n" + "(tbtext \"Title: %T\" (pos 109 10.7)(font bold italic (size 2 2)) )\n" + "(tbtext \"File: %F\" (pos 109 14.3) )\n" + "(line (start 110 18.5) end 2 18.5) )\n" + "(tbtext \"Sheet: %P\" (pos 109 17) )\n" + "(tbtext \"%Y\" (comment \"Company name\") (pos 109 20)(font bold) )\n" + "(tbtext \"%C0\" (comment \"Comment 0\") (pos 109 23) )\n" + "(tbtext \"%C1\" (comment \"Comment 1\") (pos 109 26) )\n" + "(tbtext \"%C2\" (comment \"Comment 2\") (pos 109 29) )\n" + "(tbtext \"%C3\" (comment \"Comment 3\") (pos 109 32) )\n" + "(line (start 90 8.5) end 90 5.5) )\n" + "(line (start 26 8.5) end 26 2) )\n" + ")\n" +; diff --git a/common/page_layout/page_layout_graphic_items.cpp b/common/page_layout/page_layout_graphic_items.cpp new file mode 100644 index 0000000000..7e619b7a2f --- /dev/null +++ b/common/page_layout/page_layout_graphic_items.cpp @@ -0,0 +1,367 @@ +/** + * @file page_layout_graphic_items.cpp + * @brief description of graphic items and texts to build a title block + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + */ + + +/* + * the class WORKSHEET_DATAITEM (and WORKSHEET_DATAITEM_TEXT) defines + * a basic shape of a page layout ( frame references and title block ) + * Basic shapes are line, rect and texts + * the WORKSHEET_DATAITEM coordinates units is the mm, and are relative to + * one of 4 page corners. + * + * These items cannot be drawn or plot "as this". they should be converted + * to a "draw list" (WS_DRAW_ITEM_BASE and derived items) + + * The list of these items is stored in a WORKSHEET_LAYOUT instance. + * + * When building the draw list: + * the WORKSHEET_LAYOUT is used to create a WS_DRAW_ITEM_LIST + * coordinates are converted to draw/plot coordinates. + * texts are expanded if they contain format symbols. + * Items with m_RepeatCount > 1 are created m_RepeatCount times + * + * the WORKSHEET_LAYOUT is created only once. + * the WS_DRAW_ITEM_LIST is created each time the page layout is plotted/drawn + * + * the WORKSHEET_LAYOUT instance is created from a S expression which + * describes the page layout (can be the default page layout or a custom file). + */ + +#include +#include +#include +#include +#include +#include + +/* a helper function to draw graphic symbols at start point or end point of + * an item. + * The start point symbol is a filled rectangle + * The start point symbol is a filled circle + */ +inline void drawMarker( EDA_RECT* aClipBox, wxDC* aDC, + const wxPoint& aPos, int aSize, bool aEndPointShape = false ) +{ + int markerHalfSize = aSize/2; + + if( aEndPointShape ) + GRFilledCircle( aClipBox, aDC, aPos.x, aPos.y, markerHalfSize, + 0, GREEN, GREEN ); + else + GRFilledRect( aClipBox, aDC, + aPos.x - markerHalfSize, aPos.y - markerHalfSize, + aPos.x + markerHalfSize, aPos.y + markerHalfSize, + 0, GREEN, GREEN ); +} + +/* Draws the item list created by BuildWorkSheetGraphicList + * aClipBox = the clipping rect, or NULL if no clipping + * aDC = the current Device Context + * The not selected items are drawn first (most of items) + * The selected items are drawn after (usually 0 or 1) + * to be sure they are seen, even for overlapping items + */ +void WS_DRAW_ITEM_LIST::Draw( EDA_RECT* aClipBox, wxDC* aDC ) +{ + // The not selected items are drawn first (most of items) + for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() ) + { + if( item->GetParent() && item->GetParent()->IsSelected() ) + continue; + + item->DrawWsItem( aClipBox, aDC ); + } + + // The selected items are drawn after (usually 0 or 1) + int markerSize = WORKSHEET_DATAITEM::GetMarkerSizeUi(); + + for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() ) + { + if( !item->GetParent() || !item->GetParent()->IsSelected() ) + continue; + + item->DrawWsItem( aClipBox, aDC ); + + switch( item->GetType() ) + { + case WS_DRAW_ITEM_BASE::wsg_line: + { + WS_DRAW_ITEM_LINE* line = (WS_DRAW_ITEM_LINE*) item; + + if( markerSize ) + { + drawMarker( aClipBox, aDC, line->GetStart(), markerSize ); + drawMarker( aClipBox, aDC, line->GetEnd(), markerSize, true ); + } + } + break; + + case WS_DRAW_ITEM_BASE::wsg_rect: + { + WS_DRAW_ITEM_RECT* rect = (WS_DRAW_ITEM_RECT*) item; + + if( markerSize ) + { + drawMarker( aClipBox, aDC, rect->GetStart(), markerSize ); + drawMarker( aClipBox, aDC, rect->GetEnd(), markerSize, true ); + } + } + break; + + case WS_DRAW_ITEM_BASE::wsg_text: + { + WS_DRAW_ITEM_TEXT* text = (WS_DRAW_ITEM_TEXT*) item; + + if( markerSize ) + drawMarker( aClipBox, aDC, text->GetTextPosition(), + markerSize ); + } + break; + + case WS_DRAW_ITEM_BASE::wsg_poly: + { + WS_DRAW_ITEM_POLYGON* poly = (WS_DRAW_ITEM_POLYGON*) item; + + if( markerSize ) + { + drawMarker( aClipBox, aDC, poly->GetPosition(), + markerSize ); + } + } + break; + } + } +} + +WS_DRAW_ITEM_TEXT::WS_DRAW_ITEM_TEXT( WORKSHEET_DATAITEM* aParent, + wxString& aText, wxPoint aPos, wxSize aSize, + int aPenWidth, EDA_COLOR_T aColor, + bool aItalic, bool aBold ) : + WS_DRAW_ITEM_BASE( aParent, wsg_text, aColor ), EDA_TEXT( aText ) +{ + SetTextPosition( aPos ); + SetSize( aSize ); + SetThickness( aPenWidth ); + SetItalic( aItalic ); + SetBold( aBold ); +} + +void WS_DRAW_ITEM_TEXT::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ) +{ + Draw( aClipBox, aDC, wxPoint(0,0), + GetColor(), UNSPECIFIED_DRAWMODE, FILLED, UNSPECIFIED_COLOR ); +} + +// return true if the point aPosition is on the text +bool WS_DRAW_ITEM_TEXT::HitTest( const wxPoint& aPosition) +{ + return EDA_TEXT::TextHitTest( aPosition, 0 ); +} + +/* return true if the point aPosition is on the starting point of this item + */ +bool WS_DRAW_ITEM_TEXT::HitTestStartPoint( const wxPoint& aPosition) +{ + wxPoint pos = GetTextPosition(); + + if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 && + std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 ) + return true; + + return false; +} + +void WS_DRAW_ITEM_POLYGON::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ) +{ + GRPoly( aClipBox, aDC, + m_Corners.size(), &m_Corners[0], + IsFilled() ? FILLED_SHAPE : NO_FILL, + GetPenWidth(), + GetColor(), GetColor() ); +} + +// return true if the point aPosition is inside one of polygons +#include +bool WS_DRAW_ITEM_POLYGON::HitTest( const wxPoint& aPosition) +{ + return TestPointInsidePolygon( &m_Corners[0], + m_Corners.size(), aPosition ); +} + +/* return true if the point aPosition is on the starting point of this item + */ +bool WS_DRAW_ITEM_POLYGON::HitTestStartPoint( const wxPoint& aPosition) +{ + wxPoint pos = GetPosition(); + + if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 && + std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 ) + return true; + + return false; +} + +void WS_DRAW_ITEM_RECT::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ) +{ + GRRect( aClipBox, aDC, + GetStart().x, GetStart().y, + GetEnd().x, GetEnd().y, + GetPenWidth(), GetColor() ); +} + +// return true if the point aPosition is on the rect outline +bool WS_DRAW_ITEM_RECT::HitTest( const wxPoint& aPosition) +{ + int dist = GetPenWidth()/2; + wxPoint start = GetStart(); + wxPoint end; + end.x = GetEnd().x; + end.y = start.y; + + // Upper line + if( TestSegmentHit( aPosition, start, end, dist ) ) + return true; + + // Right line + start = end; + end.y = GetEnd().y; + if( TestSegmentHit( aPosition, start, end, dist ) ) + return true; + + // lower line + start = end; + end.x = GetStart().x; + if( TestSegmentHit( aPosition, start, end, dist ) ) + return true; + + // left line + start = end; + end = GetStart(); + if( TestSegmentHit( aPosition, start, end, dist ) ) + return true; + + return false; +} + +/* return true if the point aPosition is on the starting point of this item + */ +bool WS_DRAW_ITEM_RECT::HitTestStartPoint( const wxPoint& aPosition) +{ + wxPoint pos = GetStart(); + + if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 && + std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 ) + return true; + + return false; +} + +/* return true if the point aPosition is on the ending point of this item + */ +bool WS_DRAW_ITEM_RECT::HitTestEndPoint( const wxPoint& aPosition) +{ + wxPoint pos = GetEnd(); + + int dist = (int) hypot( pos.x - aPosition.x, pos.y - aPosition.y ); + + if( dist <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 ) + return true; + + return false; +} + +void WS_DRAW_ITEM_LINE::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ) +{ + GRLine( aClipBox, aDC, GetStart(), GetEnd(), + GetPenWidth(), GetColor() ); +} + +// return true if the point aPosition is on the text +bool WS_DRAW_ITEM_LINE::HitTest( const wxPoint& aPosition) +{ + return TestSegmentHit( aPosition, GetStart(), GetEnd(), GetPenWidth()/2 ); +} + +/* return true if the point aPosition is on the starting point of this item + */ +bool WS_DRAW_ITEM_LINE::HitTestStartPoint( const wxPoint& aPosition) +{ + wxPoint pos = GetStart(); + + if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 && + std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 ) + return true; + + return false; +} + +/* return true if the point aPosition is on the ending point of this item + */ +bool WS_DRAW_ITEM_LINE::HitTestEndPoint( const wxPoint& aPosition) +{ + wxPoint pos = GetEnd(); + + if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 && + std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 ) + return true; + + return false; +} + +/* Locate graphic items in m_graphicList at location aPosition + * aList = the list of items found + * aPosition is the position (in user units) to locate items + */ +void WS_DRAW_ITEM_LIST::Locate( std::vector & aList, + const wxPoint& aPosition) +{ + for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() ) + { + item->m_Flags &= ~(LOCATE_STARTPOINT|LOCATE_ENDPOINT); + bool found = false; + + if( item->HitTestStartPoint ( aPosition ) ) + { + item->m_Flags |= LOCATE_STARTPOINT; + found = true; + } + + if( item->HitTestEndPoint ( aPosition ) ) + { + item->m_Flags |= LOCATE_ENDPOINT; + found = true; + } + + if( found || item->HitTest( aPosition ) ) + { + aList.push_back( item ); + } + } +} diff --git a/common/page_layout/page_layout_reader.cpp b/common/page_layout/page_layout_reader.cpp new file mode 100644 index 0000000000..d87fa8fccf --- /dev/null +++ b/common/page_layout/page_layout_reader.cpp @@ -0,0 +1,729 @@ +/** + * @file page_layout_reader.cpp + * @brief read an S expression of description of graphic items and texts + * to build a title block and page layout + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include + + +using namespace TB_READER_T; + +/** + * Class PAGE_LAYOUT_READER_PARSER + * holds data and functions pertinent to parsing a S-expression file + * for a WORKSHEET_LAYOUT. + */ +class PAGE_LAYOUT_READER_PARSER : public PAGE_LAYOUT_READER_LEXER +{ +public: + PAGE_LAYOUT_READER_PARSER( const char* aLine, const wxString& aSource ); + void Parse( WORKSHEET_LAYOUT* aLayout ) + throw( PARSE_ERROR, IO_ERROR ); + +private: + + /** + * Function parseInt + * parses an integer and constrains it between two values. + * @param aMin is the smallest return value. + * @param aMax is the largest return value. + * @return int - the parsed integer. + */ + int parseInt( int aMin, int aMax ); + + /** + * Function parseDouble + * parses a double + * @return double - the parsed double. + */ + double parseDouble(); + + void parseSetup( WORKSHEET_LAYOUT* aLayout ) throw( IO_ERROR, PARSE_ERROR ); + void parseGraphic( WORKSHEET_DATAITEM * aItem ) throw( IO_ERROR, PARSE_ERROR ); + void parseText( WORKSHEET_DATAITEM_TEXT * aItem ) throw( IO_ERROR, PARSE_ERROR ); + void parsePolygon( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) + throw( IO_ERROR, PARSE_ERROR ); + void parsePolyOutline( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) + throw( IO_ERROR, PARSE_ERROR ); + void parseCoordinate( POINT_COORD& aCoord) throw( IO_ERROR, PARSE_ERROR ); + void readOption( WORKSHEET_DATAITEM * aItem ) throw( IO_ERROR, PARSE_ERROR ); +}; + +// PCB_PLOT_PARAMS_PARSER + +PAGE_LAYOUT_READER_PARSER::PAGE_LAYOUT_READER_PARSER( const char* aLine, const wxString& aSource ) : + PAGE_LAYOUT_READER_LEXER( aLine, aSource ) +{ +} + + +void PAGE_LAYOUT_READER_PARSER::Parse( WORKSHEET_LAYOUT* aLayout ) + throw( PARSE_ERROR, IO_ERROR ) +{ + T token; + WORKSHEET_DATAITEM * item; + + LOCALE_IO toggle; + + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + if( token == T_LEFT ) + token = NextTok(); + + if( token == T_page_layout ) + continue; + + switch( token ) + { + case T_setup: // Defines default values for graphic items + parseSetup( aLayout ); + break; + + case T_line: + item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_SEGMENT ); + parseGraphic( item ); + aLayout->Append( item ); + break; + + case T_rect: + item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_RECT ); + parseGraphic( item ); + aLayout->Append( item ); + break; + + case T_polygon: + item = new WORKSHEET_DATAITEM_POLYPOLYGON(); + parsePolygon( (WORKSHEET_DATAITEM_POLYPOLYGON*) item ); + aLayout->Append( item ); + break; + + case T_tbtext: + NeedSYMBOLorNUMBER(); + item = new WORKSHEET_DATAITEM_TEXT( FromUTF8() ); + parseText( (WORKSHEET_DATAITEM_TEXT*) item ); + aLayout->Append( item ); + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + +void PAGE_LAYOUT_READER_PARSER::parseSetup( WORKSHEET_LAYOUT* aLayout ) + throw( IO_ERROR, PARSE_ERROR ) +{ + T token; + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + switch( token ) + { + case T_LEFT: + break; + + case T_linewidth: + WORKSHEET_DATAITEM::m_DefaultLineWidth = parseDouble(); + NeedRIGHT(); + break; + + case T_textsize: + WORKSHEET_DATAITEM::m_DefaultTextSize.x = parseDouble(); + WORKSHEET_DATAITEM::m_DefaultTextSize.y = parseDouble(); + NeedRIGHT(); + break; + + case T_textlinewidth: + WORKSHEET_DATAITEM::m_DefaultTextThickness = parseDouble(); + NeedRIGHT(); + break; + + case T_left_margin: + aLayout->SetLeftMargin( parseDouble() ); + NeedRIGHT(); + break; + + case T_right_margin: + aLayout->SetRightMargin( parseDouble() ); + NeedRIGHT(); + break; + + case T_top_margin: + aLayout->SetTopMargin( parseDouble() ); + NeedRIGHT(); + break; + + case T_bottom_margin: + aLayout->SetBottomMargin( parseDouble() ); + NeedRIGHT(); + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + +void PAGE_LAYOUT_READER_PARSER::parsePolygon( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) + throw( IO_ERROR, PARSE_ERROR ) +{ + T token; + + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + if( token == T_LEFT ) + token = NextTok(); + + switch( token ) + { + case T_comment: + NeedSYMBOLorNUMBER(); + aItem->m_Info = FromUTF8(); + NeedRIGHT(); + break; + + case T_pos: + parseCoordinate( aItem->m_Pos ); + break; + + case T_name: + NeedSYMBOLorNUMBER(); + aItem->m_Name = FromUTF8(); + NeedRIGHT(); + break; + + case T_option: + readOption( aItem ); + break; + + case T_pts: + parsePolyOutline( aItem ); + aItem->CloseContour(); + break; + + case T_rotate: + aItem->m_Orient = parseDouble(); + NeedRIGHT(); + break; + + case T_repeat: + aItem->m_RepeatCount = parseInt( -1, 100 ); + NeedRIGHT(); + break; + + case T_incrx: + aItem->m_IncrementVector.x = parseDouble(); + NeedRIGHT(); + break; + + case T_incry: + aItem->m_IncrementVector.y = parseDouble(); + NeedRIGHT(); + break; + + case T_linewidth: + aItem->m_LineWidth = parseDouble(); + NeedRIGHT(); + break; + + default: + Unexpected( CurText() ); + break; + } + } + + aItem->SetBoundingBox(); +} + +void PAGE_LAYOUT_READER_PARSER::parsePolyOutline( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) + throw( IO_ERROR, PARSE_ERROR ) +{ + DPOINT corner; + T token; + + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + if( token == T_LEFT ) + token = NextTok(); + + switch( token ) + { + case T_xy: + corner.x = parseDouble(); + corner.y = parseDouble(); + aItem->AppendCorner( corner ); + NeedRIGHT(); + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + +void PAGE_LAYOUT_READER_PARSER::readOption( WORKSHEET_DATAITEM * aItem ) + throw( IO_ERROR, PARSE_ERROR ) +{ + T token; + + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + switch( token ) + { + case T_page1only: + aItem->SetPage1Option( 1 ); + break; + + case T_notonpage1: + aItem->SetPage1Option( -1 ); + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + + +void PAGE_LAYOUT_READER_PARSER::parseGraphic( WORKSHEET_DATAITEM * aItem ) + throw( IO_ERROR, PARSE_ERROR ) +{ + T token; + + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + if( token == T_LEFT ) + token = NextTok(); + + switch( token ) + { + case T_comment: + NeedSYMBOLorNUMBER(); + aItem->m_Info = FromUTF8(); + NeedRIGHT(); + break; + + case T_option: + readOption( aItem ); + break; + + case T_name: + NeedSYMBOLorNUMBER(); + aItem->m_Name = FromUTF8(); + NeedRIGHT(); + break; + + case T_start: + parseCoordinate( aItem->m_Pos ); + break; + + case T_end: + parseCoordinate( aItem->m_End ); + break; + + case T_repeat: + aItem->m_RepeatCount = parseInt( -1, 100 ); + NeedRIGHT(); + break; + + case T_incrx: + aItem->m_IncrementVector.x = parseDouble(); + NeedRIGHT(); + break; + + case T_incry: + aItem->m_IncrementVector.y = parseDouble(); + NeedRIGHT(); + break; + + case T_linewidth: + aItem->m_LineWidth = parseDouble(); + NeedRIGHT(); + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + + +void PAGE_LAYOUT_READER_PARSER::parseText( WORKSHEET_DATAITEM_TEXT* aItem ) + throw( IO_ERROR, PARSE_ERROR ) +{ + T token; + + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + if( token == T_LEFT ) + token = NextTok(); + + switch( token ) + { + case T_comment: + NeedSYMBOLorNUMBER(); + aItem->m_Info = FromUTF8(); + NeedRIGHT(); + break; + + case T_option: + readOption( aItem ); + break; + + case T_name: + NeedSYMBOLorNUMBER(); + aItem->m_Name = FromUTF8(); + NeedRIGHT(); + break; + + case T_pos: + parseCoordinate( aItem->m_Pos ); + break; + + case T_repeat: + aItem->m_RepeatCount = parseInt( -1, 100 ); + NeedRIGHT(); + break; + + case T_incrx: + aItem->m_IncrementVector.x = parseDouble(); + NeedRIGHT(); + break; + + case T_incry: + aItem->m_IncrementVector.y = parseDouble(); + NeedRIGHT(); + break; + + case T_incrlabel: + aItem->m_IncrementLabel = parseInt(INT_MIN, INT_MAX); + NeedRIGHT(); + break; + + case T_maxlen: + aItem->m_BoundingBoxSize.x = parseDouble(); + NeedRIGHT(); + break; + + case T_maxheight: + aItem->m_BoundingBoxSize.y = parseDouble(); + NeedRIGHT(); + break; + + case T_font: + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + switch( token ) + { + case T_LEFT: + break; + + case T_bold: + aItem->SetBold( true ); + break; + + case T_italic: + aItem->SetItalic( true ); + break; + + case T_size: + aItem->m_TextSize.x = parseDouble(); + aItem->m_TextSize.y = parseDouble(); + NeedRIGHT(); + break; + + case T_linewidth: + aItem->m_LineWidth = parseDouble(); + NeedRIGHT(); + break; + + default: + Unexpected( CurText() ); + break; + } + } + break; + + case T_justify: + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_EOF) + break; + + switch( token ) + { + case T_center: + aItem->m_Hjustify = GR_TEXT_HJUSTIFY_CENTER; + aItem->m_Vjustify = GR_TEXT_VJUSTIFY_CENTER; + break; + + case T_left: + aItem->m_Hjustify = GR_TEXT_HJUSTIFY_LEFT; + break; + + case T_right: + aItem->m_Hjustify = GR_TEXT_HJUSTIFY_RIGHT; + break; + + case T_top: + aItem->m_Vjustify = GR_TEXT_VJUSTIFY_TOP; + break; + + case T_bottom: + aItem->m_Vjustify = GR_TEXT_VJUSTIFY_BOTTOM; + break; + + default: + Unexpected( CurText() ); + break; + } + } + break; + + case T_rotate: + aItem->m_Orient = parseDouble(); + NeedRIGHT(); + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + +// parse an expression like " 25 1 ltcorner)" +void PAGE_LAYOUT_READER_PARSER::parseCoordinate( POINT_COORD& aCoord) + throw( IO_ERROR, PARSE_ERROR ) +{ + T token; + + aCoord.m_Pos.x = parseDouble(); + aCoord.m_Pos.y = parseDouble(); + + while( ( token = NextTok() ) != T_RIGHT ) + { + switch( token ) + { + case T_ltcorner: + aCoord.m_Anchor = LT_CORNER; // left top corner + break; + + case T_lbcorner: + aCoord.m_Anchor = LB_CORNER; // left bottom corner + break; + + case T_rbcorner: + aCoord.m_Anchor = RB_CORNER; // right bottom corner + break; + + case T_rtcorner: + aCoord.m_Anchor = RT_CORNER; // right top corner + break; + + default: + Unexpected( CurText() ); + break; + } + } +} + +int PAGE_LAYOUT_READER_PARSER::parseInt( int aMin, int aMax ) +{ + T token = NextTok(); + + if( token != T_NUMBER ) + Expecting( T_NUMBER ); + + int val = atoi( CurText() ); + + if( val < aMin ) + val = aMin; + else if( val > aMax ) + val = aMax; + + return val; +} + + +double PAGE_LAYOUT_READER_PARSER::parseDouble() +{ + T token = NextTok(); + + if( token != T_NUMBER ) + Expecting( T_NUMBER ); + + double val = strtod( CurText(), NULL ); + + return val; +} + +// defaultPageLayout is the default page layout description +// using the S expr. +// see page_layout_default_shape.cpp +extern const char defaultPageLayout[]; + +void WORKSHEET_LAYOUT::SetDefaultLayout() +{ + ClearList(); + PAGE_LAYOUT_READER_PARSER lp_parser( defaultPageLayout, wxT( "default page" ) ); + + try + { + lp_parser.Parse( this ); + SetDefaultDescrFlag( true ); + } + catch( IO_ERROR ioe ) + { + wxLogMessage( ioe.errorText ); + } +} + +/** + * Populates the list from a S expr description stored in a string + * @param aPageLayout = the S expr string + */ +void WORKSHEET_LAYOUT::SetPageLayout( const char* aPageLayout, bool Append ) +{ + if( ! Append ) + ClearList(); + + PAGE_LAYOUT_READER_PARSER lp_parser( aPageLayout, wxT( "Sexpr_string" ) ); + + try + { + lp_parser.Parse( this ); + SetDefaultDescrFlag( true ); + } + catch( IO_ERROR ioe ) + { + wxLogMessage( ioe.errorText ); + } +} + +#include + +// SetLayout() try to load a custom layout file, +// currently defined by the environment variable KICAD_WKSFILE +// (a *.kicad_wks file). +// if does not exists, loads the default page layout. +void WORKSHEET_LAYOUT::SetPageLayout( const wxString& aFullFileName, bool Append ) +{ + wxString fullFileName = aFullFileName; + + if( !Append ) + { + fullFileName = MakeFullFileName( aFullFileName ); + + if( fullFileName.IsEmpty() ) + wxGetEnv( wxT( "KICAD_WKSFILE" ), &fullFileName ); + + if( fullFileName.IsEmpty() || !wxFileExists( fullFileName ) ) + { + #if 0 + if( !fullFileName.IsEmpty() ) + { + wxLogMessage( wxT("Page layout file <%s> not found"), + fullFileName.GetData() ); + } + #endif + SetDefaultLayout(); + return; + } + } + + wxFile wksFile( fullFileName ); + + if( ! wksFile.IsOpened() ) + { + if( !Append ) + SetDefaultLayout(); + return; + } + + int filelen = wksFile.Length(); + char * buffer = new char[filelen+10]; + + if( wksFile.Read( buffer, filelen ) != filelen ) + wxLogMessage( _("The file <%s> was not fully read"), + fullFileName.GetData() ); + else + { + buffer[filelen]=0; + if( ! Append ) + ClearList(); + PAGE_LAYOUT_READER_PARSER lp_parser( buffer, fullFileName ); + + try + { + lp_parser.Parse( this ); + SetDefaultDescrFlag( false ); + } + catch( IO_ERROR ioe ) + { + wxLogMessage( ioe.errorText ); + } + } + + delete[] buffer; +} + diff --git a/common/page_layout/page_layout_reader.keywords b/common/page_layout/page_layout_reader.keywords new file mode 100644 index 0000000000..c196dce8d6 --- /dev/null +++ b/common/page_layout/page_layout_reader.keywords @@ -0,0 +1,44 @@ +page_layout +setup +left_margin +right_margin +top_margin +bottom_margin +linewidth +textlinewidth +textsize +comment +option +page1only +notonpage1 +line +rect +polygon +tbtext +ltcorner +lbcorner +rbcorner +rtcorner +name +pos +start +end +pts +xy +maxlen +maxheight +font +bold +italic +size +justify +left +center +right +top +bottom +rotate +repeat +incrx +incry +incrlabel diff --git a/common/page_layout/title_block_shapes.cpp b/common/page_layout/title_block_shapes.cpp new file mode 100644 index 0000000000..4c93661607 --- /dev/null +++ b/common/page_layout/title_block_shapes.cpp @@ -0,0 +1,258 @@ +/** + * @file title_block_shape.cpp + * @brief description of graphic items and texts to build a title block + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + */ + + +/* + * the class WORKSHEET_DATAITEM (and WORKSHEET_DATAITEM_TEXT) defines + * a basic shape of a page layout ( frame references and title block ) + * Basic shapes are line, rect and texts + * the WORKSHEET_DATAITEM coordinates units is the mm, and are relative to + * one of 4 page corners. + * + * These items cannot be drawn or plot "as this". they should be converted + * to a "draw list" (WS_DRAW_ITEM_BASE and derived items) + + * The list of these items is stored in a WORKSHEET_LAYOUT instance. + * + * When building the draw list: + * the WORKSHEET_LAYOUT is used to create a WS_DRAW_ITEM_LIST + * coordinates are converted to draw/plot coordinates. + * texts are expanded if they contain format symbols. + * Items with m_RepeatCount > 1 are created m_RepeatCount times + * + * the WORKSHEET_LAYOUT is created only once. + * the WS_DRAW_ITEM_LIST is created each time the page layout is plot/drawn + * + * the WORKSHEET_LAYOUT instance is created from a S expression which + * describes the page layout (can be the default page layout or a custom file). + */ + +#include +#include +#include +#include +#include +#include + + +// Temporary include. Will be removed when a GOST page layout descr file is available +#ifdef KICAD_GOST +#include "title_block_shapes_gost.cpp" +#endif + +void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( + const PAGE_INFO& aPageInfo, + const TITLE_BLOCK& aTitleBlock, + EDA_COLOR_T aColor, EDA_COLOR_T aAltColor ) +{ + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + +// Ugly hack: will be removed when a GOST page layout descr file is available +#ifdef KICAD_GOST + if( pglayout.IsDefaultDescr() ) + { + ((WS_DRAW_ITEM_LIST_GOST*)this)->BuildWorkSheetGraphicListGOST( aPageInfo, + aTitleBlock, aColor, aAltColor ); + return; + } +#endif + + #define milsTomm (25.4/1000) + + m_titleBlock = &aTitleBlock; + m_paperFormat = &aPageInfo.GetType(); + + wxPoint LTmargin( Mm2mils( pglayout.GetLeftMargin() ), + Mm2mils( pglayout.GetTopMargin() ) ); + wxPoint RBmargin( Mm2mils( pglayout.GetRightMargin() ), + Mm2mils( pglayout.GetBottomMargin() ) ); + + SetMargins( LTmargin, RBmargin ); + SetPageSize( aPageInfo.GetSizeMils() ); + + // Build the basic layout shape, if the layout list is empty + if( pglayout.GetCount() == 0 && !pglayout.VoidListAllowed() ) + pglayout.SetPageLayout(); + + WORKSHEET_DATAITEM::m_WSunits2Iu = m_milsToIu / milsTomm; + WORKSHEET_DATAITEM::m_Color = aColor; // the default color to draw items + WORKSHEET_DATAITEM::m_AltColor = aAltColor; // an alternate color to draw items + + // Left top corner position + DPOINT lt_corner; + lt_corner.x = pglayout.GetLeftMargin(); + lt_corner.y = pglayout.GetTopMargin(); + WORKSHEET_DATAITEM::m_LT_Corner = lt_corner; + + // Right bottom corner position + DPOINT rb_corner; + rb_corner.x = (m_pageSize.x*milsTomm) - pglayout.GetRightMargin(); + rb_corner.y = (m_pageSize.y*milsTomm) - pglayout.GetBottomMargin(); + WORKSHEET_DATAITEM::m_RB_Corner = rb_corner; + + WS_DRAW_ITEM_TEXT* gtext; + int pensize; + + for( unsigned ii = 0; ; ii++ ) + { + WORKSHEET_DATAITEM* wsItem = pglayout.GetItem( ii ); + + if( wsItem == NULL ) + break; + + // Generate it only if the page option allows this + if( wsItem->GetPage1Option() < 0 // Not on page 1 + && m_sheetNumber <= 1 ) + continue; + + if( wsItem->GetPage1Option() > 0 // Only on page 1 + && m_sheetNumber > 1 ) + continue; + + EDA_COLOR_T color = wsItem->GetItemColor(); + + pensize = wsItem->GetPenSizeUi(); + + switch( wsItem->GetType() ) + { + case WORKSHEET_DATAITEM::WS_TEXT: + { + WORKSHEET_DATAITEM_TEXT * wsText = (WORKSHEET_DATAITEM_TEXT*)wsItem; + bool multilines = false; + + if( wsText->m_SpecialMode ) + wsText->m_FullText = wsText->m_TextBase; + else + { + wsText->m_FullText = BuildFullText( wsText->m_TextBase ); + if( wsText->m_FullText.Replace( wxT("\\n" ), wxT("\n") ) > 0 ) + multilines = true; + } + + if( wsText->m_FullText.IsEmpty() ) + break; + + if( pensize == 0 ) + pensize = m_penSize; + + wsText->SetConstrainedTextSize(); + wxSize textsize; + + textsize.x = KiROUND( wsText->m_ConstrainedTextSize.x + * WORKSHEET_DATAITEM::m_WSunits2Iu ); + textsize.y = KiROUND( wsText->m_ConstrainedTextSize.y + * WORKSHEET_DATAITEM::m_WSunits2Iu ); + + if( wsText->IsBold()) + pensize = GetPenSizeForBold( std::min( textsize.x, textsize.y ) ); + + for( int jj = 0; jj < wsText->m_RepeatCount; jj++) + { + if( jj && ! wsText->IsInsidePage( jj ) ) + continue; + + Append( gtext = new WS_DRAW_ITEM_TEXT( wsText, wsText->m_FullText, + wsText->GetStartPosUi( jj ), + textsize, + pensize, color, + wsText->IsItalic(), + wsText->IsBold() ) ); + gtext->SetMultilineAllowed( multilines ); + wsText->TransfertSetupToGraphicText( gtext ); + + // Increment label for the next text + // (has no meaning for multiline texts) + if( wsText->m_RepeatCount > 1 && !multilines ) + wsText->IncrementLabel( (jj+1)*wsText->m_IncrementLabel); + } + } + break; + + case WORKSHEET_DATAITEM::WS_SEGMENT: + if( pensize == 0 ) + pensize = m_penSize; + + for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ ) + { + if( jj && ! wsItem->IsInsidePage( jj ) ) + continue; + Append( new WS_DRAW_ITEM_LINE( wsItem, wsItem->GetStartPosUi( jj ), + wsItem->GetEndPosUi( jj ), + pensize, color ) ); + } + break; + + case WORKSHEET_DATAITEM::WS_RECT: + if( pensize == 0 ) + pensize = m_penSize; + + for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ ) + { + if( jj && ! wsItem->IsInsidePage( jj ) ) + break; + + Append( new WS_DRAW_ITEM_RECT( wsItem, wsItem->GetStartPosUi( jj ), + wsItem->GetEndPosUi( jj ), + pensize, color ) ); + } + break; + + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: + { + WORKSHEET_DATAITEM_POLYPOLYGON * wspoly = + (WORKSHEET_DATAITEM_POLYPOLYGON*) wsItem; + for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ ) + { + if( jj && ! wsItem->IsInsidePage( jj ) ) + continue; + + for( int kk = 0; kk < wspoly->GetPolyCount(); kk++ ) + { + const bool fill = true; + WS_DRAW_ITEM_POLYGON* poly = new WS_DRAW_ITEM_POLYGON( wspoly, + wspoly->GetStartPosUi( jj ), + fill, pensize, color ); + Append( poly ); + + // Create polygon outline + unsigned ist = wspoly->GetPolyIndexStart( kk ); + unsigned iend = wspoly->GetPolyIndexEnd( kk ); + while( ist <= iend ) + poly->m_Corners.push_back( + wspoly->GetCornerPositionUi( ist++, jj ) ); + + } + } + } + break; + } + } +} + diff --git a/common/title_block_shapes_gost.cpp b/common/page_layout/title_block_shapes_gost.cpp similarity index 93% rename from common/title_block_shapes_gost.cpp rename to common/page_layout/title_block_shapes_gost.cpp index 86887d9597..aafa906210 100644 --- a/common/title_block_shapes_gost.cpp +++ b/common/page_layout/title_block_shapes_gost.cpp @@ -977,10 +977,17 @@ Ki_WorkSheetData WS_DopTop_Line6 = #include -void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( - const wxString& aPaperFormat, - const wxString& aFileName, - const wxString& aSheetPathHumanReadable, +class WS_DRAW_ITEM_LIST_GOST : public WS_DRAW_ITEM_LIST +{ +public: + void BuildWorkSheetGraphicListGOST( + const PAGE_INFO& aPageInfo, + const TITLE_BLOCK& aTitleBlock, + EDA_COLOR_T aLineColor, EDA_COLOR_T aTextColor ); +}; + +void WS_DRAW_ITEM_LIST_GOST::BuildWorkSheetGraphicListGOST( + const PAGE_INFO& aPageInfo, const TITLE_BLOCK& aTitleBlock, EDA_COLOR_T aLineColor, EDA_COLOR_T aTextColor ) { @@ -990,8 +997,14 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( Ki_WorkSheetData* WsItem; wxSize size( TEXTSIZE * m_milsToIu, TEXTSIZE * m_milsToIu ); wxString msg; + wxString paperFormat = aPageInfo.GetType(); WS_DRAW_ITEM_TEXT* gtext; + wxPoint LTmargin( Mm2mils( 20 ), Mm2mils( 5 ) ); + wxPoint RBmargin( Mm2mils( 5 ), Mm2mils( 5 ) ); + SetMargins( LTmargin, RBmargin ); + SetPageSize( aPageInfo.GetSizeMils() ); + // Upper left corner refx = m_LTmargin.x; refy = m_LTmargin.y; @@ -1011,7 +1024,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( wxSize size3( TEXTSIZE * m_milsToIu * 3, TEXTSIZE * m_milsToIu * 3 ); // Draw the border. - Append( new WS_DRAW_ITEM_RECT( + Append( new WS_DRAW_ITEM_RECT( NULL, wxPoint( refx * m_milsToIu, refy * m_milsToIu ), wxPoint( xg * m_milsToIu, yg * m_milsToIu ), lnWosn, aLineColor ) ); @@ -1034,12 +1047,12 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( switch( WsItem->m_Type ) { case WS_OSN: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWosn, aLineColor ) ); break; case WS_TONK: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWtonk, aLineColor ) ); break; @@ -1048,11 +1061,11 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( if( !msg.IsEmpty() ) { if( WsItem == &WS_Osn1_Text1 ) - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size0_8, m_penSize, aLineColor ) ); else - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); } @@ -1062,7 +1075,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( if( !msg.IsEmpty() ) { - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); } @@ -1078,7 +1091,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.y = ( refy - Mm2mils( 17.5 ) ) * m_milsToIu; msg.Empty(); msg << m_sheetNumber; - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); } @@ -1087,7 +1100,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.y = ( refy - Mm2mils( 17.5 ) ) * m_milsToIu; msg.Empty(); msg << m_sheetCount; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); @@ -1105,7 +1118,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 25 ) ) * m_milsToIu; pos.y = ( refy - Mm2mils( 7.5 ) ) * m_milsToIu; - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aLineColor ) ); } @@ -1211,7 +1224,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( for( unsigned curLn = 0; curLn < lines.Count(); curLn++ ) { msg = lines[curLn]; - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); pos.y += titleHeight * m_milsToIu; } @@ -1231,7 +1244,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 60 ) ) * m_milsToIu; pos.y = ( refy - Mm2mils( 47.5 ) ) * m_milsToIu; - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT(NULL, msg, pos, sz, m_penSize, aTextColor ) ); } @@ -1249,7 +1262,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 167.5 ) ) * m_milsToIu; pos.y = ( refy - Mm2mils( 27.5 ) ) * m_milsToIu; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); } @@ -1268,7 +1281,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 167 ) ) * m_milsToIu; pos.y = ( refy - Mm2mils( 22.5 ) ) * m_milsToIu; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); } @@ -1287,7 +1300,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 167 ) ) * m_milsToIu; pos.y = ( refy - Mm2mils( 2.5 ) ) * m_milsToIu; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); } @@ -1305,12 +1318,12 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( switch( WsItem->m_Type ) { case WS_OSN: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWosn, aLineColor ) ); break; case WS_TONK: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWtonk, aLineColor ) ); break; @@ -1319,11 +1332,11 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( if( !msg.IsEmpty() ) { if( WsItem == &WS_Osn2a_Text1 ) - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size0_8, m_penSize, aLineColor ) ); else - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); } @@ -1333,7 +1346,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( if( !msg.IsEmpty() ) { - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); @@ -1348,7 +1361,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.y = ( refy - Mm2mils( 4 ) ) * m_milsToIu; msg.Empty(); msg << m_sheetNumber; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); // Decimal number @@ -1365,7 +1378,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 65 ) ) * m_milsToIu; pos.y = ( refy - Mm2mils( 7.5 ) ) * m_milsToIu; - Append( new WS_DRAW_ITEM_TEXT( msg, pos, + Append( new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); } } @@ -1374,8 +1387,8 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 23 ) ) * m_milsToIu; pos.y = ( refy + Mm2mils( 2.5 ) ) * m_milsToIu; msg.Empty(); - msg << aPaperFormat; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + msg << paperFormat; + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); gtext->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); @@ -1397,7 +1410,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( switch( WsItem->m_Type ) { case WS_OSN: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWosn, aLineColor ) ); break; @@ -1405,7 +1418,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( if( !msg.IsEmpty() ) { - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, size, m_penSize, aLineColor ) ); gtext->SetOrientation( TEXT_ORIENT_VERT ); } @@ -1414,7 +1427,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( } } - if( aPaperFormat == PAGE_INFO::A4 || m_pageSize.x > m_pageSize.y ) // A4 or Landscape + if( paperFormat == PAGE_INFO::A4 || m_pageSize.x > m_pageSize.y ) // A4 or Landscape { // Center - left top corner refx = m_LTmargin.x; @@ -1434,12 +1447,12 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( switch( WsItem->m_Type ) { case WS_OSN: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWosn, aLineColor ) ); break; case WS_TONK: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWtonk, aLineColor ) ); break; } @@ -1459,7 +1472,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx + Mm2mils( 35 ) ) * m_milsToIu; pos.y = ( refy + Mm2mils( 7 ) ) * m_milsToIu; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); gtext->SetOrientation( 1800.0 ); } @@ -1485,12 +1498,12 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( switch( WsItem->m_Type ) { case WS_OSN: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWosn, aLineColor ) ); break; case WS_TONK: - Append( new WS_DRAW_ITEM_LINE( pos, end, + Append( new WS_DRAW_ITEM_LINE( NULL, pos, end, lnWtonk, aLineColor ) ); break; } @@ -1510,7 +1523,7 @@ void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( pos.x = ( refx - Mm2mils( 7 ) ) * m_milsToIu; pos.y = ( refy + Mm2mils( 35 ) ) * m_milsToIu; - Append( gtext = new WS_DRAW_ITEM_TEXT( msg, pos, + Append( gtext = new WS_DRAW_ITEM_TEXT( NULL, msg, pos, sz, m_penSize, aTextColor ) ); gtext->SetOrientation( TEXT_ORIENT_VERT ); } diff --git a/common/title_block_shapes.cpp b/common/title_block_shapes.cpp deleted file mode 100644 index 949e844173..0000000000 --- a/common/title_block_shapes.cpp +++ /dev/null @@ -1,438 +0,0 @@ -/** - * @file title_block_shape.cpp - * @brief description of graphic items and texts to build a title block - */ - -/* - * This program source code file is part of KiCad, a free EDA CAD application. - * - * Copyright (C) 1992-2013 Jean-Pierre Charras . - * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 - */ - - -/* - * the class WORKSHEET_DATAITEM (and WORKSHEET_DATAITEM_TEXT) defines - * a basic shape of a page layout ( frame references and title block ) - * Basic shapes are line, rect and texts - * the WORKSHEET_DATAITEM coordinates units is the mm, and are relative to - * one of 4 page corners. - * - * These items cannot be drawn or plot "as this". they should be converted - * to a "draw list" (WS_DRAW_ITEM_BASE and derived items) - - * The list of these items is stored in a WORKSHEET_LAYOUT instance. - * - * When building the draw list: - * the WORKSHEET_LAYOUT is used to create a WS_DRAW_ITEM_LIST - * coordinates are converted to draw/plot coordinates. - * texts are expanded if they contain format symbols. - * Items with m_RepeatCount > 1 are created m_RepeatCount times - * - * the WORKSHEET_LAYOUT is created only once. - * the WS_DRAW_ITEM_LIST is created each time the page layout is plot/drawn - * - * the WORKSHEET_LAYOUT instance is created from a S expression which - * describes the page layout (can be the default page layout or a custom file). - */ - -#include -#include -#include -#include -#include - -WORKSHEET_DATAITEM_POLYPOLYGON::WORKSHEET_DATAITEM_POLYPOLYGON() : - WORKSHEET_DATAITEM( WS_POLYPOLYGON ) -{ - m_Orient = 0.0; -} - -const DPOINT WORKSHEET_DATAITEM_POLYPOLYGON::GetCornerPosition( unsigned aIdx, - int aRepeat ) const -{ - DPOINT pos = m_Corners[aIdx]; - - // Rotation: - RotatePoint( &pos.x, &pos.y, m_Orient * 10 ); - pos += GetStartPos( aRepeat ); - return pos; -} - -void WORKSHEET_DATAITEM_POLYPOLYGON::SetBoundingBox() -{ - if( m_Corners.size() == 0 ) - { - m_minCoord.x = m_maxCoord.x = 0.0; - m_minCoord.y = m_maxCoord.y = 0.0; - return; - } - - DPOINT pos; - pos = m_Corners[0]; - RotatePoint( &pos.x, &pos.y, m_Orient * 10 ); - m_minCoord = m_maxCoord = pos; - - for( unsigned ii = 1; ii < m_Corners.size(); ii++ ) - { - pos = m_Corners[ii]; - RotatePoint( &pos.x, &pos.y, m_Orient * 10 ); - - if( m_minCoord.x > pos.x ) - m_minCoord.x = pos.x; - - if( m_minCoord.y > pos.y ) - m_minCoord.y = pos.y; - - if( m_maxCoord.x < pos.x ) - m_maxCoord.x = pos.x; - - if( m_maxCoord.y < pos.y ) - m_maxCoord.y = pos.y; - } -} - -bool WORKSHEET_DATAITEM_POLYPOLYGON::IsInsidePage( int ii ) const -{ - DPOINT pos = GetStartPos( ii ); - pos += m_minCoord; // left top pos of bounding box - - if( m_LT_Corner.x > pos.x || m_LT_Corner.y > pos.y ) - return false; - - pos = GetStartPos( ii ); - pos += m_maxCoord; // rignt bottom pos of bounding box - - if( m_RB_Corner.x < pos.x || m_RB_Corner.y < pos.y ) - return false; - - return true; -} - -const wxPoint WORKSHEET_DATAITEM_POLYPOLYGON::GetCornerPositionUi( unsigned aIdx, - int aRepeat ) const -{ - DPOINT pos = GetCornerPosition( aIdx, aRepeat ); - pos = pos * m_WSunits2Iu; - return wxPoint( int(pos.x), int(pos.y) ); -} - -WORKSHEET_DATAITEM_TEXT::WORKSHEET_DATAITEM_TEXT( const wxChar* aTextBase ) : - WORKSHEET_DATAITEM( WS_TEXT ) -{ - m_TextBase = aTextBase; - m_IncrementLabel = 1; - m_Hjustify = GR_TEXT_HJUSTIFY_LEFT; - m_Vjustify = GR_TEXT_VJUSTIFY_CENTER; - m_Orient = 0.0; - m_TextSize.x = m_TextSize.y = TB_DEFAULT_TEXTSIZE; -} - -void WORKSHEET_DATAITEM_TEXT::TransfertSetupToGraphicText( WS_DRAW_ITEM_TEXT* aGText ) -{ - aGText->SetHorizJustify( m_Hjustify ) ; - aGText->SetVertJustify( m_Vjustify ); - aGText->SetOrientation( m_Orient * 10 ); // graphic text orient unit = 0.1 degree -} - -void WORKSHEET_DATAITEM_TEXT::IncrementLabel( int aIncr ) -{ - wxChar lbchar = m_TextBase[0]; - if( lbchar >= '0' && lbchar <= '9' ) - // A number is expected: - m_FullText.Printf( wxT("%d"), aIncr + lbchar - '0' ); - else - m_FullText.Printf( wxT("%c"), aIncr + lbchar ); -} - -void WORKSHEET_DATAITEM_TEXT::SetConstrainedTextSize() -{ - m_ConstrainedTextSize = m_TextSize; - - if( m_BoundingBoxSize.x ) - { - bool italic = (m_Flags & USE_ITALIC) != 0; - int linewidth = 0; - int lenMsg = ReturnGraphicTextWidth( m_FullText, m_TextSize.x, italic, linewidth ); - if( lenMsg > m_BoundingBoxSize.x ) - m_ConstrainedTextSize.x = m_TextSize.x * m_BoundingBoxSize.x / lenMsg; - } - - if( m_BoundingBoxSize.y ) - { - if( m_ConstrainedTextSize.y > m_BoundingBoxSize.y ) - m_ConstrainedTextSize.y = m_BoundingBoxSize.y; - } -} - -const DPOINT WORKSHEET_DATAITEM::GetStartPos( int ii ) const -{ - DPOINT pos; - pos.x = m_Pos.m_Pos.x + ( m_IncrementVector.x * ii ); - pos.y = m_Pos.m_Pos.y + ( m_IncrementVector.y * ii ); - - switch( m_Pos.m_Anchor ) - { - case RB_CORNER: // right bottom corner - pos = m_RB_Corner - pos; - break; - - case RT_CORNER: // right top corner - pos.x = m_RB_Corner.x - pos.x; - pos.y = m_LT_Corner.y + pos.y; - break; - - case LB_CORNER: // left bottom corner - pos.x = m_LT_Corner.x + pos.x; - pos.y = m_RB_Corner.y - pos.y; - break; - - case LT_CORNER: // left top corner - pos = m_LT_Corner + pos; - break; - } - - return pos; -} - -const wxPoint WORKSHEET_DATAITEM::GetStartPosUi( int ii ) const -{ - DPOINT pos = GetStartPos( ii ); - pos = pos * m_WSunits2Iu; - return wxPoint( int(pos.x), int(pos.y) ); -} - -const DPOINT WORKSHEET_DATAITEM::GetEndPos( int ii ) const -{ - DPOINT pos; - pos.x = m_End.m_Pos.x + ( m_IncrementVector.x * ii ); - pos.y = m_End.m_Pos.y + ( m_IncrementVector.y * ii ); - switch( m_End.m_Anchor ) - { - case RB_CORNER: // right bottom corner - pos = m_RB_Corner - pos; - break; - - case RT_CORNER: // right top corner - pos.x = m_RB_Corner.x - pos.x; - pos.y = m_LT_Corner.y + pos.y; - break; - - case LB_CORNER: // left bottom corner - pos.x = m_LT_Corner.x + pos.x; - pos.y = m_RB_Corner.y - pos.y; - break; - - case LT_CORNER: // left top corner - pos = m_LT_Corner + pos; - break; - } - - return pos; -} - -const wxPoint WORKSHEET_DATAITEM::GetEndPosUi( int ii ) const -{ - DPOINT pos = GetEndPos( ii ); - pos = pos * m_WSunits2Iu; - return wxPoint( int(pos.x), int(pos.y) ); -} - - -bool WORKSHEET_DATAITEM::IsInsidePage( int ii ) const -{ - DPOINT pos = GetStartPos( ii ); - - if( m_RB_Corner.x < pos.x || m_LT_Corner.x > pos.x ) - return false; - - if( m_RB_Corner.y < pos.y || m_LT_Corner.y > pos.y ) - return false; - - pos = GetEndPos( ii ); - - if( m_RB_Corner.x < pos.x || m_LT_Corner.x > pos.x ) - return false; - - if( m_RB_Corner.y < pos.y || m_LT_Corner.y > pos.y ) - return false; - - return true; -} - -double WORKSHEET_DATAITEM::m_WSunits2Iu = 1.0; -DPOINT WORKSHEET_DATAITEM::m_RB_Corner; -DPOINT WORKSHEET_DATAITEM::m_LT_Corner; - -WORKSHEET_LAYOUT dataList; // The layout shape - -void WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList( - const wxString& aPaperFormat, - const wxString& aFileName, - const wxString& aSheetPathHumanReadable, - const TITLE_BLOCK& aTitleBlock, - EDA_COLOR_T aLineColor, EDA_COLOR_T aTextColor ) -{ - #define milsTomm (25.4/1000) - - m_titleBlock = &aTitleBlock, - m_paperFormat = &aPaperFormat, - m_fileName = &aFileName, - m_sheetFullName = &aSheetPathHumanReadable; - - // Build the basic layout shape, if the layout list is empty - if( dataList.GetCount() == 0 ) - dataList.SetLayout(); - - WORKSHEET_DATAITEM::m_WSunits2Iu = m_milsToIu / milsTomm; - - // Left top corner position - DPOINT lt_corner; - lt_corner.x = m_LTmargin.x; - lt_corner.y = m_LTmargin.y; - WORKSHEET_DATAITEM::m_LT_Corner = lt_corner * milsTomm; - - // Right bottom corner position - DPOINT rb_corner; - rb_corner.x = m_pageSize.x - m_RBmargin.x; - rb_corner.y = m_pageSize.y - m_RBmargin.y; - WORKSHEET_DATAITEM::m_RB_Corner = rb_corner * milsTomm; - - WS_DRAW_ITEM_TEXT* gtext; - int pensize; - EDA_COLOR_T color; - - for( unsigned ii = 0; ; ii++ ) - { - WORKSHEET_DATAITEM* wsItem = dataList.GetItem( ii ); - - if( wsItem == NULL ) - break; - - pensize = wsItem->GetPenSizeUi(); - - switch( wsItem->m_Type ) - { - case WORKSHEET_DATAITEM::WS_TEXT: - { - WORKSHEET_DATAITEM_TEXT * wsText = (WORKSHEET_DATAITEM_TEXT*)wsItem; - wsText->m_FullText = BuildFullText( wsText->m_TextBase ); - if( wsText->m_FullText.IsEmpty() ) - break; - - if( pensize == 0 ) - pensize = m_penSize; - - color = aLineColor; - - if( wsText->m_Flags & USE_TEXT_COLOR ) - color = aTextColor; - - wsText->SetConstrainedTextSize(); - wxSize textsize; - - textsize.x = KiROUND( wsText->m_ConstrainedTextSize.x - * WORKSHEET_DATAITEM::m_WSunits2Iu ); - textsize.y = KiROUND( wsText->m_ConstrainedTextSize.y - * WORKSHEET_DATAITEM::m_WSunits2Iu ); - - if( wsText->IsBold()) - pensize = GetPenSizeForBold( std::min( textsize.x, textsize.y ) ); - - for( int jj = 0; jj < wsText->m_RepeatCount; jj++) - { - if( ! wsText->IsInsidePage( jj ) ) - continue; - - Append( gtext = new WS_DRAW_ITEM_TEXT( wsText->m_FullText, - wsText->GetStartPosUi( jj ), - textsize, - pensize, color, - wsText->IsItalic(), - wsText->IsBold() ) ); - wsText->TransfertSetupToGraphicText( gtext ); - - // Increment label for the next text - if( wsText->m_RepeatCount > 1 ) - wsText->IncrementLabel( jj+1 ); - } - } - break; - - case WORKSHEET_DATAITEM::WS_SEGMENT: - if( pensize == 0 ) - pensize = m_penSize; - - for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ ) - { - if( ! wsItem->IsInsidePage( jj ) ) - continue; - Append( new WS_DRAW_ITEM_LINE( wsItem->GetStartPosUi( jj ), - wsItem->GetEndPosUi( jj ), - pensize, aLineColor ) ); - } - break; - - case WORKSHEET_DATAITEM::WS_RECT: - if( pensize == 0 ) - pensize = m_penSize; - - for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ ) - { - if( ! wsItem->IsInsidePage( jj ) ) - break; - - Append( new WS_DRAW_ITEM_RECT( wsItem->GetStartPosUi( jj ), - wsItem->GetEndPosUi( jj ), - pensize, aLineColor ) ); - } - break; - - case WORKSHEET_DATAITEM::WS_POLYPOLYGON: - { - WORKSHEET_DATAITEM_POLYPOLYGON * wspoly = - (WORKSHEET_DATAITEM_POLYPOLYGON*) wsItem; - for( int jj = 0; jj < wsItem->m_RepeatCount; jj++ ) - { - if( ! wsItem->IsInsidePage( jj ) ) - continue; - - for( int kk = 0; kk < wspoly->GetPolyCount(); kk++ ) - { - const bool fill = true; - WS_DRAW_ITEM_POLYGON* poly = new WS_DRAW_ITEM_POLYGON( fill, - pensize, aLineColor ); - Append( poly ); - - // Create polygon outline - unsigned ist = wspoly->GetPolyIndexStart( kk ); - unsigned iend = wspoly->GetPolyIndexEnd( kk ); - while( ist <= iend ) - poly->m_Corners.push_back( - wspoly->GetCornerPositionUi( ist++, jj ) ); - - } - } - } - break; - } - } -} diff --git a/common/wildcards_and_files_ext.cpp b/common/wildcards_and_files_ext.cpp index fe2c86e223..55449162b0 100644 --- a/common/wildcards_and_files_ext.cpp +++ b/common/wildcards_and_files_ext.cpp @@ -46,6 +46,7 @@ const wxString GerberFileExtension( wxT( "pho" ) ); const wxString LegacyPcbFileExtension( wxT( "brd" ) ); const wxString KiCadPcbFileExtension( wxT( "kicad_pcb" ) ); +const wxString PageLayoutDescrFileExtension( wxT( "kicad_wks" ) ); const wxString PdfFileExtension( wxT( "pdf" ) ); const wxString MacrosFileExtension( wxT( "mcr" ) ); @@ -81,7 +82,7 @@ const wxString EagleFootprintLibPathWildcard( _( "Eagle ver. 6.x XML library fil const wxString GedaPcbFootprintLibFileWildcard( _( "Geda PCB footprint library file (*.fp)|*.fp" ) ); const wxString MacrosFileWildcard( _( "KiCad recorded macros (*.mcr)|*.mcr" ) ); const wxString ComponentFileExtensionWildcard( _( "Component-footprint link file (*.cmp)|*cmp" ) ); - +const wxString PageLayoutDescrFileWildcard( _( "Page layout descr file (*.kicad_wks)|*kicad_wks" ) ); // generic: const wxString AllFilesWildcard( _( "All files (*)|*" ) ); diff --git a/common/worksheet.cpp b/common/worksheet.cpp index 88bf97c179..4e2b1d116c 100644 --- a/common/worksheet.cpp +++ b/common/worksheet.cpp @@ -46,60 +46,6 @@ static const wxString productName = wxT( "KiCad E.D.A. " ); -/* Draws the item list crated by BuildWorkSheetGraphicList - * aClipBox = the clipping rect, or NULL if no clipping - * aDC = the current Device Context - */ -void WS_DRAW_ITEM_LIST::Draw( EDA_RECT* aClipBox, wxDC* aDC ) -{ - for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() ) - { - switch( item->GetType() ) - { - case WS_DRAW_ITEM_BASE::wsg_line: - { - WS_DRAW_ITEM_LINE* line = (WS_DRAW_ITEM_LINE*) item; - GRLine( aClipBox, aDC, - line->GetStart(), line->GetEnd(), - line->GetPenWidth(), line->GetColor() ); - } - break; - - case WS_DRAW_ITEM_BASE::wsg_rect: - { - WS_DRAW_ITEM_RECT* rect = (WS_DRAW_ITEM_RECT*) item; - GRRect( aClipBox, aDC, - rect->GetStart().x, rect->GetStart().y, - rect->GetEnd().x, rect->GetEnd().y, - rect->GetPenWidth(), rect->GetColor() ); - } - break; - - case WS_DRAW_ITEM_BASE::wsg_text: - { - WS_DRAW_ITEM_TEXT* text = (WS_DRAW_ITEM_TEXT*) item; - DrawGraphicText( aClipBox, aDC, text->GetTextPosition(), - text->GetColor(), text->GetText(), - text->GetOrientation(), text->GetSize(), - text->GetHorizJustify(), text->GetVertJustify(), - text->GetPenWidth(), text->IsItalic(), text->IsBold() ); - } - break; - - case WS_DRAW_ITEM_BASE::wsg_poly: - { - WS_DRAW_ITEM_POLYGON* poly = (WS_DRAW_ITEM_POLYGON*) item; - GRPoly( aClipBox, aDC, - poly->m_Corners.size(), &poly->m_Corners[0], - poly->IsFilled() ? FILLED_SHAPE : NO_FILL, - poly->GetPenWidth(), - poly->GetColor(), poly->GetColor() ); - } - break; - } - } -} - void DrawPageLayout( wxDC* aDC, EDA_RECT* aClipBox, const PAGE_INFO& aPageInfo, const wxString &aFullSheetName, @@ -112,19 +58,14 @@ void DrawPageLayout( wxDC* aDC, EDA_RECT* aClipBox, GRSetDrawMode( aDC, GR_COPY ); WS_DRAW_ITEM_LIST drawList; - wxPoint LTmargin( aPageInfo.GetLeftMarginMils(), aPageInfo.GetTopMarginMils() ); - wxPoint RBmargin( aPageInfo.GetRightMarginMils(), aPageInfo.GetBottomMarginMils() ); - wxSize pagesize = aPageInfo.GetSizeMils(); - - drawList.SetMargins( LTmargin, RBmargin ); drawList.SetPenSize( aPenWidth ); drawList.SetMilsToIUfactor( aScalar ); - drawList.SetPageSize( pagesize ); drawList.SetSheetNumber( aSheetNumber ); drawList.SetSheetCount( aSheetCount ); + drawList.SetFileName( aFileName ); + drawList.SetSheetName( aFullSheetName ); - drawList.BuildWorkSheetGraphicList( - aPageInfo.GetType(), aFullSheetName, aFileName, + drawList.BuildWorkSheetGraphicList( aPageInfo, aTitleBlock, aColor, aAltColor ); // Draw item list @@ -154,7 +95,7 @@ void EDA_DRAW_FRAME::DrawWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWi EDA_COLOR_T color = RED; DrawPageLayout( aDC, m_canvas->GetClipBox(), pageInfo, - aFilename, GetScreenDesc(), t_block, + GetScreenDesc(), aFilename, t_block, aScreen->m_NumberOfScreens, aScreen->m_ScreenNumber, aLineWidth, aScalar, color, color ); } @@ -162,7 +103,7 @@ void EDA_DRAW_FRAME::DrawWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWi wxString EDA_DRAW_FRAME::GetScreenDesc() { - // Virtual function, in basic function, returns + // Virtual function. In basic class, returns // an empty string. return wxEmptyString; } diff --git a/demos/electric/electric.sch b/demos/electric/electric.sch index 2cf8f7eb9a..ea8edd51d5 100644 --- a/demos/electric/electric.sch +++ b/demos/electric/electric.sch @@ -187,9 +187,9 @@ F 1 "C_3X2.5MM2" H 2950 6850 40 0000 C C 1 0 0 -1 $EndComp Text Notes 4400 7650 0 60 ~ -Extrieur +Extérieur Text Notes 3800 6260 0 60 ~ -Prises pices vivre +Prises pièces à vivre Text Notes 6860 5960 0 60 ~ Cuisine & Lingerie Wire Notes Line @@ -283,7 +283,7 @@ permanentes Text Notes 10350 2250 0 60 ~ Servitudes Text Notes 6050 2150 0 60 ~ -Servitudes secourues protges +Servitudes secourues protégées Text Notes 6700 700 0 60 ~ Servitudes secourues Wire Notes Line @@ -811,7 +811,7 @@ U 1 1 4162F1F0 P 2550 6950 F 0 "ED71" H 2390 7070 40 0000 C C F 1 "D_10A" H 2450 6870 40 0000 C C -F 2 "Abri pr Mouillire proche" H 4160 6980 40 0000 C C +F 2 "Abri pré Mouillière proche" H 4160 6980 40 0000 C C 1 2550 6950 1 0 0 -1 $EndComp @@ -821,7 +821,7 @@ U 1 1 4162F1CA P 2550 6600 F 0 "ED70" H 2390 6720 40 0000 C C F 1 "D_10A" H 2450 6520 40 0000 C C -F 2 "Abri cot route" H 3920 6600 40 0000 C C +F 2 "Abri coté route" H 3920 6600 40 0000 C C 1 2550 6600 1 0 0 -1 $EndComp @@ -831,7 +831,7 @@ U 1 1 4162F8B1 P 2550 6100 F 0 "ED55" H 2390 6220 40 0000 C C F 1 "D_16A" H 2450 6020 40 0000 C C -F 2 "Entre et salle de bain" H 4080 6100 40 0000 C C +F 2 "Entrée et salle de bain" H 4080 6100 40 0000 C C 1 2550 6100 1 0 0 -1 $EndComp @@ -841,7 +841,7 @@ U 1 1 4162F875 P 2550 5750 F 0 "ED54" H 2390 5870 40 0000 C C F 1 "D_16A" H 2450 5670 40 0000 C C -F 2 "Sjour et sam" H 3860 5740 40 0000 C C +F 2 "Séjour et sam" H 3860 5740 40 0000 C C 1 2550 5750 1 0 0 -1 $EndComp @@ -891,7 +891,7 @@ U 1 1 4162F875 P 8550 6100 F 0 "ED64" H 8390 6220 40 0000 C C F 1 "D_16A" H 8450 6020 40 0000 C C -F 2 "Etage cot atelier" H 9940 6100 40 0000 C C +F 2 "Etage coté atelier" H 9940 6100 40 0000 C C 1 8550 6100 1 0 0 -1 $EndComp @@ -901,7 +901,7 @@ U 1 1 4162F862 P 8550 5750 F 0 "ED63" H 8390 5870 40 0000 C C F 1 "D_16A" H 8450 5670 40 0000 C C -F 2 "Etage cot sellerie" H 9960 5740 40 0000 C C +F 2 "Etage coté sellerie" H 9960 5740 40 0000 C C 1 8550 5750 1 0 0 -1 $EndComp @@ -990,7 +990,7 @@ U 1 1 4162F75D P 5900 5450 F 0 "ED46" H 5740 5570 40 0000 C C F 1 "D_16A" H 5800 5370 40 0000 C C -F 2 "Schoir" H 7060 5440 40 0000 C C +F 2 "Séchoir" H 7060 5440 40 0000 C C 1 5900 5450 1 0 0 -1 $EndComp @@ -1050,7 +1050,7 @@ U 1 1 4162F6F8 P 5900 3350 F 0 "ED40" H 5740 3470 40 0000 C C F 1 "D_32A" H 5800 3270 40 0000 C C -F 2 "Plaque lectrique" H 7260 3340 40 0000 C C +F 2 "Plaque électrique" H 7260 3340 40 0000 C C 1 5900 3350 1 0 0 -1 $EndComp @@ -1152,7 +1152,7 @@ P 8550 1000 F 0 "ED12" H 8390 1120 40 0000 C C F 1 "D_06A" H 8450 920 40 0000 C C F 2 "Eclairage chambre 1, chambre 2" H 10200 1040 40 0000 C C -F 3 "couloir1, wc1, sdb, entre" H 10180 980 40 0000 C C +F 3 "couloir1, wc1, sdb, entrée" H 10180 980 40 0000 C C 1 8550 1000 1 0 0 -1 $EndComp @@ -1162,7 +1162,7 @@ U 1 1 4162F2EE P 8550 1350 F 0 "ED13" H 8390 1470 40 0000 C C F 1 "D_06A" H 8450 1270 40 0000 C C -F 2 "Eclairage sjour, cuisine" H 10100 1380 40 0000 C C +F 2 "Eclairage séjour, cuisine" H 10100 1380 40 0000 C C F 3 "sam, escalier, bureau" H 10100 1320 40 0000 C C 1 8550 1350 1 0 0 -1 @@ -1184,7 +1184,7 @@ U 1 1 4162F22A P 5900 1900 F 0 "ED25" H 5740 2020 40 0000 C C F 1 "D_10A" H 5800 1820 40 0000 C C -F 2 "Matriel sensible" H 7260 1900 40 0000 C C +F 2 "Matériel sensible" H 7260 1900 40 0000 C C 1 5900 1900 1 0 0 -1 $EndComp @@ -1194,7 +1194,7 @@ U 1 1 4162F1F7 P 5900 1500 F 0 "ED22" H 5740 1620 40 0000 C C F 1 "D_10A" H 5800 1420 40 0000 C C -F 2 "Rfrigrateur & conglateur" H 7480 1500 40 0000 C C +F 2 "Réfrigérateur & congélateur" H 7480 1500 40 0000 C C 1 5900 1500 1 0 0 -1 $EndComp @@ -1252,7 +1252,7 @@ F 0 "EO1" H 5300 2300 40 0000 C C F 1 "O_900VA" H 5050 2500 40 0000 C C F 2 "Onduleurs" H 5050 2200 30 0000 C C F 3 "autonomie" H 5050 2150 30 0000 C C -F 4 "rallonge" H 5050 2100 30 0000 C C +F 4 "rallongée" H 5050 2100 30 0000 C C 1 5050 2400 1 0 0 -1 $EndComp @@ -1404,7 +1404,7 @@ P 1000 2150 F 0 "EG1" H 1050 2300 40 0000 C C F 1 "G_TH_3KVA" H 1080 2380 40 0000 C C F 2 "Groupe" H 640 2260 30 0000 C C -F 3 "lectrogne" H 640 2200 30 0000 C C +F 3 "électrogène" H 640 2200 30 0000 C C F 4 "automatique" H 640 2140 30 0000 C C F 5 "diesel" H 640 2080 30 0000 C C 1 1000 2150 diff --git a/demos/pic_programmer/pic_sockets.sch b/demos/pic_programmer/pic_sockets.sch index 69169c1f88..70ca94cb92 100644 --- a/demos/pic_programmer/pic_sockets.sch +++ b/demos/pic_programmer/pic_sockets.sch @@ -13,7 +13,7 @@ Comment2 "" Comment3 "" Comment4 "" $EndDescr -Kmarq B 3100 2150 "Warning Pin power_in non pilote (Net 2)" F=1 +Kmarq B 3100 2150 "Warning Pin power_in non pilotée (Net 2)" F=1 Wire Wire Line 3700 7000 3700 6900 Wire Wire Line diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index 3c06d62237..7a463a99c2 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -1710,3 +1710,25 @@ void LIB_COMPONENT::AddAlias( const wxString& aName ) m_aliases.push_back( new LIB_ALIAS( aName, this ) ); } + + +/** Set the separator char between the subpart id and the reference + * 0 (no separator) or '.' , '-' and '_' + * and the ascii char value to calculate the subpart symbol id from the part number: + * 'A' or '1' only are allowed. (to print U1.A or U1.1) + * if this is a digit, a number is used as id symbol + * Note also if the subpart symbol is a digit, the separator cannot be null. + * @param aSep = the separator symbol (0 (no separator) or '.' , '-' and '_') + * @param aFirstId = the Id of the first part ('A' or '1') + */ +void LIB_COMPONENT::SetSubpartIdNotation( int aSep, int aFirstId ) +{ + m_subpartFirstId = 'A'; + m_subpartIdSeparator = 0; + + if( aSep == '.' || aSep == '-' || aSep == '_' ) + m_subpartIdSeparator = aSep; + + if( aFirstId == '1' && aSep != 0 ) + m_subpartFirstId = aFirstId; +} diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h index fa80cbe3e5..f5856758bd 100644 --- a/eeschema/class_libentry.h +++ b/eeschema/class_libentry.h @@ -206,13 +206,14 @@ class LIB_COMPONENT : public EDA_ITEM LIB_ALIASES m_aliases; ///< List of alias object pointers associated with the ///< component. CMP_LIBRARY* m_library; ///< Library the component belongs to if any. - static int m_subpartIdSeparator; ///< the separator char between + + static int m_subpartIdSeparator; ///< the separator char between ///< the subpart id and the reference ///< like U1A ( m_subpartIdSeparator = 0 ) or U1.A or U1-A - static int m_subpartFirstId; ///< the ascii char value to calculate the subpart symbol id + static int m_subpartFirstId; ///< the ascii char value to calculate the subpart symbol id ///< from the part number: only 'A', 'a' or '1' can be used, ///< other values have no sense. - +private: void deleteAllFields(); public: @@ -659,9 +660,28 @@ public: // Accessors to sub ref parameters static int GetSubpartIdSeparator() { return m_subpartIdSeparator; } - static void SetSubpartIdSeparator( int aSep ) { m_subpartIdSeparator = aSep; } + + /** return a reference to m_subpartIdSeparator, + * only for read/save setting functions + */ + static int* SubpartIdSeparatorPtr() { return &m_subpartIdSeparator; } + static int GetSubpartFirstId() { return m_subpartFirstId; } - static void SetSubpartFirstId( int aFirstId ) { m_subpartFirstId = aFirstId; } + + /** return a reference to m_subpartFirstId, only for read/save setting functions + */ + static int* SubpartFirstIdPtr() { return &m_subpartFirstId; } + + /** Set the separator char between the subpart id and the reference + * 0 (no separator) or '.' , '-' and '_' + * and the ascii char value to calculate the subpart symbol id from the part number: + * 'A' or '1' only are allowed. (to print U1.A or U1.1) + * if this is a digit, a number is used as id symbol + * Note also if the subpart symbol is a digit, the separator cannot be null. + * @param aSep = the separator symbol (0 (no separator) or '.' , '-' and '_') + * @param aFirstId = the Id of the first part ('A' or '1') + */ + static void SetSubpartIdNotation( int aSep, int aFirstId ); /** * Set or clear the alternate body style (DeMorgan) for the component. diff --git a/eeschema/dialogs/dialog_eeschema_config.cpp b/eeschema/dialogs/dialog_eeschema_config.cpp index 8eab18062d..b3f9284067 100644 --- a/eeschema/dialogs/dialog_eeschema_config.cpp +++ b/eeschema/dialogs/dialog_eeschema_config.cpp @@ -33,7 +33,6 @@ #include #include -//#include #include #include #include @@ -221,7 +220,8 @@ void DIALOG_EESCHEMA_CONFIG::OnOkClick( wxCommandEvent& event ) LIB_EDIT_FRAME::EnsureActiveLibExists(); } - m_Parent->SaveProjectFile(); + m_Parent->SaveProjectSettings( false ); + EndModal( wxID_OK ); } diff --git a/eeschema/dialogs/dialog_eeschema_options.cpp b/eeschema/dialogs/dialog_eeschema_options.cpp index 8225e4a187..14424143c6 100644 --- a/eeschema/dialogs/dialog_eeschema_options.cpp +++ b/eeschema/dialogs/dialog_eeschema_options.cpp @@ -51,15 +51,56 @@ void DIALOG_EESCHEMA_OPTIONS::SetUnits( const wxArrayString& units, int select ) void DIALOG_EESCHEMA_OPTIONS::SetRefIdSeparator( wxChar aSep, wxChar aFirstId) { - if( aSep == 0 ) - m_textCtrlSeparatorRefId->SetValue( _("None") ); - else - m_textCtrlSeparatorRefId->SetValue( aSep ); + // m_choiceSeparatorRefId displays one of + // "A" ".A" "-A" "_A" ".1" "-1" "_1" option - m_textCtrlPartFirstId->SetValue( aFirstId ); + int sel = 0; + switch( aSep ) + { + default: + case 0: + aFirstId = 'A'; // cannot use a number without separator + break; + case '.': + sel = 1; + break; + + case '-': + sel = 2; + break; + + case '_': + sel = 3; + break; + } + + if( aFirstId == '1' ) + sel = 4; + + m_choiceSeparatorRefId->SetSelection( sel ); } +void DIALOG_EESCHEMA_OPTIONS::GetRefIdSeparator( int& aSep, int& aFirstId) +{ + // m_choiceSeparatorRefId displays one of + // "A" ".A" "-A" "_A" ".1" "-1" "_1" option + + aFirstId = 'A'; + switch( m_choiceSeparatorRefId->GetSelection() ) + { + default: + case 0: aSep = 0; break; + case 1: aSep = '.'; break; + case 2: aSep = '-'; break; + case 3: aSep = '_'; break; + case 4: aFirstId = '1'; aSep = '.'; break; + case 5: aFirstId = '1'; aSep = '-'; break; + case 6: aFirstId = '1'; aSep = '_'; break; + } +} + + void DIALOG_EESCHEMA_OPTIONS::SetGridSizes( const GRIDS& grid_sizes, int grid_id ) { wxASSERT( grid_sizes.size() > 0 ); diff --git a/eeschema/dialogs/dialog_eeschema_options.h b/eeschema/dialogs/dialog_eeschema_options.h index 36976311e9..01ce909728 100644 --- a/eeschema/dialogs/dialog_eeschema_options.h +++ b/eeschema/dialogs/dialog_eeschema_options.h @@ -76,6 +76,7 @@ public: int GetAutoSaveInterval() const { return m_spinAutoSaveInterval->GetValue(); } void SetRefIdSeparator( wxChar aSep, wxChar aFirstId); + void GetRefIdSeparator( int& aSep, int& aFirstId); void SetShowGrid( bool show ) { m_checkShowGrid->SetValue( show ); } bool GetShowGrid( void ) { return m_checkShowGrid->GetValue(); } diff --git a/eeschema/dialogs/dialog_eeschema_options_base.cpp b/eeschema/dialogs/dialog_eeschema_options_base.cpp index 51187eb040..6dbad7738f 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.cpp +++ b/eeschema/dialogs/dialog_eeschema_options_base.cpp @@ -35,7 +35,7 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx bSizer3 = new wxBoxSizer( wxVERTICAL ); wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 11, 3, 0, 0 ); + fgSizer1 = new wxFlexGridSizer( 10, 3, 0, 0 ); fgSizer1->AddGrowableCol( 0 ); fgSizer1->AddGrowableCol( 1 ); fgSizer1->AddGrowableCol( 2 ); @@ -143,22 +143,15 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx m_staticText23->Wrap( -1 ); fgSizer1->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 3 ); - m_staticText26 = new wxStaticText( m_panel1, wxID_ANY, _("Separator ref/part id:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText26 = new wxStaticText( m_panel1, wxID_ANY, _("Part id notation:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText26->Wrap( -1 ); fgSizer1->Add( m_staticText26, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_textCtrlSeparatorRefId = new wxTextCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - fgSizer1->Add( m_textCtrlSeparatorRefId, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 3 ); - - - fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText27 = new wxStaticText( m_panel1, wxID_ANY, _("Part first Id:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText27->Wrap( -1 ); - fgSizer1->Add( m_staticText27, 0, wxALL, 5 ); - - m_textCtrlPartFirstId = new wxTextCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - fgSizer1->Add( m_textCtrlPartFirstId, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 3 ); + wxString m_choiceSeparatorRefIdChoices[] = { _("A"), _(".A"), _("-A"), _("_A"), _(".1"), _("-1"), _("_1") }; + int m_choiceSeparatorRefIdNChoices = sizeof( m_choiceSeparatorRefIdChoices ) / sizeof( wxString ); + m_choiceSeparatorRefId = new wxChoice( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceSeparatorRefIdNChoices, m_choiceSeparatorRefIdChoices, 0 ); + m_choiceSeparatorRefId->SetSelection( 0 ); + fgSizer1->Add( m_choiceSeparatorRefId, 0, wxALL|wxEXPAND, 5 ); fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); diff --git a/eeschema/dialogs/dialog_eeschema_options_base.fbp b/eeschema/dialogs/dialog_eeschema_options_base.fbp index db5e0c203f..921c443c25 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.fbp +++ b/eeschema/dialogs/dialog_eeschema_options_base.fbp @@ -42,7 +42,7 @@ DIALOG_EESCHEMA_OPTIONS_BASE - 432,560 + 508,560 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER DIALOG_SHIM; dialog_shim.h Schematic Editor Options @@ -288,7 +288,7 @@ fgSizer1 wxFLEX_GROWMODE_SPECIFIED none - 11 + 10 0 3 @@ -2455,7 +2455,7 @@ 0 0 wxID_ANY - Separator reference/part id: + Part id notation: 0 @@ -2507,10 +2507,10 @@ - 3 - wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL + 5 + wxALL|wxEXPAND 0 - + 1 1 1 @@ -2524,6 +2524,7 @@ 1 0 + "A" ".A" "-A" "_A" ".1" "-1" "_1" 1 1 @@ -2541,113 +2542,11 @@ 0 - 0 1 - m_textCtrlSeparatorRefId - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Part first Id: - - 0 - - - 0 - - 1 - m_staticText27 + m_choiceSeparatorRefId 1 @@ -2655,104 +2554,22 @@ 1 Resizable + 0 1 0 - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 3 - wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textCtrlPartFirstId - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_READONLY - - 0 - wxFILTER_NONE wxDefaultValidator - + @@ -2774,10 +2591,6 @@ - - - - diff --git a/eeschema/dialogs/dialog_eeschema_options_base.h b/eeschema/dialogs/dialog_eeschema_options_base.h index af1db4df8d..0b0581e117 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.h +++ b/eeschema/dialogs/dialog_eeschema_options_base.h @@ -22,7 +22,6 @@ class DIALOG_SHIM; #include #include #include -#include #include #include #include @@ -30,6 +29,7 @@ class DIALOG_SHIM; #include #include #include +#include #include #include #include @@ -84,9 +84,7 @@ class DIALOG_EESCHEMA_OPTIONS_BASE : public DIALOG_SHIM wxSpinCtrl* m_spinAutoSaveInterval; wxStaticText* m_staticText23; wxStaticText* m_staticText26; - wxTextCtrl* m_textCtrlSeparatorRefId; - wxStaticText* m_staticText27; - wxTextCtrl* m_textCtrlPartFirstId; + wxChoice* m_choiceSeparatorRefId; wxStaticLine* m_staticline1; wxCheckBox* m_checkShowGrid; wxCheckBox* m_checkShowHiddenPins; @@ -125,7 +123,7 @@ class DIALOG_EESCHEMA_OPTIONS_BASE : public DIALOG_SHIM public: - DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Schematic Editor Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 432,560 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Schematic Editor Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 508,560 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~DIALOG_EESCHEMA_OPTIONS_BASE(); }; diff --git a/eeschema/dialogs/dialog_schematic_find.h b/eeschema/dialogs/dialog_schematic_find.h index 738e36f69c..06b264d9a0 100644 --- a/eeschema/dialogs/dialog_schematic_find.h +++ b/eeschema/dialogs/dialog_schematic_find.h @@ -81,11 +81,11 @@ enum SchematicFindReplaceFlags /** - * Definition FR_MASK_NON_SEARCH_FLAGS + * Definition FR_MASK_NON_COMPARE_FLAGS * is used to mask find/replace flag bits that do not effect the search results. */ -#define FR_MASK_NON_SEARCH_FLAGS ~( wxFR_DOWN | FR_SEARCH_WRAP | FR_NO_WARP_CURSOR | \ - FR_REPLACE_ITEM_FOUND ) +#define FR_MASK_NON_COMPARE_FLAGS ~( wxFR_DOWN | FR_SEARCH_WRAP | FR_NO_WARP_CURSOR | \ + FR_REPLACE_ITEM_FOUND ) /** @@ -122,29 +122,30 @@ public: /** - * Function ChangesSearch - * tests \a aFindReplaceData to see if it would result in a change in the search - * results. + * Function ChangesCompare + * tests \a aFindReplaceData to see if it would result in a change in the search string + * comparison results. * * @param aFindReplaceData A reference to a #SCH_FIND_REPLACE_DATA object to compare * against. * @return True if \a aFindReplaceData would result in a search and/or replace change, * otherwise false. */ - bool ChangesSearch( SCH_FIND_REPLACE_DATA& aFindReplaceData ) + bool ChangesCompare( SCH_FIND_REPLACE_DATA& aFindReplaceData ) { return ( (GetFindString() != aFindReplaceData.GetFindString()) - || (GetSearchFlags() != aFindReplaceData.GetSearchFlags()) ); + || (GetCompareFlags() != aFindReplaceData.GetCompareFlags()) ); } bool IsReplacing() const { return (GetFlags() & FR_SEARCH_REPLACE) != 0; } + bool IsWrapping() const { return (GetFlags() & FR_SEARCH_WRAP) != 0; } private: /** * Function GetSearchFlags * @return The flags that only effect the search result. */ - wxUint32 GetSearchFlags() const { return GetFlags() & FR_MASK_NON_SEARCH_FLAGS; } + wxUint32 GetCompareFlags() const { return GetFlags() & FR_MASK_NON_COMPARE_FLAGS; } }; diff --git a/eeschema/eeschema.cpp b/eeschema/eeschema.cpp index 0ba7209ce9..3fbb373363 100644 --- a/eeschema/eeschema.cpp +++ b/eeschema/eeschema.cpp @@ -123,21 +123,6 @@ bool EDA_APP::OnInit() for( int ii = 0; ii < NB_SCH_LAYERS; ii++ ) SetLayerColor( DARKGRAY, ii ); -#ifdef KICAD_GOST - // These options will be user configurable in the future, - // and not specific to GOST users - // the separator char between the subpart id and the reference - // 0 (no separator) or '.' or some other character - LIB_COMPONENT::SetSubpartIdSeparator( '.' ); - // the ascii char value to calculate the subpart symbol id from the part number: - // 'A' or '1' usually. (to print U1.A or U1.1) - // if this is a digit, a number is used as id symbol - LIB_COMPONENT::SetSubpartFirstId( '1' ); - - // Default diameter of the junction symbol - SCH_JUNCTION::SetSymbolSize( 32 ); -#endif - // read current setup and reopen last directory if no filename to open in // command line bool reopenLastUsedDirectory = argc == 1; diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp index 3d0e730419..832a2b274f 100644 --- a/eeschema/eeschema_config.cpp +++ b/eeschema/eeschema_config.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include @@ -139,7 +140,7 @@ void LIB_EDIT_FRAME::Process_Config( wxCommandEvent& event ) switch( id ) { case ID_CONFIG_SAVE: - schFrame->SaveProjectFile(); + schFrame->SaveProjectSettings( false ); break; case ID_CONFIG_READ: @@ -207,7 +208,7 @@ void SCH_EDIT_FRAME::Process_Config( wxCommandEvent& event ) switch( id ) { case ID_CONFIG_SAVE: - SaveProjectFile(); + SaveProjectSettings( false ); break; case ID_CONFIG_READ: @@ -303,6 +304,15 @@ void SCH_EDIT_FRAME::OnSetOptions( wxCommandEvent& event ) GetScreen()->SetGrid( grid_list[ (size_t) dlg.GetGridSelection() ].m_Size ); + int sep, firstId; + dlg.GetRefIdSeparator( sep, firstId); + if( sep != (int)LIB_COMPONENT::GetSubpartIdSeparator() || + firstId != (int)LIB_COMPONENT::GetSubpartFirstId() ) + { + LIB_COMPONENT::SetSubpartIdNotation( sep, firstId ); + SaveProjectSettings( true ); + } + SetDefaultBusThickness( dlg.GetBusWidth() ); SetDefaultLineThickness( dlg.GetLineWidth() ); SetDefaultLabelSize( dlg.GetTextSize() ); @@ -344,11 +354,21 @@ void SCH_EDIT_FRAME::OnSetOptions( wxCommandEvent& event ) } -PARAM_CFG_ARRAY& SCH_EDIT_FRAME::GetProjectFileParameters() +PARAM_CFG_ARRAY& SCH_EDIT_FRAME::GetProjectFileParametersList() { if( !m_projectFileParams.empty() ) return m_projectFileParams; + m_projectFileParams.push_back( new PARAM_CFG_FILENAME( wxT( "PageLayoutDescrFile" ), + &BASE_SCREEN::m_PageLayoutDescrFileName ) ); + + m_projectFileParams.push_back( new PARAM_CFG_INT( wxT( "SubpartIdSeparator" ), + LIB_COMPONENT::SubpartIdSeparatorPtr(), + IsGOST() ? '.' : 0, 0, 126 ) ); + m_projectFileParams.push_back( new PARAM_CFG_INT( wxT( "SubpartFirstId" ), + LIB_COMPONENT::SubpartFirstIdPtr(), + IsGOST() ? '1' : 'A', '1', 'z' ) ); + m_projectFileParams.push_back( new PARAM_CFG_FILENAME( wxT( "LibDir" ), &m_userLibraryPath ) ); m_projectFileParams.push_back( new PARAM_CFG_LIBNAME_LIST( wxT( "LibName" ), @@ -395,13 +415,25 @@ bool SCH_EDIT_FRAME::LoadProjectFile( const wxString& aFileName, bool aForceRere wxGetApp().RemoveLibraryPath( m_userLibraryPath ); if( !wxGetApp().ReadProjectConfig( fn.GetFullPath(), GROUP, - GetProjectFileParameters(), + GetProjectFileParametersList(), !aForceReread ) ) { m_componentLibFiles = liblist_tmp; IsRead = false; } + // Verify some values, because the config file can be edited by hand, + // and have bad values: + LIB_COMPONENT::SetSubpartIdNotation( LIB_COMPONENT::GetSubpartIdSeparator(), + LIB_COMPONENT::GetSubpartFirstId() ); + + // Load the page layout decr file, from the filename stored in + // BASE_SCREEN::m_PageLayoutDescrFileName, read in config project file + // If empty, the default descr is loaded + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.SetPageLayout(BASE_SCREEN::m_PageLayoutDescrFileName); + + // Load libraries. // User library path takes precedent over default library search paths. wxGetApp().InsertLibraryPath( m_userLibraryPath, 1 ); @@ -418,7 +450,7 @@ bool SCH_EDIT_FRAME::LoadProjectFile( const wxString& aFileName, bool aForceRere } -void SCH_EDIT_FRAME::SaveProjectFile() +void SCH_EDIT_FRAME::SaveProjectSettings( bool aAskForSave ) { wxFileName fn; @@ -428,7 +460,21 @@ void SCH_EDIT_FRAME::SaveProjectFile() if( !IsWritable( fn ) ) return; - wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() ); + if( aAskForSave ) + { + wxFileDialog dlg( this, _( "Save Project File" ), + fn.GetPath(), fn.GetFullName(), + ProjectFileWildcard, wxFD_SAVE | wxFD_CHANGE_DIR ); + + if( dlg.ShowModal() == wxID_CANCEL ) + return; + + wxGetApp().WriteProjectConfig( dlg.GetPath(), GROUP, + GetProjectFileParametersList() ); + } + else + wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, + GetProjectFileParametersList() ); } static const wxString DefaultBusWidthEntry( wxT( "DefaultBusWidth" ) ); diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp index 1d672670bf..a0f4554fad 100644 --- a/eeschema/sch_collectors.cpp +++ b/eeschema/sch_collectors.cpp @@ -338,7 +338,7 @@ bool SCH_COLLECTOR::IsDraggableJunction() const } -bool SCH_FIND_COLLECTOR::atEnd() const +bool SCH_FIND_COLLECTOR::PassedEnd() const { bool retv = false; @@ -351,12 +351,12 @@ bool SCH_FIND_COLLECTOR::atEnd() const { if( flags & wxFR_DOWN ) { - if( m_foundIndex >= (GetCount() - 1) ) + if( m_foundIndex >= GetCount() ) retv = true; } else { - if( m_foundIndex == 0 ) + if( m_foundIndex < 0 ) retv = true; } } @@ -390,21 +390,15 @@ void SCH_FIND_COLLECTOR::UpdateIndex() if( flags & wxFR_DOWN ) { - if( !(flags & FR_SEARCH_WRAP) && (m_foundIndex == (GetCount() - 1)) ) - return; - - m_foundIndex += 1; - + if( m_foundIndex < GetCount() ) + m_foundIndex += 1; if( (m_foundIndex >= GetCount()) && (flags & FR_SEARCH_WRAP) ) m_foundIndex = 0; } else { - if( !(flags & FR_SEARCH_WRAP) && (m_foundIndex == 0) ) - return; - - m_foundIndex -= 1; - + if( m_foundIndex >= 0 ) + m_foundIndex -= 1; if( (m_foundIndex < 0) && (flags & FR_SEARCH_WRAP) ) m_foundIndex = GetCount() - 1; } @@ -452,7 +446,7 @@ wxString SCH_FIND_COLLECTOR::GetText() EDA_ITEM* SCH_FIND_COLLECTOR::GetItem( SCH_FIND_COLLECTOR_DATA& aData ) { - if( atEnd() ) + if( PassedEnd() ) return NULL; aData = m_data[ m_foundIndex ]; @@ -462,7 +456,7 @@ EDA_ITEM* SCH_FIND_COLLECTOR::GetItem( SCH_FIND_COLLECTOR_DATA& aData ) bool SCH_FIND_COLLECTOR::ReplaceItem() { - if( atEnd() ) + if( PassedEnd() ) return false; wxCHECK_MSG( IsValidIndex( m_foundIndex ), false, @@ -516,7 +510,7 @@ SEARCH_RESULT SCH_FIND_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestDat void SCH_FIND_COLLECTOR::Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData, SCH_SHEET_PATH* aSheetPath ) { - if( !m_findReplaceData.ChangesSearch( aFindReplaceData ) && !m_List.empty() && !m_forceSearch ) + if( !IsSearchRequired( aFindReplaceData ) && !m_List.empty() && !m_forceSearch ) return; m_findReplaceData = aFindReplaceData; diff --git a/eeschema/sch_collectors.h b/eeschema/sch_collectors.h index 706a343751..d8851e0d89 100644 --- a/eeschema/sch_collectors.h +++ b/eeschema/sch_collectors.h @@ -238,13 +238,13 @@ class SCH_FIND_COLLECTOR : public COLLECTOR bool m_forceSearch; /** - * Function atEnd - * tests if #m_foundIndex is at the end of the list give the current find/replace - * criterial in #m_findReplaceData. + * Function PassedEnd + * tests if #m_foundIndex is beyond the end of the list give the current + * find/replace criterial in #m_findReplaceData. * - * @return True if #m_foundIndex is at the end of the found item list. + * @return True if #m_foundIndex has crossed the end of the found item list. */ - bool atEnd() const; + bool PassedEnd() const; /** * Function dump @@ -296,7 +296,8 @@ public: */ bool IsSearchRequired( SCH_FIND_REPLACE_DATA& aFindReplaceData ) { - return m_findReplaceData.ChangesSearch( aFindReplaceData ) || m_forceSearch; + return m_findReplaceData.ChangesCompare( aFindReplaceData ) || m_forceSearch || + (m_findReplaceData.IsWrapping() != aFindReplaceData.IsWrapping()); } /** diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index e09712994e..9ed6e461d1 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -390,7 +390,8 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint bool match; wxString text = GetFullyQualifiedText(); - if( ((m_id > VALUE) && !(aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS)) + // User defined fields have an ID of -1. + if( ((m_id > VALUE || m_id < REFERENCE) && !(aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS)) || ((m_id == REFERENCE) && !(aSearchData.GetFlags() & FR_REPLACE_REFERENCES)) ) return false; diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 84326ea9e9..1ee074e744 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -100,8 +100,7 @@ static GRID_TYPE SchematicGridList[] = { #define SCHEMATIC_GRID_LIST_CNT ( sizeof( SchematicGridList ) / sizeof( GRID_TYPE ) ) -SCH_SCREEN::SCH_SCREEN() : - BASE_SCREEN( SCH_SCREEN_T ), +SCH_SCREEN::SCH_SCREEN() : BASE_SCREEN( SCH_SCREEN_T ), m_paper( wxT( "A4" ), IsGOST() ) { size_t i; diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 45ed6a8d91..653709f516 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -830,7 +830,7 @@ void SCH_EDIT_FRAME::OnPrint( wxCommandEvent& event ) if( fn.GetFullName() != default_name ) { fn.SetExt( ProjectFileExtension ); - wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() ); + wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParametersList() ); } } diff --git a/include/appl_wxstruct.h b/include/appl_wxstruct.h index f4a33286a6..6ef675f6a1 100644 --- a/include/appl_wxstruct.h +++ b/include/appl_wxstruct.h @@ -44,7 +44,8 @@ enum EDA_APP_T { APP_PCBNEW_T, APP_CVPCB_T, APP_GERBVIEW_T, - APP_KICAD_T + APP_KICAD_T, + APP_PL_EDITOR_T }; class wxConfigBase; diff --git a/include/base_struct.h b/include/base_struct.h index 9948f5b4d3..b4f196e877 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -47,6 +47,104 @@ extern std::ostream& operator <<( std::ostream& out, const wxPoint& pt ); #endif +/** + * Enum KICAD_T + * is the set of class identification values, stored in EDA_ITEM::m_StructType + */ +enum KICAD_T { + NOT_USED = -1, ///< the 3d code uses this value + + EOT = 0, ///< search types array terminator (End Of Types) + + TYPE_NOT_INIT = 0, + PCB_T, + SCREEN_T, ///< not really an item, used to identify a screen + + // Items in pcb + PCB_MODULE_T, ///< class MODULE, a footprint + PCB_PAD_T, ///< class D_PAD, a pad in a footprint + PCB_LINE_T, ///< class DRAWSEGMENT, a segment not on copper layers + PCB_TEXT_T, ///< class TEXTE_PCB, text on a layer + PCB_MODULE_TEXT_T, ///< class TEXTE_MODULE, text in a footprint + PCB_MODULE_EDGE_T, ///< class EDGE_MODULE, a footprint edge + PCB_TRACE_T, ///< class TRACKE, a track segment (segment on a copper layer) + PCB_VIA_T, ///< class SEGVIA, a via (like a track segment on a copper layer) + PCB_ZONE_T, ///< class SEGZONE, a segment used to fill a zone area (segment on a + ///< copper layer) + PCB_MARKER_T, ///< class MARKER_PCB, a marker used to show something + PCB_DIMENSION_T, ///< class DIMENSION, a dimension (graphic item) + PCB_TARGET_T, ///< class PCB_TARGET, a target (graphic item) + PCB_ZONE_AREA_T, ///< class ZONE_CONTAINER, a zone area + PCB_ITEM_LIST_T, ///< class BOARD_ITEM_LIST, a list of board items + + // Schematic draw Items. The order of these items effects the sort order. + // It is currently ordered to mimic the old Eeschema locate behavior where + // the smallest item is the selected item. + SCH_MARKER_T, + SCH_JUNCTION_T, + SCH_NO_CONNECT_T, + SCH_BUS_WIRE_ENTRY_T, + SCH_BUS_BUS_ENTRY_T, + SCH_LINE_T, + SCH_BITMAP_T, + SCH_TEXT_T, + SCH_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_HIERARCHICAL_LABEL_T, + SCH_FIELD_T, + SCH_COMPONENT_T, + SCH_SHEET_PIN_T, + SCH_SHEET_T, + + // Be prudent with these 3 types: + // they should be used only to locate a specific field type + // among SCH_FIELD_T items types + SCH_FIELD_LOCATE_REFERENCE_T, + SCH_FIELD_LOCATE_VALUE_T, + SCH_FIELD_LOCATE_FOOTPRINT_T, + + // General + SCH_SCREEN_T, + + /* + * Draw items in library component. + * + * The order of these items effects the sort order for items inside the + * "DRAW/ENDDRAW" section of the component definition in a library file. + * If you add a new draw item, type, please make sure you add it so the + * sort order is logical. + */ + LIB_COMPONENT_T, + LIB_ALIAS_T, + LIB_ARC_T, + LIB_CIRCLE_T, + LIB_TEXT_T, + LIB_RECTANGLE_T, + LIB_POLYLINE_T, + LIB_BEZIER_T, + LIB_PIN_T, + + /* + * Fields are not saved inside the "DRAW/ENDDRAW". Add new draw item + * types before this line. + */ + LIB_FIELD_T, + + /* + * For GerbView: items type: + */ + TYPE_GERBER_DRAW_ITEM, + + /* + * for Pl_Editor, in undo/redo commands + */ + TYPE_PL_EDITOR_LAYOUT, + + // End value + MAX_STRUCT_TYPE_ID +}; + + /** * Enum FILL_T * is the set of fill types used in plotting or drawing enclosed areas. diff --git a/include/base_units.h b/include/base_units.h index 30c20ab6be..d37070b608 100644 --- a/include/base_units.h +++ b/include/base_units.h @@ -37,6 +37,16 @@ #include #include +/** Helper function Double2Str to print a float number without + * using scientific notation and no trailing 0 + * We want to avoid scientific notation in S-expr files (not easy to read) + * for floating numbers. + * So we cannot always just use the %g or the %f format to print a fp number + * this helper function uses the %f format when needed, or %g when %f is + * not well working and then removes trailing 0 + */ +std::string Double2Str( double aValue ); + /** * Function StripTrailingZeros * Remove trailing 0 from a string containing a converted float number. diff --git a/include/bitmaps.h b/include/bitmaps.h index f841f87417..b040a4cf14 100644 --- a/include/bitmaps.h +++ b/include/bitmaps.h @@ -74,7 +74,6 @@ EXTERN_BITMAP( add_text_xpm ) EXTERN_BITMAP( add_tracks_xpm ) EXTERN_BITMAP( add_zone_cutout_xpm ) EXTERN_BITMAP( add_zone_xpm ) -EXTERN_BITMAP( icon_pcbnew_xpm ) EXTERN_BITMAP( anchor_xpm ) EXTERN_BITMAP( annotate_down_right_xpm ) EXTERN_BITMAP( annotate_right_down_xpm ) @@ -209,10 +208,12 @@ EXTERN_BITMAP( icon_gerbview_small_xpm ) EXTERN_BITMAP( icon_gerbview_xpm ) EXTERN_BITMAP( icon_kicad_xpm ) EXTERN_BITMAP( icon_modedit_xpm ) +EXTERN_BITMAP( icon_pcbnew_xpm ) EXTERN_BITMAP( icon_txt_xpm ) EXTERN_BITMAP( icon_3d_xpm ) EXTERN_BITMAP( icon_bitmap2component_xpm ) EXTERN_BITMAP( icon_pcbcalculator_xpm ) +EXTERN_BITMAP( icon_pagelayout_editor_xpm ) EXTERN_BITMAP( image_xpm ) EXTERN_BITMAP( import_cmp_from_lib_xpm ) EXTERN_BITMAP( import_footprint_names_xpm ) @@ -354,6 +355,12 @@ EXTERN_BITMAP( pad_sketch_xpm ) EXTERN_BITMAP( pad_xpm ) EXTERN_BITMAP( pad_dimensions_xpm ) EXTERN_BITMAP( pads_mask_layers_xpm ) +EXTERN_BITMAP( pagelayout_load_xpm ) +EXTERN_BITMAP( pagelayout_load_default_xpm ) +EXTERN_BITMAP( pagelayout_new_xpm ) +EXTERN_BITMAP( pagelayout_recent_xpm ) +EXTERN_BITMAP( pagelayout_normal_view_mode_xpm ) +EXTERN_BITMAP( pagelayout_special_view_mode_xpm ) EXTERN_BITMAP( palette_xpm ) EXTERN_BITMAP( part_properties_xpm ) EXTERN_BITMAP( paste_xpm ) diff --git a/include/class_base_screen.h b/include/class_base_screen.h index e7d665d808..4da7754539 100644 --- a/include/class_base_screen.h +++ b/include/class_base_screen.h @@ -95,10 +95,12 @@ private: public: + static wxString m_PageLayoutDescrFileName; ///< the name of the page layout descr file, + ///< or emty to used the default pagelayout wxPoint m_DrawOrg; ///< offsets for drawing the circuit on the screen - wxPoint m_O_Curseur; /* Relative Screen cursor coordinate (on grid) - * in user units. (coordinates from last reset position)*/ + wxPoint m_O_Curseur; ///< Relative Screen cursor coordinate (on grid) + ///< in user units. (coordinates from last reset position) // Scrollbars management: int m_ScrollPixelsPerUnitX; ///< Pixels per scroll unit in the horizontal direction. diff --git a/include/class_worksheet_dataitem.h b/include/class_worksheet_dataitem.h new file mode 100644 index 0000000000..639dc0be33 --- /dev/null +++ b/include/class_worksheet_dataitem.h @@ -0,0 +1,458 @@ +/** + * @file class_worksheet_dataitem.h + * @brief description of graphic items and texts to build a title block + */ + +#ifndef CLASS_WORKSHEET_DATA_ITEM_H +#define CLASS_WORKSHEET_DATA_ITEM_H + +#include +#include + +class WS_DRAW_ITEM_TEXT; // Forward declaration + +#define TB_DEFAULT_TEXTSIZE 1.5 // default worksheet text size in mm + +// Text attributes set in m_flags (ORed bits) +#define USE_BOLD 1 // has meaning for texts +#define USE_THICK_LINE 1 // equivalent to bold for lines +#define USE_ITALIC (1<<1) // has meaning for texts +#define USE_ALT_COLOR (1<<2) +#define SELECTED_STATE (1<<3) // When set, use the hight light color to draw item +#define LOCATE_STARTPOINT (1<<4) // Used in locate function:set by locate function + // if the start point is located +#define LOCATE_ENDPOINT (1<<5) // Used in locate function:set by locate function + // if the end point is located +#define PAGE1OPTION (3<<6) // flag to manage items drawn or not drawn only + // on page 1: NONE = item on all pages +#define PAGE1OPTION_NONE (0<<6) // NONE = item on all pages +#define PAGE1OPTION_PAGE1ONLY (1<<6) // = item only on page 1 +#define PAGE1OPTION_NOTONPAGE1 (2<<6) // = item on all pages but page 1 + +// A coordinate is relative to a page corner. +// Any of the 4 corners can be a reference. +// The default is the right bottom corner +enum corner_anchor +{ + RB_CORNER, // right bottom corner + RT_CORNER, // right top corner + LB_CORNER, // left bottom corner + LT_CORNER, // left top corner +}; + +// a coordinate point +// The position is always relative to the corner anchor +// Note the coordinate is from the anchor point +// to the opposite corner. +class POINT_COORD +{ +public: + DPOINT m_Pos; + int m_Anchor; +public: + POINT_COORD() { m_Anchor = RB_CORNER; } + POINT_COORD( DPOINT aPos, enum corner_anchor aAnchor = RB_CORNER ) + { + m_Pos = aPos; + m_Anchor = aAnchor; + } +}; + + +// Work sheet structure type definitions. +// Basic items are: +// * segment and rect (defined by 2 points) +// * text (defined by a coordinate), the text and its justifications +// * poly polygon defined by a coordinate, and a set of list of corners +// ( because we use it for logos, there are more than one polygon +// in this description +class WORKSHEET_DATAITEM +{ +public: + enum WS_ItemType { + WS_TEXT, + WS_SEGMENT, + WS_RECT, + WS_POLYPOLYGON + }; + +protected: + WS_ItemType m_type; + int m_flags; + +public: + wxString m_Name; // a item name used in page layout + // editor to identify items + wxString m_Info; // a comment, only useful in page + // layout editor + POINT_COORD m_Pos; + POINT_COORD m_End; + double m_LineWidth; + int m_RepeatCount; // repeat count for duplicate items + DPOINT m_IncrementVector; // For duplicate items: move vector + // for position increment + int m_IncrementLabel; + + // These variables are static, because these values are common to all + // instances of WORKSHEET_DATAITEM. + // They are default or common values. + static double m_WSunits2Iu; // conversion factor between + // ws units (mils) and draw/plot units + static DPOINT m_RB_Corner; // cordinates of the right bottom corner + // (ws units) + static DPOINT m_LT_Corner; // cordinates of the left top corner + // (ws units) + static double m_DefaultLineWidth; // Default line width, + // when not defined inside a line + // or a rect + static DSIZE m_DefaultTextSize; // Default text size, + // when not defined inside a tbtext + static double m_DefaultTextThickness;// Default text thickness, + // when not defined inside a tbtext + static bool m_SpecialMode; // Used in page layout editor + // When set to true, base texts + // instead of full texts are displayed + static EDA_COLOR_T m_Color; // the default color to draw items + static EDA_COLOR_T m_AltColor; // an alternate color to draw items + static EDA_COLOR_T m_SelectedColor; // the color to draw selected items + // (used in page layout editor + + +public: + WORKSHEET_DATAITEM( WS_ItemType aType ); + + virtual ~WORKSHEET_DATAITEM() {} + + void SetStart( double aPosx, double aPosy, enum corner_anchor aAnchor = RB_CORNER ) + { + m_Pos.m_Pos.x = aPosx; + m_Pos.m_Pos.y = aPosy; + m_Pos.m_Anchor = aAnchor; + } + + void SetEnd( double aPosx, double aPosy, enum corner_anchor aAnchor = RB_CORNER ) + { + m_End.m_Pos.x = aPosx; + m_End.m_Pos.y = aPosy; + m_End.m_Anchor = aAnchor; + } + + // Accessors: + WS_ItemType GetType() const { return m_type; } + int GetFlags() const { return m_flags; } + void SetFlags( int aMask ) { m_flags |= aMask; } + void ClearFlags( int aMask ) { m_flags &= ~aMask; } + + /** + * @return true if the item has a end point (segment; rect) + * of false (text, polugon) + */ + virtual bool HasEndPoint() { return true; } + + /** + * @return 0 if the item has no specific option for page 1 + * 1 if the item is only on page 1 + * -1 if the item is not on page 1 + */ + int GetPage1Option(); + + /** + * Set the option for page 1 + * @param aChoice = 0 if the item has no specific option for page 1 + * > 0 if the item is only on page 1 + * < 0 if the item is not on page 1 + */ + void SetPage1Option( int aChoice ); + + // Coordinate handling + const wxPoint GetStartPosUi( int ii = 0 ) const; + const wxPoint GetEndPosUi( int ii = 0 ) const; + const DPOINT GetStartPos( int ii = 0 ) const; + const DPOINT GetEndPos( int ii = 0 ) const; + virtual int GetPenSizeUi() + { + if( m_LineWidth ) + return KiROUND( m_LineWidth * m_WSunits2Iu ); + else + return KiROUND( m_DefaultLineWidth * m_WSunits2Iu ); + } + + static int GetMarkerSizeUi() + { + return KiROUND( 0.5 * m_WSunits2Iu ); + } + + /** + * move item to a new position + * @param aPosition = the new position of item, in mm + */ + void MoveTo( DPOINT aPosition ); + + /** + * move item to a new position + * @param aPosition = the new position of the starting point in graphic units + */ + void MoveToUi( wxPoint aPosition ); + + /** + * move the starting point of the item to a new position + * @param aPosition = the new position of the starting point, in mm + */ + void MoveStartPointTo( DPOINT aPosition ); + + /** + * move the starting point of the item to a new position + * @param aPosition = the new position of item in graphic units + */ + void MoveStartPointToUi( wxPoint aPosition ); + + + /** + * move the ending point of the item to a new position + * has meaning only for items defined by 2 points + * (segments and rectangles) + * @param aPosition = the new position of the ending point, in mm + */ + void MoveEndPointTo( DPOINT aPosition ); + + /** + * move the ending point of the item to a new position + * has meaning only for items defined by 2 points + * (segments and rectangles) + * @param aPosition = the new position of the ending point in graphic units + */ + void MoveEndPointToUi( wxPoint aPosition ); + + /** + * @return true if the item is inside the rectangle defined by the + * 4 corners, false otherwise. + */ + virtual bool IsInsidePage( int ii ) const; + + const wxString GetClassName() const; + + /** + * @return true if the selected state on ON + */ + bool IsSelected() { return (m_flags & SELECTED_STATE) != 0; } + + /** + * Function SetSelected + * Toggles on/off the selected flag (used in edition functions + * @param aState = the flag value + */ + void SetSelected( bool aState ) + { + if( aState ) + m_flags |= SELECTED_STATE; + else + m_flags &= ~SELECTED_STATE; + } + + bool UseAltColor() {return m_flags & USE_ALT_COLOR; } + + EDA_COLOR_T GetItemColor() + { + if( IsSelected() ) + return m_SelectedColor; + + if( UseAltColor() ) + return m_AltColor; + + return m_Color; + } +}; + +class WORKSHEET_DATAITEM_POLYPOLYGON : public WORKSHEET_DATAITEM +{ +public: + double m_Orient; // Orientation in degrees + std::vector m_Corners; // corner list + +private: + std::vector m_polyIndexEnd; // index of the last point of each polygon + DPOINT m_minCoord; // min coord of corners, relative to m_Pos + DPOINT m_maxCoord; // max coord of corners, relative to m_Pos + +public: + WORKSHEET_DATAITEM_POLYPOLYGON( ); + + virtual int GetPenSizeUi() + { + return KiROUND( m_LineWidth * m_WSunits2Iu ); + } + + /** + * @return false (no end point) + */ + virtual bool HasEndPoint() { return false; }; + + /** + * add a corner in corner list + * @param aCorner: the item to append + */ + void AppendCorner( const DPOINT& aCorner ) + { + m_Corners.push_back( aCorner ); + } + + /** + * Closes the current contour, by storing the index of the last corner + * of the current polygon in m_polyIndexEnd. + */ + void CloseContour() + { + m_polyIndexEnd.push_back( m_Corners.size() -1 ); + } + + /** + * @return the count of contours in the poly polygon + */ + int GetPolyCount() const { return (int) m_polyIndexEnd.size(); } + + /** + * @return the index of the first corner of the contour aCountour + * @param aContour = the index of the contour + */ + unsigned GetPolyIndexStart( unsigned aContour) const + { + if( aContour == 0 ) + return 0; + else + return m_polyIndexEnd[aContour-1] + 1; + } + + /** + * @return the index of the last corner of the contour aCountour + * @param aContour = the index of the contour + */ + unsigned GetPolyIndexEnd( unsigned aContour) const + { + return m_polyIndexEnd[aContour]; + } + + /** + * @return the coordinate (in mm) of the corner aIdx, + * for the repeated item aRepeat + */ + const DPOINT GetCornerPosition( unsigned aIdx, int aRepeat = 0 ) const; + + /** + * @return the coordinate (in draw/plot units) of the corner aIdx, + * for the repeated item aRepeat + */ + const wxPoint GetCornerPositionUi( unsigned aIdx, int aRepeat = 0 ) const; + + /** + * calculate the bounding box of the set polygons + */ + void SetBoundingBox(); + + bool IsInsidePage( int ii ) const; +}; + +class WORKSHEET_DATAITEM_TEXT : public WORKSHEET_DATAITEM +{ +public: + wxString m_TextBase; // The basic text, with format symbols + wxString m_FullText; // The expanded text, shown on screen + double m_Orient; // Orientation in degrees + enum EDA_TEXT_HJUSTIFY_T m_Hjustify; + enum EDA_TEXT_VJUSTIFY_T m_Vjustify; + DSIZE m_TextSize; + DSIZE m_BoundingBoxSize; // When not null, this is the max + // size of the full text. + // the text size will be modified + // to keep the full text insite this + // bound. + DSIZE m_ConstrainedTextSize;// Actual text size, if constrained by + // the m_BoundingBoxSize constraint + + +public: + WORKSHEET_DATAITEM_TEXT( const wxChar* aTextBase ); + + /** + * @return false (no end point) + */ + virtual bool HasEndPoint() { return false; }; + + virtual int GetPenSizeUi() + { + if( m_LineWidth ) + return KiROUND( m_LineWidth * m_WSunits2Iu ); + else + return KiROUND( m_DefaultTextThickness * m_WSunits2Iu ); + } + + /** + * move item to a new position + * @param aPosition = the new position of item + */ + void MoveTo( DPOINT aPosition ); + + /** + * transfert the text justification and orientation + * to aGText + */ + void TransfertSetupToGraphicText( WS_DRAW_ITEM_TEXT* aGText ); + + /** + * Try to build text wihich is an increment of m_TextBase + * has meaning only if m_TextBase is a basic text (one char) + * If the basic char is a digit, build a number + * If the basic char is a letter, use the letter with ascii code + * aIncr + (basic char ascc code) + * @param aIncr = the increment value + * return the incremented label in m_FullText + */ + void IncrementLabel( int aIncr ); + + /** + * Calculates m_ConstrainedTextSize from m_TextSize + * to keep the X size and the full Y size of the text + * smaller than m_BoundingBoxSize + * if m_BoundingBoxSize.x or m_BoundingBoxSize.y > 0 + * if m_BoundingBoxSize.x or m_BoundingBoxSize.y == 0 + * the corresponding text size is not constrained + */ + void SetConstrainedTextSize(); + + /** + * @return true is a bold font should be selected + */ + bool IsBold() { return (m_flags & USE_BOLD) != 0; } + + /** + * Function SetBold + * Toggles on/off the bold option flag + * @param aState = the bold option value + */ + void SetBold( bool aState ) + { + if( aState ) + m_flags |= USE_BOLD; + else + m_flags &= ~USE_BOLD; + } + + /** + * @return true is an italic font should be selected + */ + bool IsItalic() const { return (m_flags & USE_ITALIC) != 0; } + + /** + * Function SetItalic + * Toggles on/off the italic option flag + * @param aState = the italic option value + */ + void SetItalic( bool aState ) + { + if( aState ) + m_flags |= USE_ITALIC; + else + m_flags &= ~USE_ITALIC; + } +}; + +#endif // CLASS_WORKSHEET_DATA_ITEM_H diff --git a/include/common.h b/include/common.h index fe8f3d08cc..aece0a6cc6 100644 --- a/include/common.h +++ b/include/common.h @@ -83,6 +83,7 @@ enum pseudokeys { #define GERBVIEW_EXE wxT( "gerbview.exe" ) #define BITMAPCONVERTER_EXE wxT( "bitmap2component.exe" ) #define PCB_CALCULATOR_EXE wxT( "pcb_calculator.exe" ) +#define PL_EDITOR_EXE wxT( "pl_editor.exe" ) #else #ifndef __WXMAC__ #define CVPCB_EXE wxT( "cvpcb" ) @@ -91,6 +92,7 @@ enum pseudokeys { #define GERBVIEW_EXE wxT( "gerbview" ) #define BITMAPCONVERTER_EXE wxT( "bitmap2component" ) #define PCB_CALCULATOR_EXE wxT( "pcb_calculator" ) +#define PL_EDITOR_EXE wxT( "pl_editor" ) #else #define CVPCB_EXE wxT( "cvpcb.app/Contents/MacOS/cvpcb" ) #define PCBNEW_EXE wxT( "pcbnew.app/Contents/MacOS/pcbnew" ) @@ -98,6 +100,7 @@ enum pseudokeys { #define GERBVIEW_EXE wxT( "gerbview.app/Contents/MacOS/gerbview" ) #define BITMAPCONVERTER_EXE wxT( "bitmap2component.app/Contents/MacOS/bitmap2component" ) #define PCB_CALCULATOR_EXE wxT( "pcb_calculator.app/Contents/MacOS/pcb_calculator" ) +#define PL_EDITOR_EXE wxT( "pcb_calculator.app/Contents/MacOS/pl_editor" ) # endif #endif @@ -167,7 +170,14 @@ inline int Mils2mm( double x ) { return KiROUND( x * 25.4 / 1000. ); } /// Return whether GOST is in play -bool IsGOST(); +inline bool IsGOST() +{ +#if defined(KICAD_GOST) + return true; +#else + return false; +#endif +} enum EDA_UNITS_T { @@ -286,60 +296,12 @@ public: // Accessors returning "Internal Units (IU)". IUs are mils in EESCHEMA, // and either deci-mils or nanometers in PCBNew. -#if defined(PCBNEW) || defined(EESCHEMA) || defined(GERBVIEW) +#if defined(PCBNEW) || defined(EESCHEMA) || defined(GERBVIEW) || defined(PL_EDITOR) int GetWidthIU() const { return IU_PER_MILS * GetWidthMils(); } int GetHeightIU() const { return IU_PER_MILS * GetHeightMils(); } const wxSize GetSizeIU() const { return wxSize( GetWidthIU(), GetHeightIU() ); } #endif - /** - * Function GetLeftMarginMils. - * @return int - logical page left margin in mils. - */ - int GetLeftMarginMils() const { return m_left_margin; } - - /** - * Function GetLeftMarginMils. - * @return int - logical page right margin in mils. - */ - int GetRightMarginMils() const { return m_right_margin; } - - /** - * Function GetLeftMarginMils. - * @return int - logical page top margin in mils. - */ - int GetTopMarginMils() const { return m_top_margin; } - - /** - * Function GetBottomMarginMils. - * @return int - logical page bottom margin in mils. - */ - int GetBottomMarginMils() const { return m_bottom_margin; } - - /** - * Function SetLeftMarginMils - * sets left page margin to @a aMargin in mils. - */ - void SetLeftMarginMils( int aMargin ) { m_left_margin = aMargin; } - - /** - * Function SetRightMarginMils - * sets right page margin to @a aMargin in mils. - */ - void SetRightMarginMils( int aMargin ) { m_right_margin = aMargin; } - - /** - * Function SetTopMarginMils - * sets top page margin to @a aMargin in mils. - */ - void SetTopMarginMils( int aMargin ) { m_top_margin = aMargin; } - - /** - * Function SetBottomMarginMils - * sets bottom page margin to @a aMargin in mils. - */ - void SetBottomMarginMils( int aMargin ) { m_bottom_margin = aMargin; } - /** * Function SetCustomWidthMils * sets the width of Custom page in mils, for any custom page @@ -419,12 +381,6 @@ private: #define MIN_PAGE_SIZE 4000 #define MAX_PAGE_SIZE 48000 - - int m_left_margin; - int m_right_margin; - int m_top_margin; - int m_bottom_margin; - bool m_portrait; ///< true if portrait, false if landscape wxPaperSize m_paper_id; ///< wx' style paper id. diff --git a/include/convert_to_biu.h b/include/convert_to_biu.h index 2b67f4b239..5401930078 100644 --- a/include/convert_to_biu.h +++ b/include/convert_to_biu.h @@ -55,8 +55,25 @@ inline int DMils2iu( int dmils ) #endif } -#else // Eeschema and anything else. +#elif defined (PL_EDITOR) +#define IU_PER_MM 1e3 // internal units in micron (should be enough) +#define IU_PER_MILS (IU_PER_MM * 0.0254) +#define IU_PER_DECIMILS (IU_PER_MM * 0.00254) +/// Convert mils to page layout editor internal units (iu). +inline int Mils2iu( int mils ) +{ + double x = mils * IU_PER_MILS; + return int( x < 0 ? x - 0.5 : x + 0.5 ); +} +/// Convert deci-mils to page layout editor internal units (iu). +inline int DMils2iu( int dmils ) +{ + double x = dmils * IU_PER_DECIMILS; + return int( x < 0 ? x - 0.5 : x + 0.5 ); +} + +#else // Eeschema and anything else. #define IU_PER_DECIMILS 0.1 #define IU_PER_MILS 1.0 #define IU_PER_MM (IU_PER_MILS / 0.0254) diff --git a/include/dsnlexer.h b/include/dsnlexer.h index 896a8bf2f4..c85a6bd982 100644 --- a/include/dsnlexer.h +++ b/include/dsnlexer.h @@ -136,15 +136,13 @@ protected: /** * Function findToken - * takes a string and looks up the string in the list of expected - * tokens. + * takes aToken string and looks up the string in the keywords table. * - * @param tok A string holding the token text to lookup, in an - * unpredictable case: uppercase or lowercase - * @return int - DSN_T matching the keyword text, or DSN_SYMBOL if argument - * string is not a recognized token. + * @param aToken is a string to lookup in the keywords table. + * @return int - with a value from the enum DSN_T matching the keyword text, + * or DSN_SYMBOL if @a aToken is not in the kewords table. */ - int findToken( const std::string& tok ); + int findToken( const std::string& aToken ); bool isStringTerminator( char cc ) { diff --git a/include/hashtables.h b/include/hashtables.h index a0fbd778b7..2523baa057 100644 --- a/include/hashtables.h +++ b/include/hashtables.h @@ -96,7 +96,7 @@ struct fnv_1a for( ; *it; ++it ) { - hash ^= *it; + hash ^= (unsigned char) *it; hash *= 16777619; } return hash; diff --git a/include/view/view_item.h b/include/view/view_item.h index 3c1e2b3b33..5f73124e6d 100644 --- a/include/view/view_item.h +++ b/include/view/view_item.h @@ -31,101 +31,8 @@ #define __VIEW_ITEM_H #include - #include -/** - * Enum KICAD_T - * is the set of class identification values, stored in VIEW_ITEM::m_StructType - */ -enum KICAD_T { - NOT_USED = -1, ///< the 3d code uses this value - - EOT = 0, ///< search types array terminator (End Of Types) - - TYPE_NOT_INIT = 0, - PCB_T, - SCREEN_T, ///< not really an item, used to identify a screen - - // Items in pcb - PCB_MODULE_T, ///< class MODULE, a footprint - PCB_PAD_T, ///< class D_PAD, a pad in a footprint - PCB_LINE_T, ///< class DRAWSEGMENT, a segment not on copper layers - PCB_TEXT_T, ///< class TEXTE_PCB, text on a layer - PCB_MODULE_TEXT_T, ///< class TEXTE_MODULE, text in a footprint - PCB_MODULE_EDGE_T, ///< class EDGE_MODULE, a footprint edge - PCB_TRACE_T, ///< class TRACKE, a track segment (segment on a copper layer) - PCB_VIA_T, ///< class SEGVIA, a via (like a track segment on a copper layer) - PCB_ZONE_T, ///< class SEGZONE, a segment used to fill a zone area (segment on a - ///< copper layer) - PCB_MARKER_T, ///< class MARKER_PCB, a marker used to show something - PCB_DIMENSION_T, ///< class DIMENSION, a dimension (graphic item) - PCB_TARGET_T, ///< class PCB_TARGET, a target (graphic item) - PCB_ZONE_AREA_T, ///< class ZONE_CONTAINER, a zone area - PCB_ITEM_LIST_T, ///< class BOARD_ITEM_LIST, a list of board items - - // Schematic draw Items. The order of these items effects the sort order. - // It is currently ordered to mimic the old Eeschema locate behavior where - // the smallest item is the selected item. - SCH_MARKER_T, - SCH_JUNCTION_T, - SCH_NO_CONNECT_T, - SCH_BUS_WIRE_ENTRY_T, - SCH_BUS_BUS_ENTRY_T, - SCH_LINE_T, - SCH_BITMAP_T, - SCH_TEXT_T, - SCH_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_HIERARCHICAL_LABEL_T, - SCH_FIELD_T, - SCH_COMPONENT_T, - SCH_SHEET_PIN_T, - SCH_SHEET_T, - - // Be prudent with these 3 types: - // they should be used only to locate a specific field type - // among SCH_FIELD_T items types - SCH_FIELD_LOCATE_REFERENCE_T, - SCH_FIELD_LOCATE_VALUE_T, - SCH_FIELD_LOCATE_FOOTPRINT_T, - - // General - SCH_SCREEN_T, - - /* - * Draw items in library component. - * - * The order of these items effects the sort order for items inside the - * "DRAW/ENDDRAW" section of the component definition in a library file. - * If you add a new draw item, type, please make sure you add it so the - * sort order is logical. - */ - LIB_COMPONENT_T, - LIB_ALIAS_T, - LIB_ARC_T, - LIB_CIRCLE_T, - LIB_TEXT_T, - LIB_RECTANGLE_T, - LIB_POLYLINE_T, - LIB_BEZIER_T, - LIB_PIN_T, - - /* - * Fields are not saved inside the "DRAW/ENDDRAW". Add new draw item - * types before this line. - */ - LIB_FIELD_T, - - /* - * For GerbView: items type: - */ - TYPE_GERBER_DRAW_ITEM, - - // End value - MAX_STRUCT_TYPE_ID -}; - namespace KiGfx { // Forward declarations @@ -285,9 +192,6 @@ public: */ void ViewRelease(); - /// @copydoc EDA_ITEM::Type() - virtual KICAD_T Type() const = 0; - protected: friend class VIEW; diff --git a/include/wildcards_and_files_ext.h b/include/wildcards_and_files_ext.h index 39dc4f5165..ac882a1bf3 100644 --- a/include/wildcards_and_files_ext.h +++ b/include/wildcards_and_files_ext.h @@ -55,6 +55,7 @@ extern const wxString GerberFileExtension; extern const wxString LegacyPcbFileExtension; extern const wxString KiCadPcbFileExtension; #define PcbFileExtension KiCadPcbFileExtension // symlink choice +extern const wxString PageLayoutDescrFileExtension; extern const wxString LegacyFootprintLibPathExtension; extern const wxString PdfFileExtension; @@ -69,6 +70,7 @@ extern const wxString KiCadFootprintLibPathExtension; extern const wxString GedaPcbFootprintLibFileExtension; extern const wxString EagleFootprintLibPathExtension; extern const wxString ComponentFileExtensionWildcard; +extern const wxString PageLayoutDescrFileWildcard; /// Proper wxFileDialog wild card definitions. extern const wxString SchematicSymbolFileWildcard; diff --git a/include/worksheet_shape_builder.h b/include/worksheet_shape_builder.h index df037c80a9..af6051c353 100644 --- a/include/worksheet_shape_builder.h +++ b/include/worksheet_shape_builder.h @@ -10,257 +10,11 @@ #include #include -class WS_DRAW_ITEM_TEXT; // Forward declaration +class WORKSHEET_DATAITEM; // Forward declaration +class TITLE_BLOCK; #define TB_DEFAULT_TEXTSIZE 1.5 // default worksheet text size in mm -// Text attributes set in m_Flags (ORed bits) - #define USE_BOLD 1 // has meaning for texts - #define USE_THICK_LINE 1 // equivalent to bold for lines - #define USE_ITALIC 2 // has meaning for texts - #define USE_TEXT_COLOR 4 - #define SET_UPPER_LIMIT 8 // Flag used to calculate variable position items - -// A coordinate is relative to a page corner. -// Any of the 4 corners can be a reference. -// The default is the right bottom corner -enum corner_anchor -{ - RB_CORNER, // right bottom corner - RT_CORNER, // right top corner - LB_CORNER, // left bottom corner - LT_CORNER, // left top corner -}; - -// a coordinate point -// The position is always relative to the corner anchor -// Note the coordinate is from the anchor point -// to the opposite corner. -class POINT_COORD -{ -public: - DPOINT m_Pos; - int m_Anchor; -public: - POINT_COORD() { m_Anchor = RB_CORNER; } - POINT_COORD( DPOINT aPos, enum corner_anchor aAnchor = RB_CORNER ) - { - m_Pos = aPos; - m_Anchor = aAnchor; - } -}; - - -// Work sheet structure type definitions. -// Basic items are: -// * segment and rect (defined by 2 points) -// * text (defined by a coordinate), the text and its justifications -// * poly polygon defined by a coordinate, and a set of list of corners -// ( because we use it for logos, there are more than one polygon -// in this description -class WORKSHEET_DATAITEM -{ -public: - enum WS_ItemType { - WS_TEXT, - WS_SEGMENT, - WS_RECT, - WS_POLYPOLYGON - }; - WS_ItemType m_Type; - POINT_COORD m_Pos; - POINT_COORD m_End; - double m_LineWidth; - int m_Flags; - int m_RepeatCount; // repeat count for duplicate items - DPOINT m_IncrementVector; // For duplicate items: move vector - // for position increment - int m_IncrementLabel; - - static double m_WSunits2Iu; // conversion factor between - // ws units (mils) and draw/plot units - static DPOINT m_RB_Corner; // cordinates of the right bottom corner - // (ws units) - static DPOINT m_LT_Corner; // cordinates of the left top corner - // (ws units) - -public: - WORKSHEET_DATAITEM( WS_ItemType aType ) - { - m_Type = aType; - m_Flags = 0; - m_RepeatCount = 1; - m_IncrementLabel = 0; - m_LineWidth = 0.0; - } - - virtual ~WORKSHEET_DATAITEM() {} - - void SetStart( double aPosx, double aPosy, enum corner_anchor aAnchor = RB_CORNER ) - { - m_Pos.m_Pos.x = aPosx; - m_Pos.m_Pos.y = aPosy; - m_Pos.m_Anchor = aAnchor; - } - - void SetEnd( double aPosx, double aPosy, enum corner_anchor aAnchor = RB_CORNER ) - { - m_End.m_Pos.x = aPosx; - m_End.m_Pos.y = aPosy; - m_End.m_Anchor = aAnchor; - } - - const wxPoint GetStartPosUi( int ii = 0 ) const; - const wxPoint GetEndPosUi( int ii = 0 ) const; - const DPOINT GetStartPos( int ii = 0 ) const; - const DPOINT GetEndPos( int ii = 0 ) const; - int GetPenSizeUi() {return KiROUND( m_LineWidth * m_WSunits2Iu ); } - - /** - * @return true if the item is inside the rectangle defined by the - * 4 corners, false otherwise. - */ - virtual bool IsInsidePage( int ii ) const; -}; - -class WORKSHEET_DATAITEM_POLYPOLYGON : public WORKSHEET_DATAITEM -{ -public: - double m_Orient; // Orientation in degrees - std::vector m_Corners; // corner list - -private: - std::vector m_polyIndexEnd; // index of the last point of each polygon - DPOINT m_minCoord; // min coord of corners, relative to m_Pos - DPOINT m_maxCoord; // max coord of corners, relative to m_Pos - -public: - WORKSHEET_DATAITEM_POLYPOLYGON( ); - - /** - * add a corner in corner list - * @param aCorner: the item to append - */ - void AppendCorner( const DPOINT& aCorner ) - { - m_Corners.push_back( aCorner ); - } - - /** - * Closes the current contour, by storing the index of the last corner - * of the current polygon in m_polyIndexEnd. - */ - void CloseContour() - { - m_polyIndexEnd.push_back( m_Corners.size() -1 ); - } - - /** - * @return the count of contours in the poly polygon - */ - int GetPolyCount() const { return (int) m_polyIndexEnd.size(); } - - /** - * @return the index of the first corner of the contour aCountour - * @param aContour = the index of the contour - */ - unsigned GetPolyIndexStart( unsigned aContour) const - { - if( aContour == 0 ) - return 0; - else - return m_polyIndexEnd[aContour-1] + 1; - } - - /** - * @return the index of the last corner of the contour aCountour - * @param aContour = the index of the contour - */ - unsigned GetPolyIndexEnd( unsigned aContour) const - { - return m_polyIndexEnd[aContour]; - } - - /** - * @return the coordinate (in mm) of the corner aIdx, - * for the repeated item aRepeat - */ - const DPOINT GetCornerPosition( unsigned aIdx, int aRepeat = 0 ) const; - - /** - * @return the coordinate (in draw/plot units) of the corner aIdx, - * for the repeated item aRepeat - */ - const wxPoint GetCornerPositionUi( unsigned aIdx, int aRepeat = 0 ) const; - - /** - * calculate the bounding box of the set polygons - */ - void SetBoundingBox(); - - - bool IsInsidePage( int ii ) const; -}; - -class WORKSHEET_DATAITEM_TEXT : public WORKSHEET_DATAITEM -{ -public: - wxString m_TextBase; // The basic text, with format symbols - wxString m_FullText; // The expanded text, shown on screen - int m_IncrementLabel; - double m_Orient; // Orientation in degrees - enum EDA_TEXT_HJUSTIFY_T m_Hjustify; - enum EDA_TEXT_VJUSTIFY_T m_Vjustify; - DSIZE m_TextSize; - DSIZE m_BoundingBoxSize; // When not null, this is the max - // size of the full text. - // the text size will be modified - // to keep the full text insite this - // bound. - DSIZE m_ConstrainedTextSize;// Actual text size, if constrained by - // the m_BoundingBoxSize constraint - -public: - WORKSHEET_DATAITEM_TEXT( const wxChar* aTextBase ); - - /** - * transfert the text justification and orientation - * to aGText - */ - void TransfertSetupToGraphicText( WS_DRAW_ITEM_TEXT* aGText ); - - /** - * Try to build text wihich is an increment of m_TextBase - * has meaning only if m_TextBase is a basic text (one char) - * If the basic char is a digit, build a number - * If the basic char is a letter, use the letter with ascii code - * aIncr + (basic char ascc code) - * @param aIncr = the increment value - * return the incremented label in m_FullText - */ - void IncrementLabel( int aIncr ); - - /** - * Calculates m_ConstrainedTextSize from m_TextSize - * to keep the X size and the full Y size of the text - * smaller than m_BoundingBoxSize - * if m_BoundingBoxSize.x or m_BoundingBoxSize.y > 0 - * if m_BoundingBoxSize.x or m_BoundingBoxSize.y == 0 - * the corresponding text size is not constrained - */ - void SetConstrainedTextSize(); - - /** - * @return true is a bold font should be selected - */ - bool IsBold() { return (m_Flags & USE_BOLD) != 0; } - - /** - * @return true is an italic font should be selected - */ - bool IsItalic() { return (m_Flags & USE_ITALIC) != 0; } -}; - /* * Helper classes to handle basic graphic items used to raw/plot * title blocks and frame references @@ -275,16 +29,24 @@ public: enum WS_DRAW_TYPE { wsg_line, wsg_rect, wsg_poly, wsg_text }; + int m_Flags; // temporary flgs used in page layout editor + // to locate the item; protected: WS_DRAW_TYPE m_type; // wsg_line, wsg_rect, wsg_poly, wsg_text EDA_COLOR_T m_color; + WORKSHEET_DATAITEM* m_parent; // an unique identifier, used as link + // to the parent WORKSHEET_DATAITEM item, + // in page layout editor protected: - WS_DRAW_ITEM_BASE( WS_DRAW_TYPE aType, EDA_COLOR_T aColor ) + WS_DRAW_ITEM_BASE( WORKSHEET_DATAITEM* aParent, + WS_DRAW_TYPE aType, EDA_COLOR_T aColor ) { m_type = aType; m_color = aColor; + m_parent = aParent; + m_Flags = 0; } public: @@ -293,6 +55,39 @@ public: // Accessors: EDA_COLOR_T GetColor() { return m_color; } WS_DRAW_TYPE GetType() { return m_type; }; + + WORKSHEET_DATAITEM* GetParent() { return m_parent; } + + /** The function to draw a WS_DRAW_ITEM + */ + virtual void DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ) = 0; + + /** + * Abstract function: should exist for derived items + * return true if the point aPosition is on the item + */ + virtual bool HitTest( const wxPoint& aPosition) = 0; + + /** + * Abstract function: should exist for derived items + * return true if the point aPosition is near the starting point of this item, + * for items defined by 2 points (segments, rect) + * or the position of the item, for items having only one point + * (texts or polygons) + * the maxi dist is WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 + */ + virtual bool HitTestStartPoint( const wxPoint& aPosition) = 0; + + /** + * return true if the point aPosition is near the ending point of this item + * This is avirtual function which should be overriden for items defien by + * 2 points + * the maxi dist is WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 + */ + virtual bool HitTestEndPoint( const wxPoint& aPosition) + { + return false; + } }; // This class draws a thick segment @@ -303,9 +98,10 @@ class WS_DRAW_ITEM_LINE : public WS_DRAW_ITEM_BASE int m_penWidth; public: - WS_DRAW_ITEM_LINE( wxPoint aStart, wxPoint aEnd, + WS_DRAW_ITEM_LINE( WORKSHEET_DATAITEM* aParent, + wxPoint aStart, wxPoint aEnd, int aPenWidth, EDA_COLOR_T aColor ) : - WS_DRAW_ITEM_BASE( wsg_line, aColor ) + WS_DRAW_ITEM_BASE( aParent, wsg_line, aColor ) { m_start = aStart; m_end = aEnd; @@ -316,11 +112,36 @@ public: int GetPenWidth() { return m_penWidth; } const wxPoint& GetStart() { return m_start; } const wxPoint& GetEnd() { return m_end; } + + /** The function to draw a WS_DRAW_ITEM_LINE + */ + virtual void DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ); + + /** + * Virtual function + * return true if the point aPosition is on the line + */ + virtual bool HitTest( const wxPoint& aPosition); + + /** + * return true if the point aPosition is on the starting point of this item. + */ + virtual bool HitTestStartPoint( const wxPoint& aPosition); + + /** + * return true if the point aPosition is on the ending point of this item + * This is avirtual function which should be overriden for items defien by + * 2 points + */ + virtual bool HitTestEndPoint( const wxPoint& aPosition); }; // This class draws a polygon class WS_DRAW_ITEM_POLYGON : public WS_DRAW_ITEM_BASE { + wxPoint m_pos; // position of reference point, from the + // WORKSHEET_DATAITEM_POLYPOLYGON parent + // (used only in page layout editor to draw anchors) int m_penWidth; bool m_fill; @@ -328,28 +149,69 @@ public: std::vector m_Corners; public: - WS_DRAW_ITEM_POLYGON( bool aFill, int aPenWidth, EDA_COLOR_T aColor ) : - WS_DRAW_ITEM_BASE( wsg_poly, aColor ) + WS_DRAW_ITEM_POLYGON( WORKSHEET_DATAITEM* aParent, wxPoint aPos, + bool aFill, int aPenWidth, EDA_COLOR_T aColor ) : + WS_DRAW_ITEM_BASE( aParent, wsg_poly, aColor ) { m_penWidth = aPenWidth; m_fill = aFill; + m_pos = aPos; } // Accessors: int GetPenWidth() { return m_penWidth; } bool IsFilled() { return m_fill; } + const wxPoint& GetPosition() { return m_pos; } + + /** The function to draw a WS_DRAW_ITEM_POLYGON + */ + virtual void DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ); + + /** + * Virtual function + * return true if the point aPosition is inside one polygon + */ + virtual bool HitTest( const wxPoint& aPosition); + + /** + * return true if the point aPosition is on the starting point of this item. + */ + virtual bool HitTestStartPoint( const wxPoint& aPosition); }; // This class draws a not filled rectangle with thick segment class WS_DRAW_ITEM_RECT : public WS_DRAW_ITEM_LINE { public: - WS_DRAW_ITEM_RECT( wxPoint aStart, wxPoint aEnd, + WS_DRAW_ITEM_RECT( WORKSHEET_DATAITEM* aParent, + wxPoint aStart, wxPoint aEnd, int aPenWidth, EDA_COLOR_T aColor ) : - WS_DRAW_ITEM_LINE( aStart, aEnd, aPenWidth, aColor ) + WS_DRAW_ITEM_LINE( aParent, aStart, aEnd, aPenWidth, aColor ) { m_type = wsg_rect; } + + /** The function to draw a WS_DRAW_ITEM_RECT + */ + virtual void DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ); + + /** + * Virtual function + * return true if the point aPosition is on one edge of the rectangle + */ + virtual bool HitTest( const wxPoint& aPosition); + + /** + * return true if the point aPosition is on the starting point of this item. + */ + virtual bool HitTestStartPoint( const wxPoint& aPosition); + + /** + * return true if the point aPosition is on the ending point of this item + * This is avirtual function which should be overriden for items defien by + * 2 points + */ + virtual bool HitTestEndPoint( const wxPoint& aPosition); }; // This class draws a graphic text. @@ -358,20 +220,28 @@ public: class WS_DRAW_ITEM_TEXT : public WS_DRAW_ITEM_BASE, public EDA_TEXT { public: - WS_DRAW_ITEM_TEXT( wxString& aText, wxPoint aPos, wxSize aSize, + WS_DRAW_ITEM_TEXT( WORKSHEET_DATAITEM* aParent, + wxString& aText, wxPoint aPos, wxSize aSize, int aPenWidth, EDA_COLOR_T aColor, - bool aItalic = false, bool aBold = false ) : - WS_DRAW_ITEM_BASE( wsg_text, aColor ), EDA_TEXT( aText ) - { - SetTextPosition( aPos ); - SetSize( aSize ); - SetThickness( aPenWidth ); - SetItalic( aItalic ); - SetBold( aBold ); - } + bool aItalic = false, bool aBold = false ); + + /** The function to draw a WS_DRAW_ITEM_TEXT + */ + virtual void DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC ); // Accessors: int GetPenWidth() { return GetThickness(); } + + /** + * Virtual function + * return true if the point aPosition is on the text + */ + virtual bool HitTest( const wxPoint& aPosition); + + /** + * return true if the point aPosition is on the starting point of this item. + */ + virtual bool HitTestStartPoint( const wxPoint& aPosition); }; /* @@ -382,6 +252,7 @@ public: */ class WS_DRAW_ITEM_LIST { +protected: std::vector m_graphicList; // Items to draw/plot unsigned m_idx; // for GetFirst, GetNext functions wxPoint m_LTmargin; // The left top margin in mils of the page layout. @@ -420,8 +291,26 @@ public: delete m_graphicList[ii]; } - /* Function SetPenSize - * Set the defualt pen size to draw/plot lines and texts + /** + * Set the filename to draw/plot + * @param aFileName = the text to display by the "filename" format + */ + void SetFileName( const wxString & aFileName ) + { + m_fileName = &aFileName; + } + + /** + * Set the sheet name to draw/plot + * @param aSheetName = the text to draw/plot by the "sheetname" format + */ + void SetSheetName( const wxString & aSheetName ) + { + m_sheetFullName = &aSheetName; + } + + /** Function SetPenSize + * Set the default pen size to draw/plot lines and texts * @param aPenSize the thickness of lines */ void SetPenSize( int aPenSize ) @@ -429,7 +318,7 @@ public: m_penSize = aPenSize; } - /* Function SetMilsToIUfactor + /** Function SetMilsToIUfactor * Set the scalar to convert pages units ( mils) to draw/plot units * @param aScale the conversion factor */ @@ -438,7 +327,7 @@ public: m_milsToIu = aScale; } - /* Function SetPageSize + /** Function SetPageSize * Set the size of the page layout * @param aPageSize size (in mils) of the page layout. */ @@ -467,7 +356,7 @@ public: m_sheetCount = aSheetCount; } - /* Function SetMargins + /** Function SetMargins * Set the left top margin and the right bottom margin * of the page layout * @param aLTmargin The left top margin of the page layout. @@ -505,7 +394,7 @@ public: } /** - * Draws the item list crated by BuildWorkSheetGraphicList + * Draws the item list created by BuildWorkSheetGraphicList * @param aClipBox = the clipping rect, or NULL if no clipping * @param aDC = the current Device Context */ @@ -515,19 +404,23 @@ public: * Function BuildWorkSheetGraphicList is a core function for * drawing or plotting the page layout with * the frame and the basic inscriptions. - * It fills the list of basic graphic items to draw or plot. + * It populates the list of basic graphic items to draw or plot. * currently lines, rect, polygons and texts + * before calling this function, some parameters should be initialized: + * by calling: + * SetPenSize( aPenWidth ); + * SetMilsToIUfactor( aScalar ); + * SetSheetNumber( aSheetNumber ); + * SetSheetCount( aSheetCount ); + * SetFileName( aFileName ); + * SetSheetName( aFullSheetName ); * - * @param aPaperFormat The paper size type, for basic inscriptions. - * @param aFileName The file name, for basic inscriptions. - * @param aSheetPathHumanReadable The human readable sheet path. + * @param aPageInfo The PAGE_INFO, for page size, margins... * @param aTitleBlock The sheet title block, for basic inscriptions. * @param aColor The color for drawing. * @param aAltColor The color for items which need to be "hightlighted". */ - void BuildWorkSheetGraphicList( const wxString& aPaperFormat, - const wxString& aFileName, - const wxString& aSheetPathHumanReadable, + void BuildWorkSheetGraphicList( const PAGE_INFO& aPageInfo, const TITLE_BLOCK& aTitleBlock, EDA_COLOR_T aColor, EDA_COLOR_T aAltColor ); /** @@ -559,27 +452,96 @@ public: * @return the text, after replacing the format symbols by the actual value */ wxString BuildFullText( const wxString& aTextbase ); + + /** + * Locate graphic items in m_graphicList at location aPosition + * @param aList = the list of items found + * @param aPosition the position (in user units) to locate items + */ + void Locate(std::vector & aList, const wxPoint& aPosition); }; /** - * WORKSHEET_LAYOUT handles the grpahic items list to draw/plot + * WORKSHEET_LAYOUT handles the graphic items list to draw/plot * the title block and other items (page references ... */ class WORKSHEET_LAYOUT { std::vector m_list; + bool m_allowVoidList; // If false, the default page layout + // will be loaded the first time + // WS_DRAW_ITEM_LIST::BuildWorkSheetGraphicList + // is run (useful mainly for page layout editor) + double m_leftMargin; // the left page margin in mm + double m_rightMargin; // the right page margin in mm + double m_topMargin; // the top page margin in mm + double m_bottomMargin; // the bottom page margin in mm + bool m_isDefaultDescr; // true if the internal default descr is loaded + // mainly used in Kicad GOST version, until + // a GOST page descr file is available + // to force the GOST default title block public: - WORKSHEET_LAYOUT() {}; + WORKSHEET_LAYOUT(); ~WORKSHEET_LAYOUT() {ClearList(); } - void ClearList() + /** + * static function: returns the instance of WORKSHEET_LAYOUT + * used in the application + */ + static WORKSHEET_LAYOUT& GetTheInstance() { - for( unsigned ii = 0; ii < m_list.size(); ii++ ) - delete m_list[ii]; + extern WORKSHEET_LAYOUT wksTheInstance; + return wksTheInstance; } + // Accessors: + bool IsDefaultDescr() { return m_isDefaultDescr; } + void SetDefaultDescrFlag( bool aFlg ) { m_isDefaultDescr = aFlg; } + + double GetLeftMargin() { return m_leftMargin; } + double GetRightMargin() { return m_rightMargin; } + double GetTopMargin() { return m_topMargin; } + double GetBottomMargin() { return m_bottomMargin; } + + void SetLeftMargin( double aMargin ); + void SetRightMargin( double aMargin ); + void SetTopMargin( double aMargin ); + void SetBottomMargin( double aMargin ); + + /** + * In Kicad applications, a page layout description is needed + * So if the list is empty, a default description is loaded, + * the first time a page layout is drawn. + * However, in page layout editor, an empty list is acceptable. + * AllowVoidList allows or not the empty list + */ + void AllowVoidList( bool Allow ) { m_allowVoidList = Allow; } + + /** + * @return true if an empty list is allowed + * (mainly allowed for page layout editor). + */ + bool VoidListAllowed() { return m_allowVoidList; } + + /** + * erase the list of items + */ + void ClearList(); + + /** + * Save the description in a file + * @param aFullFileName the filename of the file to created + */ + void Save( const wxString& aFullFileName ); + + /** + * Save the description in a buffer + * @param aOutputString = a wxString to store the S expr string + */ + void SaveInString( wxString& aOutputString ); + /** * Add an item to the list of items */ @@ -588,16 +550,30 @@ public: m_list.push_back( aItem ); } + /** + *Insert an item to the list of items at position aIdx + */ + void Insert( WORKSHEET_DATAITEM* aItem, unsigned aIdx ); + + /** + *Remove the item to the list of items at position aIdx + */ + bool Remove( unsigned aIdx ); + + /** + *Remove the item to the list of items at position aIdx + */ + bool Remove( WORKSHEET_DATAITEM* aItem ); + + /** + * @return the index of aItem, or -1 if does not exist + */ + int GetItemIndex( WORKSHEET_DATAITEM* aItem ) const; + /** * @return the item from its index aIdx, or NULL if does not exist */ - WORKSHEET_DATAITEM* GetItem( unsigned aIdx ) const - { - if( aIdx < m_list.size() ) - return m_list[aIdx]; - else - return NULL; - } + WORKSHEET_DATAITEM* GetItem( unsigned aIdx ) const; /** * @return the item count @@ -610,11 +586,38 @@ public: void SetDefaultLayout(); /** - * Fills the list with a custom layout, or + * Populates the list with a custom layout, or * the default layout, if no custom layout available + * @param aFullFileName = the custom page layout description file. + * if empty, loads the file defined by KICAD_WKSFILE + * and if its is not defined, uses the default internal description + * @param Append = if true: do not delete old layout, and load only + aFullFileName. */ - void SetLayout(); + void SetPageLayout( const wxString& aFullFileName = wxEmptyString, + bool Append = false ); + /** + * Populates the list from a S expr description stored in a string + * @param aPageLayout = the S expr string + */ + void SetPageLayout( const char* aPageLayout, bool Append = false ); + + /** + * @return a short filename from a full filename: + * if the path is the current path, or if the path + * is the same as kicad.pro (in template), returns the shortname + * else do nothing and returns a full filename + */ + static const wxString MakeShortFileName( const wxString& aFullFileName ); + + /** + * @return a full filename from a short filename, + * if the short filename path is void + * In this case the path is the same as kicad.pro (in template) + * else return the short filename (which have an absolute os relative path + */ + static const wxString MakeFullFileName( const wxString& aShortFileName ); }; #endif // WORKSHEET_SHAPE_BUILDER_H diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h index 842b9059d6..2b15bfa611 100644 --- a/include/wxBasePcbFrame.h +++ b/include/wxBasePcbFrame.h @@ -632,8 +632,6 @@ public: void SelectLayerPair(); virtual void SwitchLayer( wxDC* DC, LAYER_NUM layer ); - void InstallGridFrame( const wxPoint& pos ); - /** * Load applications settings common to PCB draw frame objects. * @@ -646,6 +644,8 @@ public: */ virtual void LoadSettings(); + bool InvokeDialogGrid(); + /** * Save applications settings common to PCB draw frame objects. * diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index a7dcc18b64..8607c835f7 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -157,7 +157,7 @@ private: /// The name of the format to use when generating a net list. wxString m_netListFormat; - /// Add X prefix to componen referencess when generating spice net lists. + /// Add X prefix to component references when generating spice net lists. bool m_addReferencPrefix; wxString m_userLibraryPath; @@ -239,7 +239,7 @@ public: void GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 ); /** - * Function GetProjectFileParameters + * Function GetProjectFileParametersList * returns the project file parameter list for Eeschema. * * */ - PARAM_CFG_ARRAY& GetProjectFileParameters( void ); + PARAM_CFG_ARRAY& GetProjectFileParametersList( void ); /** - * Function SaveProjectFile + * Function SaveProjectSettings * saves changes to the project settings to the project (.pro) file. + * @param aAskForSave = true to open a dialog before saving the settings */ - void SaveProjectFile(); + void SaveProjectSettings( bool aAskForSave ); /** * Function LoadProjectFile diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 7d9845e4ef..ea5b718ffa 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -353,7 +353,12 @@ public: */ PARAM_CFG_ARRAY GetProjectFileParameters(); - void SaveProjectSettings(); + /** + * Function SaveProjectSettings + * saves changes to the project settings to the project (.pro) file. + * @param aAskForSave = true to open a dialog before saving the settings + */ + void SaveProjectSettings( bool aAskForSave ); /** * Load the project file configuration settings. diff --git a/include/wxstruct.h b/include/wxstruct.h index 2903c3864e..938e15c24b 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -97,7 +97,8 @@ enum ID_DRAWFRAME_TYPE GERBER_FRAME_TYPE, TEXT_EDITOR_FRAME_TYPE, DISPLAY3D_FRAME_TYPE, - KICAD_MAIN_FRAME_TYPE + KICAD_MAIN_FRAME_TYPE, + PL_EDITOR_FRAME_TYPE }; @@ -223,6 +224,15 @@ public: */ virtual void SaveSettings(); + /** + * Function SaveProjectSettings + * saves changes to the project settings to the project (.pro) file. + * The method is virtual so you can override it to call the suitable save method. + * The base method do nothing + * @param aAskForSave = true to open a dialog before saving the settings + */ + virtual void SaveProjectSettings( bool aAskForSave ) {}; + /** * Function OnSelectPreferredEditor * Open a dialog to select the editor that will used in KiCad diff --git a/kicad/class_treeproject_item.cpp b/kicad/class_treeproject_item.cpp index 33a7fb8823..01b31af817 100644 --- a/kicad/class_treeproject_item.cpp +++ b/kicad/class_treeproject_item.cpp @@ -233,6 +233,10 @@ void TREEPROJECT_ITEM::Activate( TREE_PROJECT_FRAME* prjframe ) break; } + case TREE_PAGE_LAYOUT_DESCR: + mainFrame->Execute( m_parent, PL_EDITOR_EXE, FullFileName ); + break; + default: OpenFile( FullFileName ); break; diff --git a/kicad/class_treeprojectfiles.cpp b/kicad/class_treeprojectfiles.cpp index 0a3b909a65..2641cd18c3 100644 --- a/kicad/class_treeprojectfiles.cpp +++ b/kicad/class_treeprojectfiles.cpp @@ -74,7 +74,8 @@ TREEPROJECTFILES::TREEPROJECTFILES( TREE_PROJECT_FRAME* parent ) : m_ImageList->Add( KiBitmap( tools_xpm ) ); // TREE_REPORT m_ImageList->Add( KiBitmap( post_compo_xpm ) ); // TREE_POS m_ImageList->Add( KiBitmap( post_drill_xpm ) ); // TREE_DRILL - m_ImageList->Add( KiBitmap( svg_file_xpm ) ); // TREE_SVG + m_ImageList->Add( KiBitmap( svg_file_xpm ) ); // TREE_SVG + m_ImageList->Add( KiBitmap( pagelayout_load_default_xpm ) );// TREE_PAGE_LAYOUT_DESCR SetImageList( m_ImageList ); } diff --git a/kicad/commandframe.cpp b/kicad/commandframe.cpp index 0a965e9c9d..01c92365d0 100644 --- a/kicad/commandframe.cpp +++ b/kicad/commandframe.cpp @@ -109,6 +109,9 @@ Creates a component (for Eeschema) or a footprint (for Pcbnew) that shows a B&W btn = AddBitmapButton( ID_TO_PCB_CALCULATOR, KiBitmap( icon_pcbcalculator_xpm ) ); btn->SetToolTip( _( "Pcb calculator, the Swiss army knife..." ) ); + + btn = AddBitmapButton( ID_TO_PL_EDITOR, KiBitmap( icon_pagelayout_editor_xpm ) ); + btn->SetToolTip( _( "pl_editor, the page layout and title block shape editor" ) ); } diff --git a/kicad/files-io.cpp b/kicad/files-io.cpp index 911dee57ed..41803864dc 100644 --- a/kicad/files-io.cpp +++ b/kicad/files-io.cpp @@ -133,10 +133,10 @@ void KICAD_MANAGER_FRAME::OnArchiveFiles( wxCommandEvent& event ) { /* List of file extensions to save. */ static const wxChar* extentionList[] = { - wxT( "*.sch" ), wxT( "*.lib" ), wxT( "*.cmp" ), + wxT( "*.sch" ), wxT( "*.lib" ), wxT( "*.mod" ), wxT( "*.cmp" ), wxT( "*.brd" ), wxT( "*.kicad_pcb" ), wxT( "*.net" ), wxT( "*.pro" ), wxT( "*.pho" ), wxT( "*.py" ), - wxT( "*.pdf" ), wxT( "*.txt" ), wxT( "*.dcm" ), + wxT( "*.pdf" ), wxT( "*.txt" ), wxT( "*.dcm" ), wxT( "*.kicad_wks" ), NULL }; diff --git a/kicad/kicad.h b/kicad/kicad.h index a6cdb3578d..0bfd0dce97 100644 --- a/kicad/kicad.h +++ b/kicad/kicad.h @@ -62,20 +62,21 @@ class TREE_PROJECT_FRAME; enum TreeFileType { TREE_PROJECT = 1, - TREE_SCHEMA, // Schematic file (.sch) - TREE_LEGACY_PCB, // board file (.brd) legacy format - TREE_SEXP_PCB, // board file (.kicad_brd) new s expression format - TREE_GERBER, // Gerber file (.pho, .g*) - TREE_PDF, // PDF file (.pdf) - TREE_TXT, // ascii text file (.txt) - TREE_NET, // netlist file (.net) + TREE_SCHEMA, // Schematic file (.sch) + TREE_LEGACY_PCB, // board file (.brd) legacy format + TREE_SEXP_PCB, // board file (.kicad_brd) new s expression format + TREE_GERBER, // Gerber file (.pho, .g*) + TREE_PDF, // PDF file (.pdf) + TREE_TXT, // ascii text file (.txt) + TREE_NET, // netlist file (.net) TREE_UNKNOWN, TREE_DIRECTORY, - TREE_CMP_LINK, // cmp/footprint link file (.cmp) - TREE_REPORT, // report file (.rpt) - TREE_FP_PLACE, // fooprints position (place) file (.pos) - TREE_DRILL, // Excellon drill file (.drl) - TREE_SVG, // SVG file (.svg) + TREE_CMP_LINK, // cmp/footprint link file (.cmp) + TREE_REPORT, // report file (.rpt) + TREE_FP_PLACE, // fooprints position (place) file (.pos) + TREE_DRILL, // Excellon drill file (.drl) + TREE_SVG, // SVG file (.svg) + TREE_PAGE_LAYOUT_DESCR, // Page layout and title block descr file (.kicad_wks) TREE_MAX }; @@ -103,6 +104,7 @@ enum id_kicad_frm { ID_TO_GERBVIEW, ID_TO_BITMAP_CONVERTER, ID_TO_PCB_CALCULATOR, + ID_TO_PL_EDITOR, ID_BROWSE_AN_SELECT_FILE, ID_SELECT_PREFERED_EDITOR, ID_SELECT_PREFERED_PDF_BROWSER_NAME, @@ -160,6 +162,7 @@ public: KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title, void OnRunGerbview( wxCommandEvent& event ); void OnRunBitmapConverter( wxCommandEvent& event ); void OnRunPcbCalculator( wxCommandEvent& event ); + void OnRunPageLayoutEditor( wxCommandEvent& event ); void OnOpenTextEditor( wxCommandEvent& event ); void OnOpenFileInTextEditor( wxCommandEvent& event ); diff --git a/kicad/mainframe.cpp b/kicad/mainframe.cpp index a4934e7dc9..4eb5863b7a 100644 --- a/kicad/mainframe.cpp +++ b/kicad/mainframe.cpp @@ -234,6 +234,11 @@ void KICAD_MANAGER_FRAME::OnRunPcbCalculator( wxCommandEvent& event ) Execute( this, PCB_CALCULATOR_EXE ); } +void KICAD_MANAGER_FRAME::OnRunPageLayoutEditor( wxCommandEvent& event ) +{ + Execute( this, PL_EDITOR_EXE ); +} + void KICAD_MANAGER_FRAME::OnRunPcbNew( wxCommandEvent& event ) { diff --git a/kicad/menubar.cpp b/kicad/menubar.cpp index 9afb07cf6f..baebaa02d4 100644 --- a/kicad/menubar.cpp +++ b/kicad/menubar.cpp @@ -82,6 +82,7 @@ BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME ) EVT_BUTTON( ID_TO_GERBVIEW, KICAD_MANAGER_FRAME::OnRunGerbview ) EVT_BUTTON( ID_TO_BITMAP_CONVERTER, KICAD_MANAGER_FRAME::OnRunBitmapConverter ) EVT_BUTTON( ID_TO_PCB_CALCULATOR, KICAD_MANAGER_FRAME::OnRunPcbCalculator ) + EVT_BUTTON( ID_TO_PL_EDITOR, KICAD_MANAGER_FRAME::OnRunPageLayoutEditor ) EVT_UPDATE_UI( ID_SELECT_DEFAULT_PDF_BROWSER, KICAD_MANAGER_FRAME::OnUpdateDefaultPdfBrowser ) EVT_UPDATE_UI( ID_SELECT_PREFERED_PDF_BROWSER, diff --git a/kicad/tree_project_frame.cpp b/kicad/tree_project_frame.cpp index ae58782f93..bc7134af42 100644 --- a/kicad/tree_project_frame.cpp +++ b/kicad/tree_project_frame.cpp @@ -66,6 +66,7 @@ static const wxChar* s_allowedExtensionsToList[] = wxT( "^.*\\.pdf$" ), wxT( "^[^$].*\\.brd$" ), // Legacy Pcbnew files wxT( "^[^$].*\\.kicad_pcb$" ), // S format Pcbnew files + wxT( "^[^$].*\\.kicad_wks$" ), // S format kicad page layout descr files wxT( "^.*\\.net$" ), wxT( "^.*\\.txt$" ), wxT( "^.*\\.pho$" ), // Gerber file (Kicad extension) @@ -292,6 +293,10 @@ wxString TREE_PROJECT_FRAME::GetFileExt( TreeFileType type ) ext = SVGFileExtension; break; + case TREE_PAGE_LAYOUT_DESCR: + ext = PageLayoutDescrFileExtension; + break; + default: /* Eliminates unnecessary GCC warning. */ break; } @@ -358,6 +363,10 @@ wxString TREE_PROJECT_FRAME::GetFileWildcard( TreeFileType type ) ext = SVGFileWildcard; break; + case TREE_PAGE_LAYOUT_DESCR: + ext = PageLayoutDescrFileWildcard; + break; + default: /* Eliminates unnecessary GCC warning. */ break; } diff --git a/pagelayout_editor/CMakeLists.txt b/pagelayout_editor/CMakeLists.txt new file mode 100644 index 0000000000..eecc08abd6 --- /dev/null +++ b/pagelayout_editor/CMakeLists.txt @@ -0,0 +1,108 @@ +add_definitions(-DPL_EDITOR) + +### +# Includes +### + +include_directories(BEFORE ${INC_BEFORE}) +include_directories( + dialogs + ../common/dialogs + ${INC_AFTER} + ) + + +### +# Sources +### + +set(PL_EDITOR_SRCS + dialogs/properties_frame_base.cpp + dialogs/dialogs_for_printing.cpp + dialogs/dialog_new_dataitem_base.cpp + dialogs/dialog_new_dataitem.cpp + class_pl_editor_screen.cpp + class_pl_editor_layout.cpp + design_tree_frame.cpp + events_functions.cpp + controle.cpp + files.cpp + onleftclick.cpp + onrightclick.cpp + page_layout_writer.cpp + pl_editor.cpp + pl_editor_config.cpp + pl_editor_frame.cpp + pl_editor_undo_redo.cpp + properties_frame.cpp + hotkeys.cpp + menubar.cpp + toolbars_pl_editor.cpp + ) + +### +# We need some extra sources from common +### +set(PL_EDITOR_EXTRA_SRCS + ../common/base_screen.cpp + ../common/base_units.cpp + ../common/eda_text.cpp + ../common/class_page_info.cpp + ../common/dialogs/dialog_page_settings.cpp +) + +### +# Windows resource file +### +if(WIN32) + if(MINGW) + # PL_EDITOR_RESOURCES variable is set by the macro. + mingw_resource_compiler(pl_editor) + else(MINGW) + set(PL_EDITOR_RESOURCES pl_editor.rc) + endif(MINGW) +endif(WIN32) + +### +# Apple resource files +### +if(APPLE) + set(PL_EDITOR_RESOURCES pl_editor.icns pl_editor_doc.icns) + set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/pl_editor.icns" + PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/pl_editor_doc.icns" + PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + set(MACOSX_BUNDLE_ICON_FILE pl_editor.icns) + set(MACOSX_BUNDLE_GUI_IDENTIFIER org.kicad-eda.pl_editor) +endif(APPLE) + +### +# Create the pl_editor executable +### +add_executable(pl_editor WIN32 MACOSX_BUNDLE + ${PL_EDITOR_SRCS} + ${DIALOGS_SRCS} + ${PL_EDITOR_EXTRA_SRCS} + ${PL_EDITOR_RESOURCES}) + +### +# Set properties for APPLE on pl_editor target +### +if(APPLE) + set_target_properties(pl_editor PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) +endif(APPLE) + +### +# Link executable target pl_editor with correct libraries +### +target_link_libraries(pl_editor common polygon bitmaps + ${OPENGL_LIBRARIES} + ${wxWidgets_LIBRARIES} + ${GDI_PLUS_LIBRARIES}) + +### +# Add pl_editor as install target +### +install(TARGETS pl_editor + DESTINATION ${KICAD_BIN} + COMPONENT binary) diff --git a/pagelayout_editor/class_pl_editor_layout.cpp b/pagelayout_editor/class_pl_editor_layout.cpp new file mode 100644 index 0000000000..5d321ec22f --- /dev/null +++ b/pagelayout_editor/class_pl_editor_layout.cpp @@ -0,0 +1,30 @@ +/** + * @file class_gbr_layout.cpp + * @brief PL_EDITOR_LAYOUT class functions. + */ + +#include +#include + +#include +#include +#include + +PL_EDITOR_LAYOUT::PL_EDITOR_LAYOUT() +{ + PAGE_INFO pageInfo( wxT( "A4" ) ); + SetPageSettings( pageInfo ); +} + + +PL_EDITOR_LAYOUT::~PL_EDITOR_LAYOUT() +{ +} + +EDA_RECT PL_EDITOR_LAYOUT::ComputeBoundingBox() +{ + EDA_RECT bbox; + + SetBoundingBox( bbox ); + return bbox; +} diff --git a/pagelayout_editor/class_pl_editor_layout.h b/pagelayout_editor/class_pl_editor_layout.h new file mode 100644 index 0000000000..5d589ff1b1 --- /dev/null +++ b/pagelayout_editor/class_pl_editor_layout.h @@ -0,0 +1,74 @@ +/** + * @file class_pl_editor_layout.h + */ + +#ifndef CLASS_PL_EDITOR_LAYOUT_H +#define CLASS_PL_EDITOR_LAYOUT_H + +#include // PAGE_INFO +#include // PAGE_INFO +#include + +class EDA_DRAW_PANEL; + + +/** + * Class PL_EDITOR_LAYOUT + * holds list of GERBER_DRAW_ITEM currently loaded. + */ +class PL_EDITOR_LAYOUT +{ +private: + EDA_RECT m_BoundingBox; + PAGE_INFO m_paper; + TITLE_BLOCK m_titles; + +public: + PL_EDITOR_LAYOUT(); + ~PL_EDITOR_LAYOUT(); + + const PAGE_INFO& GetPageSettings() const { return m_paper; } + void SetPageSettings( const PAGE_INFO& aPageSettings ) + { + m_paper = aPageSettings; + } + + const wxPoint& GetOriginAxisPosition() const + { + static wxPoint zero( 0, 0 ); + return zero; + } + + const TITLE_BLOCK& GetTitleBlock() const + { + return m_titles; + } + + void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) + { + m_titles = aTitleBlock; + } + + /** + * Function ComputeBoundingBox + * calculates the bounding box containing all Gerber items. + * @return EDA_RECT - the full item list bounding box + */ + EDA_RECT ComputeBoundingBox(); + + /** + * Function GetBoundingBox + * may be called soon after ComputeBoundingBox() to return the same EDA_RECT, + * as long as the CLASS_PL_EDITOR_LAYOUT has not changed. + */ + EDA_RECT GetBoundingBox() const { return m_BoundingBox; } // override + + void SetBoundingBox( const EDA_RECT& aBox ) { m_BoundingBox = aBox; } + +#if defined(DEBUG) + void Show( int nestLevel, std::ostream& os ) const; // overload + +#endif +}; + +#endif // #ifndef CLASS_PL_EDITOR_LAYOUT_H diff --git a/pagelayout_editor/class_pl_editor_screen.cpp b/pagelayout_editor/class_pl_editor_screen.cpp new file mode 100644 index 0000000000..65df628ffb --- /dev/null +++ b/pagelayout_editor/class_pl_editor_screen.cpp @@ -0,0 +1,112 @@ +/** + * @file class_pl_editor_screen.cpp + */ + +#include +#include +#include +#include +#include +#include + + +#define MM_GRID( x ) wxRealPoint( x * IU_PER_MM, x * IU_PER_MM ) +#define ZOOM_FACTOR( x ) ( x * IU_PER_MM / 1000 ) + + +/** + Default zoom values. + Roughly a 1.5 progression. +*/ +static const double pl_editorZoomList[] = +{ + ZOOM_FACTOR( 5 ), + ZOOM_FACTOR( 7.0 ), + ZOOM_FACTOR( 10.0 ), + ZOOM_FACTOR( 15.0 ), + ZOOM_FACTOR( 22.0 ), + ZOOM_FACTOR( 35.0 ), + ZOOM_FACTOR( 50.0 ), + ZOOM_FACTOR( 80.0 ), + ZOOM_FACTOR( 120.0 ), + ZOOM_FACTOR( 200.0 ), + ZOOM_FACTOR( 350.0 ), + ZOOM_FACTOR( 500.0 ), + ZOOM_FACTOR( 750.0 ), + ZOOM_FACTOR( 1000.0 ), + ZOOM_FACTOR( 1500.0 ), + ZOOM_FACTOR( 2000.0 ), + ZOOM_FACTOR( 3000.0 ), +}; + + +// Default grid sizes for PCB editor screens. +static GRID_TYPE pl_editorGridList[] = +{ + // predefined grid list in mm + { ID_POPUP_GRID_LEVEL_1MM, MM_GRID( 1.0 ) }, + { ID_POPUP_GRID_LEVEL_0_5MM, MM_GRID( 0.5 ) }, + { ID_POPUP_GRID_LEVEL_0_25MM, MM_GRID( 0.25 ) }, + { ID_POPUP_GRID_LEVEL_0_2MM, MM_GRID( 0.2 ) }, + { ID_POPUP_GRID_LEVEL_0_1MM, MM_GRID( 0.1 ) }, +}; + + +PL_EDITOR_SCREEN::PL_EDITOR_SCREEN( const wxSize& aPageSizeIU ) : + BASE_SCREEN( SCREEN_T ) +{ + for( unsigned i = 0; i < DIM( pl_editorZoomList ); ++i ) + m_ZoomList.push_back( pl_editorZoomList[i] ); + + for( unsigned i = 0; i < DIM( pl_editorGridList ); ++i ) + AddGrid( pl_editorGridList[i] ); + + // Set the working grid size to a reasonable value + SetGrid( MM_GRID( 1.0 ) ); + + SetZoom( ZOOM_FACTOR( 350 ) ); // a default value for zoom + + InitDataPoints( aPageSizeIU ); + m_NumberOfScreens = 2; +} + + +PL_EDITOR_SCREEN::~PL_EDITOR_SCREEN() +{ + ClearUndoRedoList(); +} + + +// virtual function +int PL_EDITOR_SCREEN::MilsToIuScalar() +{ + return (int)IU_PER_MILS; +} + + +/* Virtual function needed by classes derived from BASE_SCREEN + * this is a virtual pure function in BASE_SCREEN + */ +void PL_EDITOR_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, + int aItemCount ) +{ + if( aItemCount == 0 ) + return; + + unsigned icnt = aList.m_CommandsList.size(); + + if( aItemCount > 0 ) + icnt = aItemCount; + + for( unsigned ii = 0; ii < icnt; ii++ ) + { + if( aList.m_CommandsList.size() == 0 ) + break; + + PICKED_ITEMS_LIST* curr_cmd = aList.m_CommandsList[0]; + aList.m_CommandsList.erase( aList.m_CommandsList.begin() ); + + curr_cmd->ClearListAndDeleteItems(); + delete curr_cmd; // Delete command + } +} diff --git a/pagelayout_editor/class_pl_editor_screen.h b/pagelayout_editor/class_pl_editor_screen.h new file mode 100644 index 0000000000..4c76fbd9f7 --- /dev/null +++ b/pagelayout_editor/class_pl_editor_screen.h @@ -0,0 +1,56 @@ +/** + * @file class_pl_editor_layout.h + */ + +#ifndef CLASS_PL_EDITOR_SCREEN_H_ +#define CLASS_PL_EDITOR_SCREEN_H_ + + +#include +#include + +class WORKSHEET_DATAITEM; + + +/* Handle info to display a board */ +class PL_EDITOR_SCREEN : public BASE_SCREEN +{ +public: + /** + * Constructor + * @param aPageSizeIU is the size of the initial paper page in internal units. + */ + PL_EDITOR_SCREEN( const wxSize& aPageSizeIU ); + + ~PL_EDITOR_SCREEN(); + + virtual int MilsToIuScalar(); + + /** + * Function ClearUndoORRedoList + * virtual pure in BASE_SCREEN, so it must be defined here + */ + + void ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount = -1 ); + /** + * Function GetCurItem + * returns the currently selected WORKSHEET_DATAITEM, overriding + * BASE_SCREEN::GetCurItem(). + * @return WORKSHEET_DATAITEM* - the one selected, or NULL. + */ + + WORKSHEET_DATAITEM* GetCurItem() const + { + return (WORKSHEET_DATAITEM*) BASE_SCREEN::GetCurItem(); + } + + /** + * Function SetCurItem + * sets the currently selected object, m_CurrentItem. + * @param aItem Any object derived from WORKSHEET_DATAITEM + */ + void SetCurItem( WORKSHEET_DATAITEM* aItem ) { BASE_SCREEN::SetCurItem( (EDA_ITEM*)aItem ); } +}; + + +#endif // CLASS_PL_EDITOR_SCREEN_H_ diff --git a/pagelayout_editor/controle.cpp b/pagelayout_editor/controle.cpp new file mode 100644 index 0000000000..dfb674d8d3 --- /dev/null +++ b/pagelayout_editor/controle.cpp @@ -0,0 +1,112 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013-2013 Jean-Pierre Charras jp.charras at wanadoo.fr + * Copyright (C) 2013-2013 KiCad Developers, see change_log.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 + */ + +/** + * @file pagelayout_editor/controle.cpp + */ + +#include +#include +#include +#include + + +void PL_EDITOR_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, + int aHotKey ) +{ + wxRealPoint gridSize; + wxPoint oldpos; + wxPoint pos = aPosition; + + pos = GetScreen()->GetNearestGridPosition( pos ); + + oldpos = GetScreen()->GetCrossHairPosition(); + gridSize = GetScreen()->GetGridSize(); + + switch( aHotKey ) + { + case WXK_NUMPAD8: + case WXK_UP: + pos.y -= KiROUND( gridSize.y ); + m_canvas->MoveCursor( pos ); + break; + + case WXK_NUMPAD2: + case WXK_DOWN: + pos.y += KiROUND( gridSize.y ); + m_canvas->MoveCursor( pos ); + break; + + case WXK_NUMPAD4: + case WXK_LEFT: + pos.x -= KiROUND( gridSize.x ); + m_canvas->MoveCursor( pos ); + break; + + case WXK_NUMPAD6: + case WXK_RIGHT: + pos.x += KiROUND( gridSize.x ); + m_canvas->MoveCursor( pos ); + break; + + default: + break; + } + + GetScreen()->SetCrossHairPosition( pos ); + + if( oldpos != GetScreen()->GetCrossHairPosition() ) + { + pos = GetScreen()->GetCrossHairPosition(); + GetScreen()->SetCrossHairPosition( oldpos ); + m_canvas->CrossHairOff( aDC ); + GetScreen()->SetCrossHairPosition( pos ); + m_canvas->CrossHairOn( aDC ); + + if( m_canvas->IsMouseCaptured() ) + { +#ifdef USE_WX_OVERLAY + wxDCOverlay oDC( m_overlay, (wxWindowDC*)aDC ); + oDC.Clear(); + m_canvas->CallMouseCapture( aDC, aPosition, false ); +#else + m_canvas->CallMouseCapture( aDC, aPosition, true ); +#endif + } +#ifdef USE_WX_OVERLAY + else + { + m_overlay.Reset(); + } +#endif + + } + + if( aHotKey ) + { + OnHotKey( aDC, aHotKey, aPosition ); + } + + UpdateStatusBar(); +} diff --git a/pagelayout_editor/design_tree_frame.cpp b/pagelayout_editor/design_tree_frame.cpp new file mode 100644 index 0000000000..74fb9c1b28 --- /dev/null +++ b/pagelayout_editor/design_tree_frame.cpp @@ -0,0 +1,270 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file design_tree_frame.cpp + */ + +#include +#include +#include +#include +#include +#include +#include + +/* XPM + * This bitmap is used to show item types + */ +static const char* root_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #008080", + " xxxx ", + " xxx ", + " xxx ", + " xxx ", + "xxxxxxxxxxx ", + "xxxxxxxxxxxx", + "xxxxxxxxxxx ", + " xxx ", + " xxx ", + " xxx ", + " xxxx ", + " " +}; + +static const char* line_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #008080", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx" +}; + +static const char* rect_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #000080", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx" +}; + +static const char* text_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #800000", + " xxxxxxxxxx ", + "xxxxxxxxxxxx", + "xx xx xx", + " xx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xxxx ", + " xxxxxx " +}; + +static const char* poly_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #008000", + " xx ", + " xxxx ", + " xxxxxx ", + " xxxxxxxx ", + " xxxxxxxxxx ", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx", + " xxxxxxxxxx ", + " xxxxxxxx ", + " xxxxxx ", + " xxxx ", + " xx " +}; + +// Event table: + + +DESIGN_TREE_FRAME::DESIGN_TREE_FRAME( PL_EDITOR_FRAME* aParent ) : + wxTreeCtrl( aParent, ID_DESIGN_TREE_FRAME ) +{ + // icons size is not know (depending on they are built) + // so get it: + wxSize iconsize; + wxBitmap root_bm( root_xpm ); + + iconsize.x = root_bm.GetWidth(); + iconsize.y = root_bm.GetHeight(); + + // Make an image list containing small icons + m_imageList = new wxImageList( iconsize.x, iconsize.y, true, 4 ); + + m_imageList->Add( root_bm ); // root symbol + m_imageList->Add( wxBitmap( line_xpm ) ); // line item + m_imageList->Add( wxBitmap( rect_xpm ) ); // rect item + m_imageList->Add( wxBitmap( text_xpm ) ); // text item + m_imageList->Add( wxBitmap( poly_xpm ) ); // poly item + + SetImageList( m_imageList ); +} + + +DESIGN_TREE_FRAME::~DESIGN_TREE_FRAME() +{ + delete m_imageList; +} + + +wxSize DESIGN_TREE_FRAME::GetMinSize() const +{ + return wxSize( 100, -1 ); +} + + +void DESIGN_TREE_FRAME::ReCreateDesignTree() +{ + wxWindowUpdateLocker dummy(this); // Avoid flicker when rebuilding the tree + + DeleteAllItems(); + + const WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + + // root tree: + wxFileName fn( ((PL_EDITOR_FRAME*) GetParent())->GetCurrFileName() ); + wxTreeItemId rootitem; + + if( fn.GetName().IsEmpty() ) + rootitem = AddRoot( wxT( "" ), 0, 0 ); + else + rootitem = AddRoot( fn.GetName(), 0, 0 ); + + SetItemBold( rootitem, true ); + + // Now adding all current items + for( unsigned ii = 0; ii < pglayout.GetCount(); ii++ ) + { + WORKSHEET_DATAITEM* item = pglayout.GetItem( ii ); + int img = 0; + switch( item->GetType() ) + { + case WORKSHEET_DATAITEM::WS_SEGMENT: img = 1; break; + case WORKSHEET_DATAITEM::WS_RECT: img = 2; break; + case WORKSHEET_DATAITEM::WS_TEXT: img = 3; break; + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: img = 4; break; + } + wxTreeItemId cell= AppendItem( rootitem, item->m_Name, img, img ); + DESIGN_TREE_ITEM_DATA* data = new DESIGN_TREE_ITEM_DATA( item ); + SetItemData( cell, data ); + } + + Expand( rootitem ); +} + + +// Select the tree item corresponding to the WORKSHEET_DATAITEM aItem +void DESIGN_TREE_FRAME::SelectCell( WORKSHEET_DATAITEM* aItem ) +{ + wxTreeItemId rootcell = GetRootItem(); + wxTreeItemIdValue cookie; + + wxTreeItemId cell = GetFirstChild( rootcell, cookie ); + + while( cell.IsOk() ) + { + DESIGN_TREE_ITEM_DATA* data = (DESIGN_TREE_ITEM_DATA*) GetItemData( cell ); + + if( data->GetItem() == aItem ) + { + SelectItem( cell ); + return; + } + + cell = GetNextChild( rootcell, cookie ); + } +} + +//return the page layout item managed by the cell +WORKSHEET_DATAITEM* DESIGN_TREE_FRAME::GetPageLayoutItem( wxTreeItemId aCell ) const +{ + DESIGN_TREE_ITEM_DATA* data = (DESIGN_TREE_ITEM_DATA*) GetItemData( aCell ); + if( data ) + return data->GetItem(); + else + return NULL; +} + +/* return the page layout item managed by the selected cell (or NULL) + */ +WORKSHEET_DATAITEM* DESIGN_TREE_FRAME::GetPageLayoutSelectedItem() const +{ + wxTreeItemId cell; + cell = GetSelection(); + + if( cell.IsOk() ) + return GetPageLayoutItem( cell ); + + return NULL; +} + +/* return the page layout item index managed by the selected cell (or -1) + */ +int DESIGN_TREE_FRAME::GetSelectedItemIndex() +{ + WORKSHEET_DATAITEM*item = GetPageLayoutSelectedItem(); + + if( item == NULL ) + return -1; + + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + return pglayout.GetItemIndex( item ); +} diff --git a/pagelayout_editor/design_tree_frame.h b/pagelayout_editor/design_tree_frame.h new file mode 100644 index 0000000000..d601ac4d5d --- /dev/null +++ b/pagelayout_editor/design_tree_frame.h @@ -0,0 +1,108 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file design_tree_frame.h + */ + +#ifndef _DESIGN_TREE_FRAME_H +#define _DESIGN_TREE_FRAME_H + +#include + +#include + +class WORKSHEET_DATAITEM; + +/** class DESIGN_TREE_ITEM + * Handle one item for the page layoiut design + */ +class DESIGN_TREE_ITEM_DATA : public wxTreeItemData +{ +private: + WORKSHEET_DATAITEM* m_wsItem; // the page layout item owned by me + +public: + + DESIGN_TREE_ITEM_DATA( WORKSHEET_DATAITEM* aItem = NULL ) + { + m_wsItem = aItem; + } + + /** @return the item managed by the cell + */ + WORKSHEET_DATAITEM* GetItem() const + { + return m_wsItem; + } + + /** Set the link to the item managed by the cell + */ + void SetItem( WORKSHEET_DATAITEM* aItem ) + { + m_wsItem = aItem; + } +}; + + +/** + * Class DESIGN_TREE_FRAME is the left window showing the list of items + */ + +class DESIGN_TREE_FRAME : protected wxTreeCtrl +{ + friend class PL_EDITOR_FRAME; + +private: + wxImageList* m_imageList; + +public: + DESIGN_TREE_FRAME( PL_EDITOR_FRAME* aParent ); + ~DESIGN_TREE_FRAME(); + + void ReCreateDesignTree(); + wxSize GetMinSize() const; + + /** @return the page layout item managed by the cell + */ + WORKSHEET_DATAITEM* GetPageLayoutItem(wxTreeItemId aCell) const; + + /** @return the page layout item managed by the selected cell (or NULL) + */ + WORKSHEET_DATAITEM* GetPageLayoutSelectedItem() const; + + /** @return the page layout item index managed by the selected cell (or -1) + */ + int GetSelectedItemIndex(); + + // Select the tree item corresponding to the WORKSHEET_DATAITEM aItem + void SelectCell( WORKSHEET_DATAITEM* aItem ); + + void SelectCell( const wxTreeItemId &aTreeItem, bool aSelect=true ) + { + SelectItem( aTreeItem, aSelect ); + } +}; + +#endif /* _DESIGN_TREE_FRAME_H */ diff --git a/pagelayout_editor/dialogs/dialog_new_dataitem.cpp b/pagelayout_editor/dialogs/dialog_new_dataitem.cpp new file mode 100644 index 0000000000..b6b8b019cb --- /dev/null +++ b/pagelayout_editor/dialogs/dialog_new_dataitem.cpp @@ -0,0 +1,183 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file dialog_new_dataitem.cpp + * @brief a dialog called on creating a new plage layout data item. +*/ + +#include +#include +#include + +#include +#include +#include + +class DIALOG_NEW_DATAITEM : public DIALOG_NEW_DATAITEM_BASE +{ + WORKSHEET_DATAITEM* m_item; + +public: + DIALOG_NEW_DATAITEM( PL_EDITOR_FRAME* aCaller, WORKSHEET_DATAITEM* aItem ); + +private: + void OnCancelClick( wxCommandEvent& event ); + void OnOKClick( wxCommandEvent& event ); + + void initDlg(); +}; + + +int InvokeDialogNewItem( PL_EDITOR_FRAME* aCaller, WORKSHEET_DATAITEM* aItem ) +{ + DIALOG_NEW_DATAITEM dlg( aCaller, aItem ); + return dlg.ShowModal(); +} + +DIALOG_NEW_DATAITEM::DIALOG_NEW_DATAITEM( PL_EDITOR_FRAME* aCaller, + WORKSHEET_DATAITEM* aItem ) + : DIALOG_NEW_DATAITEM_BASE( aCaller ) +{ + m_item = aItem; + initDlg(); + + GetSizer()->SetSizeHints( this ); + Centre(); +} + +void DIALOG_NEW_DATAITEM::OnCancelClick( wxCommandEvent& event ) +{ + EndModal( wxID_CANCEL); +} + +void DIALOG_NEW_DATAITEM::OnOKClick( wxCommandEvent& event ) +{ + if( m_item->GetType() == WORKSHEET_DATAITEM::WS_TEXT ) + { + WORKSHEET_DATAITEM_TEXT* text = ((WORKSHEET_DATAITEM_TEXT*)m_item); + text->m_TextBase = m_textCtrlText->GetValue(); + // For multiline texts, replace the '\n' char by the "\\n" sequence", + // in internal string + text->m_TextBase.Replace( wxT("\n"), wxT("\\n") ); + } + + wxString msg; + + // Import Start point + double dtmp; + msg = m_textCtrlPosX->GetValue(); + msg.ToDouble( &dtmp ); + m_item->m_Pos.m_Pos.x = dtmp; + + msg = m_textCtrlPosY->GetValue(); + msg.ToDouble( &dtmp ); + m_item->m_Pos.m_Pos.y = dtmp; + + switch( m_choiceCornerPos->GetSelection() ) + { + case 2: m_item->m_Pos.m_Anchor = RB_CORNER; break; + case 0: m_item->m_Pos.m_Anchor = RT_CORNER; break; + case 3: m_item->m_Pos.m_Anchor = LB_CORNER; break; + case 1: m_item->m_Pos.m_Anchor = LT_CORNER; break; + } + + // Import End point + msg = m_textCtrlEndX->GetValue(); + msg.ToDouble( &dtmp ); + m_item->m_End.m_Pos.x = dtmp; + + msg = m_textCtrlEndY->GetValue(); + msg.ToDouble( &dtmp ); + m_item->m_End.m_Pos.y = dtmp; + + switch( m_choiceCornerEnd->GetSelection() ) + { + case 2: m_item->m_End.m_Anchor = RB_CORNER; break; + case 0: m_item->m_End.m_Anchor = RT_CORNER; break; + case 3: m_item->m_End.m_Anchor = LB_CORNER; break; + case 1: m_item->m_End.m_Anchor = LT_CORNER; break; + } + + EndModal( wxID_OK); +} + +void DIALOG_NEW_DATAITEM::initDlg() +{ + // Disable useless widgets, depending on WORKSHEET_DATAITEM type + switch( m_item->GetType() ) + { + case WORKSHEET_DATAITEM::WS_SEGMENT: + case WORKSHEET_DATAITEM::WS_RECT: + m_textCtrlText->Enable( false ); + break; + + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: + m_textCtrlText->Enable( false ); + // fall through + case WORKSHEET_DATAITEM::WS_TEXT: + m_textCtrlEndX->Enable( false ); + m_textCtrlEndY->Enable( false ); + break; + } + + wxString msg; + + // Position/ start point + msg.Printf( wxT("%.3f"), m_item->m_Pos.m_Pos.x ); + m_textCtrlPosX->SetValue( msg ); + msg.Printf( wxT("%.3f"), m_item->m_Pos.m_Pos.y ); + m_textCtrlPosY->SetValue( msg ); + switch( m_item->m_Pos.m_Anchor ) + { + case RB_CORNER: // right bottom corner + m_choiceCornerPos->SetSelection( 2 ); break; + case RT_CORNER: // right top corner + m_choiceCornerPos->SetSelection( 0 ); break; + case LB_CORNER: // left bottom corner + m_choiceCornerPos->SetSelection( 3 ); break; + case LT_CORNER: // left top corner + m_choiceCornerPos->SetSelection( 1 ); break; + } + + // End point + msg.Printf( wxT("%.3f"), m_item->m_End.m_Pos.x ); + m_textCtrlEndX->SetValue( msg ); + msg.Printf( wxT("%.3f"), m_item->m_End.m_Pos.y ); + m_textCtrlEndY->SetValue( msg ); + switch( m_item->m_End.m_Anchor ) + { + case RB_CORNER: // right bottom corner + m_choiceCornerEnd->SetSelection( 2 ); break; + case RT_CORNER: // right top corner + m_choiceCornerEnd->SetSelection( 0 ); break; + case LB_CORNER: // left bottom corner + m_choiceCornerEnd->SetSelection( 3 ); break; + case LT_CORNER: // left top corner + m_choiceCornerEnd->SetSelection( 1 ); break; + } + + if( m_item->GetType() == WORKSHEET_DATAITEM::WS_TEXT ) + m_textCtrlText->SetValue( ((WORKSHEET_DATAITEM_TEXT*)m_item)->m_TextBase ); +} diff --git a/pagelayout_editor/dialogs/dialog_new_dataitem_base.cpp b/pagelayout_editor/dialogs/dialog_new_dataitem_base.cpp new file mode 100644 index 0000000000..0bb94bce80 --- /dev/null +++ b/pagelayout_editor/dialogs/dialog_new_dataitem_base.cpp @@ -0,0 +1,157 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 8 2012) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_new_dataitem_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_NEW_DATAITEM_BASE::DIALOG_NEW_DATAITEM_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerUpper; + bSizerUpper = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerPos; + bSizerPos = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerPosXY; + bSizerPosXY = new wxBoxSizer( wxVERTICAL ); + + m_staticTextPosX = new wxStaticText( this, wxID_ANY, _("Pos X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPosX->Wrap( -1 ); + bSizerPosXY->Add( m_staticTextPosX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlPosX = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerPosXY->Add( m_textCtrlPosX, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticTextPosY = new wxStaticText( this, wxID_ANY, _("Pos Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPosY->Wrap( -1 ); + bSizerPosXY->Add( m_staticTextPosY, 0, wxRIGHT|wxLEFT, 5 ); + + m_textCtrlPosY = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerPosXY->Add( m_textCtrlPosY, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerPos->Add( bSizerPosXY, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer6; + bSizer6 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextOrgPos = new wxStaticText( this, wxID_ANY, _("Origin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextOrgPos->Wrap( -1 ); + bSizer6->Add( m_staticTextOrgPos, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + wxString m_choiceCornerPosChoices[] = { _("Upper Right"), _("Upper Left"), _("Lower Right"), _("Lower Left") }; + int m_choiceCornerPosNChoices = sizeof( m_choiceCornerPosChoices ) / sizeof( wxString ); + m_choiceCornerPos = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceCornerPosNChoices, m_choiceCornerPosChoices, 0 ); + m_choiceCornerPos->SetSelection( 2 ); + bSizer6->Add( m_choiceCornerPos, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerPos->Add( bSizer6, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerUpper->Add( bSizerPos, 1, wxEXPAND, 5 ); + + m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerUpper->Add( m_staticline2, 0, wxEXPAND | wxALL, 5 ); + + m_SizerEndPosition = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerEndXY; + bSizerEndXY = new wxBoxSizer( wxVERTICAL ); + + m_staticTextEndX = new wxStaticText( this, wxID_ANY, _("End X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextEndX->Wrap( -1 ); + bSizerEndXY->Add( m_staticTextEndX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlEndX = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerEndXY->Add( m_textCtrlEndX, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticTextEndY = new wxStaticText( this, wxID_ANY, _("End Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextEndY->Wrap( -1 ); + bSizerEndXY->Add( m_staticTextEndY, 0, wxRIGHT|wxLEFT, 5 ); + + m_textCtrlEndY = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerEndXY->Add( m_textCtrlEndY, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + m_SizerEndPosition->Add( bSizerEndXY, 1, 0, 5 ); + + wxBoxSizer* bSizer61; + bSizer61 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextOrgPos1 = new wxStaticText( this, wxID_ANY, _("Origin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextOrgPos1->Wrap( -1 ); + bSizer61->Add( m_staticTextOrgPos1, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + wxString m_choiceCornerEndChoices[] = { _("Upper Right"), _("Upper Left"), _("Lower Right"), _("Lower Left") }; + int m_choiceCornerEndNChoices = sizeof( m_choiceCornerEndChoices ) / sizeof( wxString ); + m_choiceCornerEnd = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceCornerEndNChoices, m_choiceCornerEndChoices, 0 ); + m_choiceCornerEnd->SetSelection( 2 ); + bSizer61->Add( m_choiceCornerEnd, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + m_SizerEndPosition->Add( bSizer61, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerUpper->Add( m_SizerEndPosition, 1, wxEXPAND, 5 ); + + m_staticlineEndXY = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerUpper->Add( m_staticlineEndXY, 0, wxEXPAND | wxALL, 5 ); + + m_SizerText = new wxBoxSizer( wxVERTICAL ); + + m_staticTextTitle = new wxStaticText( this, wxID_ANY, _("Text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTitle->Wrap( -1 ); + m_SizerText->Add( m_staticTextTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); + m_textCtrlText->SetMinSize( wxSize( 300,-1 ) ); + + m_SizerText->Add( m_textCtrlText, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_SizerText->Add( m_staticline3, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerUpper->Add( m_SizerText, 1, wxEXPAND, 5 ); + + + bSizerMain->Add( bSizerUpper, 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(); + + bSizerMain->Add( m_sdbSizerButtons, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizerMain ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + m_sdbSizerButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NEW_DATAITEM_BASE::OnCancelClick ), NULL, this ); + m_sdbSizerButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NEW_DATAITEM_BASE::OnOKClick ), NULL, this ); +} + +DIALOG_NEW_DATAITEM_BASE::~DIALOG_NEW_DATAITEM_BASE() +{ + // Disconnect Events + m_sdbSizerButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NEW_DATAITEM_BASE::OnCancelClick ), NULL, this ); + m_sdbSizerButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NEW_DATAITEM_BASE::OnOKClick ), NULL, this ); + +} diff --git a/pagelayout_editor/dialogs/dialog_new_dataitem_base.fbp b/pagelayout_editor/dialogs/dialog_new_dataitem_base.fbp new file mode 100644 index 0000000000..01f823fce2 --- /dev/null +++ b/pagelayout_editor/dialogs/dialog_new_dataitem_base.fbp @@ -0,0 +1,1666 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + dialog_new_dataitem_base + 1000 + none + 1 + dialog_new_dataitem_base + + . + + 1 + 1 + 1 + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + + DIALOG_NEW_DATAITEM_BASE + + 328,335 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + DIALOG_SHIM; dialog_shim.h + New Item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizerMain + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizerUpper + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizerPos + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizerPosXY + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Pos X (mm) + + 0 + + + 0 + + 1 + m_staticTextPosX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlPosX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Pos Y (mm) + + 0 + + + 0 + + 1 + m_staticTextPosY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlPosY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bSizer6 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Origin + + 0 + + + 0 + + 1 + m_staticTextOrgPos + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Upper Right" "Upper Left" "Lower Right" "Lower Left" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_choiceCornerPos + 1 + + + protected + 1 + + Resizable + 2 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline2 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + m_SizerEndPosition + wxHORIZONTAL + protected + + 5 + + 1 + + + bSizerEndXY + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + End X (mm) + + 0 + + + 0 + + 1 + m_staticTextEndX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlEndX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + End Y (mm) + + 0 + + + 0 + + 1 + m_staticTextEndY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlEndY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bSizer61 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Origin + + 0 + + + 0 + + 1 + m_staticTextOrgPos1 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Upper Right" "Upper Left" "Lower Right" "Lower Left" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_choiceCornerEnd + 1 + + + protected + 1 + + Resizable + 2 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticlineEndXY + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + m_SizerText + wxVERTICAL + protected + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text + + 0 + + + 0 + + 1 + m_staticTextTitle + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + 300,-1 + 1 + m_textCtrlText + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_MULTILINE + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline3 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizerButtons + protected + + OnCancelClick + + + + OnOKClick + + + + + + + + diff --git a/pagelayout_editor/dialogs/dialog_new_dataitem_base.h b/pagelayout_editor/dialogs/dialog_new_dataitem_base.h new file mode 100644 index 0000000000..871639269a --- /dev/null +++ b/pagelayout_editor/dialogs/dialog_new_dataitem_base.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 8 2012) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __DIALOG_NEW_DATAITEM_BASE_H__ +#define __DIALOG_NEW_DATAITEM_BASE_H__ + +#include +#include +#include +class DIALOG_SHIM; + +#include "dialog_shim.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_NEW_DATAITEM_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_NEW_DATAITEM_BASE : public DIALOG_SHIM +{ + private: + + protected: + wxStaticText* m_staticTextPosX; + wxTextCtrl* m_textCtrlPosX; + wxStaticText* m_staticTextPosY; + wxTextCtrl* m_textCtrlPosY; + wxStaticText* m_staticTextOrgPos; + wxChoice* m_choiceCornerPos; + wxStaticLine* m_staticline2; + wxBoxSizer* m_SizerEndPosition; + wxStaticText* m_staticTextEndX; + wxTextCtrl* m_textCtrlEndX; + wxStaticText* m_staticTextEndY; + wxTextCtrl* m_textCtrlEndY; + wxStaticText* m_staticTextOrgPos1; + wxChoice* m_choiceCornerEnd; + wxStaticLine* m_staticlineEndXY; + wxBoxSizer* m_SizerText; + wxStaticText* m_staticTextTitle; + wxTextCtrl* m_textCtrlText; + wxStaticLine* m_staticline3; + wxStdDialogButtonSizer* m_sdbSizerButtons; + wxButton* m_sdbSizerButtonsOK; + wxButton* m_sdbSizerButtonsCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOKClick( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_NEW_DATAITEM_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("New Item"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 328,335 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_NEW_DATAITEM_BASE(); + +}; + +#endif //__DIALOG_NEW_DATAITEM_BASE_H__ diff --git a/pagelayout_editor/dialogs/dialogs_for_printing.cpp b/pagelayout_editor/dialogs/dialogs_for_printing.cpp new file mode 100644 index 0000000000..24c2aa5077 --- /dev/null +++ b/pagelayout_editor/dialogs/dialogs_for_printing.cpp @@ -0,0 +1,248 @@ +/** + * @file dialogs_for_printing.cpp + */ + +/* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** + * Custom print out for printing schematics. + */ +class PLEDITOR_PRINTOUT : public wxPrintout +{ +private: + PL_EDITOR_FRAME* m_parent; + +public: + PLEDITOR_PRINTOUT( PL_EDITOR_FRAME* aParent, const wxString& aTitle ) : + wxPrintout( aTitle ) + { + wxASSERT( aParent != NULL ); + m_parent = aParent; + } + + bool OnPrintPage( int aPageNum ); + bool HasPage( int aPageNum ) { return ( aPageNum <= 2 ); } + void GetPageInfo( int* minPage, int* maxPage, int* selPageFrom, int* selPageTo ); + void DrawPage( int aPageNum ); +}; + +/** + * Custom print preview frame. + */ +class PLEDITOR_PREVIEW_FRAME : public wxPreviewFrame +{ + PL_EDITOR_FRAME* m_parent; + +public: + PLEDITOR_PREVIEW_FRAME( wxPrintPreview* aPreview, PL_EDITOR_FRAME* aParent, + const wxString& aTitle, const wxPoint& aPos = wxDefaultPosition, + const wxSize& aSize = wxDefaultSize ) : + wxPreviewFrame( aPreview, aParent, aTitle, aPos, aSize ) + { + m_parent = aParent; + } + + bool Show( bool show ) // overload + { + bool ret; + + // Show or hide the window. If hiding, save current position and size. + // If showing, use previous position and size. + if( show ) + { + bool centre = false; + if( s_size.x == 0 || s_size.y == 0 ) + { + s_size = (m_parent->GetSize() * 3) / 4; + s_pos = wxDefaultPosition; + centre = true; + } + + SetSize( s_pos.x, s_pos.y, s_size.x, s_size.y, 0 ); + + if( centre ) + Center(); + + ret = wxPreviewFrame::Show( show ); + } + else + { + // Save the dialog's position & size before hiding + s_size = GetSize(); + s_pos = GetPosition(); + + ret = wxPreviewFrame::Show( show ); + } + return ret; + } + +private: + static wxPoint s_pos; + static wxSize s_size; + + DECLARE_CLASS( PLEDITOR_PREVIEW_FRAME ) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS( PLEDITOR_PREVIEW_FRAME ) +}; + +wxPoint PLEDITOR_PREVIEW_FRAME::s_pos; +wxSize PLEDITOR_PREVIEW_FRAME::s_size; + +IMPLEMENT_CLASS( PLEDITOR_PREVIEW_FRAME, wxPreviewFrame ) + +BEGIN_EVENT_TABLE( PLEDITOR_PREVIEW_FRAME, wxPreviewFrame ) + EVT_CLOSE( PLEDITOR_PREVIEW_FRAME::OnCloseWindow ) +END_EVENT_TABLE() + + +bool PLEDITOR_PRINTOUT::OnPrintPage( int aPageNum ) +{ + DrawPage( aPageNum ); + return true; +} + + +void PLEDITOR_PRINTOUT::GetPageInfo( int* minPage, int* maxPage, + int* selPageFrom, int* selPageTo ) +{ + *minPage = *selPageFrom = 1; + *maxPage = *selPageTo = 2; +} + +/* + * This is the real print function: print the active screen + */ +void PLEDITOR_PRINTOUT::DrawPage( int aPageNum ) +{ + int oldZoom; + wxPoint tmp_startvisu; + wxSize pageSizeIU; // Page size in internal units + wxPoint old_org; + EDA_RECT oldClipBox; + wxRect fitRect; + wxDC* dc = GetDC(); + EDA_DRAW_PANEL* panel = m_parent->GetCanvas(); + PL_EDITOR_SCREEN* screen = m_parent->GetScreen(); + + // Save current scale factor, offsets, and clip box. + tmp_startvisu = screen->m_StartVisu; + oldZoom = screen->GetZoom(); + old_org = screen->m_DrawOrg; + + oldClipBox = *panel->GetClipBox(); + + // Change clip box to print the whole page. + #define MAX_VALUE (INT_MAX/2) // MAX_VALUE is the max we can use in an integer + // and that allows calculations without overflow + panel->SetClipBox( EDA_RECT( wxPoint( 0, 0 ), wxSize( MAX_VALUE, MAX_VALUE ) ) ); + + // Change scale factor and offset to print the whole page. + + pageSizeIU = m_parent->GetPageSettings().GetSizeIU(); + FitThisSizeToPaper( pageSizeIU ); + fitRect = GetLogicalPaperRect(); + + int xoffset = ( fitRect.width - pageSizeIU.x ) / 2; + int yoffset = ( fitRect.height - pageSizeIU.y ) / 2; + + OffsetLogicalOrigin( xoffset, yoffset ); + + GRResetPenAndBrush( dc ); + GRForceBlackPen( true ); + screen->m_IsPrinting = true; + + EDA_COLOR_T bg_color = g_DrawBgColor; + g_DrawBgColor = WHITE; + + screen->m_ScreenNumber = aPageNum; + m_parent->DrawWorkSheet( dc, screen, 0, IU_PER_MILS, wxEmptyString ); + + g_DrawBgColor = bg_color; + screen->m_IsPrinting = false; + panel->SetClipBox( oldClipBox ); + + GRForceBlackPen( false ); + + screen->m_StartVisu = tmp_startvisu; + screen->m_DrawOrg = old_org; + screen->SetZoom( oldZoom ); +} + + +int InvokeDialogPrint( PL_EDITOR_FRAME* aCaller, wxPrintData* aPrintData, + wxPageSetupDialogData* aPageSetupData ) +{ + int pageCount = 2; + + wxPrintDialogData printDialogData( *aPrintData ); + printDialogData.SetMaxPage( pageCount ); + + if( pageCount > 1 ) + printDialogData.EnablePageNumbers( true ); + + wxPrinter printer( &printDialogData ); + PLEDITOR_PRINTOUT printout( aCaller, _( "Print Page Layout" ) ); + + if( !printer.Print( aCaller, &printout, true ) ) + { + if( wxPrinter::GetLastError() == wxPRINTER_ERROR ) + wxMessageBox( _( "An error occurred attempting to print the page layout." ), + _( "Printing" ), wxOK ); + return 0; + } + + *aPageSetupData = printer.GetPrintDialogData().GetPrintData(); + + return 1; +} + +int InvokeDialogPrintPreview( PL_EDITOR_FRAME* aCaller, wxPrintData* aPrintData ) +{ + // Pass two printout objects: for preview, and possible printing. + wxString title = _( "Preview" ); + wxPrintPreview* preview = new wxPrintPreview( new PLEDITOR_PRINTOUT( aCaller, title ), + new PLEDITOR_PRINTOUT( aCaller, title ), + aPrintData ); + + preview->SetZoom( 70 ); + + PLEDITOR_PREVIEW_FRAME* frame = new PLEDITOR_PREVIEW_FRAME( preview, aCaller, title ); + + frame->Initialize(); + frame->Show( true ); + + return 1; +} + diff --git a/pagelayout_editor/dialogs/properties_frame_base.cpp b/pagelayout_editor/dialogs/properties_frame_base.cpp new file mode 100644 index 0000000000..bd12ffdd3f --- /dev/null +++ b/pagelayout_editor/dialogs/properties_frame_base.cpp @@ -0,0 +1,627 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 8 2012) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "properties_frame_base.h" + +/////////////////////////////////////////////////////////////////////////// + +PANEL_PROPERTIES_BASE::PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +{ + wxBoxSizer* bSizerpanel; + bSizerpanel = new wxBoxSizer( wxVERTICAL ); + + m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_swItemProperties = new wxScrolledWindow( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_swItemProperties->SetScrollRate( 5, 5 ); + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerButt; + bSizerButt = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerType; + bSizerType = new wxBoxSizer( wxVERTICAL ); + + m_staticTextType = new wxStaticText( m_swItemProperties, wxID_ANY, _("Type"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextType->Wrap( -1 ); + m_staticTextType->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerType->Add( m_staticTextType, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlType = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + bSizerType->Add( m_textCtrlType, 0, wxRIGHT|wxLEFT, 5 ); + + + bSizerButt->Add( bSizerType, 0, 0, 5 ); + + wxBoxSizer* bSizerPageOpt; + bSizerPageOpt = new wxBoxSizer( wxVERTICAL ); + + m_staticTextPageOpt = new wxStaticText( m_swItemProperties, wxID_ANY, _("Page 1 option"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPageOpt->Wrap( -1 ); + m_staticTextPageOpt->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); + + bSizerPageOpt->Add( m_staticTextPageOpt, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + wxString m_choicePageOptChoices[] = { _("None"), _("Page 1 only"), _("Not on page 1") }; + int m_choicePageOptNChoices = sizeof( m_choicePageOptChoices ) / sizeof( wxString ); + m_choicePageOpt = new wxChoice( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePageOptNChoices, m_choicePageOptChoices, 0 ); + m_choicePageOpt->SetSelection( 0 ); + bSizerPageOpt->Add( m_choicePageOpt, 0, wxRIGHT|wxLEFT, 5 ); + + + bSizerButt->Add( bSizerPageOpt, 0, 0, 5 ); + + + bSizerMain->Add( bSizerButt, 0, 0, 5 ); + + m_staticline5 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline5, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_SizerTextOptions = new wxBoxSizer( wxVERTICAL ); + + m_staticTextText = new wxStaticText( m_swItemProperties, wxID_ANY, _("Text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextText->Wrap( -1 ); + m_SizerTextOptions->Add( m_staticTextText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlText = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); + m_SizerTextOptions->Add( m_textCtrlText, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + wxBoxSizer* bSizerFontOpt; + bSizerFontOpt = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerJustify; + bSizerJustify = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextHjust = new wxStaticText( m_swItemProperties, wxID_ANY, _("H justification"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHjust->Wrap( -1 ); + bSizerJustify->Add( m_staticTextHjust, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxString m_choiceHjustifyChoices[] = { _("Left"), _("Center"), _("Right") }; + int m_choiceHjustifyNChoices = sizeof( m_choiceHjustifyChoices ) / sizeof( wxString ); + m_choiceHjustify = new wxChoice( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHjustifyNChoices, m_choiceHjustifyChoices, 0 ); + m_choiceHjustify->SetSelection( 0 ); + bSizerJustify->Add( m_choiceHjustify, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_checkBoxBold = new wxCheckBox( m_swItemProperties, wxID_ANY, _("Bold"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerJustify->Add( m_checkBoxBold, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizerFontOpt->Add( bSizerJustify, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizerBoldItalic; + bSizerBoldItalic = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextVjust = new wxStaticText( m_swItemProperties, wxID_ANY, _("V justification"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextVjust->Wrap( -1 ); + bSizerBoldItalic->Add( m_staticTextVjust, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxString m_choiceVjustifyChoices[] = { _("Top"), _("Center"), _("Bottom") }; + int m_choiceVjustifyNChoices = sizeof( m_choiceVjustifyChoices ) / sizeof( wxString ); + m_choiceVjustify = new wxChoice( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVjustifyNChoices, m_choiceVjustifyChoices, 0 ); + m_choiceVjustify->SetSelection( 1 ); + bSizerBoldItalic->Add( m_choiceVjustify, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_checkBoxItalic = new wxCheckBox( m_swItemProperties, wxID_ANY, _("Italic"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerBoldItalic->Add( m_checkBoxItalic, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizerFontOpt->Add( bSizerBoldItalic, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + + m_SizerTextOptions->Add( bSizerFontOpt, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizerTextSize; + bSizerTextSize = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerTsizeX; + bSizerTsizeX = new wxBoxSizer( wxVERTICAL ); + + m_staticTexTsizeX = new wxStaticText( m_swItemProperties, wxID_ANY, _("Text Height (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTexTsizeX->Wrap( -1 ); + bSizerTsizeX->Add( m_staticTexTsizeX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlTextSizeX = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerTsizeX->Add( m_textCtrlTextSizeX, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerTextSize->Add( bSizerTsizeX, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizerTsizeY; + bSizerTsizeY = new wxBoxSizer( wxVERTICAL ); + + m_staticTextTsizeY = new wxStaticText( m_swItemProperties, wxID_ANY, _("Text Width (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTsizeY->Wrap( -1 ); + bSizerTsizeY->Add( m_staticTextTsizeY, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlTextSizeY = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerTsizeY->Add( m_textCtrlTextSizeY, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerTextSize->Add( bSizerTsizeY, 1, wxEXPAND, 5 ); + + + m_SizerTextOptions->Add( bSizerTextSize, 0, 0, 5 ); + + m_staticTextConstraints = new wxStaticText( m_swItemProperties, wxID_ANY, _("Constraints:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextConstraints->Wrap( -1 ); + m_SizerTextOptions->Add( m_staticTextConstraints, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizerConstraints; + bSizerConstraints = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer42; + bSizer42 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextConstraintX = new wxStaticText( m_swItemProperties, wxID_ANY, _("Max Size X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextConstraintX->Wrap( -1 ); + bSizer42->Add( m_staticTextConstraintX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlConstraintX = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer42->Add( m_textCtrlConstraintX, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerConstraints->Add( bSizer42, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextConstraintY = new wxStaticText( m_swItemProperties, wxID_ANY, _("Max Size Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextConstraintY->Wrap( -1 ); + bSizer52->Add( m_staticTextConstraintY, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlConstraintY = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer52->Add( m_textCtrlConstraintY, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerConstraints->Add( bSizer52, 1, wxEXPAND, 5 ); + + + m_SizerTextOptions->Add( bSizerConstraints, 0, 0, 5 ); + + m_staticline6 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_SizerTextOptions->Add( m_staticline6, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + + bSizerMain->Add( m_SizerTextOptions, 0, wxEXPAND, 5 ); + + m_buttonOK = new wxButton( m_swItemProperties, wxID_ANY, _("Accept"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonOK->SetDefault(); + bSizerMain->Add( m_buttonOK, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 ); + + m_staticline8 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline8, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticTextComment = new wxStaticText( m_swItemProperties, wxID_ANY, _("Comment"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextComment->Wrap( -1 ); + bSizerMain->Add( m_staticTextComment, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlComment = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerMain->Add( m_textCtrlComment, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticline2 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizerPos; + bSizerPos = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerPosXY; + bSizerPosXY = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer4; + bSizer4 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextPosX = new wxStaticText( m_swItemProperties, wxID_ANY, _("Pos X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPosX->Wrap( -1 ); + bSizer4->Add( m_staticTextPosX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlPosX = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer4->Add( m_textCtrlPosX, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerPosXY->Add( bSizer4, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextPosY = new wxStaticText( m_swItemProperties, wxID_ANY, _("Pos Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPosY->Wrap( -1 ); + bSizer5->Add( m_staticTextPosY, 0, wxRIGHT|wxLEFT, 5 ); + + m_textCtrlPosY = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer5->Add( m_textCtrlPosY, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + + bSizerPosXY->Add( bSizer5, 1, wxEXPAND, 5 ); + + + bSizerPos->Add( bSizerPosXY, 1, 0, 5 ); + + wxBoxSizer* bSizer6; + bSizer6 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextOrgPos = new wxStaticText( m_swItemProperties, wxID_ANY, _("Origin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextOrgPos->Wrap( -1 ); + bSizer6->Add( m_staticTextOrgPos, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_comboBoxCornerPos = new wxComboBox( m_swItemProperties, wxID_ANY, _("Lower Right"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + m_comboBoxCornerPos->Append( _("Upper Right") ); + m_comboBoxCornerPos->Append( _("Upper Left") ); + m_comboBoxCornerPos->Append( _("Lower Right") ); + m_comboBoxCornerPos->Append( _("Lower Left") ); + m_comboBoxCornerPos->SetSelection( 2 ); + bSizer6->Add( m_comboBoxCornerPos, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerPos->Add( bSizer6, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerMain->Add( bSizerPos, 0, 0, 5 ); + + m_SizerEndPosition = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerEndXY; + bSizerEndXY = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer41; + bSizer41 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextEndX = new wxStaticText( m_swItemProperties, wxID_ANY, _("End X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextEndX->Wrap( -1 ); + bSizer41->Add( m_staticTextEndX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlEndX = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer41->Add( m_textCtrlEndX, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerEndXY->Add( bSizer41, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer51; + bSizer51 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextEndY = new wxStaticText( m_swItemProperties, wxID_ANY, _("End Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextEndY->Wrap( -1 ); + bSizer51->Add( m_staticTextEndY, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlEndY = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer51->Add( m_textCtrlEndY, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerEndXY->Add( bSizer51, 1, wxEXPAND, 5 ); + + + m_SizerEndPosition->Add( bSizerEndXY, 1, 0, 5 ); + + wxBoxSizer* bSizer61; + bSizer61 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextOrgEnd = new wxStaticText( m_swItemProperties, wxID_ANY, _("Origin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextOrgEnd->Wrap( -1 ); + bSizer61->Add( m_staticTextOrgEnd, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_comboBoxCornerEnd = new wxComboBox( m_swItemProperties, wxID_ANY, _("Lower Right"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + m_comboBoxCornerEnd->Append( _("Upper Right") ); + m_comboBoxCornerEnd->Append( _("Upper Left") ); + m_comboBoxCornerEnd->Append( _("Lower Right") ); + m_comboBoxCornerEnd->Append( _("Lower Left") ); + m_comboBoxCornerEnd->SetSelection( 2 ); + bSizer61->Add( m_comboBoxCornerEnd, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + m_SizerEndPosition->Add( bSizer61, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerMain->Add( m_SizerEndPosition, 0, 0, 5 ); + + wxBoxSizer* bSizerLineThickness; + bSizerLineThickness = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerthickness; + bSizerthickness = new wxBoxSizer( wxVERTICAL ); + + m_staticTextThickness = new wxStaticText( m_swItemProperties, wxID_ANY, _("Thickness"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextThickness->Wrap( -1 ); + bSizerthickness->Add( m_staticTextThickness, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlThickness = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerthickness->Add( m_textCtrlThickness, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerLineThickness->Add( bSizerthickness, 0, wxEXPAND, 5 ); + + m_staticTextInfoThickness = new wxStaticText( m_swItemProperties, wxID_ANY, _("Set to 0 to use default"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextInfoThickness->Wrap( -1 ); + bSizerLineThickness->Add( m_staticTextInfoThickness, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerMain->Add( bSizerLineThickness, 0, 0, 5 ); + + m_SizerRotation = new wxBoxSizer( wxVERTICAL ); + + m_staticline1 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_SizerRotation->Add( m_staticline1, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizerRotation; + bSizerRotation = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextRot = new wxStaticText( m_swItemProperties, wxID_ANY, _("Rotation"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRot->Wrap( -1 ); + bSizerRotation->Add( m_staticTextRot, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlRotation = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerRotation->Add( m_textCtrlRotation, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + + m_SizerRotation->Add( bSizerRotation, 0, wxEXPAND, 5 ); + + + bSizerMain->Add( m_SizerRotation, 0, wxEXPAND, 5 ); + + m_staticline4 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline4, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_staticTextRepeatPrms = new wxStaticText( m_swItemProperties, wxID_ANY, _("Repeat parameters:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRepeatPrms->Wrap( -1 ); + bSizerMain->Add( m_staticTextRepeatPrms, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizer20; + bSizer20 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer611; + bSizer611 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextRepeatCnt = new wxStaticText( m_swItemProperties, wxID_ANY, _("Repeat count"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRepeatCnt->Wrap( -1 ); + bSizer611->Add( m_staticTextRepeatCnt, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlRepeatCount = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer611->Add( m_textCtrlRepeatCount, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizer20->Add( bSizer611, 1, 0, 5 ); + + m_SizerTextIncrementLabel = new wxBoxSizer( wxVERTICAL ); + + m_staticTextInclabel = new wxStaticText( m_swItemProperties, wxID_ANY, _("Text Increment"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextInclabel->Wrap( -1 ); + m_SizerTextIncrementLabel->Add( m_staticTextInclabel, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlTextIncrement = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_SizerTextIncrementLabel->Add( m_textCtrlTextIncrement, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizer20->Add( m_SizerTextIncrementLabel, 1, wxEXPAND, 5 ); + + + bSizerMain->Add( bSizer20, 0, 0, 5 ); + + wxBoxSizer* bSizerPosY1; + bSizerPosY1 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer411; + bSizer411 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextStepX = new wxStaticText( m_swItemProperties, wxID_ANY, _("Step X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStepX->Wrap( -1 ); + bSizer411->Add( m_staticTextStepX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlStepX = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer411->Add( m_textCtrlStepX, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerPosY1->Add( bSizer411, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer511; + bSizer511 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextStepY = new wxStaticText( m_swItemProperties, wxID_ANY, _("Step Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStepY->Wrap( -1 ); + bSizer511->Add( m_staticTextStepY, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlStepY = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer511->Add( m_textCtrlStepY, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerPosY1->Add( bSizer511, 1, wxEXPAND, 5 ); + + + bSizerMain->Add( bSizerPosY1, 0, 0, 5 ); + + + m_swItemProperties->SetSizer( bSizerMain ); + m_swItemProperties->Layout(); + bSizerMain->Fit( m_swItemProperties ); + m_notebook->AddPage( m_swItemProperties, _("Item Properties"), true ); + m_swGeneralOpts = new wxScrolledWindow( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_swGeneralOpts->SetScrollRate( 5, 5 ); + wxBoxSizer* bSizerGeneralOpts; + bSizerGeneralOpts = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerGeneralOpts1; + bSizerGeneralOpts1 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDefVal = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Default Values:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDefVal->Wrap( -1 ); + bSizerGeneralOpts1->Add( m_staticTextDefVal, 0, wxALL, 5 ); + + wxBoxSizer* bSizerDefTextSize; + bSizerDefTextSize = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerDefTsizeX; + bSizerDefTsizeX = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDefTsX = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Text Size X (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDefTsX->Wrap( -1 ); + bSizerDefTsizeX->Add( m_staticTextDefTsX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlDefaultTextSizeX = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerDefTsizeX->Add( m_textCtrlDefaultTextSizeX, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefTextSize->Add( bSizerDefTsizeX, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizerDefTsizeY; + bSizerDefTsizeY = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDefTsY = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Text Size Y (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDefTsY->Wrap( -1 ); + bSizerDefTsizeY->Add( m_staticTextDefTsY, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlDefaultTextSizeY = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerDefTsizeY->Add( m_textCtrlDefaultTextSizeY, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefTextSize->Add( bSizerDefTsizeY, 1, wxEXPAND, 5 ); + + + bSizerGeneralOpts1->Add( bSizerDefTextSize, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizerDefLineWidth; + bSizerDefLineWidth = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDefLineW = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Line Thickness (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDefLineW->Wrap( -1 ); + bSizer25->Add( m_staticTextDefLineW, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlDefaultLineWidth = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer25->Add( m_textCtrlDefaultLineWidth, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefLineWidth->Add( bSizer25, 1, 0, 5 ); + + wxBoxSizer* bSizerDefTextThickness; + bSizerDefTextThickness = new wxBoxSizer( wxVERTICAL ); + + m_staticText22 = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Text Thickness"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText22->Wrap( -1 ); + bSizerDefTextThickness->Add( m_staticText22, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlDefaultTextThickness = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerDefTextThickness->Add( m_textCtrlDefaultTextThickness, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefLineWidth->Add( bSizerDefTextThickness, 1, 0, 5 ); + + + bSizerGeneralOpts1->Add( bSizerDefLineWidth, 0, wxEXPAND, 5 ); + + + bSizerGeneralOpts->Add( bSizerGeneralOpts1, 0, 0, 5 ); + + m_buttonDefault = new wxButton( m_swGeneralOpts, wxID_ANY, _("Set to Default"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerGeneralOpts->Add( m_buttonDefault, 0, wxALL|wxEXPAND, 5 ); + + m_staticline9 = new wxStaticLine( m_swGeneralOpts, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerGeneralOpts->Add( m_staticline9, 0, wxEXPAND | wxALL, 5 ); + + wxBoxSizer* bSizerGeneraMargins; + bSizerGeneraMargins = new wxBoxSizer( wxVERTICAL ); + + m_staticTextMargins = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Page Margins"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMargins->Wrap( -1 ); + bSizerGeneraMargins->Add( m_staticTextMargins, 0, wxALL, 5 ); + + wxBoxSizer* bSizerDefLRMargins; + bSizerDefLRMargins = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerDefLeftMargin; + bSizerDefLeftMargin = new wxBoxSizer( wxVERTICAL ); + + m_staticTextLeftMargin = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Left Margin (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLeftMargin->Wrap( -1 ); + bSizerDefLeftMargin->Add( m_staticTextLeftMargin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlLeftMargin = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerDefLeftMargin->Add( m_textCtrlLeftMargin, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefLRMargins->Add( bSizerDefLeftMargin, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizerDefTsizeY1; + bSizerDefTsizeY1 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDefRightMargin = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Right Margin (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDefRightMargin->Wrap( -1 ); + bSizerDefTsizeY1->Add( m_staticTextDefRightMargin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlRightMargin = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerDefTsizeY1->Add( m_textCtrlRightMargin, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefLRMargins->Add( bSizerDefTsizeY1, 1, wxEXPAND, 5 ); + + + bSizerGeneraMargins->Add( bSizerDefLRMargins, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizerDefTBMargins; + bSizerDefTBMargins = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerTopMargin; + bSizerTopMargin = new wxBoxSizer( wxVERTICAL ); + + m_staticTextTopMargin = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Top Margin (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTopMargin->Wrap( -1 ); + bSizerTopMargin->Add( m_staticTextTopMargin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlTopMargin = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerTopMargin->Add( m_textCtrlTopMargin, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefTBMargins->Add( bSizerTopMargin, 1, 0, 5 ); + + wxBoxSizer* bSizerDefBottomMargin; + bSizerDefBottomMargin = new wxBoxSizer( wxVERTICAL ); + + m_staticTextBottomMargin = new wxStaticText( m_swGeneralOpts, wxID_ANY, _("Bottom Margin (mm)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBottomMargin->Wrap( -1 ); + bSizerDefBottomMargin->Add( m_staticTextBottomMargin, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlDefaultBottomMargin = new wxTextCtrl( m_swGeneralOpts, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerDefBottomMargin->Add( m_textCtrlDefaultBottomMargin, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizerDefTBMargins->Add( bSizerDefBottomMargin, 1, 0, 5 ); + + + bSizerGeneraMargins->Add( bSizerDefTBMargins, 0, wxEXPAND, 5 ); + + + bSizerGeneralOpts->Add( bSizerGeneraMargins, 0, 0, 5 ); + + m_buttonGeneralOptsOK = new wxButton( m_swGeneralOpts, wxID_ANY, _("Accept"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonGeneralOptsOK->SetDefault(); + bSizerGeneralOpts->Add( m_buttonGeneralOptsOK, 0, wxALL|wxEXPAND, 5 ); + + + m_swGeneralOpts->SetSizer( bSizerGeneralOpts ); + m_swGeneralOpts->Layout(); + bSizerGeneralOpts->Fit( m_swGeneralOpts ); + m_notebook->AddPage( m_swGeneralOpts, _("General Options"), false ); + + bSizerpanel->Add( m_notebook, 1, wxEXPAND | wxALL, 5 ); + + + this->SetSizer( bSizerpanel ); + this->Layout(); + + // Connect Events + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_PROPERTIES_BASE::OnAcceptPrms ), NULL, this ); + m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_PROPERTIES_BASE::OnSetDefaultValues ), NULL, this ); + m_buttonGeneralOptsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_PROPERTIES_BASE::OnAcceptPrms ), NULL, this ); +} + +PANEL_PROPERTIES_BASE::~PANEL_PROPERTIES_BASE() +{ + // Disconnect Events + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_PROPERTIES_BASE::OnAcceptPrms ), NULL, this ); + m_buttonDefault->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_PROPERTIES_BASE::OnSetDefaultValues ), NULL, this ); + m_buttonGeneralOptsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_PROPERTIES_BASE::OnAcceptPrms ), NULL, this ); + +} diff --git a/pagelayout_editor/dialogs/properties_frame_base.fbp b/pagelayout_editor/dialogs/properties_frame_base.fbp new file mode 100644 index 0000000000..7e6b956090 --- /dev/null +++ b/pagelayout_editor/dialogs/properties_frame_base.fbp @@ -0,0 +1,7497 @@ + + + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + properties_frame_base + 1000 + none + 1 + properties_frame + + . + + 1 + 1 + 1 + 1 + 0 + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + PANEL_PROPERTIES_BASE + + 315,782 + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizerpanel + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_notebook + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Item Properties + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_swItemProperties + 1 + + + protected + 1 + + Resizable + 5 + 5 + 1 + + + 0 + + + + wxHSCROLL|wxVSCROLL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizerMain + wxVERTICAL + none + + 5 + + 0 + + + bSizerButt + wxHORIZONTAL + none + + 5 + + 0 + + + bSizerType + wxVERTICAL + none + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,92,-1,70,0 + 0 + 0 + wxID_ANY + Type + + 0 + + + 0 + + 1 + m_staticTextType + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlType + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerPageOpt + wxVERTICAL + none + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,90,-1,70,0 + 0 + 0 + wxID_ANY + Page 1 option + + 0 + + + 0 + + 1 + m_staticTextPageOpt + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "None" "Page 1 only" "Not on page 1" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_choicePageOpt + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline5 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + m_SizerTextOptions + wxVERTICAL + protected + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text + + 0 + + + 0 + + 1 + m_staticTextText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlText + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_MULTILINE + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerFontOpt + wxVERTICAL + none + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bSizerJustify + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + H justification + + 0 + + + 0 + + 1 + m_staticTextHjust + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Left" "Center" "Right" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_choiceHjustify + 1 + + + protected + 1 + + Resizable + 0 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Bold + + 0 + + + 0 + + 1 + m_checkBoxBold + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 1 + + + bSizerBoldItalic + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + V justification + + 0 + + + 0 + + 1 + m_staticTextVjust + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Top" "Center" "Bottom" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_choiceVjustify + 1 + + + protected + 1 + + Resizable + 1 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Italic + + 0 + + + 0 + + 1 + m_checkBoxItalic + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerTextSize + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizerTsizeX + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text Height (mm) + + 0 + + + 0 + + 1 + m_staticTexTsizeX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlTextSizeX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerTsizeY + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text Width (mm) + + 0 + + + 0 + + 1 + m_staticTextTsizeY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlTextSizeY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Constraints: + + 0 + + + 0 + + 1 + m_staticTextConstraints + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerConstraints + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer42 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Max Size X (mm) + + 0 + + + 0 + + 1 + m_staticTextConstraintX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlConstraintX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer52 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Max Size Y (mm) + + 0 + + + 0 + + 1 + m_staticTextConstraintY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlConstraintY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline6 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Accept + + 0 + + + 0 + + 1 + m_buttonOK + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnAcceptPrms + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline8 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Comment + + 0 + + + 0 + + 1 + m_staticTextComment + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlComment + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline2 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerPos + wxHORIZONTAL + none + + 5 + + 1 + + + bSizerPosXY + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer4 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Pos X (mm) + + 0 + + + 0 + + 1 + m_staticTextPosX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + -1,-1 + 1 + m_textCtrlPosX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer5 + wxVERTICAL + none + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Pos Y (mm) + + 0 + + + 0 + + 1 + m_staticTextPosY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlPosY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bSizer6 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Origin + + 0 + + + 0 + + 1 + m_staticTextOrgPos + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Upper Right" "Upper Left" "Lower Right" "Lower Left" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_comboBoxCornerPos + 1 + + + protected + 1 + + Resizable + 2 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + Lower Right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + m_SizerEndPosition + wxHORIZONTAL + protected + + 5 + + 1 + + + bSizerEndXY + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer41 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + End X (mm) + + 0 + + + 0 + + 1 + m_staticTextEndX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlEndX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer51 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + End Y (mm) + + 0 + + + 0 + + 1 + m_staticTextEndY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlEndY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bSizer61 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Origin + + 0 + + + 0 + + 1 + m_staticTextOrgEnd + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Upper Right" "Upper Left" "Lower Right" "Lower Left" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_comboBoxCornerEnd + 1 + + + protected + 1 + + Resizable + 2 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + Lower Right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerLineThickness + wxHORIZONTAL + none + + 5 + wxEXPAND + 0 + + + bSizerthickness + wxVERTICAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Thickness + + 0 + + + 0 + + 1 + m_staticTextThickness + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlThickness + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Set to 0 to use default + + 0 + + + 0 + + 1 + m_staticTextInfoThickness + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + m_SizerRotation + wxVERTICAL + protected + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline1 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerRotation + wxHORIZONTAL + none + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Rotation + + 0 + + + 0 + + 1 + m_staticTextRot + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlRotation + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline4 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Repeat parameters: + + 0 + + + 0 + + 1 + m_staticTextRepeatPrms + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizer20 + wxHORIZONTAL + none + + 5 + + 1 + + + bSizer611 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Repeat count + + 0 + + + 0 + + 1 + m_staticTextRepeatCnt + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlRepeatCount + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + m_SizerTextIncrementLabel + wxVERTICAL + protected + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text Increment + + 0 + + + 0 + + 1 + m_staticTextInclabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlTextIncrement + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerPosY1 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer411 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Step X (mm) + + 0 + + + 0 + + 1 + m_staticTextStepX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlStepX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer511 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Step Y (mm) + + 0 + + + 0 + + 1 + m_staticTextStepY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlStepY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + General Options + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_swGeneralOpts + 1 + + + protected + 1 + + Resizable + 5 + 5 + 1 + + + 0 + + + + wxHSCROLL|wxVSCROLL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizerGeneralOpts + wxVERTICAL + none + + 5 + + 0 + + + bSizerGeneralOpts1 + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Default Values: + + 0 + + + 0 + + 1 + m_staticTextDefVal + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerDefTextSize + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizerDefTsizeX + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text Size X (mm) + + 0 + + + 0 + + 1 + m_staticTextDefTsX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlDefaultTextSizeX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerDefTsizeY + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text Size Y (mm) + + 0 + + + 0 + + 1 + m_staticTextDefTsY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlDefaultTextSizeY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerDefLineWidth + wxHORIZONTAL + none + + 5 + + 1 + + + bSizer25 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Line Thickness (mm) + + 0 + + + 0 + + 1 + m_staticTextDefLineW + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlDefaultLineWidth + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 1 + + + bSizerDefTextThickness + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text Thickness + + 0 + + + 0 + + 1 + m_staticText22 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlDefaultTextThickness + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Set to Default + + 0 + + + 0 + + 1 + m_buttonDefault + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnSetDefaultValues + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline9 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 0 + + + bSizerGeneraMargins + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Page Margins + + 0 + + + 0 + + 1 + m_staticTextMargins + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerDefLRMargins + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizerDefLeftMargin + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Left Margin (mm) + + 0 + + + 0 + + 1 + m_staticTextLeftMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlLeftMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerDefTsizeY1 + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Right Margin (mm) + + 0 + + + 0 + + 1 + m_staticTextDefRightMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlRightMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerDefTBMargins + wxHORIZONTAL + none + + 5 + + 1 + + + bSizerTopMargin + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Top Margin (mm) + + 0 + + + 0 + + 1 + m_staticTextTopMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlTopMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + 1 + + + bSizerDefBottomMargin + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Bottom Margin (mm) + + 0 + + + 0 + + 1 + m_staticTextBottomMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlDefaultBottomMargin + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Accept + + 0 + + + 0 + + 1 + m_buttonGeneralOptsOK + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnAcceptPrms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pagelayout_editor/dialogs/properties_frame_base.h b/pagelayout_editor/dialogs/properties_frame_base.h new file mode 100644 index 0000000000..922ae56df1 --- /dev/null +++ b/pagelayout_editor/dialogs/properties_frame_base.h @@ -0,0 +1,141 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 8 2012) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __PROPERTIES_FRAME_BASE_H__ +#define __PROPERTIES_FRAME_BASE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +/// Class PANEL_PROPERTIES_BASE +/////////////////////////////////////////////////////////////////////////////// +class PANEL_PROPERTIES_BASE : public wxPanel +{ + private: + + protected: + wxNotebook* m_notebook; + wxScrolledWindow* m_swItemProperties; + wxStaticText* m_staticTextType; + wxTextCtrl* m_textCtrlType; + wxStaticText* m_staticTextPageOpt; + wxChoice* m_choicePageOpt; + wxStaticLine* m_staticline5; + wxBoxSizer* m_SizerTextOptions; + wxStaticText* m_staticTextText; + wxTextCtrl* m_textCtrlText; + wxStaticText* m_staticTextHjust; + wxChoice* m_choiceHjustify; + wxCheckBox* m_checkBoxBold; + wxStaticText* m_staticTextVjust; + wxChoice* m_choiceVjustify; + wxCheckBox* m_checkBoxItalic; + wxStaticText* m_staticTexTsizeX; + wxTextCtrl* m_textCtrlTextSizeX; + wxStaticText* m_staticTextTsizeY; + wxTextCtrl* m_textCtrlTextSizeY; + wxStaticText* m_staticTextConstraints; + wxStaticText* m_staticTextConstraintX; + wxTextCtrl* m_textCtrlConstraintX; + wxStaticText* m_staticTextConstraintY; + wxTextCtrl* m_textCtrlConstraintY; + wxStaticLine* m_staticline6; + wxButton* m_buttonOK; + wxStaticLine* m_staticline8; + wxStaticText* m_staticTextComment; + wxTextCtrl* m_textCtrlComment; + wxStaticLine* m_staticline2; + wxStaticText* m_staticTextPosX; + wxTextCtrl* m_textCtrlPosX; + wxStaticText* m_staticTextPosY; + wxTextCtrl* m_textCtrlPosY; + wxStaticText* m_staticTextOrgPos; + wxComboBox* m_comboBoxCornerPos; + wxBoxSizer* m_SizerEndPosition; + wxStaticText* m_staticTextEndX; + wxTextCtrl* m_textCtrlEndX; + wxStaticText* m_staticTextEndY; + wxTextCtrl* m_textCtrlEndY; + wxStaticText* m_staticTextOrgEnd; + wxComboBox* m_comboBoxCornerEnd; + wxStaticText* m_staticTextThickness; + wxTextCtrl* m_textCtrlThickness; + wxStaticText* m_staticTextInfoThickness; + wxBoxSizer* m_SizerRotation; + wxStaticLine* m_staticline1; + wxStaticText* m_staticTextRot; + wxTextCtrl* m_textCtrlRotation; + wxStaticLine* m_staticline4; + wxStaticText* m_staticTextRepeatPrms; + wxStaticText* m_staticTextRepeatCnt; + wxTextCtrl* m_textCtrlRepeatCount; + wxBoxSizer* m_SizerTextIncrementLabel; + wxStaticText* m_staticTextInclabel; + wxTextCtrl* m_textCtrlTextIncrement; + wxStaticText* m_staticTextStepX; + wxTextCtrl* m_textCtrlStepX; + wxStaticText* m_staticTextStepY; + wxTextCtrl* m_textCtrlStepY; + wxScrolledWindow* m_swGeneralOpts; + wxStaticText* m_staticTextDefVal; + wxStaticText* m_staticTextDefTsX; + wxTextCtrl* m_textCtrlDefaultTextSizeX; + wxStaticText* m_staticTextDefTsY; + wxTextCtrl* m_textCtrlDefaultTextSizeY; + wxStaticText* m_staticTextDefLineW; + wxTextCtrl* m_textCtrlDefaultLineWidth; + wxStaticText* m_staticText22; + wxTextCtrl* m_textCtrlDefaultTextThickness; + wxButton* m_buttonDefault; + wxStaticLine* m_staticline9; + wxStaticText* m_staticTextMargins; + wxStaticText* m_staticTextLeftMargin; + wxTextCtrl* m_textCtrlLeftMargin; + wxStaticText* m_staticTextDefRightMargin; + wxTextCtrl* m_textCtrlRightMargin; + wxStaticText* m_staticTextTopMargin; + wxTextCtrl* m_textCtrlTopMargin; + wxStaticText* m_staticTextBottomMargin; + wxTextCtrl* m_textCtrlDefaultBottomMargin; + wxButton* m_buttonGeneralOptsOK; + + // Virtual event handlers, overide them in your derived class + virtual void OnAcceptPrms( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSetDefaultValues( wxCommandEvent& event ) { event.Skip(); } + + + public: + + PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 315,782 ), long style = wxTAB_TRAVERSAL ); + ~PANEL_PROPERTIES_BASE(); + +}; + +#endif //__PROPERTIES_FRAME_BASE_H__ diff --git a/pagelayout_editor/events_functions.cpp b/pagelayout_editor/events_functions.cpp new file mode 100644 index 0000000000..bf65fd48f9 --- /dev/null +++ b/pagelayout_editor/events_functions.cpp @@ -0,0 +1,478 @@ +/** + * @file pagelayout_editor/events_called_functions.cpp + * @brief page layout editor command event functions. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +BEGIN_EVENT_TABLE( PL_EDITOR_FRAME, EDA_DRAW_FRAME ) + EVT_CLOSE( PL_EDITOR_FRAME::OnCloseWindow ) + + // Desing tree event: + EVT_TREE_SEL_CHANGED( ID_DESIGN_TREE_FRAME, PL_EDITOR_FRAME::OnTreeSelection ) + EVT_TREE_ITEM_MIDDLE_CLICK( ID_DESIGN_TREE_FRAME, PL_EDITOR_FRAME::OnTreeMiddleClick ) + EVT_TREE_ITEM_RIGHT_CLICK( ID_DESIGN_TREE_FRAME, PL_EDITOR_FRAME::OnTreeRightClick ) + + // Menu Files: + EVT_MENU( wxID_NEW, PL_EDITOR_FRAME::Files_io ) + EVT_MENU( wxID_OPEN, PL_EDITOR_FRAME::Files_io ) + EVT_MENU( wxID_SAVE, PL_EDITOR_FRAME::Files_io ) + EVT_MENU( wxID_SAVEAS, PL_EDITOR_FRAME::Files_io ) + EVT_MENU( wxID_FILE, PL_EDITOR_FRAME::Files_io ) + EVT_MENU( ID_LOAD_DEFAULT_PAGE_LAYOUT, PL_EDITOR_FRAME::Files_io ) + EVT_MENU( ID_OPEN_POLYGON_DESCR_FILE, PL_EDITOR_FRAME::Files_io ) + + EVT_MENU( ID_GEN_PLOT, PL_EDITOR_FRAME::ToPlotter ) + + EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, PL_EDITOR_FRAME::OnFileHistory ) + + EVT_MENU( wxID_EXIT, PL_EDITOR_FRAME::OnQuit ) + + // menu Preferences + EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END, + PL_EDITOR_FRAME::Process_Config ) + EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, EDA_DRAW_FRAME::SetLanguage ) + EVT_MENU( ID_MENU_PL_EDITOR_SELECT_PREFERED_EDITOR, + EDA_BASE_FRAME::OnSelectPreferredEditor ) + EVT_MENU( wxID_PREFERENCES, PL_EDITOR_FRAME::Process_Config ) + EVT_MENU( ID_MENU_SWITCH_BGCOLOR, PL_EDITOR_FRAME::Process_Config ) + EVT_MENU( ID_MENU_GRID_ONOFF, PL_EDITOR_FRAME::Process_Config ) + + // Menu Help + EVT_MENU( wxID_HELP, EDA_DRAW_FRAME::GetKicadHelp ) + EVT_MENU( wxID_ABOUT, EDA_DRAW_FRAME::GetKicadAbout ) + + EVT_TOOL( wxID_CUT, PL_EDITOR_FRAME::Process_Special_Functions ) + EVT_TOOL( wxID_UNDO, PL_EDITOR_FRAME::GetLayoutFromUndoList ) + EVT_TOOL( wxID_REDO, PL_EDITOR_FRAME::GetLayoutFromRedoList ) + EVT_TOOL( wxID_PRINT, PL_EDITOR_FRAME::ToPrinter ) + EVT_TOOL( wxID_PREVIEW, PL_EDITOR_FRAME::ToPrinter ) + EVT_TOOL( ID_SHEET_SET, PL_EDITOR_FRAME::Process_Special_Functions ) + EVT_TOOL( ID_SHOW_REAL_MODE, PL_EDITOR_FRAME::OnSelectTitleBlockDisplayMode ) + EVT_TOOL( ID_SHOW_LPEDITOR_MODE, PL_EDITOR_FRAME::OnSelectTitleBlockDisplayMode ) + EVT_CHOICE( ID_SELECT_COORDINATE_ORIGIN, PL_EDITOR_FRAME::OnSelectCoordOriginCorner) + EVT_CHOICE( ID_SELECT_PAGE_NUMBER, PL_EDITOR_FRAME::Process_Special_Functions) + + // Vertical toolbar: + EVT_TOOL( ID_NO_TOOL_SELECTED, PL_EDITOR_FRAME::Process_Special_Functions ) + + EVT_MENU_RANGE( ID_POPUP_START_RANGE, ID_POPUP_END_RANGE, + PL_EDITOR_FRAME::Process_Special_Functions ) + + EVT_UPDATE_UI( ID_SHOW_REAL_MODE, PL_EDITOR_FRAME::OnUpdateTitleBlockDisplayNormalMode ) + EVT_UPDATE_UI( ID_SHOW_LPEDITOR_MODE, PL_EDITOR_FRAME::OnUpdateTitleBlockDisplaySpecialMode ) + +END_EVENT_TABLE() + + +/* Handles the selection of tools, menu, and popup menu commands. + */ +void PL_EDITOR_FRAME::Process_Special_Functions( wxCommandEvent& event ) +{ + int id = event.GetId(); + int idx; + wxString msg; + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + WORKSHEET_DATAITEM* item = NULL; + wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); + cmd.SetEventObject( this ); + + switch( id ) + { + case ID_NO_TOOL_SELECTED: + SetToolID( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor(), wxEmptyString ); + + case ID_SELECT_PAGE_NUMBER: + m_canvas->Refresh(); + break; + + case ID_SHEET_SET: + { + DIALOG_PAGES_SETTINGS dlg( this ); + dlg.SetWksFileName( GetCurrFileName() ); + dlg.EnableWksFileNamePicker( false ); + dlg.ShowModal(); + + cmd.SetId( ID_ZOOM_PAGE ); + wxPostEvent( this, cmd ); + } + break; + + case ID_POPUP_CANCEL_CURRENT_COMMAND: + break; + + case ID_POPUP_DESIGN_TREE_ITEM_DELETE: + case ID_POPUP_ITEM_DELETE: + case wxID_CUT: + // Delete item, and select the previous item + item = m_treePagelayout->GetPageLayoutSelectedItem(); + + if( item == NULL ) + break; + + SaveCopyInUndoList(); + idx = pglayout.GetItemIndex( item ); + pglayout.Remove( item ); + RebuildDesignTree(); + + if( id == ID_POPUP_DESIGN_TREE_ITEM_DELETE ) + { + item = pglayout.GetItem( (unsigned) (idx-1) ); + + if( item ) + m_treePagelayout->SelectCell( item ); + } + + item = NULL; + OnModify(); + m_canvas->Refresh(); + break; + + case ID_POPUP_ITEM_ADD_LINE: + SaveCopyInUndoList(); + idx = m_treePagelayout->GetSelectedItemIndex(); + item = AddPageLayoutItem( WORKSHEET_DATAITEM::WS_SEGMENT, idx ); + if( InvokeDialogNewItem( this, item ) == wxID_CANCEL ) + { + RemoveLastCommandInUndoList(); + pglayout.Remove( item ); + RebuildDesignTree(); + item = NULL; + } + m_canvas->Refresh(); + break; + + case ID_POPUP_ITEM_ADD_RECT: + SaveCopyInUndoList(); + idx = m_treePagelayout->GetSelectedItemIndex(); + item = AddPageLayoutItem( WORKSHEET_DATAITEM::WS_RECT, idx ); + if( InvokeDialogNewItem( this, item ) == wxID_CANCEL ) + { + RemoveLastCommandInUndoList(); + pglayout.Remove( item ); + RebuildDesignTree(); + item = NULL; + } + m_canvas->Refresh(); + break; + + case ID_POPUP_ITEM_ADD_TEXT: + SaveCopyInUndoList(); + idx = m_treePagelayout->GetSelectedItemIndex(); + item = AddPageLayoutItem( WORKSHEET_DATAITEM::WS_TEXT, idx ); + if( InvokeDialogNewItem( this, item ) == wxID_CANCEL ) + { + RemoveLastCommandInUndoList(); + pglayout.Remove( item ); + RebuildDesignTree(); + item = NULL; + } + m_canvas->Refresh(); + break; + + case ID_POPUP_ITEM_ADD_POLY: + cmd.SetId( ID_OPEN_POLYGON_DESCR_FILE ); + wxPostEvent( this, cmd ); + break; + + case ID_POPUP_ITEM_PLACE: + item = GetScreen()->GetCurItem(); + PlaceItem( item ); + break; + + case ID_POPUP_ITEM_PLACE_CANCEL: + if( m_canvas->IsMouseCaptured() ) + m_canvas->EndMouseCapture(); + break; + + case ID_POPUP_ITEM_MOVE_START_POINT: + item = m_treePagelayout->GetPageLayoutSelectedItem(); + // Ensure flags are properly set + item->ClearFlags( LOCATE_ENDPOINT ); + item->SetFlags( LOCATE_STARTPOINT ); + MoveItem( item ); + break; + + case ID_POPUP_ITEM_MOVE_END_POINT: + item = m_treePagelayout->GetPageLayoutSelectedItem(); + // Ensure flags are properly set + item->ClearFlags( LOCATE_STARTPOINT ); + item->SetFlags( LOCATE_ENDPOINT ); + MoveItem( item ); + break; + + case ID_POPUP_ITEM_MOVE: + item = m_treePagelayout->GetPageLayoutSelectedItem(); + item->ClearFlags( LOCATE_ENDPOINT|LOCATE_STARTPOINT ); + MoveItem( item ); + break; + + default: + wxMessageBox( wxT( "PL_EDITOR_FRAME::Process_Special_Functions error" ) ); + break; + } + + if( item ) + { + OnModify(); + m_propertiesPagelayout->CopyPrmsFromItemToPanel( item ); + m_treePagelayout->SelectCell( item ); + } + +} + + +DPOINT initialPosition; // The initial position of the item to move, in mm +wxPoint initialPositionUi; // The initial position of the item to move, in Ui +wxPoint initialCursorPosition; // The initial position of the cursor + +static void moveItem( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase ) +{ + PL_EDITOR_SCREEN* screen = (PL_EDITOR_SCREEN*) aPanel->GetScreen(); + WORKSHEET_DATAITEM *item = screen->GetCurItem(); + + wxCHECK_RET( (item != NULL), wxT( "Cannot move NULL item." ) ); + wxPoint position = screen->GetCrossHairPosition() + - ( initialCursorPosition - initialPositionUi ); + + if( (item->GetFlags() & LOCATE_STARTPOINT) ) + item->MoveStartPointToUi( position ); + else if( (item->GetFlags() & LOCATE_ENDPOINT) ) + item->MoveEndPointToUi( position ); + else + item->MoveToUi( position ); + + // Draw the item item at it's new position. + if( aPanel ) + aPanel->Refresh(); +} + +static void abortMoveItem( EDA_DRAW_PANEL* aPanel, wxDC* aDC ) +{ + PL_EDITOR_SCREEN* screen = (PL_EDITOR_SCREEN*) aPanel->GetScreen(); + WORKSHEET_DATAITEM *item = screen->GetCurItem(); + if( (item->GetFlags() & LOCATE_STARTPOINT) ) + { + item->MoveStartPointTo( initialPosition ); + } + else if( (item->GetFlags() & LOCATE_ENDPOINT) ) + { + item->MoveEndPointTo( initialPosition ); + } + else + item->MoveTo( initialPosition ); + + aPanel->SetMouseCapture( NULL, NULL ); + screen->SetCurItem( NULL ); + aPanel->Refresh(); +} + +void PL_EDITOR_FRAME::MoveItem( WORKSHEET_DATAITEM* aItem ) +{ + wxCHECK_RET( aItem != NULL, wxT( "Cannot move NULL item" ) ); + initialPosition = aItem->GetStartPos(); + initialPositionUi = aItem->GetStartPosUi(); + initialCursorPosition = GetScreen()->GetCrossHairPosition(); + + if( (aItem->GetFlags() & LOCATE_ENDPOINT) ) + { + initialPosition = aItem->GetEndPos(); + initialPositionUi = aItem->GetEndPosUi(); + } + + if( aItem->GetFlags() & (LOCATE_STARTPOINT|LOCATE_ENDPOINT) ) + { + GetScreen()->SetCrossHairPosition( initialPositionUi, false ); + initialCursorPosition = GetScreen()->GetCrossHairPosition(); + if( m_canvas->IsPointOnDisplay( initialCursorPosition ) ) + { + m_canvas->MoveCursorToCrossHair(); + m_canvas->Refresh(); + } + else + { + RedrawScreen( initialCursorPosition, true ); + } + } + + m_canvas->SetMouseCapture( moveItem, abortMoveItem ); + GetScreen()->SetCurItem( aItem ); +} + +/** +* Save in Undo list the layout, and place an item being moved. +* @param aItem is the item moved +*/ +void PL_EDITOR_FRAME::PlaceItem( WORKSHEET_DATAITEM* aItem ) +{ + DPOINT currStartPos = aItem->GetStartPos(); + DPOINT currEndPos = aItem->GetEndPos(); + + // Save the curren layout before changes + if( (aItem->GetFlags() & LOCATE_STARTPOINT) ) + { + aItem->MoveStartPointTo( initialPosition ); + } + else if( (aItem->GetFlags() & LOCATE_ENDPOINT) ) + { + aItem->MoveEndPointTo( initialPosition ); + } + else + aItem->MoveTo( initialPosition ); + + SaveCopyInUndoList(); + + // Re-place the item + aItem->MoveStartPointTo( currStartPos ); + aItem->MoveEndPointTo( currEndPos ); + + m_canvas->SetMouseCapture( NULL, NULL ); + GetScreen()->SetCurItem( NULL ); +} + + +/* called when the user select one of the 4 page corner as corner + * reference (or the left top paper corner) + */ +void PL_EDITOR_FRAME::OnSelectCoordOriginCorner( wxCommandEvent& event ) +{ + m_originSelectChoice = m_originSelectBox->GetSelection(); + UpdateStatusBar(); // Update grid origin + m_canvas->Refresh(); +} + +void PL_EDITOR_FRAME::OnSelectTitleBlockDisplayMode( wxCommandEvent& event ) +{ + WORKSHEET_DATAITEM::m_SpecialMode = (event.GetId() == ID_SHOW_LPEDITOR_MODE); + m_canvas->Refresh(); +} + +void PL_EDITOR_FRAME::OnQuit( wxCommandEvent& event ) +{ + Close( true ); +} + +/** + * Function SetLanguage + * called on a language menu selection + * Update Layer manager title and tabs texts + */ +void PL_EDITOR_FRAME::SetLanguage( wxCommandEvent& event ) +{ + EDA_DRAW_FRAME::SetLanguage( event ); +} + +void PL_EDITOR_FRAME::ToPlotter(wxCommandEvent& event) +{ + wxMessageBox( wxT("Not yet available")); +} + + +void PL_EDITOR_FRAME::ToPrinter(wxCommandEvent& event) +{ + // static print data and page setup data, to remember settings during the session + static wxPrintData* s_PrintData; + static wxPageSetupDialogData* s_pageSetupData = (wxPageSetupDialogData*) NULL; + + const PAGE_INFO& pageInfo = GetPageSettings(); + + if( s_PrintData == NULL ) // First print + { + s_PrintData = new wxPrintData(); + s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH; + } + + if( !s_PrintData->Ok() ) + { + wxMessageBox( _( "Error Init Printer info" ) ); + return; + } + + if( s_pageSetupData == NULL ) + s_pageSetupData = new wxPageSetupDialogData( *s_PrintData ); + + s_pageSetupData->SetPaperId( pageInfo.GetPaperId() ); + s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() ); + + if( pageInfo.IsCustom() ) + { + if( pageInfo.IsPortrait() ) + s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetWidthMils() ), + Mils2mm( pageInfo.GetHeightMils() ) ) ); + else + s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetHeightMils() ), + Mils2mm( pageInfo.GetWidthMils() ) ) ); + } + + *s_PrintData = s_pageSetupData->GetPrintData(); + + if( event.GetId() == wxID_PREVIEW ) + InvokeDialogPrintPreview( this, s_PrintData ); + else + InvokeDialogPrint( this, s_PrintData, s_pageSetupData ); +} + +void PL_EDITOR_FRAME::OnTreeSelection( wxTreeEvent& event ) +{ + WORKSHEET_DATAITEM* item = GetSelectedItem(); + + if( item ) + m_propertiesPagelayout->CopyPrmsFromItemToPanel( item ); + + m_canvas->Refresh(); +} + +void PL_EDITOR_FRAME::OnTreeMiddleClick( wxTreeEvent& event ) +{ +} + +void PL_EDITOR_FRAME::OnTreeRightClick( wxTreeEvent& event ) +{ + m_treePagelayout->SelectCell( event.GetItem() ); + + wxMenu popMenu; + + AddMenuItem( &popMenu, ID_POPUP_ITEM_ADD_LINE, _( "Add line" ), + KiBitmap( add_dashed_line_xpm ) ); + AddMenuItem( &popMenu, ID_POPUP_ITEM_ADD_RECT, _( "Add rect" ), + KiBitmap( add_rectangle_xpm ) ); + AddMenuItem( &popMenu, ID_POPUP_ITEM_ADD_TEXT, _( "Add text" ), + KiBitmap( add_text_xpm ) ); + AddMenuItem( &popMenu, ID_POPUP_ITEM_ADD_POLY, _( "Import poly descr file" ), + KiBitmap( add_polygon_xpm ) ); + + popMenu.AppendSeparator(); + AddMenuItem( &popMenu, ID_POPUP_DESIGN_TREE_ITEM_DELETE, _( "Delete" ), + KiBitmap( delete_xpm ) ); + + PopupMenu( &popMenu ); +} + + +void PL_EDITOR_FRAME::OnUpdateTitleBlockDisplayNormalMode( wxUpdateUIEvent& event ) +{ + event.Check( WORKSHEET_DATAITEM::m_SpecialMode == false ); +} + +void PL_EDITOR_FRAME::OnUpdateTitleBlockDisplaySpecialMode( wxUpdateUIEvent& event ) +{ + event.Check( WORKSHEET_DATAITEM::m_SpecialMode == true ); +} diff --git a/pagelayout_editor/files.cpp b/pagelayout_editor/files.cpp new file mode 100644 index 0000000000..0f7ca6c27b --- /dev/null +++ b/pagelayout_editor/files.cpp @@ -0,0 +1,257 @@ +/** + * @file gerbview/files.cpp + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2012 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 2004-2012 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +void PL_EDITOR_FRAME::OnFileHistory( wxCommandEvent& event ) +{ + wxString filename; + + filename = GetFileFromHistory( event.GetId(), _( "Page Layout Description File" ) ); + + if( filename != wxEmptyString ) + { + if( GetScreen()->IsModify() && !IsOK( this, + _( "The current page layout has been modified.\n" + "Do you wish to discard the changes?" ) ) ) + return; + + m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() ); + ::wxSetWorkingDirectory( ::wxPathOnly( filename ) ); + if( LoadPageLayoutDescrFile( filename ) ) + { + wxString msg; + msg.Printf( _("File <%s> loaded"), GetChars( filename ) ); + SetStatusText( msg ); + } + + OnNewPageLayout(); + } +} + +/* File commands. */ +void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event ) +{ + wxString msg; + int id = event.GetId(); + wxString filename = GetCurrFileName(); + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + + if( filename.IsEmpty() && id == wxID_SAVE ) + id = wxID_SAVEAS; + + switch( id ) + { + case ID_LOAD_DEFAULT_PAGE_LAYOUT: + case wxID_NEW: + case wxID_OPEN: + if( GetScreen()->IsModify() && !IsOK( this, + _( "The current page layout has been modified.\n" + "Do you wish to discard the changes?" ) ) ) + return; + break; + + default: + break; + } + + + switch( id ) + { + case ID_LOAD_DEFAULT_PAGE_LAYOUT: + pglayout.SetPageLayout(); + // Force DefaultDescrFlag to false in page layout editor, + // has meaning only for GOST version + pglayout.SetDefaultDescrFlag( false ); + OnNewPageLayout(); + break; + + case wxID_NEW: + pglayout.AllowVoidList( true ); + SetCurrFileName( wxEmptyString ); + pglayout.ClearList(); + // Force DefaultDescrFlag to false in page layout editor, + // has meaning only for GOST version + pglayout.SetDefaultDescrFlag( false ); + OnNewPageLayout(); + break; + + case ID_OPEN_POLYGON_DESCR_FILE: + { + wxFileDialog openFileDialog(this, _("Open polygon descr file"), + wxEmptyString, + wxEmptyString, PageLayoutDescrFileWildcard, wxFD_OPEN); + + if (openFileDialog.ShowModal() == wxID_CANCEL) + return; + + filename = openFileDialog.GetPath(); + if( ! InsertPageLayoutDescrFile( filename ) ) + { + wxString msg; + msg.Printf( _("Unable to load %s file"), GetChars( filename ) ); + wxMessageBox( msg ); + } + else + { + GetScreen()->SetModify(); + RebuildDesignTree(); + m_canvas->Refresh(); + msg.Printf( _("File <%s> inserted"), GetChars( filename ) ); + SetStatusText( msg ); + } + } + break; + + case wxID_OPEN: + { + wxFileDialog openFileDialog(this, _("Open file"), wxEmptyString, + wxEmptyString, PageLayoutDescrFileWildcard, wxFD_OPEN); + + if (openFileDialog.ShowModal() == wxID_CANCEL) + return; + + filename = openFileDialog.GetPath(); + if( ! LoadPageLayoutDescrFile( filename ) ) + { + wxString msg; + msg.Printf( _("Unable to load %s file"), GetChars( filename ) ); + wxMessageBox( msg ); + } + else + { + OnNewPageLayout(); + msg.Printf( _("File <%s> loaded"), GetChars( filename ) ); + SetStatusText( msg ); + } + } + break; + + case wxID_SAVE: + if( !SavePageLayoutDescrFile( filename ) ) + { + msg.Printf( _("Unable to write <%s>"), GetChars( filename ) ); + wxMessageBox( msg ); + } + else + { + msg.Printf( _("File <%s> written"), GetChars( filename ) ); + SetStatusText( msg ); + } + break; + + case wxID_SAVEAS: + { + wxFileDialog openFileDialog(this, _("Create file"), wxEmptyString, + wxEmptyString, PageLayoutDescrFileWildcard, wxFD_SAVE); + + if (openFileDialog.ShowModal() == wxID_CANCEL) + return; + + filename = openFileDialog.GetPath(); + if( !SavePageLayoutDescrFile( filename ) ) + { + wxString msg; + msg.Printf( _("Unable to create <%s>"), GetChars( filename ) ); + wxMessageBox( msg ); + } + + else + { + msg.Printf( _("File <%s> written"), GetChars( filename ) ); + SetStatusText( msg ); + if( GetCurrFileName().IsEmpty() ) + SetCurrFileName( filename ); + } + } + break; + + default: + wxMessageBox( wxT( "File_io: unexpected command id" ) ); + break; + } +} + +/* Loads a .kicad_wks page layout descr file + */ +bool PL_EDITOR_FRAME::LoadPageLayoutDescrFile( const wxString& aFullFileName ) +{ + if( wxFileExists( aFullFileName ) ) + { + WORKSHEET_LAYOUT::GetTheInstance().SetPageLayout( aFullFileName ); + SetCurrFileName( aFullFileName ); + UpdateFileHistory( aFullFileName ); + GetScreen()->ClrModify(); + return true; + } + + return false; +} + +/* Inserts a .kicad_wks page layout descr file + * same as LoadPageLayoutDescrFile, but the new data is added + * to the previous data. + */ +bool PL_EDITOR_FRAME::InsertPageLayoutDescrFile( const wxString& aFullFileName ) +{ + if( wxFileExists( aFullFileName ) ) + { + const bool append = true; + SaveCopyInUndoList(); + WORKSHEET_LAYOUT::GetTheInstance().SetPageLayout( aFullFileName, append ); + return true; + } + + return false; +} + + +/* Save the current layout in a .kicad_wks page layout descr file + */ +bool PL_EDITOR_FRAME::SavePageLayoutDescrFile( const wxString& aFullFileName ) +{ + if( ! aFullFileName.IsEmpty() ) + { + WORKSHEET_LAYOUT::GetTheInstance().Save( aFullFileName ); + GetScreen()->ClrModify(); + return true; + } + + return false; +} diff --git a/pagelayout_editor/hotkeys.cpp b/pagelayout_editor/hotkeys.cpp new file mode 100644 index 0000000000..a0ba6da265 --- /dev/null +++ b/pagelayout_editor/hotkeys.cpp @@ -0,0 +1,211 @@ +/** + * @file gerbview/hotkeys.cpp + */ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +/* How to add a new hotkey: + * add a new id in the enum hotkey_id_commnand like MY_NEW_ID_FUNCTION. + * add a new EDA_HOTKEY entry like: + * static EDA_HOTKEY HkMyNewEntry(wxT("Command Label"), MY_NEW_ID_FUNCTION, default key value); + * 'Command Label' is the name used in hotkey list display, and the identifier in the + * hotkey list file + * 'MY_NEW_ID_FUNCTION' is the id event function used in the switch in OnHotKey() function. + * 'Default key value' is the default hotkey for this command. + * Can be overrided by the user hotkey list + * Add the 'HkMyNewEntry' pointer in the s_PlEditor_Hotkey_List list + * Add the new code in the switch in OnHotKey() function. + * + * Note: If an hotkey is a special key, be sure the corresponding wxWidget keycode (WXK_XXXX) + * is handled in the hotkey_name_descr s_Hotkey_Name_List list (see hotkeys_basic.cpp) + * and see this list for some ascii keys (space ...) + */ + +/* local variables */ +/* Hotkey list: */ +static EDA_HOTKEY HkResetLocalCoord( wxT( "Reset Local Coordinates" ), + HK_RESET_LOCAL_COORD, ' ' ); +static EDA_HOTKEY HkZoomAuto( wxT( "Zoom Auto" ), HK_ZOOM_AUTO, WXK_HOME, ID_ZOOM_PAGE ); +static EDA_HOTKEY HkZoomCenter( wxT( "Zoom Center" ), HK_ZOOM_CENTER, WXK_F4, + ID_POPUP_ZOOM_CENTER ); +static EDA_HOTKEY HkZoomRedraw( wxT( "Zoom Redraw" ), HK_ZOOM_REDRAW, WXK_F3, ID_ZOOM_REDRAW ); +static EDA_HOTKEY HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2, ID_POPUP_ZOOM_OUT ); +static EDA_HOTKEY HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1, ID_POPUP_ZOOM_IN ); +static EDA_HOTKEY HkHelp( wxT( "Help (this window)" ), HK_HELP, '?' ); +static EDA_HOTKEY HkMoveItem( wxT( "Move Item" ), HK_MOVE_ITEM, 'M', ID_POPUP_ITEM_MOVE ); +static EDA_HOTKEY HkMoveStartPoint( wxT( "Move Start Point" ), HK_MOVE_START_POINT, 'S', + ID_POPUP_ITEM_MOVE_START_POINT ); +static EDA_HOTKEY HkMoveEndPoint( wxT( "Move End Point" ), HK_MOVE_END_POINT, 'E', + ID_POPUP_ITEM_MOVE_END_POINT ); +static EDA_HOTKEY HkDeleteItem( wxT( "Move Item" ), HK_DELETE_ITEM, WXK_DELETE, + ID_POPUP_ITEM_DELETE ); + +// Undo Redo +static EDA_HOTKEY HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z', (int) wxID_UNDO ); +static EDA_HOTKEY HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y', (int) wxID_REDO ); + +// List of common hotkey descriptors +EDA_HOTKEY* s_Common_Hotkey_List[] = +{ + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkZoomAuto, &HkResetLocalCoord, + &HkUndo, &HkRedo, + NULL +}; + +EDA_HOTKEY* s_PlEditor_Hotkey_List[] = +{ + &HkMoveItem, &HkMoveStartPoint, + &HkMoveEndPoint, &HkDeleteItem, + NULL +}; + +// list of sections and corresponding hotkey list for Pl_Editor +// (used to create an hotkey config file) +wxString s_PlEditorSectionTag( wxT( "[pl_editor]" ) ); + +struct EDA_HOTKEY_CONFIG s_PlEditor_Hokeys_Descr[] = +{ + { &g_CommonSectionTag, s_Common_Hotkey_List, L"Common keys" }, + { &s_PlEditorSectionTag, s_PlEditor_Hotkey_List, L"pl_editor keys" }, + { NULL, NULL, NULL } +}; + + +/* OnHotKey. + * ** Commands are case insensitive ** + * Some commands are relative to the item under the mouse cursor + * aDC = current device context + * aHotkeyCode = hotkey code (ascii or wxWidget code for special keys) + * aPosition The cursor position in logical (drawing) units. + * aItem = NULL or pointer on a EDA_ITEM under the mouse cursor + */ +void PL_EDITOR_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, + const wxPoint& aPosition, EDA_ITEM* aItem ) +{ + bool busy = GetScreen()->GetCurItem() != NULL; + wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); + cmd.SetEventObject( this ); + + /* Convert lower to upper case (the usual toupper function has problem with non ascii + * codes like function keys */ + if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') ) + aHotkeyCode += 'A' - 'a'; + + EDA_HOTKEY * HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_PlEditor_Hotkey_List ); + + if( HK_Descr == NULL ) + HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_Common_Hotkey_List ); + + if( HK_Descr == NULL ) + return; + + WORKSHEET_DATAITEM* item; + + switch( HK_Descr->m_Idcommand ) + { + case HK_NOT_FOUND: + return; + + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList( this, s_PlEditor_Hokeys_Descr ); + break; + + case HK_UNDO: + case HK_REDO: + if( busy ) + break; + cmd.SetId( HK_Descr->m_IdMenuEvent ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case HK_ZOOM_IN: + cmd.SetId( ID_POPUP_ZOOM_IN ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case HK_ZOOM_OUT: + cmd.SetId( ID_POPUP_ZOOM_OUT ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case HK_ZOOM_REDRAW: + cmd.SetId( ID_ZOOM_REDRAW ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case HK_ZOOM_CENTER: + cmd.SetId( ID_POPUP_ZOOM_CENTER ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case HK_ZOOM_AUTO: + cmd.SetId( ID_ZOOM_PAGE ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + case HK_RESET_LOCAL_COORD: // Reset the relative coord + GetScreen()->m_O_Curseur = GetScreen()->GetCrossHairPosition(); + break; + + case HK_MOVE_ITEM: + case HK_MOVE_START_POINT: + case HK_MOVE_END_POINT: + case HK_DELETE_ITEM: + if( busy ) + break; + + if( (item = Locate( aPosition )) == NULL ) + break; + + // Only rect and lines have a end point. + if( HK_Descr->m_Idcommand == HK_MOVE_END_POINT && !item->HasEndPoint() ) + break; + + if( m_treePagelayout->GetPageLayoutSelectedItem() != item ) + m_treePagelayout->SelectCell( item ); + + cmd.SetId( HK_Descr->m_IdMenuEvent ); + GetEventHandler()->ProcessEvent( cmd ); + break; + + default: + wxMessageBox( wxT("Unknown hotkey") ); + return; + } +} diff --git a/pagelayout_editor/hotkeys.h b/pagelayout_editor/hotkeys.h new file mode 100644 index 0000000000..1b86ccf2b0 --- /dev/null +++ b/pagelayout_editor/hotkeys.h @@ -0,0 +1,24 @@ +/** + * @file pagelayout_editor/hotkeys.h + */ + +#ifndef PL_EDITOR_KOTKEYS_H_ +#define PL_EDITOR_KOTKEYS_H_ + +#include + +// List of hot keys id. +// see also enum common_hotkey_id_commnand in hotkeys_basic.h +// for shared hotkeys id +enum hotkey_id_commnand { + HK_SWITCH_UNITS = HK_COMMON_END, + HK_MOVE_ITEM, + HK_MOVE_START_POINT, + HK_MOVE_END_POINT, + HK_DELETE_ITEM +}; + +// List of hotkey descriptors for PlEditor. +extern struct EDA_HOTKEY_CONFIG s_PlEditor_Hokeys_Descr[]; + +#endif // PL_EDITOR_KOTKEYS_H_ diff --git a/pagelayout_editor/invoke_pl_editor_dialog.h b/pagelayout_editor/invoke_pl_editor_dialog.h new file mode 100644 index 0000000000..a54f3633e3 --- /dev/null +++ b/pagelayout_editor/invoke_pl_editor_dialog.h @@ -0,0 +1,65 @@ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck + * Copyright (C) 2013 KiCad Developers, see change_log.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 + */ + +// This header is an insolation layer between top most frames and any number of +// DIALOG classes which can be called from a frame window. +// It is a place to put invocation functions for [modal] dialogs, with benefits: +// +// 1) The information about each dialog class is not exposed to the frame. +// So therefore the DIALOG class can often be kept out of a header file entirely. +// +// 2) The information about the calling frame is not necessarily exposed to +// to the called dialog class, at least not in here. + +// The actual InvokeDialog() function is usually coded at the bottom of the +// DIALOG_.cpp file. + + +#ifndef INVOKE_PL_EDITOR_DIALOG_H_ +#define INVOKE_PL_EDITOR_DIALOG_H_ + +// Often this is not used in the prototypes, since wxFrame is good enough and would +// represent maximum information hiding. +class PL_EDITOR_FRAME; +class WORKSHEET_DATAITEM; +class wxPrintData; +class wxPageSetupDialogData; + + +/// Create and show DIALOG_NEW_DATAITEM and return whatever +/// DIALOG_NEW_DATAITEM::ShowModal() returns. +int InvokeDialogNewItem( PL_EDITOR_FRAME* aCaller, WORKSHEET_DATAITEM* aItem ); + +/// Create and show a print dialog +/// returns 1 if OK, 0 , there is a problem. +int InvokeDialogPrint( PL_EDITOR_FRAME* aCaller, wxPrintData* aPrintData, + wxPageSetupDialogData* aPageSetupData ); + +/// Create and show a print preview dialog +/// returns 1 if OK, 0 , there is a problem. +int InvokeDialogPrintPreview( PL_EDITOR_FRAME* aCaller, wxPrintData* aPrintData ); + +#endif // INVOKE_PL_EDITOR_DIALOG_H_ diff --git a/pagelayout_editor/menubar.cpp b/pagelayout_editor/menubar.cpp new file mode 100644 index 0000000000..f32007129e --- /dev/null +++ b/pagelayout_editor/menubar.cpp @@ -0,0 +1,171 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file pl_editor/menubar.cpp + * @brief (Re)Create the main menubar for Pl_Editor + */ +#include + +#include + +#include +#include +#include +#include + + +void PL_EDITOR_FRAME::ReCreateMenuBar( void ) +{ + // Create and try to get the current menubar + wxMenuBar* menuBar = GetMenuBar(); + + if( !menuBar ) + menuBar = new wxMenuBar(); + + // Delete all existing menus so they can be rebuilt. + // This allows language changes of the menu text on the fly. + menuBar->Freeze(); + + while( menuBar->GetMenuCount() ) + delete menuBar->Remove( 0 ); + + // Recreate all menus: + + // Menu File: + wxMenu* fileMenu = new wxMenu; + + // Load + AddMenuItem( fileMenu, wxID_NEW, + _( "&New Page Layout Design" ), + wxEmptyString, KiBitmap( pagelayout_new_xpm ) ); + AddMenuItem( fileMenu, wxID_OPEN, + _( "Load &Page Layout File" ), + wxEmptyString, KiBitmap( pagelayout_load_xpm ) ); + AddMenuItem( fileMenu, ID_LOAD_DEFAULT_PAGE_LAYOUT, + _( "Load &Default Page Layout" ), + wxEmptyString, KiBitmap( pagelayout_load_default_xpm ) ); + + // Recent gerber files + static wxMenu* openRecentMenu; + + // Add this menu to list menu managed by m_fileHistory + // (the file history will be updated when adding/removing files in history + if( openRecentMenu ) + wxGetApp().GetFileHistory().RemoveMenu( openRecentMenu ); + + openRecentMenu = new wxMenu(); + wxGetApp().GetFileHistory().UseMenu( openRecentMenu ); + wxGetApp().GetFileHistory().AddFilesToMenu(); + AddMenuItem( fileMenu, openRecentMenu, + wxID_ANY, _( "Open &Recent Page Layout File" ), + wxEmptyString, KiBitmap( pagelayout_recent_xpm ) ); + + fileMenu->AppendSeparator(); + // Save current sheet + AddMenuItem( fileMenu, wxID_SAVE, + _( "&Save Page Layout Design" ), + wxEmptyString, KiBitmap( save_xpm ) ); + + // Save current sheet as + AddMenuItem( fileMenu, wxID_SAVEAS, + _( "Save Page Layout Design &As" ), + wxEmptyString, KiBitmap( save_as_xpm ) ); + + // Print + fileMenu->AppendSeparator(); + AddMenuItem( fileMenu, wxID_PRINT, _( "&Print" ), + wxEmptyString, KiBitmap( print_button_xpm ) ); + AddMenuItem( fileMenu, wxID_PREVIEW, _( "Print Pre&view" ), + wxEmptyString, KiBitmap( print_button_xpm ) ); + + // Separator + fileMenu->AppendSeparator(); + + // Exit + AddMenuItem( fileMenu, wxID_EXIT, + _( "E&xit" ), + _( "Quit Pl_Editor" ), + KiBitmap( exit_xpm ) ); + + // Menu for preferences + wxMenu* preferencesMenu = new wxMenu; + + AddMenuItem( preferencesMenu, + ID_MENU_SWITCH_BGCOLOR, + g_DrawBgColor == WHITE ? + _( "&BackGround Black" ) : _( "&BackGround White" ), + wxEmptyString, KiBitmap( palette_xpm ) ); + + AddMenuItem( preferencesMenu, + ID_MENU_GRID_ONOFF, + IsGridVisible() ? _( "Hide &Grid" ) : _( "Show &Grid" ), + wxEmptyString, KiBitmap( grid_xpm ) ); + + // Text editor selection + AddMenuItem( preferencesMenu, + ID_MENU_PL_EDITOR_SELECT_PREFERED_EDITOR, + _( "&Text Editor" ), + _( "Select your preferred text editor" ), + KiBitmap( editor_xpm ) ); + + // Language submenu + wxGetApp().AddMenuLanguageList( preferencesMenu ); + + // Hotkey submenu + AddHotkeyConfigMenu( preferencesMenu ); + + // Menu Help + wxMenu* helpMenu = new wxMenu; + + // Version info + AddHelpVersionInfoMenuEntry( helpMenu ); + + // Contents + AddMenuItem( helpMenu, + wxID_HELP, + _( "&Contents" ), + _( "Open the GerbView handbook" ), + KiBitmap( help_xpm ) ); + + // About GerbView + AddMenuItem( helpMenu, + wxID_ABOUT, + _( "&About Pl_Editor" ), + _( "About page layout description editor" ), + KiBitmap( online_help_xpm ) ); + + // Append menus to the menubar + menuBar->Append( fileMenu, _( "&File" ) ); + menuBar->Append( preferencesMenu, _( "&Preferences" ) ); + menuBar->Append( helpMenu, _( "&Help" ) ); + + menuBar->Thaw(); + + // Associate the menu bar with the frame, if no previous menubar + if( GetMenuBar() == NULL ) + SetMenuBar( menuBar ); + else + menuBar->Refresh(); +} diff --git a/pagelayout_editor/onleftclick.cpp b/pagelayout_editor/onleftclick.cpp new file mode 100644 index 0000000000..6f8ba57e94 --- /dev/null +++ b/pagelayout_editor/onleftclick.cpp @@ -0,0 +1,78 @@ +/** + * @file pagelayout_editor/onleftclick.cpp + * @brief functions called on left or double left click mouse event + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 CERN + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +/* Process the command triggered by the left button of the mouse when a tool + * is already selected. + */ +void PL_EDITOR_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) +{ + WORKSHEET_DATAITEM* item = GetScreen()->GetCurItem(); + + if( item ) // An item is currently in edit: place it + { + PlaceItem( item ); + m_propertiesPagelayout->CopyPrmsFromItemToPanel( item ); + m_canvas->Refresh(); + return; + } + + item = m_treePagelayout->GetPageLayoutSelectedItem(); + WORKSHEET_DATAITEM* newitem = Locate( aPosition ); + + if( newitem == NULL ) + return; + + if( newitem != item ) + { + item = newitem; + m_treePagelayout->SelectCell( item ); + m_canvas->Refresh(); + } +} + + +/* Called on a double click of left mouse button. + */ +void PL_EDITOR_FRAME::OnLeftDClick( wxDC* aDC, const wxPoint& aPosition ) +{ + // Currently: no nothing +} diff --git a/pagelayout_editor/onrightclick.cpp b/pagelayout_editor/onrightclick.cpp new file mode 100644 index 0000000000..6a343094df --- /dev/null +++ b/pagelayout_editor/onrightclick.cpp @@ -0,0 +1,118 @@ +/** + * @file pagelayout_editor/onrightclick.cpp + * @brief functions called on rigth click mouse event +*/ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 CERN + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +/* Prepare the right-click pullup menu. + * The menu already has a list of zoom commands. + */ +bool PL_EDITOR_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* aPopMenu ) +{ + bool busy = GetScreen()->GetCurItem() != NULL; + wxString msg; + + if( ! busy ) // No item currently edited + { + WORKSHEET_DATAITEM* old_item = m_treePagelayout->GetPageLayoutSelectedItem(); + WORKSHEET_DATAITEM* item = Locate( aPosition ); + + if( item && old_item != item ) + { + m_treePagelayout->SelectCell( item ); + m_canvas->Refresh(); + } + + // Add menus to edit and delete the item + if( item ) + { + if( (item->GetFlags() & LOCATE_STARTPOINT) ) + { + msg = AddHotkeyName( _( "Move Start Point" ), s_PlEditor_Hokeys_Descr, + HK_MOVE_START_POINT ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_MOVE_START_POINT, msg, + KiBitmap( move_xpm ) ); + } + + if( (item->GetFlags() & LOCATE_ENDPOINT ) ) + { + msg = AddHotkeyName( _( "Move End Point" ), s_PlEditor_Hokeys_Descr, + HK_MOVE_END_POINT ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_MOVE_END_POINT, msg, + KiBitmap( move_xpm ) ); + } + + msg = AddHotkeyName( _( "Move Item" ), s_PlEditor_Hokeys_Descr, + HK_MOVE_ITEM ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_MOVE, msg, + KiBitmap( move_xpm ) ); + aPopMenu->AppendSeparator(); + + msg = AddHotkeyName( _( "Delete" ), s_PlEditor_Hokeys_Descr, + HK_DELETE_ITEM ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_DELETE, msg, KiBitmap( delete_xpm ) ); + aPopMenu->AppendSeparator(); + } + } + else // An item is currently in edit + { + AddMenuItem( aPopMenu, ID_POPUP_ITEM_PLACE, _( "Place" ), + KiBitmap( move_xpm ) ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_PLACE_CANCEL, _( "Cancel" ), + KiBitmap( cancel_xpm ) ); + aPopMenu->AppendSeparator(); + } + + if( ! busy ) + { + AddMenuItem( aPopMenu, ID_POPUP_ITEM_ADD_LINE, _( "Add line" ), + KiBitmap( add_dashed_line_xpm ) ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_ADD_RECT, _( "Add rect" ), + KiBitmap( add_rectangle_xpm ) ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_ADD_TEXT, _( "Add text" ), + KiBitmap( add_text_xpm ) ); + AddMenuItem( aPopMenu, ID_POPUP_ITEM_ADD_POLY, _( "Import poly descr file" ), + KiBitmap( add_polygon_xpm ) ); + + aPopMenu->AppendSeparator(); + } + + return true; +} diff --git a/pagelayout_editor/page_layout_writer.cpp b/pagelayout_editor/page_layout_writer.cpp new file mode 100644 index 0000000000..4e888c3fe1 --- /dev/null +++ b/pagelayout_editor/page_layout_writer.cpp @@ -0,0 +1,431 @@ +/** + * @file page_layout_writer.cpp + * @brief write an S expression of description of graphic items and texts + * to build a title block and page layout + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 Jean-Pierre Charras . + * Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace TB_READER_T; + +#define double2Str Double2Str + +// A helper function to write tokens: +static const char* getTokenName( T aTok ) +{ + return PAGE_LAYOUT_READER_LEXER::TokenName( aTok ); +} + +// A basic helper class to write a page layout description +// Not used alone, a file writer or a string writer should be +// derived to use it +// Therefore the constructor is protected +class WORKSHEET_LAYOUT_IO +{ +protected: + OUTPUTFORMATTER* m_out; + + WORKSHEET_LAYOUT_IO() {} + virtual ~WORKSHEET_LAYOUT_IO() {} + +public: + void Format( WORKSHEET_LAYOUT* aPageLayout ) const + throw( IO_ERROR ); + + void Format( WORKSHEET_DATAITEM* aItem, int aNestLevel ) const + throw( IO_ERROR ); + +private: + void format( WORKSHEET_LAYOUT* aPageLayout ) const + throw( IO_ERROR ); + + void format( WORKSHEET_DATAITEM_TEXT* aItem, int aNestLevel ) const throw( IO_ERROR ); + void format( WORKSHEET_DATAITEM* aItem, int aNestLevel ) const throw( IO_ERROR ); + void format( WORKSHEET_DATAITEM_POLYPOLYGON* aItem, int aNestLevel ) + const throw( IO_ERROR ); + void formatCoordinate( const char * aToken, POINT_COORD & aCoord ) const + throw( IO_ERROR ); + void formatRepeatParameters( WORKSHEET_DATAITEM* aItem ) const throw( IO_ERROR ); + void formatOptions( WORKSHEET_DATAITEM* aItem ) const throw( IO_ERROR ); +}; + +// A helper class to write a page layout description to a file +class WORKSHEET_LAYOUT_FILEIO: public WORKSHEET_LAYOUT_IO +{ + FILE_OUTPUTFORMATTER * m_fileout; + +public: + WORKSHEET_LAYOUT_FILEIO( const wxString& aFilename ): + WORKSHEET_LAYOUT_IO() + { + try + { + m_fileout = new FILE_OUTPUTFORMATTER( aFilename ); + m_out = m_fileout; + } + catch( IO_ERROR ioe ) + { + wxMessageBox( ioe.errorText, _("Write Page Layout Error" ) ); + } + } + + ~WORKSHEET_LAYOUT_FILEIO() + { + delete m_fileout; + } +}; + +// A helper class to write a page layout description to a string +class WORKSHEET_LAYOUT_STRINGIO: public WORKSHEET_LAYOUT_IO +{ + STRING_FORMATTER * m_writer; + wxString & m_output; + +public: + WORKSHEET_LAYOUT_STRINGIO( wxString& aOutputString ): + WORKSHEET_LAYOUT_IO(), m_output( aOutputString ) + { + try + { + m_writer = new STRING_FORMATTER(); + m_out = m_writer; + } + catch( IO_ERROR ioe ) + { + wxMessageBox( ioe.errorText, _("Write Page Layout Error" ) ); + } + } + + ~WORKSHEET_LAYOUT_STRINGIO() + { + m_output = FROM_UTF8( m_writer->GetString().c_str() ); + delete m_writer; + } +}; + +/* + * Save the description in a file + */ +void WORKSHEET_LAYOUT::Save( const wxString& aFullFileName ) +{ + WORKSHEET_LAYOUT_FILEIO writer( aFullFileName ); + writer.Format( this ); +} + +/* Save the description in a buffer + */ +void WORKSHEET_LAYOUT::SaveInString( wxString& aOutputString ) +{ + WORKSHEET_LAYOUT_STRINGIO writer( aOutputString ); + writer.Format( this ); +} + + +void WORKSHEET_LAYOUT_IO::Format( WORKSHEET_DATAITEM* aItem, int aNestLevel ) const + throw( IO_ERROR ) +{ + switch( aItem->GetType() ) + { + case WORKSHEET_DATAITEM::WS_TEXT: + format( (WORKSHEET_DATAITEM_TEXT*) aItem, aNestLevel ); + break; + + case WORKSHEET_DATAITEM::WS_SEGMENT: + case WORKSHEET_DATAITEM::WS_RECT: + format( aItem, aNestLevel ); + break; + + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: + format( (WORKSHEET_DATAITEM_POLYPOLYGON*) aItem, aNestLevel ); + break; + + default: + wxFAIL_MSG( wxT( "Cannot format item" ) ); + } +} + +void WORKSHEET_LAYOUT_IO::Format( WORKSHEET_LAYOUT* aPageLayout ) const + throw( IO_ERROR ) +{ + LOCALE_IO toggle; // switch on/off the locale "C" notation + + m_out->Print( 0, "( page_layout\n" ); + + // Setup + int nestLevel = 1; + // Write default values: + m_out->Print( nestLevel, "(%s", getTokenName( T_setup ) ); + m_out->Print( 0, "(textsize %s %s)", + double2Str( WORKSHEET_DATAITEM::m_DefaultTextSize.x ).c_str(), + double2Str( WORKSHEET_DATAITEM::m_DefaultTextSize.y ).c_str() ); + m_out->Print( 0, "(linewidth %s)", double2Str( WORKSHEET_DATAITEM::m_DefaultLineWidth ).c_str() ); + m_out->Print( 0, "(textlinewidth %s)", double2Str( WORKSHEET_DATAITEM::m_DefaultTextThickness ).c_str() ); + m_out->Print( 0, "\n" ); + + // Write margin values + m_out->Print( nestLevel, "(%s %s)", getTokenName( T_left_margin ), + double2Str( aPageLayout->GetLeftMargin() ).c_str() ); + m_out->Print( 0, "(%s %s)", getTokenName( T_right_margin ), + double2Str( aPageLayout->GetRightMargin() ).c_str() ); + m_out->Print( 0, "(%s %s)", getTokenName( T_top_margin ), + double2Str( aPageLayout->GetTopMargin() ).c_str() ); + m_out->Print( 0, "(%s %s)", getTokenName( T_bottom_margin ), + double2Str( aPageLayout->GetBottomMargin() ).c_str() ); + m_out->Print( 0, ")\n" ); + + // Save the graphical items on the page layout + for( unsigned ii = 0; ii < aPageLayout->GetCount(); ii++ ) + { + WORKSHEET_DATAITEM* item = aPageLayout->GetItem( ii ); + Format( item, nestLevel ); + } + + m_out->Print( 0, ")\n" ); +} + +void WORKSHEET_LAYOUT_IO::format( WORKSHEET_DATAITEM_TEXT* aItem, int aNestLevel ) const + throw( IO_ERROR ) +{ + m_out->Print( aNestLevel, "(%s", getTokenName( T_tbtext ) ); + m_out->Print( 0, " %s", m_out->Quotew( aItem->m_TextBase ).c_str() ); + m_out->Print( 0, " (%s %s)", getTokenName( T_name ), + m_out->Quotew( aItem->m_Name ).c_str() ); + + formatCoordinate( getTokenName( T_pos ), aItem->m_Pos ); + formatOptions( aItem ); + + if( aItem->m_Orient ) + m_out->Print( 0, " (%s %s)", getTokenName( T_rotate ), + double2Str(aItem->m_Orient ).c_str() ); + + // Write font info + bool write_size = aItem->m_TextSize.x != 0.0 && aItem->m_TextSize.y != 0.0; + if( write_size || aItem->IsBold() || aItem->IsItalic() ) + { + m_out->Print( 0, " (%s", getTokenName( T_font ) ); + + if( write_size ) + { + m_out->Print( 0, " (%s %s %s)", getTokenName( T_size ), + double2Str(aItem->m_TextSize.x ).c_str(), + double2Str(aItem->m_TextSize.y ).c_str() ); + } + if( aItem->IsBold() ) + m_out->Print( 0, " %s", getTokenName( T_bold ) ); + + if( aItem->IsItalic() ) + m_out->Print( 0, " %s", getTokenName( T_italic ) ); + + m_out->Print( 0, ")" ); + } + + // Write text justification + if( aItem->m_Hjustify != GR_TEXT_HJUSTIFY_LEFT || + aItem->m_Vjustify != GR_TEXT_VJUSTIFY_CENTER ) + { + m_out->Print( 0, " (%s", getTokenName( T_justify ) ); + + // Write T_center opt first, because it is + // also a center for both m_Hjustify and m_Vjustify + if( aItem->m_Hjustify == GR_TEXT_HJUSTIFY_CENTER ) + m_out->Print( 0, " %s", getTokenName( T_center ) ); + + if( aItem->m_Hjustify == GR_TEXT_HJUSTIFY_RIGHT ) + m_out->Print( 0, " %s", getTokenName( T_right ) ); + + if( aItem->m_Vjustify == GR_TEXT_VJUSTIFY_TOP ) + m_out->Print( 0, " %s", getTokenName( T_top ) ); + + if( aItem->m_Vjustify == GR_TEXT_VJUSTIFY_BOTTOM ) + m_out->Print( 0, " %s", getTokenName( T_bottom ) ); + + m_out->Print( 0, ")" ); + } + + // write constraints + if( aItem->m_BoundingBoxSize.x ) + m_out->Print( 0, " (%s %s)", getTokenName( T_maxlen ), + double2Str(aItem->m_BoundingBoxSize.x ).c_str() ); + + if( aItem->m_BoundingBoxSize.y ) + m_out->Print( 0, " (%s %s)", getTokenName( T_maxheight ), + double2Str(aItem->m_BoundingBoxSize.y ).c_str() ); + + formatRepeatParameters( aItem ); + + m_out->Print( 0, ")\n" ); +} + +void WORKSHEET_LAYOUT_IO::format( WORKSHEET_DATAITEM* aItem, int aNestLevel ) const + throw( IO_ERROR ) +{ + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_RECT ) + m_out->Print( aNestLevel, "(%s", getTokenName( T_rect ) ); + else + m_out->Print( aNestLevel, "(%s", getTokenName( T_line ) ); + + m_out->Print( 0, " (%s %s)", getTokenName( T_name ), + m_out->Quotew( aItem->m_Name ).c_str() ); + + formatCoordinate( getTokenName( T_start ), aItem->m_Pos ); + formatCoordinate( getTokenName( T_end ), aItem->m_End ); + formatOptions( aItem ); + + if( aItem->m_LineWidth && aItem->m_LineWidth != aItem->m_DefaultLineWidth ) + m_out->Print( 0, " (linewidth %s)", double2Str( aItem->m_LineWidth ).c_str() ); + + formatRepeatParameters( aItem ); + + m_out->Print( 0, ")\n" ); +} + + +void WORKSHEET_LAYOUT_IO::format( WORKSHEET_DATAITEM_POLYPOLYGON* aItem, int aNestLevel ) const + throw( IO_ERROR ) +{ + m_out->Print( aNestLevel, "( %s", getTokenName( T_polygon ) ); + m_out->Print( 0, " (%s %s)", getTokenName( T_name ), + m_out->Quotew( aItem->m_Name ).c_str() ); + formatCoordinate( getTokenName( T_pos ), aItem->m_Pos ); + formatOptions( aItem ); + + formatRepeatParameters( aItem ); + + if( aItem->m_Orient ) + m_out->Print( 0, " (%s %s)", getTokenName( T_rotate ), + double2Str(aItem->m_Orient ).c_str() ); + + if( aItem->m_LineWidth ) + m_out->Print( 0, " (linewidth %s)\n", double2Str( aItem->m_LineWidth ).c_str() ); + + // Write polygon corners list + for( int kk = 0; kk < aItem->GetPolyCount(); kk++ ) + { + m_out->Print( aNestLevel+1, "( %s", getTokenName( T_pts ) ); + // Create current polygon corners list + unsigned ist = aItem->GetPolyIndexStart( kk ); + unsigned iend = aItem->GetPolyIndexEnd( kk ); + int ii = 0; + while( ist <= iend ) + { + DPOINT pos = aItem->m_Corners[ist++]; + int nestLevel = 0; + + if( ii++ > 4) + { + m_out->Print( 0, "\n" ); + nestLevel = aNestLevel+2; + ii = 0; + } + m_out->Print( nestLevel, " (%s %s %s)", getTokenName( T_xy ), + double2Str( pos.x ).c_str(), + double2Str( pos.y ).c_str() ); + } + m_out->Print( 0, ")\n" ); + } + + m_out->Print( aNestLevel, ")\n" ); +} + +void WORKSHEET_LAYOUT_IO::formatCoordinate( const char * aToken, + POINT_COORD & aCoord ) const + throw( IO_ERROR ) +{ + m_out->Print( 0, " (%s %s %s", aToken, + double2Str( aCoord.m_Pos.x ).c_str(), + double2Str( aCoord.m_Pos.y ).c_str() ); + + switch( aCoord.m_Anchor ) + { + case RB_CORNER: + break; + + case LT_CORNER: + m_out->Print( 0, " %s", getTokenName(T_ltcorner ) ); + break; + + case LB_CORNER: + m_out->Print( 0, " %s", getTokenName(T_lbcorner ) ); + break; + + case RT_CORNER: + m_out->Print( 0, " %s", getTokenName(T_rtcorner ) ); + break; + } + + m_out->Print( 0, ")" ); +} + +void WORKSHEET_LAYOUT_IO::formatRepeatParameters( WORKSHEET_DATAITEM* aItem ) const + throw( IO_ERROR ) +{ + if( aItem->m_RepeatCount <= 1 ) + return; + + m_out->Print( 0, " (repeat %d)", aItem->m_RepeatCount ); + + if( aItem->m_IncrementVector.x ) + m_out->Print( 0, " (incrx %s)", double2Str(aItem-> m_IncrementVector.x ).c_str() ); + + if( aItem->m_IncrementVector.y ) + m_out->Print( 0, " (incry %s)", double2Str( aItem->m_IncrementVector.y ).c_str() ); + + if( aItem->m_IncrementLabel != 1 && + aItem->GetType() == WORKSHEET_DATAITEM::WS_TEXT ) + m_out->Print( 0, " (incrlabel %d)", aItem->m_IncrementLabel ); +} + +void WORKSHEET_LAYOUT_IO::formatOptions( WORKSHEET_DATAITEM* aItem ) const + throw( IO_ERROR ) +{ + switch( aItem->GetPage1Option() ) + { + default: + case 0: + break; + + case 1: + m_out->Print( 0, " (%s %s)", getTokenName(T_option ), + getTokenName(T_page1only ) ); + break; + + case -1: + m_out->Print( 0, " (%s %s)", getTokenName(T_option ), + getTokenName(T_notonpage1 ) ); + break; + } +} diff --git a/pagelayout_editor/pl_editor.cpp b/pagelayout_editor/pl_editor.cpp new file mode 100644 index 0000000000..b31f79e68e --- /dev/null +++ b/pagelayout_editor/pl_editor.cpp @@ -0,0 +1,130 @@ +/** + * @file pl_editor.cpp + * @brief page layout editor main file. + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +extern EDA_COLOR_T g_DrawBgColor; + + +IMPLEMENT_APP( EDA_APP ) + +/* MacOSX: Needed for file association + * http://wiki.wxwidgets.org/WxMac-specific_topics + */ +void EDA_APP::MacOpenFile(const wxString &fileName) +{ + wxFileName filename = fileName; + PL_EDITOR_FRAME * frame = ((PL_EDITOR_FRAME*)GetTopWindow()); + + if( !filename.FileExists() ) + return; + + frame->LoadPageLayoutDescrFile( fileName ); +} + + +bool EDA_APP::OnInit() +{ + wxFileName fn; + + InitEDA_Appl( wxT( "pl_editor" ), APP_PL_EDITOR_T ); + + if( m_Checker && m_Checker->IsAnotherRunning() ) + { + if( !IsOK( NULL, _( "pl_editor is already running. Continue?" ) ) ) + return false; + } + + g_UserUnit = MILLIMETRES; + g_DrawBgColor = WHITE; + g_ShowPageLimits = true; + + // read current setup and reopen last directory if no filename to open in + // command line + bool reopenLastUsedDirectory = argc == 1; + GetSettings( reopenLastUsedDirectory ); + + // Must be called before creating the main frame in order to + // display the real hotkeys in menus or tool tips + ReadHotkeyConfig( wxT("PlEditorFrame"), s_PlEditor_Hokeys_Descr ); + + PL_EDITOR_FRAME * frame = new PL_EDITOR_FRAME( NULL, wxT( "PlEditorFrame" ), wxPoint( 0, 0 ), wxSize( 600, 400 ) ); + + // frame title: + frame->SetTitle( GetTitle() + wxT( " " ) + GetBuildVersion() ); + + SetTopWindow( frame ); + frame->Show( true ); + frame->Zoom_Automatique( true ); // Zoom fit in frame + frame->GetScreen()->m_FirstRedraw = false; + + + bool descrLoaded = false; + if( argc > 1 ) + { + fn = argv[1]; + + if( fn.IsOk() ) + { + wxSetWorkingDirectory( fn.GetPath() ); + bool success = frame->LoadPageLayoutDescrFile( fn.GetFullPath() ); + if( !success ) + { + wxString msg; + msg.Printf( _("Error when loading file <%s>"), + fn.GetFullPath().GetData() ); + wxMessageBox( msg ); + } + else + descrLoaded = true; + } + } + + if( !descrLoaded ) + { + WORKSHEET_LAYOUT::GetTheInstance().SetPageLayout(); + // Force DefaultDescrFlag to false in page layout editor, + // has meaning only for GOST version + WORKSHEET_LAYOUT::GetTheInstance().SetDefaultDescrFlag( false ); + frame->OnNewPageLayout(); + } + + return true; +} diff --git a/pagelayout_editor/pl_editor.rc b/pagelayout_editor/pl_editor.rc new file mode 100644 index 0000000000..885f0e6b53 --- /dev/null +++ b/pagelayout_editor/pl_editor.rc @@ -0,0 +1,3 @@ +icon_pagelayout_editor ICON "../bitmaps_png/icons/icon_pagelayout_editor.ico" + +#include "wx/msw/wx.rc" diff --git a/pagelayout_editor/pl_editor_config.cpp b/pagelayout_editor/pl_editor_config.cpp new file mode 100644 index 0000000000..183d146ed4 --- /dev/null +++ b/pagelayout_editor/pl_editor_config.cpp @@ -0,0 +1,107 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file pl_editor_config.cpp + * @brief page layout editor configuration. +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +#define GROUP wxT("/pl_editor") + +#define INSETUP true + + +void PL_EDITOR_FRAME::Process_Config( wxCommandEvent& event ) +{ + int id = event.GetId(); + + switch( id ) + { + case ID_MENU_SWITCH_BGCOLOR: + if( g_DrawBgColor == WHITE ) + g_DrawBgColor = BLACK; + else + g_DrawBgColor = WHITE; + + GetMenuBar()->SetLabel( ID_MENU_SWITCH_BGCOLOR, + g_DrawBgColor == WHITE ? + _( "&BackGround Black" ) : + _( "&BackGround White" ) ); + m_canvas->Refresh(); + break; + + case ID_MENU_GRID_ONOFF: + SetGridVisibility( ! IsGridVisible() ); + GetMenuBar()->SetLabel( ID_MENU_GRID_ONOFF, + IsGridVisible() ? _( "Hide &Grid" ) : + _( "Show &Grid" ) ); + m_canvas->Refresh(); + break; + + // Standard basic hotkey IDs + case ID_PREFERENCES_HOTKEY_SHOW_EDITOR: + InstallHotkeyFrame( this, s_PlEditor_Hokeys_Descr ); + break; + + case ID_PREFERENCES_HOTKEY_EXPORT_CONFIG: + ExportHotkeyConfigToFile( s_PlEditor_Hokeys_Descr ); + break; + + case ID_PREFERENCES_HOTKEY_IMPORT_CONFIG: + ImportHotkeyConfigFromFile( s_PlEditor_Hokeys_Descr ); + break; + + case ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST: + DisplayHotkeyList( this, s_PlEditor_Hokeys_Descr ); + break; + + default: + wxMessageBox( wxT( "PL_EDITOR_FRAME::Process_Config error" ) ); + break; + } +} + + +PARAM_CFG_ARRAY& PL_EDITOR_FRAME::GetConfigurationSettings() +{ + if( !m_configSettings.empty() ) + return m_configSettings; + + m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "Units" ), + (int*) &g_UserUnit, 0, 0, 1 ) ); + + return m_configSettings; +} diff --git a/pagelayout_editor/pl_editor_frame.cpp b/pagelayout_editor/pl_editor_frame.cpp new file mode 100644 index 0000000000..5d8b36f052 --- /dev/null +++ b/pagelayout_editor/pl_editor_frame.cpp @@ -0,0 +1,686 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file pl_editor_frame.cpp + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/*************************/ +/* class PL_EDITOR_FRAME */ +/*************************/ + +#define PL_EDITOR_FRAME_NAME wxT( "PlEditorFrame" ) + +PL_EDITOR_FRAME::PL_EDITOR_FRAME( wxWindow* aParent, const wxString& aTitle, + const wxPoint& aPosition, const wxSize& aSize, + long aStyle ) : + EDA_DRAW_FRAME( aParent, PL_EDITOR_FRAME_TYPE, aTitle, aPosition, aSize, + aStyle, PL_EDITOR_FRAME_NAME ) +{ + m_FrameName = PL_EDITOR_FRAME_NAME; + + m_showAxis = false; // true to show X and Y axis on screen + m_showGridAxis = true; + m_showBorderAndTitleBlock = true; // true for reference drawings. + m_HotkeysZoomAndGridList = s_PlEditor_Hokeys_Descr; + m_originSelectChoice = 0; + + m_designTreeWidth = 100; + m_propertiesFrameWidth = 150; + + if( m_canvas ) + m_canvas->SetEnableBlockCommands( false ); + + // Give an icon + wxIcon icon; + icon.CopyFromBitmap( KiBitmap( icon_pagelayout_editor_xpm ) ); + SetIcon( icon ); + wxSize pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU(); + SetScreen( new PL_EDITOR_SCREEN( pageSizeIU ) ); + + m_config = wxGetApp().GetSettings(); + LoadSettings(); + SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); + + if( m_LastGridSizeId < ID_POPUP_GRID_LEVEL_1MM-ID_POPUP_GRID_LEVEL_1000 ) + m_LastGridSizeId = ID_POPUP_GRID_LEVEL_1MM-ID_POPUP_GRID_LEVEL_1000; + if( m_LastGridSizeId > ID_POPUP_GRID_LEVEL_0_1MM-ID_POPUP_GRID_LEVEL_1000 ) + m_LastGridSizeId = ID_POPUP_GRID_LEVEL_0_1MM-ID_POPUP_GRID_LEVEL_1000; + GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); + + ReCreateMenuBar(); + ReCreateHToolbar(); + ReCreateOptToolbar(); + + wxWindow* stsbar = GetStatusBar(); + int dims[] = { + + // balance of status bar on far left is set to a default or whatever is left over. + -1, + + // When using GetTextSize() remember the width of '1' is not the same + // as the width of '0' unless the font is fixed width, and it usually won't be. + + // zoom: + GetTextSize( wxT( "Z 762000" ), stsbar ).x + 10, + + // cursor coords + GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + 10, + + // delta distances + GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + 10, + + // Coord origin (use the bigger message) + GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + 10, + + // units display, Inches is bigger than mm + GetTextSize( _( "Inches" ), stsbar ).x + 10 + }; + + SetStatusWidths( DIM( dims ), dims ); + + + m_auimgr.SetManagedWindow( this ); + + EDA_PANEINFO horiz; + horiz.HorizontalToolbarPane(); + + EDA_PANEINFO vert; + vert.VerticalToolbarPane(); + + EDA_PANEINFO mesg; + mesg.MessageToolbarPane(); + + m_propertiesPagelayout = new PROPERTIES_FRAME( this ); + EDA_PANEINFO props; + props.LayersToolbarPane(); + props.MinSize( m_propertiesPagelayout->GetMinSize() ); + props.BestSize( m_propertiesFrameWidth, -1 ); + props.Caption( _( "Properties" ) ); + + m_treePagelayout = new DESIGN_TREE_FRAME( this ); + EDA_PANEINFO tree; + tree.LayersToolbarPane(); + tree.MinSize( m_treePagelayout->GetMinSize() ); + tree.BestSize( m_designTreeWidth, -1 ); + tree.Caption( _( "Design" ) ); + + if( m_mainToolBar ) + m_auimgr.AddPane( m_mainToolBar, + wxAuiPaneInfo( horiz ).Name( wxT( "m_mainToolBar" ) ).Top().Row( 0 ) ); + + if( m_drawToolBar ) + m_auimgr.AddPane( m_drawToolBar, + wxAuiPaneInfo( vert ).Name( wxT( "m_drawToolBar" ) ).Right().Row( 1 ) ); + + m_auimgr.AddPane( m_propertiesPagelayout, + props.Name( wxT( "m_propertiesPagelayout" ) ).Right().Layer( 1 ) ); + + m_auimgr.AddPane( m_treePagelayout, + tree.Name( wxT( "m_treePagelayout" ) ).Left().Layer( 0 ) ); + + if( m_optionsToolBar ) + m_auimgr.AddPane( m_optionsToolBar, + wxAuiPaneInfo( vert ).Name( wxT( "m_optionsToolBar" ) ).Left() ); + + if( m_canvas ) + m_auimgr.AddPane( m_canvas, + wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane().Layer( 5 ) ); + + if( m_messagePanel ) + m_auimgr.AddPane( m_messagePanel, + wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom().Layer( 10 ) ); + + m_auimgr.Update(); +} + + +PL_EDITOR_FRAME::~PL_EDITOR_FRAME() +{ + wxGetApp().SaveCurrentSetupValues( m_configSettings ); +} + + +void PL_EDITOR_FRAME::OnCloseWindow( wxCloseEvent& Event ) +{ + if( GetScreen()->IsModify() ) + { + wxString msg; + wxString filename = GetCurrFileName(); + if( filename.IsEmpty() ) + msg = _("Save changes in a new file before closing?"); + else + msg.Printf( _("Save the changes in\n<%s>\nbefore closing?"), + GetChars( filename ) ); + + int ii = DisplayExitDialog( this, msg ); + switch( ii ) + { + case wxID_CANCEL: + Event.Veto(); + return; + + case wxID_NO: + break; + + case wxID_OK: + case wxID_YES: + { + if( filename.IsEmpty() ) + { + wxFileDialog openFileDialog(this, _("Create file"), wxEmptyString, + wxEmptyString, PageLayoutDescrFileWildcard, wxFD_SAVE); + + if (openFileDialog.ShowModal() == wxID_CANCEL) + return; + + filename = openFileDialog.GetPath(); + } + + if( !SavePageLayoutDescrFile( filename ) ) + { + wxString msg; + msg.Printf( _("Unable to create <%s>"), GetChars( filename ) ); + wxMessageBox( msg ); + } + } + break; + } + } + + SaveSettings(); + // do not show the window because we do not want any paint event + Show( false ); + Destroy(); +} + + +double PL_EDITOR_FRAME::BestZoom() +{ + int dx, dy; + wxSize size; + + dx = GetPageLayout().GetPageSettings().GetWidthIU(); + dy = GetPageLayout().GetPageSettings().GetHeightIU(); + + size = m_canvas->GetClientSize(); + + // Reserve no margin because best zoom shows the full page + // and margins are already included in function that draws the sheet refernces + double margin_scale_factor = 1.0; + double zx =(double) dx / ( margin_scale_factor * (double)size.x ); + double zy = (double) dy / ( margin_scale_factor * (double)size.y ); + + double bestzoom = std::max( zx, zy ); + + GetScreen()->SetScrollCenterPosition( wxPoint( dx / 2, dy / 2 ) ); + + return bestzoom; +} + +#define DESIGN_TREE_WIDTH_KEY wxT("DesignTreeWidth") +#define PROPERTIES_FRAME_WIDTH_KEY wxT("PropertiesFrameWidth") +#define CORNER_ORIGIN_CHOICE_KEY wxT("CornerOriginChoice") + +void PL_EDITOR_FRAME::LoadSettings() +{ + EDA_DRAW_FRAME::LoadSettings(); + m_config->Read( DESIGN_TREE_WIDTH_KEY, &m_designTreeWidth, 100); + m_config->Read( PROPERTIES_FRAME_WIDTH_KEY, &m_propertiesFrameWidth, 150); + m_config->Read( CORNER_ORIGIN_CHOICE_KEY, &m_originSelectChoice ); +} + + +void PL_EDITOR_FRAME::SaveSettings() +{ + wxConfig* config = wxGetApp().GetSettings(); + + if( config == NULL ) + return; + + m_designTreeWidth = m_treePagelayout->GetSize().x; + m_propertiesFrameWidth = m_propertiesPagelayout->GetSize().x; + + EDA_DRAW_FRAME::SaveSettings(); + m_config->Write( DESIGN_TREE_WIDTH_KEY, m_designTreeWidth); + m_config->Write( PROPERTIES_FRAME_WIDTH_KEY, m_propertiesFrameWidth); + m_config->Write( CORNER_ORIGIN_CHOICE_KEY, m_originSelectChoice ); + + wxGetApp().SaveCurrentSetupValues( GetConfigurationSettings() ); +} + + +/* + * Function UpdateTitleAndInfo + * displays the filename (if exists) of the current page layout descr file. + */ +void PL_EDITOR_FRAME::UpdateTitleAndInfo() +{ + wxString title; + title.Printf( wxT( "Pl_Editor %s [%s]" ), GetChars( GetBuildVersion() ), + GetChars( GetCurrFileName() ) ); + SetTitle( title ); +} + +/* return the filename of the current layout descr file + */ +const wxString& PL_EDITOR_FRAME::GetCurrFileName() const +{ + return BASE_SCREEN::m_PageLayoutDescrFileName; +} + +/* Stores the current layout descr file filename + */ +void PL_EDITOR_FRAME::SetCurrFileName( const wxString& aName ) +{ + BASE_SCREEN::m_PageLayoutDescrFileName = aName; +} + +void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings ) +{ + m_pageLayout.SetPageSettings( aPageSettings ); + + if( GetScreen() ) + GetScreen()->InitDataPoints( aPageSettings.GetSizeIU() ); +} + + +const PAGE_INFO& PL_EDITOR_FRAME::GetPageSettings() const +{ + return m_pageLayout.GetPageSettings(); +} + + +const wxSize PL_EDITOR_FRAME::GetPageSizeIU() const +{ + // this function is only needed because EDA_DRAW_FRAME is not compiled + // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route + // into an application specific source file. + return m_pageLayout.GetPageSettings().GetSizeIU(); +} + + +const TITLE_BLOCK& PL_EDITOR_FRAME::GetTitleBlock() const +{ + return GetPageLayout().GetTitleBlock(); +} + + +void PL_EDITOR_FRAME::SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) +{ + m_pageLayout.SetTitleBlock( aTitleBlock ); +} + + +/* + * Update the status bar information. + */ +void PL_EDITOR_FRAME::UpdateStatusBar() +{ + PL_EDITOR_SCREEN* screen = (PL_EDITOR_SCREEN*) GetScreen(); + + if( !screen ) + return; + + // coodinate origin can be the paper Top Left corner, + // or each of 4 page corners + // We know the origin, and the orientation of axis + wxPoint originCoord; + int Xsign = 1; + int Ysign = 1; + WORKSHEET_DATAITEM dummy( WORKSHEET_DATAITEM::WS_SEGMENT ); + switch( m_originSelectChoice ) + { + default: + case 0: // Origin = paper Left Top corner + break; + + case 1: // Origin = page Right Bottom corner + Xsign = -1; + Ysign = -1; + dummy.SetStart( 0, 0, RB_CORNER ); + originCoord = dummy.GetStartPosUi(); + break; + + case 2: // Origin = page Left Bottom corner + Ysign = -1; + dummy.SetStart( 0, 0, LB_CORNER ); + originCoord = dummy.GetStartPosUi(); + break; + + case 3: // Origin = page Right Top corner + Xsign = -1; + dummy.SetStart( 0, 0, RT_CORNER ); + originCoord = dummy.GetStartPosUi(); + break; + + case 4: // Origin = page Left Top corner + dummy.SetStart( 0, 0, LT_CORNER ); + originCoord = dummy.GetStartPosUi(); + break; + } + + screen->m_GridOrigin = originCoord; + + // Display absolute coordinates: + wxPoint coord = screen->GetCrossHairPosition() - originCoord; + double dXpos = To_User_Unit( g_UserUnit, coord.x*Xsign ); + double dYpos = To_User_Unit( g_UserUnit, coord.y*Ysign ); + + wxString pagesizeformatter = wxT( "Page size: width %.4g height %.4g" ); + wxString absformatter = wxT( "X %.4g Y %.4g" ); + wxString locformatter = wxT( "dx %.4g dy %.4g" ); + + switch( g_UserUnit ) + { + case INCHES: // Should not be used in page layout editor + SetStatusText( _("inches"), 5 ); + break; + + case MILLIMETRES: + SetStatusText( _("mm"), 5 ); + break; + + case UNSCALED_UNITS: + SetStatusText( wxEmptyString, 5 ); + break; + } + + wxString line; + + // Display page size + #define milsTomm (25.4/1000) + DSIZE size = GetPageSettings().GetSizeMils(); + size = size * milsTomm; + line.Printf( pagesizeformatter, size.x, size.y ); + SetStatusText( line, 0 ); + + // Display abs coordinates + line.Printf( absformatter, dXpos, dYpos ); + SetStatusText( line, 2 ); + + // Display relative coordinates: + int dx = screen->GetCrossHairPosition().x - screen->m_O_Curseur.x; + int dy = screen->GetCrossHairPosition().y - screen->m_O_Curseur.y; + dXpos = To_User_Unit( g_UserUnit, dx * Xsign ); + dYpos = To_User_Unit( g_UserUnit, dy * Ysign ); + line.Printf( locformatter, dXpos, dYpos ); + SetStatusText( line, 3 ); + + // Display Zoom level: zoom = zoom_coeff/ZoomScalar + line.Printf( wxT( "Z %.1f" ), screen->GetZoom() ); + SetStatusText( line, 1 ); + + // Display corner reference for coord origin + line.Printf( _("coord origin: %s"), + m_originSelectBox->GetString( m_originSelectChoice ). GetData() ); + SetStatusText( line, 4 ); + + // Display units +} + +void PL_EDITOR_FRAME::PrintPage( wxDC* aDC, LAYER_MSK aPrintMasklayer, + bool aPrintMirrorMode, void * aData ) +{ + GetScreen()-> m_ScreenNumber = GetPageNumberOption() ? 1 : 2; + DrawWorkSheet( aDC, GetScreen(), 0, IU_PER_MILS, wxEmptyString ); +} + +void PL_EDITOR_FRAME::RedrawActiveWindow( wxDC* aDC, bool aEraseBg ) +{ + + GetScreen()-> m_ScreenNumber = GetPageNumberOption() ? 1 : 2; + + if( aEraseBg ) + m_canvas->EraseScreen( aDC ); + + m_canvas->DrawBackGround( aDC ); + + const WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + WORKSHEET_DATAITEM* selecteditem = GetSelectedItem(); + + // the color to draw selected items + if( g_DrawBgColor == WHITE ) + WORKSHEET_DATAITEM::m_SelectedColor = DARKCYAN; + else + WORKSHEET_DATAITEM::m_SelectedColor = YELLOW; + + for( unsigned ii = 0; ; ii++ ) + { + WORKSHEET_DATAITEM* item = pglayout.GetItem( ii ); + + if( item == NULL ) + break; + + item->SetSelected( item == selecteditem ); + } + + DrawWorkSheet( aDC, GetScreen(), 0, IU_PER_MILS, GetCurrFileName() ); + + if( m_canvas->IsMouseCaptured() ) + m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false ); + + m_canvas->DrawCrossHair( aDC ); + + // Display the filename + UpdateTitleAndInfo(); +} + +void PL_EDITOR_FRAME::RebuildDesignTree() +{ + const WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + int rectId = 0; + int lineId = 0; + int textId = 0; + int polyId = 0; + + for( unsigned ii = 0; ii < pglayout.GetCount(); ii++ ) + { + WORKSHEET_DATAITEM* item = pglayout.GetItem( ii ); + switch( item->GetType() ) + { + case WORKSHEET_DATAITEM::WS_TEXT: + item->m_Name = wxString::Format( wxT("text%d:%s"), ++textId, + GetChars(item->GetClassName()) ); + break; + + case WORKSHEET_DATAITEM:: WS_SEGMENT: + item->m_Name = wxString::Format( wxT("segm%d:%s"), ++lineId, + GetChars(item->GetClassName()) ); + break; + + case WORKSHEET_DATAITEM::WS_RECT: + item->m_Name = wxString::Format( wxT("rect%d:%s"), ++rectId, + GetChars(item->GetClassName()) ); + break; + + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: + item->m_Name = wxString::Format( wxT("poly%d:%s"), ++polyId, + GetChars(item->GetClassName()) ); + break; + } + } + + m_treePagelayout->ReCreateDesignTree(); +} + +/* Add a new item to the page layout item list. + * aType = WS_TEXT, WS_SEGMENT, WS_RECT, WS_POLYPOLYGON + */ +WORKSHEET_DATAITEM * PL_EDITOR_FRAME::AddPageLayoutItem( int aType, int aIdx ) +{ + WORKSHEET_DATAITEM * item = NULL; + + switch( aType ) + { + case WORKSHEET_DATAITEM::WS_TEXT: + item = new WORKSHEET_DATAITEM_TEXT( wxT("Text") ); + break; + + case WORKSHEET_DATAITEM::WS_SEGMENT: + item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_SEGMENT ); + break; + + case WORKSHEET_DATAITEM::WS_RECT: + item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_RECT ); + break; + + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: + item = new WORKSHEET_DATAITEM_POLYPOLYGON(); + break; + } + + if( item == NULL ) + return NULL; + + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.Insert( item, aIdx ); + RebuildDesignTree(); + + return item; +} + +/* returns the current selected item, or NULL + */ +WORKSHEET_DATAITEM * PL_EDITOR_FRAME::GetSelectedItem() +{ + WORKSHEET_DATAITEM* item = m_treePagelayout->GetPageLayoutSelectedItem(); + return item; +} + +/* return the page layout item found at position aPosition + * aPosition = the position (in user units) of the reference point + */ +WORKSHEET_DATAITEM* PL_EDITOR_FRAME::Locate( const wxPoint& aPosition ) +{ + const PAGE_INFO& pageInfo = GetPageSettings(); + TITLE_BLOCK t_block = GetTitleBlock(); + EDA_COLOR_T color = RED; // Needed, not used + PL_EDITOR_SCREEN* screen = (PL_EDITOR_SCREEN*) GetScreen(); + screen-> m_ScreenNumber = GetPageNumberOption() ? 1 : 2; + + WS_DRAW_ITEM_LIST drawList; + drawList.SetPenSize( 0 ); + drawList.SetMilsToIUfactor( IU_PER_MILS ); + drawList.SetSheetNumber( screen->m_ScreenNumber ); + drawList.SetSheetCount( screen->m_NumberOfScreens ); + drawList.SetFileName( GetCurrFileName() ); + drawList.SetSheetName( GetScreenDesc() ); + + drawList.BuildWorkSheetGraphicList( pageInfo, t_block, color, color ); + + // locate items. + // We do not use here the COLLECTOR classes in use in pcbnew and eeschema + // because the locate requirements are very basic. + std::vector list; + drawList.Locate( list, aPosition ); + if( list.size() == 0 ) + return NULL; + + WS_DRAW_ITEM_BASE* drawitem = list[0]; + + // Choose item in list if more than 1 item + if( list.size() > 1 ) + { + wxArrayString choices; + wxString text; + wxPoint cursPos = screen->GetCrossHairPosition(); + + for( unsigned ii = 0; ii < list.size(); ++ii ) + { + wxString text; + drawitem = list[ii]; + text = drawitem->GetParent()->m_Name; + + if( (drawitem->m_Flags & (LOCATE_STARTPOINT|LOCATE_ENDPOINT)) + == (LOCATE_STARTPOINT|LOCATE_ENDPOINT) ) + text << wxT(" ") << _("(start or end point)"); + else + { + if( (drawitem->m_Flags & LOCATE_STARTPOINT) ) + text << wxT(" ") << _("(start point)"); + + if( (drawitem->m_Flags & LOCATE_ENDPOINT) ) + text << wxT(" ") << _("(end point)"); + } + + if( ! drawitem->GetParent()->m_Info.IsEmpty() ) + text << wxT(" \"") << drawitem->GetParent()->m_Info << wxT("\""); + + choices.Add( text ); + } + int selection = wxGetSingleChoiceIndex ( wxEmptyString, + _( "Selection Clarification" ), + choices, this ); + if( selection < 0 ) + return NULL; + + screen->SetCrossHairPosition( cursPos ); + m_canvas->MoveCursorToCrossHair(); + drawitem = list[selection]; + } + + WORKSHEET_DATAITEM* item = drawitem->GetParent(); + item->ClearFlags(LOCATE_STARTPOINT|LOCATE_ENDPOINT); + + if( (drawitem->m_Flags & LOCATE_STARTPOINT) ) + item->SetFlags( LOCATE_STARTPOINT ); + + if( (drawitem->m_Flags & LOCATE_ENDPOINT) ) + item->SetFlags( LOCATE_ENDPOINT ); + + return item; +} + +/* Must be called to initialize parameters when a new page layout + * description is loaded + */ +void PL_EDITOR_FRAME::OnNewPageLayout() +{ + GetScreen()->ClearUndoRedoList(); + GetScreen()->ClrModify(); + m_propertiesPagelayout->CopyPrmsFromGeneralToPanel(); + RebuildDesignTree(); + m_canvas->Refresh(); +} diff --git a/pagelayout_editor/pl_editor_frame.h b/pagelayout_editor/pl_editor_frame.h new file mode 100644 index 0000000000..8b1e85c72f --- /dev/null +++ b/pagelayout_editor/pl_editor_frame.h @@ -0,0 +1,371 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2013 CERN + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file pl_editor_frame.h + */ + +#ifndef _PL_EDITOR_FRAME_H +#define _PL_EDITOR_FRAME_H + + +#include +#include +#include +#include +#include + +class PROPERTIES_FRAME; +class DESIGN_TREE_FRAME; +class WORKSHEET_DATAITEM; + +/** + * Class PL_EDITOR_FRAME + * is the main window used in the page layout editor. + */ + +class PL_EDITOR_FRAME : public EDA_DRAW_FRAME +{ + PL_EDITOR_LAYOUT m_pageLayout; + int m_designTreeWidth; // the last width (in pixels) of m_treePagelayout + int m_propertiesFrameWidth; // the last width (in pixels) of m_propertiesPagelayout + wxConfig* m_config; + wxChoice* m_originSelectBox; // Corner origin choice for coordinates + int m_originSelectChoice; // the last choice for m_originSelectBox + wxChoice* m_pageSelectBox; // The page number sel'ector (page 1 or other pages + // usefull when there are some items which are + // only on page 1, not on page 1 + +protected: + /// The last filename chosen to be proposed to the user + wxString m_lastFileName; + DESIGN_TREE_FRAME* m_treePagelayout; + PROPERTIES_FRAME* m_propertiesPagelayout; + +private: + // list of PARAM_CFG_xxx to read/write parameters saved in config + PARAM_CFG_ARRAY m_configSettings; + +public: + PL_EDITOR_FRAME( wxWindow* aParent, const wxString& aTitle, + const wxPoint& aPosition, const wxSize& aSize, + long aStyle = KICAD_DEFAULT_DRAWFRAME_STYLE ); + + ~PL_EDITOR_FRAME(); + + void OnCloseWindow( wxCloseEvent& Event ); + + // Virtual basic functions: + void RedrawActiveWindow( wxDC* DC, bool EraseBg ); + void ReCreateHToolbar(); + + void SetPageSettings(const PAGE_INFO&); + const PAGE_INFO& GetPageSettings () const; // overload EDA_DRAW_FRAME + const wxSize GetPageSizeIU() const; // overload EDA_DRAW_FRAME + + PL_EDITOR_SCREEN* GetScreen() + { + return (PL_EDITOR_SCREEN*) m_canvas->GetScreen(); + } + + const wxPoint& GetOriginAxisPosition() const // overload EDA_DRAW_FRAME + { + static wxPoint dummy( 0,0 ); + return dummy; + } + void SetOriginAxisPosition( const wxPoint& aPosition ) {} // overload EDA_DRAW_FRAME + + const TITLE_BLOCK& GetTitleBlock() const; // overload EDA_DRAW_FRAME + void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ); // overload EDA_DRAW_FRAME + + void UpdateStatusBar(); // overload EDA_DRAW_FRAME + + /** + * Must be called to initialize parameters when a new page layout + * description is loaded + */ + void OnNewPageLayout(); + + /** + * creates or updates the right vertical toolbar. + * @note This is currently not used. + */ + void ReCreateVToolbar(); + + /** + * Create or update the left vertical toolbar (option toolbar + * @note This is currently not used. + */ + void ReCreateOptToolbar(); + + void ReCreateMenuBar(); + void OnLeftClick( wxDC* aDC, const wxPoint& aMousePos ); + void OnLeftDClick( wxDC* aDC, const wxPoint& aMousePos ); + bool OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ); + double BestZoom(); + + // Events created by clicking on the design tree list: + void OnTreeSelection( wxTreeEvent& event ); + void OnTreeMiddleClick( wxTreeEvent& event ); + void OnTreeRightClick( wxTreeEvent& event ); + + const PL_EDITOR_LAYOUT& GetPageLayout() const { return m_pageLayout; } + + /** + * Page layout editor can show the title block using a page number + * 1 or an other number. + * This is because some items can be shown (or not) only on page 1 + * (a feature which look like word processing option + * "page 1 differs from other pages". + * @return true if the page 1 is selected, and false if not + */ + bool GetPageNumberOption() const + { + return m_pageSelectBox->GetSelection() == 0; + } + + /** + * Displays the short filename (if exists) loaded file + * on the caption of the main window + */ + void UpdateTitleAndInfo(); + + /** + * Populates the applicatios settings list. + * (list of parameters that must be saved in project parameters) + * Currently, only the settings that are needed at start up by the main window are + * defined here. There are other locally used settings scattered throughout the + * source code (mainly in dialogs). If you need to define a configuration + * setting that need to be loaded at run time, this is the place to define it. + */ + PARAM_CFG_ARRAY& GetConfigurationSettings( void ); + + /** + * Load applications settings specific to page layout editor. + * + * This overrides the base class EDA_DRAW_FRAME::LoadSettings(). + */ + virtual void LoadSettings(); + + /** + * Save applications settings common to PCB draw frame objects. + * + * This overrides the base class EDA_DRAW_FRAME::SaveSettings() to + * save settings specific to the application main window. It + * calls down to the base class to save settings common to all + * drawing frames. Please put your application settings for pl editor here + * to avoid having application settings saved all over the place. + */ + virtual void SaveSettings(); + + /** + * Function SetLanguage + * called on a language menu selection + */ + virtual void SetLanguage( wxCommandEvent& event ); + + void Process_Special_Functions( wxCommandEvent& event ); + void OnSelectOptionToolbar( wxCommandEvent& event ); + + /** + * called when the user select one of the 4 page corner as corner + * reference (or the left top paper corner) + */ + void OnSelectCoordOriginCorner( wxCommandEvent& event ); + + /** + * Toggle the display mode between the normal mode and the editor mode: + * In normal mode, title block texts are shown like they will be + * shown in other kicad applications: the format symbols in texts + * are replaced by the actual text. + * In editor mode, the format symbols in texts are not replaced + * by the actual text, and therefore format symbols are displayed. + */ + void OnSelectTitleBlockDisplayMode( wxCommandEvent& event ); + + void OnUpdateTitleBlockDisplayNormalMode( wxUpdateUIEvent& event ); + void OnUpdateTitleBlockDisplaySpecialMode( wxUpdateUIEvent& event ); + + /** + * Function OnQuit + * called on request of application quit + */ + void OnQuit( wxCommandEvent& event ); + + /** + * Function OnHotKey. + * ** Commands are case insensitive ** + * Some commands are relatives to the item under the mouse cursor + * @param aDC = current device context + * @param aHotkeyCode = hotkey code (ascii or wxWidget code for special keys) + * @param aPosition The cursor position in logical (drawing) units. + * @param aItem = NULL or pointer on a EDA_ITEM under the mouse cursor + */ + void OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ); + + void Process_Settings( wxCommandEvent& event ); + void Process_Config( wxCommandEvent& event ); + + /** + * Function ToPlotter + * Open a dialog frame to create plot and drill files + * relative to the current board + */ + void ToPlotter( wxCommandEvent& event ); + + /** + * Function ToPrinter + * Open a dialog frame to print layers + */ + void ToPrinter( wxCommandEvent& event ); + + void Files_io( wxCommandEvent& event ); + void GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 ); + + /** Virtual function PrintPage + * used to print a page + * @param aDC = wxDC given by the calling print function + * @param aPrintMasklayer = a 32 bits mask: bit n = 1 -> layer n is printed + * @param aPrintMirrorMode = not used here (Set when printing in mirror mode) + * @param aData = a pointer on an auxiliary data (not always used, NULL if not used) + */ + virtual void PrintPage( wxDC* aDC, LAYER_MSK aPrintMasklayer, + bool aPrintMirrorMode, void * aData ); + + void OnFileHistory( wxCommandEvent& event ); + + /** + * Function LoadPageLayoutDescrFile + * Loads a .kicad_wks page layout descr file + * @param aFullFileName = the filename. + */ + bool LoadPageLayoutDescrFile( const wxString& aFullFileName ); + + /** + * Function SavePageLayoutDescrFile + * Save the current layout in a .kicad_wks page layout descr file + * @param aFullFileName = the filename. + */ + bool SavePageLayoutDescrFile( const wxString& aFullFileName ); + + /** + * Function InsertPageLayoutDescrFile + * Loads a .kicad_wks page layout descr file, and add items + * to the current layout list + * @param aFullFileName = the filename. + */ + bool InsertPageLayoutDescrFile( const wxString& aFullFileName ); + + /** + * @return the filename of the current layout descr file + * If this is the default (no loaded file) returns a emtpy name + * or a new design. + */ + const wxString& GetCurrFileName() const; + + /** + * Stores the current layout descr file filename + */ + void SetCurrFileName( const wxString& aName ); + + /** + * Function RebuildDesignTree + * Re creates the design graphic tree list items, + * and ensures each item has an unique name + */ + void RebuildDesignTree(); + + /** + * Function AddPageLayoutItem + * Add a new item to the page layout item list. + * @param aType = the type of item: + * WS_TEXT, WS_SEGMENT, WS_RECT, WS_POLYPOLYGON + * @param aIdx = the position in list to insert the new item. + * @return a reference to the new item + */ + WORKSHEET_DATAITEM * AddPageLayoutItem( int aType, int aIdx = -1 ); + + /** + * Function GetSelectedItem + * @return the current selected item, or NULL + */ + WORKSHEET_DATAITEM * GetSelectedItem(); + + /** + * Function Locate + * @return the page layout item found at position aPosition + * @param aPosition = the position (in user units) of the reference point + */ + WORKSHEET_DATAITEM *Locate( const wxPoint& aPosition ); + + /** + * Initialize a move item command + * @param aItem is the item to move + */ + void MoveItem( WORKSHEET_DATAITEM* aItem ); + + /** + * Save in Undo list the layout, and place an item being moved. + * @param aItem is the item moved + */ + void PlaceItem( WORKSHEET_DATAITEM* aItem ); + + /** + * Must be called after a change + * in order to set the "modify" flag of the current screen + */ + void OnModify() + { + GetScreen()->SetModify(); + } + + /** + * Save a copy of the description (in a S expr string) + * for Undo/redo commands + */ + void SaveCopyInUndoList(); + + /** Redo the last edition: + * - Place the current edited layout in undo list + * - Get the previous version of the current edited layput + */ + void GetLayoutFromRedoList( wxCommandEvent& event ); + + /** Undo the last edition: + * - Place the current layout in Redo list + * - Get the previous version of the current edited layout + */ + void GetLayoutFromUndoList( wxCommandEvent& event ); + + /** + * Remove the last command in Undo List. + * Used to clean the Undo stack after a cancel command + */ + void RemoveLastCommandInUndoList(); + + DECLARE_EVENT_TABLE() +}; + +#endif /* _PL_EDITOR_FRAME_H */ diff --git a/pagelayout_editor/pl_editor_id.h b/pagelayout_editor/pl_editor_id.h new file mode 100644 index 0000000000..6f7b0c5be6 --- /dev/null +++ b/pagelayout_editor/pl_editor_id.h @@ -0,0 +1,49 @@ +#ifndef _PL_EDITOR_ID_H_ +#define _PL_EDITOR_ID_H_ + +#include + +/** + * Command IDs for the printed circuit board editor. + * + * Please add IDs that are unique to the page layout editor (pl_editor) here and not in + * the global id.h file. This will prevent the entire project from being rebuilt when + * adding new commands to the page layout editor. + */ + +enum pl_editor_ids +{ + ID_MAIN_MENUBAR = ID_END_LIST, + + ID_PL_EDITOR_SHOW_SOURCE, + ID_MENU_PL_EDITOR_SELECT_PREFERED_EDITOR, + ID_MENU_SWITCH_BGCOLOR, + ID_MENU_GRID_ONOFF, + ID_DESIGN_TREE_FRAME, + + ID_SHOW_REAL_MODE, + ID_SHOW_LPEDITOR_MODE, + ID_SELECT_COORDINATE_ORIGIN, + ID_LOAD_DEFAULT_PAGE_LAYOUT, + ID_SELECT_PAGE_NUMBER, + + ID_OPEN_POLYGON_DESCR_FILE, + + ID_POPUP_START_RANGE, + ID_POPUP_ITEM_DELETE, + ID_POPUP_DESIGN_TREE_ITEM_DELETE, + ID_POPUP_ITEM_ADD_LINE, + ID_POPUP_ITEM_ADD_RECT, + ID_POPUP_ITEM_ADD_TEXT, + ID_POPUP_ITEM_ADD_POLY, + ID_POPUP_ITEM_MOVE, + ID_POPUP_ITEM_PLACE, + ID_POPUP_ITEM_MOVE_START_POINT, + ID_POPUP_ITEM_MOVE_END_POINT, + ID_POPUP_ITEM_PLACE_CANCEL, + ID_POPUP_END_RANGE, + + ID_PLEDITOR_END_LIST +}; + +#endif /* _PL_EDITOR_IDS_H_ */ diff --git a/pagelayout_editor/pl_editor_undo_redo.cpp b/pagelayout_editor/pl_editor_undo_redo.cpp new file mode 100644 index 0000000000..d40708c822 --- /dev/null +++ b/pagelayout_editor/pl_editor_undo_redo.cpp @@ -0,0 +1,153 @@ +/** + * @file pl_editor_undo_redo.cpp + * @brief page layout editor: undo and redo functions + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + +#include + +/* Note: the Undo/redo commands use a "brute" method: + * the full page layout is converted to a S expression, and saved as string. + * When a previous version is needed, the old string is parsed, + * and the description replaces the current desc, just like reading a new file + * + * This is not optimal from the memory point of view, but: + * - the descriptions are never very long (max few thousand of bytes) + * - this is very easy to code + */ + +// A helper class used in undo/redo commad: +class PL_ITEM_LAYOUT: public EDA_ITEM +{ +public: + wxString m_Layout; + +public: + PL_ITEM_LAYOUT() : EDA_ITEM( TYPE_PL_EDITOR_LAYOUT ) {} + + // Required to keep compiler happy on debug builds. +#if defined(DEBUG) + virtual void Show( int nestLevel, std::ostream& os ) const {} +#endif +}; + +void PL_EDITOR_FRAME::SaveCopyInUndoList() +{ + PL_ITEM_LAYOUT* copyItem = new PL_ITEM_LAYOUT; + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.SaveInString( copyItem->m_Layout ); + + PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST(); + ITEM_PICKER wrapper( copyItem, UR_LIBEDIT ); + lastcmd->PushItem(wrapper); + GetScreen()->PushCommandToUndoList( lastcmd ); + + // Clear redo list, because after new save there is no redo to do. + GetScreen()->ClearUndoORRedoList( GetScreen()->m_RedoList ); +} + + +/* Redo the last edition: + * - Place the current edited layout in undo list + * - Get previous version of the current edited layput + */ +void PL_EDITOR_FRAME::GetLayoutFromRedoList( wxCommandEvent& event ) +{ + if ( GetScreen()->GetRedoCommandCount() <= 0 ) + return; + + PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST(); + PL_ITEM_LAYOUT* copyItem = new PL_ITEM_LAYOUT; + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.SaveInString( copyItem->m_Layout ); + + ITEM_PICKER wrapper( copyItem, UR_LIBEDIT ); + + lastcmd->PushItem( wrapper ); + GetScreen()->PushCommandToUndoList( lastcmd ); + + lastcmd = GetScreen()->PopCommandFromRedoList(); + + wrapper = lastcmd->PopItem(); + copyItem = (PL_ITEM_LAYOUT*)wrapper.GetItem(); + pglayout.SetPageLayout( TO_UTF8(copyItem->m_Layout) ); + delete copyItem; + + OnModify(); + RebuildDesignTree(); + m_canvas->Refresh(); +} + + +/* Undo the last edition: + * - Place the current layout in Redo list + * - Get previous version of the current edited layout + */ +void PL_EDITOR_FRAME::GetLayoutFromUndoList( wxCommandEvent& event ) +{ + if ( GetScreen()->GetUndoCommandCount() <= 0 ) + return; + + PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST(); + PL_ITEM_LAYOUT* copyItem = new PL_ITEM_LAYOUT; + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.SaveInString( copyItem->m_Layout ); + + ITEM_PICKER wrapper( copyItem, UR_LIBEDIT ); + lastcmd->PushItem( wrapper ); + GetScreen()->PushCommandToRedoList( lastcmd ); + + lastcmd = GetScreen()->PopCommandFromUndoList(); + + wrapper = lastcmd->PopItem(); + copyItem = (PL_ITEM_LAYOUT*)wrapper.GetItem(); + pglayout.SetPageLayout( TO_UTF8(copyItem->m_Layout) ); + delete copyItem; + + OnModify(); + RebuildDesignTree(); + m_canvas->Refresh(); +} + +/* Remove the last command in Undo List. + * Used to clean the uUndo stack after a cancel command + */ +void PL_EDITOR_FRAME::RemoveLastCommandInUndoList() +{ + if ( GetScreen()->GetUndoCommandCount() <= 0 ) + return; + + PICKED_ITEMS_LIST* lastcmd = GetScreen()->PopCommandFromUndoList(); + + ITEM_PICKER wrapper = lastcmd->PopItem(); + PL_ITEM_LAYOUT* copyItem = (PL_ITEM_LAYOUT*)wrapper.GetItem(); + delete copyItem; +} diff --git a/pagelayout_editor/properties_frame.cpp b/pagelayout_editor/properties_frame.cpp new file mode 100644 index 0000000000..db700d1d4e --- /dev/null +++ b/pagelayout_editor/properties_frame.cpp @@ -0,0 +1,451 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file properties_frame.cpp + */ + +#include +#include +#include +#include +#include +#include + +PROPERTIES_FRAME::PROPERTIES_FRAME( PL_EDITOR_FRAME* aParent ): + PANEL_PROPERTIES_BASE( aParent ) +{ + m_parent = aParent; +} + + +PROPERTIES_FRAME::~PROPERTIES_FRAME() +{ +} + +wxSize PROPERTIES_FRAME::GetMinSize() const +{ + return wxSize( 150, -1 ); +} + + +// Data transfert from general properties to widgets +void PROPERTIES_FRAME::CopyPrmsFromGeneralToPanel() +{ + wxString msg; + + // Set default parameters + msg.Printf( wxT("%.3f"), WORKSHEET_DATAITEM::m_DefaultLineWidth ); + m_textCtrlDefaultLineWidth->SetValue( msg ); + + msg.Printf( wxT("%.3f"), WORKSHEET_DATAITEM::m_DefaultTextSize.x ); + m_textCtrlDefaultTextSizeX->SetValue( msg ); + msg.Printf( wxT("%.3f"), WORKSHEET_DATAITEM::m_DefaultTextSize.y ); + m_textCtrlDefaultTextSizeY->SetValue( msg ); + + msg.Printf( wxT("%.3f"), WORKSHEET_DATAITEM::m_DefaultTextThickness ); + m_textCtrlDefaultTextThickness->SetValue( msg ); + + // Set page margins values + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + msg.Printf( wxT("%.3f"), pglayout.GetRightMargin() ); + m_textCtrlRightMargin->SetValue( msg ); + msg.Printf( wxT("%.3f"), pglayout.GetBottomMargin() ); + m_textCtrlDefaultBottomMargin->SetValue( msg ); + + msg.Printf( wxT("%.3f"), pglayout.GetLeftMargin() ); + m_textCtrlLeftMargin->SetValue( msg ); + msg.Printf( wxT("%.3f"), pglayout.GetTopMargin() ); + m_textCtrlTopMargin->SetValue( msg ); +} + +// Data transfert from widgets to general properties +bool PROPERTIES_FRAME::CopyPrmsFromPanelToGeneral() +{ + double dtmp; + wxString msg; + + // Import default parameters from widgets + msg = m_textCtrlDefaultLineWidth->GetValue(); + msg.ToDouble( &dtmp ); + WORKSHEET_DATAITEM::m_DefaultLineWidth = dtmp; + + msg = m_textCtrlDefaultTextSizeX->GetValue(); + msg.ToDouble( &dtmp ); + WORKSHEET_DATAITEM::m_DefaultTextSize.x = dtmp; + msg = m_textCtrlDefaultTextSizeY->GetValue(); + msg.ToDouble( &dtmp ); + WORKSHEET_DATAITEM::m_DefaultTextSize.y = dtmp; + + msg = m_textCtrlDefaultTextThickness->GetValue(); + msg.ToDouble( &dtmp ); + WORKSHEET_DATAITEM::m_DefaultTextThickness = dtmp; + + // Get page margins values + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + + msg = m_textCtrlRightMargin->GetValue(); + msg.ToDouble( &dtmp ); + pglayout.SetRightMargin( dtmp ); + msg = m_textCtrlDefaultBottomMargin->GetValue(); + msg.ToDouble( &dtmp ); + pglayout.SetBottomMargin( dtmp ); + + // cordinates of the left top corner are the left and top margins + msg = m_textCtrlLeftMargin->GetValue(); + msg.ToDouble( &dtmp ); + pglayout.SetLeftMargin( dtmp ); + msg = m_textCtrlTopMargin->GetValue(); + msg.ToDouble( &dtmp ); + pglayout.SetTopMargin( dtmp ); + + return true; +} + +// Data transfert from item to widgets in properties frame +void PROPERTIES_FRAME::CopyPrmsFromItemToPanel( WORKSHEET_DATAITEM* aItem ) +{ + wxString msg; + + // Set parameters common to all WORKSHEET_DATAITEM types + m_textCtrlType->SetValue( aItem->GetClassName() ); + m_textCtrlComment->SetValue( aItem->m_Info ); + + switch( aItem->GetPage1Option() ) + { + default: + case 0: + m_choicePageOpt->SetSelection( 0 ); + break; + + case 1: + m_choicePageOpt->SetSelection( 1 ); + break; + + case -1: + m_choicePageOpt->SetSelection( 2 ); + break; + } + + // Position/ start point + msg.Printf( wxT("%.3f"), aItem->m_Pos.m_Pos.x ); + m_textCtrlPosX->SetValue( msg ); + msg.Printf( wxT("%.3f"), aItem->m_Pos.m_Pos.y ); + m_textCtrlPosY->SetValue( msg ); + switch( aItem->m_Pos.m_Anchor ) + { + case RB_CORNER: // right bottom corner + m_comboBoxCornerPos->SetSelection( 2 ); break; + case RT_CORNER: // right top corner + m_comboBoxCornerPos->SetSelection( 0 ); break; + case LB_CORNER: // left bottom corner + m_comboBoxCornerPos->SetSelection( 3 ); break; + case LT_CORNER: // left top corner + m_comboBoxCornerPos->SetSelection( 1 ); break; + } + + // End point + msg.Printf( wxT("%.3f"), aItem->m_End.m_Pos.x ); + m_textCtrlEndX->SetValue( msg ); + msg.Printf( wxT("%.3f"), aItem->m_End.m_Pos.y ); + m_textCtrlEndY->SetValue( msg ); + switch( aItem->m_End.m_Anchor ) + { + case RB_CORNER: // right bottom corner + m_comboBoxCornerEnd->SetSelection( 2 ); break; + case RT_CORNER: // right top corner + m_comboBoxCornerEnd->SetSelection( 0 ); break; + case LB_CORNER: // left bottom corner + m_comboBoxCornerEnd->SetSelection( 3 ); break; + case LT_CORNER: // left top corner + m_comboBoxCornerEnd->SetSelection( 1 ); break; + } + + msg.Printf( wxT("%.3f"), aItem->m_LineWidth ); + m_textCtrlThickness->SetValue( msg ); + + // Now, set prms more specific to WORKSHEET_DATAITEM types + // For a given type, disable widgets which are not relevant, + // and be sure widgets which are relevant are enabled + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_TEXT ) + { + m_SizerTextOptions->Show(true); + m_SizerTextIncrementLabel->Show( true ); + + WORKSHEET_DATAITEM_TEXT* item = (WORKSHEET_DATAITEM_TEXT*) aItem; + wxString text = item->m_TextBase; + text.Replace(wxT("\\n"), wxT("\n") ); + m_textCtrlText->SetValue( text ); + + msg.Printf( wxT("%d"), item->m_IncrementLabel ); + m_textCtrlTextIncrement->SetValue( msg ); + + // Rotation (poly and text) + msg.Printf( wxT("%.3f"), item->m_Orient ); + m_textCtrlRotation->SetValue( msg ); + + // Constraints: + msg.Printf( wxT("%.3f"), item->m_BoundingBoxSize.x ); + m_textCtrlConstraintX->SetValue( msg ); + msg.Printf( wxT("%.3f"), item->m_BoundingBoxSize.y ); + m_textCtrlConstraintY->SetValue( msg ); + + // Font Options + m_checkBoxBold->SetValue( item->IsBold() ); + m_checkBoxItalic->SetValue( item->IsItalic() ); + switch( item->m_Hjustify ) + { + case GR_TEXT_HJUSTIFY_LEFT: m_choiceHjustify->SetSelection( 0 ); break; + case GR_TEXT_HJUSTIFY_CENTER: m_choiceHjustify->SetSelection( 1 ); break; + case GR_TEXT_HJUSTIFY_RIGHT: m_choiceHjustify->SetSelection( 2 ); break; + } + switch( item->m_Vjustify ) + { + case GR_TEXT_VJUSTIFY_TOP: m_choiceVjustify->SetSelection( 0 ); break; + case GR_TEXT_VJUSTIFY_CENTER: m_choiceVjustify->SetSelection( 1 ); break; + case GR_TEXT_VJUSTIFY_BOTTOM: m_choiceVjustify->SetSelection( 2 ); break; + } + + // Text size + msg.Printf( wxT("%.3f"), item->m_TextSize.x ); + m_textCtrlTextSizeX->SetValue( msg ); + msg.Printf( wxT("%.3f"), item->m_TextSize.y ); + m_textCtrlTextSizeY->SetValue( msg ); + } + else + { + m_SizerTextOptions->Show(false); + m_SizerTextIncrementLabel->Show(false); + } + + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_POLYPOLYGON ) + { + m_staticTextInfoThickness->Show( false ); + + WORKSHEET_DATAITEM_POLYPOLYGON* item = (WORKSHEET_DATAITEM_POLYPOLYGON*) aItem; + // Rotation (poly and text) + msg.Printf( wxT("%.3f"), item->m_Orient ); + m_textCtrlRotation->SetValue( msg ); + } + else + { + m_staticTextInfoThickness->Show( true ); + } + + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_SEGMENT || + aItem->GetType() == WORKSHEET_DATAITEM::WS_RECT ) + { + m_SizerRotation->Show( false ); + m_SizerEndPosition->Show(true); + } + else + { + m_SizerRotation->Show( true ); + m_SizerEndPosition->Show(false); + } + + // Repeat parameters + msg.Printf( wxT("%d"), aItem->m_RepeatCount ); + m_textCtrlRepeatCount->SetValue( msg ); + msg.Printf( wxT("%.3f"), aItem->m_IncrementVector.x ); + m_textCtrlStepX->SetValue( msg ); + msg.Printf( wxT("%.3f"), aItem->m_IncrementVector.y ); + m_textCtrlStepY->SetValue( msg ); + + // The number of widgets was modified + m_swItemProperties->Layout(); + m_swItemProperties->Refresh(); +} + +// Event function called by clicking on the OK button +void PROPERTIES_FRAME::OnAcceptPrms( wxCommandEvent& event ) +{ + m_parent->SaveCopyInUndoList(); + + WORKSHEET_DATAITEM* item = m_parent->GetSelectedItem(); + if( item ) + CopyPrmsFromPanelToItem( item ); + + CopyPrmsFromPanelToGeneral(); + + m_parent->OnModify(); + m_parent->GetCanvas()->Refresh(); +} + +void PROPERTIES_FRAME::OnSetDefaultValues( wxCommandEvent& event ) +{ + WORKSHEET_DATAITEM::m_DefaultTextSize = + DSIZE( TB_DEFAULT_TEXTSIZE, TB_DEFAULT_TEXTSIZE ); + // default thickness in mm + WORKSHEET_DATAITEM::m_DefaultLineWidth = 0.15; + WORKSHEET_DATAITEM::m_DefaultTextThickness = 0.15; + + CopyPrmsFromGeneralToPanel(); + m_parent->GetCanvas()->Refresh(); +} + + +// Data transfert from properties frame to item parameters +bool PROPERTIES_FRAME::CopyPrmsFromPanelToItem( WORKSHEET_DATAITEM* aItem ) +{ + if( aItem == NULL ) + return false; + + double dtmp; + wxString msg; + + // Import common parameters: + aItem->m_Info = m_textCtrlComment->GetValue(); + + switch( m_choicePageOpt->GetSelection() ) + { + default: + case 0: + aItem->SetPage1Option( 0 ); + break; + + case 1: + aItem->SetPage1Option( 1 ); + break; + + case 2: + aItem->SetPage1Option( -1 ); + break; + } + + // Import thickness + msg = m_textCtrlThickness->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_LineWidth = dtmp; + + // Import Start point + msg = m_textCtrlPosX->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_Pos.m_Pos.x = dtmp; + + msg = m_textCtrlPosY->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_Pos.m_Pos.y = dtmp; + + switch( m_comboBoxCornerPos->GetSelection() ) + { + case 2: aItem->m_Pos.m_Anchor = RB_CORNER; break; + case 0: aItem->m_Pos.m_Anchor = RT_CORNER; break; + case 3: aItem->m_Pos.m_Anchor = LB_CORNER; break; + case 1: aItem->m_Pos.m_Anchor = LT_CORNER; break; + } + + // Import End point + msg = m_textCtrlEndX->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_End.m_Pos.x = dtmp; + + msg = m_textCtrlEndY->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_End.m_Pos.y = dtmp; + + switch( m_comboBoxCornerEnd->GetSelection() ) + { + case 2: aItem->m_End.m_Anchor = RB_CORNER; break; + case 0: aItem->m_End.m_Anchor = RT_CORNER; break; + case 3: aItem->m_End.m_Anchor = LB_CORNER; break; + case 1: aItem->m_End.m_Anchor = LT_CORNER; break; + } + + // Import Repeat prms + long itmp; + msg = m_textCtrlRepeatCount->GetValue(); + msg.ToLong( &itmp ); + aItem->m_RepeatCount = itmp; + + msg = m_textCtrlStepX->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_IncrementVector.x = dtmp; + + msg = m_textCtrlStepY->GetValue(); + msg.ToDouble( &dtmp ); + aItem->m_IncrementVector.y = dtmp; + + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_TEXT ) + { + WORKSHEET_DATAITEM_TEXT* item = (WORKSHEET_DATAITEM_TEXT*) aItem; + + item->m_TextBase = m_textCtrlText->GetValue(); + item->m_TextBase.Replace( wxT("\n"), wxT("\\n") ); + + msg = m_textCtrlTextIncrement->GetValue(); + msg.ToLong( &itmp ); + item->m_IncrementLabel = itmp; + + item->SetBold( m_checkBoxBold->IsChecked() ); + item->SetItalic( m_checkBoxItalic->IsChecked() ); + + switch( m_choiceHjustify->GetSelection() ) + { + case 0: item->m_Hjustify = GR_TEXT_HJUSTIFY_LEFT; break; + case 1: item->m_Hjustify = GR_TEXT_HJUSTIFY_CENTER; break; + case 2: item->m_Hjustify = GR_TEXT_HJUSTIFY_RIGHT; break; + } + switch( m_choiceVjustify->GetSelection() ) + { + case 0: item->m_Vjustify = GR_TEXT_VJUSTIFY_TOP; break; + case 1: item->m_Vjustify = GR_TEXT_VJUSTIFY_CENTER; break; + case 2: item->m_Vjustify = GR_TEXT_VJUSTIFY_BOTTOM; break; + } + + msg = m_textCtrlRotation->GetValue(); + msg.ToDouble( &dtmp ); + item->m_Orient = dtmp; + + // Import text size + msg = m_textCtrlTextSizeX->GetValue(); + msg.ToDouble( &dtmp ); + item->m_TextSize.x = dtmp; + + msg = m_textCtrlTextSizeY->GetValue(); + msg.ToDouble( &dtmp ); + item->m_TextSize.y = dtmp; + + // Import constraints: + msg = m_textCtrlConstraintX->GetValue(); + msg.ToDouble( &dtmp ); + item->m_BoundingBoxSize.x = dtmp; + + msg = m_textCtrlConstraintY->GetValue(); + msg.ToDouble( &dtmp ); + item->m_BoundingBoxSize.y = dtmp; + } + + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_POLYPOLYGON ) + { + WORKSHEET_DATAITEM_POLYPOLYGON* item = (WORKSHEET_DATAITEM_POLYPOLYGON*) aItem; + + msg = m_textCtrlRotation->GetValue(); + msg.ToDouble( &dtmp ); + item->m_Orient = dtmp; + } + + return true; +} + diff --git a/pagelayout_editor/properties_frame.h b/pagelayout_editor/properties_frame.h new file mode 100644 index 0000000000..e603cac5e8 --- /dev/null +++ b/pagelayout_editor/properties_frame.h @@ -0,0 +1,70 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file properties_frame.h + */ + +#ifndef _PROPERTIES_FRAME_H +#define _PROPERTIES_FRAME_H + +#include +#include +#include + +class WORKSHEET_DATAITEM; + +/** + * Class PROPERTIES_FRAME display properties of the current item. + */ + +class PROPERTIES_FRAME : public PANEL_PROPERTIES_BASE +{ + PL_EDITOR_FRAME* m_parent; + +public: + PROPERTIES_FRAME( PL_EDITOR_FRAME* aParent ); + ~PROPERTIES_FRAME(); + + // Event functions + void OnAcceptPrms( wxCommandEvent& event ); + void OnSetDefaultValues( wxCommandEvent& event ); + + + // Data transfert from general properties to widgets + void CopyPrmsFromGeneralToPanel(); + + // Data transfert from widgets to general properties + bool CopyPrmsFromPanelToGeneral(); + + // Data transfert from item to widgets in properties frame + void CopyPrmsFromItemToPanel( WORKSHEET_DATAITEM* aItem ); + + // Data transfert from widgets in properties frame to item + bool CopyPrmsFromPanelToItem( WORKSHEET_DATAITEM* aItem ); + + wxSize GetMinSize() const; +}; + +#endif /* _PROPERTIES_FRAME_H */ diff --git a/pagelayout_editor/toolbars_pl_editor.cpp b/pagelayout_editor/toolbars_pl_editor.cpp new file mode 100644 index 0000000000..e11232273e --- /dev/null +++ b/pagelayout_editor/toolbars_pl_editor.cpp @@ -0,0 +1,166 @@ + +/** + * @file toolbars_gerber.cpp + * @brief Build tool bars + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#include +#include +#include +#include +#include +#include + +void PL_EDITOR_FRAME::ReCreateHToolbar( void ) +{ + if( m_mainToolBar != NULL ) + return; + + wxString msg; + + // Standard file commands + m_mainToolBar = new wxAuiToolBar( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, + wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_HORZ_LAYOUT ); + + m_mainToolBar->AddTool( wxID_NEW, wxEmptyString, KiBitmap( pagelayout_new_xpm ), + _( "New page layout design" ) ); + + m_mainToolBar->AddTool( wxID_OPEN, wxEmptyString, KiBitmap( pagelayout_load_xpm ), + _( "Load a page layout file. Previous data will be deleted" ) ); + + m_mainToolBar->AddTool( wxID_SAVE, wxEmptyString, KiBitmap( save_project_xpm ), + _( "Save page layout design" ) ); + + m_mainToolBar->AddSeparator(); + m_mainToolBar->AddTool( ID_SHEET_SET, wxEmptyString, KiBitmap( sheetset_xpm ), + _( "Page settings" ) ); + + m_mainToolBar->AddTool( wxID_PRINT, wxEmptyString, KiBitmap( print_button_xpm ), + _( "Print page layout" ) ); + + m_mainToolBar->AddSeparator(); + m_mainToolBar->AddTool( wxID_CUT, wxEmptyString, KiBitmap( delete_xpm ), + _( "Delete selected item" ) ); + + m_mainToolBar->AddSeparator(); + m_mainToolBar->AddTool( wxID_UNDO, wxEmptyString, + KiBitmap( undo_xpm ), wxEmptyString ); + m_mainToolBar->AddTool( wxID_REDO, wxEmptyString, + KiBitmap( redo_xpm ), wxEmptyString ); + + // Standard Zoom controls: + m_mainToolBar->AddSeparator(); + msg = AddHotkeyName( _( "Zoom in" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_IN, IS_COMMENT ); + m_mainToolBar->AddTool( ID_ZOOM_IN, wxEmptyString, KiBitmap( zoom_in_xpm ), msg ); + + msg = AddHotkeyName( _( "Zoom out" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_OUT, IS_COMMENT ); + m_mainToolBar->AddTool( ID_ZOOM_OUT, wxEmptyString, KiBitmap( zoom_out_xpm ), msg ); + + msg = AddHotkeyName( _( "Redraw view" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_REDRAW, IS_COMMENT ); + m_mainToolBar->AddTool( ID_ZOOM_REDRAW, wxEmptyString, KiBitmap( zoom_redraw_xpm ), msg ); + + msg = AddHotkeyName( _( "Zoom auto" ), s_PlEditor_Hokeys_Descr, HK_ZOOM_AUTO, IS_COMMENT ); + m_mainToolBar->AddTool( ID_ZOOM_PAGE, wxEmptyString, KiBitmap( zoom_fit_in_page_xpm ), msg ); + + // Display mode switch + m_mainToolBar->AddSeparator(); + m_mainToolBar->AddTool( ID_SHOW_REAL_MODE, wxEmptyString, KiBitmap( pagelayout_normal_view_mode_xpm ), + _( "Show title block like it will be displayed in applications\n" + "texts with format are replaced by the full text"), + wxITEM_CHECK ); + m_mainToolBar->AddTool( ID_SHOW_LPEDITOR_MODE, wxEmptyString, KiBitmap( pagelayout_special_view_mode_xpm ), + _( "how title block in edit mode: texts are shown as is\n" + "texts with format are displayed with no change"), + wxITEM_CHECK ); + + m_mainToolBar->AddSeparator(); + + wxString choiceList[5] = + { + _("Left Top paper corner"), + _("Right Bottom page corner"), + _("Left Bottom page corner"), + _("Right Top page corner"), + _("Left Top page corner") + }; + + m_originSelectBox = new wxChoice( m_mainToolBar, ID_SELECT_COORDINATE_ORIGIN, + wxDefaultPosition, wxDefaultSize, + 5, choiceList ); + m_mainToolBar->AddControl( m_originSelectBox ); + m_originSelectBox->SetToolTip( _(" Origin of coordinates displayed to the status bar") ); + + int minwidth = 0; + for( int ii = 0; ii < 5; ii++ ) + { + int width = GetTextSize( choiceList[ii], m_originSelectBox ).x; + minwidth = std::max( minwidth, width ); + } + m_originSelectBox->SetMinSize( wxSize( minwidth, -1 ) ); + m_originSelectBox->SetSelection( m_originSelectChoice ); + + wxString pageList[5] = + { + _("Page 1"), + _("Other pages") + }; + + m_pageSelectBox = new wxChoice( m_mainToolBar, ID_SELECT_PAGE_NUMBER, + wxDefaultPosition, wxDefaultSize, + 2, pageList ); + m_mainToolBar->AddControl( m_pageSelectBox ); + m_pageSelectBox->SetToolTip( _("Simulate page 1 or other pages to show how items\n"\ + "which are not on all page are displayed") ); + m_pageSelectBox->SetSelection( 0 ); + + + // after adding the buttons to the toolbar, must call Realize() to reflect the changes + m_mainToolBar->Realize(); +} + + +void PL_EDITOR_FRAME::ReCreateVToolbar( void ) +{ + if( m_drawToolBar ) + return; + + m_drawToolBar = new wxAuiToolBar( this, ID_V_TOOLBAR, wxDefaultPosition, wxDefaultSize, + wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_VERTICAL ); + + // Set up toolbar + m_drawToolBar->AddTool( ID_NO_TOOL_SELECTED, wxEmptyString, KiBitmap( cursor_xpm ) ); + m_drawToolBar->AddSeparator(); + + m_drawToolBar->Realize(); +} + + +void PL_EDITOR_FRAME::ReCreateOptToolbar( void ) +{ +} diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index fa681e4faf..d01a1d579a 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -267,23 +267,19 @@ if (KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES) get_directory_property( DirDefs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS ) foreach( d ${DirDefs} ) - set(SWIG_FLAGS ${SWIG_FLAGS} -D${d} ) + set( SWIG_FLAGS ${SWIG_FLAGS} -D${d} ) endforeach() - # check if we have IO_MGR and KICAD_PLUGIN available - if ( USE_NEW_PCBNEW_LOAD OR USE_NEW_PCBNEW_SAVE ) - set(SWIG_FLAGS ${SWIG_FLAGS} -DBUILD_WITH_PLUGIN) - endif(USE_NEW_PCBNEW_LOAD OR USE_NEW_PCBNEW_SAVE) - - if ( USE_PCBNEW_NANOMETRES ) - set(SWIG_FLAGS ${SWIG_FLAGS} -DUSE_PCBNEW_NANOMETRES) + if( USE_PCBNEW_NANOMETRES ) + set( SWIG_FLAGS ${SWIG_FLAGS} -DUSE_PCBNEW_NANOMETRES ) endif( USE_PCBNEW_NANOMETRES ) endif(KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES) + if (KICAD_SCRIPTING) - set(SWIG_OPTS -python -c++ -outdir ${CMAKE_CURRENT_BINARY_DIR} ${SWIG_FLAGS} ) + set( SWIG_OPTS -python -c++ -outdir ${CMAKE_CURRENT_BINARY_DIR} ${SWIG_FLAGS} ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcbnew_wrap.cxx DEPENDS pcbcommon @@ -316,6 +312,8 @@ endif() if (KICAD_SCRIPTING_MODULES) + #message( "building pcbnew scripting" ) + set(CMAKE_SWIG_FLAGS ${SWIG_FLAGS}) set_source_files_properties(scripting/pcbnew.i PROPERTIES CPLUSPLUS ON) swig_add_module(pcbnew python scripting/pcbnew.i ${PCBNEW_SCRIPTING_PYTHON_HELPERS} ${PCBNEW_SRCS} ${PCBNEW_COMMON_SRCS}) diff --git a/pcbnew/class_drawsegment.cpp b/pcbnew/class_drawsegment.cpp index 1bebc0221a..2a6fb5ef39 100644 --- a/pcbnew/class_drawsegment.cpp +++ b/pcbnew/class_drawsegment.cpp @@ -56,9 +56,11 @@ DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* aParent, KICAD_T idtype ) : BOARD_ITEM( aParent, idtype ) { - m_Width = m_Type = m_Angle = 0; + m_Type = 0; + m_Angle = 0; m_Flags = 0; m_Shape = S_SEGMENT; + m_Width = Millimeter2iu( 0.15 ); // Gives a decent width } diff --git a/pcbnew/class_edge_mod.cpp b/pcbnew/class_edge_mod.cpp index 5fb4dcc006..8c834d9290 100644 --- a/pcbnew/class_edge_mod.cpp +++ b/pcbnew/class_edge_mod.cpp @@ -57,7 +57,7 @@ EDGE_MODULE::EDGE_MODULE( MODULE* parent, STROKE_T aShape ) : { m_Shape = aShape; m_Angle = 0; - m_Width = 120; + m_Layer = SILKSCREEN_N_FRONT; } @@ -251,9 +251,9 @@ void EDGE_MODULE::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) aList.push_back( MSG_PANEL_ITEM( _( "Value" ), module->GetValue(), BLUE ) ); msg.Printf( wxT( "%8.8lX" ), module->GetTimeStamp() ); aList.push_back( MSG_PANEL_ITEM( _( "TimeStamp" ), msg, BROWN ) ); - aList.push_back( MSG_PANEL_ITEM( _( "Mod Layer" ), + aList.push_back( MSG_PANEL_ITEM( _( "Mod Layer" ), module->GetLayerName(), RED ) ); - aList.push_back( MSG_PANEL_ITEM( _( "Seg Layer" ), + aList.push_back( MSG_PANEL_ITEM( _( "Seg Layer" ), GetLayerName(), RED ) ); msg = ::CoordinateToString( m_Width ); aList.push_back( MSG_PANEL_ITEM( _( "Width" ), msg, BLUE ) ); diff --git a/pcbnew/class_mire.cpp b/pcbnew/class_mire.cpp index 82d26093c7..e6acf880eb 100644 --- a/pcbnew/class_mire.cpp +++ b/pcbnew/class_mire.cpp @@ -50,7 +50,9 @@ PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent ) : BOARD_ITEM( aParent, PCB_TARGET_T ) { m_Shape = 0; - m_Size = 5000; + m_Size = Millimeter2iu( 5 ); // Gives a decent size + m_Width = Millimeter2iu( 0.15 ); // Gives a decent width + m_Layer = EDGE_N; // a target is on all layers } PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent, int aShape, LAYER_NUM aLayer, diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 2a62d6d901..3950a73147 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -123,12 +123,77 @@ int D_PAD::boundingRadius() const EDA_RECT D_PAD::GetBoundingBox() const { EDA_RECT area; + wxPoint quadrant1, quadrant2, quadrant3, quadrant4; + int x, y, dx, dy; - // radius of pad area, enclosed in minimum sized circle - int radius = boundingRadius(); + switch( GetShape() ) + { + case PAD_CIRCLE: + area.SetOrigin( m_Pos ); + area.Inflate( m_Size.x / 2 ); + break; - area.SetOrigin( m_Pos ); - area.Inflate( radius ); + case PAD_OVAL: + //Use the maximal two most distant points and track their rotation + // (utilise symmetry to avoid four points) + quadrant1.x = m_Size.x/2; + quadrant1.y = 0; + quadrant2.x = 0; + quadrant2.y = m_Size.y/2; + + RotatePoint( &quadrant1, m_Orient ); + RotatePoint( &quadrant2, m_Orient ); + dx = std::max( std::abs( quadrant1.x ) , std::abs( quadrant2.x ) ); + dy = std::max( std::abs( quadrant1.y ) , std::abs( quadrant2.y ) ); + area.SetOrigin( m_Pos.x-dx, m_Pos.y-dy ); + area.SetSize( 2*dx, 2*dy ); + break; + break; + + case PAD_RECT: + //Use two corners and track their rotation + // (utilise symmetry to avoid four points) + quadrant1.x = m_Size.x/2; + quadrant1.y = m_Size.y/2; + quadrant2.x = -m_Size.x/2; + quadrant2.y = m_Size.y/2; + + RotatePoint( &quadrant1, m_Orient ); + RotatePoint( &quadrant2, m_Orient ); + dx = std::max( std::abs( quadrant1.x ) , std::abs( quadrant2.x ) ); + dy = std::max( std::abs( quadrant1.y ) , std::abs( quadrant2.y ) ); + area.SetOrigin( m_Pos.x-dx, m_Pos.y-dy ); + area.SetSize( 2*dx, 2*dy ); + break; + + case PAD_TRAPEZOID: + //Use the four corners and track their rotation + // (Trapezoids will not be symmetric) + quadrant1.x = (m_Size.x + m_DeltaSize.y)/2; + quadrant1.y = (m_Size.y - m_DeltaSize.x)/2; + quadrant2.x = -(m_Size.x + m_DeltaSize.y)/2; + quadrant2.y = (m_Size.y + m_DeltaSize.x)/2; + quadrant3.x = -(m_Size.x - m_DeltaSize.y)/2; + quadrant3.y = -(m_Size.y + m_DeltaSize.x)/2; + quadrant4.x = (m_Size.x - m_DeltaSize.y)/2; + quadrant4.y = -(m_Size.y - m_DeltaSize.x)/2; + + RotatePoint( &quadrant1, m_Orient ); + RotatePoint( &quadrant2, m_Orient ); + RotatePoint( &quadrant3, m_Orient ); + RotatePoint( &quadrant4, m_Orient ); + + x = std::min( quadrant1.x, std::min( quadrant2.x, std::min( quadrant3.x, quadrant4.x) ) ); + y = std::min( quadrant1.y, std::min( quadrant2.y, std::min( quadrant3.y, quadrant4.y) ) ); + dx = std::max( quadrant1.x, std::max( quadrant2.x, std::max( quadrant3.x, quadrant4.x) ) ); + dy = std::max( quadrant1.y, std::max( quadrant2.y, std::max( quadrant3.y, quadrant4.y) ) ); + area.SetOrigin( m_Pos.x+x, m_Pos.y+y ); + area.SetSize( dx-x, dy-y ); + break; + + default: + break; + } return area; } @@ -417,7 +482,7 @@ int D_PAD::GetSolderMaskMargin() const int minsize = -std::min( m_Size.x, m_Size.y ) / 2; if( margin < minsize ) - minsize = minsize; + margin = minsize; } return margin; diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 91029f30ae..a3a8d2b2e7 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -124,7 +124,7 @@ TRACK* GetTrace( TRACK* aStartTrace, TRACK* aEndTrace, const wxPoint& aPosition, TRACK::TRACK( BOARD_ITEM* aParent, KICAD_T idtype ) : BOARD_CONNECTED_ITEM( aParent, idtype ) { - m_Width = 0; + m_Width = Millimeter2iu( 0.2 ); m_Shape = S_SEGMENT; start = end = NULL; SetDrillDefault(); @@ -187,6 +187,7 @@ SEGVIA::SEGVIA( BOARD_ITEM* aParent ) : TRACK( aParent, PCB_VIA_T ) { SetShape( VIA_THROUGH ); + m_Width = Millimeter2iu( 0.5 ); } diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index 798bf3f47d..6b284eb1c7 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -85,7 +85,7 @@ static const LAYER_MSK Std_Pad_Layers[] = { * class DIALOG_PAD_PROPERTIES, derived from DIALOG_PAD_PROPERTIES_BASE, * created by wxFormBuilder */ - class DIALOG_PAD_PROPERTIES : public DIALOG_PAD_PROPERTIES_BASE +class DIALOG_PAD_PROPERTIES : public DIALOG_PAD_PROPERTIES_BASE { public: DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, D_PAD* aPad ); diff --git a/pcbnew/dialogs/dialog_pad_properties_base.cpp b/pcbnew/dialogs/dialog_pad_properties_base.cpp index 5319845ff4..6da97464e5 100644 --- a/pcbnew/dialogs/dialog_pad_properties_base.cpp +++ b/pcbnew/dialogs/dialog_pad_properties_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 8 2012) +// C++ code generated with wxFormBuilder (version Apr 30 2013) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -253,7 +253,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_LeftBoxSizer->Add( sbSizeModuleInfo, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bGeneralSizer->Add( m_LeftBoxSizer, 1, wxALL|wxEXPAND, 5 ); + bGeneralSizer->Add( m_LeftBoxSizer, 3, wxALL|wxEXPAND, 5 ); wxBoxSizer* bSizer10; bSizer10 = new wxBoxSizer( wxVERTICAL ); @@ -287,7 +287,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_PadDrill_X_Ctrl = new wxTextCtrl( m_panelGeneral, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_PadDrill_X_Ctrl->SetMaxLength( 0 ); - fgSizerGeometry->Add( m_PadDrill_X_Ctrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP, 5 ); + fgSizerGeometry->Add( m_PadDrill_X_Ctrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxTOP, 5 ); m_PadDrill_X_Unit = new wxStaticText( m_panelGeneral, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 ); m_PadDrill_X_Unit->Wrap( -1 ); @@ -299,7 +299,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_PadDrill_Y_Ctrl = new wxTextCtrl( m_panelGeneral, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_PadDrill_Y_Ctrl->SetMaxLength( 0 ); - fgSizerGeometry->Add( m_PadDrill_Y_Ctrl, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5 ); + fgSizerGeometry->Add( m_PadDrill_Y_Ctrl, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND|wxLEFT|wxTOP, 5 ); m_PadDrill_Y_Unit = new wxStaticText( m_panelGeneral, wxID_ANY, _("Inch"), wxDefaultPosition, wxDefaultSize, 0 ); m_PadDrill_Y_Unit->Wrap( -1 ); @@ -325,7 +325,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind int m_rbCopperLayersSelNChoices = sizeof( m_rbCopperLayersSelChoices ) / sizeof( wxString ); m_rbCopperLayersSel = new wxChoice( m_panelGeneral, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_rbCopperLayersSelNChoices, m_rbCopperLayersSelChoices, 0 ); m_rbCopperLayersSel->SetSelection( 0 ); - bSizer11->Add( m_rbCopperLayersSel, 1, wxALL, 5 ); + bSizer11->Add( m_rbCopperLayersSel, 1, wxALL|wxEXPAND, 5 ); m_LayersSizer->Add( bSizer11, 0, wxEXPAND, 5 ); @@ -373,7 +373,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind bSizer10->Add( m_LayersSizer, 0, wxALL|wxEXPAND, 5 ); - bGeneralSizer->Add( bSizer10, 0, wxALL|wxEXPAND, 5 ); + bGeneralSizer->Add( bSizer10, 2, wxALL|wxEXPAND, 5 ); m_panelGeneral->SetSizer( bGeneralSizer ); @@ -534,7 +534,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind m_panelShowPad = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( 200,200 ), wxFULL_REPAINT_ON_RESIZE|wxSIMPLE_BORDER ); m_panelShowPad->SetBackgroundColour( wxColour( 0, 0, 0 ) ); - bSizerDisplayPad->Add( m_panelShowPad, 1, wxRIGHT|wxTOP|wxEXPAND, 5 ); + bSizerDisplayPad->Add( m_panelShowPad, 4, wxRIGHT|wxTOP|wxEXPAND, 5 ); bSizerUpper->Add( bSizerDisplayPad, 1, wxEXPAND|wxTOP|wxBOTTOM, 5 ); @@ -560,6 +560,7 @@ DIALOG_PAD_PROPERTIES_BASE::DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWind this->SetSizer( m_MainSizer ); this->Layout(); + m_MainSizer->Fit( this ); this->Centre( wxBOTH ); diff --git a/pcbnew/dialogs/dialog_pad_properties_base.fbp b/pcbnew/dialogs/dialog_pad_properties_base.fbp index 345a9b0ba3..cb8df4557b 100644 --- a/pcbnew/dialogs/dialog_pad_properties_base.fbp +++ b/pcbnew/dialogs/dialog_pad_properties_base.fbp @@ -42,7 +42,7 @@ -1,-1 DIALOG_PAD_PROPERTIES_BASE - 745,725 + -1,-1 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER DIALOG_SHIM; dialog_shim.h Pad Properties @@ -268,8 +268,8 @@ 5 wxALL|wxEXPAND - 1 - + 3 + m_LeftBoxSizer wxVERTICAL @@ -3821,11 +3821,11 @@ - + 5 wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND 0 - + wxID_ANY Parent footprint orientation @@ -3833,11 +3833,11 @@ wxVERTICAL none - + 5 0 - + 2 wxBOTH 1 @@ -4190,17 +4190,17 @@ 5 wxALL|wxEXPAND - 0 - + 2 + bSizer10 wxVERTICAL none - + 5 wxALL|wxEXPAND 0 - + wxID_ANY Drill @@ -4208,11 +4208,11 @@ wxVERTICAL none - + 5 wxEXPAND 0 - + 3 wxBOTH 1 @@ -4563,7 +4563,7 @@ 5 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP + wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxTOP 0 1 @@ -4820,7 +4820,7 @@ 5 - wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND|wxLEFT|wxTOP 0 1 @@ -4996,11 +4996,11 @@ - + 5 wxALL|wxEXPAND 0 - + wxID_ANY Layers @@ -5102,7 +5102,7 @@ 5 - wxALL + wxALL|wxEXPAND 1 1 @@ -8233,7 +8233,7 @@ 5 wxRIGHT|wxTOP|wxEXPAND - 1 + 4 1 1 diff --git a/pcbnew/dialogs/dialog_pad_properties_base.h b/pcbnew/dialogs/dialog_pad_properties_base.h index ad9f285cbd..8a6ffd636d 100644 --- a/pcbnew/dialogs/dialog_pad_properties_base.h +++ b/pcbnew/dialogs/dialog_pad_properties_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 8 2012) +// C++ code generated with wxFormBuilder (version Apr 30 2013) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -162,7 +162,7 @@ class DIALOG_PAD_PROPERTIES_BASE : public DIALOG_SHIM public: - DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_DIALOG_EDIT_PAD, const wxString& title = _("Pad Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 745,725 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSUNKEN_BORDER ); + DIALOG_PAD_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_DIALOG_EDIT_PAD, const wxString& title = _("Pad Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSUNKEN_BORDER ); ~DIALOG_PAD_PROPERTIES_BASE(); }; diff --git a/pcbnew/dialogs/dialog_pcbnew_config_libs_and_paths.cpp b/pcbnew/dialogs/dialog_pcbnew_config_libs_and_paths.cpp index 9d467f5e15..97e545e1cd 100644 --- a/pcbnew/dialogs/dialog_pcbnew_config_libs_and_paths.cpp +++ b/pcbnew/dialogs/dialog_pcbnew_config_libs_and_paths.cpp @@ -152,7 +152,7 @@ void DIALOG_PCBNEW_CONFIG_LIBS::OnOkClick( wxCommandEvent& event ) g_LibraryNames.Add( m_ListLibr->GetString(ii) ); } - GetParent()->SaveProjectSettings(); + GetParent()->SaveProjectSettings( true ); EndModal( wxID_OK ); } diff --git a/pcbnew/dialogs/dialog_set_grid.cpp b/pcbnew/dialogs/dialog_set_grid.cpp index 5b2e288dbc..36527c6df6 100644 --- a/pcbnew/dialogs/dialog_set_grid.cpp +++ b/pcbnew/dialogs/dialog_set_grid.cpp @@ -26,81 +26,90 @@ */ #include +#include #include -#include -#include #include #include #include #include +#include class DIALOG_SET_GRID : public DIALOG_SET_GRID_BASE { public: - DIALOG_SET_GRID( wxWindow* parent, const wxPoint& pos ); - void SetGridSize( const wxRealPoint& grid ); - wxRealPoint GetGridSize(); - void SetGridUnits( int units ); - int GetGridUnits(); - void SetGridOrigin( const wxPoint& grid ); - wxPoint GetGridOrigin(); - void SetGridForFastSwitching( wxArrayString aGrids, int aGrid1, int aGrid2 ); - void GetGridForFastSwitching( int& aGrid1, int& aGrid2 ); + /// This has no dependencies on calling wxFrame derivative, such as PCB_BASE_FRAME. + DIALOG_SET_GRID( wxFrame* aCaller, EDA_UNITS_T* aGridUnits, EDA_UNITS_T aBoardUnits, + wxRealPoint* aUserSize, wxPoint* aOrigin, + int* aFastGrid1, int* aFastGrid2, const wxArrayString& aGridChoices ); private: - void OnResetGridOrgClick( wxCommandEvent& event ); - void OnCancelClick( wxCommandEvent& event ); - void OnOkClick( wxCommandEvent& event ); + void OnResetGridOrgClick( wxCommandEvent& event ); + void OnCancelClick( wxCommandEvent& event ); + void OnOkClick( wxCommandEvent& event ); + + EDA_UNITS_T& m_callers_grid_units; + EDA_UNITS_T m_callers_board_units; + wxRealPoint& m_callers_user_size; + wxPoint& m_callers_origin; + int& m_callers_fast_grid1; + int& m_callers_fast_grid2; + + void setGridUnits( EDA_UNITS_T units ); + EDA_UNITS_T getGridUnits(); + + void setGridSize( const wxRealPoint& grid ); + wxRealPoint getGridSize(); + + void setGridOrigin( const wxPoint& grid ); + wxPoint getGridOrigin(); + + void setGridForFastSwitching( const wxArrayString& aGrids, int aGrid1, int aGrid2 ); + void getGridForFastSwitching( int& aGrid1, int& aGrid2 ); }; -void PCB_BASE_FRAME::InstallGridFrame( const wxPoint& pos ) +DIALOG_SET_GRID::DIALOG_SET_GRID( wxFrame* aCaller, EDA_UNITS_T* aGridUnits, EDA_UNITS_T aBoardUnits, + wxRealPoint* aUserSize, wxPoint* aOrigin, int* aFastGrid1, int* aFastGrid2, const wxArrayString& aGridChoices ): + DIALOG_SET_GRID_BASE( aCaller ), + m_callers_grid_units( *aGridUnits ), + m_callers_board_units( aBoardUnits ), + m_callers_user_size( *aUserSize ), + m_callers_origin( *aOrigin ), + m_callers_fast_grid1( *aFastGrid1 ), + m_callers_fast_grid2( *aFastGrid2 ) { - DIALOG_SET_GRID dlg( this, pos ); + m_TextPosXUnits->SetLabel( GetUnitsLabel( m_callers_board_units ) ); + m_TextPosYUnits->SetLabel( GetUnitsLabel( m_callers_board_units ) ); - dlg.SetGridUnits( m_UserGridUnit ); - dlg.SetGridSize( m_UserGridSize ); - dlg.SetGridOrigin( GetScreen()->m_GridOrigin ); + m_sdbSizer1OK->SetDefault(); // set OK button as default response to 'Enter' key - if( m_gridSelectBox ) - dlg.SetGridForFastSwitching( m_gridSelectBox->GetStrings(), m_FastGrid1, m_FastGrid2 ); + setGridUnits( m_callers_grid_units ); + setGridSize( m_callers_user_size ); + setGridOrigin( m_callers_origin ); + setGridForFastSwitching( aGridChoices, m_callers_fast_grid1, m_callers_fast_grid2 ); - if( dlg.ShowModal() == wxID_CANCEL ) - return; - - m_UserGridSize = dlg.GetGridSize(); - m_UserGridUnit = (EDA_UNITS_T) dlg.GetGridUnits(); - GetScreen()->m_GridOrigin = dlg.GetGridOrigin(); - - GetScreen()->AddGrid( m_UserGridSize, m_UserGridUnit, ID_POPUP_GRID_USER ); - - dlg.GetGridForFastSwitching( m_FastGrid1, m_FastGrid2 ); - - // If the user grid is the current option, recall SetGrid() - // to force new values put in list as current grid value - if( GetScreen()->GetGridId() == ID_POPUP_GRID_USER ) - GetScreen()->SetGrid( ID_POPUP_GRID_USER ); - - m_canvas->Refresh(); -} - - -DIALOG_SET_GRID::DIALOG_SET_GRID( wxWindow* parent, const wxPoint& pos ) : - DIALOG_SET_GRID_BASE( parent ) -{ - m_TextPosXUnits->SetLabel( GetUnitsLabel( g_UserUnit ) ); - m_TextPosYUnits->SetLabel( GetUnitsLabel( g_UserUnit ) ); - - m_sdbSizer1OK->SetDefault(); GetSizer()->SetSizeHints( this ); + Fit(); Centre(); } -void DIALOG_SET_GRID::SetGridSize( const wxRealPoint& grid ) +void DIALOG_SET_GRID::setGridUnits( EDA_UNITS_T aUnits ) +{ + m_UnitGrid->SetSelection( aUnits != INCHES ); +} + + +EDA_UNITS_T DIALOG_SET_GRID::getGridUnits() +{ + return m_UnitGrid->GetSelection() == 0 ? INCHES : MILLIMETRES; +} + + +void DIALOG_SET_GRID::setGridSize( const wxRealPoint& grid ) { wxString msg; @@ -112,37 +121,26 @@ void DIALOG_SET_GRID::SetGridSize( const wxRealPoint& grid ) } -wxRealPoint DIALOG_SET_GRID::GetGridSize() +wxRealPoint DIALOG_SET_GRID::getGridSize() { wxRealPoint grid; + // @todo: Some error checking here would be a good thing. + wxString x = m_OptGridSizeX->GetValue(); + wxString y = m_OptGridSizeY->GetValue(); - /* TODO: Some error checking here would be a good thing. */ - m_OptGridSizeX->GetValue().ToDouble( &grid.x ); - m_OptGridSizeY->GetValue().ToDouble( &grid.y ); + x.ToDouble( &grid.x ); + y.ToDouble( &grid.y ); return grid; } -void DIALOG_SET_GRID::SetGridUnits( int units ) -{ - if( units != INCHES ) - m_UnitGrid->SetSelection( 1 ); -} - - -int DIALOG_SET_GRID::GetGridUnits() -{ - return m_UnitGrid->GetSelection(); -} - - -wxPoint DIALOG_SET_GRID::GetGridOrigin() +wxPoint DIALOG_SET_GRID::getGridOrigin() { wxPoint grid; - /* TODO: Some error checking here would be a good thing. */ + // @todo Some error checking here would be a good thing. grid.x = ReturnValueFromTextCtrl( *m_GridOriginXCtrl ); grid.y = ReturnValueFromTextCtrl( *m_GridOriginYCtrl ); @@ -150,16 +148,14 @@ wxPoint DIALOG_SET_GRID::GetGridOrigin() } -void DIALOG_SET_GRID::SetGridOrigin( const wxPoint& grid ) +void DIALOG_SET_GRID::setGridOrigin( const wxPoint& grid ) { - wxString msg; - PutValueInLocalUnits( *m_GridOriginXCtrl, grid.x ); PutValueInLocalUnits( *m_GridOriginYCtrl, grid.y ); } -void DIALOG_SET_GRID::SetGridForFastSwitching( wxArrayString aGrids, int aGrid1, int aGrid2 ) +void DIALOG_SET_GRID::setGridForFastSwitching( const wxArrayString& aGrids, int aGrid1, int aGrid2 ) { m_comboBoxGrid1->Append( aGrids ); m_comboBoxGrid2->Append( aGrids ); @@ -169,7 +165,7 @@ void DIALOG_SET_GRID::SetGridForFastSwitching( wxArrayString aGrids, int aGrid1, } -void DIALOG_SET_GRID::GetGridForFastSwitching( int& aGrid1, int& aGrid2 ) +void DIALOG_SET_GRID::getGridForFastSwitching( int& aGrid1, int& aGrid2 ) { aGrid1 = m_comboBoxGrid1->GetSelection(); aGrid2 = m_comboBoxGrid2->GetSelection(); @@ -178,7 +174,7 @@ void DIALOG_SET_GRID::GetGridForFastSwitching( int& aGrid1, int& aGrid2 ) void DIALOG_SET_GRID::OnResetGridOrgClick( wxCommandEvent& event ) { - SetGridOrigin( wxPoint(0,0) ); + setGridOrigin( wxPoint( 0, 0 ) ); } @@ -190,5 +186,40 @@ void DIALOG_SET_GRID::OnCancelClick( wxCommandEvent& event ) void DIALOG_SET_GRID::OnOkClick( wxCommandEvent& event ) { + m_callers_grid_units = getGridUnits(); + m_callers_user_size = getGridSize(); + m_callers_origin = getGridOrigin(); + + getGridForFastSwitching( m_callers_fast_grid1, m_callers_fast_grid2 ); + EndModal( wxID_OK ); } + + +#include +#include + +bool PCB_BASE_FRAME::InvokeDialogGrid() +{ + DIALOG_SET_GRID dlg( this, &m_UserGridUnit, g_UserUnit, &m_UserGridSize, + &GetScreen()->m_GridOrigin, &m_FastGrid1, &m_FastGrid2, + m_gridSelectBox->GetStrings() ); + + int ret = dlg.ShowModal(); + + if( ret == wxID_OK ) + { + GetScreen()->AddGrid( m_UserGridSize, m_UserGridUnit, ID_POPUP_GRID_USER ); + + // If the user grid is the current option, recall SetGrid() + // to force new values put in list as current grid value + if( GetScreen()->GetGridId() == ID_POPUP_GRID_USER ) + GetScreen()->SetGrid( ID_POPUP_GRID_USER ); + + m_canvas->Refresh(); + + return true; + } + + return false; +} diff --git a/pcbnew/dialogs/dialog_set_grid_base.cpp b/pcbnew/dialogs/dialog_set_grid_base.cpp index 306566344d..d28f7b7d8c 100644 --- a/pcbnew/dialogs/dialog_set_grid_base.cpp +++ b/pcbnew/dialogs/dialog_set_grid_base.cpp @@ -114,15 +114,15 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con m_staticTextGrid1->Wrap( -1 ); fgSizer3->Add( m_staticTextGrid1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT|wxTOP, 5 ); - m_comboBoxGrid1 = new wxComboBox( this, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - fgSizer3->Add( m_comboBoxGrid1, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); + m_comboBoxGrid1 = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + fgSizer3->Add( m_comboBoxGrid1, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); m_staticTextGrid2 = new wxStaticText( this, wxID_ANY, _("Grid 2:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextGrid2->Wrap( -1 ); fgSizer3->Add( m_staticTextGrid2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxTOP, 5 ); - m_comboBoxGrid2 = new wxComboBox( this, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - fgSizer3->Add( m_comboBoxGrid2, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + m_comboBoxGrid2 = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + fgSizer3->Add( m_comboBoxGrid2, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); sbSizer4->Add( fgSizer3, 1, wxALL|wxEXPAND, 5 ); diff --git a/pcbnew/dialogs/dialog_set_grid_base.fbp b/pcbnew/dialogs/dialog_set_grid_base.fbp index f409d50996..e03ad55b27 100644 --- a/pcbnew/dialogs/dialog_set_grid_base.fbp +++ b/pcbnew/dialogs/dialog_set_grid_base.fbp @@ -1327,7 +1327,7 @@ 5 wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP - 0 + 1 1 1 @@ -1383,7 +1383,7 @@ wxFILTER_NONE wxDefaultValidator - Combo! + @@ -1501,7 +1501,7 @@ 5 wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 0 + 1 1 1 @@ -1557,7 +1557,7 @@ wxFILTER_NONE wxDefaultValidator - Combo! + diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index c89dfc68dc..0a2fb5434f 100755 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -1129,16 +1129,16 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_PCB_USER_GRID_SETUP: - InstallGridFrame( pos ); + InvokeDialogGrid(); break; case ID_POPUP_PCB_DISPLAY_FOOTPRINT_DOC: - { - wxConfig* cfg = wxGetApp().GetCommonSettings(); - cfg->Read( wxT( "module_doc_file" ), g_DocModulesFileName ); - GetAssociatedDocument( this, g_DocModulesFileName, &wxGetApp().GetLibraryPathList() ); - } - break; + { + wxConfig* cfg = wxGetApp().GetCommonSettings(); + cfg->Read( wxT( "module_doc_file" ), g_DocModulesFileName ); + GetAssociatedDocument( this, g_DocModulesFileName, &wxGetApp().GetLibraryPathList() ); + } + break; case ID_MENU_ARCHIVE_NEW_MODULES: ArchiveModulesOnBoard( wxEmptyString, true ); @@ -1201,15 +1201,14 @@ void PCB_EDIT_FRAME::RemoveStruct( BOARD_ITEM* Item, wxDC* DC ) break; case PCB_ZONE_AREA_T: - { - SetCurItem( NULL ); - int netcode = ( (ZONE_CONTAINER*) Item )->GetNet(); - Delete_Zone_Contour( DC, (ZONE_CONTAINER*) Item ); - TestNetConnection( NULL, netcode ); - SetMsgPanel( GetBoard() ); - } - - break; + { + SetCurItem( NULL ); + int netcode = ( (ZONE_CONTAINER*) Item )->GetNet(); + Delete_Zone_Contour( DC, (ZONE_CONTAINER*) Item ); + TestNetConnection( NULL, netcode ); + SetMsgPanel( GetBoard() ); + } + break; case PCB_MARKER_T: if( Item == GetCurItem() ) @@ -1229,12 +1228,12 @@ void PCB_EDIT_FRAME::RemoveStruct( BOARD_ITEM* Item, wxDC* DC ) case TYPE_NOT_INIT: case PCB_T: default: - { - wxString Line; - Line.Printf( wxT( "Remove: item type %d unknown." ), Item->Type() ); - DisplayError( this, Line ); - } - break; + { + wxString msg = wxString::Format( + wxT( "Remove: item type %d unknown." ), Item->Type() ); + DisplayError( this, msg ); + } + break; } } diff --git a/pcbnew/invoke_pcb_dialog.h b/pcbnew/invoke_pcb_dialog.h index c6736ae981..273fd5417b 100644 --- a/pcbnew/invoke_pcb_dialog.h +++ b/pcbnew/invoke_pcb_dialog.h @@ -43,6 +43,10 @@ class wxFrame; class wxDialog; +class wxPoint; +class wxSize; +class wxRealPoint; + // Often this is not used in the prototypes, since wxFrame is good enough and would // represent maximum information hiding. @@ -64,6 +68,4 @@ wxDialog* InvokeDialogERC( SCH_EDIT_FRAME* aCaller ); int InvokeDialogPrintUsingPrinter( SCH_EDIT_FRAME* aCaller ); */ - - #endif // INVOKE_A_DIALOG_H_ diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index 825a3383da..287deee5cb 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -30,6 +30,7 @@ #include #include <3d_struct.h> #include +#include #include #include @@ -62,43 +63,6 @@ using namespace std; */ static const wxString traceFootprintLibrary( wxT( "KicadFootprintLib" ) ); -// Helper function to print a float number without using scientific notation -// and no trailing 0 -// We want to avoid scientific notation in S-expr files (not easy to read) -// for floating numbers. -// So we cannot always just use the %g or the %f format to print a fp number -// this helper function uses the %f format when needed, or %g when %f is -// not well working and then removes trailing 0 - -std::string double2str( double aValue ) -{ - char buf[50]; - int len; - - if( aValue != 0.0 && fabs( aValue ) <= 0.0001 ) - { - // For these small values, %f works fine, - // and %g gives an exponent - len = sprintf( buf, "%.16f", aValue ); - - while( --len > 0 && buf[len] == '0' ) - buf[len] = '\0'; - - if( buf[len] == '.' ) - buf[len] = '\0'; - else - ++len; - } - else - { - // For these values, %g works fine, and sometimes %f - // gives a bad value (try aValue = 1.222222222222, with %.16f format!) - len = sprintf( buf, "%.16g", aValue ); - } - - return std::string( buf, len );; -} - /** * Class FP_CACHE_ITEM @@ -156,9 +120,9 @@ class FP_CACHE public: FP_CACHE( PCB_IO* aOwner, const wxString& aLibraryPath ); - wxString GetPath() const { return m_lib_path.GetPath(); } - wxDateTime GetLastModificationTime() const { return m_mod_time; } - bool IsWritable() const { return m_lib_path.IsOk() && m_lib_path.IsDirWritable(); } + wxString GetPath() const { return m_lib_path.GetPath(); } + wxDateTime GetLastModificationTime() const { return m_mod_time; } + bool IsWritable() const { return m_lib_path.IsOk() && m_lib_path.IsDirWritable(); } MODULE_MAP& GetModules() { return m_modules; } // Most all functions in this class throw IO_ERROR exceptions. There are no @@ -217,8 +181,7 @@ void FP_CACHE::Save() // Allow file output stream to go out of scope to close the file stream before // renaming the file. { - wxLogTrace( traceFootprintLibrary, wxT( "Creating temporary library file %s" ), - GetChars( tempFileName ) ); + // wxLogTrace( traceFootprintLibrary, wxT( "Creating temporary library file %s" ), GetChars( tempFileName ) ); FILE_OUTPUTFORMATTER formatter( tempFileName ); @@ -254,26 +217,28 @@ void FP_CACHE::Load() wxString fpFileName; wxString wildcard = wxT( "*." ) + KiCadFootprintFileExtension; - if( !dir.GetFirst( &fpFileName, wildcard, wxDIR_FILES ) ) - return; - - do + if( dir.GetFirst( &fpFileName, wildcard, wxDIR_FILES ) ) { - // reader now owns fp, will close on exception or return - FILE_LINE_READER reader( fpFileName ); + do + { + // prepend the libpath into fullPath + wxFileName fullPath( m_lib_path.GetPath(), fpFileName ); - m_owner->m_parser->SetLineReader( &reader ); + FILE_LINE_READER reader( fullPath.GetFullPath() ); - std::string name = TO_UTF8( fpFileName ); + m_owner->m_parser->SetLineReader( &reader ); - m_modules.insert( name, new FP_CACHE_ITEM( (MODULE*) m_owner->m_parser->Parse(), fpFileName ) ); + std::string name = TO_UTF8( fpFileName ); - } while( dir.GetNext( &fpFileName ) ); + m_modules.insert( name, new FP_CACHE_ITEM( (MODULE*) m_owner->m_parser->Parse(), fpFileName ) ); - // Remember the file modification time of library file when the - // cache snapshot was made, so that in a networked environment we will - // reload the cache as needed. - m_mod_time = GetLibModificationTime(); + } while( dir.GetNext( &fpFileName ) ); + + // Remember the file modification time of library file when the + // cache snapshot was made, so that in a networked environment we will + // reload the cache as needed. + m_mod_time = GetLibModificationTime(); + } } @@ -589,7 +554,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const if( aBoard->GetDesignSettings().m_SolderPasteMarginRatio != 0 ) m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n", - double2str( aBoard->GetDesignSettings().m_SolderPasteMarginRatio ).c_str() ); + Double2Str( aBoard->GetDesignSettings().m_SolderPasteMarginRatio ).c_str() ); m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n", FMTIU( aBoard->GetOriginAxisPosition().x ).c_str(), @@ -949,7 +914,7 @@ void PCB_IO::format( MODULE* aModule, int aNestLevel ) const if( aModule->GetLocalSolderPasteMarginRatio() != 0 ) m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n", - double2str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() ); + Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() ); if( aModule->GetLocalClearance() != 0 ) m_out->Print( aNestLevel+1, "(clearance %s)\n", @@ -1000,19 +965,19 @@ void PCB_IO::format( MODULE* aModule, int aNestLevel ) const m_out->Quotew( t3D->m_Shape3DName ).c_str() ); m_out->Print( aNestLevel+2, "(at (xyz %s %s %s))\n", - double2str( t3D->m_MatPosition.x ).c_str(), - double2str( t3D->m_MatPosition.y ).c_str(), - double2str( t3D->m_MatPosition.z ).c_str() ); + Double2Str( t3D->m_MatPosition.x ).c_str(), + Double2Str( t3D->m_MatPosition.y ).c_str(), + Double2Str( t3D->m_MatPosition.z ).c_str() ); m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n", - double2str( t3D->m_MatScale.x ).c_str(), - double2str( t3D->m_MatScale.y ).c_str(), - double2str( t3D->m_MatScale.z ).c_str() ); + Double2Str( t3D->m_MatScale.x ).c_str(), + Double2Str( t3D->m_MatScale.y ).c_str(), + Double2Str( t3D->m_MatScale.z ).c_str() ); m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n", - double2str( t3D->m_MatRotation.x ).c_str(), - double2str( t3D->m_MatRotation.y ).c_str(), - double2str( t3D->m_MatRotation.z ).c_str() ); + Double2Str( t3D->m_MatRotation.x ).c_str(), + Double2Str( t3D->m_MatRotation.y ).c_str(), + Double2Str( t3D->m_MatRotation.z ).c_str() ); m_out->Print( aNestLevel+1, ")\n" ); } @@ -1186,7 +1151,7 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const if( aPad->GetLocalSolderPasteMarginRatio() != 0 ) m_out->Print( aNestLevel+1, "(solder_paste_margin_ratio %s)\n", - double2str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() ); + Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() ); if( aPad->GetLocalClearance() != 0 ) m_out->Print( aNestLevel+1, "(clearance %s)\n", diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp index f45a4a78cb..12a5ba39d2 100644 --- a/pcbnew/legacy_plugin.cpp +++ b/pcbnew/legacy_plugin.cpp @@ -4155,8 +4155,7 @@ void FPL_CACHE::Save() abs_lib_name.MakeAbsolute(); tempFileName = wxFileName::CreateTempFileName( abs_lib_name.GetFullPath() ); - wxLogDebug( wxT( "tempFileName:'%s' m_lib_path:'%s'\n" ), - TO_UTF8( tempFileName ), TO_UTF8( m_lib_path ) ); + //wxLogDebug( wxT( "tempFileName:'%s' m_lib_path:'%s'\n" ), TO_UTF8( tempFileName ), TO_UTF8( m_lib_path ) ); FILE* fp = wxFopen( tempFileName, wxT( "w" ) ); if( !fp ) diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index dc3c6b5e25..fb1b5f1035 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -728,7 +728,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_PCB_USER_GRID_SETUP: - InstallGridFrame( pos ); + InvokeDialogGrid(); break; case ID_POPUP_PLACE_BLOCK: diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index cdccda1f82..f86be7a190 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -230,7 +230,7 @@ const COLOR4D& PCB_PAINTER::getItemColor( int aItemType, int aNetCode, bool aHig bool PCB_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer ) { // the "cast" applied in here clarifies which overloaded draw() is called - switch( aItem->Type() ) + switch( static_cast( aItem )->Type() ) { case PCB_ZONE_T: case PCB_TRACE_T: diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index c28707b184..061f465d4a 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -109,16 +109,34 @@ bool EDA_APP::OnInit() PCB_EDIT_FRAME* frame = NULL; wxString msg; + InitEDA_Appl( wxT( "Pcbnew" ), APP_PCBNEW_T ); + #ifdef KICAD_SCRIPTING - if ( !pcbnewInitPythonScripting() ) + msg.Empty(); +#ifdef __WINDOWS__ + // TODO: make this path definable by the user, and set more than one path + // (and remove the fixed paths from /scripting/kicadplugins.i) + + // wizard plugins are stored in kicad/bin/plugins. + // so add this path to python scripting defualt search paths + // which are ( [KICAD_PATH] is an environment variable to define) + // [KICAD_PATH]/scripting/plugins + // Add this default search path: + msg = wxGetApp().GetExecutablePath() + wxT("scripting/plugins"); +#else + // Add this default search path: + msg = wxT("/usr/local/kicad/bin/scripting/plugins"); +#endif + // On linux and osx, 2 others paths are + // [HOME]/.kicad_plugins/ + // [HOME]/.kicad/scripting/plugins/ + if ( !pcbnewInitPythonScripting( TO_UTF8(msg) ) ) { wxMessageBox( wxT( "pcbnewInitPythonScripting() fails" ) ); return false; } #endif - InitEDA_Appl( wxT( "Pcbnew" ), APP_PCBNEW_T ); - if( argc > 1 ) { fn = argv[1]; diff --git a/pcbnew/pcbnew_config.cpp b/pcbnew/pcbnew_config.cpp index 94a9d9f89b..8f3b4ecc18 100644 --- a/pcbnew/pcbnew_config.cpp +++ b/pcbnew/pcbnew_config.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -125,7 +126,7 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event ) break; case ID_CONFIG_SAVE: - SaveProjectSettings(); + SaveProjectSettings( true ); break; case ID_CONFIG_READ: @@ -221,26 +222,39 @@ bool PCB_EDIT_FRAME::LoadProjectSettings( const wxString& aProjectFileName ) SetElementVisibility( RATSNEST_VISIBLE, showRats ); #endif + // Load the page layout decr file, from the filename stored in + // BASE_SCREEN::m_PageLayoutDescrFileName, read in config project file + // If empty, the default descr is loaded + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + pglayout.SetPageLayout(BASE_SCREEN::m_PageLayoutDescrFileName); + loadFootprintLibTable(); return true; } -void PCB_EDIT_FRAME::SaveProjectSettings() +void PCB_EDIT_FRAME::SaveProjectSettings( bool aAskForSave ) { wxFileName fn; fn = GetBoard()->GetFileName(); fn.SetExt( ProjectFileExtension ); - wxFileDialog dlg( this, _( "Save Project File" ), fn.GetPath(), fn.GetFullName(), - ProjectFileWildcard, wxFD_SAVE | wxFD_CHANGE_DIR ); + if( aAskForSave ) + { + wxFileDialog dlg( this, _( "Save Project File" ), + fn.GetPath(), fn.GetFullName(), + ProjectFileWildcard, wxFD_SAVE | wxFD_CHANGE_DIR ); - if( dlg.ShowModal() == wxID_CANCEL ) - return; + if( dlg.ShowModal() == wxID_CANCEL ) + return; - wxGetApp().WriteProjectConfig( dlg.GetPath(), GROUP, GetProjectFileParameters() ); + wxGetApp().WriteProjectConfig( dlg.GetPath(), GROUP, GetProjectFileParameters() ); + } + + else + wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() ); } @@ -248,17 +262,19 @@ PARAM_CFG_ARRAY PCB_EDIT_FRAME::GetProjectFileParameters() { PARAM_CFG_ARRAY pca; + pca.push_back( new PARAM_CFG_FILENAME( wxT( "PageLayoutDescrFile" ), + &BASE_SCREEN::m_PageLayoutDescrFileName ) ); + pca.push_back( new PARAM_CFG_FILENAME( wxT( "LibDir" ),&g_UserLibDirBuffer, - GROUPLIB ) ); + GROUPLIB ) ); pca.push_back( new PARAM_CFG_LIBNAME_LIST( wxT( "LibName" ), - &g_LibraryNames, - GROUPLIB ) ); + &g_LibraryNames, GROUPLIB ) ); pca.push_back( new PARAM_CFG_FILENAME( wxT( "LastNetListRead" ), - &m_lastNetListRead ) ); + &m_lastNetListRead ) ); pca.push_back( new PARAM_CFG_BOOL( wxT( "UseCmpFile" ), - &m_useCmpFileForFpNames, true ) ); + &m_useCmpFileForFpNames, true ) ); GetBoard()->GetDesignSettings().AppendConfigs( &pca ); return pca; diff --git a/pcbnew/scripting/plugins/fpc_footprint_wizard.py b/pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py similarity index 56% rename from pcbnew/scripting/plugins/fpc_footprint_wizard.py rename to pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py index 1ae779a6bc..bbb596612d 100644 --- a/pcbnew/scripting/plugins/fpc_footprint_wizard.py +++ b/pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py @@ -1,4 +1,6 @@ -#!/usr/bin/python +# This python script wizard creates a FPC connector +# for Surface Mounted Technology + from pcbnew import * @@ -6,7 +8,7 @@ class FPCFootprintWizard(FootprintWizardPlugin): def __init__(self): FootprintWizardPlugin.__init__(self) self.name = "FPC" - self.description = "FPC Footprint Wizard" + self.description = "FPC (SMTechnology) Footprint Wizard" self.parameters = { "Pads": {"*n":40, # not internal units preceded by "*" @@ -17,9 +19,9 @@ class FPCFootprintWizard(FootprintWizardPlugin): {"shield_to_pad": FromMM(1.6), "from_top": FromMM(1.3), "width": FromMM(1.5), - "height": FromMM(2)}, - + "height": FromMM(2)} } + self.ClearErrors() # build a rectangular pad @@ -75,48 +77,61 @@ class FPCFootprintWizard(FootprintWizardPlugin): shl_to_pad = p["Shield"]["shield_to_pad"] shl_from_top = p["Shield"]["from_top"] + offsetX = pad_pitch*(pads-1)/2 size_pad = wxSize(pad_width,pad_height) size_shld = wxSize(shl_width,shl_height) + size_text = wxSize( FromMM( 0.8), FromMM( 0.7) ) + textposy = pad_height/2 + FromMM(1) module.SetReference("FPC"+str(pads)) # give it a reference name - module.Reference().SetPos0(wxPointMM(-1,-2)) - module.Reference().SetPosition(wxPointMM(-1,-2)) + module.Reference().SetPos0(wxPoint(0, textposy)) + module.Reference().SetTextPosition(module.Reference().GetPos0()) + module.Reference().SetSize( size_text ) + + textposy = textposy + FromMM(1) + module.SetValue("Val***") # give it a default value + module.Value().SetPos0( wxPoint(0, textposy) ) + module.Value().SetTextPosition(module.Value().GetPos0()) + module.Value().SetSize( size_text ) + + module.SetLibRef("FPC"+str(pads)) #the name in library # create a pad array and add it to the module for n in range (0,pads): - pad = self.smdRectPad(module,size_pad,wxPoint(pad_pitch*n,0),str(n+1)) + xpos = pad_pitch*n - offsetX + pad = self.smdRectPad(module,size_pad,wxPoint(xpos,0),str(n+1)) module.Add(pad) - pad_s0 = self.smdRectPad(module, - size_shld, - wxPoint(-shl_to_pad,shl_from_top), - "0") - pad_s1 = self.smdRectPad(module, - size_shld, - wxPoint((pads-1)*pad_pitch+shl_to_pad,shl_from_top), - "0") + xpos = -shl_to_pad-offsetX + pad_s0 = self.smdRectPad(module, size_shld, wxPoint(xpos,shl_from_top), "0") + xpos = (pads-1)*pad_pitch+shl_to_pad-offsetX + pad_s1 = self.smdRectPad(module, size_shld, wxPoint(xpos,shl_from_top), "0") module.Add(pad_s0) module.Add(pad_s1) - e = EDGE_MODULE(module) - e.SetStartEnd(wxPointMM(-1,0),wxPointMM(0,0)) - e.SetWidth(FromMM(0.2)) - e.SetLayer(EDGE_LAYER) - e.SetShape(S_SEGMENT) - module.Add(e) + #add outline + outline = EDGE_MODULE(module) + width = FromMM(0.2) + posy = -pad_height/2 - width/2 -FromMM(0.2) + outline.SetStartEnd(wxPoint(pad_pitch * pads - pad_pitch*0.5-offsetX, posy), + wxPoint( - pad_pitch*0.5-offsetX, posy)) + outline.SetWidth(width) + outline.SetLayer(SILKSCREEN_N_FRONT) #default: not needed + outline.SetShape(S_SEGMENT) + module.Add(outline) - module.SetLibRef("FPC"+str(pads)) + outline1 = EDGE_MODULE(module) + outline1.Copy(outline) #copy all settings from outline + posy = pad_height/2 + width/2 +FromMM(0.2) + outline1.SetStartEnd(wxPoint(pad_pitch * pads - pad_pitch*0.5-offsetX, posy), + wxPoint( - pad_pitch*0.5-offsetX, posy)) + module.Add(outline1) -def register(): - # create our footprint wizard - fpc_wizard = FPCFootprintWizard() - - # register it into pcbnew - fpc_wizard.register() - - return fpc_wizard - +# create our footprint wizard +fpc_wizard = FPCFootprintWizard() +# register it into pcbnew +fpc_wizard.register() diff --git a/pcbnew/scripting/plugins/touch_slider_wizard.py b/pcbnew/scripting/plugins/touch_slider_wizard.py index 8cb9ac6667..503d621161 100644 --- a/pcbnew/scripting/plugins/touch_slider_wizard.py +++ b/pcbnew/scripting/plugins/touch_slider_wizard.py @@ -164,12 +164,18 @@ class TouchSliderWizard(FootprintWizardPlugin): step_length = float(touch_length) / float(steps) + size_text = wxSize( FromMM( 1), FromMM( 1) ); module.SetReference("TS"+str(steps)) # give it a reference name - module.Reference().SetPos0(wxPointMM(-1,-2)) - module.Reference().SetPosition(wxPointMM(-1,-2)) + module.Reference().SetPos0(wxPointMM(0,-2)) + module.Reference().SetTextPosition(module.Reference().GetPos0()) + module.Reference().SetSize( size_text ); + + module.SetValue("Val**") # give it a value + module.Value().SetPos0(wxPointMM(0,-3.2)) + module.Value().SetTextPosition(module.Value().GetPos0()) + module.Value().SetSize( size_text ); # starting pad - pos = wxPointMM(0,0) band_width = touch_width/bands diff --git a/pcbnew/tool_onrightclick.cpp b/pcbnew/tool_onrightclick.cpp index 0ec61d8d74..80ffdb7938 100644 --- a/pcbnew/tool_onrightclick.cpp +++ b/pcbnew/tool_onrightclick.cpp @@ -33,7 +33,6 @@ #include #include #include - #include @@ -71,7 +70,7 @@ void PCB_EDIT_FRAME::ToolOnRightClick( wxCommandEvent& event ) break; case ID_PCB_PLACE_GRID_COORD_BUTT: - InstallGridFrame( wxDefaultPosition ); + InvokeDialogGrid(); break; default: diff --git a/polygon/polygon_test_point_inside.h b/polygon/polygon_test_point_inside.h index 90117dd2d4..b817380d1c 100644 --- a/polygon/polygon_test_point_inside.h +++ b/polygon/polygon_test_point_inside.h @@ -10,6 +10,8 @@ public: int x, y; }; #endif +class CPOLYGONS_LIST; + /** * Function TestPointInsidePolygon * test if a point is inside or outside a polygon. diff --git a/scripting/kicadplugins.i b/scripting/kicadplugins.i index 68e6bfbd96..32679ed69e 100644 --- a/scripting/kicadplugins.i +++ b/scripting/kicadplugins.i @@ -67,14 +67,16 @@ def ReloadPlugins(): ReloadPlugin(k) -def LoadPlugins(): +def LoadPlugins( plugpath ): import os import sys - kicad_path = os.environ.get('KICAD_PATH') plugin_directories=[] + if plugpath and os.path.isdir( plugpath ): + plugin_directories.append( plugpath ) + if kicad_path and os.path.isdir(kicad_path): plugin_directories.append(os.path.join(kicad_path, 'scripting', 'plugins')) diff --git a/scripting/python_scripting.cpp b/scripting/python_scripting.cpp index 24f0fa0065..1ec3198de4 100644 --- a/scripting/python_scripting.cpp +++ b/scripting/python_scripting.cpp @@ -132,7 +132,7 @@ static void swigSwitchPythonBuiltin() PyThreadState* g_PythonMainTState; -bool pcbnewInitPythonScripting() +bool pcbnewInitPythonScripting( const char * aUserPluginsPath ) { swigAddBuiltin(); // add builtin functions swigAddModules(); // add our own modules @@ -159,25 +159,23 @@ bool pcbnewInitPythonScripting() g_PythonMainTState = wxPyBeginAllowThreads(); - // load pcbnew inside python, and load all the user plugins, TODO: add system wide plugins - #endif - + // load pcbnew inside python, and load all the user plugins, TODO: add system wide plugins { + char cmd[1024]; PyLOCK lock; - - PyRun_SimpleString( "import sys, traceback\n" - "sys.path.append(\".\")\n" - "import pcbnew\n" - "pcbnew.LoadPlugins()" - ); + sprintf( cmd, "import sys, traceback\n" + "sys.path.append(\".\")\n" + "import pcbnew\n" + "pcbnew.LoadPlugins(\"%s\")", aUserPluginsPath ); + PyRun_SimpleString( cmd ); } return true; } -void pcbnewFinishPythonScripting() +void pcbnewFinishPythonScripting( char ) { #ifdef KICAD_SCRIPTING_WXPYTHON wxPyEndAllowThreads( g_PythonMainTState ); diff --git a/scripting/python_scripting.h b/scripting/python_scripting.h index 170f6cce98..8d0ae174fe 100644 --- a/scripting/python_scripting.h +++ b/scripting/python_scripting.h @@ -24,7 +24,7 @@ * Initializes the Python engine inside pcbnew */ -bool pcbnewInitPythonScripting(); +bool pcbnewInitPythonScripting( const char * aUserPluginsPath ); void pcbnewFinishPythonScripting(); diff --git a/scripts/lib_convert.py b/scripts/lib_convert.py new file mode 100755 index 0000000000..569b4ec26c --- /dev/null +++ b/scripts/lib_convert.py @@ -0,0 +1,51 @@ +#!/usr/bin/python + +# Convert a footprint library from one format to another, e.g. legacy to pretty. + +# 1) Build target _pcbnew after enabling scripting in cmake. +# $ make _pcbnew + +# 2) Changed dir to pcbnew +# $ cd pcbnew +# $ pwd +# build/pcbnew + +# 3) Entered following command line, script takes to arguments: oldLibPath & newLibPath +# $ PYTHONPATH=. /lib_convert.py /usr/local/share/kicad/modules/smd_dil.mod /tmp/smd_dil.pretty + +# 4) inspect one footprint found in new librarypath /tmp/smd_dil +# $ less /tmp/smd_dil/msoic-10.kicad_mod + + +from __future__ import print_function +from pcbnew import * +import sys + +if len( sys.argv ) < 3 : + print( "usage: script srcLibraryPath dstLibraryPath" ) + sys.exit(1) + + +src_libpath = sys.argv[1] +dst_libpath = sys.argv[2] + + +src_type = IO_MGR.GuessPluginTypeFromLibPath( src_libpath ); +dst_type = IO_MGR.GuessPluginTypeFromLibPath( dst_libpath ); + +src_plugin = IO_MGR.PluginFind( src_type ) +dst_plugin = IO_MGR.PluginFind( dst_type ) + +try: + dst_plugin.FootprintLibDelete( dst_libpath ) +except: + None # ignore, new may not exist if first run + +dst_plugin.FootprintLibCreate( dst_libpath ) + +list_of_parts = src_plugin.FootprintEnumerate( src_libpath ) + +for part_id in list_of_parts: + module = src_plugin.FootprintLoad( src_libpath, part_id ) + dst_plugin.FootprintSave( dst_libpath, module ) + diff --git a/template/gost_landscape.kicad_wks b/template/gost_landscape.kicad_wks new file mode 100644 index 0000000000..4888afde3a --- /dev/null +++ b/template/gost_landscape.kicad_wks @@ -0,0 +1,85 @@ +( page_layout + (setup(textsize 2.5 2.5)(linewidth 0.3)(textlinewidth 0.3) + (left_margin 8)(right_margin 5)(top_margin 5)(bottom_margin 5)) + (line (name segm1:Line) (start 0 60 lbcorner) (end 12 60 lbcorner) (linewidth 0.6) (repeat 3) (incry 25)) + (line (name segm2:Line) (start 96 0 ltcorner) (end 96 14 ltcorner) (option page1only) (linewidth 0.6) (repeat 2) (incrx 53)) + (line (name segm3:Line) (start 82 0 ltcorner) (end 82 14 ltcorner) (linewidth 0.6)) + (line (name segm4:Line) (start 96 14 ltcorner) (end 149 14 ltcorner) (option page1only) (linewidth 0.6) (repeat 2) (incry -7)) + (line (name segm5:Line) (start 82 14 ltcorner) (end 96 14 ltcorner) (option page1only) (linewidth 0.6)) + (line (name segm6:Line) (start 12 14 ltcorner) (end 82 14 ltcorner) (linewidth 0.6)) + (line (name segm7:Line) (start 0 145 lbcorner) (end 12 145 lbcorner) (linewidth 0.6)) + (line (name segm8:Line) (start 0 0 lbcorner) (end 12 0 lbcorner) (linewidth 0.6) (repeat 2) (incry 25)) + (line (name segm9:Line) (start 120 55) (end 120 0) (option page1only) (linewidth 0.6)) + (line (name segm10:Line) (start 130 55) (end 130 0) (option page1only) (linewidth 0.6)) + (line (name segm11:Line) (start 145 55) (end 145 0) (option page1only) (linewidth 0.6)) + (line (name segm12:Line) (start 168 55) (end 168 0) (option page1only) (linewidth 0.6)) + (line (name segm13:Line) (start 178 55) (end 178 30) (option page1only) (linewidth 0.6)) + (line (name segm14:Line) (start 185 40) (end 120 40) (option page1only) (repeat 3) (incry 5)) + (line (name segm15:Line) (start 185 30) (end 120 30) (option page1only) (linewidth 0.6) (repeat 2) (incry 5)) + (line (name segm16:Line) (start 185 5) (end 120 5) (option page1only) (repeat 5) (incry 5)) + (line (name segm17:Line) (start 185 55) (end 0 55) (option page1only) (linewidth 0.6)) + (line (name segm18:Line) (start 0 145 lbcorner) (end 0 0 lbcorner) (linewidth 0.6) (repeat 2) (incrx 5)) + (line (name segm19:Line) (start 45 35) (end 45 20) (option page1only) (repeat 2) (incrx -5)) + (line (name segm20:Line) (start 35 40) (end 35 20) (option page1only) (linewidth 0.6) (repeat 2) (incrx -17)) + (line (name segm21:Line) (start 50 20) (end 0 20) (option page1only) (linewidth 0.6) (repeat 2) (incry 15)) + (line (name segm22:Line) (start 50 40) (end 50 0) (option page1only) (linewidth 0.6)) + (line (name segm23:Line) (start 120 15) (end 0 15) (option page1only) (linewidth 0.6)) + (line (name segm24:Line) (start 120 40) (end 0 40) (option page1only) (linewidth 0.6)) + (line (name segm25:Line) (start 185 0) (end 185 55) (option page1only) (linewidth 0.6)) + (rect (name rect1:Rect) (start 12 0 lbcorner) (end 0 0 rtcorner) (linewidth 0.6)) + (tbtext Лист (name text1:Text) (pos 173 32.5) (option page1only) (justify center)) + (tbtext %C2 (name text2:Text) (pos 167.5 22.5) (option page1only) (maxlen 22)) + (tbtext Пров. (name text3:Text) (pos 184.5 22.5) (option page1only)) + (tbtext Утв. (name text4:Text) (pos 184.5 2.5) (option page1only)) + (tbtext Н.контр. (name text5:Text) (pos 184.5 7.5) (option page1only)) + (tbtext Лит. (name text6:Text) (pos 42 37.5) (option page1only) (justify center)) + (tbtext %C0 (name text7:Text) (pos 60 47.5) (option page1only) (font (size 5 5)) (justify center) (maxlen 119)) + (tbtext %N (name text8:Text) (pos 8 17.5) (option page1only) (justify center)) + (line (name segm26:Line) (start 185 15) (end 185 0) (option notonpage1) (linewidth 0.6)) + (line (name segm27:Line) (start 185 15) (end 0 15) (option notonpage1) (linewidth 0.6)) + (tbtext %Y (name text9:Text) (pos 25 7) (option page1only) (justify center) (maxlen 49) (maxheight 14)) + (tbtext %T (name text10:Text) (pos 85 27.5) (option page1only) (justify center) (maxlen 69) (maxheight 24)) + (tbtext Листов (name text11:Text) (pos 29 17.5) (option page1only)) + (tbtext %C0 (name text12:Text) (pos 47 7 ltcorner) (rotate 180) (font (size 3.5 3.5)) (justify center) (maxlen 69)) + (tbtext %S (name text13:Text) (pos 35 17.5) (option page1only) (justify center)) + (tbtext Лист (name text14:Text) (pos 49 17.5) (option page1only)) + (line (name segm28:Line) (start 30 20) (end 30 15) (option page1only) (linewidth 0.6)) + (tbtext Масштаб (name text15:Text) (pos 9 37.5) (option page1only) (justify center)) + (tbtext Масса (name text16:Text) (pos 26.5 37.5) (option page1only) (justify center)) + (tbtext %C3 (name text17:Text) (pos 167.5 2.5) (option page1only) (maxlen 22)) + (tbtext %C1 (name text18:Text) (pos 167.5 27.5) (option page1only) (maxlen 22)) + (tbtext Разраб. (name text19:Text) (pos 184.5 27.5) (option page1only)) + (tbtext Дата (name text20:Text) (pos 125 32.5) (option page1only) (justify center)) + (tbtext Подп. (name text21:Text) (pos 137 32.5) (option page1only) (justify center)) + (tbtext "N докум." (name text22:Text) (pos 156.5 32.5) (option page1only) (justify center)) + (tbtext Изм. (name text23:Text) (pos 181.5 32.5) (option page1only) (justify center) (maxlen 6.5)) + (line (name segm29:Line) (start 0 287 lbcorner) (end 12 287 lbcorner) (option page1only) (linewidth 0.6) (repeat 3) (incry -60)) + (tbtext Взам.инв.N (name text24:Text) (pos 2.5 72.5 lbcorner) (rotate 90) (justify center)) + (tbtext Т.контр. (name text25:Text) (pos 184.5 17.5) (option page1only)) + (tbtext "Подп. и дата" (name text26:Text) (pos 2.5 42.5 lbcorner) (rotate 90) (justify center)) + (tbtext "Инв.N дубл." (name text27:Text) (pos 2.5 97.5 lbcorner) (rotate 90) (justify center)) + (tbtext "Инв.N подл." (name text28:Text) (pos 2.5 12.5 lbcorner) (rotate 90) (justify center)) + (line (name segm30:Line) (start 0 287 lbcorner) (end 0 167 lbcorner) (option page1only) (linewidth 0.6) (repeat 2) (incrx 5)) + (tbtext "Подп. и дата" (name text29:Text) (pos 2.5 127.5 lbcorner) (rotate 90) (justify center)) + (tbtext "Перв. примен." (name text30:Text) (pos 2.5 257 lbcorner) (option page1only) (rotate 90) (justify center)) + (tbtext "Справ. N" (name text31:Text) (pos 2.5 197 lbcorner) (option page1only) (rotate 90) (justify center)) + (tbtext %S (name text32:Text) (pos 5 4) (option notonpage1) (justify center)) + (tbtext Лист (name text33:Text) (pos 5 11.5) (option notonpage1) (justify center)) + (tbtext Копировал (name text34:Text) (pos 110 -2.5)) + (tbtext "Формат %Z" (name text35:Text) (pos 40 -2.5)) + (tbtext %C0 (name text36:Text) (pos 65 7.5) (option notonpage1) (font (size 5 5)) (justify center) (maxlen 109) (maxheight 14)) + (tbtext Дата (name text37:Text) (pos 125 2.5) (option notonpage1) (justify center)) + (tbtext Подп. (name text38:Text) (pos 137.5 2.5) (option notonpage1) (justify center)) + (tbtext "N докум." (name text39:Text) (pos 156.5 2.5) (option notonpage1) (justify center)) + (tbtext Лист (name text40:Text) (pos 173 2.5) (option notonpage1) (justify center)) + (tbtext Изм. (name text41:Text) (pos 181.5 2.5) (option notonpage1) (justify center) (maxlen 6.5)) + (line (name segm31:Line) (start 10 8) (end 0 8) (option notonpage1) (linewidth 0.6)) + (line (name segm32:Line) (start 10 15) (end 10 0) (option notonpage1) (linewidth 0.6)) + (line (name segm33:Line) (start 185 10) (end 120 10) (option notonpage1)) + (line (name segm34:Line) (start 185 5) (end 120 5) (option notonpage1) (linewidth 0.6)) + (line (name segm35:Line) (start 120 15) (end 120 0) (option notonpage1) (linewidth 0.6)) + (line (name segm36:Line) (start 130 15) (end 130 0) (option notonpage1) (linewidth 0.6)) + (line (name segm37:Line) (start 145 15) (end 145 0) (option notonpage1) (linewidth 0.6)) + (line (name segm38:Line) (start 168 15) (end 168 0) (option notonpage1) (linewidth 0.6)) + (line (name segm39:Line) (start 178 15) (end 178 0) (option notonpage1) (linewidth 0.6)) +) diff --git a/template/gost_portrait.kicad_wks b/template/gost_portrait.kicad_wks new file mode 100644 index 0000000000..31358a27aa --- /dev/null +++ b/template/gost_portrait.kicad_wks @@ -0,0 +1,85 @@ +( page_layout + (setup(textsize 2.5 2.5)(linewidth 0.3)(textlinewidth 0.3) + (left_margin 8)(right_margin 5)(top_margin 5)(bottom_margin 5)) + (line (name segm1:Line) (start 0 60 lbcorner) (end 12 60 lbcorner) (linewidth 0.6) (repeat 3) (incry 25)) + (line (name segm2:Line) (start 14 84 rtcorner) (end 0 84 rtcorner) (option page1only) (linewidth 0.6) (repeat 2) (incry 53)) + (line (name segm3:Line) (start 14 70 rtcorner) (end 0 70 rtcorner) (linewidth 0.6)) + (line (name segm4:Line) (start 14 84 rtcorner) (end 14 137 rtcorner) (option page1only) (linewidth 0.6) (repeat 2) (incrx -7)) + (line (name segm5:Line) (start 14 70 rtcorner) (end 14 84 rtcorner) (option page1only) (linewidth 0.6)) + (line (name segm6:Line) (start 14 0 rtcorner) (end 14 70 rtcorner) (linewidth 0.6)) + (line (name segm7:Line) (start 0 145 lbcorner) (end 12 145 lbcorner) (linewidth 0.6)) + (line (name segm8:Line) (start 0 0 lbcorner) (end 12 0 lbcorner) (linewidth 0.6) (repeat 2) (incry 25)) + (line (name segm9:Line) (start 120 55) (end 120 0) (option page1only) (linewidth 0.6)) + (line (name segm10:Line) (start 130 55) (end 130 0) (option page1only) (linewidth 0.6)) + (line (name segm11:Line) (start 145 55) (end 145 0) (option page1only) (linewidth 0.6)) + (line (name segm12:Line) (start 168 55) (end 168 0) (option page1only) (linewidth 0.6)) + (line (name segm13:Line) (start 178 55) (end 178 30) (option page1only) (linewidth 0.6)) + (line (name segm14:Line) (start 185 40) (end 120 40) (option page1only) (repeat 3) (incry 5)) + (line (name segm15:Line) (start 185 30) (end 120 30) (option page1only) (linewidth 0.6) (repeat 2) (incry 5)) + (line (name segm16:Line) (start 185 5) (end 120 5) (option page1only) (repeat 5) (incry 5)) + (line (name segm17:Line) (start 185 55) (end 0 55) (option page1only) (linewidth 0.6)) + (line (name segm18:Line) (start 0 145 lbcorner) (end 0 0 lbcorner) (linewidth 0.6) (repeat 2) (incrx 5)) + (line (name segm19:Line) (start 45 35) (end 45 20) (option page1only) (repeat 2) (incrx -5)) + (line (name segm20:Line) (start 35 40) (end 35 20) (option page1only) (linewidth 0.6) (repeat 2) (incrx -17)) + (line (name segm21:Line) (start 50 20) (end 0 20) (option page1only) (linewidth 0.6) (repeat 2) (incry 15)) + (line (name segm22:Line) (start 50 40) (end 50 0) (option page1only) (linewidth 0.6)) + (line (name segm23:Line) (start 120 15) (end 0 15) (option page1only) (linewidth 0.6)) + (line (name segm24:Line) (start 120 40) (end 0 40) (option page1only) (linewidth 0.6)) + (line (name segm25:Line) (start 185 0) (end 185 55) (option page1only) (linewidth 0.6)) + (rect (name rect1:Rect) (start 12 0 lbcorner) (end 0 0 rtcorner) (linewidth 0.6)) + (tbtext Лист (name text1:Text) (pos 173 32.5) (option page1only) (justify center)) + (tbtext %C2 (name text2:Text) (pos 167.5 22.5) (option page1only) (maxlen 22)) + (tbtext Пров. (name text3:Text) (pos 184.5 22.5) (option page1only)) + (tbtext Утв. (name text4:Text) (pos 184.5 2.5) (option page1only)) + (tbtext Н.контр. (name text5:Text) (pos 184.5 7.5) (option page1only)) + (tbtext Лит. (name text6:Text) (pos 42 37.5) (option page1only) (justify center)) + (tbtext %C0 (name text7:Text) (pos 60 47.5) (option page1only) (font (size 5 5)) (justify center) (maxlen 119)) + (tbtext %N (name text8:Text) (pos 8 17.5) (option page1only) (justify center)) + (line (name segm26:Line) (start 185 15) (end 185 0) (option notonpage1) (linewidth 0.6)) + (line (name segm27:Line) (start 185 15) (end 0 15) (option notonpage1) (linewidth 0.6)) + (tbtext %Y (name text9:Text) (pos 25 7) (option page1only) (justify center) (maxlen 49) (maxheight 14)) + (tbtext %T (name text10:Text) (pos 85 27.5) (option page1only) (justify center) (maxlen 69) (maxheight 24)) + (tbtext Листов (name text11:Text) (pos 29 17.5) (option page1only)) + (tbtext %C0 (name text12:Text) (pos 7 35 rtcorner) (rotate 270) (font (size 3.5 3.5)) (justify center) (maxlen 69)) + (tbtext %S (name text13:Text) (pos 35 17.5) (option page1only) (justify center)) + (tbtext Лист (name text14:Text) (pos 49 17.5) (option page1only)) + (line (name segm28:Line) (start 30 20) (end 30 15) (option page1only) (linewidth 0.6)) + (tbtext Масштаб (name text15:Text) (pos 9 37.5) (option page1only) (justify center)) + (tbtext Масса (name text16:Text) (pos 26.5 37.5) (option page1only) (justify center)) + (tbtext %C3 (name text17:Text) (pos 167.5 2.5) (option page1only) (maxlen 22)) + (tbtext %C1 (name text18:Text) (pos 167.5 27.5) (option page1only) (maxlen 22)) + (tbtext Разраб. (name text19:Text) (pos 184.5 27.5) (option page1only)) + (tbtext Дата (name text20:Text) (pos 125 32.5) (option page1only) (justify center)) + (tbtext Подп. (name text21:Text) (pos 137 32.5) (option page1only) (justify center)) + (tbtext "N докум." (name text22:Text) (pos 156.5 32.5) (option page1only) (justify center)) + (tbtext Изм. (name text23:Text) (pos 181.5 32.5) (option page1only) (justify center) (maxlen 6.5)) + (line (name segm29:Line) (start 0 287 lbcorner) (end 12 287 lbcorner) (option page1only) (linewidth 0.6) (repeat 3) (incry -60)) + (tbtext Взам.инв.N (name text24:Text) (pos 2.5 72.5 lbcorner) (rotate 90) (justify center)) + (tbtext Т.контр. (name text25:Text) (pos 184.5 17.5) (option page1only)) + (tbtext "Подп. и дата" (name text26:Text) (pos 2.5 42.5 lbcorner) (rotate 90) (justify center)) + (tbtext "Инв.N дубл." (name text27:Text) (pos 2.5 97.5 lbcorner) (rotate 90) (justify center)) + (tbtext "Инв.N подл." (name text28:Text) (pos 2.5 12.5 lbcorner) (rotate 90) (justify center)) + (line (name segm30:Line) (start 0 287 lbcorner) (end 0 167 lbcorner) (option page1only) (linewidth 0.6) (repeat 2) (incrx 5)) + (tbtext "Подп. и дата" (name text29:Text) (pos 2.5 127.5 lbcorner) (rotate 90) (justify center)) + (tbtext "Перв. примен." (name text30:Text) (pos 2.5 257 lbcorner) (option page1only) (rotate 90) (justify center)) + (tbtext "Справ. N" (name text31:Text) (pos 2.5 197 lbcorner) (option page1only) (rotate 90) (justify center)) + (tbtext %S (name text32:Text) (pos 5 4) (option notonpage1) (justify center)) + (tbtext Лист (name text33:Text) (pos 5 11.5) (option notonpage1) (justify center)) + (tbtext Копировал (name text34:Text) (pos 110 -2.5)) + (tbtext "Формат %Z" (name text35:Text) (pos 40 -2.5)) + (tbtext %C0 (name text36:Text) (pos 65 7.5) (option notonpage1) (font (size 5 5)) (justify center) (maxlen 109) (maxheight 14)) + (tbtext Дата (name text37:Text) (pos 125 2.5) (option notonpage1) (justify center)) + (tbtext Подп. (name text38:Text) (pos 137.5 2.5) (option notonpage1) (justify center)) + (tbtext "N докум." (name text39:Text) (pos 156.5 2.5) (option notonpage1) (justify center)) + (tbtext Лист (name text40:Text) (pos 173 2.5) (option notonpage1) (justify center)) + (tbtext Изм. (name text41:Text) (pos 181.5 2.5) (option notonpage1) (justify center) (maxlen 6.5)) + (line (name segm31:Line) (start 10 8) (end 0 8) (option notonpage1) (linewidth 0.6)) + (line (name segm32:Line) (start 10 15) (end 10 0) (option notonpage1) (linewidth 0.6)) + (line (name segm33:Line) (start 185 10) (end 120 10) (option notonpage1)) + (line (name segm34:Line) (start 185 5) (end 120 5) (option notonpage1) (linewidth 0.6)) + (line (name segm35:Line) (start 120 15) (end 120 0) (option notonpage1) (linewidth 0.6)) + (line (name segm36:Line) (start 130 15) (end 130 0) (option notonpage1) (linewidth 0.6)) + (line (name segm37:Line) (start 145 15) (end 145 0) (option notonpage1) (linewidth 0.6)) + (line (name segm38:Line) (start 168 15) (end 168 0) (option notonpage1) (linewidth 0.6)) + (line (name segm39:Line) (start 178 15) (end 178 0) (option notonpage1) (linewidth 0.6)) +) diff --git a/template/pagelayout.kicad_wks b/template/pagelayout_default.kicad_wks similarity index 100% rename from template/pagelayout.kicad_wks rename to template/pagelayout_default.kicad_wks