Replying again because I've updated this patch. It now supports pin types, as well as fixing a crash that I noticed after I sent the last one.
Cheers, Alex On Tue, Feb 07, 2017 at 12:31:39PM -0800, Alex Bell wrote: > Importing a CSV file into component editor > > 1. Start kicad, launch component editor, create a new component > 2. Click CSV button in top toolbar (far right) > 3. When prompted for file, navigate to a csv file containing pins for import > 4. Pins will be created in a vertical column with 100 mm spacing. Grab blocks > of > pins and move as necessary > > 1,Pin_1 > 2,Pin_2 > 3,VCC > > etc. > > Extra columns should be ignored for now. I've just noticed that a line with > too > few columns is crashing so please don't try that with anything important > unsaved > > Double quotes will be removed automatically. > > I've attached an example file that I was using for testing. > > Let me know how it works for you. I'll try to get a new patch that's a bit > less > brittle up soon. > > Cheers, > Alex > > On Tue, Feb 07, 2017 at 02:11:31PM -0600, Bob Gustafson wrote: > > This sounds like something I could use now. > > > > Do you have any documentation on 'how to use' ? I would also have to > > reinstate my toolchain to be able to use it - not insignificant amount of > > labor. By reading your doc, I could determine the cost/benefit at the > > moment. > > > > Thanks much - Bob G > > > > > > On 02/06/2017 02:12 PM, Alex Bell wrote: > > >I've not submitted a patch before nor really used a mailing list, so > > >please let > > >me know if I did something wrong. > > > > > >This adds a button on the component editor toolbar that prompts for a csv > > >file, > > >and then reads pin numbers and names and generates pins. > > > > > >I decided to start with something small but a few potential avenues for > > >improvement I can see are: > > >- adding a parser for electrical type based on regex > > >- integrating this into it's own dialog with selectors for parsing options, > > > default pin direction > > >- moving the button from the toolbar to the pin table, or even more > > >integration > > > of some sort with pin table > > > > > >I tested it on linux and there is a build that will hopefully finish soon > > >here: > > >http://ci.kicad-pcb.org/job/windows-kicad-msys2-patch/560/ > > > > > >Cheers, > > >Alex > > > > > > > > >_______________________________________________ > > >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 > > > 1,"Res" > 2,"Res" > 3,"Res,is,best" > 3,"Res" > 5,"GND" > 6,"GND" > 7,"C1_XM" > 8,"SETC_XM" > 9,"SETP_XM" > 10,"DEN_G" > 11,"INT_G" > 12,"DRDY_G" > 13,"INT1_XM" > 14,"INT2_XM" > 15,"Vdd" > 16,"Vdd" > 17,"Vdd" > 18,"Vdd_IO" > 19,"CS_G" > 20,"CS_XM" > 21,"SCL" > 22,"SDO_G" > 23,"SDO_XM" > 24,"SDA"
diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt index 8dae66f..20cb814 100644 --- a/bitmaps_png/CMakeLists.txt +++ b/bitmaps_png/CMakeLists.txt @@ -288,6 +288,7 @@ set( BMAPS_MID image import_brd_file import_cmp_from_lib + import_csv import_footprint_names import_hierarchical_label import_module diff --git a/bitmaps_png/cpp_26/import_csv.cpp b/bitmaps_png/cpp_26/import_csv.cpp new file mode 100644 index 0000000..e284a72 --- /dev/null +++ b/bitmaps_png/cpp_26/import_csv.cpp @@ -0,0 +1,59 @@ + +/* 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, 0x98, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xed, 0x95, 0x5d, 0x68, 0xcd, + 0x71, 0x18, 0xc7, 0x3f, 0xc7, 0x59, 0x6c, 0xe7, 0xc4, 0x85, 0xad, 0xe5, 0x65, 0x36, 0x8d, 0x09, + 0xb3, 0xb1, 0x71, 0x52, 0x26, 0x6f, 0x69, 0x68, 0xdc, 0xcc, 0x90, 0x2c, 0xad, 0x48, 0x98, 0x3a, + 0xb9, 0x90, 0x2b, 0xda, 0x16, 0xbb, 0x71, 0x81, 0x98, 0x76, 0x76, 0x81, 0x43, 0x29, 0xc5, 0x1c, + 0x76, 0x23, 0x5c, 0xc8, 0xc5, 0x2e, 0xd8, 0x4a, 0x29, 0x84, 0x52, 0xe2, 0x86, 0x68, 0x39, 0x35, + 0xe7, 0xb0, 0x76, 0x7c, 0x9f, 0xed, 0xfc, 0x75, 0x9c, 0x9d, 0x69, 0xf1, 0xbf, 0x5a, 0x9e, 0x7a, + 0xea, 0xf7, 0x7f, 0x9e, 0xf3, 0xbc, 0x7c, 0xbf, 0xcf, 0xf3, 0xfb, 0x1d, 0x18, 0xd7, 0xd2, 0x04, + 0x95, 0xd2, 0xdb, 0xd2, 0x0f, 0x49, 0x8d, 0xb4, 0xc0, 0x6a, 0x57, 0x8b, 0x34, 0x43, 0x63, 0x93, + 0xc7, 0xf3, 0x43, 0xc9, 0x13, 0x2d, 0x59, 0x59, 0x43, 0x6a, 0x67, 0xe9, 0xa0, 0x7c, 0x41, 0xf7, + 0x90, 0xa8, 0x48, 0xab, 0xdf, 0x3f, 0xd8, 0xdb, 0xd1, 0x91, 0x18, 0x88, 0xc7, 0x87, 0xf4, 0x69, + 0x38, 0x9c, 0x30, 0x9b, 0xf9, 0x84, 0xac, 0xc2, 0x8d, 0x42, 0x46, 0x57, 0xc2, 0x8a, 0xa4, 0x4b, + 0x4f, 0x28, 0xe4, 0x20, 0xbb, 0xe5, 0x46, 0xa1, 0xf7, 0x46, 0x95, 0xa1, 0x48, 0x97, 0x81, 0x58, + 0xcc, 0xa1, 0xb1, 0x5f, 0xfa, 0xe5, 0x2f, 0xb4, 0x73, 0xcc, 0x85, 0x9a, 0xbd, 0x5e, 0xd7, 0x0a, + 0x45, 0x8c, 0x1e, 0x9b, 0xc9, 0x08, 0xea, 0xda, 0xdb, 0x1d, 0xea, 0x3a, 0xff, 0x99, 0x3a, 0x5b, + 0x61, 0xdb, 0x2e, 0x1b, 0xbc, 0xcd, 0xc4, 0x50, 0x98, 0x5a, 0x91, 0x93, 0x3e, 0xdf, 0x60, 0x72, + 0x1b, 0x97, 0xb8, 0xb5, 0xde, 0x41, 0x67, 0xbd, 0x8d, 0xaa, 0x24, 0x5d, 0x09, 0xb3, 0xc9, 0x77, + 0xc0, 0xd5, 0xbb, 0x64, 0x2b, 0x6c, 0xdb, 0x65, 0x33, 0x4b, 0x6a, 0xa7, 0x6b, 0x48, 0xfe, 0x8b, + 0x2b, 0x52, 0x08, 0x75, 0x01, 0xe8, 0x5a, 0x0b, 0xbd, 0x7a, 0x49, 0x9f, 0x94, 0xc3, 0x0d, 0x99, + 0xa7, 0x9b, 0xaf, 0x18, 0x0e, 0xaf, 0x80, 0x47, 0xeb, 0xe0, 0x99, 0xf9, 0x34, 0xb8, 0x88, 0xcc, + 0xf9, 0x05, 0x70, 0xb6, 0x14, 0xee, 0xe9, 0x3c, 0x39, 0x35, 0xd7, 0x3c, 0xb8, 0xac, 0x7c, 0x5d, + 0x3a, 0x4e, 0xf8, 0xad, 0xc8, 0x6c, 0x68, 0xa8, 0xd7, 0x05, 0xab, 0x86, 0x17, 0x4a, 0x12, 0x96, + 0x5e, 0x5d, 0x0c, 0xaf, 0x72, 0xa0, 0x4a, 0xc9, 0x6a, 0x77, 0x43, 0x54, 0x4d, 0x3c, 0x54, 0xd2, + 0x90, 0xec, 0x57, 0x16, 0xc0, 0x4b, 0x85, 0x95, 0x29, 0x59, 0xf0, 0xa0, 0xae, 0x46, 0x11, 0x1c, + 0x71, 0x72, 0x4d, 0x81, 0x92, 0x1d, 0xf0, 0xb9, 0x0c, 0xae, 0x8d, 0x40, 0x53, 0x05, 0xdd, 0x35, + 0xf0, 0x56, 0x89, 0x0b, 0x52, 0xcc, 0x13, 0xa5, 0xbe, 0x12, 0x38, 0xad, 0x26, 0xa2, 0xfa, 0x28, + 0x4d, 0xf1, 0x79, 0x1d, 0xbf, 0x9a, 0x7b, 0xbd, 0x1c, 0xee, 0xa7, 0xa0, 0x39, 0xbf, 0x07, 0xbe, + 0x4d, 0x85, 0xea, 0xf4, 0x3a, 0xd9, 0x9b, 0xe1, 0x5d, 0x60, 0x94, 0xdb, 0x3f, 0x03, 0xb6, 0x08, + 0xd1, 0xd7, 0x4d, 0x6a, 0xa4, 0x12, 0x6e, 0x0a, 0xc5, 0xd1, 0xe1, 0xc6, 0x87, 0xc5, 0x3a, 0x37, + 0x04, 0x32, 0xcc, 0xd5, 0xa7, 0x67, 0xa5, 0xa8, 0x57, 0xe3, 0x8f, 0xed, 0x9c, 0x9e, 0x2b, 0x6f, + 0x2b, 0x7c, 0xac, 0xc8, 0x04, 0x35, 0x29, 0xb3, 0x60, 0xe7, 0x32, 0xb8, 0xb3, 0x11, 0xde, 0x1c, + 0x12, 0x55, 0xab, 0x44, 0x71, 0x2e, 0xcc, 0x37, 0x9f, 0x75, 0x6e, 0x08, 0x54, 0xe5, 0x5c, 0x1e, + 0xd4, 0xec, 0x85, 0xf8, 0x1c, 0x38, 0x93, 0x31, 0x91, 0x86, 0xfc, 0x5c, 0xc3, 0xee, 0xce, 0xd4, + 0x45, 0x9a, 0xe4, 0x4c, 0x83, 0x63, 0x8d, 0x10, 0xd3, 0x9c, 0x2e, 0x24, 0x6d, 0x1e, 0x43, 0x20, + 0x24, 0x3d, 0x42, 0x77, 0x7d, 0x9b, 0x9a, 0xce, 0x86, 0xa2, 0x8c, 0xd1, 0x6a, 0xed, 0xa2, 0x86, + 0xfa, 0x5d, 0xf3, 0xb8, 0x34, 0xfc, 0xc9, 0x42, 0xfd, 0xb2, 0x4d, 0x43, 0x58, 0x34, 0x13, 0x4e, + 0xa8, 0xc3, 0x53, 0xb2, 0x95, 0xdb, 0x16, 0x8a, 0xca, 0xe3, 0xfb, 0xf5, 0x5b, 0x6d, 0x62, 0xab, + 0x13, 0x6f, 0x08, 0x84, 0x24, 0xb6, 0x5e, 0x2f, 0x8a, 0x46, 0x70, 0xf7, 0x4f, 0x9d, 0xfa, 0x34, + 0xe9, 0x2e, 0x75, 0x13, 0x15, 0x8d, 0xfd, 0xb5, 0x0a, 0x5a, 0x03, 0x9f, 0x7c, 0x7a, 0x96, 0x94, + 0xb0, 0x4d, 0xb6, 0xbe, 0xed, 0x4a, 0xae, 0x85, 0xe9, 0xab, 0x13, 0x4d, 0xaa, 0xf8, 0x40, 0x31, + 0xfe, 0x5f, 0x43, 0x16, 0x82, 0x0d, 0xda, 0xda, 0x5d, 0xa2, 0xb5, 0x70, 0x8c, 0x7f, 0xfd, 0xc5, + 0x42, 0xd0, 0x90, 0x0f, 0x8a, 0x21, 0x37, 0xc5, 0x5e, 0x24, 0x5b, 0xbd, 0x56, 0x72, 0x9f, 0x8a, + 0x07, 0x46, 0x89, 0x15, 0x73, 0x2c, 0x95, 0x4e, 0x1a, 0xff, 0xaf, 0xce, 0x4f, 0x3b, 0xca, 0x4c, + 0xb7, 0x22, 0xe7, 0x41, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82, +}; + +const BITMAP_OPAQUE import_csv_xpm[1] = {{ png, sizeof( png ), "import_csv_xpm" }}; + +//EOF diff --git a/bitmaps_png/sources/import_csv.svg b/bitmaps_png/sources/import_csv.svg new file mode 100644 index 0000000..940ffa9 --- /dev/null +++ b/bitmaps_png/sources/import_csv.svg @@ -0,0 +1,152 @@ +<?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" + viewBox="0 0 26 26" + id="svg2" + version="1.1" + width="26" + height="26" + inkscape:version="0.91 r13725" + sodipodi:docname="import_csv.svg" + inkscape:export-filename="/home/alex/code/kicad/bitmaps_png/sources/import_csv3.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1855" + inkscape:window-height="1056" + id="namedview29" + showgrid="true" + inkscape:zoom="22.627417" + inkscape:cx="4.3947345" + inkscape:cy="11.871002" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="svg2"> + <inkscape:grid + type="xygrid" + id="grid3357" /> + </sodipodi:namedview> + <metadata + id="metadata87"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs4" /> + <circle + r="4" + cy="7" + cx="-6" + transform="scale(-1,1)" + id="path3003" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#800000;stroke-width:1.88976383;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + id="path3771" + d="M 11,7 24,7" + style="fill:none;stroke:#800000;stroke-width:1.88976383;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <g + id="g17" + transform="matrix(2.4566,0,0,2.2316,-37.589,-61.022)" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <rect + style="fill-opacity:0" + id="rect19" + x="0" + y="0" + width="16" + height="16" /> + </g> + <g + id="g47" + transform="matrix(2.6586,0,0,2.1996,5.9761,-10.078)" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <rect + style="fill-opacity:0" + id="rect49" + x="0" + y="0" + width="16" + height="16" /> + </g> + <g + transform="matrix(2.4482476,0,0,2.4295429,2.830298,-7.57155)" + id="g69" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <rect + height="16" + width="16" + y="0" + x="0" + id="rect71" + style="fill-opacity:0" /> + </g> + <g + transform="matrix(2.4482476,0,0,2.4295429,5.162342,-14.86007)" + id="g73" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <rect + height="16" + width="16" + y="0" + x="0" + id="rect75" + style="fill-opacity:0" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="16.6875" + y="23.4375" + id="text3451" + sodipodi:linespacing="125%" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"><tspan + sodipodi:role="line" + id="tspan3453" + x="16.6875" + y="23.4375" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + x="1.3125" + y="22.96875" + id="text3455" + sodipodi:linespacing="125%" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"><tspan + sodipodi:role="line" + id="tspan3457" + x="1.3125" + y="22.96875" + style="font-size:13.75px;fill:#800000;fill-opacity:1;stroke:#000000;stroke-width:0.40000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">csv</tspan></text> +</svg> diff --git a/eeschema/eeschema_id.h b/eeschema/eeschema_id.h index 85f50d5..cb8c649 100644 --- a/eeschema/eeschema_id.h +++ b/eeschema/eeschema_id.h @@ -194,6 +194,7 @@ enum id_eeschema_frm ID_DE_MORGAN_CONVERT_BUTT, ID_LIBEDIT_EDIT_PIN_BY_PIN, ID_LIBEDIT_EDIT_PIN_BY_TABLE, + ID_LIBEDIT_IMPORT_CSV, ID_LIBEDIT_VIEW_DOC, ID_LIBEDIT_CHECK_PART, diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp index 7f0fcc8..e1b8213 100644 --- a/eeschema/libeditframe.cpp +++ b/eeschema/libeditframe.cpp @@ -107,6 +107,7 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_TOOL( ID_LIBEDIT_VIEW_DOC, LIB_EDIT_FRAME::OnViewEntryDoc ) EVT_TOOL( ID_LIBEDIT_EDIT_PIN_BY_PIN, LIB_EDIT_FRAME::Process_Special_Functions ) EVT_TOOL( ID_LIBEDIT_EDIT_PIN_BY_TABLE, LIB_EDIT_FRAME::OnOpenPinTable ) + EVT_TOOL( ID_LIBEDIT_IMPORT_CSV, LIB_EDIT_FRAME::OnOpenImportCSV ) EVT_TOOL( ExportPartId, LIB_EDIT_FRAME::OnExportPart ) EVT_TOOL( CreateNewLibAndSavePartId, LIB_EDIT_FRAME::OnExportPart ) EVT_TOOL( ImportPartId, LIB_EDIT_FRAME::OnImportPart ) @@ -1420,3 +1421,202 @@ bool LIB_EDIT_FRAME::SynchronizePins() return !m_editPinsPerPartOrConvert && ( part && ( part->HasConversion() || part->IsMulti() ) ); } +static bool isNonAscii( wchar_t x ) +{ + return !( ( x >= 'A' && x <= 'Z' ) + || ( x >= 'a' && x <= 'z' ) ); +} +ELECTRICAL_PINTYPE CSVImportParsePinType(const wxString& aType) +{ + // Clean up inputs so matching is easy + wxString cleaned = aType; + cleaned.MakeLower(); // Lower case + cleaned.erase(std::remove_if(cleaned.begin(), cleaned.end(), isNonAscii), + cleaned.end()); + const bool match_bidirec = ( cleaned.find( "bidirec" ) != wxNOT_FOUND ); + const bool match_collec = ( cleaned.find( "collec" ) != wxNOT_FOUND ); + const bool match_emit = ( cleaned.find( "emit" ) != wxNOT_FOUND ); + const bool match_hi = ( cleaned.find( "hi" ) != wxNOT_FOUND ); + const bool match_impedance = ( cleaned.find( "impedance" ) != wxNOT_FOUND ); + const bool match_in = ( cleaned.find( "in" ) != wxNOT_FOUND ); + const bool match_noconn = ( cleaned.find( "noconn" ) != wxNOT_FOUND ); + const bool match_open = ( cleaned.find( "open" ) != wxNOT_FOUND ); + const bool match_out = ( cleaned.find( "out" ) != wxNOT_FOUND ); + const bool match_passiv = ( cleaned.find( "passiv" ) != wxNOT_FOUND ); + const bool match_power = ( cleaned.find( "power" ) != wxNOT_FOUND ); + const bool match_tristate = ( cleaned.find( "tristate" ) != wxNOT_FOUND ); + const bool match_unconn = ( cleaned.find( "unconn" ) != wxNOT_FOUND ); + const bool match_unspec = ( cleaned.find( "unspec" ) != wxNOT_FOUND ); + const bool match_z = ( cleaned.find( "z" ) != wxNOT_FOUND ); + + // in case they wrote input/output + if ( ( match_bidirec ) || ( match_in && match_out ) ) + return PIN_BIDI; + + if ( match_passiv ) + return PIN_PASSIVE; + + if ( match_unspec ) + return PIN_UNSPECIFIED; + + // Match on High Z, Hi impedance, tristate, etc + if ( ( ( match_impedance ) || ( match_z ) ) + && ( match_hi ) || ( match_tristate ) ) + return PIN_TRISTATE; + + if ( match_in ) { + if ( match_power ) + return PIN_POWER_IN; + else + return PIN_INPUT; + } + + if ( ( match_unconn ) || ( match_noconn ) ) + return PIN_NC; + + if ( match_out ) { + if ( match_power ) + return PIN_POWER_OUT; + else + return PIN_OUTPUT; + } + + if ( match_open ) { + if ( match_emit ) + return PIN_OPENEMITTER; + else if ( match_collec ) + return PIN_OPENCOLLECTOR; + else + return PIN_NC; // in case they wrote "open circuit" + } + + return PIN_UNSPECIFIED; +} + +void LIB_EDIT_FRAME::OnOpenImportCSV( wxCommandEvent& aEvent ) +{ + const wxString CSVFileWildcard( _("Comma separated value file (*.csv)|*csv") ); + static wxString default_path = wxEmptyString; + + // Create dialog to get name of CSV file + wxFileDialog openFileDialog( this, _("Select CSV File to Import Pins"), + wxEmptyString, default_path, + CSVFileWildcard, wxFD_OPEN ); + + if( openFileDialog.ShowModal() == wxID_CANCEL ) + return; + + // Keep the path that was chosen in case the user imports more than one csv + default_path = openFileDialog.GetPath(); + + LIB_PART* part = GetCurPart(); + + if( !part ) + return; + + // If file doesn't exist, bail out + if( !wxFileExists( openFileDialog.GetPath() ) ) + { + wxString msg = wxString::Format( _( + "File %s not found" ), + GetChars( openFileDialog.GetPath() ) + ); + DisplayError( this, msg ); + return; + } + + // Read raw CSV data + wxFile csv_file(openFileDialog.GetPath() ); + // There was an error opening the file + if ( !csv_file.IsOpened() ) { + wxString msg = wxString::Format( _( + "There was an error opening the file %s" ), + GetChars( openFileDialog.GetPath() ) + ); + DisplayError( this, msg ); + return; + } + wxString file_contents; + if ( !csv_file.ReadAll( &file_contents ) ) return; + + // pins vector holds the parsed contents of the entire file + std::vector<std::vector<wxString>> pins; + + // First split the file by newline + wxStringTokenizer tokenizer1( file_contents, "\r\n" ); + while ( tokenizer1.HasMoreTokens() ) + { + wxString line = tokenizer1.GetNextToken(); + // pin vector holds the parsed contents of one line of the file + std::vector<wxString> pin; + + // Split this line by comma + wxStringTokenizer tokenizer2( line,"," ); + while ( tokenizer2.HasMoreTokens() ) + { + wxString property = tokenizer2.GetNextToken(); + + // Strip quotation marks now that they've served their purpose + property.Replace( _( "\"" ), wxEmptyString ); + // Add it to our vector + pin.push_back( property ); + } + pins.push_back( pin ); + } + // Parsing complete. + + // I don't know what this does + part->ClearStatus(); + + // Pin location is arbitray. Calculate spacing to put them + // in a big vertical column. Easy to move them around, rotate, etc. afterwards + unsigned int num_pins = pins.size(); + int pin_spacing = 100; + int pins_offset = ( num_pins / 2 ) * pin_spacing + ( pin_spacing / 2 ); + + // This iterates through each pin that was read + // and adds it to the part + for (std::vector<wxString>::size_type i = 0; i != num_pins; i++) + { + std::vector<wxString> csv_pin = pins[i]; + LIB_PIN* pin = new LIB_PIN( part ); + + wxString pin_num = csv_pin[0]; + wxString pin_name; + ELECTRICAL_PINTYPE pin_type; + if ( csv_pin.size() > 1 ) + pin_name = csv_pin[1]; + else + pin_name = _( "" ); + + if ( csv_pin.size() > 2 ) + pin_type = CSVImportParsePinType( csv_pin[2] ); + else + pin_type = PIN_INPUT; + + // Not sure what this does but the whole thing breaks without it + m_drawItem = pin; + + // Set all defaults. Eventually it would be nice to have these in a GUI + pin->SetFlags( IS_NEW ); + pin->SetUnit( m_unit ); + pin->SetConvert( m_convert ); + pin->SetLength( GetDefaultPinLength() ); + pin->SetOrientation( PIN_LEFT ); + pin->SetType( pin_type ); + pin->SetShape( PINSHAPE_LINE ); + pin->SetNameTextSize( GetPinNameDefaultSize() ); + pin->SetNumberTextSize( GetPinNumDefaultSize() ); + pin->SetConvert( false ); + pin->SetUnit( false ); + pin->SetVisible( true ); + + pin->SetName( pin_name ); + pin->SetNumber( pin_num ); + + int pin_y = i*pin_spacing - pins_offset; + PlacePinLocation( wxPoint( 300, pin_y ) ); + } + + return; +} \ No newline at end of file diff --git a/eeschema/libeditframe.h b/eeschema/libeditframe.h index 878cfd3..74ff4f5 100644 --- a/eeschema/libeditframe.h +++ b/eeschema/libeditframe.h @@ -37,6 +37,8 @@ #include <lib_draw_item.h> #include <lib_collectors.h> +#include <wx/tokenzr.h> // String tokenizer for CSV support + class SCH_EDIT_FRAME; class PART_LIB; @@ -281,6 +283,7 @@ public: void OnOpenPinTable( wxCommandEvent& aEvent ); + void OnOpenImportCSV( wxCommandEvent& aEvent ); void OnUpdateSelectTool( wxUpdateUIEvent& aEvent ); void OnUpdateEditingPart( wxUpdateUIEvent& event ); void OnUpdateNotEditingPart( wxUpdateUIEvent& event ); @@ -642,12 +645,18 @@ public: /** * Function PlacePin - * Place at cursor location the pin currently moved (i.e. pin pointed by m_drawItem) - * (and the linked pins, if any) + * Shim function that calls PlacePinLocation with GetCrossHairPosition as param */ void PlacePin(); /** + * Function PlacePin + * Place at specified location the pin currently moved (i.e. pin pointed by m_drawItem) + * (and the linked pins, if any) + */ + void PlacePinLocation(wxPoint); + + /** * Function GlobalSetPins * @param aMasterPin is the "template" pin * @param aId is a param to select what should be mofified: diff --git a/eeschema/pinedit.cpp b/eeschema/pinedit.cpp index ef97672..f826dd4 100644 --- a/eeschema/pinedit.cpp +++ b/eeschema/pinedit.cpp @@ -235,16 +235,21 @@ static void AbortPinMove( EDA_DRAW_PANEL* Panel, wxDC* DC ) } +void LIB_EDIT_FRAME::PlacePin() +{ + PlacePinLocation(GetCrossHairPosition( true )); +} /** * Managed cursor callback for placing component pins. */ -void LIB_EDIT_FRAME::PlacePin() +void LIB_EDIT_FRAME::PlacePinLocation(wxPoint newpos) { LIB_PIN* cur_pin = (LIB_PIN*) m_drawItem; bool ask_for_pin = true; - wxPoint newpos; bool status; + + // Some tests if( !cur_pin || cur_pin->Type() != LIB_PIN_T ) { @@ -252,8 +257,6 @@ void LIB_EDIT_FRAME::PlacePin() return; } - newpos = GetCrossHairPosition( true ); - LIB_PART* part = GetCurPart(); // Test for an other pin in same new position: diff --git a/eeschema/tool_lib.cpp b/eeschema/tool_lib.cpp index 7f5a25c..5914e14 100644 --- a/eeschema/tool_lib.cpp +++ b/eeschema/tool_lib.cpp @@ -214,6 +214,8 @@ void LIB_EDIT_FRAME::ReCreateHToolbar() msg, wxITEM_CHECK ); m_mainToolBar->AddTool( ID_LIBEDIT_EDIT_PIN_BY_TABLE, wxEmptyString, KiBitmap( pin_table_xpm ), _( "Show pin table" ) ); + m_mainToolBar->AddTool( ID_LIBEDIT_IMPORT_CSV, wxEmptyString, KiBitmap( import_csv_xpm ), + _( "Import pins from CSV file" ) ); // after adding the buttons to the toolbar, must call Realize() to reflect the changes m_mainToolBar->Realize(); diff --git a/include/bitmaps.h b/include/bitmaps.h index f33dd3c..dd76fb6 100644 --- a/include/bitmaps.h +++ b/include/bitmaps.h @@ -271,6 +271,7 @@ EXTERN_BITMAP( icon_pagelayout_editor_xpm ) EXTERN_BITMAP( image_xpm ) EXTERN_BITMAP( import_brd_file_xpm ) EXTERN_BITMAP( import_cmp_from_lib_xpm ) +EXTERN_BITMAP( import_csv_xpm ) EXTERN_BITMAP( import_footprint_names_xpm ) EXTERN_BITMAP( import_hierarchical_label_xpm ) EXTERN_BITMAP( import_module_xpm )
_______________________________________________ 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