ngspice simulator
This commit is contained in:
commit
5b2f375ffb
|
@ -59,6 +59,7 @@ endif()
|
|||
|
||||
option( BUILD_GITHUB_PLUGIN "Build the GITHUB_PLUGIN for pcbnew." ON )
|
||||
|
||||
option( KICAD_SPICE "Build Kicad with internal Spice simulator." OFF )
|
||||
|
||||
# This can be set to a custom name to brag about a particular branch in the "About" dialog:
|
||||
set( KICAD_REPO_NAME "product" CACHE STRING "Name of the tree from which this build came." )
|
||||
|
@ -250,6 +251,10 @@ if( KICAD_SCRIPTING_WXPYTHON )
|
|||
add_definitions( -DKICAD_SCRIPTING_WXPYTHON )
|
||||
endif()
|
||||
|
||||
if( KICAD_SPICE )
|
||||
add_definitions( -DKICAD_SPICE )
|
||||
endif()
|
||||
|
||||
if( USE_WX_GRAPHICS_CONTEXT OR APPLE )
|
||||
add_definitions( -DUSE_WX_GRAPHICS_CONTEXT )
|
||||
endif()
|
||||
|
|
|
@ -512,6 +512,12 @@ set( BMAPS_MID
|
|||
select_w_layer
|
||||
shape_3d
|
||||
sheetset
|
||||
sim_run
|
||||
sim_stop
|
||||
sim_tune
|
||||
sim_probe
|
||||
sim_add_signal
|
||||
sim_settings
|
||||
setcolor_3d_bg
|
||||
setcolor_silkscreen
|
||||
setcolor_soldermask
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
static const unsigned char png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
|
||||
0xce, 0x00, 0x00, 0x02, 0x31, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
|
||||
0x03, 0x3d, 0x30, 0xc3, 0xf0, 0xb5, 0x48, 0x53, 0x3c, 0x3f, 0x59, 0x43, 0xa2, 0x40, 0x81, 0xa6,
|
||||
0x16, 0xa9, 0x08, 0xe5, 0xf2, 0x69, 0x88, 0xe5, 0xbf, 0xd2, 0x10, 0xcb, 0x5b, 0x42, 0x53, 0x8b,
|
||||
0x34, 0x44, 0xf3, 0x5b, 0x81, 0x16, 0xfd, 0x07, 0xe2, 0x7f, 0x5a, 0xa2, 0xb9, 0x86, 0x34, 0xb1,
|
||||
0x88, 0x81, 0xa1, 0x81, 0x09, 0x68, 0x41, 0x1d, 0x10, 0x1f, 0x57, 0x17, 0x2b, 0x58, 0xa4, 0x21,
|
||||
0x56, 0x10, 0x44, 0xd3, 0x38, 0x52, 0x17, 0xcf, 0xef, 0xd0, 0x14, 0xcf, 0xb5, 0xa0, 0x79, 0x62,
|
||||
0x18, 0xf4, 0x16, 0x81, 0x83, 0x5e, 0xa4, 0x48, 0x4d, 0x5d, 0xa4, 0x8c, 0x57, 0x45, 0x25, 0x97,
|
||||
0x5d, 0x4d, 0xa2, 0xd0, 0x8c, 0x6a, 0x16, 0xa9, 0x8b, 0x16, 0x84, 0x40, 0x52, 0x6a, 0x9e, 0x95,
|
||||
0x86, 0x78, 0x41, 0x24, 0x84, 0x5d, 0xd0, 0xa0, 0x21, 0x5e, 0xa8, 0x0b, 0x32, 0x43, 0x43, 0x24,
|
||||
0xcf, 0x98, 0x2a, 0x16, 0x69, 0x8a, 0xe5, 0xbb, 0xaa, 0x89, 0xe6, 0xdb, 0x80, 0x30, 0x30, 0x01,
|
||||
0x35, 0x41, 0xf4, 0xe7, 0xe5, 0x2b, 0x28, 0x24, 0x70, 0x68, 0x8b, 0x66, 0x49, 0x68, 0x8a, 0xe5,
|
||||
0x95, 0x51, 0xc5, 0x22, 0x20, 0x60, 0x04, 0xa5, 0x50, 0x63, 0xa9, 0x34, 0x2e, 0xa0, 0xaf, 0xea,
|
||||
0xc1, 0x96, 0x8b, 0x16, 0x64, 0xab, 0x8b, 0xe7, 0x28, 0xea, 0x48, 0x15, 0xc9, 0x82, 0x7c, 0x4c,
|
||||
0xb5, 0x38, 0xd2, 0x11, 0xcb, 0x17, 0x07, 0xd1, 0xda, 0xa2, 0x05, 0x06, 0xa0, 0x38, 0x32, 0x10,
|
||||
0x28, 0x10, 0x00, 0x59, 0x02, 0xf2, 0xa5, 0x92, 0x60, 0x39, 0x3f, 0x5e, 0x8b, 0x80, 0x79, 0xa9,
|
||||
0x18, 0x84, 0x65, 0x64, 0x0a, 0x39, 0x61, 0xe2, 0xa0, 0xe0, 0x30, 0x66, 0x48, 0x63, 0x45, 0xd7,
|
||||
0x08, 0x8a, 0x78, 0x18, 0x5b, 0x5b, 0x2a, 0x5f, 0x0e, 0xe2, 0x53, 0x07, 0x16, 0x60, 0xd0, 0xf1,
|
||||
0xe0, 0x4b, 0x0c, 0xd6, 0x65, 0xb9, 0x4b, 0x56, 0x03, 0x2d, 0x79, 0x03, 0x2e, 0x21, 0x44, 0xf3,
|
||||
0x97, 0x83, 0x83, 0x43, 0xa4, 0x40, 0x12, 0xc8, 0x3e, 0x05, 0x8c, 0xe8, 0x07, 0xda, 0x12, 0xb9,
|
||||
0x5a, 0x60, 0x0b, 0x24, 0x72, 0x45, 0x81, 0x6a, 0x96, 0xaa, 0x8b, 0xe5, 0xbf, 0xd7, 0x10, 0xcf,
|
||||
0x4b, 0x03, 0x89, 0xe9, 0xf2, 0x67, 0x0a, 0x42, 0xd4, 0xe5, 0xff, 0xd0, 0x14, 0x2f, 0x74, 0xc1,
|
||||
0x67, 0x51, 0xd3, 0xd2, 0x79, 0x87, 0x5f, 0x03, 0x15, 0xfe, 0x04, 0x1a, 0x30, 0x15, 0x64, 0x19,
|
||||
0x30, 0x0e, 0xa2, 0x81, 0xf4, 0x3d, 0xb0, 0x81, 0x62, 0xf9, 0x6f, 0x81, 0x78, 0x8d, 0xba, 0x78,
|
||||
0x81, 0x13, 0xd4, 0x31, 0x5f, 0x35, 0xc4, 0xf3, 0xcf, 0x00, 0xe9, 0x6f, 0x5a, 0xe2, 0xf9, 0xe6,
|
||||
0x30, 0xb6, 0xa6, 0x68, 0xfe, 0x35, 0x20, 0xfd, 0x41, 0x53, 0x34, 0x4f, 0x15, 0xab, 0x45, 0x7f,
|
||||
0xff, 0xfe, 0x6f, 0x5e, 0xbe, 0xe0, 0xc8, 0x0b, 0xa0, 0x0b, 0x27, 0x39, 0x30, 0x34, 0xb0, 0x00,
|
||||
0x15, 0x5f, 0x02, 0xfb, 0x4c, 0x3c, 0xff, 0x9d, 0x9a, 0x58, 0xae, 0x3e, 0x30, 0xc2, 0x4b, 0xa0,
|
||||
0x65, 0xe1, 0x6f, 0x20, 0xbe, 0x0c, 0x8a, 0x74, 0x50, 0x70, 0x81, 0x7c, 0x00, 0x53, 0xa7, 0x25,
|
||||
0x9e, 0xe7, 0x0c, 0x0e, 0x01, 0xb1, 0x82, 0x6e, 0x6c, 0x41, 0x0d, 0x63, 0xc4, 0xcf, 0x9d, 0xba,
|
||||
0x6f, 0x3b, 0x2c, 0x31, 0x80, 0xaa, 0x0b, 0x70, 0x9c, 0x41, 0xf3, 0x83, 0xb6, 0x76, 0x03, 0x1b,
|
||||
0x30, 0x49, 0x4f, 0x07, 0xe2, 0x69, 0xa0, 0x8c, 0x89, 0xc8, 0x4f, 0x79, 0x1e, 0xa0, 0x02, 0x19,
|
||||
0x64, 0xf1, 0xf0, 0x2e, 0xeb, 0x40, 0x25, 0x05, 0x5d, 0x2c, 0x02, 0xa5, 0x52, 0x60, 0xc2, 0x28,
|
||||
0x07, 0x65, 0x0d, 0x5c, 0xf9, 0xe8, 0x38, 0x10, 0xef, 0xa0, 0x02, 0xfe, 0x0d, 0x4e, 0xb9, 0xa2,
|
||||
0xf9, 0x8f, 0x34, 0xc5, 0xf3, 0x74, 0x50, 0x2c, 0x02, 0xa5, 0x36, 0x90, 0x0b, 0xa8, 0x81, 0x41,
|
||||
0x49, 0x1c, 0x94, 0xaf, 0x80, 0xbe, 0xb2, 0xa3, 0x69, 0x2b, 0x48, 0x53, 0xac, 0x20, 0x00, 0x54,
|
||||
0x1e, 0x0e, 0x48, 0x73, 0x0b, 0x00, 0x1a, 0x04, 0x6e, 0x5e, 0xc4, 0x63, 0x0b, 0x12, 0x00, 0x00,
|
||||
0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE sim_add_signal_xpm[1] = {{ png, sizeof( png ), "sim_add_signal_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,58 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
static const unsigned char png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
|
||||
0xce, 0x00, 0x00, 0x02, 0x96, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0xcd, 0x6b, 0x13,
|
||||
0x41, 0x18, 0xc6, 0xd7, 0x4f, 0xaa, 0x48, 0x09, 0x69, 0x66, 0x66, 0x5d, 0xa3, 0x46, 0x12, 0xb2,
|
||||
0xb3, 0xd9, 0xa2, 0x42, 0x0f, 0x45, 0x2d, 0xb4, 0xe0, 0x45, 0x10, 0x24, 0x1e, 0xc4, 0xab, 0xa8,
|
||||
0xf4, 0x90, 0x76, 0x77, 0x26, 0x49, 0x55, 0x44, 0x0f, 0xf1, 0xa2, 0x28, 0xe8, 0xcd, 0x93, 0x50,
|
||||
0x0f, 0x8a, 0x8a, 0x5a, 0x15, 0x05, 0xbd, 0x09, 0xfe, 0x01, 0x7a, 0xf0, 0x20, 0x88, 0x78, 0x53,
|
||||
0x14, 0x0f, 0x5a, 0xbc, 0x28, 0x55, 0x59, 0x9f, 0xa9, 0xa6, 0xdd, 0xd9, 0x24, 0xed, 0x36, 0x4d,
|
||||
0x0e, 0x7b, 0xd8, 0x61, 0xf6, 0xfd, 0xbd, 0xef, 0xf3, 0x7e, 0xad, 0x11, 0x04, 0x81, 0xd1, 0x8d,
|
||||
0xc7, 0x30, 0x6a, 0x2b, 0xb5, 0xf7, 0x4e, 0x03, 0x38, 0x95, 0x15, 0x87, 0xca, 0x47, 0x0e, 0x15,
|
||||
0x4f, 0x39, 0xf5, 0x2f, 0x0f, 0x58, 0xa3, 0xeb, 0x3b, 0x0a, 0x72, 0x89, 0xbf, 0xcf, 0x66, 0xe2,
|
||||
0x8d, 0x43, 0xfc, 0xb1, 0xfa, 0x99, 0x4d, 0xc5, 0x09, 0x9e, 0xf2, 0x86, 0x3b, 0x02, 0x72, 0x88,
|
||||
0x38, 0xec, 0xf4, 0x8d, 0x17, 0x39, 0x11, 0x5f, 0x39, 0x15, 0x0f, 0xb4, 0xe8, 0x4c, 0x39, 0x82,
|
||||
0xc8, 0x4a, 0xcb, 0x06, 0x71, 0x26, 0x4f, 0xc3, 0x78, 0x00, 0xb9, 0x7e, 0x01, 0xf4, 0xb9, 0x9f,
|
||||
0x0a, 0xa6, 0xcb, 0x28, 0xaa, 0x05, 0xe6, 0xef, 0x5d, 0x16, 0x28, 0x4f, 0x65, 0x11, 0x86, 0x66,
|
||||
0xfe, 0x81, 0x66, 0x9f, 0x9f, 0x59, 0x52, 0xca, 0xcd, 0x49, 0xe9, 0xd6, 0xd6, 0xe2, 0xec, 0x19,
|
||||
0xaa, 0x62, 0x45, 0xdb, 0x20, 0x78, 0xbe, 0x1d, 0xfa, 0x7f, 0x09, 0x41, 0x02, 0x9b, 0xc8, 0x6b,
|
||||
0x7a, 0xb4, 0xfe, 0x79, 0x1b, 0x79, 0x6b, 0xbb, 0xea, 0xf2, 0x56, 0x35, 0x05, 0xc3, 0xaf, 0xc3,
|
||||
0x10, 0xce, 0xc4, 0xf3, 0x4c, 0xa6, 0xd6, 0x13, 0xaa, 0xbc, 0x5d, 0x70, 0xe4, 0x6a, 0xdb, 0xe5,
|
||||
0xad, 0x7a, 0x03, 0xb9, 0x78, 0x12, 0x86, 0xa0, 0x94, 0xdf, 0x65, 0x93, 0x95, 0xcd, 0xf5, 0x3b,
|
||||
0x39, 0xd3, 0x23, 0xea, 0x4e, 0x3a, 0x5d, 0x5e, 0xd7, 0x36, 0x48, 0xf5, 0x85, 0x26, 0x17, 0x15,
|
||||
0xd3, 0x9c, 0x56, 0x76, 0xcf, 0x3b, 0x72, 0x68, 0x15, 0xce, 0xef, 0xe7, 0xa8, 0x97, 0x6d, 0x70,
|
||||
0x32, 0x2e, 0xa4, 0x40, 0xe4, 0x51, 0x18, 0xf9, 0x13, 0x02, 0xfd, 0xe6, 0x44, 0x1e, 0xd1, 0xf3,
|
||||
0x22, 0x2e, 0x38, 0x29, 0xb9, 0xbf, 0xa9, 0x1a, 0xb1, 0xf2, 0x42, 0xc4, 0x10, 0x0c, 0x7f, 0xd7,
|
||||
0xa3, 0x91, 0x17, 0xb5, 0x7e, 0xa2, 0xfe, 0x41, 0x9c, 0x9f, 0x6b, 0x29, 0xfb, 0xa2, 0x0d, 0x99,
|
||||
0xa8, 0x6e, 0x45, 0x72, 0xdf, 0x47, 0x24, 0x7b, 0xa8, 0x64, 0x9a, 0x9f, 0x0a, 0x25, 0x13, 0xe7,
|
||||
0x53, 0xd1, 0xf9, 0x16, 0x1b, 0xa4, 0x12, 0x0a, 0x03, 0x2f, 0xb4, 0x0a, 0xa3, 0xe2, 0x15, 0xdf,
|
||||
0x34, 0xd6, 0x17, 0xc9, 0xdd, 0x4d, 0x97, 0x94, 0x73, 0x0b, 0x16, 0xd2, 0xc2, 0xc9, 0x17, 0xd7,
|
||||
0x23, 0x90, 0x4f, 0x0e, 0xf3, 0xfb, 0xb5, 0x88, 0x91, 0x13, 0x8c, 0xa1, 0x53, 0x8b, 0x56, 0x6c,
|
||||
0x4b, 0xc9, 0xa8, 0x7f, 0x32, 0x02, 0xf9, 0x61, 0xb3, 0xca, 0x81, 0xe8, 0x3d, 0x9b, 0x88, 0x3b,
|
||||
0x90, 0x6e, 0xc3, 0x92, 0x40, 0x83, 0x49, 0xaf, 0x17, 0xf9, 0x98, 0x82, 0xd1, 0x97, 0xca, 0xb0,
|
||||
0xd6, 0x2f, 0xc4, 0x6b, 0xf0, 0x3a, 0xcb, 0x26, 0x28, 0x2a, 0x6d, 0x32, 0x56, 0x0f, 0x86, 0x5f,
|
||||
0x76, 0x66, 0x64, 0x22, 0x34, 0x5a, 0x66, 0x42, 0x9d, 0x3f, 0xd9, 0x7c, 0xde, 0x79, 0x3b, 0xe2,
|
||||
0xc8, 0xd6, 0x08, 0x4a, 0x00, 0x44, 0xc4, 0x07, 0x4d, 0x32, 0xe2, 0x7f, 0xdc, 0x46, 0x8f, 0xb3,
|
||||
0xa6, 0x39, 0x34, 0x65, 0x06, 0x6b, 0xe0, 0xd2, 0x92, 0x41, 0x58, 0x5c, 0x67, 0x23, 0x79, 0xa9,
|
||||
0xc3, 0xbc, 0x66, 0x1f, 0x8f, 0x18, 0xb5, 0xd5, 0x6a, 0xdc, 0xb8, 0x96, 0xd8, 0x12, 0x1b, 0xe4,
|
||||
0xf6, 0x96, 0x93, 0xaa, 0xaa, 0x42, 0x0d, 0x39, 0xad, 0xc0, 0x6a, 0x1d, 0xb8, 0xe9, 0x63, 0xc9,
|
||||
0x96, 0x45, 0x93, 0x92, 0x1b, 0xe1, 0xc8, 0x63, 0xd7, 0xf4, 0x0a, 0xb1, 0x40, 0x03, 0xc6, 0xe8,
|
||||
0x1a, 0xb5, 0x8a, 0x01, 0xc1, 0x12, 0xf3, 0xdf, 0x02, 0xb4, 0x27, 0xf6, 0x1a, 0x47, 0x44, 0x6a,
|
||||
0x5a, 0x43, 0xc6, 0x1b, 0x05, 0x26, 0x06, 0xc3, 0xcd, 0xdc, 0x00, 0x42, 0xc2, 0xaf, 0xa8, 0x49,
|
||||
0xac, 0x76, 0x88, 0xf2, 0xb2, 0x9d, 0x3d, 0x65, 0xa7, 0xc6, 0x2d, 0x9b, 0xc9, 0x33, 0x68, 0xe0,
|
||||
0x7b, 0x0e, 0x13, 0x77, 0x21, 0xeb, 0x6d, 0x35, 0x9a, 0xe6, 0x40, 0x00, 0x14, 0x11, 0xc1, 0xb7,
|
||||
0x3c, 0xa9, 0x0e, 0x75, 0xed, 0xf7, 0xeb, 0xff, 0xa2, 0xba, 0xc5, 0xcd, 0xf2, 0x70, 0xb7, 0x20,
|
||||
0xb3, 0x20, 0x0b, 0xff, 0x5d, 0xd1, 0xd9, 0xd5, 0x8d, 0xe7, 0x2f, 0xdd, 0xe9, 0x8f, 0x4f, 0x15,
|
||||
0x70, 0x65, 0x93, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE sim_probe_xpm[1] = {{ png, sizeof( png ), "sim_probe_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
static const unsigned char png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
|
||||
0xce, 0x00, 0x00, 0x01, 0x62, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
|
||||
0x03, 0x08, 0x33, 0x4c, 0xb3, 0x11, 0x84, 0xb1, 0x69, 0x81, 0x11, 0x8c, 0x89, 0x76, 0xed, 0x0c,
|
||||
0x93, 0xed, 0xd7, 0x31, 0x4c, 0xb6, 0x53, 0xa4, 0xad, 0x45, 0x93, 0xed, 0xdb, 0x18, 0x26, 0xd9,
|
||||
0xff, 0x07, 0xe2, 0x1f, 0x40, 0xdc, 0xca, 0xd0, 0xed, 0xc6, 0x4d, 0x6b, 0x8b, 0x20, 0x78, 0xb2,
|
||||
0xfd, 0x13, 0x86, 0x49, 0x76, 0xd1, 0x0c, 0xff, 0x19, 0x18, 0xa9, 0x6b, 0x11, 0xc8, 0x17, 0xc8,
|
||||
0x16, 0x21, 0xf0, 0x51, 0x86, 0xc9, 0x0e, 0x26, 0x54, 0xf4, 0x91, 0x43, 0x0b, 0x0e, 0x8b, 0x40,
|
||||
0xf8, 0x1f, 0x10, 0xcf, 0x65, 0x98, 0xe0, 0x2c, 0x4e, 0x6b, 0x8b, 0x60, 0xf8, 0x23, 0x30, 0x38,
|
||||
0x8b, 0x19, 0x66, 0x1a, 0xb3, 0x52, 0x10, 0x74, 0x76, 0xcd, 0x44, 0x58, 0x04, 0xc3, 0x37, 0x81,
|
||||
0xa9, 0xd4, 0x8b, 0xcc, 0xe4, 0x6d, 0xdf, 0x44, 0x82, 0x45, 0xb0, 0x04, 0xb3, 0x95, 0x61, 0x8a,
|
||||
0x8d, 0x1a, 0xed, 0x2d, 0x82, 0xe0, 0x5f, 0x0c, 0x93, 0x1c, 0x7a, 0x18, 0x26, 0x99, 0xf3, 0x11,
|
||||
0x9b, 0xea, 0x1a, 0xc9, 0xb4, 0x08, 0x86, 0x5f, 0x00, 0x83, 0x3f, 0x09, 0x57, 0x76, 0xa0, 0xa6,
|
||||
0x45, 0x30, 0x7c, 0x06, 0x18, 0x7f, 0x56, 0x78, 0x82, 0xce, 0xa1, 0x81, 0x4a, 0x16, 0x41, 0xb1,
|
||||
0xc3, 0x12, 0x86, 0x3e, 0x27, 0x69, 0x2c, 0xc9, 0xdb, 0xae, 0x9e, 0xba, 0x16, 0xd9, 0x3f, 0x07,
|
||||
0xfa, 0x2c, 0x8c, 0x96, 0x16, 0xfd, 0x04, 0xfa, 0xa6, 0x83, 0xa1, 0xd3, 0x9a, 0x17, 0x57, 0x1c,
|
||||
0xd5, 0x51, 0xc1, 0x92, 0x8d, 0x0c, 0x93, 0x9c, 0x94, 0x09, 0x15, 0xaa, 0xb5, 0x14, 0x58, 0x70,
|
||||
0x95, 0x61, 0x8a, 0xbd, 0x2b, 0xb1, 0xa5, 0x37, 0x39, 0x16, 0xbd, 0x03, 0xe2, 0x3c, 0x86, 0x06,
|
||||
0x07, 0x16, 0x12, 0x8a, 0x20, 0x87, 0x1a, 0x12, 0x2c, 0xf8, 0x03, 0x8c, 0xe8, 0xe9, 0x0c, 0x3d,
|
||||
0x0e, 0x22, 0xe4, 0xd4, 0xb0, 0xd5, 0x44, 0x5a, 0xb2, 0x9f, 0x61, 0x92, 0xa3, 0x3e, 0x25, 0x55,
|
||||
0x39, 0x21, 0x8b, 0x1e, 0x00, 0x7d, 0x1d, 0x42, 0x8d, 0x8a, 0xaf, 0x0a, 0x87, 0x05, 0x5f, 0xc1,
|
||||
0xf1, 0x37, 0xdf, 0x81, 0x83, 0x4a, 0x8d, 0x13, 0xfb, 0x4a, 0x2c, 0x96, 0x2c, 0x03, 0xfa, 0x42,
|
||||
0x86, 0xca, 0xad, 0x20, 0x14, 0x8b, 0xce, 0x32, 0x4c, 0x76, 0xb4, 0xa6, 0x51, 0xe3, 0xc4, 0xa1,
|
||||
0x02, 0x68, 0xc1, 0x4b, 0x60, 0x09, 0x91, 0xcc, 0xd0, 0xc0, 0xc0, 0x44, 0xbb, 0xe6, 0x16, 0x30,
|
||||
0x25, 0x11, 0xaa, 0x53, 0x28, 0xc1, 0x00, 0xfb, 0x3a, 0x4b, 0x39, 0x99, 0xc1, 0x7b, 0x69, 0x00,
|
||||
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE sim_run_xpm[1] = {{ png, sizeof( png ), "sim_run_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
static const unsigned char png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
|
||||
0xce, 0x00, 0x00, 0x01, 0x6e, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xd5, 0x96, 0x3d, 0x4b, 0x03,
|
||||
0x41, 0x10, 0x40, 0x4f, 0x11, 0x0c, 0x48, 0x30, 0x3f, 0x41, 0x10, 0x5b, 0x05, 0x6d, 0x2c, 0xc4,
|
||||
0x88, 0x4d, 0x1a, 0xd3, 0x88, 0x8a, 0x90, 0x46, 0x4b, 0x89, 0x16, 0x16, 0x62, 0xa1, 0xf8, 0x0b,
|
||||
0xa2, 0x95, 0x42, 0x50, 0xc8, 0x5f, 0xb0, 0x52, 0xac, 0x04, 0xc5, 0xca, 0xc2, 0x54, 0x5a, 0x58,
|
||||
0x89, 0xa0, 0xad, 0x85, 0x9d, 0x5f, 0xe7, 0x5b, 0xd8, 0x83, 0x65, 0x99, 0xdb, 0xec, 0xe6, 0x8c,
|
||||
0xe8, 0xc0, 0x2b, 0x96, 0xec, 0xdc, 0x5b, 0x36, 0x33, 0x73, 0x17, 0xc5, 0x71, 0x1c, 0xfd, 0x06,
|
||||
0xd1, 0x9f, 0x13, 0x11, 0xdd, 0xb0, 0x64, 0x50, 0xee, 0x94, 0x68, 0x10, 0x62, 0x83, 0xc7, 0x1f,
|
||||
0x11, 0x11, 0xf3, 0x30, 0x6e, 0xac, 0xcb, 0x96, 0xe8, 0x03, 0x7a, 0xf4, 0x6f, 0x5d, 0xb0, 0x0a,
|
||||
0x03, 0x41, 0x22, 0xa2, 0xa2, 0x1f, 0xf4, 0x06, 0xdb, 0xb0, 0x0b, 0x2f, 0x96, 0x48, 0x71, 0x07,
|
||||
0x55, 0x38, 0xd1, 0xeb, 0x87, 0x34, 0x99, 0x4b, 0x12, 0xb7, 0x89, 0x28, 0x93, 0x44, 0x47, 0x19,
|
||||
0x24, 0xc9, 0x95, 0x16, 0x7d, 0x44, 0x79, 0x7d, 0xaa, 0x76, 0x45, 0x3b, 0x21, 0xff, 0xd1, 0x8d,
|
||||
0xf0, 0x80, 0x27, 0x58, 0x81, 0x51, 0x98, 0x86, 0x1a, 0xbc, 0x0b, 0xfb, 0x16, 0x5a, 0x8a, 0x88,
|
||||
0x1c, 0xcc, 0x08, 0xc9, 0xf7, 0x50, 0x10, 0x0e, 0x54, 0x84, 0x4f, 0x6b, 0xef, 0x15, 0xf4, 0xa7,
|
||||
0x8a, 0x88, 0x3d, 0xc7, 0x75, 0x94, 0x1c, 0x6d, 0xd0, 0x48, 0xc9, 0x79, 0x86, 0x31, 0x49, 0x54,
|
||||
0x4f, 0x49, 0x50, 0x27, 0xee, 0x73, 0x88, 0x2a, 0x8e, 0x03, 0x4e, 0x85, 0x88, 0x54, 0x15, 0xe5,
|
||||
0x1c, 0xa2, 0xc5, 0x50, 0x51, 0xcd, 0x91, 0x30, 0xe9, 0x10, 0xed, 0x07, 0x89, 0x8c, 0xd2, 0x2e,
|
||||
0xc1, 0x97, 0x95, 0xd0, 0x84, 0x5e, 0x41, 0x32, 0xa2, 0xa7, 0x87, 0x2d, 0x58, 0x87, 0x21, 0x35,
|
||||
0x9a, 0x5a, 0x95, 0xf7, 0x99, 0x90, 0x7c, 0x0b, 0xb3, 0xaa, 0xeb, 0x61, 0x18, 0x36, 0xe0, 0x55,
|
||||
0xda, 0xe7, 0x3b, 0x82, 0xd4, 0x80, 0x3c, 0xcf, 0xd0, 0xb0, 0x97, 0xea, 0x95, 0xe2, 0x23, 0xaa,
|
||||
0x66, 0x1c, 0x41, 0x8a, 0x2d, 0x1f, 0xd1, 0x5c, 0x4a, 0xc7, 0x87, 0x70, 0xe8, 0x3b, 0x82, 0x4c,
|
||||
0xd9, 0x05, 0x9c, 0x0a, 0x05, 0x92, 0x70, 0x0d, 0xc7, 0xc6, 0xba, 0xe1, 0x75, 0x75, 0x96, 0x6c,
|
||||
0x2d, 0xa9, 0x1c, 0x5d, 0x8d, 0xb6, 0x64, 0xd3, 0xd8, 0xbf, 0x0c, 0x07, 0x92, 0x24, 0xf4, 0x55,
|
||||
0x9e, 0x17, 0x44, 0x13, 0x1d, 0xf9, 0x0a, 0xd2, 0x4d, 0x5d, 0x37, 0x28, 0xfc, 0xdf, 0xcf, 0xad,
|
||||
0xac, 0x7c, 0x03, 0x01, 0x1d, 0x36, 0xf5, 0x73, 0x3f, 0xe1, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x49,
|
||||
0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE sim_settings_xpm[1] = {{ png, sizeof( png ), "sim_settings_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,23 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
static const unsigned char png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
|
||||
0xce, 0x00, 0x00, 0x00, 0x5a, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
|
||||
0x03, 0x3d, 0x30, 0xc3, 0xf0, 0xb5, 0xe8, 0x8c, 0xb1, 0x31, 0xeb, 0x2d, 0x55, 0xd9, 0x65, 0x40,
|
||||
0xbc, 0x94, 0x1a, 0xf8, 0xb6, 0x8a, 0x6c, 0x2b, 0x56, 0x8b, 0xee, 0x2b, 0x28, 0x70, 0x00, 0x15,
|
||||
0xfc, 0x04, 0xe2, 0xff, 0x54, 0xc2, 0x07, 0x47, 0x2d, 0x1a, 0xb5, 0x68, 0xd4, 0xa2, 0x51, 0x8b,
|
||||
0x46, 0x2d, 0x1a, 0xb5, 0x68, 0xd4, 0xa2, 0xdb, 0x2a, 0x2a, 0xec, 0x40, 0xc9, 0x2b, 0xb7, 0x54,
|
||||
0xe5, 0xae, 0x51, 0x03, 0xdf, 0x54, 0x93, 0x5d, 0x39, 0x42, 0x5a, 0x41, 0xb4, 0xc6, 0x00, 0xc9,
|
||||
0x67, 0x4f, 0x6a, 0x0a, 0x58, 0xfb, 0xec, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
|
||||
0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE sim_stop_xpm[1] = {{ png, sizeof( png ), "sim_stop_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,44 @@
|
|||
|
||||
/* Do not modify this file, it was automatically generated by the
|
||||
* PNG2cpp CMake script, using a *.png file as input.
|
||||
*/
|
||||
|
||||
#include <bitmaps.h>
|
||||
|
||||
static const unsigned char png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
|
||||
0xce, 0x00, 0x00, 0x01, 0xad, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
|
||||
0x03, 0x3d, 0x30, 0x4d, 0x0d, 0x57, 0x13, 0x2e, 0x94, 0xa6, 0xa9, 0x45, 0x1a, 0x22, 0x45, 0x6a,
|
||||
0x1a, 0x62, 0x79, 0xbb, 0x35, 0xc4, 0xf2, 0xbf, 0x6b, 0x89, 0xe7, 0x9b, 0xd3, 0xc4, 0x22, 0x35,
|
||||
0x89, 0x7c, 0x53, 0xa0, 0x05, 0x5f, 0x80, 0xf8, 0xbf, 0xba, 0x58, 0xfe, 0x7b, 0x15, 0x89, 0x5c,
|
||||
0x51, 0xaa, 0x5b, 0x64, 0x20, 0x50, 0x20, 0x00, 0xb4, 0xe0, 0x32, 0xc8, 0x12, 0x10, 0xd6, 0x14,
|
||||
0x2d, 0xc8, 0xa6, 0x7a, 0xd0, 0x69, 0x8b, 0x66, 0xf1, 0x00, 0x0d, 0x3f, 0x0e, 0xb5, 0xe4, 0x27,
|
||||
0x30, 0xe8, 0xea, 0xa9, 0x9e, 0x18, 0x64, 0x64, 0x0a, 0x39, 0x35, 0xc4, 0x0b, 0x0e, 0x40, 0x2d,
|
||||
0xf9, 0xaa, 0x29, 0x5e, 0xe8, 0x42, 0xf5, 0x54, 0xa7, 0xa2, 0x92, 0xcb, 0xae, 0x21, 0x56, 0xb0,
|
||||
0x13, 0x6a, 0xc9, 0x27, 0x2d, 0xd1, 0x42, 0x5b, 0xaa, 0x27, 0x6f, 0x63, 0x86, 0x34, 0x56, 0xa0,
|
||||
0xe1, 0x1b, 0xc1, 0x96, 0x88, 0xe7, 0xbf, 0x53, 0x93, 0x28, 0x34, 0xa3, 0x7a, 0x3e, 0x62, 0x60,
|
||||
0x08, 0x65, 0xd6, 0x14, 0x2f, 0x58, 0x09, 0xf5, 0xc9, 0x2b, 0x6d, 0xd1, 0x02, 0x03, 0xaa, 0x67,
|
||||
0x58, 0x20, 0x60, 0x04, 0x1a, 0xbe, 0x10, 0x6a, 0xc9, 0x33, 0x6d, 0x89, 0x5c, 0x2d, 0x9a, 0x94,
|
||||
0x0c, 0x40, 0xc3, 0x67, 0x40, 0x2d, 0x79, 0xa8, 0x2d, 0x5a, 0xa8, 0x42, 0x93, 0x22, 0x48, 0x5d,
|
||||
0x34, 0xbf, 0x1f, 0x9c, 0x47, 0xc4, 0xf2, 0xef, 0x68, 0x4a, 0x66, 0xcb, 0x53, 0xad, 0xac, 0xd3,
|
||||
0x10, 0xcd, 0xcf, 0x01, 0xa6, 0xaa, 0x6e, 0x07, 0x86, 0x06, 0x16, 0x6d, 0x99, 0x42, 0x21, 0xa0,
|
||||
0x25, 0xb7, 0x80, 0x11, 0x7f, 0x5d, 0x5d, 0x24, 0x47, 0x8a, 0xaa, 0x85, 0x2a, 0x3c, 0xe9, 0x8a,
|
||||
0xe6, 0xef, 0x03, 0x59, 0x04, 0xf2, 0x85, 0xb2, 0x78, 0x89, 0x18, 0x55, 0x4b, 0x6f, 0x4d, 0x91,
|
||||
0x02, 0x23, 0xa0, 0x25, 0xcf, 0x61, 0x45, 0x0a, 0x10, 0x1f, 0x03, 0xe5, 0x1b, 0xaa, 0x55, 0x13,
|
||||
0x6a, 0x52, 0xc5, 0x22, 0xc0, 0x38, 0x98, 0x0e, 0x34, 0xf8, 0x2f, 0x92, 0x25, 0x90, 0xf2, 0x4b,
|
||||
0x3c, 0x6f, 0x2e, 0x55, 0x2c, 0x02, 0x5a, 0x10, 0x07, 0x34, 0xf0, 0x03, 0xba, 0x05, 0x50, 0xfc,
|
||||
0x16, 0x58, 0x22, 0xef, 0xa1, 0xd8, 0x22, 0xa0, 0x41, 0xe9, 0x40, 0xfc, 0x0f, 0x87, 0x25, 0x75,
|
||||
0x54, 0xa9, 0x61, 0x81, 0xa5, 0xaf, 0x04, 0xac, 0x1e, 0xc1, 0xc4, 0x05, 0x0f, 0x40, 0x05, 0x27,
|
||||
0x55, 0x2c, 0x42, 0xca, 0x84, 0x18, 0x18, 0x98, 0x77, 0x42, 0xa9, 0xd2, 0x66, 0x50, 0x13, 0xce,
|
||||
0xd1, 0x00, 0x1a, 0xf8, 0x1b, 0xab, 0x45, 0xe2, 0xf9, 0x5b, 0xa8, 0xd6, 0x38, 0x01, 0x26, 0x80,
|
||||
0xc5, 0x38, 0x7c, 0x73, 0x50, 0x4f, 0xbc, 0x84, 0x9b, 0x6a, 0x16, 0x21, 0xd5, 0x8c, 0x30, 0x7c,
|
||||
0x0f, 0xe8, 0x93, 0x28, 0x50, 0xe1, 0x49, 0xd5, 0xe6, 0x96, 0x86, 0x68, 0x41, 0x02, 0xa8, 0xd2,
|
||||
0x02, 0xc6, 0xc5, 0x23, 0x75, 0xf1, 0xbc, 0x7c, 0x6d, 0xed, 0x06, 0xb6, 0x21, 0xd5, 0xae, 0x43,
|
||||
0xc6, 0x00, 0xc1, 0x11, 0xfb, 0x4d, 0x3d, 0x78, 0x20, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
|
||||
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
||||
|
||||
const BITMAP_OPAQUE sim_tune_xpm[1] = {{ png, sizeof( png ), "sim_tune_xpm" }};
|
||||
|
||||
//EOF
|
|
@ -0,0 +1,874 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="sim_add_signal.svg">
|
||||
<metadata
|
||||
id="metadata50">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1000"
|
||||
id="namedview48"
|
||||
showgrid="true"
|
||||
inkscape:zoom="18.980741"
|
||||
inkscape:cx="10.347211"
|
||||
inkscape:cy="9.8544862"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3006"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style3201"
|
||||
type="text/css">
|
||||
.fil0 {fill:#00923F}
|
||||
</style>
|
||||
<style
|
||||
id="style3753"
|
||||
type="text/css">
|
||||
@font-face { font-family:"Times New Roman";src:url("#FontID0") format(svg)}
|
||||
.str1 {stroke:white;stroke-width:0.0762}
|
||||
.str0 {stroke:#28166F;stroke-width:5.6444}
|
||||
.fil1 {fill:none}
|
||||
.fil2 {fill:#28166F}
|
||||
.fil3 {fill:white}
|
||||
.fil0 {fill:#28166F;fill-rule:nonzero}
|
||||
.fnt0 {font-weight:normal;font-size:23.2785;font-family:'Times New Roman'}
|
||||
</style>
|
||||
<font
|
||||
font-weight="400"
|
||||
style="fill-rule:nonzero"
|
||||
font-variant="normal"
|
||||
id="FontID0">
|
||||
<font-face
|
||||
id="font-face3377"
|
||||
font-family="Times New Roman" />
|
||||
<missing-glyph
|
||||
id="missing-glyph3379">
|
||||
<path
|
||||
id="path3381"
|
||||
d="M0 0z" />
|
||||
</missing-glyph>
|
||||
<glyph
|
||||
id="glyph3383"
|
||||
horiz-adv-x="277"
|
||||
unicode="/">
|
||||
<path
|
||||
id="path3385"
|
||||
d="M280.332 694.332l-239.831 -707.997 -39.0017 0 239.668 707.997 39.1649 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3387"
|
||||
horiz-adv-x="249"
|
||||
unicode=".">
|
||||
<path
|
||||
id="path3389"
|
||||
d="M124.999 94.6668c15.3317,0 28.1676,-5.16786 38.499,-15.8344 10.5033,-10.499 15.6668,-23.3305 15.6668,-38.3315 0,-15.001 -5.3311,-27.6693 -15.8301,-38.3358 -10.5033,-10.499 -23.3348,-15.8301 -38.3358,-15.8301 -15.001,0 -27.8325,5.3311 -38.3315,15.8301 -10.5033,10.6665 -15.8344,23.3348 -15.8344,38.3358 0,15.3317 5.3311,28.1676 15.8344,38.6666 10.499,10.3314 23.3305,15.4993 38.3315,15.4993z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3391"
|
||||
horiz-adv-x="332"
|
||||
unicode="-">
|
||||
<path
|
||||
id="path3393"
|
||||
d="M40.5009 261.168l252.499 0 0 -73.6688 -252.499 0 0 73.6688z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3395"
|
||||
horiz-adv-x="249"
|
||||
unicode=",">
|
||||
<path
|
||||
id="path3397"
|
||||
d="M53.6675 -166.501l0 21.5005c33.4987,11.0016 59.5013,28.1676 77.999,51.5025 18.3345,23.3305 27.5018,47.9971 27.5018,73.9996 0,6.16449 -1.50353,11.3323 -4.33447,15.6668 -2.33262,2.83094 -4.66525,4.33018 -6.83463,4.33018 -3.66433,0 -11.4999,-3.33355 -23.4981,-9.83311 -5.83371,-2.83094 -12.0025,-4.33018 -18.5021,-4.33018 -15.9976,0 -28.6659,4.66525 -38.164,14.1633 -9.33479,9.50233 -14.1676,22.5014 -14.1676,39.0017 0,16.0019 6.16449,29.6669 18.3345,40.9992 12.1657,11.4999 27.1667,17.1661 44.6635,17.1661 21.5005,0 40.6684,-9.3305 57.3362,-28.1633 16.831,-18.6696 25.1649,-43.5037 25.1649,-74.3347 0,-33.4987 -11.6674,-64.6691 -34.8347,-93.5026 -23.3305,-28.8292 -60.1671,-51.4982 -110.664,-68.1659z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3399"
|
||||
horiz-adv-x="564"
|
||||
unicode="+">
|
||||
<path
|
||||
id="path3401"
|
||||
d="M261.168 68.8318l0 243.667 -243.169 0 0 40.0026 243.169 0 0 242.666 39.1649 0 0 -242.666 244.165 0 0 -40.0026 -244.165 0 0 -243.667 -39.1649 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3403"
|
||||
horiz-adv-x="499"
|
||||
unicode="*">
|
||||
<path
|
||||
id="path3405"
|
||||
d="M241.167 509.835c-1.3317,22.3296 -5.83371,44.6635 -13.665,66.8299 -11.0016,31.8362 -16.5002,53.8351 -16.5002,65.8333 0,17.0028 3.9994,29.8344 11.8307,38.6666 8.00309,8.83648 17.8362,13.1667 29.6669,13.1667 10.0006,0 18.8328,-4.33018 26.3333,-13.1667 7.50048,-8.83218 11.1691,-21.333 11.1691,-37.6657 0,-14.6659 -4.33447,-34.998 -12.8359,-61.168 -8.66465,-26.3333 -14,-50.4972 -15.9976,-72.4961 17.9994,11.3323 33.997,25.1649 48.3322,41.4975 22.1664,25.6675 38.6666,41.6694 49.3331,47.8338 10.834,6.16878 21.6681,9.16726 32.8329,9.16726 10.6665,0 19.6662,-3.66862 26.9992,-11.0016 7.33295,-7.16541 11.0016,-15.9976 11.0016,-25.9982 0,-12.1657 -5.3354,-22.8322 -16.1651,-32.3346 -10.6665,-9.33479 -37.5024,-18.8328 -80.5035,-28.3309 -24.9973,-5.50293 -45.832,-11.835 -62.4997,-19.0004 17.0028,-8.83648 37.67,-15.5036 62.0014,-20.0013 39.3324,-7.16541 65.1674,-16.1651 77.3332,-26.8316 12.3333,-10.834 18.3345,-22.5014 18.3345,-35.1698 0,-9.83311 -3.66862,-18.167 -11.0016,-25.3324 -7.33295,-7.16541 -15.8344,-10.834 -25.4999,-10.834 -9.83311,0 -20.6671,3.50108 -32.4978,10.3357 -11.835,6.83034 -28.0001,22.1664 -48.1689,45.832 -13.3342,16.0019 -29.8344,30.9986 -49.8314,44.9986 0.66585,-18.6653 4.49771,-38.8341 11.3323,-60.6654 11.6674,-38.3315 17.5011,-64.5016 17.5011,-78.5016 0,-12.9991 -3.83616,-23.9964 -11.6674,-33.0004 -7.83556,-8.99972 -16.1694,-13.4974 -24.8341,-13.4974 -12.1657,0 -22.9998,4.83279 -32.8329,14.1676 -6.83463,6.83034 -10.1682,17.8319 -10.1682,32.8329 0,15.4993 3.66862,34.3321 11.1691,56.3309 7.50048,22.0031 12.1657,37.1673 14.1633,45.3337 2.00185,8.33387 3.83616,20.6671 5.3354,36.9998 -19.1679,-12.8316 -35.9989,-26.8316 -50.1665,-42.4984 -23.8332,-26.6684 -41.6651,-43.6669 -53.8351,-50.8323 -8.49711,-5.16786 -17.1661,-7.83556 -26.3333,-7.83556 -10.9973,0 -20.4996,3.83616 -28.3309,11.3323 -7.83556,7.50048 -11.6674,15.6668 -11.6674,24.8341 0,8.16633 3.33355,16.6677 10.0006,25.6675 6.6671,8.99972 16.6677,16.3327 29.9976,22.1664 8.83648,3.9994 28.8335,9.16726 59.9996,15.6668 20.1688,4.16694 40.0026,10.3357 59.1705,18.5021 -17.6687,8.83218 -38.6666,15.6668 -63.0023,20.4996 -39.9983,8.49711 -64.8324,16.1651 -74.1671,22.9998 -14.6659,10.6665 -21.9988,23.8332 -21.9988,38.9974 0,8.83648 3.66433,16.8353 11.0016,24.1682 7.33295,7.33295 15.8301,11.0016 25.6632,11.0016 10.6665,0 22.0031,-3.33355 34.1689,-10.1682 11.9982,-6.83463 26.9992,-20.6671 44.8311,-41.3343 18.0037,-20.6671 36.1664,-36.6647 54.6685,-47.9971z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3407"
|
||||
horiz-adv-x="332"
|
||||
unicode=")">
|
||||
<path
|
||||
id="path3409"
|
||||
d="M22.5014 673.832l0 20.4996c49.5006,-24.3315 90.6674,-53.1649 123.5,-86.5004 46.4978,-47.4988 82.4967,-103.164 107.833,-167.163 25.4999,-64.0033 38.164,-130.67 38.164,-200 0,-100.836 -24.8341,-192.835 -74.4979,-276.001 -49.6681,-83.1669 -114.668,-142.668 -195,-178.499l0 17.9994c39.9983,22.5014 72.9987,52.8342 98.8337,91.1657 25.8307,38.1683 45.1661,86.8355 57.6669,146.002 12.4965,58.9986 18.8328,120.665 18.8328,184.664 0,69.3344 -5.50293,132.667 -16.1694,190.004 -8.16633,44.9986 -18.3302,80.83 -30.5002,107.997 -12.3333,27.0035 -28.4984,53.0017 -48.6672,78.0033 -20.1645,25.1649 -46.8329,48.998 -79.9966,71.8302z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3411"
|
||||
horiz-adv-x="332"
|
||||
unicode="(">
|
||||
<path
|
||||
id="path3413"
|
||||
d="M310.501 -195.833l0 -17.9994c-49.1698,24.6665 -90.169,53.6675 -123.002,86.8312 -46.8329,47.168 -82.9993,102.833 -108.332,167 -25.4999,64.1665 -38.1683,130.67 -38.1683,199.669 0,100.999 25.0016,192.998 74.6655,276.165 49.8357,83.1669 114.836,142.668 194.836,178.499l0 -20.4996c-40.0026,-22.1664 -72.8354,-52.3316 -98.6662,-90.8306 -25.6675,-38.3358 -44.8354,-87.003 -57.5037,-146.002 -12.664,-58.8311 -18.9961,-120.502 -18.9961,-184.501 0,-69.6651 5.3311,-132.998 15.9976,-189.999 8.50141,-44.9986 18.8328,-81.0018 30.8353,-108.168 11.9982,-27.1667 28.1633,-53.3325 48.4997,-78.3298 20.3321,-25.1691 47.0005,-49.0023 79.8333,-71.8345z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3415"
|
||||
horiz-adv-x="180"
|
||||
unicode="'">
|
||||
<path
|
||||
id="path3417"
|
||||
d="M77.1656 392.169l-26.3333 144.498c-7.50048,39.9983 -11.3323,67.0017 -11.3323,81.0018 0,20.8304 4.33447,35.9989 12.6683,45.4969 8.49711,9.33479 20.1645,14 34.6629,14 14.6702,0 26.8359,-4.66525 36.5015,-14.3308 9.50233,-9.66987 14.3351,-22.1664 14.3351,-37.8332 0,-12.0025 -4.16694,-41.6694 -12.6683,-88.833l-26.3333 -144 -21.5005 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3419"
|
||||
horiz-adv-x="777"
|
||||
unicode="&">
|
||||
<path
|
||||
id="path3421"
|
||||
d="M510.334 426.333l205 0 0 -18.167c-28.3352,-2.16509 -49.1655,-8.50141 -62.6673,-18.8328 -13.665,-10.1682 -34.6672,-41.1667 -63.3331,-93 -28.6659,-51.6657 -60.833,-100.002 -96.6686,-145.001 29.001,-33.8338 54.836,-57.4994 77.6682,-71.0011 22.8322,-13.4974 45.6688,-20.3321 68.8318,-20.3321 22.5014,0 41.5018,6.16878 57.1686,18.3345 15.4993,12.1657 26.6684,30.1652 33.1679,53.9983l17.9994 -13.1667c-12.0025,-45.9995 -31.3336,-79.8333 -58.002,-101.665 -26.6641,-21.6681 -57.8302,-32.6696 -93.3308,-32.6696 -26.6684,0 -53.8351,7.33724 -81.3369,21.8356 -27.4975,14.3308 -57.4994,38.8341 -89.9972,73.3338 -40.3334,-35.6681 -76.8348,-60.5022 -109.169,-74.3347 -32.3303,-13.8325 -66.9974,-20.8347 -103.83,-20.8347 -53.6675,0 -96.3335,14.3351 -127.835,43.0011 -31.6687,28.6659 -47.3355,62.8348 -47.3355,102.502 0,39.5 14.1676,78.6649 42.5027,117.997 28.3309,39.1692 81.5001,79.8333 159.667,121.833 -15.336,33.8338 -25.835,61.5031 -31.3336,83.1669 -5.49864,21.6681 -8.33387,42.5027 -8.33387,62.3322 0,55.6694 20.4996,98.1678 61.4988,127.336 31.9995,22.8322 68.3334,34.1646 109.002,34.1646 38.6666,0 70.331,-11.3323 94.6668,-34.3321 24.499,-22.9998 36.6647,-51.1674 36.6647,-84.6661 0,-34.4996 -11.8307,-64.8324 -35.5006,-90.8349 -23.4981,-26.1658 -65.3307,-54.5009 -125.167,-85.4995 41.3343,-73.5013 84.5029,-141.001 129.334,-202.165 57.3362,68.3334 86.0021,126 86.0021,172.833 0,14.9967 -4.83279,28.3309 -14.6659,39.9983 -7.16971,8.83218 -17.3336,14 -30.6678,15.6668l0 18.167zm-186.666 -12.8316c40.5009,19.3311 70.6661,41.1667 90.6674,65.4982 19.997,24.499 29.9976,51.6657 29.9976,81.5001 0,23.4981 -7.16541,42.8335 -21.6681,58.1653 -14.4984,15.336 -32.4978,22.9998 -53.9983,22.9998 -28.3352,0 -49.6681,-9.83311 -64.1665,-29.6669 -14.4984,-19.6662 -21.8313,-38.9974 -21.8313,-57.8302 0,-16.0019 2.83094,-33.6663 8.32957,-53.5 5.50293,-19.6662 16.5002,-48.6672 32.6696,-87.1663zm75.6664 -305.17c-42.8335,58.6679 -72.6679,101.501 -89.3357,128.501 -16.5002,26.9992 -34.8304,60.5022 -54.6642,100.5 -39.0017,-22.3339 -68.3334,-47.168 -88.1672,-74.1671 -19.6662,-26.9992 -29.4993,-56.3309 -29.4993,-87.8321 0,-34.8347 11.3323,-65.4982 33.6663,-91.8315 22.4972,-26.3333 52.8342,-39.5 90.8306,-39.5 20.5039,0 40.3334,3.9994 59.3337,12.1657 19.0004,8.16633 45.0029,25.4999 77.8358,52.164z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3423"
|
||||
horiz-adv-x="833"
|
||||
unicode="%">
|
||||
<path
|
||||
id="path3425"
|
||||
d="M679.666 677.166l-482.333 -704.5 -43.4994 0 482.333 704.5 43.4994 0zm-502 0c44.002,0 78.1665,-18.167 102.335,-54.6642 24.3315,-36.334 36.334,-78.1665 36.334,-125.502 0,-56.4985 -13.6693,-100.333 -41.0035,-131.331 -27.3299,-30.8353 -60.1628,-46.3346 -98.4986,-46.3346 -25.8307,0 -49.3331,7.00217 -70.8336,21.1655 -21.5005,14.1676 -38.6666,35.333 -51.4982,63.3331 -12.8359,28.0001 -19.3354,59.0029 -19.3354,93.1675 0,34.3321 6.49956,65.6657 19.503,94.4992 12.9991,28.8335 30.831,50.334 53.5,64.5016 22.6647,14.1676 45.832,21.1655 69.4976,21.1655zm-1.3317 -27.3342c-16.6677,0 -31.3336,-9.66557 -44.3328,-29.1643 -12.8359,-19.6662 -19.1679,-60.6654 -19.1679,-123.165 0,-45.1704 3.50108,-79.6701 10.6665,-103.503 5.49864,-17.8319 14.1676,-31.6644 25.835,-41.4975 6.99787,-5.83371 15.3317,-8.66894 25.4999,-8.66894 15.6668,0 28.9967,8.33387 39.9983,25.3324 16.3327,25.0016 24.499,66.8342 24.499,125.502 0,61.8339 -7.9988,105.333 -24.0007,130.335 -10.3314,16.6634 -23.4981,24.8298 -38.9974,24.8298zm480.834 -321.163c23.163,0 46.1628,-7.33295 69.1668,-22.0031 22.9998,-14.6659 40.6641,-35.9989 53.1649,-63.999 12.5008,-28.0001 18.8328,-58.6679 18.8328,-92.3341 0,-57.4994 -13.8325,-101.665 -41.5018,-131.997 -27.665,-30.5002 -60.3303,-45.6688 -98.1635,-45.6688 -23.6699,0 -46.8329,7.33295 -68.9993,21.9988 -22.3339,14.6702 -40.0026,35.5006 -52.8342,62.6673 -12.8359,27.1667 -19.3354,58.1696 -19.3354,93 0,34.1689 6.49956,65.5025 19.3354,93.8334 12.8316,28.3352 30.5002,49.5006 52.8342,63.5007 22.1664,14 44.8311,21.0022 67.5001,21.0022zm0.498314 -26.0025c-15.4993,0 -29.1685,-8.66465 -40.5009,-26.3333 -14.6659,-22.8322 -21.9988,-65.8333 -21.9988,-129.334 0,-58.3328 7.50048,-98.9969 22.5014,-122.164 10.9973,-16.5002 24.499,-24.8341 39.9983,-24.8341 15.001,0 28.3352,8.99972 40.1658,26.8316 15.4993,23.8332 23.3348,64.6691 23.3348,122.504 0,61.3313 -7.83556,104.165 -23.3348,128.496 -10.834,16.6677 -24.1682,24.8341 -40.1658,24.8341z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3427"
|
||||
horiz-adv-x="499"
|
||||
unicode="$">
|
||||
<path
|
||||
id="path3429"
|
||||
d="M52.6666 163.168l21.5005 0c3.66433,-44.6678 17.6644,-78.8324 42.0001,-102.67 24.499,-23.6656 61.0005,-37.8332 109.5,-42.4984l0 285.169c-73.3338,45.3337 -122.169,85.332 -146.5,120.167 -17.3336,24.6665 -26.0025,54.8317 -26.0025,90.3323 0,39.9983 15.001,75.0005 44.6678,104.998 29.8344,30.0019 72.3328,48.0014 127.835,54.1702l0 44.9986 31.1661 0 0 -44.9986c26.6684,-1.66677 49.1655,-4.66954 67.3325,-9.33479 9.50233,-2.16938 40.6684,-13.5017 93.8334,-33.6663l0 -146.002 -19.0004 0c-4.33447,51.8332 -17.6644,89.6664 -40.3334,113.5 -22.6647,24.0007 -56.4985,38.1683 -101.832,42.8335l0 -247.997c81.9984,-57.3362 134.665,-99.6671 158,-126.834 23.1673,-27.1667 34.8347,-60.833 34.8347,-101.334 0,-44.8354 -17.0028,-84.3353 -50.9998,-118.667 -34.0013,-34.1689 -81.3369,-53.8351 -141.835,-58.9986l0 -62.4997 -31.1661 0 0 62.4997c-30.6678,1.3317 -59.1662,4.83279 -85.4995,10.499 -26.3333,5.66617 -55.5019,15.001 -87.5013,28.0001l0 138.334zm173.001 249.501l0 226.999c-32.6653,-3.9994 -56.8336,-14.3351 -72.6679,-31.0029 -15.6668,-16.831 -23.6656,-37.8332 -23.6656,-63.3331 0,-23.6656 7.16541,-45.832 21.5005,-66.4991 14.3308,-20.6671 39.3324,-42.8335 74.833,-66.1641zm31.1661 -394.669c24.499,4.33447 43.1643,10.3357 56.1677,18.167 18.167,11.3323 32.6653,26.3333 43.1643,44.6678 10.6665,18.3345 15.8344,38.0007 15.8344,58.8311 0,21.5005 -6.33202,41.8326 -19.1679,61.0005 -12.8316,19.1679 -44.8311,46.3346 -95.9985,81.5001l0 -264.167z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3431"
|
||||
horiz-adv-x="499"
|
||||
unicode="#">
|
||||
<path
|
||||
id="path3433"
|
||||
d="M56.1677 -13.665l45.3337 222.166 -83.5019 0 0 39.9983 91.3332 0 33.6663 167.502 -124.999 0 0 38.9974 134.334 0 44.5003 222.166 40.5009 0 -44.5003 -222.166 164.667 0 47.3312 222.166 40.5009 0 -46.3346 -222.166 82.9993 0 0 -38.9974 -90.3323 0 -34.1646 -167.502 124.497 0 0 -39.9983 -132.831 0 -45.5012 -222.166 -39.5 0 44.5003 222.166 -165.668 0 -46.3303 -222.166 -40.5009 0zm94.1641 262.165l165.668 0 35.0023 167.502 -166.501 0 -34.1689 -167.502z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3435"
|
||||
horiz-adv-x="408"
|
||||
unicode=""">
|
||||
<path
|
||||
id="path3437"
|
||||
d="M281.333 392.169l-26.5008 142.496 -10.6665 59.1662c-0.66585,8.00309 -0.996628,16.1694 -0.996628,24.3358 0,20.4996 4.49771,35.5006 13.665,44.9986 9.16726,9.33479 21.1655,14 36.1664,14 14,0 25.6675,-4.66525 34.8347,-14 9.3305,-9.49803 14,-22.1664 14,-38.164 0,-27.6693 -3.16601,-57.6669 -9.33479,-89.834l-27.8325 -142.999 -23.3348 0zm-178.835 0l-26.8316 144.498c-7.16541,39.6675 -10.6665,66.6667 -10.6665,81.0018 0,20.8304 4.33447,35.9989 12.8316,45.4969 8.66894,9.33479 20.3364,14 35.0023,14 14.3308,0 26.1658,-4.66525 35.6681,-14.3308 9.3305,-9.66987 14.1633,-22.3339 14.1633,-38.3358 0,-12.664 -4.33018,-42.1677 -12.8316,-88.3304l-26.3333 -144 -21.0022 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3439"
|
||||
horiz-adv-x="332"
|
||||
unicode="!">
|
||||
<path
|
||||
id="path3441"
|
||||
d="M175.832 175.333l-18.6653 0 -42.8335 395.498c-1.99755,17.1704 -2.99847,30.0019 -2.99847,38.5033 0,20.4996 5.49864,36.9998 16.3327,49.3331 11.0016,12.3333 24.0007,18.4978 39.3324,18.4978 15.3317,0 28.1676,-6.16449 38.8341,-18.4978 10.499,-12.3333 15.8344,-30.6678 15.8344,-55.1668 0,-7.83556 -0.670146,-18.6696 -2.00185,-32.6696l-43.8344 -395.498zm-9.83311 -81.165c15.001,0 27.8325,-5.16786 38.3358,-15.8344 10.6665,-10.499 15.8301,-23.1673 15.8301,-37.8332 0,-15.001 -5.16356,-27.6693 -15.8301,-38.3358 -10.5033,-10.499 -23.3348,-15.8301 -38.3358,-15.8301 -14.9967,0 -27.665,5.3311 -38.3315,15.8301 -10.499,10.6665 -15.8344,23.3348 -15.8344,38.3358 0,14.6659 5.3354,27.3342 15.8344,37.8332 10.6665,10.6665 23.3348,15.8344 38.3315,15.8344z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3443"
|
||||
horiz-adv-x="249"
|
||||
unicode=" " />
|
||||
<glyph
|
||||
id="glyph3445"
|
||||
horiz-adv-x="443"
|
||||
unicode="?">
|
||||
<path
|
||||
id="path3447"
|
||||
d="M221.668 156.333l-20.0013 0c2.33262,40.9992 7.33295,74.833 15.3317,101.669 8.00309,26.8316 24.5033,64.3297 49.6681,112.164 19.4987,36.669 32.167,64.9999 38.0007,84.6661 5.83371,19.6662 8.83218,39.6675 8.83218,59.8363 0,41.33 -11.0016,74.1671 -33.0004,98.6662 -21.9988,24.3315 -48.8305,36.4972 -80.8342,36.4972 -28.3309,0 -50.4972,-6.6628 -66.8299,-19.997 -16.337,-13.3342 -24.5033,-27.8325 -24.5033,-43.3361 0,-12.1657 5.00032,-26.9992 14.6702,-44.5003 9.83311,-17.6644 14.6659,-30.9986 14.6659,-39.9983 0,-11.835 -3.66862,-21.6681 -11.1691,-29.6669 -7.50048,-7.83126 -16.6634,-11.835 -27.3299,-11.835 -13.6693,0 -26.1701,6.6671 -37.3349,20.1688 -11.3323,13.5017 -16.8353,32.3346 -16.8353,56.4985 0,36.669 15.6668,69.3344 47.3355,97.6695 31.5012,28.3309 74.3304,42.3309 128.333,42.3309 67.165,0 116.335,-19.4987 147.999,-58.5003 23.5024,-28.6659 35.1655,-60.3303 35.1655,-95.1651 0,-23.8332 -5.3311,-48.1689 -15.8301,-73.3338 -10.6665,-25.0016 -30.6678,-54.5009 -60.3346,-88.3347 -47.168,-53.3325 -76.169,-91.1657 -86.668,-113.5 -10.6665,-22.3339 -16.9985,-52.9974 -19.3311,-91.9991zm-6.83463 -60.6654c15.3317,0 28.3352,-5.3354 38.8341,-15.8344 10.499,-10.499 15.8344,-23.4981 15.8344,-38.8341 0,-15.001 -5.3354,-27.665 -16.0019,-38.3315 -10.834,-10.499 -23.6656,-15.8344 -38.6666,-15.8344 -15.001,0 -27.665,5.3354 -38.3315,15.8344 -10.5033,10.6665 -15.8344,23.3305 -15.8344,38.3315 0,15.336 5.3311,28.3352 15.8344,38.8341 10.6665,10.499 23.3305,15.8344 38.3315,15.8344z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3449"
|
||||
horiz-adv-x="564"
|
||||
unicode=">">
|
||||
<path
|
||||
id="path3451"
|
||||
d="M543.502 318.835l-525.502 -227.502 0 42.0001 452.667 196.331 -452.667 198.17 0 44.5003 525.502 -229.504 0 -23.9964z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3453"
|
||||
horiz-adv-x="564"
|
||||
unicode="=">
|
||||
<path
|
||||
id="path3455"
|
||||
d="M17.9994 431.166l527.001 0 0 -39.9983 -527.001 0 0 39.9983zm0 -159.164l527.001 0 0 -40.0026 -527.001 0 0 40.0026z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3457"
|
||||
horiz-adv-x="564"
|
||||
unicode="<">
|
||||
<path
|
||||
id="path3459"
|
||||
d="M17.9994 344.666l525.502 227.669 0 -42.5027 -452.168 -196.331 452.168 -198.166 0 -44.002 -525.502 229.499 0 23.8332z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3461"
|
||||
horiz-adv-x="277"
|
||||
unicode=";">
|
||||
<path
|
||||
id="path3463"
|
||||
d="M137.668 461.499c15.001,0 27.8325,-5.3311 38.3315,-15.6668 10.6665,-10.499 15.8344,-23.1673 15.8344,-38.164 0,-15.001 -5.16786,-27.6693 -15.8344,-38.3358 -10.499,-10.499 -23.3305,-15.8344 -38.3315,-15.8344 -15.001,0 -27.6693,5.3354 -38.3358,15.8344 -10.499,10.6665 -15.8301,23.3348 -15.8301,38.3358 0,14.9967 5.3311,27.665 15.8301,38.164 10.6665,10.3357 23.3348,15.6668 38.3358,15.6668zm-68.3334 -628l0 21.5005c33.4987,11.0016 59.497,28.1676 77.8315,51.5025 18.5021,23.3305 27.6693,47.9971 27.6693,73.9996 0,6.16449 -1.50353,11.3323 -4.50201,15.6668 -2.16509,2.83094 -4.49771,4.33018 -6.83463,4.33018 -3.49679,0 -11.3323,-3.33355 -23.3305,-9.83311 -5.83371,-2.83094 -12.0025,-4.33018 -18.5021,-4.33018 -15.9976,0 -28.6659,4.66525 -38.164,14.1633 -9.50233,9.50233 -14.1676,22.5014 -14.1676,39.0017 0,16.0019 6.16449,29.6669 18.3302,40.9992 12.17,11.4999 27.0035,17.1661 44.6678,17.1661 21.5005,0 40.6684,-9.3305 57.3362,-28.1633 16.831,-18.6696 25.1649,-43.5037 25.1649,-74.3347 0,-33.4987 -11.6674,-64.6691 -34.8347,-93.5026 -23.3305,-28.8292 -60.1671,-51.4982 -110.664,-68.1659z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3465"
|
||||
horiz-adv-x="277"
|
||||
unicode=":">
|
||||
<path
|
||||
id="path3467"
|
||||
d="M141.165 461c15.001,0 27.6693,-5.3354 38.3358,-16.0019 10.499,-10.499 15.8344,-23.3305 15.8344,-38.3315 0,-14.8334 -5.3354,-27.665 -15.8344,-38.3358 -10.6665,-10.499 -23.3348,-15.8301 -38.3358,-15.8301 -14.9967,0 -27.8325,5.3311 -38.3315,15.8301 -10.6665,10.6708 -16.0019,23.5024 -16.0019,38.3358 0,15.001 5.3354,27.8325 16.0019,38.3315 10.499,10.6665 23.3348,16.0019 38.3315,16.0019zm-0.996628 -365.835c15.3317,0 28.1633,-5.3311 38.8341,-15.9976 10.499,-10.834 15.8301,-23.6656 15.8301,-38.6666 0,-15.001 -5.3311,-27.6693 -16.1651,-38.3358 -10.6665,-10.499 -23.5024,-15.8301 -38.499,-15.8301 -15.001,0 -27.8325,5.3311 -38.3358,15.8301 -10.6665,10.6665 -15.8301,23.3348 -15.8301,38.3358 0,15.001 5.16356,27.8325 15.8301,38.6666 10.5033,10.6665 23.3348,15.9976 38.3358,15.9976z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3469"
|
||||
horiz-adv-x="499"
|
||||
unicode="9">
|
||||
<path
|
||||
id="path3471"
|
||||
d="M52.6666 -13.665l0 17.9994c42.3352,0.66585 81.8352,10.499 118.165,29.6669 36.5015,19.0004 71.8345,52.3316 105.836,99.8303 34.0013,47.5031 57.6669,99.6671 71.0011,156.668 -51.1674,-32.8329 -97.3345,-49.3331 -138.669,-49.3331 -46.4978,0 -86.5004,17.9994 -119.668,53.9983 -33.1636,36.0032 -49.8314,83.6695 -49.8314,143.334 0,58.002 16.6677,109.5 49.8314,154.834 40.0026,54.9992 92.3341,82.501 156.836,82.501 54.3334,0 100.831,-22.5014 139.498,-67.5001 47.6663,-55.6651 71.3362,-124.334 71.3362,-206.001 0,-73.5013 -17.9994,-142.166 -54.1659,-205.834 -36.1707,-63.6639 -86.5004,-116.498 -150.834,-158.331 -52.4991,-34.6672 -109.5,-51.8332 -171.502,-51.8332l-27.8325 0zm302.833 340.331c5.83371,42.3352 8.83218,76.169 8.83218,101.501 0,31.6644 -5.49864,65.6657 -16.1651,102.33 -10.834,36.669 -25.9982,64.6691 -45.6688,84.1678 -19.6662,19.6662 -42.0001,29.3361 -67.165,29.3361 -29.001,0 -54.3334,-13.0034 -76.1647,-39.0017 -21.8356,-25.9982 -32.6696,-64.8324 -32.6696,-116.167 0,-68.6685 14.5027,-122.499 43.4994,-161.166 21.0022,-28.0001 47.168,-42.0001 78.0033,-42.0001 14.9967,0 32.8329,3.50108 53.3325,10.6665 20.4996,7.16541 38.499,17.3336 54.1659,30.3327z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3473"
|
||||
horiz-adv-x="499"
|
||||
unicode="8">
|
||||
<path
|
||||
id="path3475"
|
||||
d="M191.834 333.501c-52.3316,43.0011 -86.1653,77.5007 -101.334,103.499 -15.001,25.9982 -22.6647,53.0017 -22.6647,81.0018 0,42.9968 16.6634,79.9966 49.8314,111.167 33.1679,30.9986 77.3332,46.6654 132.332,46.6654 53.3325,0 96.3335,-14.5027 128.836,-43.4994 32.6653,-29.001 48.8305,-62.0014 48.8305,-99.1688 0,-24.6665 -8.66465,-49.9989 -26.3333,-75.6664 -17.4968,-25.6675 -54.1659,-56.0002 -109.831,-90.8349 57.3319,-44.1652 95.1651,-78.9999 113.835,-104.5 24.6665,-33.1636 36.9998,-68.1659 36.9998,-104.998 0,-46.4978 -17.6687,-86.3329 -53.1692,-119.333 -35.5006,-33.0004 -81.9984,-49.5006 -139.665,-49.5006 -62.8348,0 -111.833,19.6662 -147.003,58.9986 -28.0001,31.6687 -42.0001,66.1684 -42.0001,103.503 0,29.3318 9.8374,58.3328 29.6669,87.1663 19.6705,28.8335 53.5,60.6654 101.669,95.5001zm76.6673 52.164c39.1649,35.1698 63.8314,63.0023 74.3304,83.3344 10.3357,20.3321 15.5036,43.3361 15.5036,69.1668 0,34.1689 -9.50233,60.833 -28.6702,80.1684 -19.3311,19.4987 -45.4969,29.1643 -78.6649,29.1643 -33.1679,0 -60.1671,-9.66557 -81.0018,-28.8335 -20.8304,-19.1636 -31.3293,-41.6651 -31.3293,-67.3325 0,-16.9985 4.33018,-33.8338 12.9991,-50.8323 8.49711,-16.9985 20.8304,-33.0004 36.8323,-48.3322l80.0009 -66.5034zm-53.6675 -70.6661c-26.9992,-22.8322 -47.0005,-47.6663 -59.9996,-74.4979 -12.9991,-26.8359 -19.4987,-56.0002 -19.4987,-87.1663 0,-42.0001 11.3323,-75.6664 34.3321,-100.836 22.9998,-25.1649 52.164,-37.8332 87.6646,-37.8332 35.1698,0 63.3331,9.83311 84.5029,29.8344 21.1655,19.8338 31.6644,43.8344 31.6644,72.1653 0,23.5024 -6.16449,44.5003 -18.4978,63.0023 -23.1673,34.4996 -69.8327,79.6658 -140.168,135.331z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3477"
|
||||
horiz-adv-x="499"
|
||||
unicode="7">
|
||||
<path
|
||||
id="path3479"
|
||||
d="M100.668 662.165l354.834 0 0 -18.6653 -220.667 -657.164 -54.6685 0 197.835 596.164 -182.168 0c-36.8323,0 -62.998,-4.33018 -78.6649,-13.1667 -27.3342,-15.001 -49.3331,-38.0007 -65.8333,-69.3344l-14.1676 5.3354 63.5007 156.831z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3481"
|
||||
horiz-adv-x="499"
|
||||
unicode="6">
|
||||
<path
|
||||
id="path3483"
|
||||
d="M448.165 675.834l0 -18.167c-42.8292,-4.16694 -77.999,-12.6683 -105.166,-25.6675 -27.1667,-12.8316 -53.9983,-32.3346 -80.4992,-58.8311 -26.5008,-26.3333 -48.4997,-55.6694 -66.0008,-87.9997 -17.3336,-32.5021 -31.9995,-71.0011 -43.6669,-115.501 46.8329,32.167 93.8334,48.3322 141.169,48.3322 45.1661,0 84.4986,-18.3345 117.667,-54.6642 33.1679,-36.5015 49.8314,-83.3344 49.8314,-140.671 0,-55.33 -16.831,-105.832 -50.334,-151.333 -40.3334,-55.33 -93.8334,-82.9993 -160.165,-82.9993 -45.3337,0 -83.6652,15.001 -115.334,44.8354 -61.8339,58.3328 -92.6649,133.832 -92.6649,226.664 0,59.1662 11.8307,115.501 35.6638,168.834 23.6699,53.5 57.6669,100.836 101.836,142.166 43.9977,41.3343 86.3329,69.1668 126.666,83.5019 40.3334,14.3351 77.999,21.5005 112.834,21.5005l28.1633 0zm-303.666 -341.835c-5.82941,-43.9977 -8.83218,-79.4982 -8.83218,-106.497 0,-31.1704 5.83371,-65.1674 17.3336,-101.836 11.6674,-36.4972 28.8335,-65.6657 51.6657,-87.1663 16.5002,-15.1642 36.669,-22.8322 60.5022,-22.8322 28.3309,0 53.6675,13.3342 75.8339,39.9983 22.3339,26.6684 33.4987,64.8367 33.4987,114.333 0,55.6694 -11.0016,103.834 -33.1679,144.502 -22.1664,40.6641 -53.5,61.0005 -94.3317,61.0005 -12.3333,0 -25.4999,-2.6677 -39.6675,-7.83556 -14.1676,-5.16356 -35.1655,-16.5002 -62.8348,-33.6663z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3485"
|
||||
horiz-adv-x="499"
|
||||
unicode="5">
|
||||
<path
|
||||
id="path3487"
|
||||
d="M434.165 662.165l-38.164 -82.9993 -199.167 0 -43.4994 -89.0006c86.3329,-12.664 154.666,-44.6635 205,-96.166 43.3318,-44.1652 64.9999,-96.3335 64.9999,-156.166 0,-34.8347 -7.00217,-67.165 -21.1697,-96.6686 -14.1633,-29.6626 -31.9995,-54.8317 -53.5,-75.6664 -21.5005,-20.8304 -45.4969,-37.6657 -71.8302,-50.3297 -37.3349,-18.0037 -75.8339,-26.8359 -115.166,-26.8359 -39.835,0 -68.6685,6.6671 -86.668,20.1688 -18.167,13.4974 -27.1667,28.4984 -27.1667,44.6635 0,9.16726 3.83186,17.1704 11.1648,24.1682 7.50048,7.00217 17.0028,10.499 28.3352,10.499 8.50141,0 15.9976,-1.16416 22.3339,-3.83186 6.33202,-2.6677 17.1661,-9.33479 32.4978,-20.0013 24.3358,-16.9985 49.0023,-25.4999 74.1671,-25.4999 38.0007,0 71.4995,14.5027 100.333,43.3361 28.8335,28.8335 43.1686,63.8314 43.1686,105.166 0,39.9983 -12.8359,77.3332 -38.499,112 -25.835,34.6672 -61.168,61.4988 -106.502,80.3316 -35.5006,14.6659 -83.8327,23.1673 -145.001,25.4999l127.001 257.332 237.331 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3489"
|
||||
horiz-adv-x="499"
|
||||
unicode="4">
|
||||
<path
|
||||
id="path3491"
|
||||
d="M465.335 244.165l0 -69.3301 -88.833 0 0 -174.835 -80.6667 0 0 174.835 -280.168 0 0 62.4997 307.168 438.499 53.6675 0 0 -431.669 88.833 0zm-169.5 0l0 328.668 -232.335 -328.668 232.335 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3493"
|
||||
horiz-adv-x="499"
|
||||
unicode="3">
|
||||
<path
|
||||
id="path3495"
|
||||
d="M50.8323 536.169c18.8328,44.496 42.666,78.9999 71.4995,103.164 28.8335,24.3358 64.6691,36.5015 107.67,36.5015 52.9974,0 93.6658,-17.3336 121.997,-51.8332 21.5005,-25.6675 32.3346,-53.1692 32.3346,-82.501 0,-48.1646 -30.3327,-98.0003 -90.8349,-149.331 40.6684,-16.0019 71.3362,-38.8341 92.1666,-68.501 20.8347,-29.4993 31.3336,-64.334 31.3336,-104.5 0,-57.1686 -18.167,-106.832 -54.6642,-148.833 -47.5031,-54.6685 -116.335,-82.0027 -206.5,-82.0027 -44.6678,0 -75.0005,5.49864 -91.17,16.5002 -15.9976,11.1691 -24.1639,22.9998 -24.1639,35.6681 0,9.49803 3.83186,17.8319 11.4999,24.9973 7.66802,7.16971 16.831,10.6665 27.665,10.6665 7.9988,0 16.3327,-1.3317 24.8341,-3.83186 5.49864,-1.66677 17.9994,-7.66802 37.6657,-17.8319 19.503,-10.3357 33.0004,-16.3327 40.5009,-18.3345 11.9982,-3.66433 24.8341,-5.3311 38.499,-5.3311 33.1679,0 62.169,12.8316 86.668,38.499 24.6665,25.6675 36.8323,56.1677 36.8323,91.3332 0,25.6675 -5.66617,50.8323 -16.9985,75.1638 -8.50141,18.167 -17.8319,32.0038 -27.8325,41.5018 -14,12.9991 -33.1679,24.8341 -57.6669,35.333 -24.3358,10.6665 -49.3331,16.0019 -74.6698,16.0019l-15.6625 0 0 14.6659c25.6632,3.16601 51.4982,12.5008 77.3332,27.8325 25.9982,15.1685 44.8311,33.6663 56.4985,55.1668 11.6674,21.5005 17.5011,44.9986 17.5011,70.6661 0,33.6663 -10.5033,60.6654 -31.5012,81.3326 -21.0022,20.6671 -47.0005,31.0029 -78.3341,31.0029 -50.5015,0 -92.5017,-27.0035 -126.499,-81.0018l-16.0019 7.83556z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3497"
|
||||
horiz-adv-x="499"
|
||||
unicode="2">
|
||||
<path
|
||||
id="path3499"
|
||||
d="M458.5 127.5l-46.3346 -127.5 -390.665 0 0 17.9994c114.831,104.835 195.833,190.502 242.666,256.834 46.8329,66.4991 70.3353,127.169 70.3353,182.168 0,42.0001 -12.8359,76.4998 -38.6666,103.499 -25.6675,26.9992 -56.3352,40.5009 -92.1666,40.5009 -32.6696,0 -61.8339,-9.50233 -87.6689,-28.5027 -25.835,-19.0004 -44.9986,-46.9962 -57.3319,-83.6652l-18.167 0c8.16633,60.1671 29.001,106.334 62.8305,138.669 33.6706,32.167 75.6707,48.3322 126.168,48.3322 53.6675,0 98.4986,-17.3336 134.502,-51.8332 35.9989,-34.4996 53.9983,-75.1681 53.9983,-122.001 0,-33.4987 -7.83126,-67.165 -23.4981,-100.668 -24.0007,-52.6666 -63.1699,-108.499 -117.168,-167.498 -81.0018,-88.5023 -131.667,-141.835 -151.831,-160.169l172.833 0c35.1655,0 59.832,1.336 73.9996,4.00369 14.1633,2.50016 26.9992,7.83126 38.3315,15.8301 11.3323,8.00309 21.333,19.3354 29.8344,34.0013l17.9994 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3501"
|
||||
horiz-adv-x="499"
|
||||
unicode="1">
|
||||
<path
|
||||
id="path3503"
|
||||
d="M117.168 597.165l161.166 78.6692 16.1651 0 0 -559.168c0,-36.9998 1.49924,-60.1671 4.50201,-69.3344 3.16601,-8.99972 9.66557,-15.9976 19.3311,-20.9979 9.83311,-4.83279 29.6669,-7.66802 59.6688,-8.33387l0 -17.9994 -249.17 0 0 17.9994c31.3336,0.66585 51.5025,3.33355 60.6697,8.16633 8.99972,4.66954 15.3317,11.0016 19.0004,19.0004 3.49679,7.9988 5.3311,31.8319 5.3311,71.4995l0 357.502c0,48.1646 -1.66677,78.9999 -4.83279,92.6649 -2.33262,10.5033 -6.49956,18.167 -12.5008,22.9998 -5.99695,4.83279 -13.1667,7.33295 -21.6638,7.33295 -12.0025,0 -28.8335,-4.99603 -50.334,-15.1642l-7.33295 15.1642z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3505"
|
||||
horiz-adv-x="499"
|
||||
unicode="0">
|
||||
<path
|
||||
id="path3507"
|
||||
d="M36.1664 327.165c0,75.5031 11.3323,140.503 34.1689,195.004 22.8322,54.4966 52.9974,95.1651 90.8306,121.833 29.3361,21.1655 59.5013,31.8319 90.8349,31.8319 50.6648,0 96.3335,-26.0025 136.667,-77.6682 50.4972,-64.1665 75.6664,-150.998 75.6664,-260.833 0,-76.8348 -11.0016,-141.998 -33.1679,-195.666 -22.1664,-53.8351 -50.334,-92.8324 -84.6661,-117.001 -34.3321,-24.3315 -67.5001,-36.334 -99.4995,-36.334 -63.0023,0 -115.669,37.1673 -157.669,111.833 -35.4963,62.8348 -53.1649,138.501 -53.1649,226.999zm95.6677 -12.1657c0,-91.1657 11.1648,-165.664 33.6663,-223.167 18.4978,-48.4997 46.3346,-72.8312 82.9993,-72.8312 17.6687,0 35.8356,7.9988 54.6685,23.6656 19.0004,15.8344 33.3312,42.3352 42.9968,79.335 15.001,56.0002 22.5014,135 22.5014,236.832 0,75.4989 -7.83126,138.501 -23.4981,188.998 -11.6674,37.5024 -26.8359,64.0033 -45.3337,79.6701 -13.3342,10.6665 -29.4993,15.9976 -48.3364,15.9976 -22.1664,0 -41.8326,-9.83311 -59.1662,-29.6669 -23.3305,-26.9992 -39.3324,-69.4976 -47.8338,-127.5 -8.49711,-57.9977 -12.664,-114.999 -12.664,-171.334z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3509"
|
||||
horiz-adv-x="722"
|
||||
unicode="O">
|
||||
<path
|
||||
id="path3511"
|
||||
d="M365.668 677.166c85.9978,0 160.5,-32.4978 223.498,-97.8328 63.0023,-65.335 94.4992,-146.668 94.4992,-244.333 0,-100.668 -31.8319,-184.166 -95.3326,-250.502 -63.5007,-66.4991 -140.331,-99.6671 -230.5,-99.6671 -90.9981,0 -167.665,32.5021 -229.667,97.1669 -61.9971,64.8367 -93,148.669 -93,251.502 0,105.166 35.8356,190.833 107.335,257.332 62.3322,57.6669 136.667,86.3329 223.167,86.3329zm-9.16726 -35.5006c-59.3337,0 -106.832,-21.9988 -142.668,-65.9965 -44.5003,-54.6685 -66.8342,-134.669 -66.8342,-240.17 0,-108.164 23.1673,-191.331 69.3344,-249.496 35.5006,-44.337 82.3335,-66.5034 140.666,-66.5034 62.169,0 113.5,24.3358 154,72.8354 40.5009,48.4997 60.833,124.999 60.833,229.499 0,113.165 -22.3339,197.667 -66.9974,253.332 -35.8356,44.3328 -85.1687,66.4991 -148.334,66.4991z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3513"
|
||||
horiz-adv-x="722"
|
||||
unicode="N">
|
||||
<path
|
||||
id="path3515"
|
||||
d="M-13.1667 662.165l179.668 0 404.833 -496.664 0 381.833c0,40.6684 -4.66954,66.1684 -13.6693,76.1647 -12.1657,13.6693 -31.1661,20.5039 -57.1643,20.5039l-22.9998 0 0 18.1627 230.5 0 0 -18.1627 -23.5024 0c-28.0001,0 -47.8338,-8.50141 -59.497,-25.3367 -7.16971,-10.499 -10.6665,-34.1646 -10.6665,-71.3319l0 -558 -17.6687 0 -436.501 533.166 0 -407.831c0,-40.6684 4.33447,-66.0008 13.1667,-76.169 12.3333,-13.665 31.5012,-20.4996 57.1686,-20.4996l23.3348 0 0 -17.9994 -230.337 0 0 17.9994 22.8365 0c28.3309,0 48.3322,8.50141 60.1671,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 460.498c-19.1679,22.5014 -33.8338,37.3349 -43.6669,44.5003 -10.0006,7.16541 -24.5033,13.8325 -43.6669,20.0013 -9.50233,2.83094 -23.8332,4.33447 -43.0011,4.33447l0 18.1627z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3517"
|
||||
horiz-adv-x="889"
|
||||
unicode="M">
|
||||
<path
|
||||
id="path3519"
|
||||
d="M409.167 0l-255.833 557.166 0 -442.498c0,-40.6684 4.33018,-66.0008 13.1667,-76.169 11.9982,-13.665 31.1661,-20.4996 57.1643,-20.4996l23.3348 0 0 -17.9994 -230.333 0 0 17.9994 23.3305 0c28.0001,0 47.8338,8.50141 59.6688,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 432.665c0,29.3318 -3.16601,50.5015 -9.66557,63.5007 -4.66954,9.49803 -13.0034,17.3336 -25.1691,23.6656 -12.3333,6.33202 -31.8319,9.50233 -58.8311,9.50233l0 18.1627 187.499 0 240.166 -518.165 236.334 518.165 187.499 0 0 -18.1627 -22.9998 0c-28.3309,0 -48.3322,-8.50141 -59.9996,-25.3367 -7.16541,-10.499 -10.834,-34.1646 -10.834,-71.3319l0 -432.665c0,-40.6684 4.66954,-66.0008 13.8325,-76.169 12.0025,-13.665 31.0029,-20.4996 57.0011,-20.4996l22.9998 0 0 -17.9994 -281.333 0 0 17.9994 23.4981 0c28.3352,0 48.1689,8.50141 59.6688,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 442.498 -255.334 -557.166 -16.1651 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3521"
|
||||
horiz-adv-x="610"
|
||||
unicode="L">
|
||||
<path
|
||||
id="path3523"
|
||||
d="M573.168 183.165l16.1651 -3.49679 -56.666 -179.668 -512.666 0 0 17.9994 24.9973 0c28.0001,0 48.0014,9.16726 59.9996,27.3342 6.83463,10.499 10.1682,34.6672 10.1682,72.3328l0 427.334c0,41.3343 -4.49771,67.165 -13.665,77.5007 -12.6683,14.3308 -31.5012,21.5005 -56.5028,21.5005l-24.9973 0 0 18.1627 299.83 0 0 -18.1627c-35.1655,0.330777 -59.832,-2.83523 -73.9996,-9.66987 -14.1633,-6.83034 -23.8332,-15.4993 -28.9967,-25.9982 -5.16786,-10.3357 -7.83556,-35.333 -7.83556,-74.6655l0 -416.002c0,-26.9992 2.6677,-45.5012 7.83556,-55.6651 3.83186,-6.83463 9.83311,-11.835 17.9994,-15.1685 8.16633,-3.16601 33.4987,-4.83279 76.1647,-4.83279l48.3322 0c50.8366,0 86.5004,3.66862 107,11.1648 20.4996,7.50048 39.1692,20.8347 56.1677,39.835 16.8353,19.0004 33.8338,49.1655 50.6691,90.1647z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3525"
|
||||
horiz-adv-x="722"
|
||||
unicode="K">
|
||||
<path
|
||||
id="path3527"
|
||||
d="M298.834 367.167l244.165 -242.666c40.0026,-40.0026 74.1671,-67.3325 102.502,-81.8352 28.3309,-14.4984 56.666,-22.6647 84.9969,-24.6665l0 -17.9994 -314.999 0 0 17.9994c18.8328,0 32.5021,3.16601 40.836,9.66557 8.32957,6.33632 12.4965,13.3342 12.4965,21.1697 0,7.83126 -1.66677,14.8334 -4.66525,20.9979 -3.16601,6.16878 -13.3342,17.6687 -30.5002,34.6672l-228.666 225.998 0 -213.33c0,-33.503 2.16509,-55.6694 6.49956,-66.3359 3.16601,-8.16633 10.0006,-15.1642 20.4996,-20.9979 14,-7.83556 28.6659,-11.835 44.3328,-11.835l22.5014 0 0 -17.9994 -282.166 0 0 17.9994 23.3305 0c27.3342,0 47.168,7.9988 59.6688,24.0007 7.83126,10.3314 11.6674,35.5006 11.6674,75.1681l0 427.833c0,33.4987 -2.16938,55.8326 -6.33632,66.8342 -3.33355,7.83126 -9.99635,14.6659 -19.997,20.4996 -14.3351,7.83126 -29.3361,11.6674 -45.0029,11.6674l-23.3305 0 0 18.1627 282.166 0 0 -18.1627 -22.5014 0c-15.3317,0 -29.9976,-3.66862 -44.3328,-11.1691 -10.1682,-5.16786 -17.1661,-12.9991 -20.9979,-23.4981 -4.00369,-10.3357 -6.00125,-31.8362 -6.00125,-64.334l0 -202.668c6.6671,6.16878 28.8335,26.8316 67.0017,62.0014 96.6643,88.498 155.165,147.664 175.329,177.163 8.66894,13.0034 13.1667,24.5033 13.1667,34.1689 0,7.50048 -3.49679,14.1676 -10.3314,19.8338 -6.83463,5.66617 -18.3345,8.50141 -34.6672,8.50141l-15.1642 0 0 18.1627 243.164 0 0 -18.1627c-14.3308,-0.335073 -27.3342,-2.16938 -38.9974,-5.83371 -11.6674,-3.50108 -26.0025,-10.5033 -43.0011,-20.6671 -16.8353,-10.3357 -37.6657,-26.8359 -62.4997,-49.6681 -7.16971,-6.49956 -40.1658,-39.835 -99.1688,-99.9979l-100.999 -100.668z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3529"
|
||||
horiz-adv-x="389"
|
||||
unicode="J">
|
||||
<path
|
||||
id="path3531"
|
||||
d="M99.6671 644.002l0 18.1627 283.665 0 0 -18.1627 -24.0007 0c-26.9992,0 -46.6654,-8.00309 -58.9986,-23.8374 -7.83126,-10.499 -11.835,-35.4963 -11.835,-75.1638l0 -323.835c0,-49.8314 -5.3311,-90.1647 -16.3327,-121 -10.834,-30.9986 -29.6669,-57.9977 -56.3309,-80.83 -26.6684,-23.0041 -59.0029,-34.5039 -96.6686,-34.5039 -30.6678,0 -54.6642,7.66802 -72.3328,22.669 -17.5011,15.1642 -26.3333,32.4978 -26.3333,52.0008 0,15.9976 3.9994,28.0001 12.1657,36.1664 10.834,10.1639 23.3348,15.1642 37.67,15.1642 10.3314,0 19.8295,-3.33355 28.0001,-10.1639 8.32957,-6.83463 18.8328,-25.1691 31.4969,-54.836 7.50048,-17.4968 17.1661,-26.3333 28.8335,-26.3333 8.83218,0 17.0028,5.3354 24.6665,16.1694 7.66802,10.6665 11.4999,29.8301 11.4999,57.1643l0 452.168c0,33.4987 -2.16509,55.6651 -6.33202,66.3316 -3.33355,8.16633 -10.1682,15.1685 -20.4996,21.0022 -14,7.83126 -28.8335,11.6674 -44.5003,11.6674l-23.8332 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3533"
|
||||
horiz-adv-x="332"
|
||||
unicode="I">
|
||||
<path
|
||||
id="path3535"
|
||||
d="M308.667 17.9994l0 -17.9994 -283.833 0 0 17.9994 23.4981 0c27.3342,0 47.168,7.9988 59.5013,24.0007 7.83126,10.3314 11.835,35.5006 11.835,75.1681l0 427.833c0,33.4987 -2.16938,55.6651 -6.33632,66.3316 -3.33355,8.16633 -10.0006,15.1685 -19.997,21.0022 -14.3351,7.83126 -29.3361,11.6674 -45.0029,11.6674l-23.4981 0 0 18.1627 283.833 0 0 -18.1627 -24.0007 0c-26.9992,0 -46.6654,-8.00309 -58.9986,-23.8374 -8.16633,-10.499 -12.3333,-35.4963 -12.3333,-75.1638l0 -427.833c0,-33.503 2.16509,-55.6694 6.33202,-66.3359 3.33355,-8.16633 10.1682,-15.1642 20.4996,-20.9979 14,-7.83556 28.8335,-11.835 44.5003,-11.835l24.0007 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3537"
|
||||
horiz-adv-x="722"
|
||||
unicode="H">
|
||||
<path
|
||||
id="path3539"
|
||||
d="M205.499 355.001l307.67 0 0 189.497c0,33.8338 -2.16938,56.1677 -6.33632,66.8342 -3.33355,8.16633 -10.1639,15.1685 -20.4996,21.0022 -14,7.83126 -28.8335,11.6674 -44.5003,11.6674l-23.3305 0 0 18.1627 283.163 0 0 -18.1627 -23.4981 0c-15.4993,0 -30.3327,-3.66862 -44.3328,-11.1691 -10.499,-5.16786 -17.5011,-13.1667 -21.333,-23.6656 -3.66862,-10.6665 -5.50293,-32.167 -5.50293,-64.6691l0 -427.33c0,-33.503 2.00185,-55.6694 6.33632,-66.3359 3.16601,-8.16633 9.83311,-15.1642 19.997,-20.9979 14.3351,-7.83556 29.3361,-11.835 44.8354,-11.835l23.4981 0 0 -17.9994 -283.163 0 0 17.9994 23.3305 0c26.9992,0 46.8329,7.9988 59.1662,24.0007 8.16633,10.3314 12.17,35.5006 12.17,75.1681l0 201.667 -307.67 0 0 -201.667c0,-33.503 2.16938,-55.6694 6.33632,-66.3359 3.33355,-8.16633 10.1639,-15.1642 20.6671,-20.9979 14,-7.83556 28.6659,-11.835 44.3328,-11.835l23.9964 0 0 -17.9994 -283.665 0 0 17.9994 23.3348 0c27.3342,0 47.1637,7.9988 59.6645,24.0007 7.66802,10.3314 11.6674,35.5006 11.6674,75.1681l0 427.33c0,33.8338 -2.16509,56.1677 -6.33202,66.8342 -3.33355,8.16633 -10.0006,15.1685 -20.0013,21.0022 -14.3308,7.83126 -29.3318,11.6674 -44.9986,11.6674l-23.3348 0 0 18.1627 283.665 0 0 -18.1627 -23.9964 0c-15.6668,0 -30.3327,-3.66862 -44.3328,-11.1691 -10.1682,-5.16786 -17.1704,-13.1667 -21.0022,-23.6656 -3.9994,-10.6665 -6.00125,-32.167 -6.00125,-64.6691l0 -189.497z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3541"
|
||||
horiz-adv-x="722"
|
||||
unicode="G">
|
||||
<path
|
||||
id="path3543"
|
||||
d="M613.833 677.166l17.0028 -208.832 -17.0028 0c-17.3336,52.0008 -39.6675,91.1657 -66.9974,117.667 -39.3367,38.0007 -90.0015,57.0011 -151.835,57.0011 -84.331,0 -148.498,-33.3355 -192.332,-100.002 -36.8323,-56.3309 -55.1668,-123.333 -55.1668,-201.164 0,-63.1699 12.1657,-120.837 36.4972,-172.833 24.5033,-52.1683 56.5028,-90.3366 96.0027,-114.501 39.5,-24.3358 80.1641,-36.5015 121.833,-36.5015 24.499,0 47.9971,3.16601 70.8336,9.33479 22.8322,6.16449 44.6635,15.3317 65.8333,27.3342l0 191.499c0,33.1679 -2.50016,54.8317 -7.50048,65.1674 -5.00032,10.1639 -12.8359,17.9994 -23.5024,23.3305 -10.499,5.50293 -29.1643,8.16633 -55.8326,8.16633l0 18.5021 256.335 0 0 -18.5021 -12.1657 0c-25.4999,0 -42.8335,-8.49711 -52.3358,-25.4999 -6.49956,-11.9982 -9.66557,-35.8313 -9.66557,-71.1644l0 -202.668c-37.5024,-20.1645 -74.5022,-34.998 -110.832,-44.5003 -36.5015,-9.49803 -77.0024,-14.1676 -121.67,-14.1676 -127.83,0 -224.997,41.0035 -291.496,123.002 -49.8357,61.6663 -74.6698,132.5 -74.6698,212.999 0,58.1696 14,114.002 42.0001,167.502 33.1679,63.5007 78.8324,112.331 136.667,146.5 48.4997,28.3309 105.836,42.3309 171.832,42.3309 24.1682,0 46.0038,-1.83431 65.8333,-5.83371 19.6705,-3.83186 47.5031,-12.4965 83.6695,-25.8307 18.167,-6.83463 30.5002,-10.1682 36.6647,-10.1682 6.16878,0 11.4999,2.83523 15.8344,8.50141 4.33447,5.66617 6.99787,16.831 7.9988,33.3312l18.167 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3545"
|
||||
horiz-adv-x="556"
|
||||
unicode="F">
|
||||
<path
|
||||
id="path3547"
|
||||
d="M204.665 625.998l0 -260.33 120.502 0c27.665,0 48.0014,6.16449 60.833,18.3302 12.8316,12.17 21.333,36.334 25.6675,72.5004l17.9994 0 0 -223.996 -17.9994 0c-0.335073,25.6632 -3.66862,44.496 -10.0006,56.4985 -6.33202,12.1657 -15.1685,21.1655 -26.5008,27.1667 -11.1648,6.00125 -27.8325,8.99972 -49.9989,8.99972l-120.502 0 0 -207.999c0,-33.503 2.00185,-55.6694 6.33632,-66.3359 3.16601,-8.16633 9.99635,-15.1642 20.4996,-20.9979 14.3308,-7.83556 29.1643,-11.835 44.8311,-11.835l24.0007 0 0 -17.9994 -284.168 0 0 17.9994 23.3348 0c27.3342,0 47.3312,7.9988 59.6688,24.0007 7.83126,10.3314 11.6631,35.5006 11.6631,75.1681l0 427.833c0,33.4987 -2.16509,55.6651 -6.33202,66.3316 -3.33355,8.16633 -10.0006,15.1685 -20.0013,21.0022 -14,7.83126 -28.9967,11.6674 -44.9986,11.6674l-23.3348 0 0 18.1627 492.669 0 6.33202 -145.499 -17.1661 0c-8.33387,30.8353 -18.3345,53.5 -29.4993,68.0027 -11.1691,14.4984 -25.0016,24.9973 -41.5018,31.4969 -16.5002,6.49956 -41.8326,9.83311 -76.3322,9.83311l-146.002 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3549"
|
||||
horiz-adv-x="610"
|
||||
unicode="E">
|
||||
<path
|
||||
id="path3551"
|
||||
d="M209 625.998l0 -261.666 145.499 0c37.8332,0 63.0023,5.66617 75.6664,17.0028 17.0028,14.9967 26.3333,41.33 28.3352,79.1632l17.9994 0 0 -230.496 -17.9994 0c-4.50201,32.1627 -9.16726,52.8299 -13.665,61.9971 -5.83371,11.3323 -15.5036,20.3364 -28.8335,26.8359 -13.3342,6.49956 -33.8338,9.83311 -61.5031,9.83311l-145.499 0 0 -218.335c0,-29.3318 1.3317,-47.168 3.83186,-53.5 2.6677,-6.33202 7.16971,-11.3323 13.6693,-15.1685 6.49956,-3.66433 19.0004,-5.49864 37.1673,-5.49864l112.331 0c37.3349,0 64.6691,2.50016 81.5001,7.83556 16.9985,5.16356 33.1679,15.3317 48.8348,30.6635 20.1645,20.1688 40.8317,50.6691 61.9971,91.3332l19.503 0 -57.0011 -165.999 -510.334 0 0 17.9994 23.5024 0c15.4993,0 30.3327,3.83186 44.3328,11.3323 10.499,5.16786 17.4968,13.0034 21.333,23.3348 3.66433,10.499 5.49864,31.8319 5.49864,63.999l0 430.169c0,42.0001 -4.16694,67.8308 -12.6683,77.6639 -11.6631,12.9991 -31.1661,19.503 -58.496,19.503l-23.5024 0 0 18.1627 510.334 0 7.33295 -144.996 -19.1679 0c-6.83034,34.8304 -14.3308,58.6636 -22.6647,71.667 -8.33387,12.9991 -20.4996,22.9998 -36.8323,29.8301 -12.9991,4.83279 -36.0032,7.33295 -68.8361,7.33295l-181.665 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3553"
|
||||
horiz-adv-x="722"
|
||||
unicode="D">
|
||||
<path
|
||||
id="path3555"
|
||||
d="M17.1661 0l0 17.9994 24.8341 0c28.0001,0 47.8338,8.99972 59.5013,26.9992 7.16541,10.6665 10.834,34.8347 10.834,72.1696l0 427.833c0,41.3343 -4.66954,67.165 -13.6693,77.5007 -12.664,14.3308 -31.6644,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 269.502 0c98.8337,0 174.165,-11.3323 225.831,-33.6663 51.5025,-22.4972 93,-59.9996 124.501,-112.331 31.3336,-52.4991 47.168,-113.001 47.168,-181.665 0,-92.1666 -28.0001,-169.169 -84.0003,-231.003 -62.8348,-68.9993 -158.666,-103.499 -287.166,-103.499l-295.835 0zm188.835 47.8338c41.33,-9.16726 75.9972,-13.6693 103.997,-13.6693 75.5031,0 138.166,26.5008 188.002,79.6701 49.8314,52.9974 74.833,124.999 74.833,215.83 0,91.3332 -25.0016,163.503 -74.833,216.169 -49.8357,52.8342 -113.667,79.1675 -191.834,79.1675 -29.3318,0 -62.6673,-4.66954 -100.165,-14.1676l0 -563z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3557"
|
||||
horiz-adv-x="667"
|
||||
unicode="C">
|
||||
<path
|
||||
id="path3559"
|
||||
d="M602.002 677.166l15.1642 -224.997 -15.1642 0c-20.1688,67.3325 -49.0023,115.832 -86.3372,145.499 -37.4981,29.6669 -82.3335,44.5003 -134.833,44.5003 -43.9977,0 -83.6652,-11.1691 -119.166,-33.503 -35.5006,-22.3296 -63.3331,-57.8302 -83.6652,-106.665 -20.3364,-48.8348 -30.5002,-109.668 -30.5002,-182.168 0,-59.832 9.49803,-111.833 28.8335,-155.83 19.1636,-43.8344 47.9971,-77.5007 86.6637,-101.003 38.5033,-23.4981 82.501,-35.1655 132.002,-35.1655 43.0011,0 80.8342,9.16726 113.835,27.6693 32.8329,18.3302 68.9993,54.8317 108.332,109.5l15.1685 -9.66987c-33.1679,-58.9986 -72.0021,-102.167 -116.167,-129.497 -44.3328,-27.3342 -96.8318,-41.0035 -157.832,-41.0035 -109.668,0 -194.669,40.6684 -254.836,122.169 -44.8311,60.4979 -67.3325,131.834 -67.3325,213.833 0,66.0008 14.8334,126.834 44.3328,182.168 29.6669,55.3343 70.5028,98.1678 122.336,128.668 51.9965,30.3327 108.667,45.4969 170.166,45.4969 47.8338,0 95.1651,-11.6674 141.667,-34.998 13.665,-7.16971 23.4981,-10.834 29.3318,-10.834 8.66894,0 16.3327,3.16601 22.8322,9.33479 8.50141,8.66465 14.5027,20.9979 18.167,36.4972l17.0028 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3561"
|
||||
horiz-adv-x="667"
|
||||
unicode="B">
|
||||
<path
|
||||
id="path3563"
|
||||
d="M461.834 337.835c45.9995,-9.66987 80.3316,-25.3367 103.168,-46.8372 31.4969,-29.9976 47.3312,-66.4991 47.3312,-109.831 0,-32.8329 -10.499,-64.334 -31.3336,-94.4992 -20.8347,-30.1695 -49.3331,-52.0008 -85.667,-65.8333 -36.334,-13.8368 -91.664,-20.8347 -166.166,-20.8347l-312.499 0 0 17.9994 24.8341 0c27.665,0 47.4988,8.83218 59.497,26.5008 7.50048,11.3323 11.3366,35.5006 11.3366,72.6679l0 427.833c0,40.9992 -4.66954,66.8342 -14.1676,77.5007 -12.6683,14.3308 -31.6687,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 285.998 0c53.5,0 96.3335,-3.9994 128.501,-11.8307 48.8348,-11.6674 86.1653,-32.3346 111.833,-62.169 25.6675,-29.8301 38.499,-63.999 38.499,-102.833 0,-33.1636 -9.99635,-62.8305 -30.1652,-89.1638 -20.1645,-26.1701 -49.9989,-45.5012 -89.4989,-58.3328zm-255.833 26.4966c12.1657,-2.33262 25.8307,-3.9994 41.33,-5.16356 15.5036,-1.16846 32.5021,-1.66677 51.0041,-1.66677 47.4988,0 83.3301,5.00032 107.163,15.3317 24.0007,10.1682 42.3352,25.9982 54.9992,47.168 12.6683,20.9979 19.0004,44.1652 19.0004,69.3301 0,38.6666 -15.8301,71.667 -47.3312,99.0012 -31.6687,27.3342 -77.6682,40.9992 -138.166,40.9992 -32.6696,0 -61.8339,-3.49679 -87.9997,-10.6665l0 -254.333zm0 -316.498c37.8332,-8.83218 75.1638,-13.1667 111.833,-13.1667 58.9986,0 103.834,13.3342 134.833,39.8307 30.8353,26.5008 46.3346,59.3337 46.3346,98.3354 0,25.6675 -7.00217,50.5015 -21.0022,74.1671 -14,23.8332 -36.8323,42.4984 -68.3334,56.1677 -31.4969,13.665 -70.6661,20.4996 -117.164,20.4996 -20.1688,0 -37.5024,-0.335073 -51.8332,-0.833387 -14.3351,-0.66585 -25.835,-1.83431 -34.6672,-3.50108l0 -271.499z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3565"
|
||||
horiz-adv-x="722"
|
||||
unicode="A">
|
||||
<path
|
||||
id="path3567"
|
||||
d="M457.499 221.668l-256.331 0 -44.8354 -104.5c-11.1648,-25.6675 -16.6677,-44.8354 -16.6677,-57.6669 0,-10.0006 4.83279,-18.8328 14.3351,-26.5008 9.66557,-7.66802 30.3327,-12.6683 62.3322,-15.001l0 -17.9994 -208.501 0 0 17.9994c27.6693,5.00032 45.5012,11.3323 53.6675,19.1679 16.6677,15.4993 35.0023,47.3312 55.1668,95.1651l233 544.833 16.9985 0 230.5 -550.667c18.5021,-44.3328 35.3373,-72.9987 50.5015,-86.1653 15.1685,-13.1667 36.334,-20.6671 63.3331,-22.3339l0 -17.9994 -261.331 0 0 17.9994c26.3333,1.336 44.1652,5.83371 53.5,13.3342 9.3305,7.33295 14,16.5002 14,27.3342 0,14.3308 -6.6671,36.8323 -19.6662,67.8308l-40.0026 95.1694zm-13.665 36.1664l-112.335 267.5 -115.166 -267.5 227.502 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3569"
|
||||
horiz-adv-x="920"
|
||||
unicode="@">
|
||||
<path
|
||||
id="path3571"
|
||||
d="M687.501 467.835l-57.1686 -194.836c-21.1655,-72.9987 -34.0013,-119.166 -38.499,-138.664 -4.66525,-19.6662 -6.83463,-35.1655 -6.83463,-47.0005 0,-10.3357 3.50108,-19.1679 10.499,-26.3333 7.00217,-7.16541 15.6668,-10.6665 26.1701,-10.6665 23.6656,0 52.164,11.8307 85.667,35.6681 33.3312,23.6656 61.8296,62.3322 85.667,115.665 23.6656,53.3325 35.6638,109.002 35.6638,167 0,55.6651 -13.4974,107 -40.3334,154.336 -26.8316,47.1637 -64.8324,83.3301 -113.835,108.667 -48.998,25.1649 -102.996,37.8332 -162.33,37.8332 -75.1681,0 -145.001,-20.0013 -209.502,-59.8363 -64.334,-39.9983 -115.334,-97.3302 -153,-172.167 -37.6657,-74.833 -56.3309,-152.664 -56.3309,-233.331 0,-75.0005 16.5002,-142.999 49.4963,-204.167 33.0004,-61.168 79.5025,-107.498 139.335,-138.832 59.9996,-31.5012 124.334,-47.168 193.5,-47.168 85.4995,0 163,22.8322 232.167,68.8318 69.1668,45.8363 122.499,113.001 160.332,201.168l28.3352 0c-29.3361,-89.1681 -82.501,-161.501 -159.667,-216.835 -77.1656,-55.33 -165.002,-82.9993 -263.668,-82.9993 -77.5007,0 -149.498,18.3345 -215.834,54.9992 -66.3316,36.5015 -117.997,88.5023 -154.834,155.667 -36.6647,67.3325 -55.1668,141.169 -55.1668,222.003 0,85.8303 20.1688,165.999 60.5022,240.497 40.5009,74.3347 96.9994,132.5 169.835,174.337 72.6636,41.8326 149.834,62.663 231.664,62.663 67.3325,0 128.165,-13.8325 182.336,-41.6651 54.1659,-27.8325 95.5001,-68.6685 123.831,-122.169 28.3352,-53.5 42.3352,-110.334 42.3352,-170.664 0,-59.5013 -13.1667,-118.5 -39.6675,-177 -26.5008,-58.3328 -60.3346,-100.999 -101.334,-127.667 -40.9992,-26.6684 -83.8327,-39.9983 -128.501,-39.9983 -24.6665,0 -43.3318,5.82941 -55.8326,17.4968 -12.5008,11.835 -18.8328,28.1676 -18.8328,49.3331 0,18.3345 2.99847,42.1677 8.83218,71.8345 -48.1646,-58.3328 -86.8312,-95.9985 -115.832,-113.332 -28.8335,-17.1661 -54.5009,-25.835 -76.6673,-25.835 -22.9998,0 -43.4994,10.3357 -61.4988,31.0029 -17.8362,20.6628 -26.8359,48.1646 -26.8359,82.8318 0,47.168 15.336,99.9979 46.1671,158.666 30.8353,58.5003 71.4995,106.167 122.336,142.999 37.4981,27.0035 70.9968,40.5009 100.5,40.5009 21.8313,0 39.9983,-5.49864 54.4966,-16.831 14.5027,-11.1691 24.3358,-28.0001 29.4993,-50.5015l16.1694 53.6675 76.6673 10.834zm-171.334 -20.0013c-24.499,0 -49.1655,-12.9991 -74.3347,-38.6666 -36.6647,-37.6657 -68.1659,-88.6655 -94.1641,-152.832 -19.1679,-46.8372 -28.8335,-84.6704 -28.8335,-113.336 0,-20.4996 5.83371,-37.1673 17.3336,-49.9989 11.4999,-12.8316 24.499,-19.3354 38.8298,-19.3354 18.8328,0 38.6666,7.16971 59.5013,21.5005 20.8347,14.3351 42.666,36.5015 65.4982,66.1684 22.8365,29.8344 39.3367,59.6645 49.8357,89.6664 18.167,51.6657 27.3342,93.8334 27.3342,126.499 0,21.5005 -6.00125,38.5033 -17.8362,51.1674 -11.8307,12.6683 -26.3333,19.1679 -43.1643,19.1679z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3573"
|
||||
horiz-adv-x="499"
|
||||
unicode="_">
|
||||
<path
|
||||
id="path3575"
|
||||
d="M508.834 -215.834l-517.168 0 0 40.9992 517.168 0 0 -40.9992z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3577"
|
||||
horiz-adv-x="469"
|
||||
unicode="^">
|
||||
<path
|
||||
id="path3579"
|
||||
d="M243.169 675.834l207.496 -350.169 -44.8311 0 -170.999 286.17 -170.836 -286.17 -45.9995 0 210.499 350.169 14.6702 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3581"
|
||||
horiz-adv-x="277"
|
||||
unicode="\">
|
||||
<path
|
||||
id="path3583"
|
||||
d="M40.5009 694.332l239.332 -707.997 -39.1649 0 -239.169 707.997 39.0017 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3585"
|
||||
horiz-adv-x="610"
|
||||
unicode="Z">
|
||||
<path
|
||||
id="path3587"
|
||||
d="M575.166 662.165l-434.998 -622.166 271.499 0c41.6651,0 73.6645,9.16726 95.8309,27.3342 22.3339,18.3345 42.1677,55.1668 59.3337,110.836l16.1694 -2.83523 -31.1661 -175.333 -539.167 0 0 17.9994 424.83 604.502 -211.831 0c-35.1655,0 -60.6654,-3.83616 -76.4998,-11.3366 -15.8344,-7.66372 -27.8325,-18.8328 -36.1664,-33.3312 -8.33387,-14.4984 -15.8344,-41.5018 -22.669,-81.165l-18.4978 0 13.665 165.496 489.666 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3589"
|
||||
horiz-adv-x="722"
|
||||
unicode="Y">
|
||||
<path
|
||||
id="path3591"
|
||||
d="M476.5 662.165l230.999 0 0 -18.1627 -12.664 0c-8.50141,0 -20.8347,-3.66862 -37.1673,-11.1691 -16.1651,-7.50048 -30.9986,-18.167 -44.3328,-32.167 -13.3342,-14 -29.8344,-36.8323 -49.3331,-68.501l-159.667 -251.331 0 -166.166c0,-40.6684 4.49771,-66.0008 13.665,-76.169 12.3333,-13.665 31.8319,-20.4996 58.5003,-20.4996l21.5005 0 0 -17.9994 -281.165 0 0 17.9994 23.3305 0c28.0001,0 48.0014,8.50141 59.6688,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 156.831 -181.67 277.333c-21.333,32.5021 -35.9989,52.8342 -43.6626,61.0005 -7.66802,8.16633 -23.5024,17.9994 -47.5031,29.3318 -6.49956,3.33355 -15.9976,4.83708 -28.3309,4.83708l0 18.1627 283.167 0 0 -18.1627 -14.6702 0c-15.3317,0 -29.3318,-3.50108 -42.1634,-10.6708 -13.0034,-7.16541 -19.3354,-17.9994 -19.3354,-32.3303 0,-11.6674 9.83311,-32.8329 29.8344,-63.3331l138.166 -213.502 129.832 204.167c19.503,30.6678 29.3361,53.3325 29.3361,68.3334 0,9.16726 -2.33692,17.3336 -7.16971,24.499 -4.66525,7.16971 -11.4999,12.6683 -20.1645,16.8353 -8.83218,3.9994 -21.9988,6.00125 -39.6675,6.00125l0 18.1627z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3593"
|
||||
horiz-adv-x="722"
|
||||
unicode="X">
|
||||
<path
|
||||
id="path3595"
|
||||
d="M408.166 366.665l142.166 -211.831c39.3367,-58.6679 68.501,-95.6677 87.6689,-111.167 19.0004,-15.4993 43.1643,-24.0007 72.5004,-25.6675l0 -17.9994 -284.168 0 0 17.9994c18.8328,0.335073 32.8329,2.33262 42.0001,6.00125 6.83463,2.83094 12.3333,7.33295 16.8353,13.3342 4.33018,5.99695 6.49956,12.1657 6.49956,18.3302 0,7.50048 -1.50353,15.001 -4.33447,22.5014 -2.33262,5.49864 -11.3323,19.8338 -26.8359,43.0011l-112.331 169.831 -138.669 -177.666c-14.6659,-19.0004 -23.4981,-31.4969 -26.3333,-37.8332 -2.99847,-6.33202 -4.49771,-12.9991 -4.49771,-19.8338 0,-10.499 4.49771,-19.0004 13.1667,-25.8307 8.83218,-6.83463 25.6675,-10.834 50.334,-11.835l0 -17.9994 -234.835 0 0 17.9994c16.6677,1.66677 30.8353,5.16786 43.0011,10.3357 20.1645,8.49711 39.3324,19.8295 57.4994,34.1646 18.3345,14.3351 39.1649,36.334 62.4997,66.0008l156.333 197.165 -130.335 191c-35.4963,51.6657 -65.6657,85.667 -90.3323,101.669 -24.8341,16.1651 -53.3325,24.6665 -85.4995,25.6675l0 18.1627 306.167 0 0 -18.1627c-25.9982,-1.00092 -43.8344,-5.16786 -53.5,-12.6683 -9.49803,-7.50048 -14.3308,-15.8344 -14.3308,-24.8341 0,-12.1657 7.83126,-29.6669 23.3305,-52.8342l101.669 -151.831 117.667 149c13.665,17.4968 21.9988,29.4993 25.1649,35.9989 2.99847,6.6671 4.66525,13.3342 4.66525,20.1645 0,6.83463 -1.99755,12.8359 -5.99695,18.0037 -4.83279,6.83034 -11.0016,11.6631 -18.5021,14.3308 -7.50048,2.83523 -22.9998,4.33447 -46.3346,4.66954l0 18.1627 234.835 0 0 -18.1627c-18.4978,-1.00092 -33.6663,-3.83616 -45.5012,-8.66894 -17.4968,-7.50048 -33.6663,-17.6644 -48.3322,-30.3327 -14.6659,-12.6683 -35.333,-36.1664 -61.9971,-70.3353l-131.336 -168.001z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3597"
|
||||
horiz-adv-x="943"
|
||||
unicode="W">
|
||||
<path
|
||||
id="path3599"
|
||||
d="M936.001 662.165l0 -18.1627c-17.1661,0 -31.1661,-3.00277 -42.0001,-9.16726 -10.6665,-6.33632 -21.0022,-17.8362 -30.6678,-34.6672 -6.49956,-11.4999 -16.8353,-38.6666 -30.831,-81.6676l-184.501 -533.668 -19.503 0 -150.998 423.335 -149.834 -423.335 -17.6687 0 -196.666 549.834c-14.6659,41.0035 -24.0007,65.335 -27.8325,72.8354 -6.49956,12.3333 -15.4993,21.5005 -26.6641,27.4975 -11.1691,6.00125 -26.5008,9.00402 -45.6688,9.00402l0 18.1627 245.166 0 0 -18.1627 -11.6674 0c-17.3336,0 -30.5002,-3.83616 -39.6675,-11.6674 -8.99972,-7.83556 -13.665,-17.3336 -13.665,-28.3352 0,-11.3323 7.16541,-37.6657 21.5005,-78.6649l130.335 -371.502 109.831 315.832 -19.4987 55.6694 -15.4993 44.5003c-6.83463,16.3327 -14.5027,30.6635 -22.9998,42.9968 -4.33447,6.16878 -9.50233,11.3366 -15.6668,15.6668 -8.16633,5.83371 -16.3327,10.0006 -24.3358,12.6683 -6.33202,1.83431 -15.9976,2.83523 -29.3318,2.83523l0 18.1627 257.834 0 0 -18.1627 -17.6687 0c-18.167,0 -31.5012,-3.83616 -39.9983,-11.6674 -8.50141,-7.83556 -12.6683,-18.3345 -12.6683,-31.6687 0,-16.6677 7.33295,-45.6645 21.9988,-86.9987l126.834 -359.834 126 364.667c14.3351,40.5009 21.5005,68.3334 21.5005,84.0003 0,7.50048 -2.33262,14.4984 -6.99787,20.9979 -4.83708,6.50386 -10.6708,11.1691 -17.8362,13.6693 -12.3333,4.66525 -28.4984,6.83463 -48.3322,6.83463l0 18.1627 197.667 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3601"
|
||||
horiz-adv-x="722"
|
||||
unicode="V">
|
||||
<path
|
||||
id="path3603"
|
||||
d="M709.998 662.165l0 -18.1627c-23.4981,-4.16694 -41.1667,-11.6674 -53.3325,-22.3339 -17.1661,-16.0019 -32.4978,-40.5009 -45.832,-73.3338l-230.999 -563.503 -18.0037 0 -247.997 570.836c-12.8359,29.3318 -21.6681,47.168 -27.0035,53.6675 -7.9988,10.1639 -17.9994,17.9994 -29.9976,23.6656 -11.835,5.83371 -27.8325,9.33479 -48.0014,11.0016l0 18.1627 270.503 0 0 -18.1627c-30.6678,-2.83523 -50.5015,-8.17063 -59.6688,-15.5036 -8.99972,-7.50048 -13.665,-17.1661 -13.665,-28.8335 0,-16.3327 7.50048,-41.6651 22.4972,-76.1647l168.503 -388.165 156.166 383.165c15.3317,37.8332 22.9998,63.999 22.9998,78.6649 0,9.50233 -4.66525,18.5021 -14.1676,27.1667 -9.49803,8.50141 -25.3324,14.6702 -47.8338,18.167 -1.66677,0.335073 -4.33018,0.833387 -8.33387,1.50353l0 18.1627 204.167 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3605"
|
||||
horiz-adv-x="722"
|
||||
unicode="U">
|
||||
<path
|
||||
id="path3607"
|
||||
d="M476.998 644.002l0 18.1627 234.504 0 0 -18.1627 -25.0016 0c-26.0025,0 -45.9995,-10.834 -59.9996,-32.6696 -6.83463,-10.1639 -10.3357,-33.4987 -10.3357,-70.331l0 -268.501c0,-66.4991 -6.49956,-118.002 -19.6662,-154.499 -13.1667,-36.669 -39.1649,-68.1702 -77.6639,-94.336 -38.6666,-26.1658 -91.17,-39.3324 -157.502,-39.3324 -72.3328,0 -127.169,12.5008 -164.499,37.6657 -37.5024,25.0016 -63.999,58.6679 -79.6658,101.003 -10.3357,28.9967 -15.6668,83.3301 -15.6668,163.163l0 258.835c0,40.6641 -5.50293,67.3325 -16.8353,80.0009 -11.1648,12.664 -29.3318,19.0004 -54.3334,19.0004l-24.9973 0 0 18.1627 286.165 0 0 -18.1627 -25.3324 0c-27.3342,0 -47.0005,-8.50141 -58.6679,-25.835 -8.16633,-11.6674 -12.1657,-36.1664 -12.1657,-73.1662l0 -288.666c0,-25.6675 2.33262,-55.1668 6.99787,-88.3347 4.83279,-33.1679 13.3342,-59.1662 25.6675,-77.6682 12.3333,-18.4978 30.1652,-33.8338 53.5,-45.832 23.3348,-12.1657 51.8332,-18.167 85.667,-18.167 43.3318,0 81.9984,9.49803 116.167,28.3352 34.1646,18.8328 57.6669,42.9968 70.1635,72.4961 12.5008,29.5036 18.8371,79.335 18.8371,149.67l0 268.166c0,41.3343 -4.66954,67.165 -13.6693,77.5007 -12.8316,14.3308 -31.6644,21.5005 -56.666,21.5005l-25.0016 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3609"
|
||||
horiz-adv-x="610"
|
||||
unicode="T">
|
||||
<path
|
||||
id="path3611"
|
||||
d="M578.667 662.165l7.33295 -155.332 -18.6653 0c-3.50108,27.3342 -8.33387,46.8329 -14.6659,58.6679 -10.0006,18.8328 -23.5024,32.6653 -40.1701,41.6651 -16.831,8.99972 -38.8341,13.5017 -66.1641,13.5017l-93.3351 0 0 -505.999c0,-40.6684 4.50201,-66.0008 13.1667,-76.169 12.3333,-13.665 31.5012,-20.4996 57.1686,-20.4996l22.9998 0 0 -17.9994 -280.834 0 0 17.9994 23.4981 0c28.0001,0 47.8338,8.50141 59.5013,25.4999 7.16541,10.3357 10.834,34.1689 10.834,71.1687l0 505.999 -79.6658 0c-30.8353,0 -52.8342,-2.33262 -65.8333,-6.83463 -17.0028,-6.16449 -31.5012,-18.167 -43.4994,-35.6638 -12.0025,-17.6687 -19.1679,-41.3343 -21.5005,-71.3362l-18.5021 0 7.83556 155.332 540.499 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3613"
|
||||
horiz-adv-x="556"
|
||||
unicode="S">
|
||||
<path
|
||||
id="path3615"
|
||||
d="M458.5 677.166l0 -229.001 -17.9994 0c-6.00125,44.002 -16.5002,78.9999 -31.5012,105.002 -15.1685,26.1658 -36.8323,46.8329 -64.8324,62.0014 -28.0001,15.3317 -56.8336,22.9998 -86.8355,22.9998 -33.8338,0 -61.8339,-10.3357 -84.0003,-31.0029 -22.1664,-20.6671 -33.1636,-44.1652 -33.1636,-70.4985 0,-20.1688 6.99787,-38.6666 20.9979,-55.1668 20.1688,-24.499 68.1659,-57.0011 144,-97.6652 61.8339,-33.1679 104.169,-58.6679 126.666,-76.4998 22.669,-17.6687 40.1701,-38.6666 52.3358,-62.6673 12.1657,-24.1682 18.3302,-49.3331 18.3302,-75.6664 0,-50.1665 -19.4987,-93.3351 -58.3328,-129.669 -38.9974,-36.334 -89.0006,-54.5009 -150.164,-54.5009 -19.3354,0 -37.3349,1.50353 -54.3334,4.50201 -10.0006,1.49924 -31.0029,7.50048 -62.6673,17.6644 -31.6687,10.3357 -51.8332,15.5036 -60.3346,15.5036 -8.16633,0 -14.4984,-2.50016 -19.3311,-7.33295 -4.66954,-4.83708 -8.16633,-15.001 -10.5033,-30.337l-17.9994 0 0 227.003 17.9994 0c8.50141,-47.5031 20.0013,-83.0036 34.3364,-106.669 14.3308,-23.4981 36.1664,-43.1643 65.6657,-58.8311 29.3318,-15.4993 61.6663,-23.3348 96.8318,-23.3348 40.6684,0 72.8354,10.6665 96.5011,32.167 23.5024,21.5005 35.333,46.8329 35.333,76.1647 0,16.337 -4.49771,32.6696 -13.3342,49.3331 -8.99972,16.6677 -22.9998,32.0038 -41.8326,46.3346 -12.664,9.83311 -47.3312,30.5002 -103.997,62.3322 -56.6703,31.6687 -96.8361,57.0011 -120.837,75.8339 -23.9964,19.0004 -42.0001,39.835 -54.4966,62.4997 -12.3333,22.8365 -18.5021,48.0014 -18.5021,75.3356 0,47.4988 18.167,88.3347 54.6685,122.667 36.4972,34.3321 82.8318,51.4982 139.167,51.4982 35.1655,0 72.4961,-8.49711 111.833,-25.8307 18.167,-8.16633 31.1661,-12.17 38.499,-12.17 8.50141,0 15.4993,2.50016 20.8347,7.50048 5.3311,5.16786 9.66557,15.336 12.9991,30.5002l17.9994 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3617"
|
||||
horiz-adv-x="667"
|
||||
unicode="R">
|
||||
<path
|
||||
id="path3619"
|
||||
d="M675.834 0l-176.833 0 -224.168 309.5c-16.5002,-0.498314 -29.9976,-0.833387 -40.5009,-0.833387 -4.16694,0 -8.66465,0 -13.665,0.167537 -4.83279,0.167537 -9.83311,0.330777 -15.1685,0.66585l0 -192.332c0,-41.6694 4.66954,-67.5001 13.6693,-77.6682 12.5008,-14.3351 30.9986,-21.5005 55.6651,-21.5005l25.9982 0 0 -17.9994 -283.665 0 0 17.9994 24.8341 0c28.0001,0 48.0014,9.16726 59.9996,27.3342 6.83463,10.1682 10.3357,34.1646 10.3357,71.8345l0 427.833c0,41.6651 -4.66954,67.5001 -13.6693,77.5007 -12.664,14.3308 -31.6644,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 241.167 0c70.3353,0 122.169,-5.16356 155.5,-15.4993 33.3355,-10.1639 61.6663,-28.9967 85.0012,-56.4985 23.1673,-27.665 34.8347,-60.3346 34.8347,-98.4986 0,-40.6684 -13.1667,-76.0015 -39.835,-106.003 -26.5008,-29.8301 -67.5001,-50.9998 -123.165,-63.3331l136.667 -189.999c31.1661,-43.6669 58.1653,-72.6636 80.4992,-86.9987 22.4972,-14.1676 51.8332,-23.3348 87.9997,-27.3342l0 -17.9994zm-470.335 340.331c6.33632,0 11.6674,0 16.1694,-0.163241 4.49771,-0.167537 8.33387,-0.335073 11.1648,-0.335073 63.1656,0 110.832,13.665 142.836,40.9992 32.1627,27.3342 48.1646,62.169 48.1646,104.5 0,41.3343 -12.9991,75.0005 -38.8341,100.836 -25.8307,25.8307 -60.1671,38.8341 -102.833,38.8341 -18.8328,0 -44.3328,-3.17031 -76.6673,-9.33479l0 -275.336z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3621"
|
||||
horiz-adv-x="722"
|
||||
unicode="Q">
|
||||
<path
|
||||
id="path3623"
|
||||
d="M440.501 -7.33295c33.1636,-57.3319 68.9993,-99.4995 107.666,-126.499 38.499,-27.0035 82.3335,-42.5027 131.499,-46.3346l0 -15.6668c-44.8311,1.66677 -92.8324,10.6665 -144,27.1667 -51.1674,16.3327 -99.4995,39.1649 -145.332,68.3334 -45.6688,29.1643 -85.1687,60.1671 -118.332,93 -46.8372,18.8328 -84.0003,38.8341 -111.334,59.9996 -39.6675,31.6687 -70.5028,70.4985 -92.5017,116.498 -21.9988,46.1671 -33.0004,100.5 -33.0004,163.335 0,99.0012 31.9995,181.167 96.166,246.665 64.1665,65.335 141.835,98.0003 233,98.0003 86.5004,0 161.501,-32.6653 224.834,-98.3311 63.3331,-65.5025 95.0018,-148.334 95.0018,-248.336 0,-80.9975 -22.669,-152.166 -67.6676,-213.33 -45.1661,-61.168 -103.834,-102.67 -175.999,-124.501zm-82.1659 647c-59.1662,0 -106.837,-21.1655 -143.003,-63.5007 -45.4969,-53.0017 -68.3334,-134.334 -68.3334,-243.667 0,-107 23.1673,-189.669 69.3344,-247.499 35.8356,-44.6678 83.1669,-67.0017 142.002,-67.0017 61.3313,0 110.497,22.3339 147.999,67.0017 43.9977,52.6666 66.0008,130.498 66.0008,233.331 0,79.1675 -12.17,145.667 -36.1664,199.669 -18.6696,41.6651 -43.1686,72.3328 -74.0039,92.1666 -30.831,19.6662 -65.3307,29.4993 -103.83,29.4993z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3625"
|
||||
horiz-adv-x="556"
|
||||
unicode="P">
|
||||
<path
|
||||
id="path3627"
|
||||
d="M205 309.998l0 -192.83c0,-41.6694 4.66525,-67.5001 13.8325,-77.6682 12.3333,-14.3351 30.9986,-21.5005 56.0002,-21.5005l25.4999 0 0 -17.9994 -283.665 0 0 17.9994 24.8341 0c28.0001,0 47.9971,9.16726 59.9996,27.3342 6.49956,10.1682 9.83311,34.1646 9.83311,71.8345l0 427.833c0,41.6651 -4.33447,67.5001 -13.1667,77.5007 -12.6683,14.3308 -31.6687,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 242.666 0c59.1662,0 105.832,-6.16449 140,-18.3302 34.3321,-12.1657 62.998,-32.8329 86.5004,-61.8339 23.4981,-29.001 35.1655,-63.3331 35.1655,-103.001 0,-53.9983 -17.8319,-98.0003 -53.5,-131.834 -35.6681,-33.8338 -86.0021,-50.8323 -151.165,-50.8323 -15.8344,0 -33.1679,1.16846 -51.67,3.50108 -18.4978,2.33262 -38.499,5.66617 -59.6645,10.1639zm0 27.8368c17.3336,-3.17031 32.6653,-5.67047 45.9995,-7.33724 13.3342,-1.49924 24.6665,-2.33262 34.1689,-2.33262 33.8295,0 62.998,12.9991 87.6646,39.3324 24.499,26.1701 36.8323,60.0039 36.8323,101.669 0,28.6659 -5.83371,55.3343 -17.4968,79.8333 -11.835,24.6665 -28.3352,43.0011 -49.8357,55.1668 -21.5005,12.3333 -45.9995,18.3345 -73.3338,18.3345 -16.5002,0 -37.8332,-3.00277 -63.999,-9.16726l0 -275.499z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3629"
|
||||
horiz-adv-x="499"
|
||||
unicode="o">
|
||||
<path
|
||||
id="path3631"
|
||||
d="M249.999 460.498c67.6676,0 122.001,-25.8307 163.168,-77.1656 34.8347,-43.9977 52.1683,-94.4992 52.1683,-151.333 0,-40.1658 -9.66987,-80.6667 -28.8335,-121.666 -19.1679,-40.9992 -45.6688,-72.0021 -79.335,-92.8324 -33.6663,-20.8347 -71.1644,-31.1661 -112.499,-31.1661 -67.5001,0 -121,26.8316 -160.668,80.4992 -33.4987,45.3337 -50.334,96.166 -50.334,152.334 0,41.1667 10.1682,81.8309 30.5002,122.332 20.3321,40.5009 47.168,70.4985 80.3316,89.834 33.1679,19.4987 68.3334,29.1643 105.501,29.1643zm-15.1642 -31.8319c-17.1661,0 -34.4996,-5.00032 -52.0008,-15.3317 -17.3336,-10.3357 -31.5012,-28.1676 -42.1677,-54.0026 -10.834,-25.6632 -16.1651,-58.6636 -16.1651,-98.9969 0,-65.1674 12.9991,-121.335 38.8341,-168.503 25.8307,-47.1637 59.9996,-70.8336 102.33,-70.8336 31.5012,0 57.4994,13.0034 78.1665,39.0017 20.4996,26.1658 30.6678,70.8336 30.6678,134.334 0,79.4982 -16.9985,141.998 -51.3349,187.499 -22.9998,31.3336 -52.4991,46.8329 -88.3304,46.8329z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3633"
|
||||
horiz-adv-x="499"
|
||||
unicode="n">
|
||||
<path
|
||||
id="path3635"
|
||||
d="M161.668 365.668c52.3316,63.1656 102.33,94.83 149.834,94.83 24.499,0 45.4969,-6.16449 62.998,-18.3302 17.6687,-12.1657 31.6687,-32.3346 42.0001,-60.3346 7.16541,-19.4987 10.6665,-49.5006 10.6665,-89.834l0 -191c0,-28.1633 2.33262,-47.4988 6.99787,-57.4994 3.50108,-8.16633 9.33479,-14.4984 17.3336,-19.1679 7.83556,-4.49771 22.669,-6.83034 44.1695,-6.83034l0 -17.5011 -221.333 0 0 17.5011 9.3305 0c20.8347,0 35.5006,3.33355 43.6669,9.66557 8.33387,6.33202 14.1676,15.6668 17.3336,28.0001 1.336,4.83279 2.00185,20.1645 2.00185,45.832l0 183.169c0,40.6641 -5.3354,70.1635 -15.8344,88.6655 -10.6665,18.3345 -28.4984,27.5018 -53.5,27.5018 -38.6666,0 -77.3332,-21.1697 -115.665,-63.5007l0 -235.836c0,-30.1652 1.66677,-48.8305 5.3311,-56.0002 4.50201,-9.49803 10.834,-16.5002 18.8328,-20.8304 7.9988,-4.33447 24.1682,-6.6671 48.4997,-6.6671l0 -17.5011 -221.165 0 0 17.5011 9.83311 0c22.669,0 38.1683,5.83371 46.1671,17.3336 7.83126,11.6674 11.835,33.6663 11.835,66.1641l0 166.166c0,53.6675 -1.16846,86.3329 -3.66862,98.0003 -2.33262,11.835 -6.16449,19.8338 -11.1648,24.0007 -5.00032,4.16694 -11.835,6.33202 -20.3364,6.33202 -8.99972,0 -19.997,-2.49587 -32.6653,-7.33295l-7.33295 17.6687 134.833 54.6642 21.0022 0 0 -94.83z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3637"
|
||||
horiz-adv-x="777"
|
||||
unicode="m">
|
||||
<path
|
||||
id="path3639"
|
||||
d="M164.001 365.165c32.6653,32.6696 51.8332,51.3349 57.6669,56.1677 14.6659,12.5008 30.5002,21.9988 47.3312,28.8335 17.0028,6.83463 33.6663,10.3314 50.334,10.3314 28.0001,0 52.1683,-8.16633 72.3328,-24.499 20.1688,-16.1651 33.6663,-39.8307 40.5009,-70.8336 33.4987,39.1692 61.8339,64.8367 85.0012,77.0024 22.9998,12.1657 46.8329,18.3302 71.1644,18.3302 23.8332,0 44.8354,-6.16449 63.3331,-18.3302 18.3345,-12.1657 32.8329,-32.167 43.6669,-59.8363 7.16541,-18.8328 10.6665,-48.4997 10.6665,-88.833l0 -192.5c0,-28.0001 2.16938,-47.1637 6.33632,-57.4994 3.32925,-7.16541 9.3305,-13.3342 18.1627,-18.3345 8.83648,-5.00032 22.9998,-7.66372 43.0011,-7.66372l0 -17.5011 -220.83 0 0 17.5011 9.3305 0c19.1679,0 34.1689,3.83186 44.9986,11.3323 7.50048,5.16786 12.8359,13.5017 16.0019,24.8341 1.3317,5.49864 2.00185,21.333 2.00185,47.3312l0 192.5c0,36.5015 -4.33447,62.169 -13.1667,77.1699 -12.6683,20.8304 -33.0004,31.1661 -61.0005,31.1661 -17.3336,0 -34.6672,-4.33447 -52.0008,-12.8359 -17.5011,-8.66465 -38.499,-24.6665 -63.3331,-48.1646l-1.00092 -5.3354 1.00092 -20.9979 0 -213.502c0,-30.5002 1.83431,-49.5006 5.16786,-56.9968 3.49679,-7.50048 9.83311,-13.8368 19.3311,-18.8371 9.33479,-5.00032 25.4999,-7.66372 48.3322,-7.66372l0 -17.5011 -226.166 0 0 17.5011c24.8341,0 41.8326,2.99847 51.1674,8.83218 9.16726,5.83371 15.6668,14.6659 19.1679,26.3333 1.66677,5.66617 2.50016,21.6681 2.50016,48.3322l0 192.5c0,36.5015 -5.3354,62.6673 -16.1694,78.5016 -14.3308,20.8347 -34.3321,31.3336 -59.9996,31.3336 -17.6644,0 -34.998,-4.66525 -52.3316,-14.1676 -26.9992,-14.3308 -47.8338,-30.5002 -62.4997,-48.3322l0 -239.835c0,-29.1643 2.16509,-48.3322 6.16449,-56.9968 3.9994,-8.83648 10.1682,-15.5036 17.9994,-19.8338 8.00309,-4.33447 24.1682,-6.6671 48.6672,-6.6671l0 -17.5011 -221.165 0 0 17.5011c20.4996,0 34.8347,2.33262 43.0011,6.6671 7.9988,4.33018 14.3308,11.3323 18.4978,20.9979 4.16694,9.66557 6.33632,28.1676 6.33632,55.8326l0 171.003c0,49.1655 -1.50353,80.83 -4.33447,95.1651 -2.33262,10.834 -6.00125,18.167 -10.834,22.1664 -4.83279,4.16694 -11.4999,6.16449 -20.0013,6.16449 -9.16726,0 -19.997,-2.49587 -32.6653,-7.33295l-7.33295 17.6687 134.665 54.6642 21.0022 0 0 -95.3326z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3641"
|
||||
horiz-adv-x="277"
|
||||
unicode="l">
|
||||
<path
|
||||
id="path3643"
|
||||
d="M184.999 694.332l0 -593.333c0,-28.0001 2.16938,-46.4978 6.16878,-55.6651 3.9994,-8.99972 10.3314,-16.0019 18.8328,-20.6671 8.50141,-4.66525 24.1639,-7.16541 47.3312,-7.16541l0 -17.5011 -219.164 0 0 17.5011c20.4996,0 34.4996,2.16509 41.8326,6.49956 7.50048,4.16694 13.4974,11.1648 17.6644,20.9979 4.16694,9.66987 6.33632,28.3352 6.33632,56.0002l0 406.336c0,50.4972 -1.16846,81.5001 -3.33355,93 -2.33262,11.4999 -6.00125,19.4987 -11.0016,23.6656 -5.16786,4.33447 -11.4999,6.33202 -19.3311,6.33202 -8.50141,0 -19.1679,-2.50016 -32.167,-7.83126l-8.33387 17.1661 133.333 54.6642 21.8313 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3645"
|
||||
horiz-adv-x="499"
|
||||
unicode="k">
|
||||
<path
|
||||
id="path3647"
|
||||
d="M163.499 694.332l0 -445.334 113.835 104.002c24.1682,22.1664 38.1683,36.1664 42.0001,42.0001 2.6677,3.9994 3.83186,7.83556 3.83186,11.6674 0,6.6671 -2.6634,12.1657 -7.9988,16.9985 -5.3311,4.66954 -14.1676,7.33295 -26.6684,8.00309l0 15.6625 194.334 0 0 -15.6625c-26.6641,-0.670146 -48.8305,-4.66954 -66.4991,-12.17 -17.8319,-7.50048 -37.3306,-20.8304 -58.5003,-40.1658l-114.664 -105.832 114.664 -145.001c31.9995,-40.1658 53.5,-65.5025 64.5016,-76.3322 15.6668,-15.1685 29.3318,-25.1691 40.9992,-29.6669 8.16633,-3.33355 22.3339,-5.00032 42.4984,-5.00032l0 -17.5011 -217.334 0 0 17.5011c12.5008,0.330777 20.8347,2.33262 25.1691,5.66617 4.49771,3.50108 6.6671,8.16633 6.6671,14.4984 0,7.50048 -6.49956,19.503 -19.503,35.9989l-137.333 175.333 0 -148.33c0,-29.001 2.16938,-48.1689 6.16878,-57.1686 3.9994,-9.16726 9.83311,-15.6668 17.3336,-19.4987 7.50048,-3.9994 23.8332,-6.16878 48.8305,-6.49956l0 -17.5011 -227.497 0 0 17.5011c22.8322,0 39.8307,2.83094 51.1674,8.33387 6.83034,3.66433 12.1657,9.16296 15.6668,16.6634 4.83279,10.6665 7.33295,29.3361 7.33295,55.6694l0 407.165c0,51.8332 -1.16846,83.5019 -3.33355,95.0018 -2.33262,11.4999 -6.16878,19.4987 -11.3323,23.9964 -5.16786,4.33447 -12.0025,6.50386 -20.5039,6.50386 -6.83034,0 -16.9985,-2.6677 -30.6635,-8.33387l-8.33387 17.1661 132.831 54.6642 22.3339 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3649"
|
||||
horiz-adv-x="277"
|
||||
unicode="j">
|
||||
<path
|
||||
id="path3651"
|
||||
d="M144.498 694.834c14,0 25.835,-4.83279 35.6681,-14.6659 9.83311,-9.83311 14.6659,-21.6681 14.6659,-35.6681 0,-13.665 -4.83279,-25.3324 -14.6659,-35.1655 -9.83311,-9.66987 -21.6681,-14.6702 -35.6681,-14.6702 -13.665,0 -25.3324,5.00032 -35.1655,14.6702 -9.66557,9.83311 -14.6659,21.5005 -14.6659,35.1655 0,14 5.00032,25.835 14.6659,35.6681 9.83311,9.83311 21.5005,14.6659 35.1655,14.6659zm42.0001 -234.336l0 -450.166c0,-76.4998 -16.3327,-133.333 -48.8305,-170.496 -32.5021,-37.1673 -74.833,-55.6694 -127.001,-55.6694 -29.4993,0 -51.4982,5.3354 -65.8333,16.1694 -14.3351,10.6665 -21.5005,21.8313 -21.5005,33.1636 0,11.3366 3.9994,21.1697 12.0025,29.3361 7.9988,8.16633 17.3336,12.1657 28.0001,12.1657 8.49711,0 17.1661,-2.16509 25.9982,-6.33202 5.49864,-2.33692 16.1651,-10.5033 31.8319,-24.6665 15.8344,-14.1676 29.1685,-21.1697 39.835,-21.1697 7.83126,0 15.4993,3.00277 22.9998,8.99972 7.50048,6.00125 12.9991,16.0019 16.6677,30.1695 3.49679,14.1633 5.3311,44.8311 5.3311,92.1666l0 318.332c0,49.1655 -1.49924,80.6667 -4.49771,94.6668 -2.16938,10.834 -5.83371,18.167 -10.6665,22.1664 -4.83279,4.16694 -11.4999,6.16449 -20.0013,6.16449 -9.16726,0 -20.1688,-2.49587 -33.1679,-7.33295l-6.83034 17.6687 134.665 54.6642 20.9979 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3653"
|
||||
horiz-adv-x="277"
|
||||
unicode="i">
|
||||
<path
|
||||
id="path3655"
|
||||
d="M145.001 694.332c13.665,0 25.3324,-4.83279 34.998,-14.3308 9.50233,-9.66557 14.3351,-21.333 14.3351,-35.0023 0,-13.665 -4.83279,-25.3324 -14.3351,-35.1655 -9.66557,-9.66557 -21.333,-14.6659 -34.998,-14.6659 -13.6693,0 -25.3324,5.00032 -35.1655,14.6659 -9.66987,9.83311 -14.6702,21.5005 -14.6702,35.1655 0,13.6693 4.83279,25.3367 14.5027,35.0023 9.49803,9.49803 21.333,14.3308 35.333,14.3308zm40.5009 -233.834l0 -359.499c0,-28.0001 1.99755,-46.4978 6.16449,-55.8326 3.9994,-9.33479 10.0006,-16.1651 17.9994,-20.8347 8.00309,-4.49771 22.669,-6.83034 43.8344,-6.83034l0 -17.5011 -217.334 0 0 17.5011c21.8356,0 36.5015,2.16509 43.8344,6.49956 7.50048,4.16694 13.4974,11.1648 17.8319,20.9979 4.50201,9.66987 6.6671,28.3352 6.6671,56.0002l0 172.503c0,48.4997 -1.49924,79.8333 -4.33447,94.1641 -2.33262,10.5033 -5.99695,17.6687 -10.834,21.6681 -4.83279,4.16694 -11.4999,6.16449 -19.997,6.16449 -9.16726,0 -20.1688,-2.49587 -33.1679,-7.33295l-6.83463 17.6687 134.669 54.6642 21.5005 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3657"
|
||||
horiz-adv-x="499"
|
||||
unicode="h">
|
||||
<path
|
||||
id="path3659"
|
||||
d="M162.665 694.332l0 -327.165c36.0032,39.6675 64.6691,65.1674 85.8346,76.4998 21.1655,11.1648 42.3352,16.831 63.5007,16.831 25.3324,0 47.168,-6.99787 65.4982,-20.9979 18.167,-14 31.6687,-35.9989 40.5009,-66.0008 6.16878,-20.8304 9.16726,-58.8311 9.16726,-114.165l0 -158.335c0,-28.1633 2.33262,-47.6663 6.99787,-57.9977 3.17031,-7.83556 8.66894,-14 16.5002,-18.6696 7.83556,-4.49771 22.1707,-6.83034 43.0011,-6.83034l0 -17.5011 -219.666 0 0 17.5011 10.1682 0c20.8304,0 35.333,3.33355 43.4994,9.66557 8.16633,6.33202 13.8325,15.6668 16.9985,28.0001 1.00092,5.16786 1.49924,20.4996 1.49924,45.832l0 158.335c0,48.8348 -2.50016,80.8342 -7.49619,96.166 -5.16786,15.3317 -13.1667,26.6684 -24.1682,34.3321 -11.1691,7.66802 -24.499,11.4999 -40.1658,11.4999 -15.8344,0 -32.5021,-4.16694 -49.6681,-12.664 -17.3336,-8.50141 -38.0007,-25.4999 -62.0014,-51.3349l0 -236.334c0,-30.5002 1.66677,-49.5006 5.00032,-56.9968 3.50108,-7.50048 9.83311,-13.8368 19.1679,-18.8371 9.16726,-5.00032 25.1649,-7.66372 48.0014,-7.66372l0 -17.5011 -221.668 0 0 17.5011c19.8338,0 35.5006,3.16601 46.8329,9.3305 6.49956,3.33355 11.835,9.50233 15.6668,18.5021 3.9994,9.16726 5.83371,27.665 5.83371,55.6651l0 404.833c0,51.1674 -1.16846,82.501 -3.66862,94.336 -2.33262,11.6674 -6.16449,19.6662 -11.1648,23.8332 -5.00032,4.33447 -11.835,6.33202 -20.3321,6.33202 -6.83463,0 -17.8362,-2.50016 -33.1679,-7.83126l-6.83463 17.1661 133.836 54.6642 22.4972 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3661"
|
||||
horiz-adv-x="499"
|
||||
unicode="g">
|
||||
<path
|
||||
id="path3663"
|
||||
d="M150.834 163.168c-27.3342,13.3342 -48.3364,31.8319 -63.0023,55.8326 -14.6659,24.0007 -21.8313,50.334 -21.8313,79.335 0,44.3328 16.6677,82.3292 49.9989,114.333 33.3355,31.8319 76.0015,47.8295 128.165,47.8295 42.666,0 79.5025,-10.499 110.836,-31.3293l94.6668 0c14,0 22.1664,-0.335073 24.499,-1.16846 2.16509,-0.833387 3.83186,-2.16509 4.83279,-4.16694 2.00185,-2.99847 2.99847,-8.16633 2.99847,-15.6668 0,-8.50141 -0.833387,-14.3351 -2.50016,-17.5011 -0.996628,-1.66677 -2.6634,-2.99847 -5.16356,-3.9994 -2.33262,-1.00092 -10.6665,-1.3317 -24.6665,-1.3317l-58.002 0c18.167,-23.5024 27.3342,-53.5 27.3342,-90.0015 0,-41.6651 -16.0019,-77.1656 -47.8338,-106.832 -31.9995,-29.6669 -74.833,-44.5003 -128.501,-44.5003 -22.1664,0 -44.6678,3.33355 -67.8308,9.83311 -14.3351,-12.3333 -24.0007,-23.1673 -29.001,-32.4978 -5.16786,-9.33479 -7.66802,-17.1704 -7.66802,-23.6699 0,-5.49864 2.6677,-10.834 7.9988,-16.1651 5.50293,-5.16786 16.0019,-8.83218 31.5012,-11.1648 9.16726,-1.336 31.9995,-2.50016 68.501,-3.50108 67.0017,-1.49924 110.501,-3.83616 130.335,-6.83463 30.1652,-4.16694 54.3334,-15.3317 72.4961,-33.6663 18.0037,-18.167 27.0035,-40.6684 27.0035,-67.3325 0,-36.8323 -17.1661,-71.3362 -51.67,-103.499 -50.8323,-47.5031 -116.996,-71.3362 -198.664,-71.3362 -62.8348,0 -116,14.1676 -159.336,42.5027 -24.3315,16.3327 -36.4972,33.1636 -36.4972,50.8323 0,7.83126 1.66677,15.4993 5.3311,23.3305 5.50293,12.17 17.0028,28.8335 34.1689,50.334 2.33262,3.00277 18.8328,20.4996 49.8314,52.6666 -16.9985,10.1682 -28.8335,19.1679 -35.8313,27.1667 -7.00217,8.00309 -10.499,17.0028 -10.499,27.1667 0,11.3366 4.49771,24.6665 13.8325,40.0026 9.3305,15.3317 30.6635,36.9998 64.1665,64.9999zm84.9969 273.832c-23.9964,0 -44.3328,-9.66557 -60.4979,-28.8335 -16.3327,-19.1679 -24.499,-48.6672 -24.499,-88.3347 0,-51.4982 11.1648,-91.3332 33.3312,-119.664 16.8353,-21.5005 38.3358,-32.167 64.334,-32.167 24.8341,0 45.1661,9.16726 61.0005,27.8325 16.0019,18.5021 24.0007,47.6663 24.0007,87.3338 0,51.8332 -11.1691,92.3341 -33.6663,121.666 -16.6677,21.5005 -38.0007,32.167 -64.0033,32.167zm-89.8297 -437c-15.336,-16.6677 -26.8359,-31.9995 -34.6672,-46.3346 -7.83556,-14.3308 -11.6674,-27.4975 -11.6674,-39.6675 0,-15.4993 9.33479,-29.1643 28.3309,-40.9992 32.5021,-20.1645 79.5025,-30.1652 141.001,-30.1652 58.6679,0 101.832,10.3314 129.669,30.9986 27.8325,20.6671 41.8326,42.666 41.8326,66.1684 0,16.831 -8.33387,28.8335 -25.0016,35.9989 -16.831,7.16541 -50.4972,11.4999 -100.5,12.8359 -73.3338,1.83001 -129.665,5.66617 -168.997,11.1648z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3665"
|
||||
horiz-adv-x="332"
|
||||
unicode="f">
|
||||
<path
|
||||
id="path3667"
|
||||
d="M206.001 412.166l0 -294.001c0,-41.6651 4.66525,-67.9984 13.665,-79.1632 12.1657,-14.3351 28.1676,-21.5005 48.3322,-21.5005l40.6684 0 0 -17.5011 -267.165 0 0 17.5011 19.997 0c12.9991,0 25.0016,3.33355 35.6681,9.83311 10.6665,6.49956 18.167,15.3317 22.1664,26.3333 4.16694,11.1648 6.16878,32.6653 6.16878,64.4973l0 294.001 -87.003 0 0 35.1655 87.003 0 0 29.1685c0,44.6678 7.16541,82.501 21.4962,113.332 14.3351,31.0029 36.1664,56.0002 65.67,75.0005 29.4993,19.0004 62.4997,28.5027 99.332,28.5027 34.1646,0 65.6657,-11.0016 94.3317,-33.1679 18.8328,-14.6659 28.1676,-31.1661 28.1676,-49.3331 0,-9.83311 -4.16694,-19.0004 -12.6683,-27.5018 -8.49711,-8.66465 -17.4968,-12.9991 -27.3299,-12.9991 -7.50048,0 -15.336,2.6677 -23.6699,7.9988 -8.32957,5.3354 -18.4978,17.0028 -30.5002,34.6672 -11.9982,17.8362 -23.163,29.6669 -33.1636,35.9989 -10.1682,6.16878 -21.333,9.16726 -33.6663,9.16726 -15.001,0 -27.6693,-3.9994 -38.1683,-11.9982 -10.3314,-7.83556 -17.8319,-20.3321 -22.5014,-36.9998 -4.49771,-16.8353 -6.83034,-59.9996 -6.83034,-129.669l0 -32.167 115.334 0 0 -35.1655 -115.334 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3669"
|
||||
horiz-adv-x="443"
|
||||
unicode="e">
|
||||
<path
|
||||
id="path3671"
|
||||
d="M106.502 278.832c-0.335073,-66.4991 15.6668,-118.5 48.3322,-156.333 32.4978,-37.6657 70.8336,-56.4985 114.668,-56.4985 29.3318,0 54.8317,7.9988 76.4998,24.1639 21.6638,16.0019 39.6632,43.6669 54.3334,82.6686l15.1642 -9.66557c-6.83463,-44.6678 -26.6641,-85.3363 -59.5013,-121.833 -32.9961,-36.669 -74.1629,-54.9992 -123.496,-54.9992 -53.8351,0 -99.8346,20.8304 -138.003,62.663 -38.3315,41.8369 -57.3319,98.1678 -57.3319,168.834 0,76.4998 19.4987,136.169 58.8311,178.835 39.1692,42.8335 88.3347,64.334 147.668,64.334 50.1665,0 91.3332,-16.5002 123.5,-49.6681 32.167,-33.0004 48.3322,-77.1656 48.3322,-132.5l-308.998 0zm0 28.3352l206.998 0c-1.66677,28.6659 -5.00032,48.8305 -10.3314,60.4979 -8.00309,18.167 -20.1688,32.5021 -36.334,43.0011 -16.1694,10.3314 -33.0004,15.6668 -50.5015,15.6668 -26.9992,0 -51.1674,-10.499 -72.5004,-31.5012 -21.333,-20.9979 -33.8338,-50.334 -37.3306,-87.6646z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3673"
|
||||
horiz-adv-x="499"
|
||||
unicode="d">
|
||||
<path
|
||||
id="path3675"
|
||||
d="M347.166 50.334c-21.8313,-22.8322 -43.1643,-39.1692 -63.999,-49.1655 -20.8347,-9.83311 -43.3318,-14.8334 -67.3325,-14.8334 -48.8348,0 -91.5007,20.4996 -128.002,61.3313 -36.334,40.8317 -54.6642,93.3351 -54.6642,157.334 0,64.1665 20.1645,122.834 60.6654,176.167 40.3334,53.1649 92.1666,79.8333 155.667,79.8333 39.3324,0 71.9978,-12.6683 97.6652,-37.6657l0 82.4967c0,51.1674 -1.16416,82.501 -3.66433,94.336 -2.50016,11.6674 -6.33632,19.6662 -11.4999,23.8332 -5.16786,4.33447 -11.6674,6.33202 -19.503,6.33202 -8.49711,0 -19.6662,-2.50016 -33.6663,-7.83126l-6.33202 17.1661 133.333 54.6642 21.8313 0 0 -517.164c0,-52.3358 1.336,-84.3353 3.66862,-95.8352 2.50016,-11.6674 6.33202,-19.6662 11.835,-24.1639 5.3311,-4.66954 11.6631,-6.83463 18.6653,-6.83463 8.83218,0 20.6671,2.6677 35.1655,8.33387l5.49864 -17.1661 -132.831 -55.1668 -22.5014 0 0 63.999zm0 34.1646l0 230.5c-1.99755,22.0031 -7.83126,42.3352 -17.5011,60.5022 -9.83311,18.167 -22.8322,31.9995 -38.8298,41.1667 -16.1694,9.3305 -31.8362,14 -47.168,14 -28.6659,0 -54.1659,-12.8359 -76.6673,-38.499 -29.6669,-34.0013 -44.5003,-83.3344 -44.5003,-148.502 0,-65.8333 14.3351,-116.167 43.0011,-151.165 28.6659,-35.0023 60.4979,-52.5034 95.6677,-52.5034 29.6669,0 58.3328,14.8334 85.9978,44.5003z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3677"
|
||||
horiz-adv-x="443"
|
||||
unicode="c">
|
||||
<path
|
||||
id="path3679"
|
||||
d="M411.165 169.998c-11.9982,-58.9986 -35.6638,-104.332 -70.8336,-135.997 -35.1655,-31.8362 -73.9996,-47.6663 -116.666,-47.6663 -50.8323,0 -95.1651,21.333 -132.831,63.999 -37.8332,42.666 -56.6703,100.165 -56.6703,172.833 0,70.331 21.0022,127.5 62.8348,171.334 41.8326,43.9977 91.9991,65.9965 150.499,65.9965 44.002,0 80.1684,-11.6631 108.499,-34.998 28.3352,-23.1673 42.5027,-47.3312 42.5027,-72.5004 0,-12.3333 -3.9994,-22.3339 -12.0025,-29.9976 -7.9988,-7.66802 -19.1636,-11.4999 -33.4987,-11.4999 -19.1679,0 -33.6663,6.16449 -43.4994,18.4978 -5.49864,6.83463 -9.16726,20.0013 -10.834,39.1649 -1.83431,19.1679 -8.50141,33.8338 -19.8338,44.002 -11.4999,9.66557 -27.1667,14.4984 -47.3312,14.4984 -32.6696,0 -58.8354,-11.9982 -78.6692,-35.9989 -26.3333,-31.9995 -39.5,-74.1671 -39.5,-126.499 0,-53.3325 13.0034,-100.5 39.3367,-141.332 26.1658,-40.836 61.4988,-61.3356 106.167,-61.3356 31.8319,0 60.4979,10.834 85.8303,32.6653 17.9994,15.001 35.333,42.1677 52.3358,81.6676l14.1633 -6.83463z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3681"
|
||||
horiz-adv-x="499"
|
||||
unicode="b">
|
||||
<path
|
||||
id="path3683"
|
||||
d="M153.833 370.166c43.3318,60.1671 90.0015,90.3323 140.168,90.3323 45.832,0 85.8346,-19.6662 119.999,-58.8311 34.1646,-39.3324 51.3349,-92.8324 51.3349,-160.998 0,-79.335 -26.3333,-143.334 -79.1675,-191.834 -45.1661,-41.6694 -95.6677,-62.4997 -151.333,-62.4997 -26.0025,0 -52.5034,4.66525 -79.335,14.1633 -26.8316,9.50233 -54.3334,23.6699 -82.3335,42.5027l0 463.333c0,50.8323 -1.16416,81.9984 -3.66433,93.8334 -2.33692,11.6674 -6.16878,19.6662 -11.3366,23.8332 -5.3311,4.33447 -11.8307,6.33202 -19.6662,6.33202 -8.99972,0 -20.4996,-2.50016 -34.1646,-7.83126l-6.83463 17.1661 134.334 54.6642 21.9988 0 0 -324.166zm0 -31.3336l0 -267.5c16.5002,-16.3327 33.6663,-28.6659 51.5025,-36.8323 17.6644,-8.33387 35.8313,-12.5008 54.4966,-12.5008 29.4993,0 57.1686,16.3327 82.6686,48.8348 25.4999,32.4978 38.3315,79.8333 38.3315,141.998 0,57.3362 -12.8316,101.334 -38.3315,132.169 -25.4999,30.6678 -54.5009,46.1671 -87.1663,46.1671 -17.1661,0 -34.4996,-4.50201 -51.6657,-13.1667 -13.0034,-6.49956 -29.6669,-19.6662 -49.8357,-39.1692z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3685"
|
||||
horiz-adv-x="443"
|
||||
unicode="a">
|
||||
<path
|
||||
id="path3687"
|
||||
d="M284.666 64.5016c-45.832,-35.5006 -74.6655,-56.0002 -86.5004,-61.5031 -17.5011,-8.16633 -36.1664,-12.3333 -56.0002,-12.3333 -30.9986,0 -56.4985,10.6665 -76.4998,31.8362 -19.997,21.1655 -29.9976,48.998 -29.9976,83.4976 0,21.8356 4.83279,40.6684 14.6659,56.666 13.3342,22.0031 36.4972,42.8335 69.4976,62.4997 33.0004,19.503 87.9997,43.1686 164.835,71.1687l0 17.6644c0,44.5003 -6.99787,75.1681 -21.1655,91.8358 -14.1676,16.5002 -34.8347,24.8341 -61.8339,24.8341 -20.4996,0 -36.8323,-5.50293 -48.8348,-16.6677 -12.3333,-11.0016 -18.4978,-23.6656 -18.4978,-38.0007l1.00092 -28.3309c0,-15.001 -3.83616,-26.5008 -11.4999,-34.6672 -7.66802,-8.16633 -17.6687,-12.17 -30.0019,-12.17 -12.1657,0 -21.9988,4.16694 -29.6669,12.6683 -7.66802,8.50141 -11.4999,20.0013 -11.4999,34.6672 0,28.0001 14.3351,53.6675 43.0011,77.1656 28.6659,23.3348 68.8318,35.1655 120.665,35.1655 39.6675,0 72.1653,-6.6628 97.6652,-19.997 19.1679,-10.1682 33.3355,-26.0025 42.5027,-47.4988 5.83371,-14 8.66465,-42.5027 8.66465,-85.8346l0 -151.835c0,-42.666 0.833387,-68.8318 2.50016,-78.4973 1.66677,-9.50233 4.33447,-16.0019 8.00309,-19.1679 3.83186,-3.33355 8.16633,-5.00032 12.9991,-5.00032 5.16356,0 9.83311,1.16846 13.665,3.50108 6.83463,4.16694 20.0013,16.1651 39.5,35.6638l0 -27.3299c-36.334,-48.8348 -71.1644,-73.3338 -104.5,-73.3338 -15.8344,0 -28.4984,5.49864 -38.0007,16.6634 -9.49803,11.0016 -14.3308,30.0019 -14.6659,56.6703zm0 31.6644l0 170.501c-49.1655,-19.6662 -80.8342,-33.4987 -95.1651,-41.5018 -25.835,-14.3308 -44.1695,-29.3318 -55.1668,-44.9986 -11.1691,-15.6668 -16.6677,-32.6653 -16.6677,-51.3349 0,-23.3305 7.00217,-42.8292 21.0022,-58.3328 14,-15.3317 30.1652,-23.1673 48.3322,-23.1673 24.8341,0 57.3319,16.337 97.6652,48.8348z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3689"
|
||||
horiz-adv-x="541"
|
||||
unicode="~">
|
||||
<path
|
||||
id="path3691"
|
||||
d="M508.834 329.665l21.9988 0c-1.3317,-42.3309 -13.3342,-75.4989 -36.1664,-99.4995 -22.8322,-23.8332 -50.6648,-35.8313 -83.5019,-35.8313 -14.9967,0 -31.1661,2.50016 -48.3322,7.50048 -17.3336,5.16356 -61.8339,22.3339 -133.832,51.6657 -50.1665,20.8347 -85.8346,31.1661 -107,31.1661 -22.669,0 -42.0001,-6.99787 -57.4994,-20.9979 -15.6668,-14 -26.6684,-36.8366 -33.1679,-68.3334l-21.5005 0c1.83431,43.9977 14,77.5007 35.9989,100.831 22.1664,23.3348 48.1689,34.8347 78.1665,34.8347 14.3351,0 29.001,-2.16938 44.002,-6.83463 33.8338,-9.66557 78.3341,-26.3333 133.501,-49.9989 55.1668,-23.6656 93.9966,-35.333 116.498,-35.333 24.3358,0 44.8354,7.83126 61.4988,23.3305 16.6677,15.6668 26.3333,38.1683 29.3361,67.5001z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3693"
|
||||
horiz-adv-x="443"
|
||||
unicode="z">
|
||||
<path
|
||||
id="path3695"
|
||||
d="M420.001 137.165l-5.50293 -137.165 -394.497 0 0 17.5011 296.832 395.666 -146.5 0c-31.5012,0 -52.1683,-2.16509 -62.0014,-6.16878 -9.66557,-4.16264 -17.6644,-11.8307 -23.8332,-23.163 -8.83218,-16.337 -13.8325,-36.5015 -15.1642,-60.6697l-19.503 0 2.83523 124.166 374.998 0 0 -18.1627 -299.667 -396.503 163 0c34.1689,0 57.3362,2.83523 69.6694,8.66894 12.1657,5.66617 21.9988,15.6668 29.4993,29.9976 5.16786,10.3357 9.49803,32.3346 13.1667,65.8333l16.6677 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3697"
|
||||
horiz-adv-x="499"
|
||||
unicode="y">
|
||||
<path
|
||||
id="path3699"
|
||||
d="M5.83371 447.331l208.501 0 0 -18.1627 -10.1682 0c-14.6659,0 -25.6675,-3.17031 -33.0004,-9.50233 -7.33295,-6.33202 -11.0016,-14.1676 -11.0016,-23.6656 0,-12.6683 5.3354,-30.3327 16.1694,-52.6666l108.834 -225.667 100.165 247c5.49864,13.5017 8.16633,26.6684 8.16633,39.6675 0,5.83371 -1.16846,10.1639 -3.33355,13.1667 -2.6677,3.49679 -6.6671,6.33202 -12.1657,8.49711 -5.66617,2.16938 -15.336,3.17031 -29.3361,3.17031l0 18.1627 145.503 0 0 -18.1627c-12.0025,-1.336 -21.333,-3.83616 -27.8368,-7.83556 -6.49956,-3.83186 -13.665,-11.1648 -21.4962,-21.9988 -3.00277,-4.50201 -8.50141,-17.0028 -16.6677,-37.5024l-182.001 -446.33c-17.6687,-43.3361 -40.6684,-76.0015 -69.1668,-98.1678 -28.4984,-22.1664 -55.8326,-33.1679 -82.3335,-33.1679 -19.1679,0 -34.998,5.50293 -47.3355,16.6677 -12.3333,11.0016 -18.4978,23.6656 -18.4978,38.0007 0,13.665 4.49771,24.6665 13.3342,33.0004 8.99972,8.33387 21.333,12.5008 36.9998,12.5008 10.6665,0 25.3324,-3.66862 43.8344,-10.834 12.9991,-4.83279 21.1655,-7.33295 24.499,-7.33295 9.66557,0 20.3321,5.16356 31.9995,15.1642 11.4999,10.1682 23.1673,29.6669 34.8347,58.6679l31.8319 77.5007 -160.668 337.5c-5.00032,10.0006 -12.664,22.6647 -23.4981,37.4981 -8.16633,11.4999 -14.8334,19.1679 -20.0013,22.9998 -7.50048,5.16786 -19.4987,9.83311 -36.1664,13.6693l0 18.1627z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3701"
|
||||
horiz-adv-x="499"
|
||||
unicode="x">
|
||||
<path
|
||||
id="path3703"
|
||||
d="M13.1667 447.331l210.499 0 0 -18.1627c-13.3342,0 -22.6647,-2.16938 -28.1676,-6.83463 -5.3311,-4.50201 -7.9988,-10.499 -7.9988,-17.9994 0,-7.83556 5.66617,-19.8338 17.1661,-36.1664 3.50108,-5.16786 8.83648,-13.3342 16.0019,-24.3358l31.8319 -50.8323 36.5015 50.8323c23.4981,32.167 35.1655,52.4991 35.1655,61.0005 0,6.83463 -2.6677,12.5008 -8.16633,17.3336 -5.66617,4.66525 -14.4984,7.00217 -26.9992,7.00217l0 18.1627 151.5 0 0 -18.1627c-16.0019,-1.00092 -29.8344,-5.3354 -41.5018,-13.1667 -15.9976,-11.0016 -37.8332,-35.1698 -65.4982,-72.1696l-61.0005 -81.6676 111.334 -160.165c27.3299,-39.3324 46.8329,-62.998 58.5003,-71.0011 11.8307,-7.9988 26.8316,-12.4965 45.4969,-13.4974l0 -17.5011 -210.997 0 0 17.5011c14.6659,0 25.9982,3.33355 34.1646,9.83311 6.16878,4.49771 9.33479,10.6665 9.33479,17.9994 0,7.50048 -10.499,26.5008 -31.3336,56.666l-65.335 95.8352 -71.8302 -95.8352c-22.1707,-29.4993 -33.1679,-47.168 -33.1679,-52.6666 0,-7.83126 3.66433,-14.8334 10.9973,-21.333 7.33724,-6.33202 18.3345,-9.83311 33.0004,-10.499l0 -17.5011 -145.997 0 0 17.5011c11.6674,1.66677 21.8313,5.83371 30.6635,12.3333 12.3376,9.3305 33.1679,33.4987 62.504,72.1653l93.8334 124.501 -85.0012 123.165c-24.1682,35.1655 -42.666,57.1686 -56.0002,66.1684 -13.1667,8.83218 -29.6669,13.3342 -49.5006,13.3342l0 18.1627z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3705"
|
||||
horiz-adv-x="722"
|
||||
unicode="w">
|
||||
<path
|
||||
id="path3707"
|
||||
d="M6.33202 447.331l187.499 0 0 -18.1627c-17.1661,-1.336 -28.4984,-4.33447 -33.997,-9.16726 -5.3354,-5.00032 -7.9988,-12.0025 -7.9988,-21.0022 0,-10.1639 2.83094,-22.3339 8.32957,-36.6647l95.6677 -257.336 96.166 209.502 -25.3324 65.8333c-7.83126,19.4987 -17.9994,33.0004 -30.831,40.5009 -7.16971,4.66525 -20.5039,7.33295 -40.0026,8.33387l0 18.1627 212.999 0 0 -18.1627c-23.4981,-1.00092 -40.1658,-5.16786 -49.8314,-12.6683 -6.49956,-5.16786 -9.83311,-13.5017 -9.83311,-24.8341 0,-6.49956 1.3317,-13.1667 3.9994,-20.0013l101.501 -256.997 94.1641 247.666c6.49956,17.5011 9.83311,31.4969 9.83311,42.0001 0,6.16449 -3.16601,11.6674 -9.49803,16.5002 -6.33202,5.00032 -18.8328,7.66372 -37.3349,8.33387l0 18.1627 141.001 0 0 -18.1627c-28.3352,-4.16694 -49.1655,-23.3348 -62.4997,-57.5037l-149.335 -385.33 -19.997 0 -111.837 285.667 -130.331 -285.667 -18.167 0 -143.502 375.999c-9.49803,23.6656 -18.6653,39.8307 -27.8325,47.9971 -9.16726,8.33387 -23.4981,14.6702 -43.0011,18.8371l0 18.1627z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3709"
|
||||
horiz-adv-x="499"
|
||||
unicode="v">
|
||||
<path
|
||||
id="path3711"
|
||||
d="M8.33387 447.331l210.499 0 0 -18.1627 -13.8325 0c-12.6683,0 -22.3339,-3.00277 -29.001,-9.16726 -6.6671,-6.33632 -10.0006,-14.5027 -10.0006,-25.0016 0,-11.3323 3.50108,-24.8341 10.3357,-40.5009l103.997 -247 104.5 256.335c7.50048,18.167 11.1691,31.9995 11.1691,41.5018 0,4.49771 -1.336,8.16633 -3.83186,11.1648 -3.66862,4.83279 -8.17063,8.16633 -13.6693,10.0006 -5.66617,1.83431 -16.831,2.6677 -33.8338,2.6677l0 18.1627 146.002 0 0 -18.1627c-16.8353,-1.336 -28.6659,-4.66954 -35.1655,-10.1682 -11.3366,-9.83311 -21.5005,-26.1658 -30.6678,-48.8348l-158.666 -383.831 -20.0013 0 -159.667 377.499c-7.16541,17.5011 -14,30.1652 -20.4996,37.8332 -6.6671,7.66802 -14.8334,14 -25.0016,19.1679 -5.49864,2.99847 -16.5002,5.83371 -32.6653,8.33387l0 18.1627z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3713"
|
||||
horiz-adv-x="499"
|
||||
unicode="u">
|
||||
<path
|
||||
id="path3715"
|
||||
d="M423.335 447.331l0 -270.997c0,-51.8332 1.16416,-83.5019 3.66433,-95.0018 2.50016,-11.6674 6.33202,-19.6662 11.6674,-24.1639 5.49864,-4.66954 11.6674,-6.83463 18.8328,-6.83463 10.1682,0 21.5005,2.6677 34.1689,8.33387l6.83034 -17.1661 -133.832 -55.1668 -21.8356 0 0 94.6668c-38.499,-41.6694 -67.8308,-67.8351 -87.9997,-78.5016 -20.1645,-10.834 -41.4975,-16.1651 -63.8314,-16.1651 -25.1649,0 -46.8329,7.16541 -65.335,21.6638 -18.3302,14.5027 -31.1661,33.1679 -38.3315,56.0002 -7.16541,22.8322 -10.6665,54.9992 -10.6665,96.6686l0 199.665c0,21.1655 -2.33262,35.8356 -6.83463,44.002 -4.49771,8.16633 -11.3323,14.3308 -20.3321,18.8328 -8.83218,4.33447 -25.1691,6.33202 -48.4997,6.00125l0 18.1627 156.664 0 0 -299.332c0,-41.6651 7.33724,-68.9993 21.8356,-81.9984 14.4984,-13.1667 31.9995,-19.6662 52.4991,-19.6662 14,0 29.8344,4.49771 47.4988,13.1667 17.8362,8.83218 38.8341,25.6675 63.3331,50.334l0 253.5c0,25.3324 -4.66525,42.4984 -14,51.4982 -9.3305,8.83218 -28.4984,13.665 -57.8302,14.3351l0 18.1627 152.334 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3717"
|
||||
horiz-adv-x="277"
|
||||
unicode="t">
|
||||
<path
|
||||
id="path3719"
|
||||
d="M161.166 594.166l0 -146.835 104.5 0 0 -34.1646 -104.5 0 0 -290.165c0,-29.001 4.16694,-48.504 12.5008,-58.5003 8.16633,-10.1682 18.8328,-15.1685 31.8319,-15.1685 10.834,0 21.1697,3.33355 31.3336,10.0006 10.0006,6.6671 17.8362,16.5002 23.5024,29.4993l19.0004 0c-11.4999,-31.8319 -27.5018,-55.8326 -48.3364,-71.9978 -20.8304,-16.1694 -42.3309,-24.1682 -64.4973,-24.1682 -15.001,0 -29.6669,4.16694 -44.002,12.5008 -14.3308,8.33387 -24.8341,20.1645 -31.6644,35.6638 -6.83463,15.336 -10.3357,39.1692 -10.3357,71.5037l0 300.831 -70.6661 0 0 16.0019c17.8319,7.16541 36.1664,19.3311 54.8317,36.3297 18.6696,17.1704 35.5006,37.5024 50.0032,60.8373 7.50048,12.3333 17.9994,34.998 31.3336,67.8308l15.1642 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3721"
|
||||
horiz-adv-x="389"
|
||||
unicode="s">
|
||||
<path
|
||||
id="path3723"
|
||||
d="M320.334 460.498l0 -152.329 -16.1694 0c-12.3333,47.8295 -28.1633,80.3316 -47.4988,97.6652 -19.4987,17.1661 -44.1652,25.835 -73.9996,25.835 -22.8322,0 -41.1667,-6.00125 -55.1668,-18.167 -14,-12.0025 -20.9979,-25.3367 -20.9979,-40.0026 0,-18.167 5.16356,-33.8338 15.4993,-46.8329 10.1639,-13.3342 30.6678,-27.4975 61.6663,-42.4984l71.1644 -34.6672c66.1684,-32.167 99.1688,-74.6655 99.1688,-127.5 0,-40.6684 -15.3317,-73.3338 -46.1671,-98.3354 -30.6678,-24.8341 -65.1674,-37.3306 -103.168,-37.3306 -27.4975,0 -58.6636,4.83279 -93.8334,14.6659 -10.6665,3.16601 -19.4987,4.83279 -26.3333,4.83279 -7.50048,0 -13.3299,-4.16694 -17.6644,-12.6683l-16.0019 0 0 159.667 16.0019 0c9.16726,-45.4969 26.6641,-79.8333 52.3316,-103.001 25.6675,-23.163 54.5009,-34.6629 86.3329,-34.6629 22.5014,0 40.836,6.49956 54.9992,19.6662 14.1676,13.3299 21.1697,29.1643 21.1697,47.6663 0,22.4972 -7.83556,41.3343 -23.6656,56.666 -15.6668,15.3317 -47.168,34.6672 -94.5035,58.1653 -47.1637,23.3348 -77.999,44.5003 -92.6649,63.3331 -14.6659,18.6696 -21.9988,42.0001 -21.9988,70.3353 0,36.8323 12.664,67.6676 37.8332,92.3341 25.1649,24.6665 57.8302,37.163 97.8328,37.163 17.6644,0 38.9974,-3.83186 63.999,-11.3323 16.6677,-4.83279 27.665,-7.33295 33.1679,-7.33295 5.3311,0 9.3305,1.16846 12.3333,3.50108 2.83094,2.33262 6.33202,7.33295 10.1639,15.1642l16.1694 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3725"
|
||||
horiz-adv-x="332"
|
||||
unicode="r">
|
||||
<path
|
||||
id="path3727"
|
||||
d="M162.167 460.498l0 -100.664c37.3349,67.165 75.8339,100.664 115.166,100.664 17.8319,0 32.6653,-5.49864 44.5003,-16.3327 11.6674,-10.9973 17.5011,-23.6656 17.5011,-37.8332 0,-12.8316 -4.16694,-23.4981 -12.6683,-32.3303 -8.50141,-8.83648 -18.4978,-13.1667 -30.3327,-13.1667 -11.3323,0 -24.1682,5.66617 -38.3315,16.831 -14.1676,11.1691 -24.6708,16.8353 -31.5012,16.8353 -5.83371,0 -12.1657,-3.16601 -19.0004,-9.66987 -14.6659,-13.3299 -29.8344,-35.333 -45.3337,-65.9965l0 -214.335c0,-24.6665 2.99847,-43.4994 9.16726,-56.1677 4.33447,-8.83218 11.8307,-16.1651 22.4972,-21.9988 10.834,-5.83371 26.1701,-8.83218 46.3346,-8.83218l0 -17.5011 -229.001 0 0 17.5011c22.8365,0 39.835,3.66433 50.8366,10.834 8.16633,5.16356 13.8325,13.4974 17.1661,24.8298 1.49924,5.67047 2.33262,21.333 2.33262,47.5031l0 173.332c0,52.0008 -1.00092,82.9993 -3.16601,93 -2.00185,9.83311 -6.00125,17.1661 -11.6674,21.6681 -5.66617,4.49771 -12.8316,6.83034 -21.333,6.83034 -10.0006,0 -21.333,-2.49587 -34.1689,-7.33295l-4.83279 17.6687 135.335 54.6642 20.4996 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3729"
|
||||
horiz-adv-x="499"
|
||||
unicode="q">
|
||||
<path
|
||||
id="path3731"
|
||||
d="M427.167 460.498l0 -575.166c0,-28.6659 2.00185,-47.1637 6.00125,-55.33 3.83186,-8.00309 10.0006,-14.3351 18.3302,-19.0004 8.17063,-4.50201 24.3358,-6.83463 48.4997,-6.83463l0 -17.9994 -225.663 0 0 17.9994 9.3305 0c18.3345,0 32.167,2.6677 41.5018,7.83126 6.49956,3.66862 11.6674,10.0006 15.6668,19.3354 3.83186,9.16726 5.83371,27.1667 5.83371,53.9983l0 192.336c-29.6669,-35.1698 -55.5019,-59.1662 -77.6682,-72.0021 -22.1664,-12.8316 -44.9986,-19.3311 -68.8318,-19.3311 -43.3361,0 -82.0027,19.6662 -116,58.9986 -34.0013,39.5 -50.9998,92.1666 -50.9998,158.335 0,75.8296 22.4972,137.496 67.5001,185.33 44.8311,47.6663 98.9969,71.4995 162.498,71.4995 18.5021,0 35.6681,-2.6634 51.3349,-7.83126 15.4993,-5.16786 29.4993,-12.9991 42.0001,-23.4981 18.8328,9.16296 36.8323,19.4987 54.1659,31.3293l16.5002 0zm-80.4992 -352.166l0 210.001c0,24.499 -3.16601,43.6669 -9.50233,57.6669 -6.33202,14 -17.6644,25.835 -33.997,35.6681 -16.1694,9.66557 -34.6672,14.6659 -55.1668,14.6659 -36.334,0 -67.6676,-15.4993 -93.6701,-46.4978 -25.9982,-30.8353 -39.1649,-77.6682 -39.1649,-140.503 0,-60.3303 13.3342,-105.999 39.835,-137.333 26.4966,-31.1661 58.5003,-46.8329 95.9985,-46.8329 19.1679,0 36.334,4.16694 51.1674,12.5008 15.001,8.33387 29.8344,21.8313 44.5003,40.6641z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3733"
|
||||
horiz-adv-x="499"
|
||||
unicode="p">
|
||||
<path
|
||||
id="path3735"
|
||||
d="M-1.00092 402.835l137.668 55.6651 18.6653 0 0 -104.5c22.9998,39.3324 46.1671,66.9974 69.5019,82.8318 23.3305,15.6668 47.8338,23.6656 73.5013,23.6656 44.9986,0 82.3292,-17.6644 112.331,-52.8299 36.8323,-43.0011 55.1668,-98.8337 55.1668,-168.001 0,-77.0024 -22.1664,-140.834 -66.4991,-191.335 -36.334,-41.3343 -82.3335,-61.9971 -137.668,-61.9971 -24.0007,0 -44.8311,3.33355 -62.4997,10.1639 -12.9991,5.00032 -27.665,14.6659 -43.8344,29.3361l0 -136.169c0,-30.6678 1.83431,-49.9989 5.50293,-58.3328 3.83186,-8.33387 10.3314,-15.001 19.6662,-19.8338 9.16726,-4.83279 25.9982,-7.33295 50.4972,-7.33295l0 -17.9994 -234.5 0 0 17.9994 12.3333 0c17.8362,-0.335073 33.1679,3.16601 45.8363,10.3314 6.16449,3.50108 10.9973,9.33479 14.4984,17.3336 3.33355,8.00309 5.00032,28.1676 5.00032,60.6697l0 423c0,28.8335 -1.16846,47.3312 -3.83186,55.1668 -2.6677,7.83126 -6.83463,13.665 -12.5008,17.4968 -5.66617,4.00369 -13.3342,5.83371 -23.1673,5.83371 -7.83556,0 -17.6687,-2.16509 -29.8344,-6.83034l-5.83371 15.6668zm156.333 -77.6682l0 -167c0,-36.1664 1.336,-59.832 4.33447,-71.3362 4.50201,-18.8328 15.6668,-35.333 33.4987,-49.6639 17.6687,-14.3351 40.0026,-21.5005 67.1693,-21.5005 32.4978,0 58.8311,12.6683 78.9999,38.0007 26.3333,33.1636 39.5,80.0009 39.5,140.164 0,68.3334 -14.8334,121 -44.8354,157.669 -20.8304,25.4999 -45.6645,38.1683 -74.1671,38.1683 -15.6668,0 -31.1661,-4.00369 -46.4978,-11.6674 -11.6674,-6.00125 -31.0029,-23.5024 -58.002,-52.8342z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3737"
|
||||
horiz-adv-x="759"
|
||||
unicode="®">
|
||||
<path
|
||||
id="path3739"
|
||||
d="M379.835 677.166c58.3328,0 115.166,-14.8334 170.496,-44.6635 55.3343,-29.6669 98.5029,-72.3371 129.669,-127.835 30.9986,-55.5019 46.4978,-113.332 46.4978,-173.667 0,-59.832 -15.1642,-117.336 -45.832,-172.335 -30.6678,-54.9992 -73.3338,-97.6652 -128.501,-128.165 -54.9992,-30.5002 -112.331,-45.6688 -172.331,-45.6688 -59.8363,0 -117.168,15.1685 -172.004,45.6688 -54.9992,30.5002 -97.6652,73.1662 -128.165,128.165 -30.6678,54.9992 -45.9995,112.503 -45.9995,172.335 0,60.3346 15.4993,118.165 46.6654,173.667 31.0029,55.4976 74.3347,98.1678 129.669,127.835 55.3343,29.8301 112,44.6635 169.835,44.6635zm0 -29.6669c-53.0017,0 -104.835,-13.665 -155.169,-40.9992 -50.5015,-27.3342 -89.834,-66.3316 -118.165,-117.001 -28.3352,-50.6648 -42.5027,-103.499 -42.5027,-158.498 0,-54.6685 13.8325,-107 41.6694,-157.166 27.8325,-50.1665 66.8299,-89.1681 116.996,-117.168 50.1708,-28.0001 102.502,-42.0001 157.171,-42.0001 54.6642,0 107.163,14 157.497,42.0001 50.334,28.0001 89.3357,67.0017 117.168,117.168 27.8325,50.1665 41.8326,102.498 41.8326,157.166 0,54.9992 -14.1676,107.833 -42.4984,158.498 -28.3352,50.6691 -67.6676,89.6664 -118.169,117.001 -50.4972,27.3342 -102.335,40.9992 -155.83,40.9992zm-191.335 -103.499l188.5 0c47.168,0 83.1669,-10.6665 107.833,-31.9995 24.8341,-21.333 37.1673,-47.168 37.1673,-77.5007 0,-24.6665 -8.33387,-46.3346 -25.1691,-65.1674 -16.831,-18.6653 -44.5003,-33.0004 -83.3301,-43.1643l102.163 -145.503c12.3333,-17.3293 23.3348,-29.1643 33.1679,-35.6638 6.16878,-3.83616 14.8334,-6.33202 25.835,-7.33295l0 -16.0019 -89.834 0 -143.502 197.667 -37.1673 0 0 -150.834c2.00185,-10.834 6.6671,-18.6653 14,-23.4981 7.33724,-4.83279 21.8356,-7.33295 43.6669,-7.33295l0 -16.0019 -179.165 0 0 16.0019c15.4993,0 26.6684,1.83431 33.1679,5.66617 6.49956,3.66433 11.1648,9.16726 14.1676,16.3327 2.33262,5.16786 3.32925,20.3321 3.32925,45.3337l0 255.498c0,24.0007 -0.498314,38.1683 -1.3317,42.5027 -2.33262,7.50048 -6.49956,13.1667 -12.5008,17.3336 -5.99695,3.9994 -16.3327,6.00125 -30.9986,6.00125l0 17.6644zm115.665 -203.669c38.5033,0 66.5034,3.66862 84.3353,11.1691 17.6687,7.50048 31.3336,17.9994 40.6684,31.5012 9.49803,13.4974 14.1633,28.9967 14.1633,46.1671 0,26.3333 -9.16726,48.4997 -27.4975,66.4991 -18.5021,17.8319 -42.0001,26.8316 -70.6661,26.8316 -12.3333,0 -26.0025,-2.6677 -41.0035,-7.83126l0 -174.337z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3741"
|
||||
horiz-adv-x="332"
|
||||
unicode="">
|
||||
<path
|
||||
id="path3743"
|
||||
d="M40.5009 261.168l252.499 0 0 -73.6688 -252.499 0 0 73.6688z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3745"
|
||||
horiz-adv-x="759"
|
||||
unicode="©">
|
||||
<path
|
||||
id="path3747"
|
||||
d="M379.835 677.166c58.3328,0 115.166,-14.8334 170.496,-44.6635 55.3343,-29.6669 98.5029,-72.3371 129.669,-127.835 30.9986,-55.5019 46.4978,-113.332 46.4978,-173.667 0,-59.832 -15.1642,-117.336 -45.832,-172.335 -30.6678,-54.9992 -73.3338,-97.6652 -128.501,-128.165 -54.9992,-30.5002 -112.331,-45.6688 -172.331,-45.6688 -59.8363,0 -117.168,15.1685 -172.004,45.6688 -54.9992,30.5002 -97.6652,73.1662 -128.165,128.165 -30.6678,54.9992 -45.9995,112.503 -45.9995,172.335 0,60.3346 15.4993,118.165 46.6654,173.667 31.0029,55.4976 74.3347,98.1678 129.669,127.835 55.3343,29.8301 112,44.6635 169.835,44.6635zm0 -29.6669c-53.0017,0 -104.835,-13.665 -155.169,-40.9992 -50.5015,-27.3342 -89.834,-66.3316 -118.165,-117.001 -28.3352,-50.6648 -42.5027,-103.499 -42.5027,-158.498 0,-54.6685 13.8325,-107 41.6694,-157.166 27.8325,-50.1665 66.8299,-89.1681 116.996,-117.168 50.1708,-28.0001 102.502,-42.0001 157.171,-42.0001 54.6642,0 107.163,14 157.497,42.0001 50.334,28.0001 89.3357,67.0017 117.168,117.168 27.8325,50.1665 41.8326,102.498 41.8326,157.166 0,54.9992 -14.1676,107.833 -42.4984,158.498 -28.3352,50.6691 -67.6676,89.6664 -118.169,117.001 -50.4972,27.3342 -102.335,40.9992 -155.83,40.9992zm171.497 -93.8334l9.66557 -136.667 -19.0004 0c-11.6631,38.6666 -30.3327,67.6676 -55.8326,86.668 -25.6675,19.0004 -56.3309,28.4984 -92.1666,28.4984 -26.6641,0 -50.334,-5.49864 -71.1644,-16.5002 -20.8347,-11.1648 -38.0007,-25.9982 -51.3349,-44.496 -9.83311,-14 -17.9994,-32.5021 -24.499,-55.6694 -6.49956,-23.1673 -9.66557,-47.4988 -9.66557,-73.1662 0,-68.9993 14.8334,-119.999 44.3328,-152.664 29.6669,-32.6696 68.8318,-49.0023 117.331,-49.0023 63.3331,0 114.17,26.3333 152.334,78.9999l17.9994 -9.16726c-45.1661,-66.1641 -107.498,-99.1645 -187.001,-99.1645 -65.1631,0 -118.998,20.9979 -161.832,63.1656 -42.8335,42.1677 -64.1665,93.3351 -64.1665,153.665 0,62.4997 22.669,115.837 68.3334,159.834 45.5012,44.1652 103.834,66.1684 174.668,66.1684 15.001,0 27.4975,-1.00092 37.4981,-2.83523 9.83311,-1.99755 27.5018,-7.16541 52.8342,-15.6668 8.16633,-2.6677 14.1676,-3.9994 18.167,-3.9994 5.16786,0 9.49803,1.49924 13.1667,4.16694 3.50108,2.83523 7.16541,8.83218 10.6665,17.8319l19.6662 0z" />
|
||||
</glyph>
|
||||
<glyph
|
||||
id="glyph3749"
|
||||
horiz-adv-x="499"
|
||||
unicode="£">
|
||||
<path
|
||||
id="path3751"
|
||||
d="M353 321.833l-126 0c0.335073,-15.001 0.50261,-26.1658 0.50261,-33.3355 0,-30.496 -2.16938,-58.8311 -6.50386,-84.8293 -4.49771,-26.1701 -12.3333,-56.0002 -23.6656,-89.834 63.6682,-20.4996 100.17,-31.8362 109.333,-33.8338 16.8353,-3.83616 33.503,-5.83371 49.8357,-5.83371 26.9992,0 48.998,6.33202 65.8333,18.8328 16.9985,12.5008 29.3318,32.3346 37.1673,59.3337l17.4968 -4.33447c-6.83034,-52.4991 -23.6656,-92.1666 -50.4972,-119.166 -26.8359,-26.9992 -56.666,-40.5009 -89.6664,-40.5009 -22.0031,0 -42.0001,3.9994 -59.9996,11.835 -17.8362,7.9988 -50.9998,30.1652 -99.1688,66.1641 -12.9991,-25.9982 -26.9992,-45.4969 -42.1677,-58.5003 -15.1642,-12.9991 -31.3336,-19.4987 -48.6672,-19.4987 -16.1651,0 -29.8301,5.49864 -40.6641,16.8353 -11.0016,11.1648 -16.3327,26.5008 -16.3327,46.1671 0,21.6638 7.50048,39.8307 22.3339,54.3334 14.9967,14.4984 34.3321,21.8313 57.6669,21.8313 5.49864,0 11.6631,-0.335073 18.6653,-1.00092 6.83463,-0.66585 14.3308,-1.66677 22.8322,-2.99847 0.66585,8.50141 1.16846,15.8344 1.336,21.9988 0.163241,6.16878 0.163241,11.3323 0.163241,15.6668 0,28.6659 -3.49679,82.1659 -10.3314,160.668l-94.6668 0 0 46.3346 94.6668 0c-4.16694,48.4997 -6.33202,80.83 -6.33202,97.1669 0,39.6632 7.9988,75.9972 23.9964,108.83 16.0019,33.0004 38.0007,58.002 66.1684,75.5031 28.1676,17.3336 58.3328,26.1658 90.4998,26.1658 40.9992,0 72.0021,-11.1691 92.6649,-33.3355 20.6671,-21.9988 31.0029,-44.1652 31.0029,-66.3316 0,-10.3314 -3.9994,-19.6662 -12.0025,-27.8325 -7.9988,-8.16633 -16.6634,-12.1657 -26.1658,-12.1657 -12.3333,0 -22.6647,6.16449 -30.6678,18.4978 -3.66433,5.83371 -6.16449,18.5021 -7.33295,37.8332 -1.3317,19.3354 -6.83034,33.6663 -16.6634,42.8335 -10.1682,8.99972 -24.3358,13.665 -42.5027,13.665 -25.6675,0 -47.0005,-10.1639 -63.6639,-30.3327 -16.8353,-20.1645 -25.1691,-55.6651 -25.1691,-106.497 0,-23.6699 2.00185,-54.1659 5.83371,-91.3332 2.33262,-24.3358 3.83186,-42.0001 4.83279,-52.6666l126 0 0 -46.3346zm-207.5 -237.833c-7.16541,4.49771 -14.1676,7.9988 -20.9979,10.1682 -6.83463,2.33262 -13.6693,3.49679 -20.4996,3.49679 -14.6702,0 -26.0025,-3.9994 -34.1689,-11.9982 -8.16633,-7.9988 -12.1657,-18.3345 -12.1657,-30.9986 0,-11.6674 3.16601,-21.0022 9.49803,-27.8368 6.33632,-6.83034 13.6693,-10.1639 22.1664,-10.1639 10.834,0 21.3373,5.00032 31.5012,15.001 10.3357,10.1639 18.5021,27.4975 24.6665,52.3316z" />
|
||||
</glyph>
|
||||
</font>
|
||||
</defs>
|
||||
<g
|
||||
style="fill-rule:evenodd"
|
||||
id="g3961"
|
||||
transform="matrix(0.26092747,0,0,0.26092747,-150.0074,-14.465307)">
|
||||
<g
|
||||
id="Layer_x0020_1">
|
||||
<metadata
|
||||
id="CorelCorpID_0Corel-Layer" />
|
||||
<g
|
||||
id="g3757">
|
||||
<path
|
||||
id="path3759"
|
||||
d="m 593.15,80.4362 -14.7544,0 7.3772,-13.4111 7.3772,13.4111 z m -7.3772,63.2708 -1.4111,-1.4111 0,-63.0225 2.8222,0 0,63.0225 -1.4111,1.4111 z m 0,0 -1.4111,0 0,-1.4111 1.4111,1.4111 z m 70.9777,0 -70.9777,0 0,-2.8222 70.9777,0 0,2.8222 z m -1.1628,-8.7883 13.4111,7.3772 -13.4111,7.3772 0,-14.7544 z"
|
||||
class="fil0"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#28166f;fill-rule:nonzero" />
|
||||
</g>
|
||||
<path
|
||||
id="path3761"
|
||||
d="m 584.507,122.884 c 5.4385,-10.8771 6.772,-13.3112 12.6675,-1.5201 5.2569,10.5139 11.1935,-16.4141 16.3833,-0.8445 4.908,14.7242 14.9355,-18.1932 21.6192,1.8579 1.2202,3.6606 6.4838,-0.3776 7.9383,-2.1957 7.0041,-8.7586 6.283,-3.6821 11.6541,1.689"
|
||||
class="fil1 str0"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#28166f;stroke-width:5.64440012" />
|
||||
<text
|
||||
id="text3763"
|
||||
class="fil2 fnt0"
|
||||
y="105.433"
|
||||
x="624.72302"
|
||||
style="font-size:23.2784996px;font-weight:normal;fill:#28166f;font-family:Times New Roman">v(t)</text>
|
||||
<rect
|
||||
id="rect3765"
|
||||
height="11.394"
|
||||
width="3.4182"
|
||||
y="115.457"
|
||||
x="580.90997"
|
||||
class="fil3 str1"
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.0762" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 111 KiB |
|
@ -0,0 +1,140 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="sim_tune.svg">
|
||||
<metadata
|
||||
id="metadata50">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1000"
|
||||
id="namedview48"
|
||||
showgrid="true"
|
||||
inkscape:zoom="22.961539"
|
||||
inkscape:cx="22.847263"
|
||||
inkscape:cy="14.370314"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3006"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style3201"
|
||||
type="text/css">
|
||||
.fil0 {fill:#00923F}
|
||||
</style>
|
||||
<style
|
||||
id="style3282"
|
||||
type="text/css">
|
||||
.str0 {stroke:#DA251D;stroke-width:0.0762}
|
||||
.fil0 {fill:#DA251D}
|
||||
</style>
|
||||
<style
|
||||
id="style3363"
|
||||
type="text/css">
|
||||
.fil0 {fill:#28166F}
|
||||
</style>
|
||||
<style
|
||||
id="style3448"
|
||||
type="text/css">
|
||||
.str0 {stroke:#28166F;stroke-width:0.0762}
|
||||
.str1 {stroke:#28166F;stroke-width:2.8222}
|
||||
.fil1 {fill:none}
|
||||
.fil0 {fill:#28166F}
|
||||
</style>
|
||||
</defs>
|
||||
<g
|
||||
style="fill-rule:evenodd"
|
||||
id="g3469"
|
||||
transform="matrix(0.24461259,0,0,0.22640667,-97.21454,-8.3068908)">
|
||||
<g
|
||||
id="Layer_x0020_1">
|
||||
<metadata
|
||||
id="CorelCorpID_0Corel-Layer" />
|
||||
<polygon
|
||||
id="polygon3452"
|
||||
points="479.386,49.1497 468.164,67.1189 461.483,62.0725 475.843,46.3793 "
|
||||
class="fil0 str0"
|
||||
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
|
||||
<polygon
|
||||
id="polygon3454"
|
||||
points="409.114,129.032 418.351,109.564 433.894,121.304 417.417,135.398 "
|
||||
class="fil0 str0"
|
||||
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
|
||||
<rect
|
||||
id="rect3456"
|
||||
ry="0.79079998"
|
||||
rx="0.79079998"
|
||||
height="36.848999"
|
||||
width="7.9926"
|
||||
transform="matrix(1.485,1.12165,-1.21627,1.61027,464.721,51.9919)"
|
||||
class="fil0 str0"
|
||||
x="0"
|
||||
y="0"
|
||||
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
|
||||
<rect
|
||||
id="rect3458"
|
||||
ry="1.6112"
|
||||
rx="1.6112"
|
||||
height="3.4238"
|
||||
width="11.6812"
|
||||
transform="matrix(1.80799,1.36561,-1.36561,1.80799,416.388,106.365)"
|
||||
class="fil0 str0"
|
||||
x="0"
|
||||
y="0"
|
||||
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
|
||||
<polygon
|
||||
id="polygon3460"
|
||||
points="415.651,125.526 405.196,139.368 400.984,148.426 408.418,142.645 419.076,128.535 "
|
||||
class="fil0 str0"
|
||||
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
|
||||
<path
|
||||
id="path3462"
|
||||
d="m 476.138,50.2632 c 6.9706,-10.9547 21.8672,-11.2504 20.0427,3.4745 -2.3011,18.57 -50.7341,55.7184 -26.4633,74.9809 4.1502,3.1639 15.5463,9.4991 27.8104,7.409"
|
||||
class="fil1 str1"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#28166f;stroke-width:2.82220006" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="add_arc.svg">
|
||||
<metadata
|
||||
id="metadata50">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1000"
|
||||
id="namedview48"
|
||||
showgrid="true"
|
||||
inkscape:zoom="22.961539"
|
||||
inkscape:cx="21.978887"
|
||||
inkscape:cy="14.372445"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3006"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style3201"
|
||||
type="text/css">
|
||||
.fil0 {fill:#00923F}
|
||||
</style>
|
||||
</defs>
|
||||
<g
|
||||
style="fill-rule:evenodd"
|
||||
id="g3212"
|
||||
transform="matrix(0.25556099,0,0,0.25556099,-38.947924,-8.6975232)">
|
||||
<g
|
||||
id="Layer_x0020_1">
|
||||
<metadata
|
||||
id="CorelCorpID_0Corel-Layer" />
|
||||
<polygon
|
||||
id="polygon3205"
|
||||
points="162.107,36.8175 245.819,85.5025 162.359,133.984 "
|
||||
class="fil0"
|
||||
style="fill:#00923f" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,72 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="sim_settings.svg">
|
||||
<metadata
|
||||
id="metadata50">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1000"
|
||||
id="namedview48"
|
||||
showgrid="true"
|
||||
inkscape:zoom="22.961539"
|
||||
inkscape:cx="21.978887"
|
||||
inkscape:cy="14.372445"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3006"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style3201"
|
||||
type="text/css">
|
||||
.fil0 {fill:#00923F}
|
||||
</style>
|
||||
</defs>
|
||||
<path
|
||||
id="path3281"
|
||||
d="M 23.256135,14.998175 V 11.21958 L 20.910799,10.828691 C 20.780503,10.307505 20.51991,9.7863203 20.129021,9.0045413 L 21.562281,7.0500948 18.826057,4.3138704 16.87161,5.7471309 C 16.220128,5.3562417 15.568646,5.0956489 15.047461,4.9653525 L 14.786868,2.6200171 H 11.008272 L 10.617383,4.9653525 C 9.9659012,5.0956489 9.4447152,5.3562417 8.7932342,5.7471309 L 6.8387876,4.3138704 4.1025629,7.0500948 5.405527,9.0045413 C 5.0146378,9.6560233 4.8843414,10.177209 4.6237486,10.828691 l -2.215039,0.260593 v 3.778594 l 2.3453354,0.39089 c 0.1302964,0.651482 0.3908892,1.172667 0.7817784,1.824149 l -1.3029641,1.954446 2.7362247,2.736225 1.9544462,-1.302964 c 0.521185,0.260593 1.1726668,0.521186 1.8241488,0.781778 l 0.390889,2.345336 h 3.908893 l 0.390889,-2.345336 c 0.651482,-0.130296 1.172668,-0.390889 1.82415,-0.781778 l 1.954446,1.43326 2.736224,-2.736224 -1.43326,-1.954446 c 0.390889,-0.651482 0.651482,-1.302964 0.781778,-1.82415 l 1.954447,-0.390889 z m -10.423713,1.954446 c -2.215039,0 -3.9088918,-1.693853 -3.9088918,-3.908892 0,-2.215038 1.6938528,-3.9088917 3.9088918,-3.9088917 2.215039,0 3.908892,1.6938537 3.908892,3.9088917 0,2.215039 -1.693853,3.908892 -3.908892,3.908892 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
|
@ -0,0 +1,92 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="sim_run.svg">
|
||||
<metadata
|
||||
id="metadata50">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1000"
|
||||
id="namedview48"
|
||||
showgrid="true"
|
||||
inkscape:zoom="16.23626"
|
||||
inkscape:cx="28.212686"
|
||||
inkscape:cy="8.3654748"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3006"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style3201"
|
||||
type="text/css">
|
||||
.fil0 {fill:#00923F}
|
||||
</style>
|
||||
<style
|
||||
id="style3282"
|
||||
type="text/css">
|
||||
.str0 {stroke:#DA251D;stroke-width:0.0762}
|
||||
.fil0 {fill:#DA251D}
|
||||
</style>
|
||||
</defs>
|
||||
<g
|
||||
style="fill-rule:evenodd"
|
||||
id="g3293"
|
||||
transform="matrix(0.21662328,0,0,0.21662328,-0.09790372,-11.577568)">
|
||||
<g
|
||||
id="Layer_x0020_1">
|
||||
<metadata
|
||||
id="CorelCorpID_0Corel-Layer" />
|
||||
<rect
|
||||
id="rect3286"
|
||||
height="89.604897"
|
||||
width="90.811699"
|
||||
y="69.152901"
|
||||
x="14.49"
|
||||
class="fil0 str0"
|
||||
style="fill:#da251d;stroke:#da251d;stroke-width:0.0762" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,103 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="26"
|
||||
width="26"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="sim_stop.svg">
|
||||
<metadata
|
||||
id="metadata50">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1000"
|
||||
id="namedview48"
|
||||
showgrid="true"
|
||||
inkscape:zoom="16.23626"
|
||||
inkscape:cx="37.591318"
|
||||
inkscape:cy="25.47254"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:snap-to-guides="false"
|
||||
inkscape:snap-grids="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3006"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style3201"
|
||||
type="text/css">
|
||||
.fil0 {fill:#00923F}
|
||||
</style>
|
||||
<style
|
||||
id="style3282"
|
||||
type="text/css">
|
||||
.str0 {stroke:#DA251D;stroke-width:0.0762}
|
||||
.fil0 {fill:#DA251D}
|
||||
</style>
|
||||
<style
|
||||
id="style3363"
|
||||
type="text/css">
|
||||
.fil0 {fill:#28166F}
|
||||
</style>
|
||||
</defs>
|
||||
<g
|
||||
style="fill-rule:evenodd"
|
||||
id="g3375"
|
||||
transform="matrix(0.21994704,0,0,0.21994704,-59.705381,-6.2888419)">
|
||||
<g
|
||||
id="Layer_x0020_1">
|
||||
<metadata
|
||||
id="CorelCorpID_0Corel-Layer" />
|
||||
<g
|
||||
id="_210257584">
|
||||
<path
|
||||
d="m 278.712,140.427 c -3.801,-3.5131 -2.6247,-12.0338 8.2392,-27.0585 6.2877,-8.6956 20.0408,-11.3843 21.6725,-14.7159 1.579,-3.2236 -1.1947,-12.8616 5.3512,-9.6322 3.4875,1.7205 6.4926,4.3826 8.8694,7.2744 2.9118,2.3567 5.5741,5.3616 7.2946,8.8491 3.2294,6.5459 -6.4085,3.7723 -9.6321,5.3513 -3.3319,1.6316 -6.0204,15.3847 -14.716,21.6724 -15.0247,10.8639 -23.5454,12.0402 -27.0788,8.2594 z"
|
||||
class="fil0"
|
||||
id="_210248864"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#28166f" />
|
||||
<polygon
|
||||
points="327.688,91.3873 330.28,94.3283 370.774,55.4503 374.438,53.3445 376.998,50.6064 382.653,41.1421 380.414,38.6621 377.937,36.4203 368.472,42.0751 365.734,44.6346 363.628,48.2992 324.75,88.7924 "
|
||||
class="fil0"
|
||||
id="_210248840"
|
||||
style="fill:#28166f" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.2 KiB |
|
@ -169,6 +169,7 @@ set( COMMON_DLG_SRCS
|
|||
)
|
||||
|
||||
set( COMMON_WIDGET_SRCS
|
||||
widgets/mathplot.cpp
|
||||
widgets/widget_hotkey_list.cpp
|
||||
)
|
||||
|
||||
|
|
|
@ -247,6 +247,7 @@ KIWAY::FACE_T KIWAY::KifaceType( FRAME_T aFrameType )
|
|||
case FRAME_SCH_LIB_EDITOR:
|
||||
case FRAME_SCH_VIEWER:
|
||||
case FRAME_SCH_VIEWER_MODAL:
|
||||
case FRAME_SIMULATOR:
|
||||
return FACE_SCH;
|
||||
|
||||
case FRAME_PCB:
|
||||
|
@ -301,6 +302,7 @@ KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate, KIWAY_PLAYER* aP
|
|||
return NULL;
|
||||
}
|
||||
|
||||
printf("Player %d\n", aFrameType);
|
||||
// return the previously opened window
|
||||
KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
|
||||
|
||||
|
|
|
@ -1,4 +1,28 @@
|
|||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||
* Copyright (C) 2016 KiCad Developers, see CHANGELOG.TXT for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <kiway.h>
|
||||
#include <kiway_player.h>
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,123 @@
|
|||
* Node assignments
|
||||
* non-inverting input
|
||||
* | inverting input
|
||||
* | | positive supply
|
||||
* | | | negative supply
|
||||
* | | | | output
|
||||
* | | | | |
|
||||
.SUBCKT AD8009 1 2 99 50 28
|
||||
|
||||
* input stage *
|
||||
|
||||
q1 50 3 5 qp1
|
||||
q2 99 5 4 qn1
|
||||
q3 99 3 6 qn2
|
||||
q4 50 6 4 qp2
|
||||
i1 99 5 1.625e-3
|
||||
i2 6 50 1.625e-3
|
||||
cin1 1 98 2.6e-12
|
||||
cin2 2 98 1e-12
|
||||
v1 4 2 0
|
||||
|
||||
* input error sources *
|
||||
|
||||
eos 3 1 poly(1) 20 98 2e-3 1
|
||||
fbn 2 98 poly(1) vnoise3 50e-6 1e-3
|
||||
fbp 1 98 poly(1) vnoise3 50e-6 1e-3
|
||||
|
||||
* slew limiting stage *
|
||||
|
||||
fsl 98 16 v1 1
|
||||
dsl1 98 16 d1
|
||||
dsl2 16 98 d1
|
||||
dsl3 16 17 d1
|
||||
dsl4 17 16 d1
|
||||
rsl 17 18 0.22
|
||||
vsl 18 98 0
|
||||
|
||||
* gain stage *
|
||||
|
||||
f1 98 7 vsl 2
|
||||
rgain 7 98 2.5e5
|
||||
cgain 7 98 1.25e-12
|
||||
dcl1 7 8 d1
|
||||
dcl2 9 7 d1
|
||||
vcl1 99 8 1.83
|
||||
vcl2 9 50 1.83
|
||||
|
||||
gcm 98 7 poly(2) 98 0 30 0 0 1e-5 1e-5
|
||||
|
||||
* second pole *
|
||||
|
||||
epole 14 98 7 98 1
|
||||
rpole 14 15 1
|
||||
cpole 15 98 2e-10
|
||||
|
||||
* reference stage *
|
||||
|
||||
eref 98 0 poly(2) 99 0 50 0 0 0.5 0.5
|
||||
|
||||
ecmref 30 0 poly(2) 1 0 2 0 0 0.5 0.5
|
||||
|
||||
* vnoise stage *
|
||||
|
||||
rnoise1 19 98 4.6e-3
|
||||
vnoise1 19 98 0
|
||||
vnoise2 21 98 0.53
|
||||
dnoise1 21 19 dn
|
||||
|
||||
fnoise1 20 98 vnoise1 1
|
||||
rnoise2 20 98 1
|
||||
|
||||
* inoise stage *
|
||||
|
||||
rnoise3 22 98 8.18e-6
|
||||
vnoise3 22 98 0
|
||||
vnoise4 24 98 0.575
|
||||
dnoise2 24 22 dn
|
||||
|
||||
fnoise2 23 98 vnoise3 1
|
||||
rnoise4 23 98 1
|
||||
|
||||
* buffer stage *
|
||||
|
||||
gbuf 98 13 15 98 1e-2
|
||||
rbuf 98 13 1e2
|
||||
|
||||
* output current reflected to supplies *
|
||||
|
||||
fcurr 98 40 voc 1
|
||||
vcur1 26 98 0
|
||||
vcur2 98 27 0
|
||||
dcur1 40 26 d1
|
||||
dcur2 27 40 d1
|
||||
|
||||
* output stage *
|
||||
|
||||
vo1 99 90 0
|
||||
vo2 91 50 0
|
||||
fout1 0 99 poly(2) vo1 vcur1 -9.27e-3 1 -1
|
||||
fout2 50 0 poly(2) vo2 vcur2 -9.27e-3 1 -1
|
||||
gout1 90 10 13 99 0.5
|
||||
gout2 91 10 13 50 0.5
|
||||
rout1 10 90 2
|
||||
rout2 10 91 2
|
||||
voc 10 28 0
|
||||
rout3 28 98 1e6
|
||||
dcl3 13 11 d1
|
||||
dcl4 12 13 d1
|
||||
vcl3 11 10 -0.445
|
||||
vcl4 10 12 -0.445
|
||||
|
||||
.model qp1 pnp()
|
||||
.model qp2 pnp()
|
||||
.model qn1 npn()
|
||||
.model qn2 npn()
|
||||
.model d1 d()
|
||||
.model dn d(af=1 kf=1e-8)
|
||||
.ends
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
.model FZT1049A NPN IS=1.5E-12 NF=1.0 BF=600 IKF=7.5 VAF=100 ISE=0.9E-13 NE=1.25 NR=1.0 BR=150 IKR=3 VAR=15 ISC=5.0E-13 NC=1.76 RB=0.1 RE=0.018 RC=0.007 CJC=136E-12 CJE=550E-12 MJC=0.352 MJE=0.36 VJC=0.554 VJE=0.726 TF=400E-12 TR=6.9E-9
|
|
@ -0,0 +1 @@
|
|||
.model LASER D(Is=1e-22 Rs=6 N=1.5 Cjo=50p Xti=100 Iave=160m Vpk=5)
|
|
@ -0,0 +1,166 @@
|
|||
EESchema-LIBRARY Version 2.3
|
||||
#encoding utf-8
|
||||
#
|
||||
# C
|
||||
#
|
||||
DEF C C 0 10 N Y 1 F N
|
||||
F0 "C" 25 100 50 H V L CNN
|
||||
F1 "C" 25 -100 50 H V L CNN
|
||||
F2 "" 38 -150 30 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
$FPLIST
|
||||
C?
|
||||
C_????_*
|
||||
C_????
|
||||
SMD*_c
|
||||
Capacitor*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 20 -80 -30 80 -30 N
|
||||
P 2 0 1 20 -80 30 80 30 N
|
||||
X ~ 1 0 150 110 D 40 40 1 1 P
|
||||
X ~ 2 0 -150 110 U 40 40 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GND
|
||||
#
|
||||
DEF GND #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "GND" 0 -150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
|
||||
X GND 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Generic_Opamp
|
||||
#
|
||||
DEF Generic_Opamp U 0 20 Y Y 1 F N
|
||||
F0 "U" 0 250 50 H V L CNN
|
||||
F1 "Generic_Opamp" 0 150 50 H V L CNN
|
||||
F2 "" -100 -100 50 H V C CNN
|
||||
F3 "" 0 0 50 H V C CNN
|
||||
DRAW
|
||||
P 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f
|
||||
X + 1 -300 100 100 R 50 50 1 1 I
|
||||
X - 2 -300 -100 100 R 50 50 1 1 I
|
||||
X V+ 3 -100 300 150 D 50 50 1 1 W
|
||||
X V- 4 -100 -300 150 U 50 50 1 1 W
|
||||
X ~ 5 300 0 100 L 50 50 1 1 O
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# LED
|
||||
#
|
||||
DEF LED D 0 40 Y N 1 F N
|
||||
F0 "D" 0 100 50 H V C CNN
|
||||
F1 "LED" 0 -100 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
$FPLIST
|
||||
LED-3MM
|
||||
LED-5MM
|
||||
LED-10MM
|
||||
LED-0603
|
||||
LED-0805
|
||||
LED-1206
|
||||
LEDV
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 0 -50 50 -50 -50 N
|
||||
P 3 0 1 0 -80 -25 -125 -65 -120 -40 N
|
||||
P 3 0 1 0 -65 -40 -110 -80 -105 -55 N
|
||||
P 3 0 1 0 50 50 -50 0 50 -50 F
|
||||
X K 1 -200 0 150 R 40 40 1 1 P
|
||||
X A 2 200 0 150 L 40 40 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Q_NPN_CBE
|
||||
#
|
||||
DEF Q_NPN_CBE Q 0 0 Y N 1 F N
|
||||
F0 "Q" 300 50 50 H V R CNN
|
||||
F1 "Q_NPN_CBE" 600 -50 50 H V R CNN
|
||||
F2 "" 200 100 29 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
C 50 0 111 0 1 10 N
|
||||
P 2 0 1 0 25 25 100 100 N
|
||||
P 3 0 1 0 25 -25 100 -100 100 -100 N
|
||||
P 3 0 1 20 25 75 25 -75 25 -75 N
|
||||
P 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F
|
||||
X C 1 100 200 100 D 50 50 1 1 P
|
||||
X B 2 -200 0 225 R 50 50 1 1 I
|
||||
X E 3 100 -200 100 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# R
|
||||
#
|
||||
DEF R R 0 0 N Y 1 F N
|
||||
F0 "R" 80 0 50 V V C CNN
|
||||
F1 "R" 0 0 50 V V C CNN
|
||||
F2 "" -70 0 30 V V C CNN
|
||||
F3 "" 0 0 30 H V C CNN
|
||||
$FPLIST
|
||||
R_*
|
||||
Resistor_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -40 -100 40 100 0 1 10 N
|
||||
X ~ 1 0 150 50 D 60 60 1 1 P
|
||||
X ~ 2 0 -150 50 U 60 60 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VDD
|
||||
#
|
||||
DEF VDD #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "VDD" 0 150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
C 0 75 25 0 1 0 N
|
||||
P 2 0 1 0 0 0 0 50 N
|
||||
X VDD 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VSOURCE
|
||||
#
|
||||
DEF ~VSOURCE V 0 40 Y Y 1 F N
|
||||
F0 "V" 200 200 50 H V C CNN
|
||||
F1 "VSOURCE" 250 100 50 H I C CNN
|
||||
F2 "" 0 0 50 H V C CNN
|
||||
F3 "" 0 0 50 H V C CNN
|
||||
F4 "Value" 0 0 60 H I C CNN "Fieldname"
|
||||
F5 "V" 0 0 60 H I C CNN "Spice_Primitive"
|
||||
F6 "1 2" -300 200 60 H I C CNN "Spice_Node_Sequence"
|
||||
DRAW
|
||||
C 0 0 100 0 1 0 N
|
||||
P 2 0 1 0 0 -75 0 75 N
|
||||
P 4 0 1 0 0 75 -25 25 25 25 0 75 F
|
||||
X ~ 1 0 200 100 D 50 50 1 1 I
|
||||
X ~ 2 0 -200 100 U 50 50 1 1 I
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VSS
|
||||
#
|
||||
DEF VSS #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "VSS" 0 150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
C 0 75 25 0 1 0 N
|
||||
P 2 0 1 0 0 0 0 50 N
|
||||
X VSS 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
|
@ -0,0 +1,61 @@
|
|||
update=wto, 19 lip 2016, 23:56:07
|
||||
version=1
|
||||
last_client=eeschema
|
||||
[general]
|
||||
version=1
|
||||
RootSch=
|
||||
BoardNm=
|
||||
[pcbnew]
|
||||
version=1
|
||||
LastNetListRead=
|
||||
UseCmpFile=1
|
||||
PadDrill=0.600000000000
|
||||
PadDrillOvalY=0.600000000000
|
||||
PadSizeH=1.500000000000
|
||||
PadSizeV=1.500000000000
|
||||
PcbTextSizeV=1.500000000000
|
||||
PcbTextSizeH=1.500000000000
|
||||
PcbTextThickness=0.300000000000
|
||||
ModuleTextSizeV=1.000000000000
|
||||
ModuleTextSizeH=1.000000000000
|
||||
ModuleTextSizeThickness=0.150000000000
|
||||
SolderMaskClearance=0.000000000000
|
||||
SolderMaskMinWidth=0.000000000000
|
||||
DrawSegmentWidth=0.200000000000
|
||||
BoardOutlineThickness=0.100000000000
|
||||
ModuleOutlineThickness=0.150000000000
|
||||
[cvpcb]
|
||||
version=1
|
||||
NetIExt=net
|
||||
[eeschema]
|
||||
version=1
|
||||
[eeschema/libraries]
|
||||
LibName1=power
|
||||
LibName2=device
|
||||
LibName3=transistors
|
||||
LibName4=conn
|
||||
LibName5=linear
|
||||
LibName6=regul
|
||||
LibName7=74xx
|
||||
LibName8=cmos4000
|
||||
LibName9=adc-dac
|
||||
LibName10=memory
|
||||
LibName11=xilinx
|
||||
LibName12=microcontrollers
|
||||
LibName13=dsp
|
||||
LibName14=microchip
|
||||
LibName15=analog_switches
|
||||
LibName16=motorola
|
||||
LibName17=texas
|
||||
LibName18=intel
|
||||
LibName19=audio
|
||||
LibName20=interface
|
||||
LibName21=digital-audio
|
||||
LibName22=philips
|
||||
LibName23=display
|
||||
LibName24=cypress
|
||||
LibName25=siliconi
|
||||
LibName26=opto
|
||||
LibName27=atmel
|
||||
LibName28=contrib
|
||||
LibName29=valves
|
|
@ -0,0 +1,382 @@
|
|||
EESchema Schematic File Version 2
|
||||
LIBS:power
|
||||
LIBS:device
|
||||
LIBS:transistors
|
||||
LIBS:conn
|
||||
LIBS:linear
|
||||
LIBS:regul
|
||||
LIBS:74xx
|
||||
LIBS:cmos4000
|
||||
LIBS:adc-dac
|
||||
LIBS:memory
|
||||
LIBS:xilinx
|
||||
LIBS:microcontrollers
|
||||
LIBS:dsp
|
||||
LIBS:microchip
|
||||
LIBS:analog_switches
|
||||
LIBS:motorola
|
||||
LIBS:texas
|
||||
LIBS:intel
|
||||
LIBS:audio
|
||||
LIBS:interface
|
||||
LIBS:digital-audio
|
||||
LIBS:philips
|
||||
LIBS:display
|
||||
LIBS:cypress
|
||||
LIBS:siliconi
|
||||
LIBS:opto
|
||||
LIBS:atmel
|
||||
LIBS:contrib
|
||||
LIBS:valves
|
||||
LIBS:laser_driver-cache
|
||||
EELAYER 25 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 1
|
||||
Title ""
|
||||
Date ""
|
||||
Rev ""
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 ""
|
||||
Comment4 ""
|
||||
$EndDescr
|
||||
$Comp
|
||||
L VSOURCE V1
|
||||
U 1 1 57336052
|
||||
P 2650 3550
|
||||
F 0 "V1" H 2778 3596 50 0000 L CNN
|
||||
F 1 "pulse (check properties)" H 2778 3505 50 0000 L CNN
|
||||
F 2 "" H 2650 3550 50 0000 C CNN
|
||||
F 3 "" H 2650 3550 50 0000 C CNN
|
||||
F 4 "V" H 2650 3550 60 0001 C CNN "Spice_Primitive"
|
||||
F 5 "pulse(0 3 100n 1n 1n 20n 100n )" H 2650 3550 60 0001 C CNN "Spice_Model"
|
||||
1 2650 3550
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Notes 3150 5400 0 60 ~ 0
|
||||
.tran 10p 150n
|
||||
$Comp
|
||||
L Generic_Opamp U1
|
||||
U 1 1 5788FF9F
|
||||
P 5050 3500
|
||||
F 0 "U1" H 5391 3546 50 0000 L CNN
|
||||
F 1 "AD8009" H 5391 3455 50 0000 L CNN
|
||||
F 2 "" H 4950 3400 50 0000 C CNN
|
||||
F 3 "" H 5050 3500 50 0000 C CNN
|
||||
F 4 "Value" H 5050 3500 60 0001 C CNN "Fieldname"
|
||||
F 5 "X" H 5050 3500 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "ad8009" H 5050 3500 60 0001 C CNN "Spice_Model"
|
||||
F 7 "Y" H 5050 3500 60 0001 C CNN "Spice_Netlist_Enabled"
|
||||
F 8 "ad8009.lib" H 5050 3500 60 0001 C CNN "Spice_Lib_File"
|
||||
1 5050 3500
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSOURCE V2
|
||||
U 1 1 578900BA
|
||||
P 9650 1850
|
||||
F 0 "V2" H 9778 1896 50 0000 L CNN
|
||||
F 1 "DC 10" H 9778 1805 50 0000 L CNN
|
||||
F 2 "" H 9650 1850 50 0000 C CNN
|
||||
F 3 "" H 9650 1850 50 0000 C CNN
|
||||
F 4 "Value" H 9650 1850 60 0001 C CNN "Fieldname"
|
||||
F 5 "V" H 9650 1850 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 9350 2050 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 9650 1850
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSOURCE V3
|
||||
U 1 1 57890232
|
||||
P 9650 2350
|
||||
F 0 "V3" H 9778 2396 50 0000 L CNN
|
||||
F 1 "DC 10" H 9778 2305 50 0000 L CNN
|
||||
F 2 "" H 9650 2350 50 0000 C CNN
|
||||
F 3 "" H 9650 2350 50 0000 C CNN
|
||||
F 4 "Value" H 9650 2350 60 0001 C CNN "Fieldname"
|
||||
F 5 "V" H 9650 2350 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 9350 2550 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 9650 2350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR7
|
||||
U 1 1 578902D2
|
||||
P 9400 2100
|
||||
F 0 "#PWR7" H 9400 1850 50 0001 C CNN
|
||||
F 1 "GND" H 9405 1927 50 0000 C CNN
|
||||
F 2 "" H 9400 2100 50 0000 C CNN
|
||||
F 3 "" H 9400 2100 50 0000 C CNN
|
||||
1 9400 2100
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VDD #PWR8
|
||||
U 1 1 578903C0
|
||||
P 9650 1600
|
||||
F 0 "#PWR8" H 9650 1450 50 0001 C CNN
|
||||
F 1 "VDD" H 9667 1773 50 0000 C CNN
|
||||
F 2 "" H 9650 1600 50 0000 C CNN
|
||||
F 3 "" H 9650 1600 50 0000 C CNN
|
||||
1 9650 1600
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSS #PWR9
|
||||
U 1 1 578903E2
|
||||
P 9650 2600
|
||||
F 0 "#PWR9" H 9650 2450 50 0001 C CNN
|
||||
F 1 "VSS" H 9668 2773 50 0000 C CNN
|
||||
F 2 "" H 9650 2600 50 0000 C CNN
|
||||
F 3 "" H 9650 2600 50 0000 C CNN
|
||||
1 9650 2600
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VDD #PWR3
|
||||
U 1 1 57890425
|
||||
P 4950 3200
|
||||
F 0 "#PWR3" H 4950 3050 50 0001 C CNN
|
||||
F 1 "VDD" H 4967 3373 50 0000 C CNN
|
||||
F 2 "" H 4950 3200 50 0000 C CNN
|
||||
F 3 "" H 4950 3200 50 0000 C CNN
|
||||
1 4950 3200
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSS #PWR4
|
||||
U 1 1 57890453
|
||||
P 4950 3800
|
||||
F 0 "#PWR4" H 4950 3650 50 0001 C CNN
|
||||
F 1 "VSS" H 4968 3973 50 0000 C CNN
|
||||
F 2 "" H 4950 3800 50 0000 C CNN
|
||||
F 3 "" H 4950 3800 50 0000 C CNN
|
||||
1 4950 3800
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C2
|
||||
U 1 1 5789085B
|
||||
P 6800 4000
|
||||
F 0 "C2" H 6915 3954 50 0000 L CNN
|
||||
F 1 "1p" H 6915 4045 50 0000 L CNN
|
||||
F 2 "" H 6838 3850 50 0000 C CNN
|
||||
F 3 "" H 6800 4000 50 0000 C CNN
|
||||
1 6800 4000
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R5
|
||||
U 1 1 578EA6D8
|
||||
P 6400 4000
|
||||
F 0 "R5" H 6469 3954 50 0000 L CNN
|
||||
F 1 "2.5" H 6469 4045 50 0000 L CNN
|
||||
F 2 "" V 6330 4000 50 0000 C CNN
|
||||
F 3 "" H 6400 4000 50 0000 C CNN
|
||||
1 6400 4000
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R1
|
||||
U 1 1 578EA7EE
|
||||
P 4150 3600
|
||||
F 0 "R1" V 3943 3600 50 0000 C CNN
|
||||
F 1 "220" V 4034 3600 50 0000 C CNN
|
||||
F 2 "" V 4080 3600 50 0000 C CNN
|
||||
F 3 "" H 4150 3600 50 0000 C CNN
|
||||
1 4150 3600
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R3
|
||||
U 1 1 578EA8B4
|
||||
P 5400 4150
|
||||
F 0 "R3" V 5193 4150 50 0000 C CNN
|
||||
F 1 "220" V 5284 4150 50 0000 C CNN
|
||||
F 2 "" V 5330 4150 50 0000 C CNN
|
||||
F 3 "" H 5400 4150 50 0000 C CNN
|
||||
1 5400 4150
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C1
|
||||
U 1 1 578EB076
|
||||
P 5400 4400
|
||||
F 0 "C1" V 5240 4400 50 0000 C CNN
|
||||
F 1 "1p" V 5149 4400 50 0000 C CNN
|
||||
F 2 "" H 5438 4250 50 0000 C CNN
|
||||
F 3 "" H 5400 4400 50 0000 C CNN
|
||||
1 5400 4400
|
||||
0 -1 -1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L LED D1
|
||||
U 1 1 578EB1E8
|
||||
P 6400 4900
|
||||
F 0 "D1" V 6446 4792 50 0000 R CNN
|
||||
F 1 "laser diode" V 6355 4792 50 0000 R CNN
|
||||
F 2 "" H 6400 4900 50 0000 C CNN
|
||||
F 3 "" H 6400 4900 50 0000 C CNN
|
||||
F 4 "qtlp690c" H 6400 4900 60 0001 C CNN "Fieldname"
|
||||
F 5 "D" H 6400 4900 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "laser" H 6400 4900 60 0001 C CNN "Spice_Model"
|
||||
F 7 "Y" H 6400 4900 60 0001 C CNN "Spice_Netlist_Enabled"
|
||||
F 8 "laser.lib" H 6400 4900 60 0001 C CNN "Spice_Lib_File"
|
||||
F 9 "2 1" V 6400 4900 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 6400 4900
|
||||
0 -1 -1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR6
|
||||
U 1 1 578EB42D
|
||||
P 6400 5100
|
||||
F 0 "#PWR6" H 6400 4850 50 0001 C CNN
|
||||
F 1 "GND" H 6405 4927 50 0000 C CNN
|
||||
F 2 "" H 6400 5100 50 0000 C CNN
|
||||
F 3 "" H 6400 5100 50 0000 C CNN
|
||||
1 6400 5100
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R4
|
||||
U 1 1 578EBA35
|
||||
P 6150 2900
|
||||
F 0 "R4" V 5943 2900 50 0000 C CNN
|
||||
F 1 "220" V 6034 2900 50 0000 C CNN
|
||||
F 2 "" V 6080 2900 50 0000 C CNN
|
||||
F 3 "" H 6150 2900 50 0000 C CNN
|
||||
1 6150 2900
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R2
|
||||
U 1 1 578EBB39
|
||||
P 4350 2900
|
||||
F 0 "R2" V 4143 2900 50 0000 C CNN
|
||||
F 1 "160" V 4234 2900 50 0000 C CNN
|
||||
F 2 "" V 4280 2900 50 0000 C CNN
|
||||
F 3 "" H 4350 2900 50 0000 C CNN
|
||||
1 4350 2900
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR2
|
||||
U 1 1 578EBBE4
|
||||
P 4000 3600
|
||||
F 0 "#PWR2" H 4000 3350 50 0001 C CNN
|
||||
F 1 "GND" H 4005 3427 50 0000 C CNN
|
||||
F 2 "" H 4000 3600 50 0000 C CNN
|
||||
F 3 "" H 4000 3600 50 0000 C CNN
|
||||
1 4000 3600
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L VDD #PWR5
|
||||
U 1 1 578EBCE4
|
||||
P 6400 3300
|
||||
F 0 "#PWR5" H 6400 3150 50 0001 C CNN
|
||||
F 1 "VDD" H 6417 3473 50 0000 C CNN
|
||||
F 2 "" H 6400 3300 50 0000 C CNN
|
||||
F 3 "" H 6400 3300 50 0000 C CNN
|
||||
1 6400 3300
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
9650 2100 9400 2100
|
||||
Wire Wire Line
|
||||
5350 3500 6100 3500
|
||||
Wire Wire Line
|
||||
4300 3600 4750 3600
|
||||
Wire Wire Line
|
||||
4500 4150 5250 4150
|
||||
Wire Wire Line
|
||||
4500 4150 4500 3600
|
||||
Connection ~ 4500 3600
|
||||
Wire Wire Line
|
||||
6400 4150 6400 4700
|
||||
Wire Wire Line
|
||||
6800 4350 6800 4150
|
||||
Connection ~ 6400 4350
|
||||
Wire Wire Line
|
||||
5900 4150 5900 3750
|
||||
Wire Wire Line
|
||||
5550 4150 5900 4150
|
||||
Wire Wire Line
|
||||
5100 4400 5250 4400
|
||||
Wire Wire Line
|
||||
5100 4150 5100 4400
|
||||
Connection ~ 5100 4150
|
||||
Wire Wire Line
|
||||
5550 4400 5750 4400
|
||||
Wire Wire Line
|
||||
5750 4400 5750 4150
|
||||
Connection ~ 5750 4150
|
||||
Wire Wire Line
|
||||
6400 4350 7000 4350
|
||||
Wire Wire Line
|
||||
4500 2900 6000 2900
|
||||
Wire Wire Line
|
||||
6300 2900 7000 2900
|
||||
Wire Wire Line
|
||||
4650 3400 4650 2900
|
||||
Connection ~ 4650 2900
|
||||
Wire Wire Line
|
||||
4750 3400 4650 3400
|
||||
Wire Wire Line
|
||||
4200 2900 2650 2900
|
||||
Wire Wire Line
|
||||
2650 2900 2650 3350
|
||||
$Comp
|
||||
L GND #PWR1
|
||||
U 1 1 578EC19D
|
||||
P 2650 4200
|
||||
F 0 "#PWR1" H 2650 3950 50 0001 C CNN
|
||||
F 1 "GND" H 2655 4027 50 0000 C CNN
|
||||
F 2 "" H 2650 4200 50 0000 C CNN
|
||||
F 3 "" H 2650 4200 50 0000 C CNN
|
||||
1 2650 4200
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
2650 4200 2650 3750
|
||||
Text Label 3650 2900 0 60 ~ 0
|
||||
in
|
||||
Wire Wire Line
|
||||
7000 2900 7000 4350
|
||||
Connection ~ 6800 4350
|
||||
$Comp
|
||||
L Q_NPN_CBE Q1
|
||||
U 1 1 578EADCC
|
||||
P 6300 3500
|
||||
F 0 "Q1" H 6491 3546 50 0000 L CNN
|
||||
F 1 "fzt1049a" H 6491 3455 50 0000 L CNN
|
||||
F 2 "" H 6500 3600 50 0000 C CNN
|
||||
F 3 "" H 6300 3500 50 0000 C CNN
|
||||
F 4 "Value" H 6300 3500 60 0001 C CNN "Fieldname"
|
||||
F 5 "Q" H 6300 3500 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "fzt1049a" H 6300 3500 60 0001 C CNN "Spice_Model"
|
||||
F 7 "Y" H 6300 3500 60 0001 C CNN "Spice_Netlist_Enabled"
|
||||
F 8 "fzt1049a.lib" H 6300 3500 60 0001 C CNN "Spice_Lib_File"
|
||||
1 6300 3500
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
6400 3700 6400 3850
|
||||
Wire Wire Line
|
||||
5900 3750 6800 3750
|
||||
Wire Wire Line
|
||||
6800 3750 6800 3850
|
||||
Connection ~ 6400 3750
|
||||
Text Label 6550 4350 0 60 ~ 0
|
||||
out
|
||||
Wire Wire Line
|
||||
9650 1600 9650 1650
|
||||
Wire Wire Line
|
||||
9650 2600 9650 2550
|
||||
Wire Wire Line
|
||||
9650 2050 9650 2150
|
||||
Connection ~ 9650 2100
|
||||
$EndSCHEMATC
|
|
@ -0,0 +1,98 @@
|
|||
EESchema-LIBRARY Version 2.3
|
||||
#encoding utf-8
|
||||
#
|
||||
# C
|
||||
#
|
||||
DEF C C 0 10 N Y 1 F N
|
||||
F0 "C" 25 100 50 H V L CNN
|
||||
F1 "C" 25 -100 50 H V L CNN
|
||||
F2 "" 38 -150 30 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
$FPLIST
|
||||
C?
|
||||
C_????_*
|
||||
C_????
|
||||
SMD*_c
|
||||
Capacitor*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 20 -80 -30 80 -30 N
|
||||
P 2 0 1 20 -80 30 80 30 N
|
||||
X ~ 1 0 150 110 D 40 40 1 1 P
|
||||
X ~ 2 0 -150 110 U 40 40 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# D
|
||||
#
|
||||
DEF D D 0 40 N N 1 F N
|
||||
F0 "D" 0 100 50 H V C CNN
|
||||
F1 "D" 0 -100 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
$FPLIST
|
||||
Diode_*
|
||||
D-Pak_TO252AA
|
||||
*SingleDiode
|
||||
*_Diode_*
|
||||
*SingleDiode*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 6 -50 50 -50 -50 N
|
||||
P 3 0 1 0 50 50 -50 0 50 -50 F
|
||||
X K 1 -150 0 100 R 50 50 1 1 P
|
||||
X A 2 150 0 100 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GND
|
||||
#
|
||||
DEF GND #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "GND" 0 -150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
|
||||
X GND 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# R
|
||||
#
|
||||
DEF R R 0 0 N Y 1 F N
|
||||
F0 "R" 80 0 50 V V C CNN
|
||||
F1 "R" 0 0 50 V V C CNN
|
||||
F2 "" -70 0 30 V V C CNN
|
||||
F3 "" 0 0 30 H V C CNN
|
||||
$FPLIST
|
||||
R_*
|
||||
Resistor_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -40 -100 40 100 0 1 10 N
|
||||
X ~ 1 0 150 50 D 60 60 1 1 P
|
||||
X ~ 2 0 -150 50 U 60 60 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VSOURCE-RESCUE-rectifier
|
||||
#
|
||||
DEF ~VSOURCE-RESCUE-rectifier V 0 40 Y Y 1 F N
|
||||
F0 "V" 200 200 50 H V C CNN
|
||||
F1 "VSOURCE-RESCUE-rectifier" 250 100 50 H I C CNN
|
||||
F2 "" 0 0 50 H V C CNN
|
||||
F3 "" 0 0 50 H V C CNN
|
||||
F4 "Value" 0 0 60 H I C CNN "Fieldname"
|
||||
F5 "V" 0 0 60 H I C CNN "Spice_Primitive"
|
||||
F6 "1 2" -300 200 60 H I C CNN "Spice_Node_Sequence"
|
||||
DRAW
|
||||
C 0 0 100 0 1 0 N
|
||||
P 2 0 1 0 0 -75 0 75 N
|
||||
P 4 0 1 0 0 75 -25 25 25 25 0 75 F
|
||||
X ~ 1 0 200 100 D 50 50 1 1 I
|
||||
X ~ 2 0 -200 100 U 50 50 1 1 I
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
|
@ -0,0 +1,62 @@
|
|||
update=Fri 05 Aug 2016 05:56:48 PM CEST
|
||||
version=1
|
||||
last_client=eeschema
|
||||
[general]
|
||||
version=1
|
||||
RootSch=
|
||||
BoardNm=
|
||||
[pcbnew]
|
||||
version=1
|
||||
LastNetListRead=
|
||||
UseCmpFile=1
|
||||
PadDrill=0.600000000000
|
||||
PadDrillOvalY=0.600000000000
|
||||
PadSizeH=1.500000000000
|
||||
PadSizeV=1.500000000000
|
||||
PcbTextSizeV=1.500000000000
|
||||
PcbTextSizeH=1.500000000000
|
||||
PcbTextThickness=0.300000000000
|
||||
ModuleTextSizeV=1.000000000000
|
||||
ModuleTextSizeH=1.000000000000
|
||||
ModuleTextSizeThickness=0.150000000000
|
||||
SolderMaskClearance=0.000000000000
|
||||
SolderMaskMinWidth=0.000000000000
|
||||
DrawSegmentWidth=0.200000000000
|
||||
BoardOutlineThickness=0.100000000000
|
||||
ModuleOutlineThickness=0.150000000000
|
||||
[cvpcb]
|
||||
version=1
|
||||
NetIExt=net
|
||||
[eeschema]
|
||||
version=1
|
||||
[eeschema/libraries]
|
||||
LibName1=rectifier-rescue
|
||||
LibName2=power
|
||||
LibName3=device
|
||||
LibName4=transistors
|
||||
LibName5=conn
|
||||
LibName6=linear
|
||||
LibName7=regul
|
||||
LibName8=74xx
|
||||
LibName9=cmos4000
|
||||
LibName10=adc-dac
|
||||
LibName11=memory
|
||||
LibName12=xilinx
|
||||
LibName13=microcontrollers
|
||||
LibName14=dsp
|
||||
LibName15=microchip
|
||||
LibName16=analog_switches
|
||||
LibName17=motorola
|
||||
LibName18=texas
|
||||
LibName19=intel
|
||||
LibName20=audio
|
||||
LibName21=interface
|
||||
LibName22=digital-audio
|
||||
LibName23=philips
|
||||
LibName24=display
|
||||
LibName25=cypress
|
||||
LibName26=siliconi
|
||||
LibName27=opto
|
||||
LibName28=atmel
|
||||
LibName29=contrib
|
||||
LibName30=valves
|
|
@ -0,0 +1,144 @@
|
|||
EESchema Schematic File Version 2
|
||||
LIBS:rectifier-rescue
|
||||
LIBS:power
|
||||
LIBS:device
|
||||
LIBS:transistors
|
||||
LIBS:conn
|
||||
LIBS:linear
|
||||
LIBS:regul
|
||||
LIBS:74xx
|
||||
LIBS:cmos4000
|
||||
LIBS:adc-dac
|
||||
LIBS:memory
|
||||
LIBS:xilinx
|
||||
LIBS:microcontrollers
|
||||
LIBS:dsp
|
||||
LIBS:microchip
|
||||
LIBS:analog_switches
|
||||
LIBS:motorola
|
||||
LIBS:texas
|
||||
LIBS:intel
|
||||
LIBS:audio
|
||||
LIBS:interface
|
||||
LIBS:digital-audio
|
||||
LIBS:philips
|
||||
LIBS:display
|
||||
LIBS:cypress
|
||||
LIBS:siliconi
|
||||
LIBS:opto
|
||||
LIBS:atmel
|
||||
LIBS:contrib
|
||||
LIBS:valves
|
||||
LIBS:rectifier-cache
|
||||
EELAYER 25 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 1
|
||||
Title ""
|
||||
Date ""
|
||||
Rev ""
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 ""
|
||||
Comment4 ""
|
||||
$EndDescr
|
||||
$Comp
|
||||
L VSOURCE-RESCUE-rectifier V1
|
||||
U 1 1 57336052
|
||||
P 4400 4050
|
||||
F 0 "V1" H 4528 4096 50 0000 L CNN
|
||||
F 1 "SINE(0 1.5 1k 0 0 0 0)" H 4528 4005 50 0000 L CNN
|
||||
F 2 "" H 4400 4050 50 0000 C CNN
|
||||
F 3 "" H 4400 4050 50 0000 C CNN
|
||||
1 4400 4050
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR1
|
||||
U 1 1 573360D3
|
||||
P 4400 4350
|
||||
F 0 "#PWR1" H 4400 4100 50 0001 C CNN
|
||||
F 1 "GND" H 4405 4177 50 0000 C CNN
|
||||
F 2 "" H 4400 4350 50 0000 C CNN
|
||||
F 3 "" H 4400 4350 50 0000 C CNN
|
||||
1 4400 4350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R1
|
||||
U 1 1 573360F5
|
||||
P 4650 3700
|
||||
F 0 "R1" V 4443 3700 50 0000 C CNN
|
||||
F 1 "1k" V 4534 3700 50 0000 C CNN
|
||||
F 2 "" V 4580 3700 50 0000 C CNN
|
||||
F 3 "" H 4650 3700 50 0000 C CNN
|
||||
1 4650 3700
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L D D1
|
||||
U 1 1 573361B8
|
||||
P 5100 3700
|
||||
F 0 "D1" H 5100 3485 50 0000 C CNN
|
||||
F 1 "1N4148" H 5100 3576 50 0000 C CNN
|
||||
F 2 "" H 5100 3700 50 0000 C CNN
|
||||
F 3 "" H 5100 3700 50 0000 C CNN
|
||||
1 5100 3700
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C1
|
||||
U 1 1 5733628F
|
||||
P 5400 4000
|
||||
F 0 "C1" H 5515 4046 50 0000 L CNN
|
||||
F 1 "100n" H 5515 3955 50 0000 L CNN
|
||||
F 2 "" H 5438 3850 50 0000 C CNN
|
||||
F 3 "" H 5400 4000 50 0000 C CNN
|
||||
1 5400 4000
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R2
|
||||
U 1 1 573362F7
|
||||
P 5750 4000
|
||||
F 0 "R2" H 5680 3954 50 0000 R CNN
|
||||
F 1 "100k" H 5680 4045 50 0000 R CNN
|
||||
F 2 "" V 5680 4000 50 0000 C CNN
|
||||
F 3 "" H 5750 4000 50 0000 C CNN
|
||||
1 5750 4000
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
Text Notes 4300 4900 0 60 ~ 0
|
||||
.tran 1u 10m\n
|
||||
Wire Wire Line
|
||||
4400 4350 4400 4250
|
||||
Wire Wire Line
|
||||
4400 4300 5750 4300
|
||||
Connection ~ 4400 4300
|
||||
Wire Wire Line
|
||||
5250 3700 5750 3700
|
||||
Wire Wire Line
|
||||
5750 3700 5750 3850
|
||||
Wire Wire Line
|
||||
5400 3850 5400 3700
|
||||
Connection ~ 5400 3700
|
||||
Wire Wire Line
|
||||
5400 4300 5400 4150
|
||||
Wire Wire Line
|
||||
5750 4300 5750 4150
|
||||
Connection ~ 5400 4300
|
||||
Wire Wire Line
|
||||
4800 3700 4950 3700
|
||||
Wire Wire Line
|
||||
4400 3850 4400 3700
|
||||
Wire Wire Line
|
||||
4400 3700 4500 3700
|
||||
Text Label 4400 3800 0 60 ~ 0
|
||||
in
|
||||
Text Label 5550 3700 0 60 ~ 0
|
||||
rect
|
||||
Text Notes 4300 5000 0 60 ~ 0
|
||||
*.ac dec 10 1 1Meg\n
|
||||
$EndSCHEMATC
|
|
@ -0,0 +1,112 @@
|
|||
* AD8051 SPICE Macro-model
|
||||
* Description: Amplifier
|
||||
* Generic Desc: Single 110 MHz rail-to-rail op amp - 3V
|
||||
* Developed by: JCH / ADI
|
||||
* Revision History: 08/10/2012 - Updated to new header style
|
||||
* 0.0 (09/1998)
|
||||
* Copyright 1998, 2012 by Analog Devices, Inc.
|
||||
*
|
||||
* Refer to http://www.analog.com/Analog_Root/static/techSupport/designTools/spiceModels/license/spice_general.html for License Statement. Use of this model
|
||||
* indicates your acceptance with the terms and provisions in the License Statement.
|
||||
*
|
||||
* BEGIN Notes:
|
||||
*
|
||||
* Not Modeled:
|
||||
* CMRR IS NOT MODELED
|
||||
*
|
||||
* Parameters modeled include:
|
||||
* THIS MODEL IS FOR SINGLE SUPPLY OPERATION (+5V)
|
||||
*
|
||||
* END Notes
|
||||
*
|
||||
* Node assignments
|
||||
* noninverting input
|
||||
* | inverting input
|
||||
* | | positive supply
|
||||
* | | | negative supply
|
||||
* | | | | output
|
||||
* | | | | |
|
||||
* | | | | |
|
||||
.SUBCKT AD8051 1 2 99 50 45
|
||||
*
|
||||
* INPUT STAGE
|
||||
*
|
||||
Q1 4 3 5 QPI
|
||||
Q2 6 2 7 QPI
|
||||
RC1 50 4 20.5k
|
||||
RC2 50 6 20.5k
|
||||
RE1 5 8 5k
|
||||
RE2 7 8 5k
|
||||
EOS 3 1 POLY(1) 53 98 1.7E-3 1
|
||||
IOS 1 2 0.1u
|
||||
FNOI1 1 0 VMEAS2 1E-4
|
||||
FNOI2 2 0 VMEAS2 1E-4
|
||||
|
||||
CPAR1 3 50 1.7p
|
||||
CPAR2 2 50 1.7p
|
||||
VCMH1 99 9 1
|
||||
VCMH2 99 10 1
|
||||
D1 5 9 DX
|
||||
D2 7 10 DX
|
||||
IBIAS 99 8 73u
|
||||
*
|
||||
* INTERNAL VOLTAGE REFERENCE
|
||||
*
|
||||
EREF1 98 0 POLY(2) 99 0 50 0 0 0.5 0.5
|
||||
EREF2 97 0 POLY(2) 1 0 2 0 0 0.5 0.5
|
||||
GREF2 97 0 97 0 1E-6
|
||||
*
|
||||
*VOLTAGE NOISE STAGE
|
||||
*
|
||||
DN1 51 52 DNOI1
|
||||
VN1 51 98 0.61
|
||||
VMEAS 52 98 0
|
||||
RNOI1 52 98 6.5E-3
|
||||
|
||||
H1 53 98 VMEAS 1
|
||||
RNOI2 53 98 1
|
||||
*
|
||||
*CURRENT NOISE STAGE
|
||||
*
|
||||
DN2 61 62 DNOI2
|
||||
VN2 61 98 0.545
|
||||
VMEAS2 62 98 0
|
||||
RNOI3 62 98 2E-4
|
||||
*
|
||||
* INTERMEDIATE GAIN STAGE WITH POLE = 96MHz
|
||||
*
|
||||
G1 98 20 4 6 1E-3
|
||||
RP1 98 20 550
|
||||
CP1 98 20 3p
|
||||
*
|
||||
* GAIN STAGE WITH DOMINANT POLE
|
||||
*
|
||||
G4 98 30 20 98 2.6E-3
|
||||
RG1 30 98 155k
|
||||
CF1 30 45 13.5p
|
||||
D5 31 99 DX
|
||||
D6 50 32 DX
|
||||
V1 31 30 0.6
|
||||
V2 30 32 0.6
|
||||
*
|
||||
* OUTPUT STAGE
|
||||
*
|
||||
Q3 45 42 99 QPOX
|
||||
Q4 45 44 50 QNOX
|
||||
EO3 99 42 POLY(1) 98 30 0.7175 0.5
|
||||
EO4 44 50 POLY(1) 30 98 0.7355 0.5
|
||||
*
|
||||
* MODELS
|
||||
*
|
||||
.MODEL QPI PNP (IS=8.6E-18,BF=91,VAF=30.6)
|
||||
.MODEL QNOX NPN(IS=6.37E-16,BF=100,VAF=90,RC=3)
|
||||
.MODEL QPOX PNP(IS=1.19E-15,BF=112,VAF=19.2,RC=6)
|
||||
.MODEL DX D(IS=1E-16)
|
||||
.MODEL DZ D(IS=1E-14,BV=6.6)
|
||||
.MODEL DNOI1 D(KF=9E-10)
|
||||
.MODEL DNOI2 D(KF=1E-8)
|
||||
.ENDS AD8051
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
EESchema-LIBRARY Version 2.3
|
||||
#encoding utf-8
|
||||
#
|
||||
# C
|
||||
#
|
||||
DEF C C 0 10 N Y 1 F N
|
||||
F0 "C" 25 100 50 H V L CNN
|
||||
F1 "C" 25 -100 50 H V L CNN
|
||||
F2 "" 38 -150 30 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
$FPLIST
|
||||
C?
|
||||
C_????_*
|
||||
C_????
|
||||
SMD*_c
|
||||
Capacitor*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 20 -80 -30 80 -30 N
|
||||
P 2 0 1 20 -80 30 80 30 N
|
||||
X ~ 1 0 150 110 D 40 40 1 1 P
|
||||
X ~ 2 0 -150 110 U 40 40 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GND
|
||||
#
|
||||
DEF GND #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "GND" 0 -150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
|
||||
X GND 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Generic_Opamp
|
||||
#
|
||||
DEF Generic_Opamp U 0 20 Y Y 1 F N
|
||||
F0 "U" 0 250 50 H V L CNN
|
||||
F1 "Generic_Opamp" 0 150 50 H V L CNN
|
||||
F2 "" -100 -100 50 H V C CNN
|
||||
F3 "" 0 0 50 H V C CNN
|
||||
DRAW
|
||||
P 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f
|
||||
X + 1 -300 100 100 R 50 50 1 1 I
|
||||
X - 2 -300 -100 100 R 50 50 1 1 I
|
||||
X V+ 3 -100 300 150 D 50 50 1 1 W
|
||||
X V- 4 -100 -300 150 U 50 50 1 1 W
|
||||
X ~ 5 300 0 100 L 50 50 1 1 O
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# R
|
||||
#
|
||||
DEF R R 0 0 N Y 1 F N
|
||||
F0 "R" 80 0 50 V V C CNN
|
||||
F1 "R" 0 0 50 V V C CNN
|
||||
F2 "" -70 0 30 V V C CNN
|
||||
F3 "" 0 0 30 H V C CNN
|
||||
$FPLIST
|
||||
R_*
|
||||
Resistor_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -40 -100 40 100 0 1 10 N
|
||||
X ~ 1 0 150 50 D 60 60 1 1 P
|
||||
X ~ 2 0 -150 50 U 60 60 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VDD
|
||||
#
|
||||
DEF VDD #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "VDD" 0 150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
C 0 75 25 0 1 0 N
|
||||
P 2 0 1 0 0 0 0 50 N
|
||||
X VDD 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VSOURCE-RESCUE-sallen_key
|
||||
#
|
||||
DEF ~VSOURCE-RESCUE-sallen_key V 0 40 Y Y 1 F N
|
||||
F0 "V" 200 200 50 H V C CNN
|
||||
F1 "VSOURCE-RESCUE-sallen_key" 250 100 50 H I C CNN
|
||||
F2 "" 0 0 50 H V C CNN
|
||||
F3 "" 0 0 50 H V C CNN
|
||||
F4 "Value" 0 0 60 H I C CNN "Fieldname"
|
||||
F5 "V" 0 0 60 H I C CNN "Spice_Primitive"
|
||||
F6 "1 2" -300 200 60 H I C CNN "Spice_Node_Sequence"
|
||||
DRAW
|
||||
C 0 0 100 0 1 0 N
|
||||
P 2 0 1 0 0 -75 0 75 N
|
||||
P 4 0 1 0 0 75 -25 25 25 25 0 75 F
|
||||
X ~ 1 0 200 100 D 50 50 1 1 I
|
||||
X ~ 2 0 -200 100 U 50 50 1 1 I
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# VSS
|
||||
#
|
||||
DEF VSS #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "VSS" 0 150 50 H V C CNN
|
||||
F2 "" 0 0 60 H V C CNN
|
||||
F3 "" 0 0 60 H V C CNN
|
||||
DRAW
|
||||
C 0 75 25 0 1 0 N
|
||||
P 2 0 1 0 0 0 0 50 N
|
||||
X VSS 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
|
@ -0,0 +1,73 @@
|
|||
update=Fri 05 Aug 2016 05:58:16 PM CEST
|
||||
version=1
|
||||
last_client=eeschema
|
||||
[general]
|
||||
version=1
|
||||
RootSch=
|
||||
BoardNm=
|
||||
[pcbnew]
|
||||
version=1
|
||||
LastNetListRead=
|
||||
UseCmpFile=1
|
||||
PadDrill=0.600000000000
|
||||
PadDrillOvalY=0.600000000000
|
||||
PadSizeH=1.500000000000
|
||||
PadSizeV=1.500000000000
|
||||
PcbTextSizeV=1.500000000000
|
||||
PcbTextSizeH=1.500000000000
|
||||
PcbTextThickness=0.300000000000
|
||||
ModuleTextSizeV=1.000000000000
|
||||
ModuleTextSizeH=1.000000000000
|
||||
ModuleTextSizeThickness=0.150000000000
|
||||
SolderMaskClearance=0.000000000000
|
||||
SolderMaskMinWidth=0.000000000000
|
||||
DrawSegmentWidth=0.200000000000
|
||||
BoardOutlineThickness=0.100000000000
|
||||
ModuleOutlineThickness=0.150000000000
|
||||
[cvpcb]
|
||||
version=1
|
||||
NetIExt=net
|
||||
[schematic_editor]
|
||||
version=1
|
||||
PageLayoutDescrFile=
|
||||
PlotDirectoryName=
|
||||
SubpartIdSeparator=0
|
||||
SubpartFirstId=65
|
||||
NetFmtName=
|
||||
SpiceForceRefPrefix=0
|
||||
SpiceUseNetNumbers=0
|
||||
LabSize=60
|
||||
ERC_TestSimilarLabels=1
|
||||
[eeschema]
|
||||
version=1
|
||||
[eeschema/libraries]
|
||||
LibName1=sallen_key-rescue
|
||||
LibName2=power
|
||||
LibName3=device
|
||||
LibName4=transistors
|
||||
LibName5=conn
|
||||
LibName6=linear
|
||||
LibName7=regul
|
||||
LibName8=74xx
|
||||
LibName9=cmos4000
|
||||
LibName10=adc-dac
|
||||
LibName11=memory
|
||||
LibName12=xilinx
|
||||
LibName13=microcontrollers
|
||||
LibName14=dsp
|
||||
LibName15=microchip
|
||||
LibName16=analog_switches
|
||||
LibName17=motorola
|
||||
LibName18=texas
|
||||
LibName19=intel
|
||||
LibName20=audio
|
||||
LibName21=interface
|
||||
LibName22=digital-audio
|
||||
LibName23=philips
|
||||
LibName24=display
|
||||
LibName25=cypress
|
||||
LibName26=siliconi
|
||||
LibName27=opto
|
||||
LibName28=atmel
|
||||
LibName29=contrib
|
||||
LibName30=valves
|
|
@ -0,0 +1,278 @@
|
|||
EESchema Schematic File Version 2
|
||||
LIBS:sallen_key-rescue
|
||||
LIBS:power
|
||||
LIBS:device
|
||||
LIBS:transistors
|
||||
LIBS:conn
|
||||
LIBS:linear
|
||||
LIBS:regul
|
||||
LIBS:74xx
|
||||
LIBS:cmos4000
|
||||
LIBS:adc-dac
|
||||
LIBS:memory
|
||||
LIBS:xilinx
|
||||
LIBS:microcontrollers
|
||||
LIBS:dsp
|
||||
LIBS:microchip
|
||||
LIBS:analog_switches
|
||||
LIBS:motorola
|
||||
LIBS:texas
|
||||
LIBS:intel
|
||||
LIBS:audio
|
||||
LIBS:interface
|
||||
LIBS:digital-audio
|
||||
LIBS:philips
|
||||
LIBS:display
|
||||
LIBS:cypress
|
||||
LIBS:siliconi
|
||||
LIBS:opto
|
||||
LIBS:atmel
|
||||
LIBS:contrib
|
||||
LIBS:valves
|
||||
LIBS:sallen_key-cache
|
||||
EELAYER 25 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 1
|
||||
Title ""
|
||||
Date ""
|
||||
Rev ""
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 ""
|
||||
Comment4 ""
|
||||
$EndDescr
|
||||
$Comp
|
||||
L VSOURCE-RESCUE-sallen_key V1
|
||||
U 1 1 57336052
|
||||
P 6000 4700
|
||||
F 0 "V1" H 6128 4746 50 0000 L CNN
|
||||
F 1 "AC 1" H 6128 4655 50 0000 L CNN
|
||||
F 2 "" H 6000 4700 50 0000 C CNN
|
||||
F 3 "" H 6000 4700 50 0000 C CNN
|
||||
1 6000 4700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Label 8550 4400 0 60 ~ 0
|
||||
lowpass
|
||||
Text Notes 4300 5000 0 60 ~ 0
|
||||
.ac dec 10 1 1Meg\n
|
||||
$Comp
|
||||
L Generic_Opamp U1
|
||||
U 1 1 5788FF9F
|
||||
P 7850 4400
|
||||
F 0 "U1" H 8191 4446 50 0000 L CNN
|
||||
F 1 "AD8051" H 8191 4355 50 0000 L CNN
|
||||
F 2 "" H 7750 4300 50 0000 C CNN
|
||||
F 3 "" H 7850 4400 50 0000 C CNN
|
||||
F 4 "X" H 7850 4400 60 0001 C CNN "Spice_Primitive"
|
||||
F 5 "AD8051" H 7850 4400 60 0001 C CNN "Spice_Model"
|
||||
F 6 "ad8051.lib" H 7850 4400 60 0001 C CNN "Spice_Lib_File"
|
||||
F 7 "Y" H 7850 4400 60 0001 C CNN "Spice_Netlist_Enabled"
|
||||
1 7850 4400
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSOURCE-RESCUE-sallen_key V2
|
||||
U 1 1 578900BA
|
||||
P 9650 1850
|
||||
F 0 "V2" H 9778 1896 50 0000 L CNN
|
||||
F 1 "DC 10" H 9778 1805 50 0000 L CNN
|
||||
F 2 "" H 9650 1850 50 0000 C CNN
|
||||
F 3 "" H 9650 1850 50 0000 C CNN
|
||||
F 4 "Value" H 9650 1850 60 0001 C CNN "Fieldname"
|
||||
F 5 "V" H 9650 1850 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 9350 2050 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 9650 1850
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSOURCE-RESCUE-sallen_key V3
|
||||
U 1 1 57890232
|
||||
P 9650 2350
|
||||
F 0 "V3" H 9778 2396 50 0000 L CNN
|
||||
F 1 "DC 10" H 9778 2305 50 0000 L CNN
|
||||
F 2 "" H 9650 2350 50 0000 C CNN
|
||||
F 3 "" H 9650 2350 50 0000 C CNN
|
||||
F 4 "Value" H 9650 2350 60 0001 C CNN "Fieldname"
|
||||
F 5 "V" H 9650 2350 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 9350 2550 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 9650 2350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR5
|
||||
U 1 1 578902D2
|
||||
P 9400 2100
|
||||
F 0 "#PWR5" H 9400 1850 50 0001 C CNN
|
||||
F 1 "GND" H 9405 1927 50 0000 C CNN
|
||||
F 2 "" H 9400 2100 50 0000 C CNN
|
||||
F 3 "" H 9400 2100 50 0000 C CNN
|
||||
1 9400 2100
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VDD #PWR6
|
||||
U 1 1 578903C0
|
||||
P 9650 1600
|
||||
F 0 "#PWR6" H 9650 1450 50 0001 C CNN
|
||||
F 1 "VDD" H 9667 1773 50 0000 C CNN
|
||||
F 2 "" H 9650 1600 50 0000 C CNN
|
||||
F 3 "" H 9650 1600 50 0000 C CNN
|
||||
1 9650 1600
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSS #PWR7
|
||||
U 1 1 578903E2
|
||||
P 9650 2600
|
||||
F 0 "#PWR7" H 9650 2450 50 0001 C CNN
|
||||
F 1 "VSS" H 9668 2773 50 0000 C CNN
|
||||
F 2 "" H 9650 2600 50 0000 C CNN
|
||||
F 3 "" H 9650 2600 50 0000 C CNN
|
||||
1 9650 2600
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VDD #PWR3
|
||||
U 1 1 57890425
|
||||
P 7750 4100
|
||||
F 0 "#PWR3" H 7750 3950 50 0001 C CNN
|
||||
F 1 "VDD" H 7767 4273 50 0000 C CNN
|
||||
F 2 "" H 7750 4100 50 0000 C CNN
|
||||
F 3 "" H 7750 4100 50 0000 C CNN
|
||||
1 7750 4100
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VSS #PWR4
|
||||
U 1 1 57890453
|
||||
P 7750 4700
|
||||
F 0 "#PWR4" H 7750 4550 50 0001 C CNN
|
||||
F 1 "VSS" H 7768 4873 50 0000 C CNN
|
||||
F 2 "" H 7750 4700 50 0000 C CNN
|
||||
F 3 "" H 7750 4700 50 0000 C CNN
|
||||
1 7750 4700
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R2
|
||||
U 1 1 57890691
|
||||
P 6950 4300
|
||||
F 0 "R2" V 6743 4300 50 0000 C CNN
|
||||
F 1 "1k" V 6834 4300 50 0000 C CNN
|
||||
F 2 "" V 6880 4300 50 0000 C CNN
|
||||
F 3 "" H 6950 4300 50 0000 C CNN
|
||||
F 4 "Value" H 6950 4300 60 0001 C CNN "Fieldname"
|
||||
F 5 "1 2" H 6950 4300 60 0001 C CNN "SpiceMapping"
|
||||
F 6 "R" V 6950 4300 60 0001 C CNN "Spice_Primitive"
|
||||
1 6950 4300
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R1
|
||||
U 1 1 578906FF
|
||||
P 6400 4300
|
||||
F 0 "R1" V 6193 4300 50 0000 C CNN
|
||||
F 1 "1k" V 6284 4300 50 0000 C CNN
|
||||
F 2 "" V 6330 4300 50 0000 C CNN
|
||||
F 3 "" H 6400 4300 50 0000 C CNN
|
||||
F 4 "Value" H 6400 4300 60 0001 C CNN "Fieldname"
|
||||
F 5 "1 2" H 6400 4300 60 0001 C CNN "SpiceMapping"
|
||||
F 6 "R" V 6400 4300 60 0001 C CNN "Spice_Primitive"
|
||||
1 6400 4300
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C1
|
||||
U 1 1 5789077D
|
||||
P 7000 4950
|
||||
F 0 "C1" V 6748 4950 50 0000 C CNN
|
||||
F 1 "100n" V 6839 4950 50 0000 C CNN
|
||||
F 2 "" H 7038 4800 50 0000 C CNN
|
||||
F 3 "" H 7000 4950 50 0000 C CNN
|
||||
1 7000 4950
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C2
|
||||
U 1 1 5789085B
|
||||
P 7350 4000
|
||||
F 0 "C2" H 7465 4046 50 0000 L CNN
|
||||
F 1 "100n" H 7465 3955 50 0000 L CNN
|
||||
F 2 "" H 7388 3850 50 0000 C CNN
|
||||
F 3 "" H 7350 4000 50 0000 C CNN
|
||||
F 4 "Value" H 7350 4000 60 0001 C CNN "Fieldname"
|
||||
F 5 "C" H 7350 4000 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 7350 4000 60 0001 C CNN "SpiceMapping"
|
||||
1 7350 4000
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR2
|
||||
U 1 1 57890B95
|
||||
P 7350 3800
|
||||
F 0 "#PWR2" H 7350 3550 50 0001 C CNN
|
||||
F 1 "GND" H 7355 3627 50 0000 C CNN
|
||||
F 2 "" H 7350 3800 50 0000 C CNN
|
||||
F 3 "" H 7350 3800 50 0000 C CNN
|
||||
1 7350 3800
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
9650 2100 9400 2100
|
||||
Wire Wire Line
|
||||
8150 4400 8900 4400
|
||||
Wire Wire Line
|
||||
8350 4950 8350 4400
|
||||
Wire Wire Line
|
||||
7150 4950 8350 4950
|
||||
Wire Wire Line
|
||||
7400 4950 7400 4500
|
||||
Wire Wire Line
|
||||
7400 4500 7550 4500
|
||||
Wire Wire Line
|
||||
7100 4300 7550 4300
|
||||
Wire Wire Line
|
||||
6550 4300 6800 4300
|
||||
Wire Wire Line
|
||||
6850 4950 6650 4950
|
||||
Wire Wire Line
|
||||
6650 4950 6650 4300
|
||||
Connection ~ 6650 4300
|
||||
Wire Wire Line
|
||||
7400 4950 7450 4950
|
||||
Connection ~ 7400 4950
|
||||
Wire Wire Line
|
||||
7350 4150 7350 4300
|
||||
Connection ~ 7350 4300
|
||||
Wire Wire Line
|
||||
7350 3800 7350 3850
|
||||
Wire Wire Line
|
||||
6250 4300 6000 4300
|
||||
Wire Wire Line
|
||||
6000 4300 6000 4500
|
||||
Wire Wire Line
|
||||
6000 4900 6000 5000
|
||||
$Comp
|
||||
L GND #PWR1
|
||||
U 1 1 57890E7F
|
||||
P 6000 5000
|
||||
F 0 "#PWR1" H 6000 4750 50 0001 C CNN
|
||||
F 1 "GND" H 6005 4827 50 0000 C CNN
|
||||
F 2 "" H 6000 5000 50 0000 C CNN
|
||||
F 3 "" H 6000 5000 50 0000 C CNN
|
||||
1 6000 5000
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Connection ~ 8350 4400
|
||||
Wire Wire Line
|
||||
9650 2600 9650 2550
|
||||
Wire Wire Line
|
||||
9650 1600 9650 1650
|
||||
Wire Wire Line
|
||||
9650 2050 9650 2150
|
||||
Connection ~ 9650 2100
|
||||
$EndSCHEMATC
|
|
@ -194,6 +194,29 @@ set( EESCHEMA_COMMON_SRCS
|
|||
)
|
||||
|
||||
|
||||
if( KICAD_SPICE )
|
||||
set( EESCHEMA_SRCS
|
||||
${EESCHEMA_SRCS}
|
||||
sim/simulate.cpp
|
||||
sim/sim_plot_frame_base.cpp
|
||||
sim/sim_plot_frame.cpp
|
||||
sim/sim_plot_panel.cpp
|
||||
sim/spice_simulator.cpp
|
||||
sim/spice_value.cpp
|
||||
sim/ngspice.cpp
|
||||
sim/netlist_exporter_pspice_sim.cpp
|
||||
dialogs/dialog_signal_list.cpp
|
||||
dialogs/dialog_signal_list_base.cpp
|
||||
dialogs/dialog_sim_settings.cpp
|
||||
dialogs/dialog_sim_settings_base.cpp
|
||||
dialogs/dialog_spice_model.cpp
|
||||
dialogs/dialog_spice_model_base.cpp
|
||||
widgets/tuner_slider.cpp
|
||||
widgets/tuner_slider_base.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
if( MINGW )
|
||||
# EESCHEMA_RESOURCES variable is set by the macro.
|
||||
mingw_resource_compiler( eeschema )
|
||||
|
|
|
@ -885,7 +885,7 @@ bool LIB_PART::Load( LINE_READER& aLineReader, wxString& aErrorMsg )
|
|||
{
|
||||
p = strtok( line, " \t\n" );
|
||||
|
||||
if( p && stricmp( p, "ENDDEF" ) == 0 )
|
||||
if( p && strcasecmp( p, "ENDDEF" ) == 0 )
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1143,7 +1143,7 @@ bool LIB_PART::LoadFootprints( LINE_READER& aLineReader, wxString& aErrorMsg )
|
|||
|
||||
p = strtok( line, " \t\r\n" );
|
||||
|
||||
if( stricmp( p, "$ENDFPLIST" ) == 0 )
|
||||
if( strcasecmp( p, "$ENDFPLIST" ) == 0 )
|
||||
break;
|
||||
|
||||
m_FootprintList.Add( FROM_UTF8( p ) );
|
||||
|
|
|
@ -458,7 +458,7 @@ bool PART_LIB::Load( wxString& aErrorMsg )
|
|||
{
|
||||
char * line = reader.Line();
|
||||
|
||||
if( type == LIBRARY_TYPE_EESCHEMA && strnicmp( line, "$HEADER", 7 ) == 0 )
|
||||
if( type == LIBRARY_TYPE_EESCHEMA && strncasecmp( line, "$HEADER", 7 ) == 0 )
|
||||
{
|
||||
if( !LoadHeader( reader ) )
|
||||
{
|
||||
|
@ -471,7 +471,7 @@ bool PART_LIB::Load( wxString& aErrorMsg )
|
|||
|
||||
wxString msg;
|
||||
|
||||
if( strnicmp( line, "DEF", 3 ) == 0 )
|
||||
if( strncasecmp( line, "DEF", 3 ) == 0 )
|
||||
{
|
||||
// Read one DEF/ENDDEF part entry from library:
|
||||
LIB_PART* part = new LIB_PART( wxEmptyString, this );
|
||||
|
@ -536,10 +536,10 @@ bool PART_LIB::LoadHeader( LINE_READER& aLineReader )
|
|||
text = strtok( line, " \t\r\n" );
|
||||
data = strtok( NULL, " \t\r\n" );
|
||||
|
||||
if( stricmp( text, "TimeStamp" ) == 0 )
|
||||
if( strcasecmp( text, "TimeStamp" ) == 0 )
|
||||
timeStamp = atol( data );
|
||||
|
||||
if( stricmp( text, "$ENDHEADER" ) == 0 )
|
||||
if( strcasecmp( text, "$ENDHEADER" ) == 0 )
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -574,7 +574,7 @@ bool PART_LIB::LoadDocs( wxString& aErrorMsg )
|
|||
return false;
|
||||
}
|
||||
|
||||
if( strnicmp( line, DOCFILE_IDENT, 10 ) != 0 )
|
||||
if( strncasecmp( line, DOCFILE_IDENT, 10 ) != 0 )
|
||||
{
|
||||
aErrorMsg.Printf( _( "File '%s' is not a valid component library document file." ),
|
||||
GetChars( fn.GetFullPath() ) );
|
||||
|
|
|
@ -46,6 +46,10 @@
|
|||
#include <sch_validators.h>
|
||||
|
||||
#include <dialog_edit_component_in_schematic_fbp.h>
|
||||
#ifdef KICAD_SPICE
|
||||
#include <dialog_spice_model.h>
|
||||
#include <netlist_exporter_pspice.h>
|
||||
#endif /* KICAD_SPICE */
|
||||
|
||||
|
||||
/**
|
||||
|
@ -126,7 +130,7 @@ private:
|
|||
void showButtonHandler( wxCommandEvent& event );
|
||||
void OnTestChipName( wxCommandEvent& event );
|
||||
void OnSelectChipName( wxCommandEvent& event );
|
||||
void OnInitDlg( wxInitDialogEvent& event )
|
||||
void OnInitDlg( wxInitDialogEvent& event )
|
||||
{
|
||||
TransferDataToWindow();
|
||||
|
||||
|
@ -134,6 +138,8 @@ private:
|
|||
FinishDialogSettings();
|
||||
}
|
||||
|
||||
void EditSpiceModel( wxCommandEvent& event ) override;
|
||||
|
||||
SCH_FIELD* findField( const wxString& aFieldName );
|
||||
|
||||
/**
|
||||
|
@ -141,7 +147,7 @@ private:
|
|||
* update the listbox showing fields, according to the fields texts
|
||||
* must be called after a text change in fields, if this change is not an edition
|
||||
*/
|
||||
void updateDisplay( )
|
||||
void updateDisplay()
|
||||
{
|
||||
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
|
||||
setRowItem( ii, m_FieldsBuf[ii] );
|
||||
|
@ -187,6 +193,10 @@ void SCH_EDIT_FRAME::EditComponent( SCH_COMPONENT* aComponent )
|
|||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow* aParent ) :
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( aParent )
|
||||
{
|
||||
#ifndef KICAD_SPICE
|
||||
spiceFieldsButton->Hide();
|
||||
#endif /* not KICAD_SPICE */
|
||||
|
||||
m_parent = (SCH_EDIT_FRAME*) aParent;
|
||||
|
||||
m_cmp = NULL;
|
||||
|
@ -284,6 +294,18 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnSelectChipName( wxCommandEvent& event
|
|||
}
|
||||
|
||||
|
||||
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::EditSpiceModel( wxCommandEvent& event )
|
||||
{
|
||||
#ifdef KICAD_SPICE
|
||||
setSelectedFieldNdx( 0 );
|
||||
DIALOG_SPICE_MODEL dialog( this, *m_cmp, m_FieldsBuf );
|
||||
|
||||
if( dialog.ShowModal() == wxID_OK )
|
||||
updateDisplay();
|
||||
#endif /* KICAD_SPICE */
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnListItemSelected( wxListEvent& event )
|
||||
{
|
||||
DBG( printf( "OnListItemSelected()\n" ); )
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version May 21 2016)
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -12,287 +12,290 @@
|
|||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( 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* mainSizer;
|
||||
mainSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
wxBoxSizer* upperSizer;
|
||||
upperSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
wxStaticBoxSizer* optionsSizer;
|
||||
optionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Component") ), wxVERTICAL );
|
||||
|
||||
|
||||
m_staticTextUnit = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextUnit->Wrap( -1 );
|
||||
optionsSizer->Add( m_staticTextUnit, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
wxArrayString unitChoiceChoices;
|
||||
unitChoice = new wxChoice( optionsSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, unitChoiceChoices, 0 );
|
||||
unitChoice->SetSelection( 0 );
|
||||
optionsSizer->Add( unitChoice, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
wxBoxSizer* bSizerUnitsInterchangeable;
|
||||
bSizerUnitsInterchangeable = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
unitsInterchageableText = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Units are interchangeable:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
unitsInterchageableText->Wrap( -1 );
|
||||
bSizerUnitsInterchangeable->Add( unitsInterchageableText, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
|
||||
|
||||
|
||||
unitsInterchageableLabel = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Yes"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
unitsInterchageableLabel->Wrap( -1 );
|
||||
bSizerUnitsInterchangeable->Add( unitsInterchageableLabel, 0, wxALL, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
optionsSizer->Add( bSizerUnitsInterchangeable, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
wxString orientationRadioBoxChoices[] = { _("0"), _("+90"), _("180"), _("-90") };
|
||||
int orientationRadioBoxNChoices = sizeof( orientationRadioBoxChoices ) / sizeof( wxString );
|
||||
orientationRadioBox = new wxRadioBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Orientation (Degrees)"), wxDefaultPosition, wxDefaultSize, orientationRadioBoxNChoices, orientationRadioBoxChoices, 1, wxRA_SPECIFY_COLS );
|
||||
orientationRadioBox->SetSelection( 0 );
|
||||
orientationRadioBox->SetToolTip( _("Select if the component is to be rotated when drawn") );
|
||||
|
||||
|
||||
optionsSizer->Add( orientationRadioBox, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
wxString mirrorRadioBoxChoices[] = { _("Normal"), _("Mirror ---"), _("Mirror |") };
|
||||
int mirrorRadioBoxNChoices = sizeof( mirrorRadioBoxChoices ) / sizeof( wxString );
|
||||
mirrorRadioBox = new wxRadioBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Mirror"), wxDefaultPosition, wxDefaultSize, mirrorRadioBoxNChoices, mirrorRadioBoxChoices, 1, wxRA_SPECIFY_COLS );
|
||||
mirrorRadioBox->SetSelection( 0 );
|
||||
mirrorRadioBox->SetToolTip( _("Pick the graphical transformation to be used when displaying the component, if any") );
|
||||
|
||||
|
||||
optionsSizer->Add( mirrorRadioBox, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
convertCheckBox = new wxCheckBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Converted Shape"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
convertCheckBox->SetToolTip( _("Use the alternate shape of this component.\nFor gates, this is the \"De Morgan\" conversion") );
|
||||
|
||||
|
||||
optionsSizer->Add( convertCheckBox, 0, wxALL, 5 );
|
||||
|
||||
|
||||
wxStaticBoxSizer* sbSizerChipName;
|
||||
sbSizerChipName = new wxStaticBoxSizer( new wxStaticBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Chip Name") ), wxVERTICAL );
|
||||
|
||||
|
||||
chipnameTextCtrl = new wxTextCtrl( sbSizerChipName->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
chipnameTextCtrl->SetToolTip( _("The name of the symbol in the library from which this component came") );
|
||||
|
||||
|
||||
sbSizerChipName->Add( chipnameTextCtrl, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
wxBoxSizer* bSizerChpinameButt;
|
||||
bSizerChpinameButt = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
m_buttonTestChipName = new wxButton( sbSizerChipName->GetStaticBox(), wxID_ANY, _("Test"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerChpinameButt->Add( m_buttonTestChipName, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
|
||||
m_buttonSelectChipName = new wxButton( sbSizerChipName->GetStaticBox(), wxID_ANY, _("Select"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerChpinameButt->Add( m_buttonSelectChipName, 0, wxTOP|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
sbSizerChipName->Add( bSizerChpinameButt, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
optionsSizer->Add( sbSizerChipName, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
m_staticTextTimeStamp = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Timestamp"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextTimeStamp->Wrap( -1 );
|
||||
optionsSizer->Add( m_staticTextTimeStamp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_textCtrlTimeStamp = new wxTextCtrl( optionsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
|
||||
m_textCtrlTimeStamp->SetToolTip( _("An unique ID (a time stamp) to identify the component.\nThis is an alternate identifier to the reference.") );
|
||||
|
||||
|
||||
optionsSizer->Add( m_textCtrlTimeStamp, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_staticline1 = new wxStaticLine( optionsSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
optionsSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
|
||||
|
||||
spiceFieldsButton = new wxButton( optionsSizer->GetStaticBox(), wxID_ANY, _("Edit Spice model"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
optionsSizer->Add( spiceFieldsButton, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
defaultsButton = new wxButton( optionsSizer->GetStaticBox(), wxID_ANY, _("Reset to Library Defaults"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
defaultsButton->SetToolTip( _("Set position and style of fields and component orientation to default lib value.\nFields texts are not modified.") );
|
||||
|
||||
|
||||
optionsSizer->Add( defaultsButton, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
upperSizer->Add( optionsSizer, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
wxStaticBoxSizer* fieldsSizer;
|
||||
fieldsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Fields") ), wxHORIZONTAL );
|
||||
|
||||
|
||||
wxStaticBoxSizer* gridStaticBoxSizer;
|
||||
gridStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString ), wxVERTICAL );
|
||||
|
||||
|
||||
fieldListCtrl = new wxListCtrl( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_VRULES );
|
||||
fieldListCtrl->SetMinSize( wxSize( 220,-1 ) );
|
||||
|
||||
|
||||
gridStaticBoxSizer->Add( fieldListCtrl, 1, wxALL|wxEXPAND, 8 );
|
||||
|
||||
|
||||
addFieldButton = new wxButton( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, _("Add Field"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
addFieldButton->SetToolTip( _("Add a new custom field") );
|
||||
|
||||
|
||||
gridStaticBoxSizer->Add( addFieldButton, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
deleteFieldButton = new wxButton( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, _("Delete Field"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
deleteFieldButton->SetToolTip( _("Delete one of the optional fields") );
|
||||
|
||||
|
||||
gridStaticBoxSizer->Add( deleteFieldButton, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
moveUpButton = new wxButton( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, _("Move Up"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
moveUpButton->SetToolTip( _("Move the selected optional fields up one position") );
|
||||
|
||||
|
||||
gridStaticBoxSizer->Add( moveUpButton, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
fieldsSizer->Add( gridStaticBoxSizer, 3, wxEXPAND|wxRIGHT|wxLEFT, 8 );
|
||||
|
||||
|
||||
wxBoxSizer* fieldEditBoxSizer;
|
||||
fieldEditBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
wxBoxSizer* bSizerJustification;
|
||||
bSizerJustification = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
wxString m_FieldHJustifyCtrlChoices[] = { _("Left"), _("Center"), _("Right") };
|
||||
int m_FieldHJustifyCtrlNChoices = sizeof( m_FieldHJustifyCtrlChoices ) / sizeof( wxString );
|
||||
m_FieldHJustifyCtrl = new wxRadioBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Horiz. Justify"), wxDefaultPosition, wxDefaultSize, m_FieldHJustifyCtrlNChoices, m_FieldHJustifyCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_FieldHJustifyCtrl->SetSelection( 2 );
|
||||
bSizerJustification->Add( m_FieldHJustifyCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
||||
|
||||
|
||||
wxString m_FieldVJustifyCtrlChoices[] = { _("Bottom"), _("Center"), _("Top") };
|
||||
int m_FieldVJustifyCtrlNChoices = sizeof( m_FieldVJustifyCtrlChoices ) / sizeof( wxString );
|
||||
m_FieldVJustifyCtrl = new wxRadioBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Vert. Justify"), wxDefaultPosition, wxDefaultSize, m_FieldVJustifyCtrlNChoices, m_FieldVJustifyCtrlChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_FieldVJustifyCtrl->SetSelection( 2 );
|
||||
bSizerJustification->Add( m_FieldVJustifyCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
fieldEditBoxSizer->Add( bSizerJustification, 1, wxEXPAND|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
wxBoxSizer* bSizerStyle;
|
||||
bSizerStyle = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
wxStaticBoxSizer* visibilitySizer;
|
||||
visibilitySizer = new wxStaticBoxSizer( new wxStaticBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Visibility") ), wxVERTICAL );
|
||||
|
||||
|
||||
showCheckBox = new wxCheckBox( visibilitySizer->GetStaticBox(), wxID_ANY, _("Show"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
showCheckBox->SetToolTip( _("Check if you want this field visible") );
|
||||
|
||||
|
||||
visibilitySizer->Add( showCheckBox, 0, wxALL, 5 );
|
||||
|
||||
|
||||
rotateCheckBox = new wxCheckBox( visibilitySizer->GetStaticBox(), wxID_ANY, _("Rotate"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
rotateCheckBox->SetToolTip( _("Check if you want this field's text rotated 90 degrees") );
|
||||
|
||||
|
||||
visibilitySizer->Add( rotateCheckBox, 0, wxALL, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
bSizerStyle->Add( visibilitySizer, 1, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
wxString m_StyleRadioBoxChoices[] = { _("Normal"), _("Italic"), _("Bold"), _("Bold Italic") };
|
||||
int m_StyleRadioBoxNChoices = sizeof( m_StyleRadioBoxChoices ) / sizeof( wxString );
|
||||
m_StyleRadioBox = new wxRadioBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, m_StyleRadioBoxNChoices, m_StyleRadioBoxChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_StyleRadioBox->SetSelection( 3 );
|
||||
m_StyleRadioBox->SetToolTip( _("The style of the currently selected field's text in the schematic") );
|
||||
|
||||
|
||||
bSizerStyle->Add( m_StyleRadioBox, 1, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
fieldEditBoxSizer->Add( bSizerStyle, 1, wxEXPAND|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
wxBoxSizer* fieldNameBoxSizer;
|
||||
fieldNameBoxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
fieldNameLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("Field Name"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fieldNameLabel->Wrap( -1 );
|
||||
fieldNameBoxSizer->Add( fieldNameLabel, 0, wxTOP, 5 );
|
||||
|
||||
|
||||
fieldNameTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fieldNameTextCtrl->SetToolTip( _("The name of the currently selected field\nSome fixed fields names are not editable") );
|
||||
|
||||
|
||||
fieldNameBoxSizer->Add( fieldNameTextCtrl, 0, wxBOTTOM|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fieldValueLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("Field Value"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fieldValueLabel->Wrap( -1 );
|
||||
fieldNameBoxSizer->Add( fieldValueLabel, 0, wxALIGN_TOP|wxTOP, 5 );
|
||||
|
||||
|
||||
fieldValueTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fieldValueTextCtrl->SetToolTip( _("The name of the currently selected field\nSome fixed fields names are not editable") );
|
||||
|
||||
|
||||
fieldNameBoxSizer->Add( fieldValueTextCtrl, 0, wxEXPAND|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
m_show_datasheet_button = new wxButton( fieldsSizer->GetStaticBox(), wxID_ANY, _("Show in Browser"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_show_datasheet_button->SetToolTip( _("If your datasheet is an http:// link or a complete file path, then it may show in your browser by pressing this button.") );
|
||||
|
||||
|
||||
fieldNameBoxSizer->Add( m_show_datasheet_button, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
fieldEditBoxSizer->Add( fieldNameBoxSizer, 0, wxBOTTOM|wxEXPAND, 5 );
|
||||
|
||||
|
||||
wxFlexGridSizer* fgSizerPosSize;
|
||||
fgSizerPosSize = new wxFlexGridSizer( 3, 3, 0, 0 );
|
||||
fgSizerPosSize->AddGrowableCol( 1 );
|
||||
fgSizerPosSize->SetFlexibleDirection( wxBOTH );
|
||||
fgSizerPosSize->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
|
||||
textSizeLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("Size"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
textSizeLabel->Wrap( -1 );
|
||||
fgSizerPosSize->Add( textSizeLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
textSizeTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
textSizeTextCtrl->SetToolTip( _("The size of the currently selected field's text in the schematic") );
|
||||
|
||||
|
||||
fgSizerPosSize->Add( textSizeTextCtrl, 0, wxEXPAND|wxBOTTOM, 5 );
|
||||
|
||||
|
||||
m_staticTextUnitSize = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextUnitSize->Wrap( -1 );
|
||||
fgSizerPosSize->Add( m_staticTextUnitSize, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
posXLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("PosX"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
posXLabel->Wrap( -1 );
|
||||
fgSizerPosSize->Add( posXLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
posXTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
posXTextCtrl->SetToolTip( _("The X coordinate of the text relative to the component") );
|
||||
|
||||
|
||||
fgSizerPosSize->Add( posXTextCtrl, 0, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
|
||||
m_staticTextUnitPosX = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextUnitPosX->Wrap( -1 );
|
||||
fgSizerPosSize->Add( m_staticTextUnitPosX, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
posYLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("PosY"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
posYLabel->Wrap( -1 );
|
||||
fgSizerPosSize->Add( posYLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
posYTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
posYTextCtrl->SetToolTip( _("The Y coordinate of the text relative to the component") );
|
||||
|
||||
|
||||
fgSizerPosSize->Add( posYTextCtrl, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_staticTextUnitPosY = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextUnitPosY->Wrap( -1 );
|
||||
fgSizerPosSize->Add( m_staticTextUnitPosY, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
fieldEditBoxSizer->Add( fgSizerPosSize, 1, wxEXPAND|wxTOP, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
fieldsSizer->Add( fieldEditBoxSizer, 2, wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
upperSizer->Add( fieldsSizer, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
mainSizer->Add( upperSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
stdDialogButtonSizer = new wxStdDialogButtonSizer();
|
||||
stdDialogButtonSizerOK = new wxButton( this, wxID_OK );
|
||||
stdDialogButtonSizer->AddButton( stdDialogButtonSizerOK );
|
||||
stdDialogButtonSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
stdDialogButtonSizer->AddButton( stdDialogButtonSizerCancel );
|
||||
stdDialogButtonSizer->Realize();
|
||||
|
||||
|
||||
mainSizer->Add( stdDialogButtonSizer, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
this->SetSizer( mainSizer );
|
||||
this->Layout();
|
||||
|
||||
|
||||
// Connect Events
|
||||
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnCloseDialog ) );
|
||||
this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnInitDlg ) );
|
||||
m_buttonTestChipName->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnTestChipName ), NULL, this );
|
||||
m_buttonSelectChipName->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnSelectChipName ), NULL, this );
|
||||
spiceFieldsButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::EditSpiceModel ), NULL, this );
|
||||
defaultsButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::SetInitCmp ), NULL, this );
|
||||
fieldListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemDeselected ), NULL, this );
|
||||
fieldListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemSelected ), NULL, this );
|
||||
|
@ -311,6 +314,7 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP(
|
|||
this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnInitDlg ) );
|
||||
m_buttonTestChipName->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnTestChipName ), NULL, this );
|
||||
m_buttonSelectChipName->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnSelectChipName ), NULL, this );
|
||||
spiceFieldsButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::EditSpiceModel ), NULL, this );
|
||||
defaultsButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::SetInitCmp ), NULL, this );
|
||||
fieldListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemDeselected ), NULL, this );
|
||||
fieldListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemSelected ), NULL, this );
|
||||
|
@ -320,5 +324,5 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP(
|
|||
m_show_datasheet_button->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::showButtonHandler ), NULL, this );
|
||||
stdDialogButtonSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnCancelButtonClick ), NULL, this );
|
||||
stdDialogButtonSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnOKButtonClick ), NULL, this );
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<property name="minimum_size"></property>
|
||||
<property name="name">DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">688,586</property>
|
||||
<property name="size">928,741</property>
|
||||
<property name="style">wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU</property>
|
||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||
<property name="title">Component Properties</property>
|
||||
|
@ -286,11 +286,11 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerUnitsInterchangeable</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
|
@ -378,11 +378,11 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<object class="wxStaticText" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
|
@ -731,11 +731,11 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<object class="wxStaticBoxSizer" expanded="0">
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Chip Name</property>
|
||||
<property name="minimum_size"></property>
|
||||
|
@ -835,20 +835,20 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerChpinameButt</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<object class="wxButton" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
|
@ -932,11 +932,11 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxTOP|wxBOTTOM</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<object class="wxButton" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
|
@ -1024,11 +1024,11 @@
|
|||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<object class="wxStaticText" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
|
@ -1107,11 +1107,11 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="1">
|
||||
<object class="wxTextCtrl" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
|
@ -1198,11 +1198,11 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND | wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticLine" expanded="1">
|
||||
<object class="wxStaticLine" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
|
@ -1279,6 +1279,94 @@
|
|||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Edit Spice model</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">spiceFieldsButton</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">EditSpiceModel</event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
|
@ -1386,7 +1474,7 @@
|
|||
<property name="border">8</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">3</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<object class="wxStaticBoxSizer" expanded="0">
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label"></property>
|
||||
<property name="minimum_size"></property>
|
||||
|
@ -1770,16 +1858,16 @@
|
|||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">2</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">fieldEditBoxSizer</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerJustification</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
|
@ -1966,20 +2054,20 @@
|
|||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerStyle</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<object class="wxStaticBoxSizer" expanded="0">
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Visibility</property>
|
||||
<property name="minimum_size"></property>
|
||||
|
@ -2258,11 +2346,11 @@
|
|||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">fieldNameBoxSizer</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version May 21 2016)
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -40,7 +40,7 @@ class DIALOG_SHIM;
|
|||
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
|
||||
protected:
|
||||
wxStaticText* m_staticTextUnit;
|
||||
wxChoice* unitChoice;
|
||||
|
@ -55,6 +55,7 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
|
|||
wxStaticText* m_staticTextTimeStamp;
|
||||
wxTextCtrl* m_textCtrlTimeStamp;
|
||||
wxStaticLine* m_staticline1;
|
||||
wxButton* spiceFieldsButton;
|
||||
wxButton* defaultsButton;
|
||||
wxListCtrl* fieldListCtrl;
|
||||
wxButton* addFieldButton;
|
||||
|
@ -82,12 +83,13 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
|
|||
wxStdDialogButtonSizer* stdDialogButtonSizer;
|
||||
wxButton* stdDialogButtonSizerOK;
|
||||
wxButton* stdDialogButtonSizerCancel;
|
||||
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnCloseDialog( wxCloseEvent& event ) { event.Skip(); }
|
||||
virtual void OnInitDlg( wxInitDialogEvent& event ) { event.Skip(); }
|
||||
virtual void OnTestChipName( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnSelectChipName( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void EditSpiceModel( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void SetInitCmp( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnListItemDeselected( wxListEvent& event ) { event.Skip(); }
|
||||
virtual void OnListItemSelected( wxListEvent& event ) { event.Skip(); }
|
||||
|
@ -97,13 +99,13 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
|
|||
virtual void showButtonHandler( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnCancelButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Component Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 688,586 ), long style = wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU );
|
||||
|
||||
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Component Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 928,741 ), long style = wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU );
|
||||
~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP();
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP_H__
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version May 6 2016)
|
||||
// C++ code generated with wxFormBuilder (version Jun 21 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -35,7 +35,7 @@ DIALOG_LIB_EDIT_TEXT_BASE::DIALOG_LIB_EDIT_TEXT_BASE( wxWindow* parent, wxWindow
|
|||
m_TextValue = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_TextValue->SetMinSize( wxSize( 200,-1 ) );
|
||||
|
||||
bTextValueOptsSizer->Add( m_TextValue, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 );
|
||||
bTextValueOptsSizer->Add( m_TextValue, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_TextValueSelectButton = new wxButton( this, wxID_ANY, _("Select"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bTextValueOptsSizer->Add( m_TextValueSelectButton, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
@ -54,7 +54,7 @@ DIALOG_LIB_EDIT_TEXT_BASE::DIALOG_LIB_EDIT_TEXT_BASE( wxWindow* parent, wxWindow
|
|||
bTextSizeSizer->Add( m_TextSizeText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_TextSize = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bTextSizeSizer->Add( m_TextSize, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP, 5 );
|
||||
bTextSizeSizer->Add( m_TextSize, 0, wxBOTTOM|wxLEFT|wxRIGHT|wxTOP, 5 );
|
||||
|
||||
|
||||
bUpperBoxSizer->Add( bTextSizeSizer, 0, wxEXPAND, 5 );
|
||||
|
|
|
@ -214,7 +214,7 @@
|
|||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxTextCtrl" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -489,7 +489,7 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP</property>
|
||||
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT|wxTOP</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
|
@ -684,6 +684,7 @@
|
|||
<property name="minimum_size"></property>
|
||||
<property name="name">sOptionsSizer</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="parent">1</property>
|
||||
<property name="permission">none</property>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version May 6 2016)
|
||||
// C++ code generated with wxFormBuilder (version Jun 21 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include <wildcards_and_files_ext.h>
|
||||
#include <wildcards_and_files_ext.h>
|
||||
#include <invoke_sch_dialog.h>
|
||||
#include <netlist_exporters/netlist_exporter_pspice.h>
|
||||
|
||||
#include <eeschema_id.h>
|
||||
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "dialog_signal_list.h"
|
||||
#include <sim/sim_plot_frame.h>
|
||||
|
||||
#include <sim/netlist_exporter_pspice_sim.h>
|
||||
|
||||
DIALOG_SIGNAL_LIST::DIALOG_SIGNAL_LIST( SIM_PLOT_FRAME* aParent, NETLIST_EXPORTER_PSPICE_SIM* aExporter )
|
||||
: DIALOG_SIGNAL_LIST_BASE( aParent ), m_plotFrame( aParent ), m_exporter( aExporter )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SIGNAL_LIST::TransferDataFromWindow()
|
||||
{
|
||||
if( !DIALOG_SIGNAL_LIST_BASE::TransferDataFromWindow() )
|
||||
return false;
|
||||
|
||||
addSelectionToPlotFrame();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SIGNAL_LIST::TransferDataToWindow()
|
||||
{
|
||||
// Create a list of possible signals
|
||||
/// @todo it could include separated mag & phase for AC analysis
|
||||
if( m_exporter )
|
||||
{
|
||||
// Voltage list
|
||||
for( const auto& net : m_exporter->GetNetIndexMap() )
|
||||
{
|
||||
if( net.first != "GND" )
|
||||
m_signals->Append( wxString::Format( "V(%s)", net.first ) );
|
||||
}
|
||||
|
||||
// For some reason, it is not possible to plot currents in any but transient analysis
|
||||
if( m_exporter->GetSimType() == ST_TRANSIENT )
|
||||
{
|
||||
for( const auto& item : m_exporter->GetSpiceItems() )
|
||||
{
|
||||
// Add all possible currents for the primitive
|
||||
for( const auto& current :
|
||||
NETLIST_EXPORTER_PSPICE_SIM::GetCurrents( (SPICE_PRIMITIVE) item.m_primitive ) )
|
||||
{
|
||||
m_signals->Append( wxString::Format( "%s(%s)", current, item.m_refName ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return DIALOG_SIGNAL_LIST_BASE::TransferDataToWindow();
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SIGNAL_LIST::addSelectionToPlotFrame()
|
||||
{
|
||||
for( unsigned int i = 0; i < m_signals->GetCount(); ++i )
|
||||
{
|
||||
if( m_signals->IsSelected( i ) )
|
||||
{
|
||||
const wxString& plotName = m_signals->GetString( i );
|
||||
|
||||
// Get the part in the parentheses
|
||||
wxString name = plotName.AfterFirst( '(' ).BeforeLast( ')' );
|
||||
|
||||
if( plotName[0] == 'V' )
|
||||
{
|
||||
m_plotFrame->AddVoltagePlot( name );
|
||||
}
|
||||
else if( plotName[0] == 'I' )
|
||||
{
|
||||
m_plotFrame->AddCurrentPlot( name, plotName.BeforeFirst( '(' ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxASSERT_MSG( false, "Unhandled plot type" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef DIALOG_SIGNAL_LIST_H
|
||||
#define DIALOG_SIGNAL_LIST_H
|
||||
|
||||
#include "dialog_signal_list_base.h"
|
||||
|
||||
class SIM_PLOT_FRAME;
|
||||
class NETLIST_EXPORTER_PSPICE_SIM;
|
||||
|
||||
class DIALOG_SIGNAL_LIST : public DIALOG_SIGNAL_LIST_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_SIGNAL_LIST( SIM_PLOT_FRAME* aParent, NETLIST_EXPORTER_PSPICE_SIM* aExporter );
|
||||
|
||||
bool TransferDataFromWindow() override;
|
||||
bool TransferDataToWindow() override;
|
||||
|
||||
private:
|
||||
void onSignalAdd( wxCommandEvent& event ) override
|
||||
{
|
||||
addSelectionToPlotFrame();
|
||||
}
|
||||
|
||||
void addSelectionToPlotFrame();
|
||||
|
||||
SIM_PLOT_FRAME* m_plotFrame;
|
||||
NETLIST_EXPORTER_PSPICE_SIM* m_exporter;
|
||||
};
|
||||
|
||||
#endif /* DIALOG_SIGNAL_LIST_H */
|
|
@ -0,0 +1,46 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_signal_list_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_SIGNAL_LIST_BASE::DIALOG_SIGNAL_LIST_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bSizer6;
|
||||
bSizer6 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_signals = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT );
|
||||
bSizer6->Add( m_signals, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||
m_sdbSizer->Realize();
|
||||
|
||||
bSizer6->Add( m_sdbSizer, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizer6 );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
m_signals->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( DIALOG_SIGNAL_LIST_BASE::onSignalAdd ), NULL, this );
|
||||
}
|
||||
|
||||
DIALOG_SIGNAL_LIST_BASE::~DIALOG_SIGNAL_LIST_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_signals->Disconnect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( DIALOG_SIGNAL_LIST_BASE::onSignalAdd ), NULL, this );
|
||||
|
||||
}
|
|
@ -0,0 +1,213 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="13" />
|
||||
<object class="Project" expanded="1">
|
||||
<property name="class_decoration"></property>
|
||||
<property name="code_generation">C++</property>
|
||||
<property name="disconnect_events">1</property>
|
||||
<property name="disconnect_mode">source_name</property>
|
||||
<property name="disconnect_php_events">0</property>
|
||||
<property name="disconnect_python_events">0</property>
|
||||
<property name="embedded_files_path">res</property>
|
||||
<property name="encoding">UTF-8</property>
|
||||
<property name="event_generation">connect</property>
|
||||
<property name="file">dialog_signal_list_base</property>
|
||||
<property name="first_id">1000</property>
|
||||
<property name="help_provider">none</property>
|
||||
<property name="internationalize">1</property>
|
||||
<property name="name">DIALOG_SIGNAL_LIST_BASE</property>
|
||||
<property name="namespace"></property>
|
||||
<property name="path">.</property>
|
||||
<property name="precompiled_header"></property>
|
||||
<property name="relative_path">1</property>
|
||||
<property name="skip_lua_events">1</property>
|
||||
<property name="skip_php_events">1</property>
|
||||
<property name="skip_python_events">1</property>
|
||||
<property name="ui_table">UI</property>
|
||||
<property name="use_enum">0</property>
|
||||
<property name="use_microsoft_bom">0</property>
|
||||
<object class="Dialog" expanded="1">
|
||||
<property name="aui_managed">0</property>
|
||||
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
|
||||
<property name="bg"></property>
|
||||
<property name="center">wxBOTH</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="event_handler">impl_virtual</property>
|
||||
<property name="extra_style"></property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">DIALOG_SIGNAL_LIST_BASE</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">424,535</property>
|
||||
<property name="style">wxDEFAULT_DIALOG_STYLE</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="title"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnActivate"></event>
|
||||
<event name="OnActivateApp"></event>
|
||||
<event name="OnAuiFindManager"></event>
|
||||
<event name="OnAuiPaneButton"></event>
|
||||
<event name="OnAuiPaneClose"></event>
|
||||
<event name="OnAuiPaneMaximize"></event>
|
||||
<event name="OnAuiPaneRestore"></event>
|
||||
<event name="OnAuiRender"></event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnClose"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnHibernate"></event>
|
||||
<event name="OnIconize"></event>
|
||||
<event name="OnIdle"></event>
|
||||
<event name="OnInitDialog"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer6</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxListBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="choices"></property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_signals</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnListBox"></event>
|
||||
<event name="OnListBoxDClick">onSignalAdd</event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStdDialogButtonSizer" expanded="1">
|
||||
<property name="Apply">0</property>
|
||||
<property name="Cancel">1</property>
|
||||
<property name="ContextHelp">0</property>
|
||||
<property name="Help">0</property>
|
||||
<property name="No">0</property>
|
||||
<property name="OK">1</property>
|
||||
<property name="Save">0</property>
|
||||
<property name="Yes">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_sdbSizer</property>
|
||||
<property name="permission">protected</property>
|
||||
<event name="OnApplyButtonClick"></event>
|
||||
<event name="OnCancelButtonClick"></event>
|
||||
<event name="OnContextHelpButtonClick"></event>
|
||||
<event name="OnHelpButtonClick"></event>
|
||||
<event name="OnNoButtonClick"></event>
|
||||
<event name="OnOKButtonClick"></event>
|
||||
<event name="OnSaveButtonClick"></event>
|
||||
<event name="OnYesButtonClick"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</wxFormBuilder_Project>
|
|
@ -0,0 +1,51 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DIALOG_SIGNAL_LIST_BASE_H__
|
||||
#define __DIALOG_SIGNAL_LIST_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/listbox.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_SIGNAL_LIST_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_SIGNAL_LIST_BASE : public wxDialog
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxListBox* m_signals;
|
||||
wxStdDialogButtonSizer* m_sdbSizer;
|
||||
wxButton* m_sdbSizerOK;
|
||||
wxButton* m_sdbSizerCancel;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void onSignalAdd( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_SIGNAL_LIST_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 424,535 ), long style = wxDEFAULT_DIALOG_STYLE );
|
||||
~DIALOG_SIGNAL_LIST_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_SIGNAL_LIST_BASE_H__
|
|
@ -0,0 +1,413 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "dialog_sim_settings.h"
|
||||
#include <sim/netlist_exporter_pspice_sim.h>
|
||||
#include <confirm.h>
|
||||
|
||||
#include <wx/tokenzr.h>
|
||||
|
||||
/// @todo ngspice offers more types of analysis,
|
||||
//so there are a few tabs missing (e.g. pole-zero, distortion, sensitivity)
|
||||
|
||||
// Helper function to shorten conditions
|
||||
static bool empty( const wxTextEntryBase* aCtrl )
|
||||
{
|
||||
return aCtrl->GetValue().IsEmpty();
|
||||
}
|
||||
|
||||
|
||||
DIALOG_SIM_SETTINGS::DIALOG_SIM_SETTINGS( wxWindow* aParent )
|
||||
: DIALOG_SIM_SETTINGS_BASE( aParent ), m_exporter( nullptr ), m_spiceEmptyValidator( true )
|
||||
{
|
||||
m_posIntValidator.SetMin( 1 );
|
||||
|
||||
m_acPointsNumber->SetValidator( m_posIntValidator );
|
||||
m_acFreqStart->SetValidator( m_spiceValidator );
|
||||
m_acFreqStop->SetValidator( m_spiceValidator );
|
||||
|
||||
m_dcStart1->SetValidator( m_spiceValidator );
|
||||
m_dcStop1->SetValidator( m_spiceValidator );
|
||||
m_dcIncr1->SetValidator( m_spiceValidator );
|
||||
|
||||
m_dcStart2->SetValidator( m_spiceValidator );
|
||||
m_dcStop2->SetValidator( m_spiceValidator );
|
||||
m_dcIncr2->SetValidator( m_spiceValidator );
|
||||
|
||||
m_noisePointsNumber->SetValidator( m_posIntValidator );
|
||||
m_noiseFreqStart->SetValidator( m_spiceValidator );
|
||||
m_noiseFreqStop->SetValidator( m_spiceValidator );
|
||||
|
||||
m_transStep->SetValidator( m_spiceValidator );
|
||||
m_transFinal->SetValidator( m_spiceValidator );
|
||||
m_transInitial->SetValidator( m_spiceEmptyValidator );
|
||||
|
||||
m_sdbSizerOK->SetDefault();
|
||||
updateNetlistOpts();
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SIM_SETTINGS::TransferDataFromWindow()
|
||||
{
|
||||
if( !wxDialog::TransferDataFromWindow() )
|
||||
return false;
|
||||
|
||||
wxWindow* page = m_simPages->GetCurrentPage();
|
||||
|
||||
// AC analysis
|
||||
if( page == m_pgAC )
|
||||
{
|
||||
if( !m_pgAC->Validate() )
|
||||
return false;
|
||||
|
||||
m_simCommand = wxString::Format( ".ac %s %s %s %s",
|
||||
scaleToString( m_acScale->GetSelection() ),
|
||||
m_acPointsNumber->GetValue(),
|
||||
SPICE_VALUE( m_acFreqStart->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_acFreqStop->GetValue() ).ToSpiceString() );
|
||||
}
|
||||
|
||||
|
||||
// DC transfer analysis
|
||||
else if( page == m_pgDC )
|
||||
{
|
||||
// At least one source has to be enabled
|
||||
if( !m_dcEnable1->IsChecked() && !m_dcEnable1->IsChecked() )
|
||||
{
|
||||
DisplayError( this, wxT( "You need to enable at least one source" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
wxString simCmd = wxString( ".dc " );
|
||||
|
||||
if( m_dcEnable1->IsChecked() )
|
||||
{
|
||||
if( empty( m_dcSource1 ) )
|
||||
{
|
||||
DisplayError( this, wxT( "You need to select DC source (sweep 1)" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
/// @todo for some reason it does not trigger the assigned SPICE_VALIDATOR,
|
||||
// hence try..catch below
|
||||
if( !m_dcStart1->Validate() || !m_dcStop1->Validate() || !m_dcIncr1->Validate() )
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
simCmd += wxString::Format( "v%s %s %s %s",
|
||||
m_dcSource1->GetValue(),
|
||||
SPICE_VALUE( m_dcStart1->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_dcStop1->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_dcIncr1->GetValue() ).ToSpiceString() );
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
DisplayError( this, e.what() );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if( m_dcEnable2->IsChecked() )
|
||||
{
|
||||
if( empty( m_dcSource2 ) )
|
||||
{
|
||||
DisplayError( this, wxT( "You need to select DC source (sweep 2)" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
/// @todo for some reason it does not trigger the assigned SPICE_VALIDATOR,
|
||||
// hence try..catch below
|
||||
if( !m_dcStart2->Validate() || !m_dcStop2->Validate() || !m_dcIncr2->Validate() )
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
simCmd += wxString::Format( "v%s %s %s %s",
|
||||
m_dcSource2->GetValue(),
|
||||
SPICE_VALUE( m_dcStart2->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_dcStop2->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_dcIncr2->GetValue() ).ToSpiceString() );
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
DisplayError( this, e.what() );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
m_simCommand = simCmd;
|
||||
}
|
||||
|
||||
|
||||
// Noise analysis
|
||||
else if( page == m_pgNoise )
|
||||
{
|
||||
const NETLIST_EXPORTER_PSPICE::NET_INDEX_MAP& netMap = m_exporter->GetNetIndexMap();
|
||||
|
||||
if( empty( m_noiseMeas ) || empty( m_noiseSrc ) || empty( m_noisePointsNumber )
|
||||
|| empty( m_noiseFreqStart ) || empty( m_noiseFreqStop ) )
|
||||
return false;
|
||||
|
||||
wxString ref = empty( m_noiseRef )
|
||||
? wxString() : wxString::Format( ", %d", netMap.at( m_noiseRef->GetValue() ) );
|
||||
|
||||
m_simCommand = wxString::Format( ".noise v(%d%s) v%s %s %s %s %s",
|
||||
netMap.at( m_noiseMeas->GetValue() ), ref,
|
||||
m_noiseSrc->GetValue(), scaleToString( m_noiseScale->GetSelection() ),
|
||||
m_noisePointsNumber->GetValue(),
|
||||
SPICE_VALUE( m_noiseFreqStart->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_noiseFreqStop->GetValue() ).ToSpiceString() );
|
||||
}
|
||||
|
||||
|
||||
// DC operating point analysis
|
||||
else if( page == m_pgOP )
|
||||
{
|
||||
m_simCommand = wxString( ".op" );
|
||||
}
|
||||
|
||||
|
||||
// Transient analysis
|
||||
else if( page == m_pgTransient )
|
||||
{
|
||||
if( !m_pgTransient->Validate() )
|
||||
return false;
|
||||
|
||||
wxString initial = empty( m_transInitial )
|
||||
? "" : SPICE_VALUE( m_transInitial->GetValue() ).ToSpiceString();
|
||||
|
||||
m_simCommand = wxString::Format( ".tran %s %s %s",
|
||||
SPICE_VALUE( m_transStep->GetValue() ).ToSpiceString(),
|
||||
SPICE_VALUE( m_transFinal->GetValue() ).ToSpiceString(),
|
||||
initial );
|
||||
}
|
||||
|
||||
|
||||
// Custom directives
|
||||
else if( page == m_pgCustom )
|
||||
{
|
||||
m_simCommand = m_customTxt->GetValue();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_simCommand.Trim();
|
||||
updateNetlistOpts();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SIM_SETTINGS::TransferDataToWindow()
|
||||
{
|
||||
/// @todo one day it could interpret the sim command and fill out appropriate fields..
|
||||
if( empty( m_customTxt ) )
|
||||
loadDirectives();
|
||||
|
||||
if( m_simCommand.IsEmpty() && !empty( m_customTxt ) )
|
||||
return parseCommand( m_customTxt->GetValue() );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
int DIALOG_SIM_SETTINGS::ShowModal()
|
||||
{
|
||||
// Fill out comboboxes that allow to select nets
|
||||
// Map comoboxes to their current values
|
||||
std::map<wxComboBox*, wxString> cmbNet = {
|
||||
{ m_noiseMeas, m_noiseMeas->GetStringSelection() },
|
||||
{ m_noiseRef, m_noiseRef->GetStringSelection() }
|
||||
};
|
||||
|
||||
for( auto c : cmbNet )
|
||||
c.first->Clear();
|
||||
|
||||
for( auto net : m_exporter->GetNetIndexMap() )
|
||||
{
|
||||
for( auto c : cmbNet )
|
||||
c.first->Append( net.first );
|
||||
}
|
||||
|
||||
// Try to restore the previous selection, if possible
|
||||
for( auto c : cmbNet )
|
||||
{
|
||||
int idx = c.first->FindString( c.second );
|
||||
|
||||
if( idx != wxNOT_FOUND )
|
||||
c.first->SetSelection( idx );
|
||||
}
|
||||
|
||||
|
||||
// Fill out comboboxes that allow to select power sources
|
||||
std::map<wxComboBox*, wxString> cmbSrc = {
|
||||
{ m_dcSource1, m_dcSource1->GetStringSelection() },
|
||||
{ m_dcSource2, m_dcSource2->GetStringSelection() },
|
||||
{ m_noiseSrc, m_noiseSrc->GetStringSelection() },
|
||||
};
|
||||
|
||||
for( auto c : cmbSrc )
|
||||
c.first->Clear();
|
||||
|
||||
for( auto item : m_exporter->GetSpiceItems() )
|
||||
{
|
||||
if( item.m_primitive == 'V' )
|
||||
{
|
||||
for( auto c : cmbSrc )
|
||||
c.first->Append( item.m_refName );
|
||||
}
|
||||
}
|
||||
|
||||
// Try to restore the previous selection, if possible
|
||||
for( auto c : cmbSrc )
|
||||
{
|
||||
int idx = c.first->FindString( c.second );
|
||||
|
||||
if( idx != wxNOT_FOUND )
|
||||
c.first->SetSelection( idx );
|
||||
}
|
||||
|
||||
return DIALOG_SIM_SETTINGS_BASE::ShowModal();
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SIM_SETTINGS::parseCommand( const wxString& aCommand )
|
||||
{
|
||||
if( aCommand.IsEmpty() )
|
||||
return false;
|
||||
|
||||
wxStringTokenizer tokenizer( aCommand, " " );
|
||||
wxString tkn = tokenizer.GetNextToken().Lower();
|
||||
|
||||
try {
|
||||
if( tkn == ".ac" )
|
||||
{
|
||||
m_simPages->SetSelection( m_simPages->FindPage( m_pgAC ) );
|
||||
|
||||
tkn = tokenizer.GetNextToken().Lower();
|
||||
|
||||
if( tkn == "dec" )
|
||||
m_acScale->SetSelection( 0 );
|
||||
if( tkn == "oct" )
|
||||
m_acScale->SetSelection( 1 );
|
||||
if( tkn == "lin" )
|
||||
m_acScale->SetSelection( 2 );
|
||||
else
|
||||
return false;
|
||||
|
||||
// If the fields below are empty, it will be caught by the exception handler
|
||||
m_acPointsNumber->SetValue( tokenizer.GetNextToken() );
|
||||
m_acFreqStart->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
m_acFreqStop->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
}
|
||||
|
||||
else if( tkn == ".dc" )
|
||||
{
|
||||
m_simPages->SetSelection( m_simPages->FindPage( m_pgDC ) );
|
||||
|
||||
tkn = tokenizer.GetNextToken();
|
||||
|
||||
if( !tkn.IsEmpty() )
|
||||
{
|
||||
m_dcSource1->SetValue( tkn );
|
||||
m_dcStart1->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
m_dcStop1->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
m_dcIncr1->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
|
||||
// Check the 'Enabled' field, if all values are filled
|
||||
m_dcEnable1->SetValue( !empty( m_dcSource1 ) && !empty( m_dcStart1 )
|
||||
&& !empty( m_dcStop1 ) && !empty( m_dcIncr1 ) );
|
||||
}
|
||||
|
||||
tkn = tokenizer.GetNextToken();
|
||||
|
||||
if( !tkn.IsEmpty() )
|
||||
{
|
||||
m_dcSource2->SetValue( tkn );
|
||||
m_dcStart2->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
m_dcStop2->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
m_dcIncr2->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
|
||||
// Check the 'Enabled' field, if all values are filled
|
||||
m_dcEnable2->SetValue( !empty( m_dcSource2 ) && !empty( m_dcStart2 )
|
||||
&& !empty( m_dcStop2 ) && !empty( m_dcIncr2 ) );
|
||||
}
|
||||
|
||||
// Check if the directive is complete
|
||||
if( !m_dcEnable1->IsChecked() || !m_dcEnable2->IsChecked() )
|
||||
return false;
|
||||
}
|
||||
|
||||
else if( tkn == ".tran" )
|
||||
{
|
||||
m_simPages->SetSelection( m_simPages->FindPage( m_pgTransient ) );
|
||||
|
||||
// If the fields below are empty, it will be caught by the exception handler
|
||||
m_transStep->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
m_transFinal->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
|
||||
|
||||
// Initial time is an optional field
|
||||
tkn = tokenizer.GetNextToken();
|
||||
|
||||
if( !tkn.IsEmpty() )
|
||||
m_transInitial->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
|
||||
}
|
||||
|
||||
// Custom directives
|
||||
else if( !empty( m_customTxt ) )
|
||||
{
|
||||
m_simPages->SetSelection( m_simPages->FindPage( m_pgCustom ) );
|
||||
}
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
// Nothing really bad has happened
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SIM_SETTINGS::loadDirectives()
|
||||
{
|
||||
if( m_exporter )
|
||||
m_customTxt->SetValue( m_exporter->GetSheetSimCommand() );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SIM_SETTINGS::updateNetlistOpts()
|
||||
{
|
||||
m_netlistOpts = NET_ALL_FLAGS;
|
||||
|
||||
if( !m_fixPassiveVals->IsChecked() )
|
||||
m_netlistOpts &= ~NET_ADJUST_PASSIVE_VALS;
|
||||
|
||||
if( !m_fixIncludePaths->IsChecked() )
|
||||
m_netlistOpts &= ~NET_ADJUST_INCLUDE_PATHS;
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef DIALOG_SIM_SETTINGS_BASE_H
|
||||
#define DIALOG_SIM_SETTINGS_BASE_H
|
||||
|
||||
#include "dialog_sim_settings_base.h"
|
||||
#include <sim/spice_value.h>
|
||||
|
||||
#include <wx/valnum.h>
|
||||
|
||||
class NETLIST_EXPORTER_PSPICE_SIM;
|
||||
|
||||
class DIALOG_SIM_SETTINGS : public DIALOG_SIM_SETTINGS_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_SIM_SETTINGS( wxWindow* aParent );
|
||||
|
||||
const wxString& GetSimCommand() const
|
||||
{
|
||||
return m_simCommand;
|
||||
}
|
||||
|
||||
bool SetSimCommand( const wxString& aCommand )
|
||||
{
|
||||
bool res = parseCommand( aCommand );
|
||||
|
||||
if( res )
|
||||
m_simCommand = aCommand;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int GetNetlistOptions() const
|
||||
{
|
||||
return m_netlistOpts;
|
||||
}
|
||||
|
||||
void SetNetlistExporter( NETLIST_EXPORTER_PSPICE_SIM* aExporter )
|
||||
{
|
||||
m_exporter = aExporter;
|
||||
}
|
||||
|
||||
bool TransferDataFromWindow() override;
|
||||
bool TransferDataToWindow() override;
|
||||
|
||||
int ShowModal() override;
|
||||
|
||||
private:
|
||||
enum SCALE_TYPE
|
||||
{
|
||||
DECADE,
|
||||
OCTAVE,
|
||||
LINEAR
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Parses a Spice directive.
|
||||
* @param aCommand is the directive to be parsed (e.g. ".tran 10n 1000n").
|
||||
* @return bool if the directive was parsed correctly.
|
||||
*/
|
||||
bool parseCommand( const wxString& aCommand );
|
||||
|
||||
void onLoadDirectives( wxCommandEvent& event ) override
|
||||
{
|
||||
loadDirectives();
|
||||
}
|
||||
|
||||
static wxString scaleToString( int aOption )
|
||||
{
|
||||
switch( aOption )
|
||||
{
|
||||
case DECADE:
|
||||
return wxString( "dec" );
|
||||
|
||||
case OCTAVE:
|
||||
return wxString( "oct" );
|
||||
|
||||
case LINEAR:
|
||||
return wxString( "lin" );
|
||||
}
|
||||
|
||||
wxASSERT_MSG( false, "Unhandled scale type" );
|
||||
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
void loadDirectives();
|
||||
void updateNetlistOpts();
|
||||
|
||||
wxString m_simCommand;
|
||||
int m_netlistOpts;
|
||||
NETLIST_EXPORTER_PSPICE_SIM* m_exporter;
|
||||
|
||||
SPICE_VALIDATOR m_spiceValidator;
|
||||
SPICE_VALIDATOR m_spiceEmptyValidator;
|
||||
wxIntegerValidator<int> m_posIntValidator;
|
||||
};
|
||||
|
||||
#endif /* DIALOG_SIM_SETTINGS_BASE_H */
|
|
@ -0,0 +1,417 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_sim_settings_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_SIM_SETTINGS_BASE::DIALOG_SIM_SETTINGS_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bSizer1;
|
||||
bSizer1 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_simPages = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_pgAC = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizer3;
|
||||
bSizer3 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxString m_acScaleChoices[] = { wxT("Decade"), wxT("Octave"), wxT("Linear") };
|
||||
int m_acScaleNChoices = sizeof( m_acScaleChoices ) / sizeof( wxString );
|
||||
m_acScale = new wxRadioBox( m_pgAC, wxID_ANY, wxT("Frequency scale"), wxDefaultPosition, wxDefaultSize, m_acScaleNChoices, m_acScaleChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_acScale->SetSelection( 0 );
|
||||
m_acScale->Hide();
|
||||
|
||||
bSizer3->Add( m_acScale, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
|
||||
|
||||
|
||||
bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer1;
|
||||
fgSizer1 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer1->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText1 = new wxStaticText( m_pgAC, wxID_ANY, wxT("Number of points"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText1->Wrap( -1 );
|
||||
fgSizer1->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_acPointsNumber = new wxTextCtrl( m_pgAC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer1->Add( m_acPointsNumber, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText2 = new wxStaticText( m_pgAC, wxID_ANY, wxT("Start frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText2->Wrap( -1 );
|
||||
fgSizer1->Add( m_staticText2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_acFreqStart = new wxTextCtrl( m_pgAC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer1->Add( m_acFreqStart, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText3 = new wxStaticText( m_pgAC, wxID_ANY, wxT("Stop frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText3->Wrap( -1 );
|
||||
fgSizer1->Add( m_staticText3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_acFreqStop = new wxTextCtrl( m_pgAC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer1->Add( m_acFreqStop, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizer3->Add( fgSizer1, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
|
||||
bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pgAC->SetSizer( bSizer3 );
|
||||
m_pgAC->Layout();
|
||||
bSizer3->Fit( m_pgAC );
|
||||
m_simPages->AddPage( m_pgAC, wxT("AC"), true );
|
||||
m_pgDC = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizer4;
|
||||
bSizer4 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* sbSizer21;
|
||||
sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_pgDC, wxID_ANY, wxT("DC sweep source 1") ), wxVERTICAL );
|
||||
|
||||
m_dcEnable1 = new wxCheckBox( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Enable"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizer21->Add( m_dcEnable1, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer21;
|
||||
fgSizer21 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer21->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer21->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText41 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("DC source"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText41->Wrap( -1 );
|
||||
fgSizer21->Add( m_staticText41, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcSource1 = new wxComboBox( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
fgSizer21->Add( m_dcSource1, 0, wxALL, 5 );
|
||||
|
||||
m_staticText51 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Starting voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText51->Wrap( -1 );
|
||||
fgSizer21->Add( m_staticText51, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcStart1 = new wxTextCtrl( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer21->Add( m_dcStart1, 0, wxALL, 5 );
|
||||
|
||||
m_staticText61 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Final voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText61->Wrap( -1 );
|
||||
fgSizer21->Add( m_staticText61, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcStop1 = new wxTextCtrl( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer21->Add( m_dcStop1, 0, wxALL, 5 );
|
||||
|
||||
m_staticText71 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Increment step [V]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText71->Wrap( -1 );
|
||||
fgSizer21->Add( m_staticText71, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcIncr1 = new wxTextCtrl( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer21->Add( m_dcIncr1, 0, wxALL, 5 );
|
||||
|
||||
|
||||
sbSizer21->Add( fgSizer21, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
|
||||
bSizer4->Add( sbSizer21, 1, wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbSizer2;
|
||||
sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( m_pgDC, wxID_ANY, wxT("DC sweep source 2") ), wxVERTICAL );
|
||||
|
||||
m_dcEnable2 = new wxCheckBox( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Enable"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizer2->Add( m_dcEnable2, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer2;
|
||||
fgSizer2 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer2->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText4 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("DC source"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText4->Wrap( -1 );
|
||||
fgSizer2->Add( m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcSource2 = new wxComboBox( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
fgSizer2->Add( m_dcSource2, 0, wxALL, 5 );
|
||||
|
||||
m_staticText5 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Starting voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText5->Wrap( -1 );
|
||||
fgSizer2->Add( m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcStart2 = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer2->Add( m_dcStart2, 0, wxALL, 5 );
|
||||
|
||||
m_staticText6 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Final voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText6->Wrap( -1 );
|
||||
fgSizer2->Add( m_staticText6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcStop2 = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer2->Add( m_dcStop2, 0, wxALL, 5 );
|
||||
|
||||
m_staticText7 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Increment step [V]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText7->Wrap( -1 );
|
||||
fgSizer2->Add( m_staticText7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_dcIncr2 = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer2->Add( m_dcIncr2, 0, wxALL, 5 );
|
||||
|
||||
|
||||
sbSizer2->Add( fgSizer2, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
|
||||
bSizer4->Add( sbSizer2, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pgDC->SetSizer( bSizer4 );
|
||||
m_pgDC->Layout();
|
||||
bSizer4->Fit( m_pgDC );
|
||||
m_simPages->AddPage( m_pgDC, wxT("DC Transfer"), false );
|
||||
m_pgDistortion = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pgDistortion->Hide();
|
||||
|
||||
m_simPages->AddPage( m_pgDistortion, wxT("Distortion"), false );
|
||||
m_pgNoise = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pgNoise->Hide();
|
||||
|
||||
wxBoxSizer* bSizer15;
|
||||
bSizer15 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer7;
|
||||
fgSizer7 = new wxFlexGridSizer( 0, 3, 0, 0 );
|
||||
fgSizer7->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText14 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Measured node"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText14->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_noiseMeas = new wxComboBox( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
fgSizer7->Add( m_noiseMeas, 0, wxALL, 5 );
|
||||
|
||||
|
||||
fgSizer7->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText15 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Reference node"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText15->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_noiseRef = new wxComboBox( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
fgSizer7->Add( m_noiseRef, 0, wxALL, 5 );
|
||||
|
||||
m_staticText23 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("(optional; default GND)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText23->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_staticText16 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Noise source"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText16->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_noiseSrc = new wxComboBox( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
fgSizer7->Add( m_noiseSrc, 0, wxALL, 5 );
|
||||
|
||||
|
||||
fgSizer7->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizer15->Add( fgSizer7, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
|
||||
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxString m_noiseScaleChoices[] = { wxT("Decade"), wxT("Octave"), wxT("Linear") };
|
||||
int m_noiseScaleNChoices = sizeof( m_noiseScaleChoices ) / sizeof( wxString );
|
||||
m_noiseScale = new wxRadioBox( m_pgNoise, wxID_ANY, wxT("Frequency scale"), wxDefaultPosition, wxDefaultSize, m_noiseScaleNChoices, m_noiseScaleChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_noiseScale->SetSelection( 0 );
|
||||
bSizer15->Add( m_noiseScale, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
|
||||
|
||||
|
||||
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer11;
|
||||
fgSizer11 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer11->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText11 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Number of points"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText11->Wrap( -1 );
|
||||
fgSizer11->Add( m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_noisePointsNumber = new wxTextCtrl( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer11->Add( m_noisePointsNumber, 0, wxALL, 5 );
|
||||
|
||||
m_staticText21 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Start frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText21->Wrap( -1 );
|
||||
fgSizer11->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_noiseFreqStart = new wxTextCtrl( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer11->Add( m_noiseFreqStart, 0, wxALL, 5 );
|
||||
|
||||
m_staticText31 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Stop frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText31->Wrap( -1 );
|
||||
fgSizer11->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_noiseFreqStop = new wxTextCtrl( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer11->Add( m_noiseFreqStop, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizer15->Add( fgSizer11, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
|
||||
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pgNoise->SetSizer( bSizer15 );
|
||||
m_pgNoise->Layout();
|
||||
bSizer15->Fit( m_pgNoise );
|
||||
m_simPages->AddPage( m_pgNoise, wxT("Noise"), false );
|
||||
m_pgOP = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pgOP->Hide();
|
||||
|
||||
wxBoxSizer* bSizer8;
|
||||
bSizer8 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
bSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText13 = new wxStaticText( m_pgOP, wxID_ANY, wxT("This tab has no settings"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText13->Wrap( -1 );
|
||||
bSizer8->Add( m_staticText13, 0, wxALIGN_CENTER, 5 );
|
||||
|
||||
|
||||
bSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pgOP->SetSizer( bSizer8 );
|
||||
m_pgOP->Layout();
|
||||
bSizer8->Fit( m_pgOP );
|
||||
m_simPages->AddPage( m_pgOP, wxT("Operating Point"), false );
|
||||
m_pgPoleZero = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pgPoleZero->Hide();
|
||||
|
||||
m_simPages->AddPage( m_pgPoleZero, wxT("Pole-Zero"), false );
|
||||
m_pgSensitivity = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pgSensitivity->Hide();
|
||||
|
||||
m_simPages->AddPage( m_pgSensitivity, wxT("Sensitvity"), false );
|
||||
m_pgTransferFunction = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pgTransferFunction->Hide();
|
||||
|
||||
m_simPages->AddPage( m_pgTransferFunction, wxT("Transfer Function"), false );
|
||||
m_pgTransient = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizer81;
|
||||
bSizer81 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizer6;
|
||||
fgSizer6 = new wxFlexGridSizer( 0, 3, 0, 0 );
|
||||
fgSizer6->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText151 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("Time step [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText151->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText151, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_transStep = new wxTextCtrl( m_pgTransient, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer6->Add( m_transStep, 0, wxALL, 5 );
|
||||
|
||||
|
||||
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText161 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("Final time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText161->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText161, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_transFinal = new wxTextCtrl( m_pgTransient, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer6->Add( m_transFinal, 0, wxALL, 5 );
|
||||
|
||||
|
||||
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText17 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("Initial time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText17->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_transInitial = new wxTextCtrl( m_pgTransient, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer6->Add( m_transInitial, 0, wxALL, 5 );
|
||||
|
||||
m_staticText24 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("(optional; default 0)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText24->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
|
||||
bSizer81->Add( fgSizer6, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
|
||||
|
||||
|
||||
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pgTransient->SetSizer( bSizer81 );
|
||||
m_pgTransient->Layout();
|
||||
bSizer81->Fit( m_pgTransient );
|
||||
m_simPages->AddPage( m_pgTransient, wxT("Transient"), false );
|
||||
m_pgCustom = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizer2;
|
||||
bSizer2 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_staticText18 = new wxStaticText( m_pgCustom, wxID_ANY, wxT("Spice directives:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText18->Wrap( -1 );
|
||||
bSizer2->Add( m_staticText18, 0, wxALL, 5 );
|
||||
|
||||
m_customTxt = new wxTextCtrl( m_pgCustom, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
|
||||
m_customTxt->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
|
||||
|
||||
bSizer2->Add( m_customTxt, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_loadDirectives = new wxButton( m_pgCustom, wxID_ANY, wxT("Load directives from schematic"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer2->Add( m_loadDirectives, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pgCustom->SetSizer( bSizer2 );
|
||||
m_pgCustom->Layout();
|
||||
bSizer2->Fit( m_pgCustom );
|
||||
m_simPages->AddPage( m_pgCustom, wxT("Custom"), false );
|
||||
|
||||
bSizer1->Add( m_simPages, 1, wxEXPAND | wxALL, 5 );
|
||||
|
||||
m_fixPassiveVals = new wxCheckBox( this, wxID_ANY, wxT("Adjust passive component values (e.g. M -> Meg; 100 nF -> 100n)"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer1->Add( m_fixPassiveVals, 0, wxALL, 5 );
|
||||
|
||||
m_fixIncludePaths = new wxCheckBox( this, wxID_ANY, wxT("Add full path for .include library directives"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_fixIncludePaths->SetValue(true);
|
||||
bSizer1->Add( m_fixIncludePaths, 0, wxALL, 5 );
|
||||
|
||||
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||
m_sdbSizer->Realize();
|
||||
|
||||
bSizer1->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizer1 );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
m_loadDirectives->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SIM_SETTINGS_BASE::onLoadDirectives ), NULL, this );
|
||||
}
|
||||
|
||||
DIALOG_SIM_SETTINGS_BASE::~DIALOG_SIM_SETTINGS_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_loadDirectives->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SIM_SETTINGS_BASE::onLoadDirectives ), NULL, this );
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,123 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DIALOG_SIM_SETTINGS_BASE_H__
|
||||
#define __DIALOG_SIM_SETTINGS_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/radiobox.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/valtext.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/panel.h>
|
||||
#include <wx/bitmap.h>
|
||||
#include <wx/image.h>
|
||||
#include <wx/icon.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/combobox.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_SIM_SETTINGS_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_SIM_SETTINGS_BASE : public wxDialog
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxNotebook* m_simPages;
|
||||
wxPanel* m_pgAC;
|
||||
wxRadioBox* m_acScale;
|
||||
wxStaticText* m_staticText1;
|
||||
wxTextCtrl* m_acPointsNumber;
|
||||
wxStaticText* m_staticText2;
|
||||
wxTextCtrl* m_acFreqStart;
|
||||
wxStaticText* m_staticText3;
|
||||
wxTextCtrl* m_acFreqStop;
|
||||
wxPanel* m_pgDC;
|
||||
wxCheckBox* m_dcEnable1;
|
||||
wxStaticText* m_staticText41;
|
||||
wxComboBox* m_dcSource1;
|
||||
wxStaticText* m_staticText51;
|
||||
wxTextCtrl* m_dcStart1;
|
||||
wxStaticText* m_staticText61;
|
||||
wxTextCtrl* m_dcStop1;
|
||||
wxStaticText* m_staticText71;
|
||||
wxTextCtrl* m_dcIncr1;
|
||||
wxCheckBox* m_dcEnable2;
|
||||
wxStaticText* m_staticText4;
|
||||
wxComboBox* m_dcSource2;
|
||||
wxStaticText* m_staticText5;
|
||||
wxTextCtrl* m_dcStart2;
|
||||
wxStaticText* m_staticText6;
|
||||
wxTextCtrl* m_dcStop2;
|
||||
wxStaticText* m_staticText7;
|
||||
wxTextCtrl* m_dcIncr2;
|
||||
wxPanel* m_pgDistortion;
|
||||
wxPanel* m_pgNoise;
|
||||
wxStaticText* m_staticText14;
|
||||
wxComboBox* m_noiseMeas;
|
||||
wxStaticText* m_staticText15;
|
||||
wxComboBox* m_noiseRef;
|
||||
wxStaticText* m_staticText23;
|
||||
wxStaticText* m_staticText16;
|
||||
wxComboBox* m_noiseSrc;
|
||||
wxRadioBox* m_noiseScale;
|
||||
wxStaticText* m_staticText11;
|
||||
wxTextCtrl* m_noisePointsNumber;
|
||||
wxStaticText* m_staticText21;
|
||||
wxTextCtrl* m_noiseFreqStart;
|
||||
wxStaticText* m_staticText31;
|
||||
wxTextCtrl* m_noiseFreqStop;
|
||||
wxPanel* m_pgOP;
|
||||
wxStaticText* m_staticText13;
|
||||
wxPanel* m_pgPoleZero;
|
||||
wxPanel* m_pgSensitivity;
|
||||
wxPanel* m_pgTransferFunction;
|
||||
wxPanel* m_pgTransient;
|
||||
wxStaticText* m_staticText151;
|
||||
wxTextCtrl* m_transStep;
|
||||
wxStaticText* m_staticText161;
|
||||
wxTextCtrl* m_transFinal;
|
||||
wxStaticText* m_staticText17;
|
||||
wxTextCtrl* m_transInitial;
|
||||
wxStaticText* m_staticText24;
|
||||
wxPanel* m_pgCustom;
|
||||
wxStaticText* m_staticText18;
|
||||
wxTextCtrl* m_customTxt;
|
||||
wxButton* m_loadDirectives;
|
||||
wxCheckBox* m_fixPassiveVals;
|
||||
wxCheckBox* m_fixIncludePaths;
|
||||
wxStdDialogButtonSizer* m_sdbSizer;
|
||||
wxButton* m_sdbSizerOK;
|
||||
wxButton* m_sdbSizerCancel;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void onLoadDirectives( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_SIM_SETTINGS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Simulation settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 450,700 ), long style = wxDEFAULT_DIALOG_STYLE );
|
||||
~DIALOG_SIM_SETTINGS_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_SIM_SETTINGS_BASE_H__
|
|
@ -0,0 +1,761 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "dialog_spice_model.h"
|
||||
|
||||
#include <netlist_exporters/netlist_exporter_pspice.h>
|
||||
#include <sim/spice_value.h>
|
||||
#include <confirm.h>
|
||||
#include <project.h>
|
||||
|
||||
#include <wx/tokenzr.h>
|
||||
|
||||
// Helper function to shorten conditions
|
||||
static bool empty( const wxTextCtrl* aCtrl )
|
||||
{
|
||||
return aCtrl->GetValue().IsEmpty();
|
||||
}
|
||||
|
||||
|
||||
// Function to sort PWL values list
|
||||
static int wxCALLBACK comparePwlValues( wxIntPtr aItem1, wxIntPtr aItem2, wxIntPtr WXUNUSED( aSortData ) )
|
||||
{
|
||||
float* t1 = reinterpret_cast<float*>( &aItem1 );
|
||||
float* t2 = reinterpret_cast<float*>( &aItem2 );
|
||||
|
||||
if( *t1 > *t2 )
|
||||
return 1;
|
||||
|
||||
if( *t1 < *t2 )
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
DIALOG_SPICE_MODEL::DIALOG_SPICE_MODEL( wxWindow* aParent, SCH_COMPONENT& aComponent, SCH_FIELDS& aFields )
|
||||
: DIALOG_SPICE_MODEL_BASE( aParent ), m_component( aComponent ), m_fields( aFields ),
|
||||
m_spiceEmptyValidator( true ), m_notEmptyValidator( wxFILTER_EMPTY )
|
||||
{
|
||||
m_pasValue->SetValidator( m_spiceValidator );
|
||||
|
||||
m_semiType->SetValidator( m_notEmptyValidator );
|
||||
m_semiModel->SetValidator( m_notEmptyValidator );
|
||||
|
||||
m_icModel->SetValidator( m_notEmptyValidator );
|
||||
|
||||
m_genDc->SetValidator( m_spiceEmptyValidator );
|
||||
m_genAcMag->SetValidator( m_spiceEmptyValidator );
|
||||
m_genAcPhase->SetValidator( m_spiceEmptyValidator );
|
||||
|
||||
m_pulseInit->SetValidator( m_spiceEmptyValidator );
|
||||
m_pulseNominal->SetValidator( m_spiceEmptyValidator );
|
||||
m_pulseDelay->SetValidator( m_spiceEmptyValidator );
|
||||
m_pulseRise->SetValidator( m_spiceEmptyValidator );
|
||||
m_pulseFall->SetValidator( m_spiceEmptyValidator );
|
||||
m_pulseWidth->SetValidator( m_spiceEmptyValidator );
|
||||
m_pulsePeriod->SetValidator( m_spiceEmptyValidator );
|
||||
|
||||
m_sinOffset->SetValidator( m_spiceEmptyValidator );
|
||||
m_sinAmplitude->SetValidator( m_spiceEmptyValidator );
|
||||
m_sinFreq->SetValidator( m_spiceEmptyValidator );
|
||||
m_sinDelay->SetValidator( m_spiceEmptyValidator );
|
||||
m_sinDampFactor->SetValidator( m_spiceEmptyValidator );
|
||||
|
||||
m_expInit->SetValidator( m_spiceEmptyValidator );
|
||||
m_expPulsed->SetValidator( m_spiceEmptyValidator );
|
||||
m_expRiseDelay->SetValidator( m_spiceEmptyValidator );
|
||||
m_expRiseConst->SetValidator( m_spiceEmptyValidator );
|
||||
m_expFallDelay->SetValidator( m_spiceEmptyValidator );
|
||||
m_expFallConst->SetValidator( m_spiceEmptyValidator );
|
||||
|
||||
m_pwlTimeCol = m_pwlValList->AppendColumn( "Time [s]", wxLIST_FORMAT_LEFT, 100 );
|
||||
m_pwlValueCol = m_pwlValList->AppendColumn( "Value [V/A]", wxLIST_FORMAT_LEFT, 100 );
|
||||
|
||||
m_sdbSizerOK->SetDefault();
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SPICE_MODEL::TransferDataFromWindow()
|
||||
{
|
||||
if( !DIALOG_SPICE_MODEL_BASE::TransferDataFromWindow() )
|
||||
return false;
|
||||
|
||||
wxWindow* page = m_notebook->GetCurrentPage();
|
||||
|
||||
// Passive
|
||||
if( page == m_passive )
|
||||
{
|
||||
if( !m_passive->Validate() )
|
||||
return false;
|
||||
|
||||
switch( m_pasType->GetSelection() )
|
||||
{
|
||||
case 0: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_RESISTOR; break;
|
||||
case 1: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_CAPACITOR; break;
|
||||
case 2: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_INDUCTOR; break;
|
||||
|
||||
default:
|
||||
wxASSERT_MSG( false, "Unhandled passive type" );
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
||||
m_fieldsTmp[SF_MODEL] = m_pasValue->GetValue();
|
||||
}
|
||||
|
||||
|
||||
// Semiconductor
|
||||
else if( page == m_semiconductor )
|
||||
{
|
||||
if( !m_semiconductor->Validate() )
|
||||
return false;
|
||||
|
||||
switch( m_semiType->GetSelection() )
|
||||
{
|
||||
case 0: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_DIODE; break;
|
||||
case 1: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_BJT; break;
|
||||
case 2: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_MOSFET; break;
|
||||
|
||||
default:
|
||||
wxASSERT_MSG( false, "Unhandled semiconductor type" );
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
||||
m_fieldsTmp[SF_MODEL] = m_semiModel->GetValue();
|
||||
|
||||
if( !empty( m_semiLib ) )
|
||||
m_fieldsTmp[SF_LIB_FILE] = m_semiLib->GetValue();
|
||||
}
|
||||
|
||||
|
||||
// Integrated circuit
|
||||
else if( page == m_ic )
|
||||
{
|
||||
if( !m_ic->Validate() )
|
||||
return false;
|
||||
|
||||
m_fieldsTmp[SF_PRIMITIVE] = (char) SP_SUBCKT;
|
||||
m_fieldsTmp[SF_MODEL] = m_icModel->GetValue();
|
||||
|
||||
if( !empty( m_icLib ) )
|
||||
m_fieldsTmp[SF_LIB_FILE] = m_icLib->GetValue();
|
||||
}
|
||||
|
||||
|
||||
// Power source
|
||||
else if( page == m_power )
|
||||
{
|
||||
wxString model;
|
||||
|
||||
if( !generatePowerSource( model ) )
|
||||
return false;
|
||||
|
||||
m_fieldsTmp[SF_PRIMITIVE] = (char)( m_pwrType->GetSelection() ? SP_ISOURCE : SP_VSOURCE );
|
||||
m_fieldsTmp[SF_MODEL] = model;
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
wxASSERT_MSG( false, "Unhandled model type" );
|
||||
return false;
|
||||
}
|
||||
|
||||
m_fieldsTmp[SF_ENABLED] = !m_disabled->GetValue() ? "Y" : "N"; // note bool inversion
|
||||
m_fieldsTmp[SF_NODE_SEQUENCE] = m_nodeSeqCheck->IsChecked() ? m_nodeSeqVal->GetValue() : "";
|
||||
|
||||
// Apply the settings
|
||||
for( int i = 0; i < SF_END; ++i )
|
||||
{
|
||||
if( m_fieldsTmp.count( (SPICE_FIELD) i ) > 0 && !m_fieldsTmp.at( i ).IsEmpty() )
|
||||
{
|
||||
getField( i ).SetText( m_fieldsTmp[i] );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Erase empty fields (having empty fields causes a warning in the properties dialog)
|
||||
const wxString& spiceField = NETLIST_EXPORTER_PSPICE::GetSpiceFieldName( (SPICE_FIELD) i );
|
||||
|
||||
auto fieldIt = std::find_if( m_fields.begin(), m_fields.end(), [&]( const SCH_FIELD& f ) {
|
||||
return f.GetName() == spiceField;
|
||||
} );
|
||||
|
||||
if( fieldIt != m_fields.end() )
|
||||
m_fields.erase( fieldIt );
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SPICE_MODEL::TransferDataToWindow()
|
||||
{
|
||||
const auto& spiceFields = NETLIST_EXPORTER_PSPICE::GetSpiceFields();
|
||||
|
||||
// Fill out the working buffer
|
||||
for( unsigned int idx = 0; idx < spiceFields.size(); ++idx )
|
||||
{
|
||||
const wxString& spiceField = spiceFields[idx];
|
||||
|
||||
auto fieldIt = std::find_if( m_fields.begin(), m_fields.end(), [&]( const SCH_FIELD& f ) {
|
||||
return f.GetName() == spiceField;
|
||||
} );
|
||||
|
||||
// Do not modify the existing value, just add missing fields with default values
|
||||
if( fieldIt != m_fields.end() && !fieldIt->GetText().IsEmpty() )
|
||||
m_fieldsTmp[idx] = fieldIt->GetText();
|
||||
else
|
||||
m_fieldsTmp[idx] = NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( (SPICE_FIELD) idx, &m_component,
|
||||
NET_USE_X_PREFIX | NET_ADJUST_INCLUDE_PATHS | NET_ADJUST_PASSIVE_VALS );
|
||||
}
|
||||
|
||||
// Analyze the component fields to fill out the dialog
|
||||
char primitive = toupper( m_fieldsTmp[SF_PRIMITIVE][0] );
|
||||
|
||||
switch( primitive )
|
||||
{
|
||||
case SP_RESISTOR:
|
||||
case SP_CAPACITOR:
|
||||
case SP_INDUCTOR:
|
||||
m_notebook->SetSelection( m_notebook->FindPage( m_passive ) );
|
||||
m_pasType->SetSelection( primitive == SP_RESISTOR ? 0
|
||||
: primitive == SP_CAPACITOR ? 1
|
||||
: primitive == SP_INDUCTOR ? 2
|
||||
: -1 );
|
||||
m_pasValue->SetValue( m_fieldsTmp[SF_MODEL] );
|
||||
break;
|
||||
|
||||
case SP_DIODE:
|
||||
case SP_BJT:
|
||||
case SP_MOSFET:
|
||||
m_notebook->SetSelection( m_notebook->FindPage( m_semiconductor ) );
|
||||
m_semiType->SetSelection( primitive == SP_DIODE ? 0
|
||||
: primitive == SP_BJT ? 1
|
||||
: primitive == SP_MOSFET ? 2
|
||||
: -1 );
|
||||
m_semiModel->SetValue( m_fieldsTmp[SF_MODEL] );
|
||||
m_semiLib->SetValue( m_fieldsTmp[SF_LIB_FILE] );
|
||||
|
||||
if( !empty( m_semiLib ) )
|
||||
{
|
||||
const wxString& libFile = m_semiLib->GetValue();
|
||||
m_fieldsTmp[SF_LIB_FILE] = libFile;
|
||||
updateFromFile( m_semiModel, libFile, ".model" );
|
||||
}
|
||||
break;
|
||||
|
||||
case SP_SUBCKT:
|
||||
m_notebook->SetSelection( m_notebook->FindPage( m_ic ) );
|
||||
m_icModel->SetValue( m_fieldsTmp[SF_MODEL] );
|
||||
m_icLib->SetValue( m_fieldsTmp[SF_LIB_FILE] );
|
||||
|
||||
if( !empty( m_icLib ) )
|
||||
{
|
||||
const wxString& libFile = m_icLib->GetValue();
|
||||
m_fieldsTmp[SF_LIB_FILE] = libFile;
|
||||
updateFromFile( m_icModel, libFile, ".subckt" );
|
||||
}
|
||||
break;
|
||||
|
||||
case SP_VSOURCE:
|
||||
case SP_ISOURCE:
|
||||
if( !parsePowerSource( m_fieldsTmp[SF_MODEL] ) )
|
||||
return false;
|
||||
|
||||
m_notebook->SetSelection( m_notebook->FindPage( m_power ) );
|
||||
m_pwrType->SetSelection( primitive == SP_ISOURCE ? 1 : 0 );
|
||||
break;
|
||||
|
||||
default:
|
||||
//wxASSERT_MSG( false, "Unhandled Spice primitive type" );
|
||||
break;
|
||||
}
|
||||
|
||||
m_disabled->SetValue( !NETLIST_EXPORTER_PSPICE::StringToBool( m_fieldsTmp[SF_ENABLED] ) );
|
||||
|
||||
// Check if node sequence is different than the default one
|
||||
if( m_fieldsTmp[SF_NODE_SEQUENCE]
|
||||
!= NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( SF_NODE_SEQUENCE, &m_component, 0 ) )
|
||||
{
|
||||
m_nodeSeqCheck->SetValue( true );
|
||||
m_nodeSeqVal->SetValue( m_fieldsTmp[SF_NODE_SEQUENCE] );
|
||||
}
|
||||
|
||||
return DIALOG_SPICE_MODEL_BASE::TransferDataToWindow();
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SPICE_MODEL::parsePowerSource( const wxString& aModel )
|
||||
{
|
||||
if( aModel.IsEmpty() )
|
||||
return false;
|
||||
|
||||
wxStringTokenizer tokenizer( aModel, " ()" );
|
||||
wxString tkn = tokenizer.GetNextToken().Lower();
|
||||
|
||||
while( tokenizer.HasMoreTokens() )
|
||||
{
|
||||
// Variables used for generic values processing (filling out wxTextCtrls in sequence)
|
||||
bool genericProcessing = false;
|
||||
unsigned int genericReqParamsCount = 0;
|
||||
std::vector<wxTextCtrl*> genericControls;
|
||||
|
||||
if( tkn == "dc" )
|
||||
{
|
||||
// There might be an optional "dc" or "trans" directive, skip it
|
||||
if( tkn == "dc" || tkn == "trans" )
|
||||
tkn = tokenizer.GetNextToken().Lower();
|
||||
|
||||
// DC value
|
||||
try
|
||||
{
|
||||
m_genDc->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else if( tkn == "ac" )
|
||||
{
|
||||
// AC magnitude
|
||||
try
|
||||
{
|
||||
tkn = tokenizer.GetNextToken().Lower();
|
||||
m_genAcMag->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// AC phase (optional)
|
||||
try
|
||||
{
|
||||
tkn = tokenizer.GetNextToken().Lower();
|
||||
m_genAcPhase->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
continue; // perhaps another directive
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else if( tkn == "pulse" )
|
||||
{
|
||||
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrPulse ) );
|
||||
|
||||
genericProcessing = true;
|
||||
genericReqParamsCount = 2;
|
||||
genericControls = { m_pulseInit, m_pulseNominal, m_pulseDelay,
|
||||
m_pulseRise, m_pulseFall, m_pulseWidth, m_pulsePeriod };
|
||||
}
|
||||
|
||||
|
||||
else if( tkn == "sin" )
|
||||
{
|
||||
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrSin ) );
|
||||
|
||||
genericProcessing = true;
|
||||
genericReqParamsCount = 2;
|
||||
genericControls = { m_sinOffset, m_sinAmplitude, m_sinFreq, m_sinDelay, m_sinDampFactor };
|
||||
}
|
||||
|
||||
|
||||
else if( tkn == "exp" )
|
||||
{
|
||||
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrExp ) );
|
||||
|
||||
genericProcessing = true;
|
||||
genericReqParamsCount = 2;
|
||||
genericControls = { m_expInit, m_expPulsed,
|
||||
m_expRiseDelay, m_expRiseConst, m_expFallDelay, m_expFallConst };
|
||||
}
|
||||
|
||||
|
||||
else if( tkn == "pwl" )
|
||||
{
|
||||
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrPwl ) );
|
||||
|
||||
try
|
||||
{
|
||||
while( tokenizer.HasMoreTokens() )
|
||||
{
|
||||
tkn = tokenizer.GetNextToken();
|
||||
SPICE_VALUE time( tkn );
|
||||
|
||||
tkn = tokenizer.GetNextToken();
|
||||
SPICE_VALUE value( tkn );
|
||||
|
||||
addPwlValue( time.ToSpiceString(), value.ToSpiceString() );
|
||||
}
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
// Unhandled power source type
|
||||
wxASSERT_MSG( false, "Unhandled power source type" );
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if( genericProcessing )
|
||||
{
|
||||
try
|
||||
{
|
||||
for( unsigned int i = 0; i < genericControls.size(); ++i )
|
||||
{
|
||||
// If there are no more tokens, let's check if we got at least required fields
|
||||
if( !tokenizer.HasMoreTokens() )
|
||||
return ( i >= genericReqParamsCount );
|
||||
|
||||
tkn = tokenizer.GetNextToken().Lower();
|
||||
genericControls[i]->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
|
||||
}
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the next token now, so if any of the branches catches an expection, try to
|
||||
// process it in another branch
|
||||
tkn = tokenizer.GetNextToken().Lower();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SPICE_MODEL::generatePowerSource( wxString& aTarget ) const
|
||||
{
|
||||
wxString acdc, trans;
|
||||
wxWindow* page = m_powerNotebook->GetCurrentPage();
|
||||
bool useTrans = true; // shall we use the transient command part?
|
||||
|
||||
// Variables for generic processing
|
||||
bool genericProcessing = false;
|
||||
unsigned int genericReqParamsCount = 0;
|
||||
std::vector<wxTextCtrl*> genericControls;
|
||||
|
||||
/// DC / AC section
|
||||
// If SPICE_VALUE can be properly constructed, then it is a valid value
|
||||
try
|
||||
{
|
||||
if( !empty( m_genDc ) )
|
||||
acdc += wxString::Format( "dc %s ", SPICE_VALUE( m_genDc->GetValue() ).ToSpiceString() );
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
DisplayError( NULL, wxT( "Invalid DC value" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if( !empty( m_genAcMag ) )
|
||||
{
|
||||
acdc += wxString::Format( "ac %s ", SPICE_VALUE( m_genAcMag->GetValue() ).ToSpiceString() );
|
||||
|
||||
if( !empty( m_genAcPhase ) )
|
||||
acdc += wxString::Format( "%s ", SPICE_VALUE( m_genAcPhase->GetValue() ).ToSpiceString() );
|
||||
}
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
DisplayError( NULL, wxT( "Invalid AC magnitude or phase" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Transient section
|
||||
if( page == m_pwrPulse )
|
||||
{
|
||||
if( !m_pwrPulse->Validate() )
|
||||
return false;
|
||||
|
||||
genericProcessing = true;
|
||||
trans += "pulse";
|
||||
genericReqParamsCount = 2;
|
||||
genericControls = { m_pulseInit, m_pulseNominal, m_pulseDelay,
|
||||
m_pulseRise, m_pulseFall, m_pulseWidth, m_pulsePeriod };
|
||||
}
|
||||
|
||||
|
||||
else if( page == m_pwrSin )
|
||||
{
|
||||
if( !m_pwrSin->Validate() )
|
||||
return false;
|
||||
|
||||
genericProcessing = true;
|
||||
trans += "sin";
|
||||
genericReqParamsCount = 2;
|
||||
genericControls = { m_sinOffset, m_sinAmplitude, m_sinFreq, m_sinDelay, m_sinDampFactor };
|
||||
}
|
||||
|
||||
|
||||
else if( page == m_pwrExp )
|
||||
{
|
||||
if( !m_pwrExp->Validate() )
|
||||
return false;
|
||||
|
||||
genericProcessing = true;
|
||||
trans += "exp";
|
||||
genericReqParamsCount = 2;
|
||||
genericControls = { m_expInit, m_expPulsed,
|
||||
m_expRiseDelay, m_expRiseConst, m_expFallDelay, m_expFallConst };
|
||||
}
|
||||
|
||||
|
||||
else if( page == m_pwrPwl )
|
||||
{
|
||||
if( m_pwlValList->GetItemCount() > 0 )
|
||||
{
|
||||
trans += "pwl(";
|
||||
|
||||
for( int i = 0; i < m_pwlValList->GetItemCount(); ++i )
|
||||
{
|
||||
trans += wxString::Format( "%s %s ", m_pwlValList->GetItemText( i, m_pwlTimeCol ),
|
||||
m_pwlValList->GetItemText( i, m_pwlValueCol ) );
|
||||
}
|
||||
|
||||
trans.Trim();
|
||||
trans += ")";
|
||||
}
|
||||
}
|
||||
|
||||
if( genericProcessing )
|
||||
{
|
||||
bool finished = false;
|
||||
unsigned int paramCounter = 0;
|
||||
|
||||
trans += "(";
|
||||
|
||||
for( auto textCtrl : genericControls )
|
||||
{
|
||||
if( empty( textCtrl ) )
|
||||
{
|
||||
finished = true;
|
||||
|
||||
if( paramCounter < genericReqParamsCount )
|
||||
{
|
||||
if( paramCounter == 0 )
|
||||
{
|
||||
// It is fine, no parameters were entered
|
||||
useTrans = false;
|
||||
break;
|
||||
}
|
||||
|
||||
DisplayError( NULL,
|
||||
wxString::Format( wxT( "You need to specify at least the "
|
||||
"first %d parameters for the transient source" ),
|
||||
genericReqParamsCount ) );
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if( finished )
|
||||
{
|
||||
DisplayError( NULL, wxT( "You cannot leave interleaved blank "
|
||||
"spaces for the transient source" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
trans += wxString::Format( "%s ", textCtrl->GetValue() );
|
||||
++paramCounter;
|
||||
}
|
||||
|
||||
trans.Trim();
|
||||
trans += ")";
|
||||
}
|
||||
|
||||
aTarget = acdc;
|
||||
|
||||
if( useTrans )
|
||||
aTarget += trans;
|
||||
|
||||
aTarget.Trim( false );
|
||||
aTarget.Trim( true );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SPICE_MODEL::updateFromFile( wxComboBox* aComboBox,
|
||||
const wxString& aFilePath, const wxString& aKeyword )
|
||||
{
|
||||
wxString curValue = aComboBox->GetValue();
|
||||
const wxString keyword( aKeyword.Lower() );
|
||||
wxFileName filePath( aFilePath );
|
||||
|
||||
if( !filePath.Exists() )
|
||||
{
|
||||
// Look for the file in the project path
|
||||
filePath.SetPath( Prj().GetProjectPath() );
|
||||
}
|
||||
|
||||
wxTextFile file;
|
||||
|
||||
if( !file.Open( filePath.GetFullPath() ) )
|
||||
return;
|
||||
|
||||
aComboBox->Clear();
|
||||
|
||||
// Process the file, looking for components
|
||||
for( wxString line = file.GetFirstLine().Lower(); !file.Eof(); line = file.GetNextLine() )
|
||||
{
|
||||
wxStringTokenizer tokenizer( line, " " );
|
||||
|
||||
while( tokenizer.HasMoreTokens() )
|
||||
{
|
||||
wxString token = tokenizer.GetNextToken().Lower();
|
||||
|
||||
if( token == keyword )
|
||||
{
|
||||
token = tokenizer.GetNextToken();
|
||||
|
||||
if( !token.IsEmpty() )
|
||||
aComboBox->Append( token );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Restore the previous value or if there is none - pick the first one from the loaded library
|
||||
if( !curValue.IsEmpty() )
|
||||
aComboBox->SetValue( curValue );
|
||||
else if( aComboBox->GetCount() > 0 )
|
||||
aComboBox->SetSelection( 0 );
|
||||
}
|
||||
|
||||
|
||||
SCH_FIELD& DIALOG_SPICE_MODEL::getField( int aFieldType )
|
||||
{
|
||||
const wxString& spiceField = NETLIST_EXPORTER_PSPICE::GetSpiceFieldName( (SPICE_FIELD) aFieldType );
|
||||
|
||||
auto fieldIt = std::find_if( m_fields.begin(), m_fields.end(), [&]( const SCH_FIELD& f ) {
|
||||
return f.GetName() == spiceField;
|
||||
} );
|
||||
|
||||
// Found one, so return it
|
||||
if( fieldIt != m_fields.end() )
|
||||
return *fieldIt;
|
||||
|
||||
// Create a new field with requested name
|
||||
m_fields.emplace_back( wxPoint(), m_fields.size(), &m_component, spiceField );
|
||||
return m_fields.back();
|
||||
}
|
||||
|
||||
|
||||
bool DIALOG_SPICE_MODEL::addPwlValue( const wxString& aTime, const wxString& aValue )
|
||||
{
|
||||
// TODO execute validators
|
||||
if( aTime.IsEmpty() || aValue.IsEmpty() )
|
||||
return false;
|
||||
|
||||
long idx = m_pwlValList->InsertItem( m_pwlTimeCol, aTime );
|
||||
m_pwlValList->SetItem( idx, m_pwlValueCol, aValue );
|
||||
|
||||
// There is no wxString::ToFloat, but we need to guarantee it fits in 4 bytes
|
||||
double timeD;
|
||||
float timeF;
|
||||
m_pwlTime->GetValue().ToDouble( &timeD );
|
||||
timeF = timeD;
|
||||
|
||||
// Store the time value, so the entries can be sorted
|
||||
m_pwlValList->SetItemData( idx, *reinterpret_cast<long*>( &timeF ) );
|
||||
|
||||
// Sort items by timestamp
|
||||
m_pwlValList->SortItems( comparePwlValues, -1 );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SPICE_MODEL::onSemiSelectLib( wxCommandEvent& event )
|
||||
{
|
||||
wxFileDialog openDlg( this, wxT( "Select library" ),
|
||||
wxFileName( m_semiLib->GetValue() ).GetPath(), "",
|
||||
"Spice library file (*.lib)|*.lib;*.LIB|Any file|*",
|
||||
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
|
||||
|
||||
if( openDlg.ShowModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
||||
wxFileName libPath( openDlg.GetPath() );
|
||||
|
||||
// Try to convert the path to relative to project
|
||||
if( libPath.MakeRelativeTo( Prj().GetProjectPath() ) && !libPath.GetFullPath().StartsWith( ".." ) )
|
||||
m_semiLib->SetValue( libPath.GetFullPath() );
|
||||
else
|
||||
m_semiLib->SetValue( openDlg.GetPath() );
|
||||
|
||||
updateFromFile( m_semiModel, openDlg.GetPath(), ".model" );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SPICE_MODEL::onSelectIcLib( wxCommandEvent& event )
|
||||
{
|
||||
wxFileDialog openDlg( this, wxT( "Select library" ),
|
||||
wxFileName( m_icLib->GetValue() ).GetPath(), "",
|
||||
"Spice library file (*.lib)|*.lib;*.LIB|Any file|*",
|
||||
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
|
||||
|
||||
if( openDlg.ShowModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
||||
wxFileName libPath( openDlg.GetPath() );
|
||||
|
||||
// Try to convert the path to relative to project
|
||||
if( libPath.MakeRelativeTo( Prj().GetProjectPath() ) && !libPath.GetFullPath().StartsWith( ".." ) )
|
||||
m_icLib->SetValue( libPath.GetFullPath() );
|
||||
else
|
||||
m_icLib->SetValue( openDlg.GetPath() );
|
||||
|
||||
updateFromFile( m_icModel, openDlg.GetPath(), ".subckt" );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SPICE_MODEL::onPwlAdd( wxCommandEvent& event )
|
||||
{
|
||||
addPwlValue( m_pwlTime->GetValue(), m_pwlValue->GetValue() );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SPICE_MODEL::onPwlRemove( wxCommandEvent& event )
|
||||
{
|
||||
long idx = m_pwlValList->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
|
||||
m_pwlValList->DeleteItem( idx );
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef DIALOG_SPICE_MODEL_H
|
||||
#define DIALOG_SPICE_MODEL_H
|
||||
|
||||
#include "dialog_spice_model_base.h"
|
||||
|
||||
#include <sim/spice_value.h>
|
||||
#include <sch_component.h>
|
||||
|
||||
#include <wx/valnum.h>
|
||||
|
||||
class DIALOG_SPICE_MODEL : public DIALOG_SPICE_MODEL_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_SPICE_MODEL( wxWindow* aParent, SCH_COMPONENT& aComponent, SCH_FIELDS& aSchFields );
|
||||
|
||||
private:
|
||||
/**
|
||||
* Parse a string describing a power source, so appropriate settings are checked in the dialog
|
||||
* @param aModel contains the string to be parse (e.g. sin(0 1 10k))
|
||||
* @return True if the input string was parsed without errors.
|
||||
*/
|
||||
bool parsePowerSource( const wxString& aModel );
|
||||
|
||||
/**
|
||||
* Generates a string to describe power source parameters, basing on the current selection.
|
||||
* If there are missing fields, it will not modify the target string.
|
||||
* @param aTarget is the destination for the generated string.
|
||||
* @return True if the string was saved successfully.
|
||||
*/
|
||||
bool generatePowerSource( wxString& aTarget ) const;
|
||||
|
||||
/**
|
||||
* Loads a list of components from a file and adds them to a combo box.
|
||||
* @param aComboBox is the target combo box
|
||||
* @param aFilePath is the file to be processed
|
||||
* @param aKeyword is the keyword to select the type of components (e.g. "subckt" or "model")
|
||||
*/
|
||||
void updateFromFile( wxComboBox* aComboBox, const wxString& aFilePath, const wxString& aKeyword );
|
||||
|
||||
/**
|
||||
* Returns or creates a field in the edited schematic fields vector.
|
||||
* @param aFieldType is an SPICE_FIELD enum value.
|
||||
* @return Requested field.
|
||||
*/
|
||||
SCH_FIELD& getField( int aFieldType );
|
||||
|
||||
/**
|
||||
* Adds a value to the PWL values list.
|
||||
* @param aTime is the time value.
|
||||
* @param aValue is the source value at the given time.
|
||||
* @return True if request has completed successfully, false if the data is invalid.
|
||||
*/
|
||||
bool addPwlValue( const wxString& aTime, const wxString& aValue );
|
||||
|
||||
bool TransferDataFromWindow() override;
|
||||
bool TransferDataToWindow() override;
|
||||
|
||||
// Event handlers
|
||||
void onSemiSelectLib( wxCommandEvent& event ) override;
|
||||
void onSelectIcLib( wxCommandEvent& event ) override;
|
||||
void onPwlAdd( wxCommandEvent& event ) override;
|
||||
void onPwlRemove( wxCommandEvent& event ) override;
|
||||
|
||||
///> Edited component
|
||||
SCH_COMPONENT& m_component;
|
||||
|
||||
///> Fields from the component properties dialog
|
||||
SCH_FIELDS& m_fields;
|
||||
|
||||
///> Temporary field values
|
||||
std::map<int, wxString> m_fieldsTmp;
|
||||
|
||||
///> Column identifiers for PWL power source value list
|
||||
long m_pwlTimeCol, m_pwlValueCol;
|
||||
|
||||
SPICE_VALIDATOR m_spiceValidator;
|
||||
SPICE_VALIDATOR m_spiceEmptyValidator;
|
||||
wxTextValidator m_notEmptyValidator;
|
||||
};
|
||||
|
||||
#endif /* DIALOG_SPICE_MODEL_H */
|
|
@ -0,0 +1,492 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_spice_model_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_SPICE_MODEL_BASE::DIALOG_SPICE_MODEL_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* bSizer1;
|
||||
bSizer1 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_passive = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxFlexGridSizer* fgSizer1;
|
||||
fgSizer1 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer1->AddGrowableCol( 0 );
|
||||
fgSizer1->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText2 = new wxStaticText( m_passive, wxID_ANY, _("Type"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText2->Wrap( -1 );
|
||||
fgSizer1->Add( m_staticText2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pasType = new wxComboBox( m_passive, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
|
||||
m_pasType->Append( _("Resistor") );
|
||||
m_pasType->Append( _("Capacitor") );
|
||||
m_pasType->Append( _("Inductor") );
|
||||
fgSizer1->Add( m_pasType, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText3 = new wxStaticText( m_passive, wxID_ANY, _("Value"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText3->Wrap( -1 );
|
||||
fgSizer1->Add( m_staticText3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pasValue = new wxTextCtrl( m_passive, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_pasValue->SetMinSize( wxSize( 200,-1 ) );
|
||||
|
||||
fgSizer1->Add( m_pasValue, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_passive->SetSizer( fgSizer1 );
|
||||
m_passive->Layout();
|
||||
fgSizer1->Fit( m_passive );
|
||||
m_notebook->AddPage( m_passive, _("Passive"), false );
|
||||
m_semiconductor = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxFlexGridSizer* fgSizer3;
|
||||
fgSizer3 = new wxFlexGridSizer( 0, 3, 0, 0 );
|
||||
fgSizer3->AddGrowableCol( 0 );
|
||||
fgSizer3->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText4 = new wxStaticText( m_semiconductor, wxID_ANY, _("Type"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText4->Wrap( -1 );
|
||||
fgSizer3->Add( m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_semiType = new wxComboBox( m_semiconductor, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
|
||||
m_semiType->Append( _("Diode") );
|
||||
m_semiType->Append( _("Bipolar transistor (BJT)") );
|
||||
m_semiType->Append( _("MOSFET") );
|
||||
fgSizer3->Add( m_semiType, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText5 = new wxStaticText( m_semiconductor, wxID_ANY, _("Model"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText5->Wrap( -1 );
|
||||
fgSizer3->Add( m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_semiModel = new wxComboBox( m_semiconductor, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
fgSizer3->Add( m_semiModel, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText7 = new wxStaticText( m_semiconductor, wxID_ANY, _("Library"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText7->Wrap( -1 );
|
||||
fgSizer3->Add( m_staticText7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_semiLib = new wxTextCtrl( m_semiconductor, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
|
||||
fgSizer3->Add( m_semiLib, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_semiSelectLib = new wxButton( m_semiconductor, wxID_ANY, _("Select file..."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer3->Add( m_semiSelectLib, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
|
||||
m_semiconductor->SetSizer( fgSizer3 );
|
||||
m_semiconductor->Layout();
|
||||
fgSizer3->Fit( m_semiconductor );
|
||||
m_notebook->AddPage( m_semiconductor, _("Semiconductor"), false );
|
||||
m_ic = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxFlexGridSizer* fgSizer4;
|
||||
fgSizer4 = new wxFlexGridSizer( 0, 3, 0, 0 );
|
||||
fgSizer4->AddGrowableCol( 0 );
|
||||
fgSizer4->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText8 = new wxStaticText( m_ic, wxID_ANY, _("Model"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText8->Wrap( -1 );
|
||||
fgSizer4->Add( m_staticText8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_icModel = new wxComboBox( m_ic, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
m_icModel->SetMinSize( wxSize( 200,-1 ) );
|
||||
|
||||
fgSizer4->Add( m_icModel, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText9 = new wxStaticText( m_ic, wxID_ANY, _("Library"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText9->Wrap( -1 );
|
||||
fgSizer4->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_icLib = new wxTextCtrl( m_ic, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
|
||||
fgSizer4->Add( m_icLib, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_icSelectLib = new wxButton( m_ic, wxID_ANY, _("Select file..."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer4->Add( m_icSelectLib, 0, wxALL, 5 );
|
||||
|
||||
|
||||
m_ic->SetSizer( fgSizer4 );
|
||||
m_ic->Layout();
|
||||
fgSizer4->Fit( m_ic );
|
||||
m_notebook->AddPage( m_ic, _("Integrated circuit"), false );
|
||||
m_power = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizer4;
|
||||
bSizer4 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* sbSizer1;
|
||||
sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( m_power, wxID_ANY, _("DC/AC analysis") ), wxVERTICAL );
|
||||
|
||||
wxFlexGridSizer* fgSizer6;
|
||||
fgSizer6 = new wxFlexGridSizer( 0, 4, 0, 0 );
|
||||
fgSizer6->AddGrowableCol( 0 );
|
||||
fgSizer6->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText10 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("DC [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText10->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_genDc = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_genDc->SetMinSize( wxSize( 60,-1 ) );
|
||||
|
||||
fgSizer6->Add( m_genDc, 0, wxALL, 5 );
|
||||
|
||||
|
||||
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText11 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("AC magnitude [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText11->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_genAcMag = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_genAcMag->SetMinSize( wxSize( 60,-1 ) );
|
||||
|
||||
fgSizer6->Add( m_genAcMag, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText12 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("AC phase [rad]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText12->Wrap( -1 );
|
||||
fgSizer6->Add( m_staticText12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_genAcPhase = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_genAcPhase->SetMinSize( wxSize( 60,-1 ) );
|
||||
|
||||
fgSizer6->Add( m_genAcPhase, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
sbSizer1->Add( fgSizer6, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizer4->Add( sbSizer1, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbSizer3;
|
||||
sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_power, wxID_ANY, _("Transient analysis") ), wxVERTICAL );
|
||||
|
||||
m_powerNotebook = new wxNotebook( sbSizer3->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_pwrPulse = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxFlexGridSizer* fgSizer7;
|
||||
fgSizer7 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer7->AddGrowableCol( 0 );
|
||||
fgSizer7->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText13 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Initial value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText13->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulseInit = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_pulseInit->SetMinSize( wxSize( 100,-1 ) );
|
||||
|
||||
fgSizer7->Add( m_pulseInit, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText14 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Pulsed value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText14->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulseNominal = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer7->Add( m_pulseNominal, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText15 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Delay time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText15->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulseDelay = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer7->Add( m_pulseDelay, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText16 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Rise time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText16->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulseRise = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer7->Add( m_pulseRise, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText17 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Fall time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText17->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulseFall = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer7->Add( m_pulseFall, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText18 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Pulse width [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText18->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText18, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulseWidth = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer7->Add( m_pulseWidth, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText20 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Period [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText20->Wrap( -1 );
|
||||
fgSizer7->Add( m_staticText20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pulsePeriod = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer7->Add( m_pulsePeriod, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pwrPulse->SetSizer( fgSizer7 );
|
||||
m_pwrPulse->Layout();
|
||||
fgSizer7->Fit( m_pwrPulse );
|
||||
m_powerNotebook->AddPage( m_pwrPulse, _("Pulse"), true );
|
||||
m_pwrSin = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxFlexGridSizer* fgSizer8;
|
||||
fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer8->AddGrowableCol( 0 );
|
||||
fgSizer8->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText21 = new wxStaticText( m_pwrSin, wxID_ANY, _("DC offset [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText21->Wrap( -1 );
|
||||
fgSizer8->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_sinOffset = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_sinOffset->SetMinSize( wxSize( 100,-1 ) );
|
||||
|
||||
fgSizer8->Add( m_sinOffset, 0, wxALL, 5 );
|
||||
|
||||
m_staticText22 = new wxStaticText( m_pwrSin, wxID_ANY, _("Amplitude [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText22->Wrap( -1 );
|
||||
fgSizer8->Add( m_staticText22, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_sinAmplitude = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer8->Add( m_sinAmplitude, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText23 = new wxStaticText( m_pwrSin, wxID_ANY, _("Frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText23->Wrap( -1 );
|
||||
fgSizer8->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_sinFreq = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer8->Add( m_sinFreq, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText24 = new wxStaticText( m_pwrSin, wxID_ANY, _("Delay [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText24->Wrap( -1 );
|
||||
fgSizer8->Add( m_staticText24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_sinDelay = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer8->Add( m_sinDelay, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText25 = new wxStaticText( m_pwrSin, wxID_ANY, _("Damping factor [1/s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText25->Wrap( -1 );
|
||||
fgSizer8->Add( m_staticText25, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_sinDampFactor = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer8->Add( m_sinDampFactor, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pwrSin->SetSizer( fgSizer8 );
|
||||
m_pwrSin->Layout();
|
||||
fgSizer8->Fit( m_pwrSin );
|
||||
m_powerNotebook->AddPage( m_pwrSin, _("Sinusoidal"), false );
|
||||
m_pwrExp = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxFlexGridSizer* fgSizer9;
|
||||
fgSizer9 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer9->AddGrowableCol( 0 );
|
||||
fgSizer9->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText26 = new wxStaticText( m_pwrExp, wxID_ANY, _("Initial value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText26->Wrap( -1 );
|
||||
fgSizer9->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_expInit = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_expInit->SetMinSize( wxSize( 100,-1 ) );
|
||||
|
||||
fgSizer9->Add( m_expInit, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText27 = new wxStaticText( m_pwrExp, wxID_ANY, _("Pulsed value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText27->Wrap( -1 );
|
||||
fgSizer9->Add( m_staticText27, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_expPulsed = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer9->Add( m_expPulsed, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText28 = new wxStaticText( m_pwrExp, wxID_ANY, _("Rise delay time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText28->Wrap( -1 );
|
||||
fgSizer9->Add( m_staticText28, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_expRiseDelay = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer9->Add( m_expRiseDelay, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText29 = new wxStaticText( m_pwrExp, wxID_ANY, _("Rise time constant [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText29->Wrap( -1 );
|
||||
fgSizer9->Add( m_staticText29, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_expRiseConst = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer9->Add( m_expRiseConst, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText30 = new wxStaticText( m_pwrExp, wxID_ANY, _("Fall delay time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText30->Wrap( -1 );
|
||||
fgSizer9->Add( m_staticText30, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_expFallDelay = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer9->Add( m_expFallDelay, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText31 = new wxStaticText( m_pwrExp, wxID_ANY, _("Fall time constant [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText31->Wrap( -1 );
|
||||
fgSizer9->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_expFallConst = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer9->Add( m_expFallConst, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_pwrExp->SetSizer( fgSizer9 );
|
||||
m_pwrExp->Layout();
|
||||
fgSizer9->Fit( m_pwrExp );
|
||||
m_powerNotebook->AddPage( m_pwrExp, _("Exponential"), false );
|
||||
m_pwrPwl = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pwrPwl->SetToolTip( _("Piece-wise linear") );
|
||||
|
||||
wxFlexGridSizer* fgSizer15;
|
||||
fgSizer15 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer15->AddGrowableCol( 0 );
|
||||
fgSizer15->AddGrowableRow( 1 );
|
||||
fgSizer15->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer15->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL );
|
||||
|
||||
wxFlexGridSizer* fgSizer10;
|
||||
fgSizer10 = new wxFlexGridSizer( 0, 2, 0, 0 );
|
||||
fgSizer10->AddGrowableCol( 0 );
|
||||
fgSizer10->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer10->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_staticText34 = new wxStaticText( m_pwrPwl, wxID_ANY, _("Time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText34->Wrap( -1 );
|
||||
fgSizer10->Add( m_staticText34, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pwlTime = new wxTextCtrl( m_pwrPwl, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_pwlTime->SetMinSize( wxSize( 100,-1 ) );
|
||||
|
||||
fgSizer10->Add( m_pwlTime, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_staticText35 = new wxStaticText( m_pwrPwl, wxID_ANY, _("Value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText35->Wrap( -1 );
|
||||
fgSizer10->Add( m_staticText35, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pwlValue = new wxTextCtrl( m_pwrPwl, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer10->Add( m_pwlValue, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
fgSizer15->Add( fgSizer10, 1, wxEXPAND, 5 );
|
||||
|
||||
m_pwlAddButton = new wxButton( m_pwrPwl, wxID_ANY, _("Add"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer15->Add( m_pwlAddButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_pwlValList = new wxListCtrl( m_pwrPwl, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL );
|
||||
m_pwlValList->SetMinSize( wxSize( 200,-1 ) );
|
||||
|
||||
fgSizer15->Add( m_pwlValList, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_pwlRemoveBtn = new wxButton( m_pwrPwl, wxID_ANY, _("Remove"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer15->Add( m_pwlRemoveBtn, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
|
||||
m_pwrPwl->SetSizer( fgSizer15 );
|
||||
m_pwrPwl->Layout();
|
||||
fgSizer15->Fit( m_pwrPwl );
|
||||
m_powerNotebook->AddPage( m_pwrPwl, _("Piece-wise Linear"), false );
|
||||
m_pwrFm = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pwrFm->Hide();
|
||||
|
||||
m_powerNotebook->AddPage( m_pwrFm, _("FM"), false );
|
||||
m_pwrAm = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pwrAm->Hide();
|
||||
|
||||
m_powerNotebook->AddPage( m_pwrAm, _("AM"), false );
|
||||
m_pwrTransNoise = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pwrTransNoise->Hide();
|
||||
|
||||
m_powerNotebook->AddPage( m_pwrTransNoise, _("Transient noise"), false );
|
||||
m_pwrRandom = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pwrRandom->Hide();
|
||||
|
||||
m_powerNotebook->AddPage( m_pwrRandom, _("Random"), false );
|
||||
m_pwrExtData = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_pwrExtData->Hide();
|
||||
|
||||
m_powerNotebook->AddPage( m_pwrExtData, _("External data"), false );
|
||||
|
||||
sbSizer3->Add( m_powerNotebook, 1, wxEXPAND | wxALL, 5 );
|
||||
|
||||
|
||||
bSizer4->Add( sbSizer3, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxString m_pwrTypeChoices[] = { _("Voltage"), _("Current") };
|
||||
int m_pwrTypeNChoices = sizeof( m_pwrTypeChoices ) / sizeof( wxString );
|
||||
m_pwrType = new wxRadioBox( m_power, wxID_ANY, _("Source type"), wxDefaultPosition, wxDefaultSize, m_pwrTypeNChoices, m_pwrTypeChoices, 1, wxRA_SPECIFY_ROWS );
|
||||
m_pwrType->SetSelection( 0 );
|
||||
bSizer4->Add( m_pwrType, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_power->SetSizer( bSizer4 );
|
||||
m_power->Layout();
|
||||
bSizer4->Fit( m_power );
|
||||
m_notebook->AddPage( m_power, _("Source"), true );
|
||||
|
||||
bSizer1->Add( m_notebook, 1, wxEXPAND | wxALL, 5 );
|
||||
|
||||
m_disabled = new wxCheckBox( this, wxID_ANY, _("Disable component for simulation"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer1->Add( m_disabled, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
wxBoxSizer* bSizer2;
|
||||
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
m_nodeSeqCheck = new wxCheckBox( this, wxID_ANY, _("Alternate node sequence:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer2->Add( m_nodeSeqCheck, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_nodeSeqVal = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_nodeSeqVal->SetMinSize( wxSize( 200,-1 ) );
|
||||
|
||||
bSizer2->Add( m_nodeSeqVal, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizer1->Add( bSizer2, 0, wxEXPAND, 5 );
|
||||
|
||||
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||
m_sdbSizer->Realize();
|
||||
|
||||
bSizer1->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizer1 );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
m_semiSelectLib->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSemiSelectLib ), NULL, this );
|
||||
m_icSelectLib->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSelectIcLib ), NULL, this );
|
||||
m_pwlAddButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlAdd ), NULL, this );
|
||||
m_pwlRemoveBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlRemove ), NULL, this );
|
||||
}
|
||||
|
||||
DIALOG_SPICE_MODEL_BASE::~DIALOG_SPICE_MODEL_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_semiSelectLib->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSemiSelectLib ), NULL, this );
|
||||
m_icSelectLib->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSelectIcLib ), NULL, this );
|
||||
m_pwlAddButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlAdd ), NULL, this );
|
||||
m_pwlRemoveBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlRemove ), NULL, this );
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,151 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DIALOG_SPICE_MODEL_BASE_H__
|
||||
#define __DIALOG_SPICE_MODEL_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class DIALOG_SHIM;
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/combobox.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/panel.h>
|
||||
#include <wx/bitmap.h>
|
||||
#include <wx/image.h>
|
||||
#include <wx/icon.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/radiobox.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_SPICE_MODEL_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_SPICE_MODEL_BASE : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxNotebook* m_notebook;
|
||||
wxPanel* m_passive;
|
||||
wxStaticText* m_staticText2;
|
||||
wxComboBox* m_pasType;
|
||||
wxStaticText* m_staticText3;
|
||||
wxTextCtrl* m_pasValue;
|
||||
wxPanel* m_semiconductor;
|
||||
wxStaticText* m_staticText4;
|
||||
wxComboBox* m_semiType;
|
||||
wxStaticText* m_staticText5;
|
||||
wxComboBox* m_semiModel;
|
||||
wxStaticText* m_staticText7;
|
||||
wxTextCtrl* m_semiLib;
|
||||
wxButton* m_semiSelectLib;
|
||||
wxPanel* m_ic;
|
||||
wxStaticText* m_staticText8;
|
||||
wxComboBox* m_icModel;
|
||||
wxStaticText* m_staticText9;
|
||||
wxTextCtrl* m_icLib;
|
||||
wxButton* m_icSelectLib;
|
||||
wxPanel* m_power;
|
||||
wxStaticText* m_staticText10;
|
||||
wxTextCtrl* m_genDc;
|
||||
wxStaticText* m_staticText11;
|
||||
wxTextCtrl* m_genAcMag;
|
||||
wxStaticText* m_staticText12;
|
||||
wxTextCtrl* m_genAcPhase;
|
||||
wxNotebook* m_powerNotebook;
|
||||
wxPanel* m_pwrPulse;
|
||||
wxStaticText* m_staticText13;
|
||||
wxTextCtrl* m_pulseInit;
|
||||
wxStaticText* m_staticText14;
|
||||
wxTextCtrl* m_pulseNominal;
|
||||
wxStaticText* m_staticText15;
|
||||
wxTextCtrl* m_pulseDelay;
|
||||
wxStaticText* m_staticText16;
|
||||
wxTextCtrl* m_pulseRise;
|
||||
wxStaticText* m_staticText17;
|
||||
wxTextCtrl* m_pulseFall;
|
||||
wxStaticText* m_staticText18;
|
||||
wxTextCtrl* m_pulseWidth;
|
||||
wxStaticText* m_staticText20;
|
||||
wxTextCtrl* m_pulsePeriod;
|
||||
wxPanel* m_pwrSin;
|
||||
wxStaticText* m_staticText21;
|
||||
wxTextCtrl* m_sinOffset;
|
||||
wxStaticText* m_staticText22;
|
||||
wxTextCtrl* m_sinAmplitude;
|
||||
wxStaticText* m_staticText23;
|
||||
wxTextCtrl* m_sinFreq;
|
||||
wxStaticText* m_staticText24;
|
||||
wxTextCtrl* m_sinDelay;
|
||||
wxStaticText* m_staticText25;
|
||||
wxTextCtrl* m_sinDampFactor;
|
||||
wxPanel* m_pwrExp;
|
||||
wxStaticText* m_staticText26;
|
||||
wxTextCtrl* m_expInit;
|
||||
wxStaticText* m_staticText27;
|
||||
wxTextCtrl* m_expPulsed;
|
||||
wxStaticText* m_staticText28;
|
||||
wxTextCtrl* m_expRiseDelay;
|
||||
wxStaticText* m_staticText29;
|
||||
wxTextCtrl* m_expRiseConst;
|
||||
wxStaticText* m_staticText30;
|
||||
wxTextCtrl* m_expFallDelay;
|
||||
wxStaticText* m_staticText31;
|
||||
wxTextCtrl* m_expFallConst;
|
||||
wxPanel* m_pwrPwl;
|
||||
wxStaticText* m_staticText34;
|
||||
wxTextCtrl* m_pwlTime;
|
||||
wxStaticText* m_staticText35;
|
||||
wxTextCtrl* m_pwlValue;
|
||||
wxButton* m_pwlAddButton;
|
||||
wxListCtrl* m_pwlValList;
|
||||
wxButton* m_pwlRemoveBtn;
|
||||
wxPanel* m_pwrFm;
|
||||
wxPanel* m_pwrAm;
|
||||
wxPanel* m_pwrTransNoise;
|
||||
wxPanel* m_pwrRandom;
|
||||
wxPanel* m_pwrExtData;
|
||||
wxRadioBox* m_pwrType;
|
||||
wxCheckBox* m_disabled;
|
||||
wxCheckBox* m_nodeSeqCheck;
|
||||
wxTextCtrl* m_nodeSeqVal;
|
||||
wxStdDialogButtonSizer* m_sdbSizer;
|
||||
wxButton* m_sdbSizerOK;
|
||||
wxButton* m_sdbSizerCancel;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void onSemiSelectLib( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onSelectIcLib( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onPwlAdd( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onPwlRemove( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_SPICE_MODEL_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,768 ), long style = wxDEFAULT_DIALOG_STYLE );
|
||||
~DIALOG_SPICE_MODEL_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_SPICE_MODEL_BASE_H__
|
|
@ -0,0 +1,6 @@
|
|||
* Copyright © 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Linear Technology Corporation. All rights reserved.
|
||||
*
|
||||
* Mike Engelhardt
|
||||
*
|
||||
.model 1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)
|
||||
.model 1N4148 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)
|
|
@ -46,6 +46,7 @@
|
|||
#include <wildcards_and_files_ext.h>
|
||||
|
||||
#include <kiway.h>
|
||||
#include <sim/sim_plot_frame.h>
|
||||
|
||||
// The main sheet of the project
|
||||
SCH_SHEET* g_RootSheet = NULL;
|
||||
|
@ -70,6 +71,8 @@ static struct IFACE : public KIFACE_I
|
|||
|
||||
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 )
|
||||
{
|
||||
printf("Create class %d\n", aClassId);
|
||||
|
||||
switch( aClassId )
|
||||
{
|
||||
case FRAME_SCH:
|
||||
|
@ -92,6 +95,14 @@ static struct IFACE : public KIFACE_I
|
|||
}
|
||||
break;
|
||||
|
||||
#ifdef KICAD_SPICE
|
||||
case FRAME_SIMULATOR:
|
||||
{
|
||||
SIM_PLOT_FRAME* frame = new SIM_PLOT_FRAME( aKiway, aParent );
|
||||
return frame;
|
||||
}
|
||||
break;
|
||||
#endif /* KICAD_SPICE */
|
||||
|
||||
case FRAME_SCH_VIEWER:
|
||||
case FRAME_SCH_VIEWER_MODAL:
|
||||
|
@ -238,4 +249,3 @@ void IFACE::OnKifaceEnd()
|
|||
wxConfigSaveSetups( KifaceSettings(), cfg_params() );
|
||||
end_common();
|
||||
}
|
||||
|
||||
|
|
|
@ -251,10 +251,18 @@ enum id_eeschema_frm
|
|||
ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC,
|
||||
ID_SET_RELATIVE_OFFSET,
|
||||
|
||||
ID_END_EESCHEMA_ID_LIST,
|
||||
|
||||
ID_UPDATE_PCB_FROM_SCH,
|
||||
ID_UPDATE_SCH_FROM_PCB
|
||||
ID_UPDATE_SCH_FROM_PCB,
|
||||
|
||||
ID_SIM_RUN,
|
||||
ID_SIM_TUNE,
|
||||
ID_SIM_PROBE,
|
||||
ID_SIM_SETTINGS,
|
||||
ID_SIM_ADD_SIGNALS,
|
||||
ID_SIM_SHOW,
|
||||
|
||||
ID_END_EESCHEMA_ID_LIST
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -142,7 +142,7 @@ bool LIB_TEXT::Load( LINE_READER& aLineReader, wxString& errorMsg )
|
|||
|
||||
m_Size.y = m_Size.x;
|
||||
|
||||
if( strnicmp( tmp, "Italic", 6 ) == 0 )
|
||||
if( strncasecmp( tmp, "Italic", 6 ) == 0 )
|
||||
m_Italic = true;
|
||||
|
||||
if( thickness > 0 )
|
||||
|
|
|
@ -160,7 +160,7 @@ again." );
|
|||
while( *line == ' ' )
|
||||
line++;
|
||||
|
||||
if( strnicmp( line, "EELAYER END", 11 ) == 0 )
|
||||
if( strncasecmp( line, "EELAYER END", 11 ) == 0 )
|
||||
break; // end of not used header found
|
||||
}
|
||||
|
||||
|
@ -342,66 +342,66 @@ bool ReadSchemaDescr( LINE_READER* aLine, wxString& aMsgDiag, SCH_SCREEN* aScree
|
|||
|
||||
line = aLine->Line();
|
||||
|
||||
if( strnicmp( line, "$End", 4 ) == 0 )
|
||||
if( strncasecmp( line, "$End", 4 ) == 0 )
|
||||
{
|
||||
aScreen->SetTitleBlock( tb );
|
||||
break;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Sheet", 2 ) == 0 )
|
||||
if( strncasecmp( line, "Sheet", 2 ) == 0 )
|
||||
sscanf( line + 5, " %d %d",
|
||||
&aScreen->m_ScreenNumber, &aScreen->m_NumberOfScreens );
|
||||
|
||||
if( strnicmp( line, "Title", 2 ) == 0 )
|
||||
if( strncasecmp( line, "Title", 2 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetTitle( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Date", 2 ) == 0 )
|
||||
if( strncasecmp( line, "Date", 2 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetDate( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Rev", 2 ) == 0 )
|
||||
if( strncasecmp( line, "Rev", 2 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetRevision( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Comp", 4 ) == 0 )
|
||||
if( strncasecmp( line, "Comp", 4 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetCompany( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Comment1", 8 ) == 0 )
|
||||
if( strncasecmp( line, "Comment1", 8 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetComment1( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Comment2", 8 ) == 0 )
|
||||
if( strncasecmp( line, "Comment2", 8 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetComment2( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Comment3", 8 ) == 0 )
|
||||
if( strncasecmp( line, "Comment3", 8 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetComment3( FROM_UTF8( buf ) );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Comment4", 8 ) == 0 )
|
||||
if( strncasecmp( line, "Comment4", 8 ) == 0 )
|
||||
{
|
||||
ReadDelimitedText( buf, line, 256 );
|
||||
tb.SetComment4( FROM_UTF8( buf ) );
|
||||
|
|
|
@ -492,6 +492,16 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
|
|||
_( "Run CvPcb" ),
|
||||
KiBitmap( cvpcb_xpm ) );
|
||||
|
||||
toolsMenu->AppendSeparator();
|
||||
|
||||
#ifdef KICAD_SPICE
|
||||
// Simulator
|
||||
AddMenuItem( toolsMenu,
|
||||
ID_SIM_SHOW,
|
||||
_("Simula&tor"), _( "Simulate the circuit" ),
|
||||
wxNullBitmap );
|
||||
#endif /* KICAD_SPICE */
|
||||
|
||||
// Help Menu:
|
||||
wxMenu* helpMenu = new wxMenu;
|
||||
|
||||
|
|
|
@ -47,13 +47,6 @@ enum NETLIST_TYPE_ID {
|
|||
};
|
||||
|
||||
|
||||
/// Options for Spice netlist generation (OR'ed bits
|
||||
enum netlistOptions {
|
||||
NET_USE_X_PREFIX = 2, // for Spice netlist : change "U" and "IC" reference prefix to "X"
|
||||
NET_USE_NETCODES_AS_NETNAMES = 4 // for Spice netlist : use netcode numbers as netnames
|
||||
};
|
||||
|
||||
|
||||
#define NETLIST_HEAD_STRING "EESchema Netlist Version 1.1"
|
||||
|
||||
// Max pin number per component and footprint
|
||||
|
|
|
@ -23,149 +23,241 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "netlist_exporter_pspice.h"
|
||||
#include <fctsys.h>
|
||||
#include <build_version.h>
|
||||
#include <confirm.h>
|
||||
|
||||
#include <map>
|
||||
#include <search_stack.h>
|
||||
|
||||
#include <schframe.h>
|
||||
#include <netlist.h>
|
||||
#include <sch_reference_list.h>
|
||||
#include <class_netlist_object.h>
|
||||
|
||||
#include <wx/tokenzr.h>
|
||||
#include "netlist_exporter_pspice.h"
|
||||
#include <wx/regex.h>
|
||||
|
||||
bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsigned aNetlistOptions )
|
||||
{
|
||||
FILE* f = NULL;
|
||||
bool aUsePrefix = aNetlistOptions & NET_USE_X_PREFIX;
|
||||
bool aUseNetcodeAsNetName = aNetlistOptions & NET_USE_NETCODES_AS_NETNAMES;
|
||||
FILE_OUTPUTFORMATTER outputFile( aOutFileName, wxT( "wt" ), '\'' );
|
||||
|
||||
int ret = 0;
|
||||
int nbitems;
|
||||
wxString text;
|
||||
wxArrayString spiceCommandAtBeginFile;
|
||||
wxArrayString spiceCommandAtEndFile;
|
||||
wxString msg;
|
||||
wxString netName;
|
||||
return Format( &outputFile, aNetlistOptions );
|
||||
}
|
||||
|
||||
#define BUFYPOS_LEN 4
|
||||
wxChar bufnum[BUFYPOS_LEN + 1];
|
||||
std::vector<int> pinSequence; // numeric indices into m_SortedComponentPinList
|
||||
wxArrayString stdPinNameArray; // Array containing Standard Pin Names
|
||||
wxString delimeters = wxT( "{:,; }" );
|
||||
wxString disableStr = wxT( "N" );
|
||||
|
||||
if( ( f = wxFopen( aOutFileName, wxT( "wt" ) ) ) == NULL )
|
||||
{
|
||||
msg.Printf( _( "Failed to create file '%s'" ),
|
||||
GetChars( aOutFileName ) );
|
||||
DisplayError( NULL, msg );
|
||||
bool NETLIST_EXPORTER_PSPICE::Format( OUTPUTFORMATTER* aFormatter, unsigned aCtl )
|
||||
{
|
||||
// Netlist options
|
||||
const bool useNetcodeAsNetName = aCtl & NET_USE_NETCODES_AS_NETNAMES;
|
||||
|
||||
if( !ProcessNetlist( aCtl ) )
|
||||
return false;
|
||||
|
||||
aFormatter->Print( 0, ".title KiCad schematic\n" );
|
||||
|
||||
// Write .include directives
|
||||
for( auto lib : m_libraries )
|
||||
{
|
||||
if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) && m_paths )
|
||||
{
|
||||
// Look for the library in known search locations
|
||||
lib = m_paths->FindValidPath( lib );
|
||||
}
|
||||
|
||||
aFormatter->Print( 0, ".include %s\n", (const char*) lib.c_str() );
|
||||
}
|
||||
|
||||
ret |= fprintf( f, "* %s\n\n", TO_UTF8( aOutFileName ) );
|
||||
ret |= fprintf( f, "* %s (Spice format) creation date: %s\n\n",
|
||||
NETLIST_HEAD_STRING, TO_UTF8( DateAndTime() ) );
|
||||
for( const auto& item : m_spiceItems )
|
||||
{
|
||||
aFormatter->Print( 0, "%c%s ", item.m_primitive, (const char*) item.m_refName.c_str() );
|
||||
|
||||
// Pins to node mapping
|
||||
int activePinIndex = 0;
|
||||
|
||||
for( unsigned ii = 0; ii < item.m_pins.size(); ii++ )
|
||||
{
|
||||
// Case of Alt Sequence definition with Unused/Invalid Node index:
|
||||
// Valid used Node Indexes are in the set
|
||||
// {0,1,2,...m_item.m_pin.size()-1}
|
||||
if( !item.m_pinSequence.empty() )
|
||||
{
|
||||
// All Vector values must be less <= max package size
|
||||
// And Total Vector size should be <= package size
|
||||
if( ( (unsigned) item.m_pinSequence[ii] < item.m_pins.size() )
|
||||
&& ( ii < item.m_pinSequence.size() ) )
|
||||
{
|
||||
// Case of Alt Pin Sequence in control good Index:
|
||||
activePinIndex = item.m_pinSequence[ii];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Case of Alt Pin Sequence in control Bad Index or not using all
|
||||
// pins for simulation:
|
||||
wxASSERT_MSG( false, "Used an invalid pin number in node sequence" );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Case of Standard Pin Sequence in control:
|
||||
else
|
||||
{
|
||||
activePinIndex = ii;
|
||||
}
|
||||
|
||||
NETLIST_OBJECT* pin = item.m_pins[activePinIndex];
|
||||
assert( pin );
|
||||
wxString netName = pin->GetNetName();
|
||||
|
||||
if( useNetcodeAsNetName )
|
||||
{
|
||||
assert( m_netMap.count( netName ) );
|
||||
aFormatter->Print( 0, "%d ", m_netMap[netName] );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintPinNetName( netName , wxT( "N-%.6d" ), pin, useNetcodeAsNetName );
|
||||
|
||||
//Replace parenthesis with underscore to prevent parse issues with simulators
|
||||
netName.Replace( wxT( "(" ), wxT( "_" ) );
|
||||
netName.Replace( wxT( ")" ), wxT( "_" ) );
|
||||
|
||||
if( netName.IsEmpty() )
|
||||
netName = wxT( "?" );
|
||||
|
||||
aFormatter->Print( 0, "%s ", TO_UTF8( netName ) );
|
||||
}
|
||||
}
|
||||
|
||||
aFormatter->Print( 0, "%s\n", (const char*) item.m_model.c_str() );
|
||||
}
|
||||
|
||||
// Print out all directives found in the text fields on the schematics
|
||||
writeDirectives( aFormatter, aCtl );
|
||||
|
||||
aFormatter->Print( 0, ".end\n" );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
wxString NETLIST_EXPORTER_PSPICE::GetSpiceField( SPICE_FIELD aField,
|
||||
SCH_COMPONENT* aComponent, unsigned aCtl )
|
||||
{
|
||||
SCH_FIELD* field = aComponent->FindField( GetSpiceFieldName( aField ) );
|
||||
return field ? field->GetText() : GetSpiceFieldDefVal( aField, aComponent, aCtl );
|
||||
}
|
||||
|
||||
|
||||
wxString NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( SPICE_FIELD aField,
|
||||
SCH_COMPONENT* aComponent, unsigned aCtl )
|
||||
{
|
||||
switch( aField )
|
||||
{
|
||||
case SF_PRIMITIVE:
|
||||
{
|
||||
const wxString& refName = aComponent->GetField( REFERENCE )->GetText();
|
||||
|
||||
// Convert ICs to subcircuits
|
||||
if( aCtl & NET_USE_X_PREFIX && ( refName.StartsWith( "IC" ) || refName.StartsWith( "U" ) ) )
|
||||
return wxString( "X" );
|
||||
else
|
||||
return refName.GetChar( 0 );
|
||||
break;
|
||||
}
|
||||
|
||||
case SF_MODEL:
|
||||
{
|
||||
wxChar prim = aComponent->GetField( REFERENCE )->GetText().GetChar( 0 );
|
||||
wxString value = aComponent->GetField( VALUE )->GetText();
|
||||
|
||||
// Is it a passive component?
|
||||
if( aCtl & NET_ADJUST_PASSIVE_VALS && ( prim == 'C' || prim == 'L' || prim == 'R' ) )
|
||||
{
|
||||
// Regular expression to match common formats used for passive parts description
|
||||
// (e.g. 100k, 2k3, 1 uF)
|
||||
wxRegEx passiveVal( "^([0-9\\. ]+)([fFpPnNuUmMkKgGtT]|M(e|E)(g|G))?([fFhH]|ohm)?([-1-9 ]*)$" );
|
||||
|
||||
if( passiveVal.Matches( value ) )
|
||||
{
|
||||
wxString prefix( passiveVal.GetMatch( value, 1 ) );
|
||||
wxString unit( passiveVal.GetMatch( value, 2 ) );
|
||||
wxString suffix( passiveVal.GetMatch( value, 6 ) );
|
||||
|
||||
prefix.Trim(); prefix.Trim( false );
|
||||
unit.Trim(); unit.Trim( false );
|
||||
suffix.Trim(); suffix.Trim( false );
|
||||
|
||||
// Make 'mega' units comply with the Spice expectations
|
||||
if( unit == "M" )
|
||||
unit = "Meg";
|
||||
|
||||
value = prefix + unit + suffix;
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
break;
|
||||
}
|
||||
|
||||
case SF_ENABLED:
|
||||
return wxString( "Y" );
|
||||
break;
|
||||
|
||||
case SF_NODE_SEQUENCE:
|
||||
{
|
||||
wxString nodeSeq;
|
||||
std::vector<LIB_PIN*> pins;
|
||||
|
||||
aComponent->GetPins( pins );
|
||||
|
||||
for( auto pin : pins )
|
||||
nodeSeq += pin->GetNumberString() + " ";
|
||||
|
||||
nodeSeq.Trim();
|
||||
|
||||
return nodeSeq;
|
||||
break;
|
||||
}
|
||||
|
||||
case SF_LIB_FILE:
|
||||
// There is no default Spice library
|
||||
return wxEmptyString;
|
||||
break;
|
||||
|
||||
default:
|
||||
wxASSERT_MSG( false, "Missing default value definition for a Spice field" );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return wxString( "<unknown>" );
|
||||
}
|
||||
|
||||
|
||||
bool NETLIST_EXPORTER_PSPICE::ProcessNetlist( unsigned aCtl )
|
||||
{
|
||||
const wxString delimiters( "{:,; }" );
|
||||
SCH_SHEET_LIST sheetList( g_RootSheet );
|
||||
// Set of reference names, to check for duplications
|
||||
std::set<wxString> refNames;
|
||||
|
||||
// Prepare list of nets generation (not used here, but...
|
||||
for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
|
||||
m_masterList->GetItem( ii )->m_Flag = 0;
|
||||
|
||||
ret |= fprintf( f, "* To exclude a component from the Spice Netlist add [Spice_Netlist_Enabled] user FIELD set to: N\n" );
|
||||
ret |= fprintf( f, "* To reorder the component spice node sequence add [Spice_Node_Sequence] user FIELD and define sequence: 2,1,0\n" );
|
||||
|
||||
// Create text list starting by [.-]pspice , or [.-]gnucap (simulator
|
||||
// commands) and create text list starting by [+]pspice , or [+]gnucap
|
||||
// (simulator commands)
|
||||
bufnum[BUFYPOS_LEN] = 0;
|
||||
SCH_SHEET_LIST sheetList( g_RootSheet );
|
||||
|
||||
for( unsigned i = 0; i < sheetList.size(); i++ )
|
||||
{
|
||||
for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
|
||||
{
|
||||
size_t l1, l2;
|
||||
wxChar ident;
|
||||
|
||||
if( item->Type() != SCH_TEXT_T )
|
||||
continue;
|
||||
|
||||
SCH_TEXT* drawText = (SCH_TEXT*) item;
|
||||
|
||||
text = drawText->GetText();
|
||||
|
||||
if( text.IsEmpty() )
|
||||
continue;
|
||||
|
||||
ident = text.GetChar( 0 );
|
||||
|
||||
if( ident != '.' && ident != '-' && ident != '+' )
|
||||
continue;
|
||||
|
||||
text.Remove( 0, 1 ); // Remove the first char.
|
||||
text.Remove( 6 ); // text contains 6 char.
|
||||
text.MakeLower();
|
||||
|
||||
if( text != wxT( "pspice" ) && text != wxT( "gnucap" ) )
|
||||
continue;
|
||||
|
||||
text = drawText->GetText().Mid( 7 );
|
||||
l1 = text.Length();
|
||||
text.Trim( false );
|
||||
l2 = text.Length();
|
||||
|
||||
if( l1 == l2 )
|
||||
continue; // no whitespace after ident text
|
||||
|
||||
{
|
||||
// Put the Y position as an ascii string, for sort by vertical
|
||||
// position, using usual sort string by alphabetic value
|
||||
int ypos = drawText->GetPosition().y;
|
||||
|
||||
for( int ii = 0; ii < BUFYPOS_LEN; ii++ )
|
||||
{
|
||||
bufnum[BUFYPOS_LEN - 1 - ii] = (ypos & 63) + ' ';
|
||||
ypos >>= 6;
|
||||
}
|
||||
|
||||
// First BUFYPOS_LEN char are the Y position.
|
||||
msg.Printf( wxT( "%s %s" ), bufnum, text.GetData() );
|
||||
|
||||
if( ident == '+' )
|
||||
spiceCommandAtEndFile.Add( msg );
|
||||
else
|
||||
spiceCommandAtBeginFile.Add( msg );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Print texts starting by [.-]pspice , ou [.-]gnucap (of course, without
|
||||
// the Y position string)
|
||||
nbitems = spiceCommandAtBeginFile.GetCount();
|
||||
|
||||
if( nbitems )
|
||||
{
|
||||
spiceCommandAtBeginFile.Sort();
|
||||
|
||||
for( int ii = 0; ii < nbitems; ii++ )
|
||||
{
|
||||
spiceCommandAtBeginFile[ii].Remove( 0, BUFYPOS_LEN );
|
||||
spiceCommandAtBeginFile[ii].Trim( true );
|
||||
spiceCommandAtBeginFile[ii].Trim( false );
|
||||
ret |= fprintf( f, "%s\n", TO_UTF8( spiceCommandAtBeginFile[ii] ) );
|
||||
}
|
||||
}
|
||||
ret |= fprintf( f, "\n" );
|
||||
|
||||
// Create component list
|
||||
m_netMap.clear();
|
||||
m_netMap["GND"] = 0; // 0 is reserved for "GND"
|
||||
int netIdx = 1;
|
||||
|
||||
m_libraries.clear();
|
||||
m_ReferencesAlreadyFound.Clear();
|
||||
|
||||
UpdateDirectives( aCtl );
|
||||
|
||||
for( unsigned sheet_idx = 0; sheet_idx < sheetList.size(); sheet_idx++ )
|
||||
{
|
||||
ret |= fprintf( f, "* Sheet Name: %s\n",
|
||||
TO_UTF8( sheetList[sheet_idx].PathHumanReadable() ) );
|
||||
|
||||
// Process component attributes to find Spice directives
|
||||
for( EDA_ITEM* item = sheetList[sheet_idx].LastDrawList(); item; item = item->Next() )
|
||||
{
|
||||
SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[sheet_idx] );
|
||||
|
@ -175,47 +267,60 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign
|
|||
|
||||
item = comp;
|
||||
|
||||
// Reset NodeSeqIndex Count:
|
||||
pinSequence.clear();
|
||||
SPICE_ITEM spiceItem;
|
||||
spiceItem.m_parent = comp;
|
||||
|
||||
// Check to see if component should be removed from Spice Netlist:
|
||||
SCH_FIELD* netlistEnabledField = comp->FindField( wxT( "Spice_Netlist_Enabled" ) );
|
||||
// Obtain Spice fields
|
||||
SCH_FIELD* fieldLibFile = comp->FindField( GetSpiceFieldName( SF_LIB_FILE ) );
|
||||
SCH_FIELD* fieldSeq = comp->FindField( GetSpiceFieldName( SF_NODE_SEQUENCE ) );
|
||||
|
||||
if( netlistEnabledField )
|
||||
spiceItem.m_primitive = GetSpiceField( SF_PRIMITIVE, comp, aCtl )[0];
|
||||
spiceItem.m_model = GetSpiceField( SF_MODEL, comp, aCtl );
|
||||
spiceItem.m_refName = comp->GetRef( &sheetList[sheet_idx] );
|
||||
|
||||
// Duplicate references will result in simulation errors
|
||||
if( refNames.count( spiceItem.m_refName ) )
|
||||
{
|
||||
wxString netlistEnabled = netlistEnabledField->GetText();
|
||||
|
||||
if( netlistEnabled.CmpNoCase( disableStr ) == 0 )
|
||||
continue;
|
||||
DisplayError( NULL, wxT( "There are duplicate components. "
|
||||
"You need to annotate schematics first." ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if Alternative Pin Sequence is Available:
|
||||
SCH_FIELD* spiceSeqField = comp->FindField( wxT( "Spice_Node_Sequence" ) );
|
||||
refNames.insert( spiceItem.m_refName );
|
||||
|
||||
if( spiceSeqField )
|
||||
// Check to see if component should be removed from Spice netlist
|
||||
spiceItem.m_enabled = StringToBool( GetSpiceField( SF_ENABLED, comp, aCtl ) );
|
||||
|
||||
if( fieldLibFile && !fieldLibFile->GetText().IsEmpty() )
|
||||
m_libraries.insert( fieldLibFile->GetText() );
|
||||
|
||||
wxArrayString pinNames;
|
||||
|
||||
// Store pin information
|
||||
for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
|
||||
{
|
||||
// Get String containing the Sequence of Nodes:
|
||||
wxString nodeSeqIndexLineStr = spiceSeqField->GetText();
|
||||
NETLIST_OBJECT* pin = m_SortedComponentPinList[ii];
|
||||
assert( pin );
|
||||
spiceItem.m_pins.push_back( pin );
|
||||
pinNames.Add( pin->GetPinNumText() );
|
||||
|
||||
// Verify Field Exists and is not empty:
|
||||
// Create net mapping
|
||||
const wxString& netName = pin->GetNetName();
|
||||
if( m_netMap.count( netName ) == 0 )
|
||||
m_netMap[netName] = netIdx++;
|
||||
}
|
||||
|
||||
// Check if an alternative pin sequence is available:
|
||||
if( fieldSeq )
|
||||
{
|
||||
// Get the string containing the sequence of nodes:
|
||||
wxString nodeSeqIndexLineStr = fieldSeq->GetText();
|
||||
|
||||
// Verify field exists and is not empty:
|
||||
if( !nodeSeqIndexLineStr.IsEmpty() )
|
||||
{
|
||||
|
||||
// Create an Array of Standard Pin Names from part definition:
|
||||
stdPinNameArray.Clear();
|
||||
|
||||
for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
|
||||
{
|
||||
NETLIST_OBJECT* pin = m_SortedComponentPinList[ii];
|
||||
|
||||
if( !pin )
|
||||
continue;
|
||||
|
||||
stdPinNameArray.Add( pin->GetPinNumText() );
|
||||
}
|
||||
|
||||
// Get Alt Pin Name Array From User:
|
||||
wxStringTokenizer tkz( nodeSeqIndexLineStr, delimeters );
|
||||
wxStringTokenizer tkz( nodeSeqIndexLineStr, delimiters );
|
||||
|
||||
while( tkz.HasMoreTokens() )
|
||||
{
|
||||
|
@ -223,136 +328,80 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign
|
|||
int seq;
|
||||
|
||||
// Find PinName In Standard List assign Standard List Index to Name:
|
||||
seq = stdPinNameArray.Index(pinIndex);
|
||||
seq = pinNames.Index( pinIndex );
|
||||
|
||||
if( seq != wxNOT_FOUND )
|
||||
{
|
||||
pinSequence.push_back( seq );
|
||||
}
|
||||
spiceItem.m_pinSequence.push_back( seq );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//Get Standard Reference Designator:
|
||||
wxString RefName = comp->GetRef( &sheetList[sheet_idx] );
|
||||
m_spiceItems.push_back( spiceItem );
|
||||
}
|
||||
}
|
||||
|
||||
//Conditionally add Prefix only for devices that begin with U or IC:
|
||||
if( aUsePrefix )
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_EXPORTER_PSPICE::UpdateDirectives( unsigned aCtl )
|
||||
{
|
||||
const SCH_SHEET_LIST& sheetList = g_RootSheet;
|
||||
|
||||
m_directives.clear();
|
||||
|
||||
for( unsigned i = 0; i < sheetList.size(); i++ )
|
||||
{
|
||||
for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
|
||||
{
|
||||
if( item->Type() != SCH_TEXT_T )
|
||||
continue;
|
||||
|
||||
wxString text = static_cast<SCH_TEXT*>( item )->GetText();
|
||||
|
||||
if( text.IsEmpty() )
|
||||
continue;
|
||||
|
||||
if( text.GetChar( 0 ) == '.' )
|
||||
{
|
||||
if( RefName.StartsWith( wxT( "U" ) ) || RefName.StartsWith( wxT( "IC" ) ) )
|
||||
RefName = wxT( "X" ) + RefName;
|
||||
}
|
||||
wxStringTokenizer tokenizer( text, "\r\n" );
|
||||
|
||||
ret |= fprintf( f, "%s ", TO_UTF8( RefName ) );
|
||||
|
||||
// Write pin list:
|
||||
int activePinIndex = 0;
|
||||
|
||||
for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
|
||||
{
|
||||
// Case of Alt Sequence definition with Unused/Invalid Node index:
|
||||
// Valid used Node Indexes are in the set
|
||||
// {0,1,2,...m_SortedComponentPinList.size()-1}
|
||||
if( pinSequence.size() )
|
||||
while( tokenizer.HasMoreTokens() )
|
||||
{
|
||||
// All Vector values must be less <= max package size
|
||||
// And Total Vector size should be <= package size
|
||||
if( ( (unsigned) pinSequence[ii] < m_SortedComponentPinList.size() )
|
||||
&& ( ii < pinSequence.size() ) )
|
||||
wxString directive( tokenizer.GetNextToken() );
|
||||
|
||||
if( directive.StartsWith( ".inc" ) )
|
||||
{
|
||||
// Case of Alt Pin Sequence in control good Index:
|
||||
activePinIndex = pinSequence[ii];
|
||||
wxString lib = directive.AfterFirst( ' ' );
|
||||
|
||||
if( !lib.IsEmpty() )
|
||||
m_libraries.insert( lib );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Case of Alt Pin Sequence in control Bad Index or not using all
|
||||
// pins for simulation:
|
||||
continue;
|
||||
m_directives.push_back( directive );
|
||||
}
|
||||
}
|
||||
// Case of Standard Pin Sequence in control:
|
||||
else
|
||||
{
|
||||
activePinIndex = ii;
|
||||
}
|
||||
|
||||
NETLIST_OBJECT* pin = m_SortedComponentPinList[activePinIndex];
|
||||
|
||||
if( !pin )
|
||||
continue;
|
||||
|
||||
sprintPinNetName( netName , wxT( "N-%.6d" ), pin, aUseNetcodeAsNetName );
|
||||
|
||||
//Replace parenthesis with underscore to prevent parse issues with Simulators:
|
||||
netName.Replace( wxT( "(" ), wxT( "_" ) );
|
||||
netName.Replace( wxT( ")" ), wxT( "_" ) );
|
||||
|
||||
if( netName.IsEmpty() )
|
||||
netName = wxT( "?" );
|
||||
|
||||
ret |= fprintf( f, " %s", TO_UTF8( netName ) );
|
||||
}
|
||||
|
||||
// Get Component Value Name:
|
||||
wxString CompValue = comp->GetField( VALUE )->GetText();
|
||||
|
||||
// Check if Override Model Name is Provided:
|
||||
SCH_FIELD* spiceModelField = comp->FindField( wxT( "spice_model" ) );
|
||||
|
||||
if( spiceModelField )
|
||||
{
|
||||
// Get Model Name String:
|
||||
wxString ModelNameStr = spiceModelField->GetText();
|
||||
|
||||
// Verify Field Exists and is not empty:
|
||||
if( !ModelNameStr.IsEmpty() )
|
||||
CompValue = ModelNameStr;
|
||||
}
|
||||
|
||||
// Print Component Value:
|
||||
ret |= fprintf( f, " %s\t\t",TO_UTF8( CompValue ) );
|
||||
|
||||
// Show Seq Spec on same line as component using line-comment ";":
|
||||
for( unsigned ii = 0; ii < pinSequence.size(); ++ii )
|
||||
{
|
||||
if( ii == 0 )
|
||||
ret |= fprintf( f, ";Node Sequence Spec.<" );
|
||||
|
||||
ret |= fprintf( f, "%s", TO_UTF8( stdPinNameArray.Item( pinSequence[ii] ) ) );
|
||||
|
||||
if( ii < pinSequence.size()-1 )
|
||||
ret |= fprintf( f, "," );
|
||||
else
|
||||
ret |= fprintf( f, ">" );
|
||||
}
|
||||
|
||||
// Next Netlist line record:
|
||||
ret |= fprintf( f, "\n" );
|
||||
}
|
||||
}
|
||||
|
||||
m_SortedComponentPinList.clear();
|
||||
|
||||
// Print texts starting with [+]pspice or [+]gnucap
|
||||
nbitems = spiceCommandAtEndFile.GetCount();
|
||||
|
||||
if( nbitems )
|
||||
{
|
||||
ret |= fprintf( f, "\n" );
|
||||
spiceCommandAtEndFile.Sort();
|
||||
|
||||
for( int ii = 0; ii < nbitems; ii++ )
|
||||
{
|
||||
spiceCommandAtEndFile[ii].Remove( 0, +BUFYPOS_LEN );
|
||||
spiceCommandAtEndFile[ii].Trim( true );
|
||||
spiceCommandAtEndFile[ii].Trim( false );
|
||||
ret |= fprintf( f, "%s\n", TO_UTF8( spiceCommandAtEndFile[ii] ) );
|
||||
}
|
||||
}
|
||||
|
||||
ret |= fprintf( f, "\n.end\n" );
|
||||
fclose( f );
|
||||
|
||||
return ret >= 0;
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_EXPORTER_PSPICE::writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const
|
||||
{
|
||||
for( auto& dir : m_directives )
|
||||
{
|
||||
aFormatter->Print( 0, "%s\n", (const char*) dir.c_str() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Entries in the vector below have to follow the order in SPICE_FIELD enum
|
||||
const std::vector<wxString> NETLIST_EXPORTER_PSPICE::m_spiceFields = {
|
||||
"Spice_Primitive",
|
||||
"Spice_Model",
|
||||
"Spice_Netlist_Enabled",
|
||||
"Spice_Node_Sequence",
|
||||
"Spice_Lib_File"
|
||||
};
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (C) 1992-2013 jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||
* Copyright (C) 1992-2015 KiCad Developers
|
||||
* Copyright (C) 1992-2016 KiCad Developers
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -27,6 +27,57 @@
|
|||
#define NETLIST_EXPORTER_PSPICE_H
|
||||
|
||||
#include "netlist_exporter.h"
|
||||
#include <map>
|
||||
|
||||
class SEARCH_STACK;
|
||||
|
||||
/// Flags for Spice netlist generation (can be combined)
|
||||
enum SPICE_NETLIST_OPTIONS {
|
||||
NET_USE_X_PREFIX = 2, // change "U" and "IC" reference prefix to "X"
|
||||
NET_USE_NETCODES_AS_NETNAMES = 4, // use netcode numbers as netnames
|
||||
NET_ADJUST_INCLUDE_PATHS = 8, // use full paths for included files (if they are in search path)
|
||||
NET_ADJUST_PASSIVE_VALS = 16, // reformat passive component values (e.g. 1M -> 1Meg)
|
||||
NET_ALL_FLAGS = 0xffff
|
||||
};
|
||||
|
||||
enum SPICE_FIELD {
|
||||
SF_PRIMITIVE,
|
||||
SF_MODEL,
|
||||
SF_ENABLED,
|
||||
SF_NODE_SEQUENCE,
|
||||
SF_LIB_FILE,
|
||||
SF_END // sentinel
|
||||
};
|
||||
|
||||
enum SPICE_PRIMITIVE {
|
||||
SP_RESISTOR = 'R',
|
||||
SP_CAPACITOR = 'C',
|
||||
SP_INDUCTOR = 'L',
|
||||
SP_DIODE = 'D',
|
||||
SP_BJT = 'Q',
|
||||
SP_MOSFET = 'M',
|
||||
SP_SUBCKT = 'X',
|
||||
SP_VSOURCE = 'V',
|
||||
SP_ISOURCE = 'I'
|
||||
};
|
||||
|
||||
/// @todo add NET_ADJUST_INCLUDE_PATHS & NET_ADJUST_PASSIVE_VALS checkboxes in the netlist export dialog
|
||||
|
||||
struct SPICE_ITEM
|
||||
{
|
||||
SCH_COMPONENT* m_parent;
|
||||
wxChar m_primitive;
|
||||
wxString m_model;
|
||||
wxString m_refName;
|
||||
bool m_enabled;
|
||||
|
||||
///> Array containing Standard Pin Name
|
||||
std::vector<NETLIST_OBJECT*> m_pins;
|
||||
|
||||
///> Numeric indices into m_SortedComponentPinList
|
||||
std::vector<int> m_pinSequence;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class NETLIST_EXPORTER_PSPICE
|
||||
|
@ -35,16 +86,100 @@
|
|||
class NETLIST_EXPORTER_PSPICE : public NETLIST_EXPORTER
|
||||
{
|
||||
public:
|
||||
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, PART_LIBS* aLibs ) :
|
||||
NETLIST_EXPORTER( aMasterList, aLibs )
|
||||
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, PART_LIBS* aLibs,
|
||||
SEARCH_STACK* aPaths = NULL ) :
|
||||
NETLIST_EXPORTER( aMasterList, aLibs ), m_paths( aPaths )
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~NETLIST_EXPORTER_PSPICE()
|
||||
{
|
||||
}
|
||||
|
||||
typedef std::list<SPICE_ITEM> SPICE_ITEM_LIST;
|
||||
|
||||
///> Net name to node number mapping
|
||||
typedef std::map<wxString, int> NET_INDEX_MAP;
|
||||
|
||||
const SPICE_ITEM_LIST& GetSpiceItems() const
|
||||
{
|
||||
return m_spiceItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function WriteNetlist
|
||||
* writes to specified output file
|
||||
*/
|
||||
bool WriteNetlist( const wxString& aOutFileName, unsigned aNetlistOptions );
|
||||
|
||||
bool Format( OUTPUTFORMATTER* aFormatter, unsigned aCtl );
|
||||
|
||||
/**
|
||||
* @brief Processes the netlist to create net mapping and a list of SPICE_ITEMs.
|
||||
* It is automatically called by WriteNetlist(), but might be used separately,
|
||||
* if only net mapping and the list of SPICE_ITEMs are required.
|
||||
* @return True if successful.
|
||||
*/
|
||||
bool ProcessNetlist( unsigned aCtl );
|
||||
|
||||
const NET_INDEX_MAP& GetNetIndexMap() const
|
||||
{
|
||||
return m_netMap;
|
||||
}
|
||||
|
||||
static const std::vector<wxString>& GetSpiceFields()
|
||||
{
|
||||
return m_spiceFields;
|
||||
}
|
||||
|
||||
static const wxString& GetSpiceFieldName( SPICE_FIELD aField )
|
||||
{
|
||||
return m_spiceFields[(int) aField];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves either the requested field value or the default value.
|
||||
*/
|
||||
static wxString GetSpiceField( SPICE_FIELD aField, SCH_COMPONENT* aComponent, unsigned aCtl );
|
||||
|
||||
static wxString GetSpiceFieldDefVal( SPICE_FIELD aField, SCH_COMPONENT* aComponent, unsigned aCtl );
|
||||
|
||||
void UpdateDirectives( unsigned aCtl );
|
||||
|
||||
const std::vector<wxString> GetDirectives() const
|
||||
{
|
||||
return m_directives;
|
||||
}
|
||||
|
||||
static bool StringToBool( const wxString& aStr )
|
||||
{
|
||||
if( aStr.IsEmpty() )
|
||||
return false;
|
||||
|
||||
char c = tolower( aStr[0] );
|
||||
|
||||
// Different ways of saying false (no/false/0)
|
||||
return !( c == 'n' || c == 'f' || c == '0' );
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const;
|
||||
|
||||
private:
|
||||
///> Spice directives found in the processed schematic sheet
|
||||
std::vector<wxString> m_directives;
|
||||
|
||||
///> Libraries used by the simulated circuit
|
||||
std::set<wxString> m_libraries;
|
||||
|
||||
NET_INDEX_MAP m_netMap;
|
||||
|
||||
SPICE_ITEM_LIST m_spiceItems;
|
||||
|
||||
SEARCH_STACK* m_paths;
|
||||
|
||||
// Component fields that are processed during netlist export & simulation
|
||||
static const std::vector<wxString> m_spiceFields;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,162 @@
|
|||
EESchema Schematic File Version 2
|
||||
LIBS:power
|
||||
LIBS:device
|
||||
LIBS:transistors
|
||||
LIBS:conn
|
||||
LIBS:linear
|
||||
LIBS:regul
|
||||
LIBS:74xx
|
||||
LIBS:cmos4000
|
||||
LIBS:adc-dac
|
||||
LIBS:memory
|
||||
LIBS:xilinx
|
||||
LIBS:microcontrollers
|
||||
LIBS:dsp
|
||||
LIBS:microchip
|
||||
LIBS:analog_switches
|
||||
LIBS:motorola
|
||||
LIBS:texas
|
||||
LIBS:intel
|
||||
LIBS:audio
|
||||
LIBS:interface
|
||||
LIBS:digital-audio
|
||||
LIBS:philips
|
||||
LIBS:display
|
||||
LIBS:cypress
|
||||
LIBS:siliconi
|
||||
LIBS:opto
|
||||
LIBS:atmel
|
||||
LIBS:contrib
|
||||
LIBS:valves
|
||||
LIBS:pspice
|
||||
LIBS:noname-cache
|
||||
EELAYER 25 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 1
|
||||
Title ""
|
||||
Date ""
|
||||
Rev ""
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 ""
|
||||
Comment4 ""
|
||||
$EndDescr
|
||||
$Comp
|
||||
L VSOURCE V1
|
||||
U 1 1 57336052
|
||||
P 4400 4050
|
||||
F 0 "V1" H 4528 4096 50 0000 L CNN
|
||||
F 1 "SINE(0 1.5 1k 0 0 0 0)" H 4528 4005 50 0000 L CNN
|
||||
F 2 "" H 4400 4050 50 0000 C CNN
|
||||
F 3 "" H 4400 4050 50 0000 C CNN
|
||||
F 4 "Value" H 4400 4050 60 0001 C CNN "Fieldname"
|
||||
F 5 "V" H 4400 4050 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 4100 4250 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 4400 4050
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR1
|
||||
U 1 1 573360D3
|
||||
P 4400 4350
|
||||
F 0 "#PWR1" H 4400 4100 50 0001 C CNN
|
||||
F 1 "GND" H 4405 4177 50 0000 C CNN
|
||||
F 2 "" H 4400 4350 50 0000 C CNN
|
||||
F 3 "" H 4400 4350 50 0000 C CNN
|
||||
1 4400 4350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R1
|
||||
U 1 1 573360F5
|
||||
P 4650 3700
|
||||
F 0 "R1" V 4443 3700 50 0000 C CNN
|
||||
F 1 "1k" V 4534 3700 50 0000 C CNN
|
||||
F 2 "" V 4580 3700 50 0000 C CNN
|
||||
F 3 "" H 4650 3700 50 0000 C CNN
|
||||
F 4 "Value" H 4650 3700 60 0001 C CNN "Fieldname"
|
||||
F 5 "1 2" H 4650 3700 60 0001 C CNN "SpiceMapping"
|
||||
F 6 "R" V 4650 3700 60 0001 C CNN "Spice_Primitive"
|
||||
1 4650 3700
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L D D1
|
||||
U 1 1 573361B8
|
||||
P 5100 3700
|
||||
F 0 "D1" H 5100 3485 50 0000 C CNN
|
||||
F 1 "1N4148" H 5100 3576 50 0000 C CNN
|
||||
F 2 "" H 5100 3700 50 0000 C CNN
|
||||
F 3 "" H 5100 3700 50 0000 C CNN
|
||||
F 4 "Value" H 5100 3700 60 0001 C CNN "Fieldname"
|
||||
F 5 "D" H 5100 3700 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "2 1" H 5100 3700 60 0001 C CNN "Spice_Node_Sequence"
|
||||
1 5100 3700
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C1
|
||||
U 1 1 5733628F
|
||||
P 5400 4000
|
||||
F 0 "C1" H 5515 4046 50 0000 L CNN
|
||||
F 1 "100n" H 5515 3955 50 0000 L CNN
|
||||
F 2 "" H 5438 3850 50 0000 C CNN
|
||||
F 3 "" H 5400 4000 50 0000 C CNN
|
||||
F 4 "Value" H 5400 4000 60 0001 C CNN "Fieldname"
|
||||
F 5 "C" H 5400 4000 60 0001 C CNN "Spice_Primitive"
|
||||
F 6 "1 2" H 5400 4000 60 0001 C CNN "SpiceMapping"
|
||||
1 5400 4000
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R2
|
||||
U 1 1 573362F7
|
||||
P 5750 4000
|
||||
F 0 "R2" H 5680 3954 50 0000 R CNN
|
||||
F 1 "100k" H 5680 4045 50 0000 R CNN
|
||||
F 2 "" V 5680 4000 50 0000 C CNN
|
||||
F 3 "" H 5750 4000 50 0000 C CNN
|
||||
F 4 "Value" H 5750 4000 60 0001 C CNN "Fieldname"
|
||||
F 5 "1 2" H 5750 4000 60 0001 C CNN "SpiceMapping"
|
||||
F 6 "R" V 5750 4000 60 0001 C CNN "Spice_Primitive"
|
||||
1 5750 4000
|
||||
-1 0 0 1
|
||||
$EndComp
|
||||
Text Notes 4300 4900 0 60 ~ 0
|
||||
.tran 1u 10m\n
|
||||
Wire Wire Line
|
||||
4400 4350 4400 4250
|
||||
Wire Wire Line
|
||||
4400 4300 5750 4300
|
||||
Connection ~ 4400 4300
|
||||
Wire Wire Line
|
||||
5250 3700 5750 3700
|
||||
Wire Wire Line
|
||||
5750 3700 5750 3850
|
||||
Wire Wire Line
|
||||
5400 3850 5400 3700
|
||||
Connection ~ 5400 3700
|
||||
Wire Wire Line
|
||||
5400 4300 5400 4150
|
||||
Wire Wire Line
|
||||
5750 4300 5750 4150
|
||||
Connection ~ 5400 4300
|
||||
Wire Wire Line
|
||||
4800 3700 4950 3700
|
||||
Connection ~ 4900 3700
|
||||
Wire Wire Line
|
||||
4400 3850 4400 3700
|
||||
Wire Wire Line
|
||||
4400 3700 4500 3700
|
||||
Text Notes 4300 4800 0 60 ~ 0
|
||||
.include diodes.lib\n
|
||||
Text Label 4400 3800 0 60 ~ 0
|
||||
in
|
||||
Text Label 5550 3700 0 60 ~ 0
|
||||
rect
|
||||
Text Notes 4300 5000 0 60 ~ 0
|
||||
*.ac dec 10 1 1Meg\n
|
||||
$EndSCHEMATC
|
|
@ -28,9 +28,11 @@
|
|||
*/
|
||||
|
||||
#include <fctsys.h>
|
||||
#include <kiway.h>
|
||||
#include <eeschema_id.h>
|
||||
#include <class_drawpanel.h>
|
||||
#include <schframe.h>
|
||||
#include <sim/sim_plot_frame.h>
|
||||
#include <menus_helpers.h>
|
||||
|
||||
#include <sch_bus_entry.h>
|
||||
|
@ -43,6 +45,8 @@
|
|||
#include <sch_sheet.h>
|
||||
#include <sch_sheet_path.h>
|
||||
#include <sch_bitmap.h>
|
||||
|
||||
#include <class_netlist_object.h>
|
||||
#include <class_library.h> // fo class SCHLIB_FILTER to filter power parts
|
||||
|
||||
|
||||
|
@ -321,6 +325,56 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|||
}
|
||||
break;
|
||||
|
||||
#ifdef KICAD_SPICE
|
||||
case ID_SIM_PROBE:
|
||||
{
|
||||
const KICAD_T wiresAndComponents[] = { SCH_LINE_T, SCH_COMPONENT_T, SCH_SHEET_PIN_T };
|
||||
item = LocateAndShowItem( aPosition, wiresAndComponents );
|
||||
|
||||
if( !item )
|
||||
break;
|
||||
|
||||
NETLIST_OBJECT_LIST* netlist = BuildNetListBase();
|
||||
|
||||
for( NETLIST_OBJECT* obj : *netlist )
|
||||
{
|
||||
if( obj->m_Comp == item )
|
||||
{
|
||||
SIM_PLOT_FRAME* simFrame = (SIM_PLOT_FRAME*) Kiway().Player( FRAME_SIMULATOR, false );
|
||||
|
||||
if( simFrame )
|
||||
simFrame->AddVoltagePlot( obj->GetNetName() );
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_SIM_TUNE:
|
||||
{
|
||||
const KICAD_T fieldsAndComponents[] = { SCH_COMPONENT_T, SCH_FIELD_T };
|
||||
item = LocateAndShowItem( aPosition, fieldsAndComponents );
|
||||
|
||||
if( !item )
|
||||
return;
|
||||
|
||||
if( item->Type() != SCH_COMPONENT_T )
|
||||
{
|
||||
item = static_cast<SCH_ITEM*>( item->GetParent() );
|
||||
|
||||
if( item->Type() != SCH_COMPONENT_T )
|
||||
return;
|
||||
}
|
||||
|
||||
SIM_PLOT_FRAME* simFrame = (SIM_PLOT_FRAME*) Kiway().Player( FRAME_SIMULATOR, false );
|
||||
|
||||
if( simFrame )
|
||||
simFrame->AddTuner( static_cast<SCH_COMPONENT*>( item ) );
|
||||
}
|
||||
break;
|
||||
#endif /* KICAD_SPICE */
|
||||
|
||||
default:
|
||||
SetToolID( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor(), wxEmptyString );
|
||||
wxFAIL_MSG( wxT( "SCH_EDIT_FRAME::OnLeftClick invalid tool ID <" ) +
|
||||
|
|
|
@ -136,7 +136,7 @@ bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
{
|
||||
char* line = aLine.Line();
|
||||
|
||||
if( strnicmp( line, "$Bitmap", 7 ) != 0 )
|
||||
if( strncasecmp( line, "$Bitmap", 7 ) != 0 )
|
||||
{
|
||||
aErrorMsg.Printf( wxT( "Eeschema file bitmap image load error at line %d, aborted" ),
|
||||
aLine.LineNumber() );
|
||||
|
@ -151,13 +151,13 @@ bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
|
||||
line = aLine.Line();
|
||||
|
||||
if( strnicmp( line, "Pos", 3 ) == 0 )
|
||||
if( strncasecmp( line, "Pos", 3 ) == 0 )
|
||||
{
|
||||
sscanf( line + 3, "%d %d", &m_pos.x, &m_pos.y );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Scale", 5 ) == 0 )
|
||||
if( strncasecmp( line, "Scale", 5 ) == 0 )
|
||||
{
|
||||
double scale = 1.0;
|
||||
sscanf( line + 5, "%lf", &scale );
|
||||
|
@ -165,12 +165,12 @@ bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
continue;
|
||||
}
|
||||
|
||||
if( strnicmp( line, "Data", 4 ) == 0 )
|
||||
if( strncasecmp( line, "Data", 4 ) == 0 )
|
||||
{
|
||||
m_image->LoadData( aLine, aErrorMsg );
|
||||
}
|
||||
|
||||
if( strnicmp( line, "$EndBitmap", 4 ) == 0 )
|
||||
if( strncasecmp( line, "$EndBitmap", 4 ) == 0 )
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1450,7 +1450,7 @@ bool SCH_COMPONENT::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
if( !(line = aLine.ReadLine()) )
|
||||
return false;
|
||||
|
||||
if( strnicmp( "$End", line, 4 ) != 0 )
|
||||
if( strncasecmp( "$End", line, 4 ) != 0 )
|
||||
{
|
||||
aErrorMsg.Printf( wxT( "Component End expected at line %d, aborted" ),
|
||||
aLine.LineNumber() );
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <vector>
|
||||
#include <lib_draw_item.h>
|
||||
|
||||
class SCH_SCREEN;
|
||||
class SCH_SHEET_PATH;
|
||||
class LIB_ITEM;
|
||||
class LIB_PIN;
|
||||
|
|
|
@ -316,7 +316,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
}
|
||||
}
|
||||
|
||||
if( strnicmp( "$End", ((char*)aLine), 4 ) != 0 )
|
||||
if( strncasecmp( "$End", ((char*)aLine), 4 ) != 0 )
|
||||
{
|
||||
aErrorMsg.Printf( wxT( "**Eeschema file end_sheet struct error at line %d, aborted\n" ),
|
||||
aLine.LineNumber() );
|
||||
|
|
|
@ -484,7 +484,7 @@ bool SCH_TEXT::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
|
||||
}
|
||||
|
||||
if( strnicmp( Name2, "Italic", 6 ) == 0 )
|
||||
if( strncasecmp( Name2, "Italic", 6 ) == 0 )
|
||||
m_Italic = 1;
|
||||
|
||||
return true;
|
||||
|
@ -947,7 +947,7 @@ bool SCH_LABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
|
||||
}
|
||||
|
||||
if( stricmp( Name2, "Italic" ) == 0 )
|
||||
if( strcasecmp( Name2, "Italic" ) == 0 )
|
||||
m_Italic = 1;
|
||||
|
||||
return true;
|
||||
|
@ -1077,19 +1077,19 @@ bool SCH_GLOBALLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
m_Bold = ( thickness != 0 );
|
||||
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
|
||||
m_shape = NET_OUTPUT;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
|
||||
m_shape = NET_BIDI;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
|
||||
m_shape = NET_TRISTATE;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
|
||||
m_shape = NET_UNSPECIFIED;
|
||||
|
||||
if( stricmp( Name3, "Italic" ) == 0 )
|
||||
if( strcasecmp( Name3, "Italic" ) == 0 )
|
||||
m_Italic = 1;
|
||||
|
||||
return true;
|
||||
|
@ -1521,19 +1521,19 @@ bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
|
|||
m_Bold = ( thickness != 0 );
|
||||
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
|
||||
m_shape = NET_OUTPUT;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
|
||||
m_shape = NET_BIDI;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
|
||||
m_shape = NET_TRISTATE;
|
||||
|
||||
if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
|
||||
if( strcasecmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
|
||||
m_shape = NET_UNSPECIFIED;
|
||||
|
||||
if( stricmp( Name3, "Italic" ) == 0 )
|
||||
if( strcasecmp( Name3, "Italic" ) == 0 )
|
||||
m_Italic = 1;
|
||||
|
||||
return true;
|
||||
|
|
|
@ -609,6 +609,18 @@ void SCH_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
|
|||
SetToolID( id, wxCURSOR_BULLSEYE, _( "Delete item" ) );
|
||||
break;
|
||||
|
||||
#ifdef KICAD_SPICE
|
||||
case ID_SIM_PROBE:
|
||||
SetToolID( id, -1, _( "Add a simulator probe" ) );
|
||||
m_canvas->SetCursor( CURSOR_PROBE );
|
||||
break;
|
||||
|
||||
case ID_SIM_TUNE:
|
||||
SetToolID( id, -1, _( "Select a value to be tuned" ) );
|
||||
m_canvas->SetCursor( CURSOR_TUNE );
|
||||
break;
|
||||
#endif /* KICAD_SPICE */
|
||||
|
||||
default:
|
||||
SetRepeatItem( NULL );
|
||||
}
|
||||
|
|
|
@ -280,6 +280,12 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME )
|
|||
EVT_TOOL_RANGE( ID_SCHEMATIC_VERTICAL_TOOLBAR_START, ID_SCHEMATIC_VERTICAL_TOOLBAR_END,
|
||||
SCH_EDIT_FRAME::OnSelectTool )
|
||||
|
||||
#ifdef KICAD_SPICE
|
||||
EVT_TOOL( ID_SIM_SHOW, SCH_EDIT_FRAME::OnSimulate )
|
||||
EVT_TOOL( ID_SIM_PROBE, SCH_EDIT_FRAME::OnSelectTool )
|
||||
EVT_TOOL( ID_SIM_TUNE, SCH_EDIT_FRAME::OnSelectTool )
|
||||
#endif /* KICAD_SPICE */
|
||||
|
||||
EVT_MENU( ID_CANCEL_CURRENT_COMMAND, SCH_EDIT_FRAME::OnCancelCurrentCommand )
|
||||
EVT_MENU( ID_SCH_DRAG_ITEM, SCH_EDIT_FRAME::OnDragItem )
|
||||
EVT_MENU_RANGE( ID_SCH_ROTATE_CLOCKWISE, ID_SCH_ROTATE_COUNTERCLOCKWISE,
|
||||
|
@ -1371,4 +1377,3 @@ void SCH_EDIT_FRAME::UpdateTitle()
|
|||
|
||||
SetTitle( title );
|
||||
}
|
||||
|
||||
|
|
|
@ -813,6 +813,7 @@ private:
|
|||
void OnErc( wxCommandEvent& event );
|
||||
void OnCreateNetlist( wxCommandEvent& event );
|
||||
void OnUpdatePCB( wxCommandEvent& event );
|
||||
void OnSimulate( wxCommandEvent& event );
|
||||
void OnCreateBillOfMaterials( wxCommandEvent& event );
|
||||
void OnFindItems( wxCommandEvent& event );
|
||||
void OnFindDialogClose( wxFindDialogEvent& event );
|
||||
|
@ -1380,6 +1381,12 @@ public:
|
|||
|
||||
wxString GetNetListerCommand() const { return m_netListerCommand; }
|
||||
|
||||
///> Probe cursor, used by circuit simulator
|
||||
const static wxCursor CURSOR_PROBE;
|
||||
|
||||
///> Tuner cursor, used by circuit simulator
|
||||
const static wxCursor CURSOR_TUNE;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,184 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "netlist_exporter_pspice_sim.h"
|
||||
|
||||
wxString NETLIST_EXPORTER_PSPICE_SIM::GetSpiceVector( const wxString& aName, SIM_PLOT_TYPE aType,
|
||||
const wxString& aParam ) const
|
||||
{
|
||||
wxString res;
|
||||
|
||||
// Some of the flags should exclude mutually
|
||||
assert( ( ( aType & SPT_VOLTAGE ) == 0 ) != ( ( aType & SPT_CURRENT ) == 0 ) );
|
||||
assert( ( ( aType & SPT_AC_PHASE ) == 0 ) || ( ( aType & SPT_AC_MAG ) == 0 ) );
|
||||
|
||||
if( aType & SPT_VOLTAGE )
|
||||
{
|
||||
const auto& netMapping = GetNetIndexMap();
|
||||
auto it = netMapping.find( aName );
|
||||
|
||||
if( it == netMapping.end() )
|
||||
return "";
|
||||
|
||||
return wxString::Format( "V(%d)", it->second );
|
||||
}
|
||||
|
||||
else if( aType & SPT_CURRENT )
|
||||
{
|
||||
return wxString::Format( "@%s[%s]", GetSpiceDevice( aName ).Lower(),
|
||||
aParam.IsEmpty() ? "i" : aParam.Lower() );
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
const std::vector<wxString>& NETLIST_EXPORTER_PSPICE_SIM::GetCurrents( SPICE_PRIMITIVE aPrimitive )
|
||||
{
|
||||
static const std::vector<wxString> passive = { "I" };
|
||||
static const std::vector<wxString> diode = { "Id" };
|
||||
static const std::vector<wxString> bjt = { "Ib", "Ic", "Ie" };
|
||||
static const std::vector<wxString> mos = { "Ig", "Id", "Is" };
|
||||
static const std::vector<wxString> empty;
|
||||
|
||||
switch( aPrimitive )
|
||||
{
|
||||
case SP_RESISTOR:
|
||||
case SP_CAPACITOR:
|
||||
case SP_INDUCTOR:
|
||||
case SP_VSOURCE:
|
||||
return passive;
|
||||
|
||||
case SP_DIODE:
|
||||
return diode;
|
||||
|
||||
case SP_BJT:
|
||||
return bjt;
|
||||
|
||||
case SP_MOSFET:
|
||||
return mos;
|
||||
|
||||
default:
|
||||
return empty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
wxString NETLIST_EXPORTER_PSPICE_SIM::GetSpiceDevice( const wxString& aComponent ) const
|
||||
{
|
||||
const auto& spiceItems = GetSpiceItems();
|
||||
|
||||
auto it = std::find_if( spiceItems.begin(), spiceItems.end(), [&]( const SPICE_ITEM& item ) {
|
||||
return item.m_refName == aComponent;
|
||||
} );
|
||||
|
||||
if( it == spiceItems.end() )
|
||||
return wxEmptyString;
|
||||
|
||||
return wxString( it->m_primitive + it->m_refName );
|
||||
}
|
||||
|
||||
|
||||
wxString NETLIST_EXPORTER_PSPICE_SIM::GetSheetSimCommand()
|
||||
{
|
||||
wxString simCmd;
|
||||
|
||||
UpdateDirectives( NET_ALL_FLAGS );
|
||||
|
||||
for( const auto& dir : GetDirectives() )
|
||||
{
|
||||
if( IsSimCommand( dir ) )
|
||||
simCmd += wxString::Format( "%s\r\n", dir );
|
||||
}
|
||||
|
||||
return simCmd;
|
||||
}
|
||||
|
||||
|
||||
SIM_TYPE NETLIST_EXPORTER_PSPICE_SIM::GetSimType()
|
||||
{
|
||||
return CommandToSimType( m_simCommand.IsEmpty() ? GetSheetSimCommand() : m_simCommand );
|
||||
}
|
||||
|
||||
|
||||
SIM_TYPE NETLIST_EXPORTER_PSPICE_SIM::CommandToSimType( const wxString& aCmd )
|
||||
{
|
||||
const std::map<wxString, SIM_TYPE> simCmds = {
|
||||
{ ".ac", ST_AC }, { ".dc", ST_DC }, { ".disto", ST_DISTORTION }, { ".noise", ST_NOISE },
|
||||
{ ".op", ST_OP }, { ".pz", ST_POLE_ZERO }, { ".sens", ST_SENSITIVITY }, { ".tf", ST_TRANS_FUNC },
|
||||
{ ".tran", ST_TRANSIENT }
|
||||
};
|
||||
wxString lcaseCmd = aCmd.Lower();
|
||||
|
||||
for( const auto& c : simCmds )
|
||||
{
|
||||
if( lcaseCmd.StartsWith( c.first ) )
|
||||
return c.second;
|
||||
}
|
||||
|
||||
return ST_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
void NETLIST_EXPORTER_PSPICE_SIM::writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const
|
||||
{
|
||||
// Add a directive to obtain currents
|
||||
//aFormatter->Print( 0, ".options savecurrents\n" ); // does not work :(
|
||||
|
||||
for( const auto& item : GetSpiceItems() )
|
||||
{
|
||||
for( const auto& current :
|
||||
NETLIST_EXPORTER_PSPICE_SIM::GetCurrents( (SPICE_PRIMITIVE) item.m_primitive ) )
|
||||
{
|
||||
/// @todo is it required to switch to lowercase
|
||||
aFormatter->Print( 0, ".save %s\n",
|
||||
(const char*) GetSpiceVector( item.m_refName, SPT_CURRENT, current ).c_str() );
|
||||
}
|
||||
}
|
||||
|
||||
// If we print out .save directives for currents, then it needs to be done for voltages as well
|
||||
for( const auto& netMap : GetNetIndexMap() )
|
||||
{
|
||||
aFormatter->Print( 0, ".save %s\n",
|
||||
(const char*) GetSpiceVector( netMap.first, SPT_VOLTAGE ).c_str() );
|
||||
}
|
||||
|
||||
if( m_simCommand.IsEmpty() )
|
||||
{
|
||||
// Fallback to the default behavior and just write all directives
|
||||
NETLIST_EXPORTER_PSPICE::writeDirectives( aFormatter, aCtl );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dump all directives but simulation commands
|
||||
for( const auto& dir : GetDirectives() )
|
||||
{
|
||||
if( !IsSimCommand( dir ) )
|
||||
aFormatter->Print( 0, "%s\n", (const char*) dir.c_str() );
|
||||
}
|
||||
|
||||
// Finish with our custom simulation command
|
||||
aFormatter->Print( 0, "%s\n", (const char*) m_simCommand.c_str() );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef NETLIST_EXPORTER_PSPICE_SIM_H
|
||||
#define NETLIST_EXPORTER_PSPICE_SIM_H
|
||||
|
||||
#include <netlist_exporters/netlist_exporter_pspice.h>
|
||||
#include <vector>
|
||||
|
||||
#include "sim_types.h"
|
||||
|
||||
/// Special netlist exporter flavor that allows to override simulation commands
|
||||
class NETLIST_EXPORTER_PSPICE_SIM : public NETLIST_EXPORTER_PSPICE
|
||||
{
|
||||
public:
|
||||
NETLIST_EXPORTER_PSPICE_SIM( NETLIST_OBJECT_LIST* aMasterList, PART_LIBS* aLibs,
|
||||
SEARCH_STACK* aPaths = NULL ) :
|
||||
NETLIST_EXPORTER_PSPICE( aMasterList, aLibs, aPaths )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns name of Spice dataset for a specific plot.
|
||||
* @param aName is name of the measured net or device
|
||||
* @param aType describes the type of expected plot
|
||||
* @param aParam is an optional parameter for devices, if absent it will return current (only
|
||||
* for passive devices).
|
||||
* @return Empty string if query is invalid, otherwise a plot name that
|
||||
* can be requested from the simulator.
|
||||
*/
|
||||
wxString GetSpiceVector( const wxString& aName, SIM_PLOT_TYPE aType,
|
||||
const wxString& aParam = wxEmptyString ) const;
|
||||
|
||||
/**
|
||||
* @brief Returns name of Spice device corresponding to a schematic component.
|
||||
* @param aComponent is the component reference.
|
||||
* @return Spice device name or empty string if there is no such component in the netlist.
|
||||
*/
|
||||
wxString GetSpiceDevice( const wxString& aComponent ) const;
|
||||
|
||||
/**
|
||||
* @brief Returns a list of currents that can be probed in a Spice primitive.
|
||||
*/
|
||||
static const std::vector<wxString>& GetCurrents( SPICE_PRIMITIVE aPrimitive );
|
||||
|
||||
/**
|
||||
* @brief Overrides the simulation command directive.
|
||||
*/
|
||||
void SetSimCommand( const wxString& aCmd )
|
||||
{
|
||||
m_simCommand = aCmd;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the simulation command directive.
|
||||
*/
|
||||
const wxString& GetSimCommand() const
|
||||
{
|
||||
return m_simCommand;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Clears the simulation command directive.
|
||||
*/
|
||||
void ClearSimCommand()
|
||||
{
|
||||
m_simCommand.Clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns simulation type basing on the simulation command directives.
|
||||
* Simulation directives set using SetSimCommand() have priority over the ones placed in
|
||||
* schematic sheets.
|
||||
*/
|
||||
SIM_TYPE GetSimType();
|
||||
|
||||
/**
|
||||
* @brief Returns simulation command directives placed in schematic sheets (if any).
|
||||
*/
|
||||
wxString GetSheetSimCommand();
|
||||
|
||||
/**
|
||||
* @brief Determines if a directive is a simulation command.
|
||||
*/
|
||||
static bool IsSimCommand( const wxString& aCmd )
|
||||
{
|
||||
return CommandToSimType( aCmd ) != ST_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns simulation type basing on a simulation command directive.
|
||||
*/
|
||||
static SIM_TYPE CommandToSimType( const wxString& aCmd );
|
||||
|
||||
protected:
|
||||
void writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const override;
|
||||
|
||||
private:
|
||||
|
||||
///> Custom simulation command (has priority over the schematic sheet simulation commands)
|
||||
wxString m_simCommand;
|
||||
};
|
||||
|
||||
#endif /* NETLIST_EXPORTER_PSPICE_SIM_H */
|
|
@ -0,0 +1,370 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "spice_reporter.h"
|
||||
|
||||
#include <wx/dynlib.h>
|
||||
#include <wx/log.h>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
using namespace std;
|
||||
|
||||
NGSPICE::NGSPICE()
|
||||
{
|
||||
init_dll();
|
||||
}
|
||||
|
||||
|
||||
NGSPICE::~NGSPICE()
|
||||
{
|
||||
delete m_dll;
|
||||
}
|
||||
|
||||
|
||||
void NGSPICE::Init()
|
||||
{
|
||||
if( m_error )
|
||||
{
|
||||
delete m_dll;
|
||||
init_dll();
|
||||
}
|
||||
|
||||
Command( "reset" );
|
||||
}
|
||||
|
||||
|
||||
vector<COMPLEX> NGSPICE::GetPlot( const string& aName, int aMaxLen )
|
||||
{
|
||||
vector<COMPLEX> data;
|
||||
setlocale( LC_ALL, "C" );
|
||||
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
if( vi )
|
||||
{
|
||||
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
|
||||
data.reserve( length );
|
||||
|
||||
if( vi->v_realdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
data.push_back( COMPLEX( vi->v_realdata[i], 0.0 ) );
|
||||
}
|
||||
else if( vi->v_compdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
data.push_back( COMPLEX( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
vector<double> NGSPICE::GetRealPlot( const string& aName, int aMaxLen )
|
||||
{
|
||||
vector<double> data;
|
||||
setlocale( LC_ALL, "C" );
|
||||
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
if( vi )
|
||||
{
|
||||
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
|
||||
data.reserve( length );
|
||||
|
||||
if( vi->v_realdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
{
|
||||
data.push_back( vi->v_realdata[i] );
|
||||
}
|
||||
}
|
||||
else if( vi->v_compdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
{
|
||||
assert( vi->v_compdata[i].cx_imag == 0.0 );
|
||||
data.push_back( vi->v_compdata[i].cx_real );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
vector<double> NGSPICE::GetImagPlot( const string& aName, int aMaxLen )
|
||||
{
|
||||
vector<double> data;
|
||||
|
||||
setlocale( LC_ALL, "C" );
|
||||
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
if( vi )
|
||||
{
|
||||
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
|
||||
data.reserve( length );
|
||||
|
||||
if( vi->v_compdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
{
|
||||
data.push_back( vi->v_compdata[i].cx_imag );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
vector<double> NGSPICE::GetMagPlot( const string& aName, int aMaxLen )
|
||||
{
|
||||
vector<double> data;
|
||||
|
||||
setlocale( LC_ALL, "C" );
|
||||
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
if( vi )
|
||||
{
|
||||
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
|
||||
data.reserve( length );
|
||||
|
||||
if( vi->v_realdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
data.push_back( vi->v_realdata[i] );
|
||||
}
|
||||
else if( vi->v_compdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
data.push_back( hypot( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
vector<double> NGSPICE::GetPhasePlot( const string& aName, int aMaxLen )
|
||||
{
|
||||
vector<double> data;
|
||||
|
||||
setlocale( LC_ALL, "C" );
|
||||
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
if( vi )
|
||||
{
|
||||
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
|
||||
data.reserve( length );
|
||||
|
||||
if( vi->v_realdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
data.push_back( 0.0 ); // well, that's life
|
||||
}
|
||||
else if( vi->v_compdata )
|
||||
{
|
||||
for( int i = 0; i < length; i++ )
|
||||
data.push_back( atan2( vi->v_compdata[i].cx_imag, vi->v_compdata[i].cx_real ) );
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
bool NGSPICE::LoadNetlist( const string& aNetlist )
|
||||
{
|
||||
vector<char*> lines;
|
||||
stringstream ss( aNetlist );
|
||||
|
||||
while( !ss.eof() )
|
||||
{
|
||||
char line[1024];
|
||||
ss.getline( line, sizeof( line ) );
|
||||
lines.push_back( strdup( line ) );
|
||||
}
|
||||
|
||||
lines.push_back( nullptr );
|
||||
|
||||
setlocale( LC_ALL, "C" );
|
||||
m_ngSpice_Circ( lines.data() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
for( auto line : lines )
|
||||
delete line;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool NGSPICE::Run()
|
||||
{
|
||||
setlocale( LC_ALL, "C" );
|
||||
bool rv = Command( "bg_run" ); // bg_* commands execute in a separate thread
|
||||
setlocale( LC_ALL, "" );
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
bool NGSPICE::Stop()
|
||||
{
|
||||
setlocale( LC_ALL, "C" );
|
||||
bool rv = Command( "bg_halt" ); // bg_* commands execute in a separate thread
|
||||
setlocale( LC_ALL, "" );
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
bool NGSPICE::IsRunning()
|
||||
{
|
||||
setlocale( LC_ALL, "C" );
|
||||
bool rv = m_ngSpice_Running();
|
||||
setlocale( LC_ALL, "" );
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
bool NGSPICE::Command( const string& aCmd )
|
||||
{
|
||||
setlocale( LC_ALL, "C" );
|
||||
m_ngSpice_Command( (char*) aCmd.c_str() );
|
||||
setlocale( LC_ALL, "" );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
string NGSPICE::GetXAxis( SIM_TYPE aType ) const
|
||||
{
|
||||
switch( aType )
|
||||
{
|
||||
case ST_AC:
|
||||
case ST_NOISE:
|
||||
return string( "frequency" );
|
||||
break;
|
||||
|
||||
case ST_DC:
|
||||
return string( "v-sweep" );
|
||||
break;
|
||||
|
||||
case ST_TRANSIENT:
|
||||
return string( "time" );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return string( "" );
|
||||
}
|
||||
|
||||
|
||||
void NGSPICE::init_dll()
|
||||
{
|
||||
#ifdef __WINDOWS__
|
||||
m_dll = new wxDynamicLibrary( "libngspice-0.dll" );
|
||||
#else
|
||||
m_dll = new wxDynamicLibrary( wxDynamicLibrary::CanonicalizeName( "ngspice" ) );
|
||||
#endif
|
||||
|
||||
if( !m_dll || !m_dll->IsLoaded() )
|
||||
throw std::runtime_error( "Missing ngspice shared library" );
|
||||
|
||||
m_error = false;
|
||||
|
||||
// Obtain function pointers
|
||||
m_ngSpice_Init = (ngSpice_Init) m_dll->GetSymbol( "ngSpice_Init" );
|
||||
m_ngSpice_Circ = (ngSpice_Circ) m_dll->GetSymbol( "ngSpice_Circ" );
|
||||
m_ngSpice_Command = (ngSpice_Command) m_dll->GetSymbol( "ngSpice_Command" );
|
||||
m_ngGet_Vec_Info = (ngGet_Vec_Info) m_dll->GetSymbol( "ngGet_Vec_Info" );
|
||||
m_ngSpice_AllPlots = (ngSpice_AllPlots) m_dll->GetSymbol( "ngSpice_AllPlots" );
|
||||
m_ngSpice_AllVecs = (ngSpice_AllVecs) m_dll->GetSymbol( "ngSpice_AllVecs" );
|
||||
m_ngSpice_Running = (ngSpice_Running) m_dll->GetSymbol( "ngSpice_running" ); // it is not a typo
|
||||
|
||||
setlocale( LC_ALL, "C" );
|
||||
m_ngSpice_Init( &cbSendChar, &cbSendStat, &cbControlledExit, NULL, NULL, &cbBGThreadRunning, this );
|
||||
// Workaround to avoid hang ups on certain errors
|
||||
Command( "unset interactive" );
|
||||
setlocale( LC_ALL, "" );
|
||||
}
|
||||
|
||||
|
||||
int NGSPICE::cbSendChar( char* what, int id, void* user )
|
||||
{
|
||||
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
|
||||
|
||||
if( sim->m_reporter )
|
||||
{
|
||||
// strip stdout/stderr from the line
|
||||
if( ( strncasecmp( what, "stdout ", 7 ) == 0 )
|
||||
|| ( strncasecmp( what, "stderr ", 7 ) == 0 ) )
|
||||
what += 7;
|
||||
|
||||
sim->m_reporter->Report( what );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int NGSPICE::cbSendStat( char* what, int id, void* user )
|
||||
{
|
||||
/* NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
|
||||
if( sim->m_consoleReporter )
|
||||
sim->m_consoleReporter->Report( what );*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int NGSPICE::cbBGThreadRunning( bool is_running, int id, void* user )
|
||||
{
|
||||
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
|
||||
|
||||
if( sim->m_reporter )
|
||||
// I know the test below seems like an error, but well, it works somehow..
|
||||
sim->m_reporter->OnSimStateChange( sim, is_running ? SIM_IDLE : SIM_RUNNING );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int NGSPICE::cbControlledExit( int status, bool immediate, bool exit_upon_quit, int id, void* user )
|
||||
{
|
||||
// Something went wrong, reload the dll
|
||||
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
|
||||
sim->m_error = true;
|
||||
//printf("stat %d immed %d quit %d\n", status, !!immediate, !!exit_upon_quit);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef NGSPICE_H
|
||||
#define NGSPICE_H
|
||||
|
||||
#include <../share/ngspice/include/ngspice/sharedspice.h>
|
||||
#include "spice_simulator.h"
|
||||
|
||||
class wxDynamicLibrary;
|
||||
|
||||
class NGSPICE : public SPICE_SIMULATOR {
|
||||
|
||||
public:
|
||||
NGSPICE();
|
||||
virtual ~NGSPICE();
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::Init()
|
||||
void Init() override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::LoadNetlist()
|
||||
bool LoadNetlist( const std::string& aNetlist ) override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::Run()
|
||||
bool Run() override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::Stop()
|
||||
bool Stop() override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::IsRunning()
|
||||
bool IsRunning() override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::Command()
|
||||
bool Command( const std::string& aCmd ) override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::GetXAxis()
|
||||
std::string GetXAxis( SIM_TYPE aType ) const override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::GetPlot()
|
||||
std::vector<COMPLEX> GetPlot( const std::string& aName, int aMaxLen = -1 ) override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::GetRealPlot()
|
||||
std::vector<double> GetRealPlot( const std::string& aName, int aMaxLen = -1 ) override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::GetImagPlot()
|
||||
std::vector<double> GetImagPlot( const std::string& aName, int aMaxLen = -1 ) override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::GetMagPlot()
|
||||
std::vector<double> GetMagPlot( const std::string& aName, int aMaxLen = -1 ) override;
|
||||
|
||||
///> @copydoc SPICE_SIMULATOR::GetPhasePlot()
|
||||
std::vector<double> GetPhasePlot( const std::string& aName, int aMaxLen = -1 ) override;
|
||||
|
||||
private:
|
||||
bool m_error;
|
||||
|
||||
// Performs DLL initialization, obtains function pointers
|
||||
void init_dll();
|
||||
|
||||
// ngspice library functions
|
||||
typedef void (*ngSpice_Init)( SendChar*, SendStat*, ControlledExit*,
|
||||
SendData*, SendInitData*, BGThreadRunning*, void* );
|
||||
typedef int (*ngSpice_Circ)( char** circarray );
|
||||
typedef int (*ngSpice_Command)( char* command );
|
||||
typedef pvector_info (*ngGet_Vec_Info)( char* vecname );
|
||||
typedef char** (*ngSpice_AllPlots)( void );
|
||||
typedef char** (*ngSpice_AllVecs)( char* plotname );
|
||||
typedef bool (*ngSpice_Running)( void );
|
||||
|
||||
///> Handles to DLL functions
|
||||
ngSpice_Init m_ngSpice_Init;
|
||||
ngSpice_Circ m_ngSpice_Circ;
|
||||
ngSpice_Command m_ngSpice_Command;
|
||||
ngGet_Vec_Info m_ngGet_Vec_Info;
|
||||
ngSpice_AllPlots m_ngSpice_AllPlots;
|
||||
ngSpice_AllVecs m_ngSpice_AllVecs;
|
||||
ngSpice_Running m_ngSpice_Running;
|
||||
|
||||
wxDynamicLibrary* m_dll;
|
||||
|
||||
// Callback functions
|
||||
static int cbSendChar( char* what, int id, void* user );
|
||||
static int cbSendStat( char* what, int id, void* user );
|
||||
static int cbBGThreadRunning( bool is_running, int id, void* user );
|
||||
static int cbControlledExit( int status, bool immediate, bool exit_upon_quit, int id, void* user );
|
||||
|
||||
void dump();
|
||||
};
|
||||
|
||||
#endif /* NGSPICE_H */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,328 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef __sim_plot_frame__
|
||||
#define __sim_plot_frame__
|
||||
|
||||
/**
|
||||
* @file Subclass of SIM_PLOT_FRAME_BASE, which is generated by wxFormBuilder.
|
||||
*/
|
||||
|
||||
#include "sim_plot_frame_base.h"
|
||||
#include "sim_types.h"
|
||||
|
||||
#include <kiway_player.h>
|
||||
#include <dialogs/dialog_sim_settings.h>
|
||||
|
||||
#include <wx/event.h>
|
||||
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
|
||||
class SCH_EDIT_FRAME;
|
||||
class SCH_COMPONENT;
|
||||
|
||||
class SPICE_SIMULATOR;
|
||||
class NETLIST_EXPORTER_PSPICE_SIM;
|
||||
class SIM_PLOT_PANEL;
|
||||
class TUNER_SLIDER;
|
||||
|
||||
///> Trace descriptor class
|
||||
class TRACE_DESC
|
||||
{
|
||||
public:
|
||||
TRACE_DESC( const NETLIST_EXPORTER_PSPICE_SIM& aExporter, const wxString& aName,
|
||||
SIM_PLOT_TYPE aType, const wxString& aParam );
|
||||
|
||||
///> Modifies an existing TRACE_DESC simulation type
|
||||
TRACE_DESC( const NETLIST_EXPORTER_PSPICE_SIM& aExporter,
|
||||
const TRACE_DESC& aDescription, SIM_PLOT_TYPE aNewType )
|
||||
: TRACE_DESC( aExporter, aDescription.GetName(), aNewType, aDescription.GetParam() )
|
||||
{
|
||||
}
|
||||
|
||||
const wxString& GetTitle() const
|
||||
{
|
||||
return m_title;
|
||||
}
|
||||
|
||||
const wxString& GetName() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
const wxString& GetParam() const
|
||||
{
|
||||
return m_param;
|
||||
}
|
||||
|
||||
SIM_PLOT_TYPE GetType() const
|
||||
{
|
||||
return m_type;
|
||||
}
|
||||
|
||||
private:
|
||||
// Three basic parameters
|
||||
///> Name of the measured net/device
|
||||
wxString m_name;
|
||||
|
||||
///> Type of the signal
|
||||
SIM_PLOT_TYPE m_type;
|
||||
|
||||
///> Name of the signal parameter
|
||||
wxString m_param;
|
||||
|
||||
// Generated data
|
||||
///> Title displayed in the signal list/plot legend
|
||||
wxString m_title;
|
||||
};
|
||||
|
||||
/** Implementing SIM_PLOT_FRAME_BASE */
|
||||
class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE
|
||||
{
|
||||
public:
|
||||
/** Constructor */
|
||||
SIM_PLOT_FRAME( KIWAY* aKiway, wxWindow* aParent );
|
||||
~SIM_PLOT_FRAME();
|
||||
|
||||
void StartSimulation();
|
||||
void StopSimulation();
|
||||
bool IsSimulationRunning();
|
||||
|
||||
/**
|
||||
* @brief Creates a new plot panel for a given simulation type and adds it to the main
|
||||
* notebook.
|
||||
* @param aSimType is requested simulation type.
|
||||
* @return The new plot panel.
|
||||
*/
|
||||
SIM_PLOT_PANEL* NewPlotPanel( SIM_TYPE aSimType );
|
||||
|
||||
/**
|
||||
* @brief Adds a voltage plot for a given net name.
|
||||
* @param aNetName is the net name for which a voltage plot should be created.
|
||||
*/
|
||||
void AddVoltagePlot( const wxString& aNetName );
|
||||
|
||||
/**
|
||||
* @brief Adds a current plot for a particular device.
|
||||
* @param aDeviceName is the device name (e.g. R1, C1).
|
||||
* @param aParam is the current type (e.g. I, Ic, Id).
|
||||
*/
|
||||
void AddCurrentPlot( const wxString& aDeviceName, const wxString& aParam );
|
||||
|
||||
/**
|
||||
* @brief Adds a tuner for a component.
|
||||
*/
|
||||
void AddTuner( SCH_COMPONENT* aComponent );
|
||||
|
||||
/**
|
||||
* @brief Removes an existing tuner.
|
||||
* @param aTuner is the tuner to be removed.
|
||||
* @param aErase decides whether the tuner should be also removed from the tuners list.
|
||||
* Otherwise it is removed only from the SIM_PLOT_FRAME pane.
|
||||
*/
|
||||
void RemoveTuner( TUNER_SLIDER* aTuner, bool aErase = true );
|
||||
|
||||
/**
|
||||
* @brief Returns the currently opened plot panel (or NULL if there is none).
|
||||
*/
|
||||
SIM_PLOT_PANEL* CurrentPlot() const;
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief Adds a new plot to the current panel.
|
||||
* @param aName is the device/net name.
|
||||
* @param aType describes the type of plot.
|
||||
* @param aParam is the parameter for the device/net (e.g. I, Id, V).
|
||||
*/
|
||||
void addPlot( const wxString& aName, SIM_PLOT_TYPE aType, const wxString& aParam );
|
||||
|
||||
/**
|
||||
* @brief Removes a plot with a specific title.
|
||||
* @param aPlotName is the full plot title (e.g. I(Net-C1-Pad1)).
|
||||
* @param aErase decides if plot should be removed from corresponding TRACE_MAP (see m_plots).
|
||||
*/
|
||||
void removePlot( const wxString& aPlotName, bool aErase = true );
|
||||
|
||||
/**
|
||||
* @brief Reloads the current schematic for the netlist exporter.
|
||||
*/
|
||||
void updateNetlistExporter();
|
||||
|
||||
/**
|
||||
* @brief Updates plot in a particular SIM_PLOT_PANEL. If the panel does not contain
|
||||
* the plot, it will be added.
|
||||
* @param aDescriptor contains the plot description.
|
||||
* @param aPanel is the panel that should receive the update.
|
||||
* @return True if a plot was successfully added/updated.
|
||||
*/
|
||||
bool updatePlot( const TRACE_DESC& aDescriptor, SIM_PLOT_PANEL* aPanel );
|
||||
|
||||
/**
|
||||
* @brief Updates the list of currently plotted signals.
|
||||
*/
|
||||
void updateSignalList();
|
||||
|
||||
/**
|
||||
* @brief Updates the cursor values list.
|
||||
*/
|
||||
void updateCursors();
|
||||
|
||||
/**
|
||||
* @brief Filters out tuners for components that do not exist anymore.
|
||||
* Decisions are based on the current NETLIST_EXPORTER data.
|
||||
*/
|
||||
void updateTuners();
|
||||
|
||||
/**
|
||||
* @brief Applies component values specified using tunder sliders to the current netlist.
|
||||
*/
|
||||
void applyTuners();
|
||||
|
||||
/**
|
||||
* @brief Loads plot settings from a file.
|
||||
* @param aPath is the file name.
|
||||
* @return True if successful.
|
||||
*/
|
||||
bool loadWorkbook( const wxString& aPath );
|
||||
|
||||
/**
|
||||
* @brief Saves plot settings to a file.
|
||||
* @param aPath is the file name.
|
||||
* @return True if successful.
|
||||
*/
|
||||
bool saveWorkbook( const wxString& aPath );
|
||||
|
||||
/**
|
||||
* @brief Returns X axis for a given simulation type.
|
||||
*/
|
||||
SIM_PLOT_TYPE GetXAxisType( SIM_TYPE aType ) const;
|
||||
|
||||
// Menu handlers
|
||||
void menuNewPlot( wxCommandEvent& aEvent ) override;
|
||||
void menuOpenWorkbook( wxCommandEvent& event ) override;
|
||||
void menuSaveWorkbook( wxCommandEvent& event ) override;
|
||||
|
||||
void menuExit( wxCommandEvent& event ) override
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
void menuSaveImage( wxCommandEvent& event ) override;
|
||||
void menuSaveCsv( wxCommandEvent& event ) override;
|
||||
void menuZoomIn( wxCommandEvent& event ) override;
|
||||
void menuZoomOut( wxCommandEvent& event ) override;
|
||||
void menuZoomFit( wxCommandEvent& event ) override;
|
||||
void menuShowGrid( wxCommandEvent& event ) override;
|
||||
void menuShowGridUpdate( wxUpdateUIEvent& event ) override;
|
||||
void menuShowLegend( wxCommandEvent& event ) override;
|
||||
void menuShowLegendUpdate( wxUpdateUIEvent& event ) override;
|
||||
|
||||
// Event handlers
|
||||
void onPlotChanged( wxAuiNotebookEvent& event ) override;
|
||||
void onPlotClose( wxAuiNotebookEvent& event ) override;
|
||||
|
||||
void onSignalDblClick( wxCommandEvent& event ) override;
|
||||
void onSignalRClick( wxMouseEvent& event ) override;
|
||||
|
||||
void onSimulate( wxCommandEvent& event );
|
||||
void onSettings( wxCommandEvent& event );
|
||||
void onAddSignal( wxCommandEvent& event );
|
||||
void onProbe( wxCommandEvent& event );
|
||||
void onTune( wxCommandEvent& event );
|
||||
|
||||
void onClose( wxCloseEvent& aEvent );
|
||||
|
||||
void onCursorUpdate( wxCommandEvent& aEvent );
|
||||
void onSimUpdate( wxCommandEvent& aEvent );
|
||||
void onSimReport( wxCommandEvent& aEvent );
|
||||
void onSimStarted( wxCommandEvent& aEvent );
|
||||
void onSimFinished( wxCommandEvent& aEvent );
|
||||
|
||||
// Toolbar buttons
|
||||
wxToolBarToolBase* m_toolSimulate;
|
||||
wxToolBarToolBase* m_toolAddSignals;
|
||||
wxToolBarToolBase* m_toolProbe;
|
||||
wxToolBarToolBase* m_toolTune;
|
||||
wxToolBarToolBase* m_toolSettings;
|
||||
|
||||
SCH_EDIT_FRAME* m_schematicFrame;
|
||||
std::unique_ptr<NETLIST_EXPORTER_PSPICE_SIM> m_exporter;
|
||||
std::unique_ptr<SPICE_SIMULATOR> m_simulator;
|
||||
|
||||
typedef std::map<wxString, TRACE_DESC> TRACE_MAP;
|
||||
|
||||
struct PLOT_INFO
|
||||
{
|
||||
///> Map of the traces displayed on the plot
|
||||
TRACE_MAP m_traces;
|
||||
|
||||
///> Spice directive used to execute the simulation
|
||||
wxString m_simCommand;
|
||||
};
|
||||
|
||||
///> Map of plot panels and associated data
|
||||
std::map<SIM_PLOT_PANEL*, PLOT_INFO> m_plots;
|
||||
|
||||
///> List of currently displayed tuners
|
||||
std::list<TUNER_SLIDER*> m_tuners;
|
||||
|
||||
// Trick to preserve settings between runs
|
||||
DIALOG_SIM_SETTINGS m_settingsDlg;
|
||||
|
||||
// Right click context menu for signals in the listbox
|
||||
class SIGNAL_CONTEXT_MENU : public wxMenu
|
||||
{
|
||||
public:
|
||||
SIGNAL_CONTEXT_MENU( const wxString& aSignal, SIM_PLOT_FRAME* aPlotFrame );
|
||||
|
||||
private:
|
||||
void onMenuEvent( wxMenuEvent& aEvent );
|
||||
|
||||
const wxString& m_signal;
|
||||
SIM_PLOT_FRAME* m_plotFrame;
|
||||
|
||||
enum SIGNAL_CONTEXT_MENU_EVENTS
|
||||
{
|
||||
HIDE_SIGNAL,
|
||||
SHOW_CURSOR,
|
||||
HIDE_CURSOR
|
||||
};
|
||||
};
|
||||
|
||||
///> Panel that was used as the most recent one for simulations
|
||||
SIM_PLOT_PANEL* m_lastSimPlot;
|
||||
};
|
||||
|
||||
// Commands
|
||||
wxDECLARE_EVENT( EVT_SIM_UPDATE, wxCommandEvent );
|
||||
wxDECLARE_EVENT( EVT_SIM_REPORT, wxCommandEvent );
|
||||
|
||||
// Notifications
|
||||
wxDECLARE_EVENT( EVT_SIM_STARTED, wxCommandEvent );
|
||||
wxDECLARE_EVENT( EVT_SIM_FINISHED, wxCommandEvent );
|
||||
|
||||
#endif // __sim_plot_frame__
|
|
@ -0,0 +1,265 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "sim_plot_frame_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SIM_PLOT_FRAME_BASE::SIM_PLOT_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : KIWAY_PLAYER( parent, id, title, pos, size, style, name )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
m_mainMenu = new wxMenuBar( 0 );
|
||||
m_fileMenu = new wxMenu();
|
||||
wxMenuItem* m_newPlot;
|
||||
m_newPlot = new wxMenuItem( m_fileMenu, wxID_NEW, wxString( _("New Plot") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_fileMenu->Append( m_newPlot );
|
||||
|
||||
m_fileMenu->AppendSeparator();
|
||||
|
||||
wxMenuItem* m_openWorkbook;
|
||||
m_openWorkbook = new wxMenuItem( m_fileMenu, wxID_OPEN, wxString( _("Open Workbook") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_fileMenu->Append( m_openWorkbook );
|
||||
|
||||
wxMenuItem* m_saveWorkbook;
|
||||
m_saveWorkbook = new wxMenuItem( m_fileMenu, wxID_SAVE, wxString( _("Save Workbook") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_fileMenu->Append( m_saveWorkbook );
|
||||
|
||||
m_fileMenu->AppendSeparator();
|
||||
|
||||
wxMenuItem* m_saveImage;
|
||||
m_saveImage = new wxMenuItem( m_fileMenu, wxID_ANY, wxString( _("Save as image") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_fileMenu->Append( m_saveImage );
|
||||
|
||||
wxMenuItem* m_saveCsv;
|
||||
m_saveCsv = new wxMenuItem( m_fileMenu, wxID_ANY, wxString( _("Save as .csv file") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_fileMenu->Append( m_saveCsv );
|
||||
|
||||
m_fileMenu->AppendSeparator();
|
||||
|
||||
wxMenuItem* m_exitSim;
|
||||
m_exitSim = new wxMenuItem( m_fileMenu, wxID_CLOSE, wxString( _("Exit Simulation") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_fileMenu->Append( m_exitSim );
|
||||
|
||||
m_mainMenu->Append( m_fileMenu, _("File") );
|
||||
|
||||
m_simulationMenu = new wxMenu();
|
||||
m_runSimulation = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Run Simulation") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_simulationMenu->Append( m_runSimulation );
|
||||
|
||||
m_simulationMenu->AppendSeparator();
|
||||
|
||||
m_addSignals = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Add signals...") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_simulationMenu->Append( m_addSignals );
|
||||
|
||||
m_probeSignals = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Probe from schematics") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_simulationMenu->Append( m_probeSignals );
|
||||
|
||||
m_tuneValue = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Tune component value") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_simulationMenu->Append( m_tuneValue );
|
||||
|
||||
m_simulationMenu->AppendSeparator();
|
||||
|
||||
m_settings = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Settings...") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_simulationMenu->Append( m_settings );
|
||||
|
||||
m_mainMenu->Append( m_simulationMenu, _("Simulation") );
|
||||
|
||||
m_viewMenu = new wxMenu();
|
||||
wxMenuItem* m_zoomIn;
|
||||
m_zoomIn = new wxMenuItem( m_viewMenu, wxID_ZOOM_IN, wxString( _("Zoom In") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_viewMenu->Append( m_zoomIn );
|
||||
|
||||
wxMenuItem* m_zoomOut;
|
||||
m_zoomOut = new wxMenuItem( m_viewMenu, wxID_ZOOM_OUT, wxString( _("Zoom Out") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_viewMenu->Append( m_zoomOut );
|
||||
|
||||
wxMenuItem* m_zoomFit;
|
||||
m_zoomFit = new wxMenuItem( m_viewMenu, wxID_ZOOM_FIT, wxString( _("Fit on Screen") ) , wxEmptyString, wxITEM_NORMAL );
|
||||
m_viewMenu->Append( m_zoomFit );
|
||||
|
||||
m_viewMenu->AppendSeparator();
|
||||
|
||||
wxMenuItem* m_showGrid;
|
||||
m_showGrid = new wxMenuItem( m_viewMenu, wxID_ANY, wxString( _("Show &grid") ) , wxEmptyString, wxITEM_CHECK );
|
||||
m_viewMenu->Append( m_showGrid );
|
||||
|
||||
wxMenuItem* m_showLegend;
|
||||
m_showLegend = new wxMenuItem( m_viewMenu, wxID_ANY, wxString( _("Show &legend") ) , wxEmptyString, wxITEM_CHECK );
|
||||
m_viewMenu->Append( m_showLegend );
|
||||
|
||||
m_mainMenu->Append( m_viewMenu, _("View") );
|
||||
|
||||
this->SetMenuBar( m_mainMenu );
|
||||
|
||||
m_sizer1 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_toolBar = new wxToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_FLAT|wxTB_HORIZONTAL|wxTB_TEXT );
|
||||
m_toolBar->Realize();
|
||||
|
||||
m_sizer1->Add( m_toolBar, 0, wxEXPAND, 5 );
|
||||
|
||||
m_splitterPlot = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D );
|
||||
m_splitterPlot->SetSashGravity( 0.8 );
|
||||
m_splitterPlot->Connect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterPlotOnIdle ), NULL, this );
|
||||
|
||||
m_panel2 = new wxPanel( m_splitterPlot, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_sizer11 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_splitterConsole = new wxSplitterWindow( m_panel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D );
|
||||
m_splitterConsole->SetSashGravity( 0.8 );
|
||||
m_splitterConsole->Connect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterConsoleOnIdle ), NULL, this );
|
||||
|
||||
m_plotPanel = new wxPanel( m_splitterConsole, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_sizer5 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
m_plotNotebook = new wxAuiNotebook( m_plotPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_NB_MIDDLE_CLICK_CLOSE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT|wxAUI_NB_TOP );
|
||||
m_welcomePanel = new wxPanel( m_plotNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_sizer8 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
m_sizer8->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizer81;
|
||||
bSizer81 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticText2 = new wxStaticText( m_welcomePanel, wxID_ANY, _("Start the simulation by clicking the Run Simulation button"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText2->Wrap( -1 );
|
||||
m_staticText2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
|
||||
m_staticText2->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
|
||||
|
||||
bSizer81->Add( m_staticText2, 0, wxALIGN_RIGHT|wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_sizer8->Add( bSizer81, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_sizer8->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_welcomePanel->SetSizer( m_sizer8 );
|
||||
m_welcomePanel->Layout();
|
||||
m_sizer8->Fit( m_welcomePanel );
|
||||
m_plotNotebook->AddPage( m_welcomePanel, _("a page"), false, wxNullBitmap );
|
||||
|
||||
m_sizer5->Add( m_plotNotebook, 1, wxEXPAND | wxALL, 5 );
|
||||
|
||||
|
||||
m_plotPanel->SetSizer( m_sizer5 );
|
||||
m_plotPanel->Layout();
|
||||
m_sizer5->Fit( m_plotPanel );
|
||||
m_panel5 = new wxPanel( m_splitterConsole, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_sizer13 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_simConsole = new wxTextCtrl( m_panel5, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
|
||||
m_simConsole->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
|
||||
|
||||
m_sizer13->Add( m_simConsole, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panel5->SetSizer( m_sizer13 );
|
||||
m_panel5->Layout();
|
||||
m_sizer13->Fit( m_panel5 );
|
||||
m_splitterConsole->SplitHorizontally( m_plotPanel, m_panel5, 500 );
|
||||
m_sizer11->Add( m_splitterConsole, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panel2->SetSizer( m_sizer11 );
|
||||
m_panel2->Layout();
|
||||
m_sizer11->Fit( m_panel2 );
|
||||
m_sidePanel = new wxPanel( m_splitterPlot, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_sideSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxStaticBoxSizer* sbSizer1;
|
||||
sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( m_sidePanel, wxID_ANY, _("Signals") ), wxVERTICAL );
|
||||
|
||||
m_signals = new wxListBox( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE|wxLB_SORT );
|
||||
sbSizer1->Add( m_signals, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_sideSizer->Add( sbSizer1, 1, wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbSizer3;
|
||||
sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_sidePanel, wxID_ANY, _("Cursors") ), wxVERTICAL );
|
||||
|
||||
m_cursors = new wxListCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_SINGLE_SEL );
|
||||
sbSizer3->Add( m_cursors, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_sideSizer->Add( sbSizer3, 1, wxEXPAND, 5 );
|
||||
|
||||
sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_sidePanel, wxID_ANY, _("Tune") ), wxVERTICAL );
|
||||
|
||||
m_tuneSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
sbSizer4->Add( m_tuneSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_sideSizer->Add( sbSizer4, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_sidePanel->SetSizer( m_sideSizer );
|
||||
m_sidePanel->Layout();
|
||||
m_sideSizer->Fit( m_sidePanel );
|
||||
m_splitterPlot->SplitVertically( m_panel2, m_sidePanel, 700 );
|
||||
m_sizer1->Add( m_splitterPlot, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( m_sizer1 );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
this->Connect( m_newPlot->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuNewPlot ) );
|
||||
this->Connect( m_openWorkbook->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuOpenWorkbook ) );
|
||||
this->Connect( m_saveWorkbook->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveWorkbook ) );
|
||||
this->Connect( m_saveImage->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveImage ) );
|
||||
this->Connect( m_saveCsv->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveCsv ) );
|
||||
this->Connect( m_exitSim->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuExit ) );
|
||||
this->Connect( m_zoomIn->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomIn ) );
|
||||
this->Connect( m_zoomOut->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomOut ) );
|
||||
this->Connect( m_zoomFit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomFit ) );
|
||||
this->Connect( m_showGrid->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowGrid ) );
|
||||
this->Connect( m_showGrid->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowGridUpdate ) );
|
||||
this->Connect( m_showLegend->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegend ) );
|
||||
this->Connect( m_showLegend->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegendUpdate ) );
|
||||
m_plotNotebook->Connect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotChanged ), NULL, this );
|
||||
m_plotNotebook->Connect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotClose ), NULL, this );
|
||||
m_signals->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::onSignalDblClick ), NULL, this );
|
||||
m_signals->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( SIM_PLOT_FRAME_BASE::onSignalRClick ), NULL, this );
|
||||
}
|
||||
|
||||
SIM_PLOT_FRAME_BASE::~SIM_PLOT_FRAME_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
this->Disconnect( wxID_NEW, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuNewPlot ) );
|
||||
this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuOpenWorkbook ) );
|
||||
this->Disconnect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveWorkbook ) );
|
||||
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveImage ) );
|
||||
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveCsv ) );
|
||||
this->Disconnect( wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuExit ) );
|
||||
this->Disconnect( wxID_ZOOM_IN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomIn ) );
|
||||
this->Disconnect( wxID_ZOOM_OUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomOut ) );
|
||||
this->Disconnect( wxID_ZOOM_FIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomFit ) );
|
||||
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowGrid ) );
|
||||
this->Disconnect( wxID_ANY, wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowGridUpdate ) );
|
||||
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegend ) );
|
||||
this->Disconnect( wxID_ANY, wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegendUpdate ) );
|
||||
m_plotNotebook->Disconnect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotChanged ), NULL, this );
|
||||
m_plotNotebook->Disconnect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotClose ), NULL, this );
|
||||
m_signals->Disconnect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::onSignalDblClick ), NULL, this );
|
||||
m_signals->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( SIM_PLOT_FRAME_BASE::onSignalRClick ), NULL, this );
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,120 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __SIM_PLOT_FRAME_BASE_H__
|
||||
#define __SIM_PLOT_FRAME_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
class KIWAY_PLAYER;
|
||||
|
||||
#include "kiway_player.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/bitmap.h>
|
||||
#include <wx/image.h>
|
||||
#include <wx/icon.h>
|
||||
#include <wx/menu.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/toolbar.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/panel.h>
|
||||
#include <wx/aui/auibook.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/splitter.h>
|
||||
#include <wx/listbox.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/frame.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class SIM_PLOT_FRAME_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class SIM_PLOT_FRAME_BASE : public KIWAY_PLAYER
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxMenuBar* m_mainMenu;
|
||||
wxMenu* m_fileMenu;
|
||||
wxMenu* m_simulationMenu;
|
||||
wxMenuItem* m_runSimulation;
|
||||
wxMenuItem* m_addSignals;
|
||||
wxMenuItem* m_probeSignals;
|
||||
wxMenuItem* m_tuneValue;
|
||||
wxMenuItem* m_settings;
|
||||
wxMenu* m_viewMenu;
|
||||
wxBoxSizer* m_sizer1;
|
||||
wxToolBar* m_toolBar;
|
||||
wxSplitterWindow* m_splitterPlot;
|
||||
wxPanel* m_panel2;
|
||||
wxBoxSizer* m_sizer11;
|
||||
wxSplitterWindow* m_splitterConsole;
|
||||
wxPanel* m_plotPanel;
|
||||
wxBoxSizer* m_sizer5;
|
||||
wxAuiNotebook* m_plotNotebook;
|
||||
wxPanel* m_welcomePanel;
|
||||
wxBoxSizer* m_sizer8;
|
||||
wxStaticText* m_staticText2;
|
||||
wxPanel* m_panel5;
|
||||
wxBoxSizer* m_sizer13;
|
||||
wxTextCtrl* m_simConsole;
|
||||
wxPanel* m_sidePanel;
|
||||
wxBoxSizer* m_sideSizer;
|
||||
wxListBox* m_signals;
|
||||
wxListCtrl* m_cursors;
|
||||
wxStaticBoxSizer* sbSizer4;
|
||||
wxBoxSizer* m_tuneSizer;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void menuNewPlot( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuOpenWorkbook( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuSaveWorkbook( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuSaveImage( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuSaveCsv( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuExit( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuZoomIn( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuZoomOut( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuZoomFit( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuShowGrid( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuShowGridUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
|
||||
virtual void menuShowLegend( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void menuShowLegendUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
|
||||
virtual void onPlotChanged( wxAuiNotebookEvent& event ) { event.Skip(); }
|
||||
virtual void onPlotClose( wxAuiNotebookEvent& event ) { event.Skip(); }
|
||||
virtual void onSignalDblClick( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onSignalRClick( wxMouseEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
SIM_PLOT_FRAME_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Simulation Workbook"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 1000,700 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("SIM_PLOT_FRAME") );
|
||||
|
||||
~SIM_PLOT_FRAME_BASE();
|
||||
|
||||
void m_splitterPlotOnIdle( wxIdleEvent& )
|
||||
{
|
||||
m_splitterPlot->SetSashPosition( 700 );
|
||||
m_splitterPlot->Disconnect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterPlotOnIdle ), NULL, this );
|
||||
}
|
||||
|
||||
void m_splitterConsoleOnIdle( wxIdleEvent& )
|
||||
{
|
||||
m_splitterConsole->SetSashPosition( 500 );
|
||||
m_splitterConsole->Disconnect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterConsoleOnIdle ), NULL, this );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif //__SIM_PLOT_FRAME_BASE_H__
|
|
@ -0,0 +1,648 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "sim_plot_panel.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
|
||||
static wxString formatFloat( double x, int nDigits )
|
||||
{
|
||||
wxString rv, fmt;
|
||||
|
||||
if( nDigits )
|
||||
{
|
||||
fmt = wxT( "%.0Nf" );
|
||||
fmt[3] = '0' + nDigits;
|
||||
}
|
||||
else
|
||||
{
|
||||
fmt = wxT( "%.0f" );
|
||||
}
|
||||
|
||||
rv.Printf( fmt, x );
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static void getSISuffix( double x, const wxString& unit, int& power, wxString& suffix )
|
||||
{
|
||||
const int n_powers = 11;
|
||||
|
||||
const struct
|
||||
{
|
||||
double exponent;
|
||||
char suffix;
|
||||
} powers[] =
|
||||
{
|
||||
{ -18, 'a' },
|
||||
{ -15, 'f' },
|
||||
{ -12, 'p' },
|
||||
{ -9, 'n' },
|
||||
{ -6, 'u' },
|
||||
{ -3, 'm' },
|
||||
{ 0, 0 },
|
||||
{ 3, 'k' },
|
||||
{ 6, 'M' },
|
||||
{ 9, 'G' },
|
||||
{ 12, 'T' },
|
||||
{ 14, 'P' }
|
||||
};
|
||||
|
||||
power = 0;
|
||||
suffix = unit;
|
||||
|
||||
if( x == 0.0 )
|
||||
return;
|
||||
|
||||
for( int i = 0; i < n_powers - 1; i++ )
|
||||
{
|
||||
double r_cur = pow( 10, powers[i].exponent );
|
||||
|
||||
if( fabs( x ) >= r_cur && fabs( x ) < r_cur * 1000.0 )
|
||||
{
|
||||
power = powers[i].exponent;
|
||||
|
||||
if( powers[i].suffix )
|
||||
suffix = wxString( powers[i].suffix ) + unit;
|
||||
else
|
||||
suffix = unit;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int countDecimalDigits( double x, int maxDigits )
|
||||
{
|
||||
int64_t k = (int)( ( x - floor( x ) ) * pow( 10.0, (double) maxDigits ) );
|
||||
int n = 0;
|
||||
|
||||
while( k && ( ( k % 10LL ) == 0LL || ( k % 10LL ) == 9LL ) )
|
||||
{
|
||||
k /= 10LL;
|
||||
}
|
||||
|
||||
n = 0;
|
||||
|
||||
while( k != 0LL )
|
||||
{
|
||||
n++;
|
||||
k /= 10LL;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
static void formatSILabels( mpScaleBase* scale, const wxString& aUnit, int nDigits )
|
||||
{
|
||||
double maxVis = scale->AbsVisibleMaxValue();
|
||||
|
||||
wxString suffix;
|
||||
int power, digits = 0;
|
||||
|
||||
getSISuffix( maxVis, aUnit, power, suffix );
|
||||
|
||||
double sf = pow( 10.0, power );
|
||||
|
||||
for( auto &l : scale->TickLabels() )
|
||||
{
|
||||
int k = countDecimalDigits( l.pos / sf, nDigits );
|
||||
|
||||
digits = std::max( digits, k );
|
||||
}
|
||||
|
||||
for( auto &l : scale->TickLabels() )
|
||||
{
|
||||
l.label = formatFloat ( l.pos / sf, digits ) + suffix;
|
||||
l.visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class FREQUENCY_LOG_SCALE : public mpScaleXLog
|
||||
{
|
||||
public:
|
||||
FREQUENCY_LOG_SCALE( wxString name, int flags ) :
|
||||
mpScaleXLog( name, flags ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
const wxString unit = wxT( "Hz" );
|
||||
wxString suffix;
|
||||
int power;
|
||||
|
||||
for( auto &l : TickLabels() )
|
||||
{
|
||||
getSISuffix( l.pos, unit, power, suffix );
|
||||
double sf = pow( 10.0, power );
|
||||
int k = countDecimalDigits( l.pos / sf, 3 );
|
||||
|
||||
l.label = formatFloat( l.pos / sf, k ) + suffix;
|
||||
l.visible = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class FREQUENCY_LIN_SCALE : public mpScaleX
|
||||
{
|
||||
public:
|
||||
FREQUENCY_LIN_SCALE( wxString name, int flags ) :
|
||||
mpScaleX( name, flags, false , 0 ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "Hz" ), 3 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class TIME_SCALE : public mpScaleX
|
||||
{
|
||||
public:
|
||||
TIME_SCALE( wxString name, int flags ) :
|
||||
mpScaleX( name, flags, false, 0 ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "s" ), 3 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class VOLTAGE_SCALE_X : public mpScaleX
|
||||
{
|
||||
public:
|
||||
VOLTAGE_SCALE_X( wxString name, int flags ) :
|
||||
mpScaleX( name, flags, false, 0 ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "V" ), 3 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class GAIN_SCALE : public mpScaleY
|
||||
{
|
||||
public:
|
||||
GAIN_SCALE( wxString name, int flags ) :
|
||||
mpScaleY( name, flags, false ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "dB" ), 3 );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class PHASE_SCALE : public mpScaleY
|
||||
{
|
||||
public:
|
||||
PHASE_SCALE( wxString name, int flags ) :
|
||||
mpScaleY( name, flags, false ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "\u00B0" ), 3 ); // degree sign
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class VOLTAGE_SCALE_Y : public mpScaleY
|
||||
{
|
||||
public:
|
||||
VOLTAGE_SCALE_Y( wxString name, int flags ) :
|
||||
mpScaleY( name, flags, false ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "V" ), 3 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class CURRENT_SCALE : public mpScaleY
|
||||
{
|
||||
public:
|
||||
CURRENT_SCALE( wxString name, int flags ) :
|
||||
mpScaleY( name, flags, false ) {};
|
||||
|
||||
void formatLabels()
|
||||
{
|
||||
formatSILabels( this, wxT( "A" ), 3 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void CURSOR::Plot( wxDC& aDC, mpWindow& aWindow )
|
||||
{
|
||||
if( !m_window )
|
||||
m_window = &aWindow;
|
||||
|
||||
if( !m_visible )
|
||||
return;
|
||||
|
||||
const auto& dataX = m_trace->GetDataX();
|
||||
const auto& dataY = m_trace->GetDataY();
|
||||
|
||||
if( dataX.size() <= 1 )
|
||||
return;
|
||||
|
||||
if( m_updateRequired )
|
||||
{
|
||||
m_coords.x = m_trace->s2x( aWindow.p2x( m_dim.x ) );
|
||||
|
||||
// Find the closest point coordinates
|
||||
auto maxXIt = std::upper_bound( dataX.begin(), dataX.end(), m_coords.x );
|
||||
int maxIdx = maxXIt - dataX.begin();
|
||||
int minIdx = maxIdx - 1;
|
||||
|
||||
// Out of bounds checks
|
||||
if( minIdx < 0 )
|
||||
{
|
||||
minIdx = 0;
|
||||
maxIdx = 1;
|
||||
m_coords.x = dataX[0];
|
||||
}
|
||||
else if( maxIdx >= (int) dataX.size() )
|
||||
{
|
||||
maxIdx = dataX.size() - 1;
|
||||
minIdx = maxIdx - 1;
|
||||
m_coords.x = dataX[maxIdx];
|
||||
}
|
||||
|
||||
const double leftX = dataX[minIdx];
|
||||
const double rightX = dataX[maxIdx];
|
||||
const double leftY = dataY[minIdx];
|
||||
const double rightY = dataY[maxIdx];
|
||||
|
||||
// Linear interpolation
|
||||
m_coords.y = leftY + ( rightY - leftY ) / ( rightX - leftX ) * ( m_coords.x - leftX );
|
||||
m_updateRequired = false;
|
||||
|
||||
// Notify the parent window about the changes
|
||||
wxQueueEvent( aWindow.GetParent(), new wxCommandEvent( EVT_SIM_CURSOR_UPDATE ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_updateRef = true;
|
||||
}
|
||||
|
||||
if( m_updateRef )
|
||||
{
|
||||
UpdateReference();
|
||||
m_updateRef = false;
|
||||
}
|
||||
|
||||
// Line length in horizontal and vertical dimensions
|
||||
const wxPoint cursorPos( aWindow.x2p( m_trace->x2s( m_coords.x ) ),
|
||||
aWindow.y2p( m_trace->y2s( m_coords.y ) ) );
|
||||
|
||||
wxCoord leftPx = m_drawOutsideMargins ? 0 : aWindow.GetMarginLeft();
|
||||
wxCoord rightPx = m_drawOutsideMargins ? aWindow.GetScrX() : aWindow.GetScrX() - aWindow.GetMarginRight();
|
||||
wxCoord topPx = m_drawOutsideMargins ? 0 : aWindow.GetMarginTop();
|
||||
wxCoord bottomPx = m_drawOutsideMargins ? aWindow.GetScrY() : aWindow.GetScrY() - aWindow.GetMarginBottom();
|
||||
|
||||
aDC.SetPen( wxPen( *wxWHITE, 1, m_continuous ? wxSOLID : wxLONG_DASH ) );
|
||||
|
||||
if( topPx < cursorPos.y && cursorPos.y < bottomPx )
|
||||
aDC.DrawLine( leftPx, cursorPos.y, rightPx, cursorPos.y );
|
||||
|
||||
if( leftPx < cursorPos.x && cursorPos.x < rightPx )
|
||||
aDC.DrawLine( cursorPos.x, topPx, cursorPos.x, bottomPx );
|
||||
}
|
||||
|
||||
|
||||
bool CURSOR::Inside( wxPoint& aPoint )
|
||||
{
|
||||
if( !m_window )
|
||||
return false;
|
||||
|
||||
return ( std::abs( (double) aPoint.x - m_window->x2p( m_trace->x2s( m_coords.x ) ) ) <= DRAG_MARGIN )
|
||||
|| ( std::abs( (double) aPoint.y - m_window->y2p( m_trace->y2s( m_coords.y ) ) ) <= DRAG_MARGIN );
|
||||
}
|
||||
|
||||
|
||||
void CURSOR::UpdateReference()
|
||||
{
|
||||
if( !m_window )
|
||||
return;
|
||||
|
||||
m_reference.x = m_window->x2p( m_trace->x2s( m_coords.x ) );
|
||||
m_reference.y = m_window->y2p( m_trace->y2s( m_coords.y ) );
|
||||
}
|
||||
|
||||
|
||||
SIM_PLOT_PANEL::SIM_PLOT_PANEL( SIM_TYPE aType, wxWindow* parent, wxWindowID id, const wxPoint& pos,
|
||||
const wxSize& size, long style, const wxString& name )
|
||||
: mpWindow( parent, id, pos, size, style ), m_colorIdx( 0 ),
|
||||
m_axis_x( nullptr ), m_axis_y1( nullptr ), m_axis_y2( nullptr ), m_type( aType )
|
||||
{
|
||||
LimitView( true );
|
||||
SetMargins( 50, 80, 50, 80 );
|
||||
|
||||
wxColour grey( 96, 96, 96 );
|
||||
SetColourTheme( *wxBLACK, *wxWHITE, grey );
|
||||
EnableDoubleBuffer( true );
|
||||
UpdateAll();
|
||||
|
||||
switch( m_type )
|
||||
{
|
||||
case ST_AC:
|
||||
m_axis_x = new FREQUENCY_LOG_SCALE( wxT( "Frequency" ), mpALIGN_BOTTOM );
|
||||
m_axis_y1 = new GAIN_SCALE( wxT( "Gain" ), mpALIGN_LEFT );
|
||||
m_axis_y2 = new PHASE_SCALE( wxT( "Phase" ), mpALIGN_RIGHT );
|
||||
m_axis_y2->SetMasterScale( m_axis_y1 );
|
||||
break;
|
||||
|
||||
case ST_DC:
|
||||
m_axis_x = new VOLTAGE_SCALE_X( wxT( "Voltage (sweeped)" ), mpALIGN_BOTTOM );
|
||||
m_axis_y1 = new VOLTAGE_SCALE_Y( wxT( "Voltage (measured)" ), mpALIGN_LEFT );
|
||||
break;
|
||||
|
||||
case ST_NOISE:
|
||||
m_axis_x = new FREQUENCY_LOG_SCALE( wxT( "Frequency" ), mpALIGN_BOTTOM );
|
||||
m_axis_y1 = new mpScaleY( wxT( "noise [(V or A)^2/Hz]" ), mpALIGN_LEFT );
|
||||
break;
|
||||
|
||||
case ST_TRANSIENT:
|
||||
m_axis_x = new TIME_SCALE( wxT( "Time" ), mpALIGN_BOTTOM );
|
||||
m_axis_y1 = new VOLTAGE_SCALE_Y( wxT( "Voltage" ), mpALIGN_LEFT );
|
||||
m_axis_y2 = new CURRENT_SCALE( wxT( "Current" ), mpALIGN_RIGHT );
|
||||
m_axis_y2->SetMasterScale( m_axis_y1 );
|
||||
break;
|
||||
|
||||
default:
|
||||
// suppress warnings
|
||||
break;
|
||||
}
|
||||
|
||||
if( m_axis_x )
|
||||
{
|
||||
m_axis_x->SetTicks( false );
|
||||
m_axis_x->SetNameAlign ( mpALIGN_BOTTOM );
|
||||
|
||||
AddLayer( m_axis_x );
|
||||
}
|
||||
|
||||
if( m_axis_y1 )
|
||||
{
|
||||
m_axis_y1->SetTicks( false );
|
||||
m_axis_y1->SetNameAlign ( mpALIGN_LEFT );
|
||||
AddLayer( m_axis_y1 );
|
||||
}
|
||||
|
||||
if( m_axis_y2 )
|
||||
{
|
||||
m_axis_y2->SetTicks( false );
|
||||
m_axis_y2->SetNameAlign ( mpALIGN_RIGHT );
|
||||
AddLayer( m_axis_y2 );
|
||||
}
|
||||
|
||||
m_legend = new mpInfoLegend( wxRect( 0, 40, 200, 40 ), wxTRANSPARENT_BRUSH );
|
||||
AddLayer( m_legend );
|
||||
m_topLevel.push_back( m_legend );
|
||||
SetColourTheme( *wxBLACK, *wxWHITE, grey );
|
||||
|
||||
EnableDoubleBuffer( true );
|
||||
UpdateAll();
|
||||
}
|
||||
|
||||
|
||||
SIM_PLOT_PANEL::~SIM_PLOT_PANEL()
|
||||
{
|
||||
// ~mpWindow destroys all the added layers, so there is no need to destroy m_traces contents
|
||||
}
|
||||
|
||||
|
||||
bool SIM_PLOT_PANEL::IsPlottable( SIM_TYPE aSimType )
|
||||
{
|
||||
switch( aSimType )
|
||||
{
|
||||
case ST_AC:
|
||||
case ST_DC:
|
||||
case ST_TRANSIENT:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool SIM_PLOT_PANEL::AddTrace( const wxString& aName, int aPoints,
|
||||
const double* aX, const double* aY, SIM_PLOT_TYPE aFlags )
|
||||
{
|
||||
TRACE* t = NULL;
|
||||
|
||||
// Find previous entry, if there is one
|
||||
auto prev = m_traces.find( aName );
|
||||
bool addedNewEntry = ( prev == m_traces.end() );
|
||||
|
||||
if( addedNewEntry )
|
||||
{
|
||||
if( m_type == ST_TRANSIENT )
|
||||
{
|
||||
bool hasVoltageTraces = false;
|
||||
|
||||
for( auto t : m_traces )
|
||||
{
|
||||
if( !( t.second->GetFlags() & SPT_CURRENT ) )
|
||||
{
|
||||
hasVoltageTraces = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( !hasVoltageTraces )
|
||||
m_axis_y2->SetMasterScale( nullptr );
|
||||
else
|
||||
m_axis_y2->SetMasterScale( m_axis_y1 );
|
||||
}
|
||||
|
||||
// New entry
|
||||
t = new TRACE( aName );
|
||||
t->SetPen( wxPen( generateColor(), 2, wxSOLID ) );
|
||||
m_traces[aName] = t;
|
||||
|
||||
// It is a trick to keep legend & coords always on the top
|
||||
for( mpLayer* l : m_topLevel )
|
||||
DelLayer( l );
|
||||
|
||||
AddLayer( (mpLayer*) t );
|
||||
|
||||
for( mpLayer* l : m_topLevel )
|
||||
AddLayer( l );
|
||||
}
|
||||
else
|
||||
{
|
||||
t = prev->second;
|
||||
}
|
||||
|
||||
std::vector<double> tmp( aY, aY + aPoints );
|
||||
|
||||
if( m_type == ST_AC )
|
||||
{
|
||||
if( aFlags & SPT_AC_PHASE )
|
||||
{
|
||||
for( int i = 0; i < aPoints; i++ )
|
||||
tmp[i] = tmp[i] * 180.0 / M_PI; // convert to degrees
|
||||
}
|
||||
else
|
||||
{
|
||||
for( int i = 0; i < aPoints; i++ )
|
||||
tmp[i] = 20 * log( tmp[i] ) / log( 10.0 ); // convert to dB
|
||||
}
|
||||
}
|
||||
|
||||
t->SetData( std::vector<double>( aX, aX + aPoints ), tmp );
|
||||
|
||||
if( aFlags & SPT_AC_PHASE || aFlags & SPT_CURRENT )
|
||||
t->SetScale( m_axis_x, m_axis_y2 );
|
||||
else
|
||||
t->SetScale( m_axis_x, m_axis_y1 );
|
||||
|
||||
t->SetFlags( aFlags );
|
||||
|
||||
UpdateAll();
|
||||
|
||||
return addedNewEntry;
|
||||
}
|
||||
|
||||
|
||||
bool SIM_PLOT_PANEL::DeleteTrace( const wxString& aName )
|
||||
{
|
||||
auto it = m_traces.find( aName );
|
||||
|
||||
if( it != m_traces.end() )
|
||||
{
|
||||
m_traces.erase( it );
|
||||
TRACE* trace = it->second;
|
||||
|
||||
if( CURSOR* cursor = trace->GetCursor() )
|
||||
DelLayer( cursor, true );
|
||||
|
||||
DelLayer( trace, true, true );
|
||||
ResetScales();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void SIM_PLOT_PANEL::DeleteAllTraces()
|
||||
{
|
||||
for( auto& t : m_traces )
|
||||
{
|
||||
DeleteTrace( t.first );
|
||||
}
|
||||
|
||||
m_colorIdx = 0;
|
||||
m_traces.clear();
|
||||
}
|
||||
|
||||
|
||||
bool SIM_PLOT_PANEL::HasCursorEnabled( const wxString& aName ) const
|
||||
{
|
||||
TRACE* t = GetTrace( aName );
|
||||
|
||||
return t ? t->HasCursor() : false;
|
||||
}
|
||||
|
||||
|
||||
void SIM_PLOT_PANEL::EnableCursor( const wxString& aName, bool aEnable )
|
||||
{
|
||||
TRACE* t = GetTrace( aName );
|
||||
|
||||
if( t == nullptr || t->HasCursor() == aEnable )
|
||||
return;
|
||||
|
||||
if( aEnable )
|
||||
{
|
||||
CURSOR* c = new CURSOR( t );
|
||||
int plotCenter = GetMarginLeft() + ( GetXScreen() - GetMarginLeft() - GetMarginRight() ) / 2;
|
||||
c->SetX( plotCenter );
|
||||
t->SetCursor( c );
|
||||
AddLayer( c );
|
||||
}
|
||||
else
|
||||
{
|
||||
CURSOR* c = t->GetCursor();
|
||||
t->SetCursor( NULL );
|
||||
DelLayer( c, true );
|
||||
}
|
||||
|
||||
// Notify the parent window about the changes
|
||||
wxQueueEvent( GetParent(), new wxCommandEvent( EVT_SIM_CURSOR_UPDATE ) );
|
||||
}
|
||||
|
||||
|
||||
void SIM_PLOT_PANEL::ResetScales()
|
||||
{
|
||||
if( m_axis_x )
|
||||
m_axis_x->ResetDataRange();
|
||||
|
||||
if( m_axis_y1 )
|
||||
m_axis_y1->ResetDataRange();
|
||||
|
||||
if( m_axis_y2 )
|
||||
m_axis_y2->ResetDataRange();
|
||||
|
||||
for( auto t : m_traces )
|
||||
t.second->UpdateScales();
|
||||
}
|
||||
|
||||
|
||||
wxColour SIM_PLOT_PANEL::generateColor()
|
||||
{
|
||||
/// @todo have a look at:
|
||||
/// http://stanford.edu/~mwaskom/software/seaborn/tutorial/color_palettes.html
|
||||
/// https://github.com/Gnuplotting/gnuplot-palettes
|
||||
|
||||
const unsigned long colors[] = { 0x0000ff, 0x00ff00, 0xff0000, 0x00ffff, 0xff00ff, 0xffff000, 0xffffff };
|
||||
|
||||
//const unsigned long colors[] = { 0xe3cea6, 0xb4781f, 0x8adfb2, 0x2ca033, 0x999afb, 0x1c1ae3, 0x6fbffd, 0x007fff, 0xd6b2ca, 0x9a3d6a };
|
||||
|
||||
// hls
|
||||
//const unsigned long colors[] = { 0x0f1689, 0x0f7289, 0x35890f, 0x0f8945, 0x89260f, 0x890f53, 0x89820f, 0x630f89 };
|
||||
|
||||
// pastels, good for dark background
|
||||
//const unsigned long colors[] = { 0x2fd8fe, 0x628dfa, 0x53d8a6, 0xa5c266, 0xb3b3b3, 0x94c3e4, 0xca9f8d, 0xac680e };
|
||||
|
||||
const unsigned int colorCount = sizeof(colors) / sizeof(unsigned long);
|
||||
|
||||
/// @todo generate shades to avoid repeating colors
|
||||
return wxColour( colors[m_colorIdx++ % colorCount] );
|
||||
}
|
||||
|
||||
wxDEFINE_EVENT( EVT_SIM_CURSOR_UPDATE, wxCommandEvent );
|
|
@ -0,0 +1,261 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef __SIM_PLOT_PANEL_H
|
||||
#define __SIM_PLOT_PANEL_H
|
||||
|
||||
#include <widgets/mathplot.h>
|
||||
#include <map>
|
||||
#include "sim_types.h"
|
||||
|
||||
class TRACE;
|
||||
|
||||
///> Cursor attached to a trace to follow its values:
|
||||
class CURSOR : public mpInfoLayer
|
||||
{
|
||||
public:
|
||||
CURSOR( const TRACE* aTrace )
|
||||
: mpInfoLayer( wxRect( 0, 0, DRAG_MARGIN, DRAG_MARGIN ), wxTRANSPARENT_BRUSH ),
|
||||
m_trace( aTrace ), m_updateRequired( true ), m_updateRef( false ),
|
||||
m_coords( 0.0, 0.0 ), m_window( nullptr )
|
||||
{
|
||||
SetDrawOutsideMargins( false );
|
||||
}
|
||||
|
||||
void Plot( wxDC& aDC, mpWindow& aWindow ) override;
|
||||
|
||||
void SetX( int aX )
|
||||
{
|
||||
m_reference.x = 0;
|
||||
m_updateRef = true;
|
||||
Move( wxPoint( aX, 0 ) );
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
m_updateRequired = true;
|
||||
}
|
||||
|
||||
bool Inside( wxPoint& aPoint ) override;
|
||||
|
||||
void Move( wxPoint aDelta ) override
|
||||
{
|
||||
Update();
|
||||
mpInfoLayer::Move( aDelta );
|
||||
}
|
||||
|
||||
void UpdateReference();
|
||||
|
||||
const wxRealPoint& GetCoords() const
|
||||
{
|
||||
return m_coords;
|
||||
}
|
||||
|
||||
private:
|
||||
const TRACE* m_trace;
|
||||
bool m_updateRequired, m_updateRef;
|
||||
wxRealPoint m_coords;
|
||||
mpWindow* m_window;
|
||||
|
||||
const int DRAG_MARGIN = 10;
|
||||
};
|
||||
|
||||
|
||||
class TRACE : public mpFXYVector
|
||||
{
|
||||
public:
|
||||
TRACE( const wxString& aName ) :
|
||||
mpFXYVector( aName ), m_cursor( nullptr ), m_flags( 0 )
|
||||
{
|
||||
SetContinuity( true );
|
||||
SetDrawOutsideMargins( false );
|
||||
ShowName( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Assigns new data set for the trace. aX and aY need to have the same length.
|
||||
* @param aX are the X axis values.
|
||||
* @param aY are the Y axis values.
|
||||
*/
|
||||
void SetData( const std::vector<double>& aX, const std::vector<double>& aY ) override
|
||||
{
|
||||
if( m_cursor )
|
||||
m_cursor->Update();
|
||||
|
||||
mpFXYVector::SetData( aX, aY );
|
||||
}
|
||||
|
||||
const std::vector<double>& GetDataX() const
|
||||
{
|
||||
return m_xs;
|
||||
}
|
||||
|
||||
const std::vector<double>& GetDataY() const
|
||||
{
|
||||
return m_ys;
|
||||
}
|
||||
|
||||
bool HasCursor() const
|
||||
{
|
||||
return m_cursor != nullptr;
|
||||
}
|
||||
|
||||
void SetCursor( CURSOR* aCursor )
|
||||
{
|
||||
m_cursor = aCursor;
|
||||
}
|
||||
|
||||
CURSOR* GetCursor() const
|
||||
{
|
||||
return m_cursor;
|
||||
}
|
||||
|
||||
void SetFlags( int aFlags )
|
||||
{
|
||||
m_flags = aFlags;
|
||||
}
|
||||
|
||||
int GetFlags() const
|
||||
{
|
||||
return m_flags;
|
||||
}
|
||||
|
||||
protected:
|
||||
CURSOR* m_cursor;
|
||||
int m_flags;
|
||||
};
|
||||
|
||||
|
||||
class SIM_PLOT_PANEL : public mpWindow
|
||||
{
|
||||
public:
|
||||
SIM_PLOT_PANEL( SIM_TYPE aType, wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxPanelNameStr );
|
||||
|
||||
~SIM_PLOT_PANEL();
|
||||
|
||||
SIM_TYPE GetType() const
|
||||
{
|
||||
return m_type;
|
||||
}
|
||||
|
||||
static bool IsPlottable( SIM_TYPE aSimType );
|
||||
|
||||
wxString GetLabelX() const
|
||||
{
|
||||
return m_axis_x ? m_axis_x->GetName() : "";
|
||||
}
|
||||
|
||||
wxString GetLabelY1() const
|
||||
{
|
||||
return m_axis_y1 ? m_axis_y1->GetName() : "";
|
||||
}
|
||||
|
||||
wxString GetLabelY2() const
|
||||
{
|
||||
return m_axis_y2 ? m_axis_y2->GetName() : "";
|
||||
}
|
||||
|
||||
bool AddTrace( const wxString& aName, int aPoints,
|
||||
const double* aX, const double* aY, SIM_PLOT_TYPE aFlags );
|
||||
|
||||
bool DeleteTrace( const wxString& aName );
|
||||
|
||||
void DeleteAllTraces();
|
||||
|
||||
bool IsShown( const wxString& aName ) const
|
||||
{
|
||||
return m_traces.count( aName ) > 0;
|
||||
}
|
||||
|
||||
const std::map<wxString, TRACE*>& GetTraces() const
|
||||
{
|
||||
return m_traces;
|
||||
}
|
||||
|
||||
TRACE* GetTrace( const wxString& aName ) const
|
||||
{
|
||||
auto trace = m_traces.find( aName );
|
||||
|
||||
return trace == m_traces.end() ? NULL : trace->second;
|
||||
}
|
||||
|
||||
void ShowGrid( bool aEnable )
|
||||
{
|
||||
m_axis_x->SetTicks( !aEnable );
|
||||
m_axis_y1->SetTicks( !aEnable );
|
||||
m_axis_y2->SetTicks( !aEnable );
|
||||
UpdateAll();
|
||||
}
|
||||
|
||||
bool IsGridShown() const
|
||||
{
|
||||
assert( m_axis_x->GetTicks() == m_axis_y1->GetTicks() );
|
||||
return !m_axis_x->GetTicks();
|
||||
}
|
||||
|
||||
void ShowLegend( bool aEnable )
|
||||
{
|
||||
m_legend->SetVisible( aEnable );
|
||||
UpdateAll();
|
||||
}
|
||||
|
||||
bool IsLegendShown() const
|
||||
{
|
||||
return m_legend->IsVisible();
|
||||
}
|
||||
|
||||
///> Returns true if the trace has cursor shown.
|
||||
bool HasCursorEnabled( const wxString& aName ) const;
|
||||
|
||||
///> Toggles cursor for a particular trace.
|
||||
void EnableCursor( const wxString& aName, bool aEnable );
|
||||
|
||||
///> Resets scale ranges to fit the current traces
|
||||
void ResetScales();
|
||||
|
||||
private:
|
||||
///> Returns a new color from the palette
|
||||
wxColour generateColor();
|
||||
|
||||
// Color index to get a new color from the palette
|
||||
unsigned int m_colorIdx;
|
||||
|
||||
// Traces to be plotted
|
||||
std::map<wxString, TRACE*> m_traces;
|
||||
|
||||
mpScaleXBase* m_axis_x;
|
||||
mpScaleY* m_axis_y1;
|
||||
mpScaleY* m_axis_y2;
|
||||
mpInfoLegend* m_legend;
|
||||
|
||||
std::vector<mpLayer*> m_topLevel;
|
||||
|
||||
const SIM_TYPE m_type;
|
||||
};
|
||||
|
||||
wxDECLARE_EVENT( EVT_SIM_CURSOR_UPDATE, wxCommandEvent );
|
||||
|
||||
#endif
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef SIM_TYPES_H
|
||||
#define SIM_TYPES_H
|
||||
|
||||
///> Possible simulation types
|
||||
enum SIM_TYPE {
|
||||
ST_UNKNOWN, ST_AC, ST_DC, ST_DISTORTION, ST_NOISE, ST_OP,
|
||||
ST_POLE_ZERO, ST_SENSITIVITY, ST_TRANS_FUNC, ST_TRANSIENT
|
||||
};
|
||||
|
||||
///> Possible plot types
|
||||
enum SIM_PLOT_TYPE {
|
||||
// Y axis
|
||||
SPT_VOLTAGE = 0x01,
|
||||
SPT_CURRENT = 0x02,
|
||||
SPT_AC_PHASE = 0x04,
|
||||
SPT_AC_MAG = 0x08,
|
||||
|
||||
// X axis
|
||||
SPT_TIME = 0x10,
|
||||
SPT_LIN_FREQUENCY = 0x20,
|
||||
SPT_LOG_FREQUENCY = 0x20,
|
||||
SPT_SWEEP = 0x40
|
||||
};
|
||||
|
||||
#endif /* SIM_TYPES_H */
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <kiway.h>
|
||||
#include <schframe.h>
|
||||
#include "sim_plot_frame.h"
|
||||
|
||||
void SCH_EDIT_FRAME::OnSimulate( wxCommandEvent& event )
|
||||
{
|
||||
SIM_PLOT_FRAME* simFrame = (SIM_PLOT_FRAME*) Kiway().Player( FRAME_SIMULATOR, true );
|
||||
simFrame->Show( true );
|
||||
|
||||
// On Windows, Raise() does not bring the window on screen, when iconized
|
||||
if( simFrame->IsIconized() )
|
||||
simFrame->Iconize( false );
|
||||
|
||||
simFrame->Raise();
|
||||
}
|
||||
|
||||
// I apologize for the following lines, but this is more or less what wxWidgets
|
||||
// authors suggest (http://docs.wxwidgets.org/trunk/classwx_cursor.html)
|
||||
|
||||
static const unsigned char cursor_probe[] = {
|
||||
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
|
||||
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x04,
|
||||
0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x84, 0x00,
|
||||
0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x80, 0x10, 0x00,
|
||||
0x00, 0x40, 0x08, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x10, 0x02, 0x00,
|
||||
0x00, 0x08, 0x01, 0x00, 0x80, 0x85, 0x00, 0x00, 0x40, 0x42, 0x00, 0x00,
|
||||
0x20, 0x21, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00,
|
||||
0x20, 0x16, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00,
|
||||
0x44, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
||||
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
|
||||
|
||||
static const unsigned char cursor_probe_mask[] {
|
||||
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
|
||||
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x07,
|
||||
0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xfc, 0x00,
|
||||
0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00,
|
||||
0x00, 0xc0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00,
|
||||
0x00, 0xf8, 0x01, 0x00, 0x80, 0xfd, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00,
|
||||
0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00,
|
||||
0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00,
|
||||
0x7c, 0x07, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
||||
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
|
||||
|
||||
static const unsigned char cursor_tune[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
|
||||
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
|
||||
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
|
||||
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
|
||||
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
|
||||
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
|
||||
0x00, 0xea, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
|
||||
0x40, 0x01, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
|
||||
0x2c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
|
||||
0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
|
||||
|
||||
static const unsigned char cursor_tune_mask[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
|
||||
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
|
||||
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
|
||||
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
|
||||
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
|
||||
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
|
||||
0x00, 0xee, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
|
||||
0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
|
||||
0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
|
||||
0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
|
||||
|
||||
#if defined(__WXMSW__) or defined(__WXMAC__)
|
||||
struct SIM_CURSORS_INIT
|
||||
{
|
||||
public:
|
||||
static wxImage& GetProbeImage()
|
||||
{
|
||||
static wxImage* probe_image = NULL;
|
||||
|
||||
if( probe_image == NULL )
|
||||
{
|
||||
wxBitmap probe_bitmap( (const char*) cursor_probe, 32, 32 );
|
||||
wxBitmap probe_mask_bitmap( (const char*) cursor_probe_mask, 32, 32 );
|
||||
probe_bitmap.SetMask( new wxMask( probe_mask_bitmap ) );
|
||||
probe_image = new wxImage( probe_bitmap.ConvertToImage() );
|
||||
probe_image->SetMaskColour( 255, 255, 255 );
|
||||
probe_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, 0 );
|
||||
probe_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, 31 );
|
||||
}
|
||||
|
||||
return *probe_image;
|
||||
}
|
||||
|
||||
static wxImage& GetTuneImage()
|
||||
{
|
||||
static wxImage* tune_image = NULL;
|
||||
|
||||
if( tune_image == NULL )
|
||||
{
|
||||
wxBitmap tune_bitmap( (const char*) cursor_tune, 32, 32 );
|
||||
wxBitmap tune_mask_bitmap( (const char*) cursor_tune_mask, 32, 32 );
|
||||
tune_bitmap.SetMask( new wxMask( tune_mask_bitmap ) );
|
||||
tune_image = new wxImage( tune_bitmap.ConvertToImage() );
|
||||
tune_image->SetMaskColour( 255, 255, 255 );
|
||||
tune_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, 0 );
|
||||
tune_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, 31 );
|
||||
}
|
||||
|
||||
return *tune_image;
|
||||
}
|
||||
};
|
||||
|
||||
const wxCursor SCH_EDIT_FRAME::CURSOR_PROBE( SIM_CURSORS_INIT::GetProbeImage() );
|
||||
const wxCursor SCH_EDIT_FRAME::CURSOR_TUNE( SIM_CURSORS_INIT::GetTuneImage() );
|
||||
#elif defined(__WXGTK__) or defined(__WXMOTIF__)
|
||||
const wxCursor SCH_EDIT_FRAME::CURSOR_PROBE( (const char*) cursor_probe, 32, 32, 0, 31, (const char*) cursor_probe_mask );
|
||||
const wxCursor SCH_EDIT_FRAME::CURSOR_TUNE( (const char*) cursor_tune, 32, 32, 1, 30, (const char*) cursor_tune_mask );
|
||||
#endif
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef SPICE_REPORTER_H
|
||||
#define SPICE_REPORTER_H
|
||||
|
||||
#include <reporter.h>
|
||||
|
||||
class SPICE_SIMULATOR;
|
||||
|
||||
enum SIM_STATE
|
||||
{
|
||||
SIM_IDLE,
|
||||
SIM_RUNNING
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Interface to receive simulation updates from SPICE_SIMULATOR class.
|
||||
*/
|
||||
class SPICE_REPORTER : public REPORTER
|
||||
{
|
||||
public:
|
||||
virtual ~SPICE_REPORTER()
|
||||
{
|
||||
}
|
||||
|
||||
virtual void OnSimStateChange( SPICE_SIMULATOR* aObject, SIM_STATE aNewState ) = 0;
|
||||
};
|
||||
|
||||
#endif /* SPICE_REPORTER_H */
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
|
||||
#include <confirm.h>
|
||||
|
||||
SPICE_SIMULATOR* SPICE_SIMULATOR::CreateInstance( const std::string& )
|
||||
{
|
||||
try
|
||||
{
|
||||
return new NGSPICE;
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
DisplayError( NULL, e.what() );
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef SPICE_SIMULATOR_H
|
||||
#define SPICE_SIMULATOR_H
|
||||
|
||||
#include "sim_types.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <complex>
|
||||
|
||||
class SPICE_REPORTER;
|
||||
|
||||
typedef std::complex<double> COMPLEX;
|
||||
|
||||
class SPICE_SIMULATOR
|
||||
{
|
||||
public:
|
||||
SPICE_SIMULATOR() : m_reporter( NULL ) {}
|
||||
virtual ~SPICE_SIMULATOR() {}
|
||||
|
||||
///> Creates a simulator instance of particular type (currently only ngspice is handled)
|
||||
static SPICE_SIMULATOR* CreateInstance( const std::string& aName );
|
||||
|
||||
///> Intializes the simulator
|
||||
virtual void Init() = 0;
|
||||
|
||||
/*
|
||||
* @brief Loads a netlist for the simulation.
|
||||
* @return True in case of success, false otherwise.
|
||||
*/
|
||||
virtual bool LoadNetlist( const std::string& aNetlist ) = 0;
|
||||
|
||||
/**
|
||||
* @brief Executes the simulation with currently loaded netlist.
|
||||
* @return True in case of success, false otherwise.
|
||||
*/
|
||||
virtual bool Run() = 0;
|
||||
|
||||
/**
|
||||
* @brief Halts the simulation.
|
||||
* @return True in case of success, false otherwise.
|
||||
*/
|
||||
virtual bool Stop() = 0;
|
||||
|
||||
/**
|
||||
* @brief Checks if simulation is running at the moment.
|
||||
* @return True if simulation is currently executed.
|
||||
*/
|
||||
virtual bool IsRunning() = 0;
|
||||
|
||||
/**
|
||||
* @brief Executes a Spice command as if it was typed into console.
|
||||
* @param aCmd is the command to be issued.
|
||||
*/
|
||||
virtual bool Command( const std::string& aCmd ) = 0;
|
||||
|
||||
///> Returns X axis name for a given simulation type
|
||||
virtual std::string GetXAxis( SIM_TYPE aType ) const = 0;
|
||||
|
||||
///> Sets a SPICE_REPORTER object to receive the simulation log.
|
||||
virtual void SetReporter( SPICE_REPORTER* aReporter )
|
||||
{
|
||||
m_reporter = aReporter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns a requested vector with complex values. If the vector is real, then
|
||||
* the imaginary part is set to 0 in all values.
|
||||
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
|
||||
* @return Requested vector. It might be empty if there is no vector with requested name.
|
||||
*/
|
||||
virtual std::vector<COMPLEX> GetPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
|
||||
|
||||
/**
|
||||
* @brief Returns a requested vector with real values. If the vector is complex, then
|
||||
* the real part is returned.
|
||||
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
|
||||
* @return Requested vector. It might be empty if there is no vector with requested name.
|
||||
*/
|
||||
virtual std::vector<double> GetRealPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
|
||||
|
||||
/**
|
||||
* @brief Returns a requested vector with imaginary values. If the vector is complex, then
|
||||
* the imaginary part is returned. If the vector is reql, then only zeroes are returned.
|
||||
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
|
||||
* @return Requested vector. It might be empty if there is no vector with requested name.
|
||||
*/
|
||||
virtual std::vector<double> GetImagPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
|
||||
|
||||
/**
|
||||
* @brief Returns a requested vector with magnitude values.
|
||||
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
|
||||
* @return Requested vector. It might be empty if there is no vector with requested name.
|
||||
*/
|
||||
virtual std::vector<double> GetMagPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
|
||||
|
||||
/**
|
||||
* @brief Returns a requested vector with phase values.
|
||||
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
|
||||
* @return Requested vector. It might be empty if there is no vector with requested name.
|
||||
*/
|
||||
virtual std::vector<double> GetPhasePlot( const std::string& aName, int aMaxLen = -1 ) = 0;
|
||||
|
||||
protected:
|
||||
///> Reporter object to receive simulation log
|
||||
SPICE_REPORTER* m_reporter;
|
||||
};
|
||||
|
||||
#endif /* SPICE_SIMULATOR_H */
|
|
@ -0,0 +1,265 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "spice_value.h"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <cmath>
|
||||
|
||||
#include <wx/textentry.h>
|
||||
#include <confirm.h>
|
||||
|
||||
SPICE_VALUE::SPICE_VALUE( const wxString& aString )
|
||||
{
|
||||
char buf[8] = { 0, };
|
||||
|
||||
if( aString.IsEmpty() )
|
||||
throw std::invalid_argument( "Spice value cannot be empty" );
|
||||
|
||||
if( sscanf( (const char*) aString.c_str(), "%lf%7s", &m_base, buf ) == 0 )
|
||||
throw std::invalid_argument( "Invalid Spice value string" );
|
||||
|
||||
if( *buf == 0 )
|
||||
{
|
||||
m_prefix = PFX_NONE;
|
||||
m_spiceStr = false;
|
||||
Normalize();
|
||||
return;
|
||||
}
|
||||
|
||||
m_spiceStr = true;
|
||||
|
||||
for( char* bufPtr = buf; *bufPtr; ++bufPtr )
|
||||
*bufPtr = tolower( *bufPtr );
|
||||
|
||||
if( !strcmp( buf, "meg" ) )
|
||||
{
|
||||
m_prefix = PFX_MEGA;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( buf[0] )
|
||||
{
|
||||
case 'f': m_prefix = PFX_FEMTO; break;
|
||||
case 'p': m_prefix = PFX_PICO; break;
|
||||
case 'n': m_prefix = PFX_NANO; break;
|
||||
case 'u': m_prefix = PFX_MICRO; break;
|
||||
case 'm': m_prefix = PFX_MILI; break;
|
||||
case 'k': m_prefix = PFX_KILO; break;
|
||||
case 'g': m_prefix = PFX_GIGA; break;
|
||||
case 't': m_prefix = PFX_TERA; break;
|
||||
|
||||
default:
|
||||
throw std::invalid_argument( "Invalid unit prefix" );
|
||||
}
|
||||
}
|
||||
|
||||
Normalize();
|
||||
}
|
||||
|
||||
|
||||
void SPICE_VALUE::Normalize()
|
||||
{
|
||||
while( std::fabs( m_base ) >= 1000.0 )
|
||||
{
|
||||
m_base *= 0.001;
|
||||
m_prefix = (UNIT_PREFIX)( m_prefix + 3 );
|
||||
}
|
||||
|
||||
while( m_base != 0.0 && std::fabs( m_base ) < 1.000 )
|
||||
{
|
||||
m_base *= 1000.0;
|
||||
m_prefix = (UNIT_PREFIX)( m_prefix - 3 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
double SPICE_VALUE::ToDouble() const
|
||||
{
|
||||
double res = m_base;
|
||||
|
||||
if( m_prefix != PFX_NONE )
|
||||
res *= std::pow( 10, (int) m_prefix );
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
wxString SPICE_VALUE::ToString() const
|
||||
{
|
||||
wxString res( wxString::Format( "%.3f", ToDouble() ) );
|
||||
stripZeros( res );
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
wxString SPICE_VALUE::ToSpiceString() const
|
||||
{
|
||||
wxString res = wxString::FromCDouble( m_base );
|
||||
stripZeros( res );
|
||||
|
||||
switch( m_prefix )
|
||||
{
|
||||
case PFX_FEMTO: res += "f"; break;
|
||||
case PFX_PICO: res += "p"; break;
|
||||
case PFX_NANO: res += "n"; break;
|
||||
case PFX_MICRO: res += "u"; break;
|
||||
case PFX_MILI: res += "m"; break;
|
||||
case PFX_NONE: break;
|
||||
case PFX_KILO: res += "k"; break;
|
||||
case PFX_MEGA: res += "Meg"; break;
|
||||
case PFX_GIGA: res += "G"; break;
|
||||
case PFX_TERA: res += "T"; break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SPICE_VALUE SPICE_VALUE::operator+( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
int prefixDiff = m_prefix - aOther.m_prefix;
|
||||
SPICE_VALUE res;
|
||||
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
|
||||
|
||||
// Convert both numbers to a common prefix
|
||||
if( prefixDiff > 0 )
|
||||
{
|
||||
// Switch to the aOther prefix
|
||||
res.m_base = ( m_base * std::pow( 10, prefixDiff ) ) + aOther.m_base;
|
||||
res.m_prefix = aOther.m_prefix;
|
||||
}
|
||||
else if( prefixDiff < 0 )
|
||||
{
|
||||
// Use the current prefix
|
||||
res.m_base = m_base + ( aOther.m_base * std::pow( 10, -prefixDiff ) );
|
||||
res.m_prefix = m_prefix;
|
||||
}
|
||||
else
|
||||
{
|
||||
res.m_base = m_base + aOther.m_base;
|
||||
res.m_prefix = m_prefix; // == aOther.m_prefix
|
||||
}
|
||||
|
||||
res.Normalize();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SPICE_VALUE SPICE_VALUE::operator-( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
int prefixDiff = m_prefix - aOther.m_prefix;
|
||||
SPICE_VALUE res;
|
||||
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
|
||||
|
||||
// Convert both numbers to a common prefix
|
||||
if( prefixDiff > 0 )
|
||||
{
|
||||
// Switch to the aOther prefix
|
||||
res.m_base = m_base * std::pow( 10, prefixDiff ) - aOther.m_base;
|
||||
res.m_prefix = aOther.m_prefix;
|
||||
}
|
||||
else if( prefixDiff < 0 )
|
||||
{
|
||||
// Use the current prefix
|
||||
res.m_base = m_base - aOther.m_base * std::pow( 10, -prefixDiff );
|
||||
res.m_prefix = m_prefix;
|
||||
}
|
||||
else
|
||||
{
|
||||
res.m_base = m_base - aOther.m_base;
|
||||
res.m_prefix = m_prefix; // == aOther.m_prefix
|
||||
}
|
||||
|
||||
res.Normalize();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SPICE_VALUE SPICE_VALUE::operator*( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
SPICE_VALUE res( m_base * aOther.m_base, (UNIT_PREFIX)( m_prefix + aOther.m_prefix ) );
|
||||
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
|
||||
res.Normalize();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SPICE_VALUE SPICE_VALUE::operator/( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
SPICE_VALUE res( m_base / aOther.m_base, (UNIT_PREFIX)( m_prefix - aOther.m_prefix ) );
|
||||
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
|
||||
res.Normalize();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
void SPICE_VALUE::stripZeros( wxString& aString )
|
||||
{
|
||||
if ( aString.Find( ',' ) >= 0 || aString.Find( '.' ) >= 0 )
|
||||
{
|
||||
while( aString.EndsWith( '0' ) )
|
||||
aString.RemoveLast();
|
||||
|
||||
if( aString.EndsWith( '.' ) || aString.EndsWith( ',' ) )
|
||||
aString.RemoveLast();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool SPICE_VALIDATOR::Validate( wxWindow* aParent )
|
||||
{
|
||||
wxTextEntry* const text = GetTextEntry();
|
||||
|
||||
if( !text )
|
||||
return false;
|
||||
|
||||
if( text->IsEmpty() )
|
||||
{
|
||||
if( m_emptyAllowed )
|
||||
return true;
|
||||
|
||||
DisplayError( aParent, wxString::Format( wxT( "Fill required fields" ) ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// If SPICE_VALUE can be constructed, then it is a valid Spice value
|
||||
SPICE_VALUE val( text->GetValue() );
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
DisplayError( aParent,
|
||||
wxString::Format( wxT( "'%s' is not a valid Spice value" ), text->GetValue() ) );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef SPICE_VALUE_H
|
||||
#define SPICE_VALUE_H
|
||||
|
||||
#include <wx/string.h>
|
||||
#include <wx/valtext.h>
|
||||
|
||||
///> Helper class to handle Spice way of expressing values (e.g. 10.5 Meg)
|
||||
class SPICE_VALUE
|
||||
{
|
||||
public:
|
||||
enum UNIT_PREFIX
|
||||
{
|
||||
PFX_FEMTO = -15,
|
||||
PFX_PICO = -12,
|
||||
PFX_NANO = -9,
|
||||
PFX_MICRO = -6,
|
||||
PFX_MILI = -3,
|
||||
PFX_NONE = 0,
|
||||
PFX_KILO = 3,
|
||||
PFX_MEGA = 6,
|
||||
PFX_GIGA = 9,
|
||||
PFX_TERA = 12
|
||||
};
|
||||
|
||||
SPICE_VALUE()
|
||||
: m_base( 0 ), m_prefix( PFX_NONE ), m_spiceStr( false )
|
||||
{
|
||||
}
|
||||
|
||||
///> Parses the string to create a Spice value (e.g. 100n)
|
||||
SPICE_VALUE( const wxString& aString );
|
||||
|
||||
SPICE_VALUE( int aInt, UNIT_PREFIX aPrefix = PFX_NONE )
|
||||
: m_base( aInt ), m_prefix( aPrefix ), m_spiceStr( false )
|
||||
{
|
||||
Normalize();
|
||||
}
|
||||
|
||||
SPICE_VALUE( double aDouble, UNIT_PREFIX aPrefix = PFX_NONE )
|
||||
: m_base( aDouble ), m_prefix( aPrefix ), m_spiceStr( false )
|
||||
{
|
||||
Normalize();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Normalizes the value. The unit prefix is picked so the base is (0.001 <= base < 1000).
|
||||
*/
|
||||
void Normalize();
|
||||
|
||||
double ToDouble() const;
|
||||
|
||||
/**
|
||||
* @brief Returns string value as when converting double to string (e.g. 123456.789).
|
||||
*/
|
||||
wxString ToString() const;
|
||||
|
||||
/**
|
||||
* @brief Returns string value in Spice format (e.g. 123.3456789k).
|
||||
*/
|
||||
wxString ToSpiceString() const;
|
||||
|
||||
/**
|
||||
* @brief Returns either a normal string or Spice format string, depending on the original
|
||||
* value format.
|
||||
*/
|
||||
wxString ToOrigString() const
|
||||
{
|
||||
return m_spiceStr ? ToSpiceString() : ToString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the object was initiated with a Spice formatted string value.
|
||||
*/
|
||||
bool IsSpiceString() const
|
||||
{
|
||||
return m_spiceStr;
|
||||
}
|
||||
|
||||
bool operator==( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
return ( m_prefix == aOther.m_prefix && m_base == aOther.m_base );
|
||||
}
|
||||
|
||||
bool operator>( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
return this->ToDouble() > aOther.ToDouble();
|
||||
}
|
||||
|
||||
bool operator<( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
return this->ToDouble() < aOther.ToDouble();
|
||||
}
|
||||
|
||||
bool operator>=( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
return ( *this == aOther || *this > aOther );
|
||||
}
|
||||
|
||||
bool operator<=( const SPICE_VALUE& aOther ) const
|
||||
{
|
||||
return ( *this == aOther || *this < aOther );
|
||||
}
|
||||
|
||||
SPICE_VALUE operator-( const SPICE_VALUE& aOther ) const;
|
||||
SPICE_VALUE operator+( const SPICE_VALUE& aOther ) const;
|
||||
SPICE_VALUE operator*( const SPICE_VALUE& aOther ) const;
|
||||
SPICE_VALUE operator/( const SPICE_VALUE& aOther ) const;
|
||||
|
||||
private:
|
||||
double m_base;
|
||||
UNIT_PREFIX m_prefix;
|
||||
|
||||
///> Was the value defined using the Spice notation?
|
||||
bool m_spiceStr;
|
||||
|
||||
///> Removes redundant zeros from the end of a string.
|
||||
static void stripZeros( wxString& aString );
|
||||
};
|
||||
|
||||
|
||||
///> Helper class to recognize Spice formatted values
|
||||
class SPICE_VALIDATOR : public wxTextValidator
|
||||
{
|
||||
public:
|
||||
SPICE_VALIDATOR( bool aEmptyAllowed = false )
|
||||
: m_emptyAllowed( aEmptyAllowed )
|
||||
{
|
||||
}
|
||||
|
||||
wxObject* Clone() const override
|
||||
{
|
||||
return new SPICE_VALIDATOR( *this );
|
||||
}
|
||||
|
||||
bool Validate( wxWindow* aParent ) override;
|
||||
|
||||
private:
|
||||
///> Is it valid to get an empty value?
|
||||
bool m_emptyAllowed;
|
||||
};
|
||||
|
||||
#endif /* SPICE_VALUE_H */
|
|
@ -0,0 +1,209 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "tuner_slider.h"
|
||||
|
||||
#include <sim/sim_plot_frame.h>
|
||||
#include <sch_component.h>
|
||||
#include <template_fieldnames.h>
|
||||
#include <netlist_exporters/netlist_exporter_pspice.h>
|
||||
|
||||
TUNER_SLIDER::TUNER_SLIDER( SIM_PLOT_FRAME* aFrame, wxWindow* aParent, SCH_COMPONENT* aComponent )
|
||||
: TUNER_SLIDER_BASE( aParent ), m_component( aComponent ),
|
||||
m_min( 0.0 ), m_max( 0.0 ), m_value( 0.0 ), m_frame ( aFrame )
|
||||
{
|
||||
const wxString compName = aComponent->GetField( REFERENCE )->GetText();
|
||||
m_name->SetLabel( compName );
|
||||
m_value = SPICE_VALUE( aComponent->GetField( VALUE )->GetText() );
|
||||
m_changed = false;
|
||||
|
||||
// Generate Spice component name
|
||||
char prim = NETLIST_EXPORTER_PSPICE::GetSpiceField( SF_PRIMITIVE, aComponent, 0 )[0];
|
||||
m_spiceName = wxString( prim + compName ).Lower();
|
||||
|
||||
// Call Set*() methods to update fields and slider
|
||||
m_max = SPICE_VALUE( 2.0 ) * m_value;
|
||||
m_min = SPICE_VALUE( 0.5 ) * m_value;
|
||||
|
||||
m_minText->SetValue( m_min.ToOrigString() );
|
||||
m_maxText->SetValue( m_max.ToOrigString() );
|
||||
|
||||
updateValueText();
|
||||
updateSlider();
|
||||
|
||||
m_simTimer.SetOwner( this );
|
||||
Connect( wxEVT_TIMER, wxTimerEventHandler( TUNER_SLIDER::onSimTimer ), NULL, this );
|
||||
}
|
||||
|
||||
|
||||
bool TUNER_SLIDER::SetValue( const SPICE_VALUE& aVal )
|
||||
{
|
||||
// Get the value into the current range boundaries
|
||||
if( aVal > m_max )
|
||||
m_value = m_max;
|
||||
else if( aVal < m_min )
|
||||
m_value = m_min;
|
||||
else
|
||||
m_value = aVal;
|
||||
|
||||
updateValueText();
|
||||
updateSlider();
|
||||
updateComponentValue();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TUNER_SLIDER::SetMin( const SPICE_VALUE& aVal )
|
||||
{
|
||||
if( aVal >= m_max )
|
||||
return false;
|
||||
|
||||
m_min = aVal;
|
||||
|
||||
if( m_value < aVal ) // Limit the curent value
|
||||
SetValue( aVal );
|
||||
|
||||
m_minText->SetValue( aVal.ToOrigString() );
|
||||
updateSlider();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TUNER_SLIDER::SetMax( const SPICE_VALUE& aVal )
|
||||
{
|
||||
if( aVal <= m_min )
|
||||
return false;
|
||||
|
||||
m_max = aVal;
|
||||
|
||||
if( m_value > aVal ) // Limit the current value
|
||||
SetValue( aVal );
|
||||
|
||||
m_maxText->SetValue( aVal.ToOrigString() );
|
||||
updateSlider();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::updateComponentValue()
|
||||
{
|
||||
// Start simulation in 100 ms, if the value does not change meanwhile
|
||||
m_simTimer.StartOnce( 100 );
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::updateSlider()
|
||||
{
|
||||
assert( m_max >= m_value && m_value >= m_min );
|
||||
|
||||
m_slider->SetValue( ( ( m_value - m_min ) / ( m_max - m_min ) ).ToDouble() * 100.0 );
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::updateValueText()
|
||||
{
|
||||
bool spiceString = m_min.IsSpiceString() || m_max.IsSpiceString();
|
||||
m_valueText->SetValue( spiceString ? m_value.ToSpiceString() : m_value.ToString() );
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onClose( wxCommandEvent& event )
|
||||
{
|
||||
m_frame->RemoveTuner( this );
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onSave( wxCommandEvent& event )
|
||||
{
|
||||
/// @todo it will crash when component is removed; completely remove m_component
|
||||
m_component->GetField( VALUE )->SetText( m_value.ToOrigString() );
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onSliderChanged( wxScrollEvent& event )
|
||||
{
|
||||
m_value = m_min + ( m_max - m_min ) * SPICE_VALUE( m_slider->GetValue() / 100.0 );
|
||||
updateValueText();
|
||||
updateComponentValue();
|
||||
m_changed = true;
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onMaxTextEnter( wxCommandEvent& event )
|
||||
{
|
||||
try
|
||||
{
|
||||
SPICE_VALUE newMax( m_maxText->GetValue() );
|
||||
SetMax( newMax );
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
// Restore the previous value
|
||||
m_maxText->SetValue( m_max.ToOrigString() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onValueTextEnter( wxCommandEvent& event )
|
||||
{
|
||||
try
|
||||
{
|
||||
SPICE_VALUE newCur( m_valueText->GetValue() );
|
||||
SetValue( newCur );
|
||||
m_changed = true;
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
// Restore the previous value
|
||||
m_valueText->SetValue( m_value.ToOrigString() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onMinTextEnter( wxCommandEvent& event )
|
||||
{
|
||||
try
|
||||
{
|
||||
SPICE_VALUE newMin( m_minText->GetValue() );
|
||||
SetMin( newMin );
|
||||
}
|
||||
catch( std::exception& e )
|
||||
{
|
||||
// Restore the previous value
|
||||
m_minText->SetValue( m_min.ToOrigString() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TUNER_SLIDER::onSimTimer( wxTimerEvent& event )
|
||||
{
|
||||
if(m_changed)
|
||||
{
|
||||
wxQueueEvent( m_frame, new wxCommandEvent( EVT_SIM_UPDATE ) );
|
||||
m_changed = false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* 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 3
|
||||
* 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:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef TUNER_SLIDER_H
|
||||
#define TUNER_SLIDER_H
|
||||
|
||||
#include "tuner_slider_base.h"
|
||||
|
||||
#include <sim/spice_value.h>
|
||||
|
||||
#include <wx/timer.h>
|
||||
|
||||
class SIM_PLOT_FRAME;
|
||||
class SCH_COMPONENT;
|
||||
|
||||
/**
|
||||
* @brief Custom widget to handle quick component values modification and simulation on the fly.
|
||||
*/
|
||||
class TUNER_SLIDER : public TUNER_SLIDER_BASE
|
||||
{
|
||||
public:
|
||||
TUNER_SLIDER( SIM_PLOT_FRAME *aFrame, wxWindow* aParent, SCH_COMPONENT* aComponent );
|
||||
|
||||
wxString GetComponentName() const
|
||||
{
|
||||
return m_name->GetLabel();
|
||||
}
|
||||
|
||||
const wxString& GetSpiceName() const
|
||||
{
|
||||
return m_spiceName;
|
||||
}
|
||||
|
||||
const SPICE_VALUE& GetValue() const
|
||||
{
|
||||
return m_value;
|
||||
}
|
||||
|
||||
const SPICE_VALUE& GetMin() const
|
||||
{
|
||||
return m_min;
|
||||
}
|
||||
|
||||
const SPICE_VALUE& GetMax() const
|
||||
{
|
||||
return m_max;
|
||||
}
|
||||
|
||||
bool SetValue( const SPICE_VALUE& aVal );
|
||||
bool SetMin( const SPICE_VALUE& aVal );
|
||||
bool SetMax( const SPICE_VALUE& aVal );
|
||||
|
||||
private:
|
||||
void updateComponentValue();
|
||||
void updateSlider();
|
||||
void updateValueText();
|
||||
|
||||
void onClose( wxCommandEvent& event ) override;
|
||||
void onSave( wxCommandEvent& event ) override;
|
||||
void onSliderChanged( wxScrollEvent& event ) override;
|
||||
|
||||
void onMaxTextEnter( wxCommandEvent& event ) override;
|
||||
void onValueTextEnter( wxCommandEvent& event ) override;
|
||||
void onMinTextEnter( wxCommandEvent& event ) override;
|
||||
|
||||
void onSimTimer( wxTimerEvent& event );
|
||||
|
||||
wxString m_spiceName;
|
||||
|
||||
///> Timer that restarts the simulation after the slider value has changed
|
||||
wxTimer m_simTimer;
|
||||
|
||||
SCH_COMPONENT* m_component;
|
||||
|
||||
SPICE_VALUE m_min, m_max, m_value;
|
||||
bool m_changed;
|
||||
|
||||
SIM_PLOT_FRAME *m_frame;
|
||||
};
|
||||
|
||||
#endif /* TUNER_SLIDER_H */
|
|
@ -0,0 +1,108 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "tuner_slider_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TUNER_SLIDER_BASE::TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
|
||||
{
|
||||
wxBoxSizer* bSizer1;
|
||||
bSizer1 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* bSizer2;
|
||||
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
m_name = new wxStaticText( this, wxID_ANY, _("Name"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_name->Wrap( -1 );
|
||||
bSizer2->Add( m_name, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_closeBtn = new wxButton( this, wxID_ANY, _(" X "), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
|
||||
bSizer2->Add( m_closeBtn, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizer1->Add( bSizer2, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizer3;
|
||||
bSizer3 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxBoxSizer* bSizer4;
|
||||
bSizer4 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_slider = new wxSlider( this, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_LEFT|wxSL_VERTICAL );
|
||||
bSizer4->Add( m_slider, 1, 0, 5 );
|
||||
|
||||
|
||||
bSizer3->Add( bSizer4, 0, wxEXPAND, 5 );
|
||||
|
||||
wxGridSizer* gSizer1;
|
||||
gSizer1 = new wxGridSizer( 0, 1, 0, 0 );
|
||||
|
||||
m_maxText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
|
||||
m_maxText->SetMinSize( wxSize( 70,-1 ) );
|
||||
|
||||
gSizer1->Add( m_maxText, 0, wxALIGN_TOP|wxALL, 5 );
|
||||
|
||||
m_valueText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
|
||||
m_valueText->SetMinSize( wxSize( 70,-1 ) );
|
||||
|
||||
gSizer1->Add( m_valueText, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||
|
||||
m_minText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
|
||||
m_minText->SetMinSize( wxSize( 70,-1 ) );
|
||||
|
||||
gSizer1->Add( m_minText, 0, wxALIGN_BOTTOM|wxALL, 5 );
|
||||
|
||||
|
||||
bSizer3->Add( gSizer1, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizer1->Add( bSizer3, 1, wxEXPAND, 5 );
|
||||
|
||||
m_saveBtn = new wxButton( this, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer1->Add( m_saveBtn, 0, wxALL, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizer1 );
|
||||
this->Layout();
|
||||
|
||||
// Connect Events
|
||||
m_closeBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onClose ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_TOP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_LINEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_LINEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_PAGEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Connect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_maxText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMaxTextEnter ), NULL, this );
|
||||
m_valueText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onValueTextEnter ), NULL, this );
|
||||
m_minText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMinTextEnter ), NULL, this );
|
||||
m_saveBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onSave ), NULL, this );
|
||||
}
|
||||
|
||||
TUNER_SLIDER_BASE::~TUNER_SLIDER_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_closeBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onClose ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_TOP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_LINEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_LINEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_PAGEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_slider->Disconnect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
|
||||
m_maxText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMaxTextEnter ), NULL, this );
|
||||
m_valueText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onValueTextEnter ), NULL, this );
|
||||
m_minText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMinTextEnter ), NULL, this );
|
||||
m_saveBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onSave ), NULL, this );
|
||||
|
||||
}
|
|
@ -0,0 +1,776 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="13" />
|
||||
<object class="Project" expanded="1">
|
||||
<property name="class_decoration"></property>
|
||||
<property name="code_generation">C++</property>
|
||||
<property name="disconnect_events">1</property>
|
||||
<property name="disconnect_mode">source_name</property>
|
||||
<property name="disconnect_php_events">0</property>
|
||||
<property name="disconnect_python_events">0</property>
|
||||
<property name="embedded_files_path">res</property>
|
||||
<property name="encoding">UTF-8</property>
|
||||
<property name="event_generation">connect</property>
|
||||
<property name="file">tuner_slider_base</property>
|
||||
<property name="first_id">1000</property>
|
||||
<property name="help_provider">none</property>
|
||||
<property name="internationalize">1</property>
|
||||
<property name="name">TUNER_SLIDER_BASE</property>
|
||||
<property name="namespace"></property>
|
||||
<property name="path">.</property>
|
||||
<property name="precompiled_header"></property>
|
||||
<property name="relative_path">1</property>
|
||||
<property name="skip_lua_events">1</property>
|
||||
<property name="skip_php_events">1</property>
|
||||
<property name="skip_python_events">1</property>
|
||||
<property name="ui_table">UI</property>
|
||||
<property name="use_enum">0</property>
|
||||
<property name="use_microsoft_bom">0</property>
|
||||
<object class="Panel" expanded="1">
|
||||
<property name="aui_managed">0</property>
|
||||
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
|
||||
<property name="bg"></property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="event_handler">impl_virtual</property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">TUNER_SLIDER_BASE</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">97,283</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||
<event name="OnAuiFindManager"></event>
|
||||
<event name="OnAuiPaneButton"></event>
|
||||
<event name="OnAuiPaneClose"></event>
|
||||
<event name="OnAuiPaneMaximize"></event>
|
||||
<event name="OnAuiPaneRestore"></event>
|
||||
<event name="OnAuiRender"></event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnInitDialog"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer1</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer2</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxStaticText" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Name</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_name</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label"> X </property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_closeBtn</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxBU_EXACTFIT</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">onClose</event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer3</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="0">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer4</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag"></property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxSlider" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maxValue">100</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minValue">0</property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_slider</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_LEFT|wxSL_VERTICAL</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value">50</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCommandScroll"></event>
|
||||
<event name="OnCommandScrollBottom"></event>
|
||||
<event name="OnCommandScrollChanged"></event>
|
||||
<event name="OnCommandScrollLineDown"></event>
|
||||
<event name="OnCommandScrollLineUp"></event>
|
||||
<event name="OnCommandScrollPageDown"></event>
|
||||
<event name="OnCommandScrollPageUp"></event>
|
||||
<event name="OnCommandScrollThumbRelease"></event>
|
||||
<event name="OnCommandScrollThumbTrack"></event>
|
||||
<event name="OnCommandScrollTop"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnScroll">onSliderChanged</event>
|
||||
<event name="OnScrollBottom"></event>
|
||||
<event name="OnScrollChanged"></event>
|
||||
<event name="OnScrollLineDown"></event>
|
||||
<event name="OnScrollLineUp"></event>
|
||||
<event name="OnScrollPageDown"></event>
|
||||
<event name="OnScrollPageUp"></event>
|
||||
<event name="OnScrollThumbRelease"></event>
|
||||
<event name="OnScrollThumbTrack"></event>
|
||||
<event name="OnScrollTop"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxGridSizer" expanded="0">
|
||||
<property name="cols">1</property>
|
||||
<property name="hgap">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">gSizer1</property>
|
||||
<property name="permission">none</property>
|
||||
<property name="rows">0</property>
|
||||
<property name="vgap">0</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_TOP|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">70,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_maxText</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxTE_PROCESS_ENTER</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter">onMaxTextEnter</event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">70,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_valueText</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxTE_PROCESS_ENTER</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter">onValueTextEnter</event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_BOTTOM|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">70,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_minText</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxTE_PROCESS_ENTER</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter">onMinTextEnter</event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Save</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_saveBtn</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">onSave</event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</wxFormBuilder_Project>
|
|
@ -0,0 +1,61 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 24 2016)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __TUNER_SLIDER_BASE_H__
|
||||
#define __TUNER_SLIDER_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/slider.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/panel.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class TUNER_SLIDER_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class TUNER_SLIDER_BASE : public wxPanel
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxStaticText* m_name;
|
||||
wxButton* m_closeBtn;
|
||||
wxSlider* m_slider;
|
||||
wxTextCtrl* m_maxText;
|
||||
wxTextCtrl* m_valueText;
|
||||
wxTextCtrl* m_minText;
|
||||
wxButton* m_saveBtn;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void onClose( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onSliderChanged( wxScrollEvent& event ) { event.Skip(); }
|
||||
virtual void onMaxTextEnter( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onValueTextEnter( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onMinTextEnter( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void onSave( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 97,283 ), long style = wxTAB_TRAVERSAL );
|
||||
~TUNER_SLIDER_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__TUNER_SLIDER_BASE_H__
|
|
@ -570,5 +570,11 @@ EXTERN_BITMAP( zoom_xpm )
|
|||
EXTERN_BITMAP( tune_diff_pair_length_legend_xpm )
|
||||
EXTERN_BITMAP( tune_diff_pair_skew_legend_xpm )
|
||||
EXTERN_BITMAP( tune_single_track_length_legend_xpm )
|
||||
EXTERN_BITMAP( sim_run_xpm )
|
||||
EXTERN_BITMAP( sim_stop_xpm )
|
||||
EXTERN_BITMAP( sim_tune_xpm )
|
||||
EXTERN_BITMAP( sim_probe_xpm )
|
||||
EXTERN_BITMAP( sim_add_signal_xpm )
|
||||
EXTERN_BITMAP( sim_settings_xpm )
|
||||
|
||||
#endif // BITMAPS_H_
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue