I've got a new version of the Eeschema field autoplacer for the interested. Not too many changes, but it's more polished:
- Adjusted the padding used around a component - Added an option to allow placing the labels off-grid (they look a bit better that way) - Minor bugfixes - Code cleanup and minor refactoring
diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt index 8cc642a..410b895 100644 --- a/bitmaps_png/CMakeLists.txt +++ b/bitmaps_png/CMakeLists.txt @@ -160,6 +160,7 @@ set( BMAPS_MID auto_associe auto_delete_track auto_track_width + autoplace_fields axis3d_back axis3d_bottom axis3d_front diff --git a/bitmaps_png/cpp_26/autoplace_fields.cpp b/bitmaps_png/cpp_26/autoplace_fields.cpp new file mode 100644 index 0000000..dda674b --- /dev/null +++ b/bitmaps_png/cpp_26/autoplace_fields.cpp @@ -0,0 +1,79 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include <bitmaps.h> + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x03, 0xe2, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x95, 0x5b, 0x4c, 0x1c, + 0x55, 0x18, 0xc7, 0x17, 0x86, 0x65, 0x59, 0x96, 0xe5, 0xb6, 0x96, 0x94, 0x70, 0x09, 0x5a, 0x1e, + 0xec, 0x83, 0x24, 0x0a, 0x18, 0xa5, 0xd4, 0x27, 0x6d, 0xc0, 0x5b, 0x63, 0x43, 0x13, 0x1a, 0x23, + 0xd1, 0x90, 0xa6, 0x11, 0x1e, 0x2a, 0x0f, 0x5a, 0x48, 0x37, 0xb0, 0x4b, 0x40, 0x36, 0x43, 0x9b, + 0x46, 0xc1, 0xe0, 0x72, 0xe9, 0x83, 0xc5, 0x18, 0x78, 0x30, 0x36, 0x28, 0x89, 0xed, 0x43, 0xfb, + 0xd2, 0x9a, 0x1a, 0x74, 0x37, 0x69, 0x6d, 0x61, 0x4b, 0x69, 0xa1, 0x5c, 0xbb, 0x4b, 0x8a, 0x54, + 0xd7, 0x86, 0x86, 0xfe, 0xfd, 0x9f, 0x99, 0xb3, 0x66, 0x84, 0x96, 0xd4, 0xb8, 0x7b, 0x92, 0x5f, + 0x32, 0x33, 0x67, 0xe6, 0xfc, 0xce, 0xf9, 0xbe, 0xef, 0x9c, 0x31, 0x99, 0xfe, 0x7b, 0xeb, 0x24, + 0x35, 0xc4, 0x4e, 0x86, 0xc9, 0x0b, 0xe4, 0x25, 0x79, 0x2d, 0x70, 0x93, 0x78, 0x53, 0x14, 0x9a, + 0x9f, 0x1c, 0x27, 0x0e, 0x02, 0xf2, 0x26, 0x29, 0x26, 0x5e, 0xc9, 0x6f, 0xa4, 0x2b, 0x56, 0xa2, + 0x44, 0x92, 0x21, 0x19, 0x20, 0x17, 0x63, 0x25, 0xda, 0x2f, 0xaf, 0x05, 0x2b, 0x64, 0x57, 0x34, + 0x44, 0x2d, 0x64, 0x51, 0x0a, 0xa7, 0x48, 0x8e, 0x41, 0xb4, 0x4b, 0xde, 0x47, 0xad, 0x7d, 0x40, + 0x3a, 0x0c, 0x83, 0x3e, 0x47, 0x3c, 0xc4, 0xfc, 0x24, 0x1f, 0xd7, 0x3f, 0xe6, 0xc5, 0x83, 0x86, + 0x44, 0x3b, 0x49, 0x25, 0x69, 0x95, 0x7d, 0x75, 0x52, 0x9a, 0x46, 0xbe, 0x94, 0xef, 0x08, 0xe9, + 0xeb, 0x86, 0x6f, 0xde, 0xdb, 0x38, 0x60, 0xd0, 0x6c, 0x36, 0x07, 0x12, 0x12, 0x12, 0x36, 0xc6, + 0xf7, 0x23, 0x59, 0xb6, 0x33, 0xe4, 0x27, 0xe2, 0x22, 0xb3, 0xb2, 0xef, 0x47, 0xd9, 0xd7, 0x5c, + 0x58, 0x58, 0x88, 0x92, 0x92, 0x12, 0x11, 0xbe, 0x33, 0x64, 0x9f, 0x7c, 0x3e, 0x46, 0xd6, 0x37, + 0x89, 0x28, 0x41, 0x5c, 0x5c, 0x1c, 0xd2, 0xd3, 0xd3, 0xbf, 0xe7, 0x7d, 0xa6, 0xa1, 0x6f, 0x9b, + 0x4c, 0xf2, 0xbb, 0x52, 0xf4, 0x17, 0xf9, 0x8e, 0x2c, 0xc9, 0x01, 0x4f, 0xcd, 0xce, 0xce, 0x62, + 0x6d, 0x6d, 0x0d, 0x79, 0x79, 0x79, 0x01, 0xf9, 0x8d, 0x42, 0xbe, 0x26, 0x67, 0x37, 0x89, 0xda, + 0xda, 0xda, 0x71, 0xe2, 0xc4, 0x67, 0xb0, 0xdb, 0xed, 0x48, 0x4a, 0x4a, 0xfa, 0x33, 0x39, 0x39, + 0xf9, 0xa0, 0xec, 0xeb, 0x26, 0x3e, 0xb9, 0x11, 0x45, 0xe8, 0x3e, 0x97, 0x4c, 0x4b, 0xd1, 0x57, + 0xe3, 0xe3, 0xe3, 0x58, 0x5d, 0x5d, 0x45, 0x76, 0x76, 0xf6, 0x04, 0xef, 0x2d, 0x64, 0x88, 0x7c, + 0x4b, 0x92, 0x36, 0x89, 0x3c, 0x1e, 0x15, 0xf7, 0xef, 0x03, 0x93, 0x93, 0x73, 0x38, 0x70, 0xa0, + 0x46, 0x5b, 0x1d, 0xa5, 0xa2, 0xba, 0x1e, 0x90, 0x57, 0x1f, 0x91, 0xbf, 0x48, 0xe8, 0x3e, 0x76, + 0x38, 0x1c, 0xc8, 0xcd, 0xcd, 0x15, 0xa1, 0x3b, 0x25, 0xee, 0xc9, 0x43, 0xf2, 0x2b, 0xf9, 0x39, + 0xf2, 0xf2, 0x4e, 0x72, 0x8c, 0x84, 0x3a, 0x3a, 0x54, 0x84, 0xc3, 0xe0, 0xcc, 0x80, 0xbb, 0x77, + 0x81, 0xd3, 0xa7, 0xcf, 0xa3, 0xa0, 0x60, 0x07, 0xe2, 0xe3, 0xe3, 0xd7, 0x53, 0x53, 0x53, 0x5b, + 0x65, 0x38, 0x8c, 0x4d, 0x94, 0xf5, 0xdb, 0xc4, 0x4a, 0x3e, 0x21, 0x47, 0x48, 0x3e, 0x79, 0x59, + 0x5e, 0x1f, 0x91, 0xcf, 0xf9, 0x34, 0x3f, 0xff, 0x35, 0x9b, 0xcd, 0xe6, 0x57, 0x14, 0xe5, 0xf7, + 0xf6, 0x76, 0x15, 0xf7, 0xee, 0xe9, 0x92, 0x50, 0x08, 0x58, 0x5a, 0x02, 0xa6, 0xa7, 0x1f, 0xc0, + 0xe3, 0xf1, 0x22, 0x23, 0xc3, 0x01, 0xca, 0x66, 0x58, 0x30, 0x25, 0x52, 0x62, 0x95, 0xe7, 0xdc, + 0x33, 0x4f, 0xb4, 0x21, 0x7a, 0x7b, 0x7b, 0x2b, 0xfb, 0xfa, 0xfa, 0x90, 0x92, 0x92, 0x82, 0xb6, + 0x36, 0x15, 0x2b, 0x2b, 0xc0, 0xf2, 0xb2, 0x2e, 0x99, 0x9f, 0x07, 0x6e, 0xdf, 0x06, 0x6e, 0xde, + 0x04, 0xc6, 0xc6, 0x42, 0xa8, 0xa9, 0x39, 0x0c, 0x16, 0xcc, 0x43, 0x4e, 0xec, 0x07, 0x7e, 0x3a, + 0x6f, 0x38, 0x0d, 0xbe, 0x79, 0xc4, 0x6a, 0xff, 0xdd, 0x86, 0x87, 0x87, 0x95, 0xc1, 0xc1, 0xc1, + 0x54, 0xe6, 0x23, 0xd4, 0xda, 0xaa, 0x6a, 0x92, 0x3b, 0x77, 0x80, 0x85, 0x05, 0x5d, 0x72, 0xeb, + 0x16, 0x70, 0xe3, 0x06, 0x30, 0x31, 0x01, 0x5c, 0xbd, 0x0a, 0x0c, 0x0d, 0x8d, 0xc1, 0x66, 0xb3, + 0x63, 0xf7, 0xee, 0x57, 0xe0, 0xf7, 0x4f, 0xe3, 0xe4, 0xc9, 0x51, 0x28, 0x4a, 0x02, 0x4a, 0x4b, + 0x4b, 0x7d, 0x69, 0x69, 0x69, 0x55, 0xf2, 0x48, 0x7a, 0x6a, 0x2b, 0x67, 0xd0, 0xed, 0x56, 0x11, + 0x0c, 0xea, 0x12, 0x56, 0x2b, 0xc3, 0xa6, 0x4b, 0x02, 0x01, 0xe0, 0xda, 0x35, 0xe0, 0xf2, 0x65, + 0x70, 0x70, 0x20, 0x33, 0x33, 0x0b, 0x4e, 0xe7, 0xa7, 0x98, 0x9a, 0x02, 0x7c, 0x3e, 0x70, 0x3b, + 0x6c, 0x83, 0x61, 0x75, 0x82, 0x3d, 0x5b, 0x8a, 0x5a, 0x5a, 0x54, 0x2c, 0x2e, 0x02, 0x73, 0x73, + 0xba, 0x44, 0x0c, 0x74, 0xfd, 0xba, 0x2e, 0xb9, 0x72, 0x05, 0xb8, 0x74, 0x29, 0x8c, 0x43, 0x87, + 0x5c, 0x2c, 0x0e, 0x05, 0x59, 0x59, 0xd9, 0x68, 0x6a, 0xfa, 0x02, 0x7b, 0xf7, 0x7e, 0xa8, 0x55, + 0x67, 0x63, 0x63, 0x23, 0x98, 0x86, 0x30, 0x81, 0x48, 0x05, 0x19, 0xdc, 0x28, 0x10, 0xb1, 0x4d, + 0x11, 0xa2, 0xe6, 0x66, 0x55, 0x93, 0xcc, 0xcc, 0xe8, 0x79, 0x11, 0x12, 0x6e, 0x0f, 0x4d, 0xd2, + 0xd5, 0x35, 0x82, 0x9c, 0x9c, 0xa7, 0x29, 0xc8, 0x42, 0x7d, 0x7d, 0x3d, 0xca, 0xca, 0xca, 0xc4, + 0xc6, 0xe6, 0xb3, 0x1c, 0xd4, 0xd6, 0xd6, 0x6a, 0x83, 0xf7, 0xf7, 0xf7, 0x5f, 0x24, 0x6f, 0x49, + 0x9e, 0xdf, 0x28, 0x7a, 0x43, 0x2e, 0x77, 0xd9, 0xe9, 0x54, 0xff, 0x91, 0x4c, 0x4e, 0xea, 0x92, + 0xd1, 0xd1, 0x00, 0xca, 0xcb, 0x2b, 0x99, 0x07, 0x05, 0x15, 0x15, 0x15, 0xe8, 0xe9, 0xe9, 0x89, + 0xcc, 0xf8, 0x02, 0x39, 0x27, 0xaf, 0x05, 0x53, 0x64, 0xe7, 0x63, 0xe3, 0xd5, 0xd0, 0xd0, 0xb0, + 0xa7, 0xae, 0xae, 0xce, 0x67, 0xb5, 0x5a, 0xd7, 0x8e, 0x1e, 0x55, 0xb5, 0xe4, 0x0b, 0x89, 0xdf, + 0xff, 0x07, 0x67, 0xee, 0x42, 0x62, 0xa2, 0x05, 0xe2, 0x1c, 0x73, 0xbb, 0xdd, 0x91, 0x01, 0x57, + 0x18, 0x9e, 0xc3, 0x2e, 0x97, 0x4b, 0xfb, 0x5d, 0x7b, 0xbd, 0xde, 0x1d, 0x62, 0xf6, 0x2c, 0xaa, + 0xc4, 0x2d, 0xab, 0x4e, 0xcc, 0x82, 0x2f, 0x1e, 0xb7, 0x58, 0x2c, 0xe1, 0xa6, 0x26, 0x55, 0x4b, + 0xbe, 0xd7, 0x3b, 0x82, 0xed, 0xdb, 0xf3, 0xc0, 0x23, 0x08, 0xd5, 0xd5, 0xd5, 0x30, 0xc4, 0x7d, + 0x84, 0xe4, 0xfe, 0xdf, 0x7f, 0x4c, 0xb0, 0xaa, 0xea, 0x7d, 0x14, 0x17, 0x97, 0x6b, 0x95, 0x53, + 0x54, 0x54, 0x84, 0xce, 0xce, 0xce, 0x88, 0x60, 0x8e, 0xec, 0x8b, 0xd6, 0xcf, 0x2c, 0x28, 0x04, + 0x22, 0xc1, 0x0c, 0x65, 0x44, 0xb0, 0x4e, 0xbc, 0x03, 0x03, 0x03, 0xf6, 0x68, 0xfe, 0x35, 0x17, + 0xb8, 0x8a, 0x5f, 0xba, 0xbb, 0xbb, 0x35, 0x09, 0xc3, 0xe5, 0x67, 0x48, 0x5f, 0x34, 0xc5, 0xa0, + 0x3d, 0x4b, 0xc1, 0x31, 0x12, 0x26, 0x2e, 0x26, 0xd9, 0x6c, 0x8a, 0x55, 0xe3, 0x2a, 0xde, 0x61, + 0xf9, 0x16, 0xc4, 0x62, 0xec, 0xbf, 0x01, 0x96, 0xa8, 0x5c, 0xe1, 0x12, 0x7e, 0x2a, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; + +const BITMAP_OPAQUE autoplace_fields_xpm[1] = {{ png, sizeof( png ), "autoplace_fields_xpm" }}; + +//EOF diff --git a/bitmaps_png/sources/autoplace_fields.svg b/bitmaps_png/sources/autoplace_fields.svg new file mode 100644 index 0000000..a7f6728 --- /dev/null +++ b/bitmaps_png/sources/autoplace_fields.svg @@ -0,0 +1,307 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="48" + width="48" + version="1.1" + viewBox="0 0 48 48" + id="svg2" + inkscape:version="0.91 r13725" + sodipodi:docname="autoplace_fields.svg"> + <metadata + id="metadata151"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </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="1676" + inkscape:window-height="994" + id="namedview149" + showgrid="false" + inkscape:zoom="6.9532167" + inkscape:cx="19.533569" + inkscape:cy="26.564532" + inkscape:window-x="0" + inkscape:window-y="54" + inkscape:window-maximized="0" + inkscape:current-layer="svg2" /> + <defs + id="defs4"> + <linearGradient + id="a"> + <stop + stop-color="#fff" + offset="0" + id="stop7" /> + <stop + stop-color="#babaff" + offset="1" + id="stop9" /> + </linearGradient> + <linearGradient + id="j" + y2="10.441" + xlink:href="#a" + gradientUnits="userSpaceOnUse" + x2="12.136" + gradientTransform="matrix(2.2734557,0,0,2.6193664,-58.250764,5.4148976)" + y1="1.9828" + x1="3.4673" /> + <linearGradient + id="b" + y2="7.8438" + xlink:href="#a" + gradientUnits="userSpaceOnUse" + x2="12.922" + y1="6.0625" + x1="11.078" + gradientTransform="matrix(2.5619,0,0,2.3244,-58.266136,5.4148976)" /> + <linearGradient + id="k" + y2="14.691" + gradientUnits="userSpaceOnUse" + x2="30.432" + gradientTransform="translate(6.3922,12.185)" + y1="12.338" + x1="28.079"> + <stop + stop-color="#fcaf3e" + offset="0" + id="stop14" /> + <stop + stop-color="#ce5c00" + offset="1" + id="stop16" /> + </linearGradient> + <linearGradient + id="l" + y2="22.119" + gradientUnits="userSpaceOnUse" + x2="22.81" + gradientTransform="translate(6.3922,12.185)" + y1="21.481" + x1="23.448"> + <stop + stop-color="#ce5c00" + offset="0" + id="stop19" /> + <stop + stop-color="#ce5c00" + offset="1" + id="stop21" /> + </linearGradient> + <linearGradient + id="m" + y2="32.714" + gradientUnits="userSpaceOnUse" + x2="25.485" + y1="34.39" + x1="26.379"> + <stop + stop-color="#e9b96e" + offset="0" + id="stop24" /> + <stop + stop-color="#fff" + offset="1" + id="stop26" /> + </linearGradient> + <radialGradient + id="p" + gradientUnits="userSpaceOnUse" + cy="128" + cx="-138.84" + gradientTransform="matrix(.35473 -.34328 .35696 .34544 130.15 -71.026)" + r="9.1267"> + <stop + stop-color="#f9a9a9" + offset="0" + id="stop29" /> + <stop + stop-color="#ab5f5f" + offset="1" + id="stop31" /> + </radialGradient> + <linearGradient + id="n" + y2="134.25" + gradientUnits="userSpaceOnUse" + x2="-158.75" + gradientTransform="matrix(.20949 -.20274 .20949 .20274 129.28 -31.999)" + y1="115.94" + x1="-158.75"> + <stop + stop-color="#ddd" + offset="0" + id="stop34" /> + <stop + stop-color="#fff" + offset=".34468" + id="stop36" /> + <stop + stop-color="#737373" + offset=".72695" + id="stop38" /> + <stop + stop-color="#bbb" + offset="1" + id="stop40" /> + </linearGradient> + <linearGradient + id="o" + y2="10.441" + xlink:href="#a" + gradientUnits="userSpaceOnUse" + x2="12.136" + gradientTransform="matrix(2.246184,0,0,2.7037,-1.2081619,11.548735)" + y1="1.9828" + x1="3.4673" /> + <linearGradient + inkscape:collect="always" + xlink:href="#a" + id="linearGradient3479" + gradientUnits="userSpaceOnUse" + x1="11.078" + y1="6.0625" + x2="12.922" + y2="7.8438" + gradientTransform="matrix(2.531196,0,0,2.3993,-1.2229579,11.548735)" /> + </defs> + <g + id="g4323"> + <g + transform="matrix(2.531196,0,0,2.3993,-13.87883,-17.842265)" + id="g107" + style="fill:#9b9b9b"> + <path + d="m 8,13.25 0,14 10.5,-7 -10.5,-7 z" + id="path109" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <rect + y="17.25" + width="1.9942" + x="6.0057998" + height="1" + id="rect111" /> + <rect + y="22.25" + width="2" + x="6" + height="1" + id="rect113" /> + <path + d="m 14.5,6.5 a 1.5,1.5 0 1 1 -3,0 1.5,1.5 0 1 1 3,0 z" + transform="matrix(1.3333,0,0,1.3333,0.66664,11.583)" + id="path115" + inkscape:connector-curvature="0" /> + <rect + y="19.75" + width="2.4942" + x="19.506001" + height="1" + id="rect117" /> + </g> + <rect + transform="matrix(-1.754568e-7,1,-1,-4.4663889e-8,0,0)" + height="2.5311959" + width="2.3993001" + y="-8.9018316" + x="16.347736" + id="rect119" + style="fill:#ffffff" /> + <path + d="m 3.8394341,11.548735 0,33.591 26.5766399,-16.795 -26.5766399,-16.796 z" + id="path121" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <rect + y="21.146734" + width="2.5311959" + x="1.3082383" + height="2.3993001" + id="rect123" /> + <rect + y="33.143135" + width="2.5311959" + x="1.3082383" + height="2.3993001" + id="rect125" /> + <path + d="m 6.3853181,16.347735 0,23.993 20.2499999,-11.996 -20.2499999,-11.997 z" + id="path127" + style="fill:url(#o);fill-rule:evenodd" + inkscape:connector-curvature="0" /> + <path + d="m 34.213624,28.344885 a 5.062338,4.79865 0 0 1 -10.124676,0 5.062338,4.79865 0 1 1 10.124676,0 z" + id="path129" + inkscape:connector-curvature="0" /> + <path + d="m 31.68259,28.343835 a 2.531196,2.3993 0 0 1 -5.062392,0 2.531196,2.3993 0 1 1 5.062392,0 z" + id="path131" + style="fill:url(#linearGradient3479)" + inkscape:connector-curvature="0" /> + <rect + y="27.144733" + width="6.3132482" + x="32.962929" + height="2.3993001" + id="rect133" /> + <path + d="m 22.49337,0.60054242 0,7.19799968 2.531196,2.3992999 2.531196,0 2.531196,-2.3992999 0,-7.19799968 -2.531196,0 0,7.19799968 -2.531196,0 0,-7.19799968 -2.53152,0 z" + id="path135" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <path + d="m 32.61729,0.60054242 5.062392,0 2.531196,2.39929998 0,2.3993 -2.531196,2.3992997 -2.531196,0 0,2.3992999 -2.53044,0 0,-4.7986996 5.062392,0 0,-2.3993 -5.06196,0 0,-2.39929998 z" + id="path147" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <path + d="m 15.393889,11.860171 6.40475,0 0,2.3244 -3.84285,6.990866 -2.5619,0 3.84285,-6.9732 -3.84285,0 0,-2.342995 z" + id="path75" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <path + d="m 39.731939,11.860171 0,2.3244 3.84285,0 0,1.1622 -3.84285,3.4866 0,2.3244 6.40475,0 0,-2.3244 -3.84285,0 3.84285,-3.4866 0,-2.3244 -1.28095,-1.179842 -5.1238,0.01767 z" + id="path77" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <path + d="m 32.046239,14.312413 0.01947,4.520958 1.261505,2.3244 3.84285,0 1.300395,-2.452242 0,-4.6488 -1.300395,-2.196488 -3.84285,0 -1.28095,2.452242 z" + id="path79" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + <path + d="m 33.327189,15.346771 1.28095,-1.1622 1.28095,0 1.28095,1.1622 0,2.3244 -1.28095,1.1622 -1.28095,0 -1.28095,-1.1622 0,-2.3244 z" + id="path81" + inkscape:connector-curvature="0" + style="fill:#ffffff;fill-rule:evenodd" /> + <path + d="m 23.079589,11.860171 0,5.811 5.1238,0 0,3.4866 2.5619,0 0,-9.2976 -2.5619,0 0,3.4866 -2.5619,0 0,-3.4866 -2.5619,0 z" + id="path83" + inkscape:connector-curvature="0" + style="fill-rule:evenodd" /> + </g> +</svg> diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index d6cc1cd..349decb 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -75,6 +75,7 @@ set( EESCHEMA_DLGS ) set( EESCHEMA_SRCS + autoplace_fields.cpp annotate.cpp backanno.cpp block.cpp diff --git a/eeschema/autoplace_fields.cpp b/eeschema/autoplace_fields.cpp new file mode 100644 index 0000000..dd7fa92 --- /dev/null +++ b/eeschema/autoplace_fields.cpp @@ -0,0 +1,387 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2015 Chris Pavlina <pavlina.ch...@gmail.com> + * Copyright (C) 2015 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <schframe.h> +#include <hotkeys_basic.h> +#include <sch_component.h> +#include <lib_pin.h> +#include <class_drawpanel.h> +#include <class_libentry.h> +#include <eeschema_config.h> +#include <kiface_i.h> +#include <boost/foreach.hpp> +#include <vector> +#include <algorithm> + +#define FIELD_V_SPACING 100 +#define HPADDING 25 +#define VPADDING 50 + +enum component_side +{ + SIDE_TOP, SIDE_BOTTOM, SIDE_LEFT, SIDE_RIGHT +}; + +/** + * Function round_n + * Round up/down to the nearest multiple of n + */ +template<typename T> T round_n( const T& value, const T& n, bool aRoundUp ) +{ + if( value % n ) + return n * (value / n + (aRoundUp ? 1 : 0)); + else + return value; +} + + +/** + * Function get_pin_side + * Return the side that a pin is on. + */ +static enum component_side get_pin_side( SCH_COMPONENT* aComponent, LIB_PIN* aPin ) +{ + int pin_orient = aPin->PinDrawOrient( aComponent->GetTransform() ); + switch( pin_orient ) + { + case PIN_RIGHT: + return SIDE_LEFT; + case PIN_LEFT: + return SIDE_RIGHT; + case PIN_UP: + return SIDE_BOTTOM; + case PIN_DOWN: + return SIDE_TOP; + default: + wxFAIL_MSG( "Invalid pin orientation" ); + return SIDE_LEFT; + } +} + + +/** + * Function pins_on_side + * Count the number of pins on a side of the component + */ +static unsigned pins_on_side( SCH_COMPONENT* aComponent, enum component_side aSide ) +{ + unsigned pin_count = 0; + + std::vector<LIB_PIN*> pins; + aComponent->GetPins( pins ); + + BOOST_FOREACH( LIB_PIN* each_pin, pins ) + { + if( !each_pin->IsVisible() ) + continue; + if( get_pin_side( aComponent, each_pin ) == aSide ) + ++pin_count; + } + + return pin_count; +} + + +// Used for iteration +struct side { + enum component_side name; + unsigned pins; +}; + + +/** + * Function populate_preferred_sides + * Populate a list with the preferred field sides for the component, in + * decreasing order of preference. + */ +static void populate_preferred_sides( std::vector<struct side>& aSides, + SCH_COMPONENT* aComponent ) +{ + struct side sides[] = { + { SIDE_RIGHT, pins_on_side( aComponent, SIDE_RIGHT ) }, + { SIDE_TOP, pins_on_side( aComponent, SIDE_TOP ) }, + { SIDE_LEFT, pins_on_side( aComponent, SIDE_LEFT ) }, + { SIDE_BOTTOM, pins_on_side( aComponent, SIDE_BOTTOM ) }, + }; + + int orient = aComponent->GetOrientation(); + int orient_angle = orient & 0xff; // enum is a bitmask + + // If the component is horizontally mirrored, swap left and right + if( ( orient & CMP_MIRROR_X ) && ( orient_angle == CMP_ORIENT_0 || orient_angle == CMP_ORIENT_180 ) ) + { + std::swap( sides[0], sides[2] ); + } + + // If the component is very long, swap H and V + EDA_RECT body_box = aComponent->GetBodyBoundingBox(); + if( double( body_box.GetWidth() ) / double( body_box.GetHeight() ) > 3.0 ) + { + std::swap( sides[0], sides[1] ); + std::swap( sides[1], sides[3] ); + } + + BOOST_FOREACH( struct side& each_side, sides ) + { + aSides.push_back( each_side ); + } +} + + +/** + * Function choose_side_for_component + * Look where a component's pins are to pick a side to put the fields on + */ +static enum component_side choose_side_for_fields( SCH_COMPONENT* aComponent ) +{ + std::vector<struct side> sides; + populate_preferred_sides( sides, aComponent ); + + + BOOST_FOREACH( struct side& each_side, sides ) + { + if( !each_side.pins ) return each_side.name; + } + + unsigned min_pins = UINT_MAX; + enum component_side min_side = SIDE_RIGHT; + + BOOST_REVERSE_FOREACH( struct side& each_side, sides ) + { + if( each_side.pins < min_pins ) + { + min_pins = each_side.pins; + min_side = each_side.name; + } + } + + return min_side; +} + + +/** + * Function justify_field + * Set the justification of a field based on the side it's supposed to be on, taking into + * account whether the field will be displayed with flipped justification due to mirroring. + */ +static void justify_field( SCH_FIELD* aField, enum component_side aFieldSide ) +{ + // Justification is set twice to allow IsHorizJustifyFlipped() to work correctly. + switch( aFieldSide ) + { + case SIDE_LEFT: + aField->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT ); + aField->SetHorizJustify( aField->IsHorizJustifyFlipped() + ? GR_TEXT_HJUSTIFY_LEFT : GR_TEXT_HJUSTIFY_RIGHT ); + break; + + case SIDE_RIGHT: + aField->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); + aField->SetHorizJustify( aField->IsHorizJustifyFlipped() + ? GR_TEXT_HJUSTIFY_RIGHT : GR_TEXT_HJUSTIFY_LEFT ); + break; + case SIDE_TOP: + case SIDE_BOTTOM: + aField->SetHorizJustify( GR_TEXT_HJUSTIFY_CENTER ); + break; + } + aField->SetVertJustify( GR_TEXT_VJUSTIFY_CENTER ); +} + + +/** + * Function place_field_box + * Return the position of the field bounding box for a component. + */ +static wxPoint field_box_placement( SCH_COMPONENT* aComponent, enum component_side aFieldSide, + wxSize aBoxSize ) +{ + EDA_RECT body_box = aComponent->GetBodyBoundingBox(); + wxPoint fbox_pos; + + switch( aFieldSide ) + { + case SIDE_RIGHT: + fbox_pos.x = body_box.GetRight() + HPADDING; + fbox_pos.y = body_box.GetCenter().y - aBoxSize.GetHeight()/2; + break; + case SIDE_BOTTOM: + fbox_pos.x = body_box.GetLeft() + (body_box.GetWidth() - aBoxSize.GetWidth()) / 2; + fbox_pos.y = body_box.GetBottom() + VPADDING; + break; + case SIDE_LEFT: + fbox_pos.x = body_box.GetLeft() - aBoxSize.GetWidth() - HPADDING; + fbox_pos.y = body_box.GetCenter().y - aBoxSize.GetHeight()/2; + break; + case SIDE_TOP: + fbox_pos.x = body_box.GetLeft() + (body_box.GetWidth() - aBoxSize.GetWidth()) / 2; + fbox_pos.y = body_box.GetTop() - aBoxSize.GetHeight() - VPADDING; + break; + default: + wxFAIL_MSG( "Bad enum component_side value" ); + fbox_pos.x = body_box.GetRight(); + fbox_pos.y = body_box.GetCenter().y - aBoxSize.GetHeight()/2; + } + + return fbox_pos; +} + + +void SCH_EDIT_FRAME::OnAutoplaceFields( wxCommandEvent& aEvent ) +{ + SCH_SCREEN* screen = GetScreen(); + SCH_ITEM* item = screen->GetCurItem(); + + // Get the item under cursor if we're not currently moving something + if( !item ) + { + if( aEvent.GetInt() == 0 ) + return; + + EDA_HOTKEY_CLIENT_DATA& data = dynamic_cast<EDA_HOTKEY_CLIENT_DATA&>( + *aEvent.GetClientObject() ); + item = LocateItem( data.GetPosition(), SCH_COLLECTOR::MovableItems, aEvent.GetInt() ); + screen->SetCurItem( NULL ); + if( !item || item->GetFlags() ) + return; + } + + if( item->Type() != SCH_COMPONENT_T ) + return; + + if( !item->IsNew() ) + SaveCopyInUndoList( item, UR_CHANGED ); + + SCH_COMPONENT& component = dynamic_cast<SCH_COMPONENT&>( *item ); + + component.AutoplaceFields(); + + GetCanvas()->Refresh(); + OnModify(); +} + + +/** + * Function field_horiz_placement + * Place a field horizontally, taking into account the field width and + * justification. + * + * @param aField - the field to place. + * @param aFieldBox - box in which fields will be placed + * + * @return Correct field horizontal position + */ +static int field_horiz_placement( SCH_FIELD *aField, const EDA_RECT &aFieldBox ) +{ + EDA_TEXT_HJUSTIFY_T field_hjust = aField->GetHorizJustify(); + bool flipped = aField->IsHorizJustifyFlipped(); + if( flipped && field_hjust == GR_TEXT_HJUSTIFY_LEFT ) + field_hjust = GR_TEXT_HJUSTIFY_RIGHT; + else if( flipped && field_hjust == GR_TEXT_HJUSTIFY_RIGHT ) + field_hjust = GR_TEXT_HJUSTIFY_LEFT; + + int field_xcoord; + + switch( field_hjust ) + { + case GR_TEXT_HJUSTIFY_LEFT: + field_xcoord = aFieldBox.GetLeft(); + break; + case GR_TEXT_HJUSTIFY_CENTER: + field_xcoord = aFieldBox.GetCenter().x; + break; + case GR_TEXT_HJUSTIFY_RIGHT: + field_xcoord = aFieldBox.GetRight(); + break; + default: + wxFAIL_MSG( "Unexpected value for SCH_FIELD::GetHorizJustify()" ); + field_xcoord = aFieldBox.GetCenter().x; // Most are centered + } + + return field_xcoord; +} + + +void SCH_COMPONENT::AutoplaceFields() +{ + // Do not autoplace on power symbols + if( PART_SPTR part = m_part.lock() ) + if( part->IsPower() ) return; + + // Gather information + std::vector<SCH_FIELD*> fields; + bool allow_rejustify = true; + bool align_to_grid = false; + GetFields( fields, /* aVisibleOnly */ true ); + Kiface().KifaceSettings()->Read( AUTOPLACE_JUSTIFY_KEY, &allow_rejustify, true ); + Kiface().KifaceSettings()->Read( AUTOPLACE_ALIGN_KEY, &align_to_grid, true ); + + int max_field_width = 0; + for( size_t field_idx = 0; field_idx < fields.size(); ++field_idx ) + { + if( GetTransform().y1 ) + fields[field_idx]->SetOrientation( TEXT_ORIENT_VERT ); + else + fields[field_idx]->SetOrientation( TEXT_ORIENT_HORIZ ); + + int field_width = fields[field_idx]->GetBoundingBox().GetWidth(); + if( field_width > max_field_width ) + max_field_width = field_width; + } + + // Determine which side the fields will be placed on + enum component_side field_side = choose_side_for_fields( this ); + + // Compute the box into which fields will go + wxSize fbox_size( max_field_width, FIELD_V_SPACING * (fields.size() - 1) ); + wxPoint fbox_pos = field_box_placement( this, field_side, fbox_size ); + EDA_RECT field_box( fbox_pos, fbox_size ); + + bool h_round_up, v_round_up; + h_round_up = ( field_side != SIDE_LEFT ); + v_round_up = ( field_side == SIDE_BOTTOM ); + + // Move the fields + for( size_t field_idx = 0; field_idx < fields.size(); ++field_idx ) + { + SCH_FIELD* field = fields[field_idx]; + + if( allow_rejustify ) + justify_field( field, field_side ); + + wxPoint pos; + pos.x = field_horiz_placement( field, field_box ); + pos.y = field_box.GetY() + (FIELD_V_SPACING * field_idx); + + if( align_to_grid ) + { + pos.x = round_n( pos.x, 50, h_round_up ); + pos.y = round_n( pos.y, 50, v_round_up ); + } + + field->SetPosition( pos ); + } + + m_fieldsAutoplaced = true; +} diff --git a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp index c5a6020..6dc6f76 100644 --- a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp +++ b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp @@ -159,6 +159,9 @@ void SCH_EDIT_FRAME::EditComponent( SCH_COMPONENT* aComponent ) int ret = dlg->ShowQuasiModal(); (void) ret; // not used. Make coverity and static analysers quiet. + if( m_autoplaceFields && aComponent->GetFieldsAutoplaced() ) + aComponent->AutoplaceFields(); + m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); dlg->Destroy(); diff --git a/eeschema/dialogs/dialog_edit_one_field.cpp b/eeschema/dialogs/dialog_edit_one_field.cpp index d3439da..65dd01b 100644 --- a/eeschema/dialogs/dialog_edit_one_field.cpp +++ b/eeschema/dialogs/dialog_edit_one_field.cpp @@ -298,6 +298,22 @@ void DIALOG_SCH_EDIT_ONE_FIELD::TransfertDataToField( bool aIncludeText ) m_field->SetItalic( ( m_TextShapeOpt->GetSelection() & 1 ) != 0 ); m_field->SetBold( ( m_TextShapeOpt->GetSelection() & 2 ) != 0 ); + + // Because field autoplace can change justification, check whether this has + // been changed, and clear the autoplace flag if so. + EDA_TEXT_HJUSTIFY_T old_hjust = m_field->GetHorizJustify(); + EDA_TEXT_VJUSTIFY_T old_vjust = m_field->GetVertJustify(); + + if( old_hjust != m_textHjustify || old_vjust != m_textVjustify ) + { + EDA_ITEM *parent = m_field->GetParent(); + if( parent->Type() == SCH_COMPONENT_T ) + { + SCH_COMPONENT* component = dynamic_cast<SCH_COMPONENT*>( parent ); + component->ClearFieldsAutoplaced(); + } + } + m_field->SetHorizJustify( m_textHjustify ); m_field->SetVertJustify( m_textVjustify ); } diff --git a/eeschema/dialogs/dialog_eeschema_options.h b/eeschema/dialogs/dialog_eeschema_options.h index 4c08fe3..9549950 100644 --- a/eeschema/dialogs/dialog_eeschema_options.h +++ b/eeschema/dialogs/dialog_eeschema_options.h @@ -428,6 +428,42 @@ public: bool GetShowPageLimits( void ) { return m_checkPageLimits->GetValue(); } /** + * Function + * Set the AutoplaceFields setting in the dialog + */ + void SetAutoplaceFields( bool enable ) { m_checkAutoplaceFields->SetValue( enable ); } + + /** + * Function + * Return the current AutoplaceFields setting from the dialog + */ + bool GetAutoplaceFields() { return m_checkAutoplaceFields->GetValue(); } + + /** + * Function + * Set the AutoplaceJustify setting in the dialog + */ + void SetAutoplaceJustify( bool enable ) { m_checkAutoplaceJustify->SetValue( enable ); } + + /** + * Function + * Return the current AutoplaceJustify setting from the dialog + */ + bool GetAutoplaceJustify() { return m_checkAutoplaceJustify->GetValue(); } + + /** + * Function + * Set the AutoplaceAlign setting in the dialog + */ + void SetAutoplaceAlign( bool enable ) { m_checkAutoplaceAlign->SetValue( enable ); } + + /** + * Function + * Return the current AutoplaceAlign setting from the dialog + */ + bool GetAutoplaceAlign() { return m_checkAutoplaceAlign->GetValue(); } + + /** * Function SetTemplateFields * Set the template field data in the dialog * diff --git a/eeschema/dialogs/dialog_eeschema_options_base.cpp b/eeschema/dialogs/dialog_eeschema_options_base.cpp index a9a5d06..bbc4066 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.cpp +++ b/eeschema/dialogs/dialog_eeschema_options_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Mar 9 2015) +// C++ code generated with wxFormBuilder (version Mar 13 2015) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -203,6 +203,15 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx m_checkPageLimits = new wxCheckBox( m_panel1, wxID_ANY, _("Show p&age limits"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer2->Add( m_checkPageLimits, 0, wxALL|wxEXPAND, 3 ); + m_checkAutoplaceFields = new wxCheckBox( m_panel1, wxID_ANY, _("Automatically place component fields"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2->Add( m_checkAutoplaceFields, 0, wxALL, 3 ); + + m_checkAutoplaceJustify = new wxCheckBox( m_panel1, wxID_ANY, _("Allow field autoplace to change justification"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2->Add( m_checkAutoplaceJustify, 0, wxALL, 3 ); + + m_checkAutoplaceAlign = new wxCheckBox( m_panel1, wxID_ANY, _("Always align autoplaced fields to the 50 mil grid"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2->Add( m_checkAutoplaceAlign, 0, wxALL, 3 ); + bSizer3->Add( bSizer2, 0, wxEXPAND, 0 ); diff --git a/eeschema/dialogs/dialog_eeschema_options_base.fbp b/eeschema/dialogs/dialog_eeschema_options_base.fbp index a7b2188..c6e3f65 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.fbp +++ b/eeschema/dialogs/dialog_eeschema_options_base.fbp @@ -2619,7 +2619,7 @@ <property name="border">0</property> <property name="flag">wxEXPAND</property> <property name="proportion">0</property> - <object class="wxBoxSizer" expanded="0"> + <object class="wxBoxSizer" expanded="1"> <property name="minimum_size"></property> <property name="name">bSizer2</property> <property name="orient">wxVERTICAL</property> @@ -3409,6 +3409,270 @@ <event name="OnUpdateUI"></event> </object> </object> + <object class="sizeritem" expanded="1"> + <property name="border">3</property> + <property name="flag">wxALL</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="1"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Automatically place component fields</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_checkAutoplaceFields</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnChar"></event> + <event name="OnCheckBox"></event> + <event name="OnEnterWindow"></event> + <event name="OnEraseBackground"></event> + <event name="OnKeyDown"></event> + <event name="OnKeyUp"></event> + <event name="OnKillFocus"></event> + <event name="OnLeaveWindow"></event> + <event name="OnLeftDClick"></event> + <event name="OnLeftDown"></event> + <event name="OnLeftUp"></event> + <event name="OnMiddleDClick"></event> + <event name="OnMiddleDown"></event> + <event name="OnMiddleUp"></event> + <event name="OnMotion"></event> + <event name="OnMouseEvents"></event> + <event name="OnMouseWheel"></event> + <event name="OnPaint"></event> + <event name="OnRightDClick"></event> + <event name="OnRightDown"></event> + <event name="OnRightUp"></event> + <event name="OnSetFocus"></event> + <event name="OnSize"></event> + <event name="OnUpdateUI"></event> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">3</property> + <property name="flag">wxALL</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="1"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Allow field autoplace to change justification</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_checkAutoplaceJustify</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnChar"></event> + <event name="OnCheckBox"></event> + <event name="OnEnterWindow"></event> + <event name="OnEraseBackground"></event> + <event name="OnKeyDown"></event> + <event name="OnKeyUp"></event> + <event name="OnKillFocus"></event> + <event name="OnLeaveWindow"></event> + <event name="OnLeftDClick"></event> + <event name="OnLeftDown"></event> + <event name="OnLeftUp"></event> + <event name="OnMiddleDClick"></event> + <event name="OnMiddleDown"></event> + <event name="OnMiddleUp"></event> + <event name="OnMotion"></event> + <event name="OnMouseEvents"></event> + <event name="OnMouseWheel"></event> + <event name="OnPaint"></event> + <event name="OnRightDClick"></event> + <event name="OnRightDown"></event> + <event name="OnRightUp"></event> + <event name="OnSetFocus"></event> + <event name="OnSize"></event> + <event name="OnUpdateUI"></event> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">3</property> + <property name="flag">wxALL</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="1"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Always align autoplaced fields to the 50 mil grid</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_checkAutoplaceAlign</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnChar"></event> + <event name="OnCheckBox"></event> + <event name="OnEnterWindow"></event> + <event name="OnEraseBackground"></event> + <event name="OnKeyDown"></event> + <event name="OnKeyUp"></event> + <event name="OnKillFocus"></event> + <event name="OnLeaveWindow"></event> + <event name="OnLeftDClick"></event> + <event name="OnLeftDown"></event> + <event name="OnLeftUp"></event> + <event name="OnMiddleDClick"></event> + <event name="OnMiddleDown"></event> + <event name="OnMiddleUp"></event> + <event name="OnMotion"></event> + <event name="OnMouseEvents"></event> + <event name="OnMouseWheel"></event> + <event name="OnPaint"></event> + <event name="OnRightDClick"></event> + <event name="OnRightDown"></event> + <event name="OnRightUp"></event> + <event name="OnSetFocus"></event> + <event name="OnSize"></event> + <event name="OnUpdateUI"></event> + </object> + </object> </object> </object> </object> diff --git a/eeschema/dialogs/dialog_eeschema_options_base.h b/eeschema/dialogs/dialog_eeschema_options_base.h index a1f3e3b..3ac3178 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.h +++ b/eeschema/dialogs/dialog_eeschema_options_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Mar 9 2015) +// C++ code generated with wxFormBuilder (version Mar 13 2015) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -106,6 +106,9 @@ class DIALOG_EESCHEMA_OPTIONS_BASE : public DIALOG_SHIM wxCheckBox* m_checkAutoPan; wxCheckBox* m_checkHVOrientation; wxCheckBox* m_checkPageLimits; + wxCheckBox* m_checkAutoplaceFields; + wxCheckBox* m_checkAutoplaceJustify; + wxCheckBox* m_checkAutoplaceAlign; wxPanel* m_panel2; wxListView* templateFieldListCtrl; wxStaticText* fieldNameLabel; diff --git a/eeschema/edit_component_in_schematic.cpp b/eeschema/edit_component_in_schematic.cpp index 3b9104a..19fa77f 100644 --- a/eeschema/edit_component_in_schematic.cpp +++ b/eeschema/edit_component_in_schematic.cpp @@ -137,6 +137,10 @@ void SCH_EDIT_FRAME::EditComponentFieldText( SCH_FIELD* aField ) { dlg.TransfertDataToField( /* aIncludeText = */ !( fieldNdx == VALUE && part->IsPower() ) ); OnModify(); + + if( m_autoplaceFields && component->GetFieldsAutoplaced() ) + component->AutoplaceFields(); + m_canvas->Refresh(); } diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp index 81a9838..1e1fbfd 100644 --- a/eeschema/eeschema_config.cpp +++ b/eeschema/eeschema_config.cpp @@ -335,6 +335,9 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) dlg.SetEnableAutoPan( m_canvas->GetEnableAutoPan() ); dlg.SetEnableHVBusOrientation( GetForceHVLines() ); dlg.SetShowPageLimits( m_showPageLimits ); + dlg.SetAutoplaceFields( m_autoplaceFields ); + dlg.SetAutoplaceJustify( m_autoplaceJustify ); + dlg.SetAutoplaceAlign( m_autoplaceAlign ); dlg.Layout(); dlg.Fit(); dlg.SetMinSize( dlg.GetSize() ); @@ -382,6 +385,9 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) m_canvas->SetEnableAutoPan( dlg.GetEnableAutoPan() ); SetForceHVLines( dlg.GetEnableHVBusOrientation() ); m_showPageLimits = dlg.GetShowPageLimits(); + m_autoplaceFields = dlg.GetAutoplaceFields(); + m_autoplaceJustify = dlg.GetAutoplaceJustify(); + m_autoplaceAlign = dlg.GetAutoplaceAlign(); // Delete all template fieldnames and then restore them using the template field data from // the options dialog @@ -502,6 +508,9 @@ void SCH_EDIT_FRAME::SaveProjectSettings( bool aAskForSave ) } +static const wxChar AutoplaceFieldsEntry[] = wxT( "AutoplaceFields" ); +static const wxChar AutoplaceJustifyEntry[] = AUTOPLACE_JUSTIFY_KEY; +static const wxChar AutoplaceAlignEntry[] = AUTOPLACE_ALIGN_KEY; static const wxChar DefaultBusWidthEntry[] = wxT( "DefaultBusWidth" ); static const wxChar DefaultDrawLineWidthEntry[] = wxT( "DefaultDrawLineWidth" ); static const wxChar ShowHiddenPinsEntry[] = wxT( "ShowHiddenPins" ); @@ -585,6 +594,9 @@ void SCH_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) SetDefaultLineThickness( aCfg->Read( DefaultDrawLineWidthEntry, DEFAULTDRAWLINETHICKNESS ) ); aCfg->Read( ShowHiddenPinsEntry, &m_showAllPins, false ); aCfg->Read( HorzVertLinesOnlyEntry, &m_forceHVLines, true ); + aCfg->Read( AutoplaceFieldsEntry, &m_autoplaceFields, true ); + aCfg->Read( AutoplaceJustifyEntry, &m_autoplaceJustify, true ); + aCfg->Read( AutoplaceAlignEntry, &m_autoplaceAlign, false ); // Load print preview window session settings. aCfg->Read( PreviewFramePositionXEntry, &tmp, -1 ); @@ -675,6 +687,9 @@ void SCH_EDIT_FRAME::SaveSettings( wxConfigBase* aCfg ) aCfg->Write( DefaultDrawLineWidthEntry, (long) GetDefaultLineThickness() ); aCfg->Write( ShowHiddenPinsEntry, m_showAllPins ); aCfg->Write( HorzVertLinesOnlyEntry, GetForceHVLines() ); + aCfg->Write( AutoplaceFieldsEntry, m_autoplaceFields ); + aCfg->Write( AutoplaceJustifyEntry, m_autoplaceJustify ); + aCfg->Write( AutoplaceAlignEntry, m_autoplaceAlign ); // Save print preview window session settings. aCfg->Write( PreviewFramePositionXEntry, m_previewPosition.x ); diff --git a/eeschema/eeschema_config.h b/eeschema/eeschema_config.h index e93160b..e82f5df 100644 --- a/eeschema/eeschema_config.h +++ b/eeschema/eeschema_config.h @@ -10,4 +10,8 @@ // a key to read write in user config the visibility of the rescue library dialog #define RESCUE_NEVER_SHOW_KEY wxT("RescueNeverShow") +// define autoplace key here to avoid having to take the long trip to get at the SCH_EDIT_FRAME +#define AUTOPLACE_JUSTIFY_KEY wxT("AutoplaceJustify") +#define AUTOPLACE_ALIGN_KEY wxT("AutoplaceAlign") + #endif // EESCHEMA_CONFIG_H diff --git a/eeschema/eeschema_id.h b/eeschema/eeschema_id.h index 98c3282..b193282 100644 --- a/eeschema/eeschema_id.h +++ b/eeschema/eeschema_id.h @@ -168,6 +168,8 @@ enum id_eeschema_frm ID_SCH_MOVE_ITEM, ID_SCH_DRAG_ITEM, + ID_AUTOPLACE_FIELDS, + // Schematic editor commmands. These are command IDs that are generated by multiple // events (menus, toolbar, context menu, etc.) that result in the same event handler. ID_CANCEL_CURRENT_COMMAND, diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp index 8c8db7e..097ff10 100644 --- a/eeschema/getpart.cpp +++ b/eeschema/getpart.cpp @@ -242,6 +242,9 @@ SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC, SetMsgPanel( items ); component->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); component->SetFlags( IS_NEW ); + + if( m_autoplaceFields ) component->AutoplaceFields(); + PrepareMoveItem( (SCH_ITEM*) component, aDC ); return component; @@ -268,29 +271,11 @@ void SCH_EDIT_FRAME::OrientComponent( COMPONENT_ORIENTATION_T aOrientation ) INSTALL_UNBUFFERED_DC( dc, m_canvas ); - // Erase the previous component in it's current orientation. - - m_canvas->CrossHairOff( &dc ); - - if( component->GetFlags() ) - component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); - else - { - component->SetFlags( IS_MOVED ); // do not redraw the component - m_canvas->RefreshDrawingRect( component->GetBoundingBox() ); - component->ClearFlags( IS_MOVED ); - } - component->SetOrientation( aOrientation ); - /* Redraw the component in the new position. */ - if( component->GetFlags() ) - component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); - else - component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); - m_canvas->CrossHairOn( &dc ); GetScreen()->TestDanglingEnds( m_canvas, &dc ); + m_canvas->Refresh(); OnModify(); } @@ -344,13 +329,12 @@ void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent ) component->ClearFlags(); component->SetFlags( flags ); // Restore m_Flag modified by SetUnit() - /* Redraw the component in the new position. */ - if( flags ) - component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); - else - component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); + if( m_autoplaceFields && component->GetFieldsAutoplaced() ) { + component->AutoplaceFields(); + } screen->TestDanglingEnds( m_canvas, &dc ); + m_canvas->Refresh(); OnModify(); } } diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index c10549c..52837ed 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -219,6 +219,10 @@ static EDA_HOTKEY HkSaveLib( _HKI( "Save Library" ), HK_SAVE_LIB, 'S' + GR_KB_CT static EDA_HOTKEY HkSaveSchematic( _HKI( "Save Schematic" ), HK_SAVE_SCH, 'S' + GR_KB_CTRL ); static EDA_HOTKEY HkLoadSchematic( _HKI( "Load Schematic" ), HK_LOAD_SCH, 'L' + GR_KB_CTRL ); +// Autoplace fields +static EDA_HOTKEY HkAutoplaceFields( _HKI( "Autoplace Fields" ), HK_AUTOPLACE_FIELDS, 'O', + ID_AUTOPLACE_FIELDS ); + // List of common hotkey descriptors static EDA_HOTKEY* common_Hotkey_List[] = { @@ -292,6 +296,7 @@ static EDA_HOTKEY* schematic_Hotkey_List[] = &HkAddGraphicPolyLine, &HkAddGraphicText, &HkLeaveSheet, + &HkAutoplaceFields, &HkDeleteNode, NULL }; @@ -580,6 +585,7 @@ bool SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, case HK_ORIENT_NORMAL_COMPONENT: // Orient 0, no mirror (Component) case HK_ROTATE: // Rotate schematic item. case HK_EDIT_COMPONENT_WITH_LIBEDIT: // Call Libedit and load the current component + case HK_AUTOPLACE_FIELDS: // Autoplace all fields around component { // force a new item search on hot keys at current position, // if there is no currently edited item, diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h index afcebca..22f3f38 100644 --- a/eeschema/hotkeys.h +++ b/eeschema/hotkeys.h @@ -78,6 +78,7 @@ enum hotkey_id_commnand { HK_LEFT_CLICK, HK_LEFT_DCLICK, HK_LEAVE_SHEET, + HK_AUTOPLACE_FIELDS, HK_DELETE_NODE }; diff --git a/eeschema/lib_pin.cpp b/eeschema/lib_pin.cpp index c4dd914..9d28a92 100644 --- a/eeschema/lib_pin.cpp +++ b/eeschema/lib_pin.cpp @@ -2002,7 +2002,7 @@ void LIB_PIN::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList ) } -const EDA_RECT LIB_PIN::GetBoundingBox() const +const EDA_RECT LIB_PIN::GetBoundingBox( bool aIncludeInvisibles ) const { LIB_PART* entry = (LIB_PART* ) m_Parent; EDA_RECT bbox; @@ -2013,6 +2013,8 @@ const EDA_RECT LIB_PIN::GetBoundingBox() const bool showNum = m_number != 0; int minsizeV = TARGET_PIN_RADIUS; + if( !aIncludeInvisibles && !IsVisible() ) + showName = false; if( entry ) { diff --git a/eeschema/lib_pin.h b/eeschema/lib_pin.h index 5fa0ad8..0362935 100644 --- a/eeschema/lib_pin.h +++ b/eeschema/lib_pin.h @@ -149,7 +149,14 @@ public: bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation ); - const EDA_RECT GetBoundingBox() const; // Virtual + const EDA_RECT GetBoundingBox() const { return GetBoundingBox( false ); } + + /** + * Function GetBoundingBox + * @param aIncludeInvisibles - if false, do not include labels for invisible pins + * in the calculation. + */ + const EDA_RECT GetBoundingBox( bool aIncludeInvisibles ) const; /** * Function PinEndPoint @@ -383,7 +390,7 @@ public: * * @return True if draw object is visible otherwise false. */ - bool IsVisible() { return ( m_attributes & PIN_INVISIBLE ) == 0; } + bool IsVisible() const { return ( m_attributes & PIN_INVISIBLE ) == 0; } int GetPenSize() const; diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 047dfa7..269e342 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -394,6 +394,9 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, PART_LIBS* AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE_CMP, msg, KiBitmap( delete_xpm ) ); } + msg = AddHotkeyName( _( "Autoplace Fields" ), g_Schematic_Hokeys_Descr, HK_AUTOPLACE_FIELDS ); + AddMenuItem( PopMenu, ID_AUTOPLACE_FIELDS, msg, KiBitmap( autoplace_fields_xpm ) ); + if( libEntry && !libEntry->GetDocFileName().IsEmpty() ) AddMenuItem( PopMenu, ID_POPUP_SCH_DISPLAYDOC_CMP, _( "Doc" ), KiBitmap( datasheet_xpm ) ); } diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp index 6a3f639..52eb1e9 100644 --- a/eeschema/sch_component.cpp +++ b/eeschema/sch_component.cpp @@ -217,6 +217,7 @@ SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) : } m_isDangling = aComponent.m_isDangling; + m_fieldsAutoplaced = aComponent.m_fieldsAutoplaced; } @@ -660,6 +661,16 @@ SCH_FIELD* SCH_COMPONENT::GetField( int aFieldNdx ) const } +void SCH_COMPONENT::GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly ) +{ + BOOST_FOREACH( SCH_FIELD& each_field, m_Fields ) + { + if( !aVisibleOnly || ( each_field.IsVisible() && !each_field.IsVoid() ) ) + aVector.push_back( &each_field ); + } +} + + SCH_FIELD* SCH_COMPONENT::AddField( const SCH_FIELD& aField ) { int newNdx = m_Fields.size(); @@ -691,6 +702,17 @@ LIB_PIN* SCH_COMPONENT::GetPin( const wxString& number ) } +void SCH_COMPONENT::GetPins( std::vector<LIB_PIN*>& aPinsList ) +{ + if( PART_SPTR part = m_part.lock() ) + { + part->GetPins( aPinsList, m_unit, m_convert ); + } + else + wxFAIL_MSG( "Could not obtain PART_SPTR lock" ); +} + + void SCH_COMPONENT::SwapData( SCH_ITEM* aItem ) { wxCHECK_RET( (aItem != NULL) && (aItem->Type() == SCH_COMPONENT_T), diff --git a/eeschema/sch_component.h b/eeschema/sch_component.h index c6049c8..483bd1d 100644 --- a/eeschema/sch_component.h +++ b/eeschema/sch_component.h @@ -82,6 +82,8 @@ class SCH_COMPONENT : public SCH_ITEM std::vector<bool> m_isDangling; ///< One isDangling per pin + bool m_fieldsAutoplaced; ///< true if fields have not been moved since last autoplace + /** * A temporary sheet path is required to generate the correct reference designator string * in complex heirarchies. Hopefully this is only a temporary hack to decouple schematic @@ -100,8 +102,6 @@ class SCH_COMPONENT : public SCH_ITEM void Init( const wxPoint& pos = wxPoint( 0, 0 ) ); - EDA_RECT GetBodyBoundingBox() const; - public: SCH_COMPONENT( const wxPoint& pos = wxPoint( 0, 0 ), SCH_ITEM* aParent = NULL ); @@ -255,6 +255,13 @@ public: const EDA_RECT GetBoundingBox() const; // Virtual + /** + * Function GetBodyBoundingBox + * Return a bounding box for the component body but not the fields. + */ + EDA_RECT GetBodyBoundingBox() const; + + //-----<Fields>----------------------------------------------------------- /** @@ -266,6 +273,14 @@ public: SCH_FIELD* GetField( int aFieldNdx ) const; /** + * Function GetFields + * populates a std::vector with SCH_FIELDs. + * @param aVector - vector to populate. + * @param aVisibleOnly - if true, only get fields that are visible and contain text. + */ + void GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly ); + + /** * Function AddField * adds a field to the component. The field is copied as it is put into * the component. @@ -284,9 +299,6 @@ public: { m_Fields = aFields; // vector copying, length is changed possibly } - - //-----</Fields>---------------------------------------------------------- - /** * Function GetFieldCount * returns the number of fields in this component. @@ -294,6 +306,27 @@ public: int GetFieldCount() const { return (int) m_Fields.size(); } /** + * Function GetFieldsAutoplaced + * returns whether the fields are autoplaced. + */ + bool GetFieldsAutoplaced() const { return m_fieldsAutoplaced; } + + /** + * Function ClearFieldsAutoplaced + * Set fields autoplaced flag false. + */ + void ClearFieldsAutoplaced() { m_fieldsAutoplaced = false; } + + /** + * Function AutoplaceFields + * Automatically orient all the fields in the component. + */ + void AutoplaceFields(); + + //-----</Fields>---------------------------------------------------------- + + + /** * Function GetPin * finds a component pin by number. * @@ -303,6 +336,12 @@ public: LIB_PIN* GetPin( const wxString& number ); /** + * Function GetPins + * populate a vector with all the pins. + */ + void GetPins( std::vector<LIB_PIN*>& aPinsList ); + + /** * Virtual function, from the base class SCH_ITEM::Draw */ void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index a2b2775..ed3f01b 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -303,6 +303,23 @@ const EDA_RECT SCH_FIELD::GetBoundingBox() const } +bool SCH_FIELD::IsHorizJustifyFlipped() const +{ + wxPoint render_center = GetBoundingBox().Centre(); + wxPoint pos = GetPosition(); + + switch( GetHorizJustify() ) + { + case GR_TEXT_HJUSTIFY_LEFT: + return render_center.x < pos.x; + case GR_TEXT_HJUSTIFY_RIGHT: + return render_center.x > pos.x; + default: + return false; + } +} + + bool SCH_FIELD::Save( FILE* aFile ) const { char hjustify = 'C'; diff --git a/eeschema/sch_field.h b/eeschema/sch_field.h index 8b458bc..814876a 100644 --- a/eeschema/sch_field.h +++ b/eeschema/sch_field.h @@ -103,6 +103,13 @@ public: const EDA_RECT GetBoundingBox() const; // Virtual /** + * Function IsHorizJustifyFlipped + * Returns whether the field will be rendered with the horizontal justification + * inverted due to rotation or mirroring of the parent. + */ + bool IsHorizJustifyFlipped() const; + + /** * Function IsVoid * returns true if the field is either empty or holds "~". */ @@ -131,7 +138,7 @@ public: */ bool IsVisible() const { - return (m_Attributs & TEXT_NO_VISIBLE) == 0 ? true : false; + return !( m_Attributs & TEXT_NO_VISIBLE ); } void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 8fa7da3..f1b7652 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -756,6 +756,13 @@ void SCH_EDIT_FRAME::PrepareMoveItem( SCH_ITEM* aItem, wxDC* aDC ) SetUndoItem( aItem ); } + if( aItem->Type() == SCH_FIELD_T && aItem->GetParent()->Type() == SCH_COMPONENT_T ) + { + // Now that we're moving a field, they're no longer autoplaced. + SCH_COMPONENT *parent = dynamic_cast<SCH_COMPONENT*>( aItem->GetParent() ); + parent->ClearFieldsAutoplaced(); + } + aItem->SetFlags( IS_MOVED ); // For some items, moving the cursor to anchor is not good @@ -817,14 +824,22 @@ void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent ) switch( item->Type() ) { case SCH_COMPONENT_T: - if( aEvent.GetId() == ID_SCH_ROTATE_CLOCKWISE ) - OrientComponent( CMP_ROTATE_CLOCKWISE ); - else if( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE ) - OrientComponent( CMP_ROTATE_COUNTERCLOCKWISE ); - else - wxFAIL_MSG( wxT( "Unknown rotate item command ID." ) ); + { + SCH_COMPONENT* component = dynamic_cast<SCH_COMPONENT*>( item ); + if( aEvent.GetId() == ID_SCH_ROTATE_CLOCKWISE ) + OrientComponent( CMP_ROTATE_CLOCKWISE ); + else if( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE ) + OrientComponent( CMP_ROTATE_COUNTERCLOCKWISE ); + else + wxFAIL_MSG( wxT( "Unknown rotate item command ID." ) ); + + if( m_autoplaceFields && component->GetFieldsAutoplaced() ) { + component->AutoplaceFields(); + } + m_canvas->Refresh(); - break; + break; + } case SCH_TEXT_T: case SCH_LABEL_T: @@ -837,6 +852,12 @@ void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent ) case SCH_FIELD_T: m_canvas->MoveCursorToCrossHair(); RotateField( (SCH_FIELD*) item, &dc ); + if( item->GetParent()->Type() == SCH_COMPONENT_T ) + { + // Now that we're moving a field, they're no longer autoplaced. + SCH_COMPONENT *parent = dynamic_cast<SCH_COMPONENT*>( item->GetParent() ); + parent->ClearFieldsAutoplaced(); + } break; case SCH_BITMAP_T: @@ -1118,16 +1139,24 @@ void SCH_EDIT_FRAME::OnOrient( wxCommandEvent& aEvent ) switch( item->Type() ) { case SCH_COMPONENT_T: - if( aEvent.GetId() == ID_SCH_MIRROR_X ) - OrientComponent( CMP_MIRROR_X ); - else if( aEvent.GetId() == ID_SCH_MIRROR_Y ) - OrientComponent( CMP_MIRROR_Y ); - else if( aEvent.GetId() == ID_SCH_ORIENT_NORMAL ) - OrientComponent( CMP_NORMAL ); - else - wxFAIL_MSG( wxT( "Invalid orient schematic component command ID." ) ); + { + SCH_COMPONENT *component = dynamic_cast<SCH_COMPONENT*>( item ); + if( aEvent.GetId() == ID_SCH_MIRROR_X ) + OrientComponent( CMP_MIRROR_X ); + else if( aEvent.GetId() == ID_SCH_MIRROR_Y ) + OrientComponent( CMP_MIRROR_Y ); + else if( aEvent.GetId() == ID_SCH_ORIENT_NORMAL ) + OrientComponent( CMP_NORMAL ); + else + wxFAIL_MSG( wxT( "Invalid orient schematic component command ID." ) ); + + if( m_autoplaceFields && component->GetFieldsAutoplaced() ) { + component->AutoplaceFields(); + } + m_canvas->Refresh(); - break; + break; + } case SCH_BITMAP_T: if( aEvent.GetId() == ID_SCH_MIRROR_X ) diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 8ac79c2..f7bf3dc 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -266,6 +266,7 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_TOOL( wxID_REPLACE, SCH_EDIT_FRAME::OnFindItems ) EVT_TOOL( ID_BACKANNO_ITEMS, SCH_EDIT_FRAME::OnLoadCmpToFootprintLinkFile ) EVT_TOOL( ID_SCH_MOVE_ITEM, SCH_EDIT_FRAME::OnMoveItem ) + EVT_TOOL( ID_AUTOPLACE_FIELDS, SCH_EDIT_FRAME::OnAutoplaceFields ) EVT_MENU( wxID_HELP, EDA_DRAW_FRAME::GetKicadHelp ) EVT_MENU( wxID_INDEX, EDA_DRAW_FRAME::GetKicadHelp ) EVT_MENU( wxID_ABOUT, EDA_BASE_FRAME::GetKicadAbout ) diff --git a/eeschema/schframe.h b/eeschema/schframe.h index 38fb7e5..653a8c9 100644 --- a/eeschema/schframe.h +++ b/eeschema/schframe.h @@ -146,6 +146,10 @@ private: bool m_forceHVLines; ///< force H or V directions for wires, bus, line + bool m_autoplaceFields; ///< automatically place component fields + bool m_autoplaceJustify; ///< allow autoplace to change justification + bool m_autoplaceAlign; ///< align autoplaced fields to the grid + /// An index to the last find item in the found items list #m_foundItems. int m_foundItemIndex; @@ -765,6 +769,12 @@ public: private: /** + * Function OnAutoplaceFields + * handles the #ID_AUTOPLACE_FIELDS event. + */ + void OnAutoplaceFields( wxCommandEvent& aEvent ); + + /** * Function OnMoveItem * handles the #ID_SCH_MOVE_ITEM event used to move schematic itams. */ diff --git a/include/bitmaps.h b/include/bitmaps.h index 25b3751..c077afb 100644 --- a/include/bitmaps.h +++ b/include/bitmaps.h @@ -111,6 +111,7 @@ EXTERN_BITMAP( array_zone_xpm ) EXTERN_BITMAP( auto_associe_xpm ) EXTERN_BITMAP( auto_delete_track_xpm ) EXTERN_BITMAP( auto_track_width_xpm ) +EXTERN_BITMAP( autoplace_fields_xpm ) EXTERN_BITMAP( axis3d_back_xpm ) EXTERN_BITMAP( axis3d_bottom_xpm ) EXTERN_BITMAP( axis3d_front_xpm ) diff --git a/include/class_eda_rect.h b/include/class_eda_rect.h index d12b424..ae1424f 100644 --- a/include/class_eda_rect.h +++ b/include/class_eda_rect.h @@ -103,8 +103,12 @@ public: int GetHeight() const { return m_Size.y; } int GetRight() const { return m_Pos.x + m_Size.x; } int GetLeft() const { return m_Pos.x; } + int GetTop() const { return m_Pos.y; } int GetBottom() const { return m_Pos.y + m_Size.y; } // Y axis from top to bottom + wxPoint GetCenter() const { return wxPoint( m_Pos.x + m_Size.x / 2, + m_Pos.y + m_Size.y / 2 ); } + void SetOrigin( const wxPoint& pos ) { m_Pos = pos; } void SetOrigin( int x, int y ) { m_Pos.x = x; m_Pos.y = y; } void SetSize( const wxSize& size ) { m_Size = size; }
_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp