← Back to team overview

kicad-developers team mailing list archive

Re: Trouble with BOM plugin execution on Windows

 

Hi.

I propose new patch. It takes much more changes, but works fine and looks
good for me. Anyway I need your comments on this.
Main things:
- added a new option to BOM dialog that shown on Windows only;
- changed code of processing the BOM plugins;
- added interface to manipulate of the wxExecute flags;
- added ability to automatically processing the .pyw scripts (like it done
with .py, .xsl);
- added info to the help page.

Regards, Konstantin.

2016-03-22 1:09 GMT+02:00 Chris Pavlina <pavlina.chris@xxxxxxxxx>:

> Yes, ! is a valid file name character on at /least/ Linux, therefore this
> is broken.
>
> On Mon, Mar 21, 2016 at 07:00:02PM -0400, Wayne Stambaugh wrote:
> > Using ! is not going to be intuitive for most users.  This may make
> > sense for developers who are used to cryptic symbols and identifiers but
> > the typical user isn't going to get this.  Isn't ! a valid file name
> > character on Linux?  I don't think this solution is user friendly so I'm
> > standing by my original proposal.
> >
> > On 3/19/2016 3:26 PM, Константин Барановский wrote:
> > > bom_gen_tool.exe --option1 --option2 %I %O --show_console
> > >
> > > Command line looks like all options is pushed to bom_gen_tool.exe and
> > > not obvious that --show_console used to wxExecute.
> > > For me it less intuitive than "!" symbol at beginning of the command
> line.
> > >
> > > 2016-03-19 16:23 GMT+02:00 jp charras <jp.charras@xxxxxxxxxx
> > > <mailto:jp.charras@xxxxxxxxxx>>:
> > >
> > >     Le 18/03/2016 22:17, Константин Барановский a écrit :
> > >     > Parameter like --show-console will be passed to bom generator
> (bom_tool.exe
> > >     > in example), but we need tell wxExecute to run command with flag
> > >     > wxEXEC_SHOW_CONSOLE. And I propose "!" sign at begining of the
> command line
> > >     > to indicate that it must be run with that flag, it may be
> checked like it
> > >     > done with pythonw in bom_pythonw_exec.patch.
> > >
> > >     This is our code.
> > >     This command line is analyzed by Kicad (to expand %I and others).
> > >     A specific option can be filtered and set a wxExecute option like
> > >     wxEXEC_SHOW_CONSOLE (or some other).
> > >
> > >     >
> > >     > 2016-03-18 21:46 GMT+02:00 jp charras <jp.charras@xxxxxxxxxx
> > >     <mailto:jp.charras@xxxxxxxxxx>>:
> > >     >
> > >     >> Le 18/03/2016 19:11, Константин Барановский a écrit :
> > >     >>> What if realize it through the command line of the BOM plugin
> in
> > >     the next
> > >     >>> way :
> > >     >>> "bom_tool.exe %I %O" - execute and hide window (by default);
> > >     >>> "!bom_tool.exe %I %O" - execute and show window.
> > >     >>> Yes, it is not intuitive, but it is rare case and, I think, is
> > >     >> acceptable.
> > >     >>> What do you think?
> > >     >>
> > >     >> Why to reinvent the wheel?
> > >     >>
> > >     >> there are more usual ways to force an option.
> > >     >> for instance, in command line executables, an option is usually
> > >     called
> > >     >> by something like:
> > >     >> --show_console
> > >     >>
> > >     >> Whatever the option, do not forget to update the on help line
> > >     called by
> > >     >> the help button in dialog.
> > >     >>
> > >     >>>
> > >     >>> 2016-03-18 18:02 GMT+02:00 Wayne Stambaugh <
> stambaughw@xxxxxxxxx
> > >     <mailto:stambaughw@xxxxxxxxx>>:
> > >     >>>
> > >     >>>> I don't think setting the wxEXEC_SHOW_CONSOLE for a single
> > >     executable
> > >     >>>> name (in the case of your patch pythonw(.exe)) is a good
> idea.  The
> > >     >>>> problem I foresee is someone will want launch executables X,
> Y,
> > >     and Z
> > >     >>>> and soon this code would spiral out of control.  I would
> rather
> > >     not add
> > >     >>>> pet behavior patches and come up with a more robust solution.
> > >     A better
> > >     >>>> patch would be to add an option to the BOM generator dialog to
> > >     always
> > >     >>>> show the console for a given BOM generator configuration.
> This
> > >     way you
> > >     >>>> can use any executable and configure accordingly.
> > >     >>
> > >     >>
> > >     >>
> > >     >> --
> > >     >> Jean-Pierre CHARRAS
> > >     >>
> > >     >> _______________________________________________
> > >     >> Mailing list: https://launchpad.net/~kicad-developers
> > >     >> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> > >     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
> > >     >> Unsubscribe : https://launchpad.net/~kicad-developers
> > >     >> More help   : https://help.launchpad.net/ListHelp
> > >     >>
> > >     >
> > >
> > >
> > >     --
> > >     Jean-Pierre CHARRAS
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > Mailing list: https://launchpad.net/~kicad-developers
> > > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> > > Unsubscribe : https://launchpad.net/~kicad-developers
> > > More help   : https://help.launchpad.net/ListHelp
> > >
> >
> >
> > _______________________________________________
> > Mailing list: https://launchpad.net/~kicad-developers
> > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> > Unsubscribe : https://launchpad.net/~kicad-developers
> > More help   : https://help.launchpad.net/ListHelp
>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp
>
=== modified file 'eeschema/dialogs/dialog_bom.cpp'
--- eeschema/dialogs/dialog_bom.cpp	2015-09-25 19:38:09 +0000
+++ eeschema/dialogs/dialog_bom.cpp	2016-03-24 09:00:50 +0000
@@ -34,6 +34,7 @@
 #include <confirm.h>
 #include <gestfich.h>
 #include <schframe.h>
+#include <wx/dynarray.h>
 
 #include <netlist.h>
 #include <netlist_exporter_generic.h>
@@ -56,16 +57,34 @@
 using namespace T_BOMCFG_T;
 
 /**
+ * Structure BOM_PLUGIN
+ * holds data of the BOM plugin.
+ */
+struct BOM_PLUGIN
+{
+    wxString Name;
+    wxString Command;
+    wxArrayString Options;
+};
+
+/**
+ * Define wxArray of BOM_PLUGIN.
+ */
+WX_DECLARE_OBJARRAY( BOM_PLUGIN, BOM_PLUGIN_ARRAY );
+#include <wx/arrimpl.cpp>
+WX_DEFINE_OBJARRAY( BOM_PLUGIN_ARRAY );
+
+/**
  * Class BOM_CFG_READER_PARSER
  * holds data and functions pertinent to parsing a S-expression file
  * for a WORKSHEET_LAYOUT.
  */
 class BOM_CFG_READER_PARSER : public DIALOG_BOM_CFG_LEXER
 {
-    wxArrayString* m_pluginsList;
+    BOM_PLUGIN_ARRAY* m_pluginsList;
 
 public:
-    BOM_CFG_READER_PARSER( wxArrayString* aPlugins,
+    BOM_CFG_READER_PARSER( BOM_PLUGIN_ARRAY* aPlugins,
                            const char* aData, const wxString& aSource );
     void Parse() throw( PARSE_ERROR, IO_ERROR );
 
@@ -75,7 +94,7 @@
 
 // PCB_PLOT_PARAMS_PARSER
 
-BOM_CFG_READER_PARSER::BOM_CFG_READER_PARSER(  wxArrayString* aPlugins,
+BOM_CFG_READER_PARSER::BOM_CFG_READER_PARSER(  BOM_PLUGIN_ARRAY* aPlugins,
                                               const char* aLine,
                                               const wxString& aSource ) :
     DIALOG_BOM_CFG_LEXER( aLine, aSource )
@@ -114,10 +133,10 @@
 
 void BOM_CFG_READER_PARSER::parsePlugin() throw( IO_ERROR, PARSE_ERROR )
 {
-    wxString title, command;
+    BOM_PLUGIN plugin;
 
     NeedSYMBOLorNUMBER();
-    title = FromUTF8();
+    plugin.Name = FromUTF8();
 
     T token;
     while( ( token = NextTok() ) != T_RIGHT )
@@ -132,12 +151,14 @@
 
         case T_cmd:
             NeedSYMBOLorNUMBER();
-            command = FromUTF8();
+            plugin.Command = FromUTF8();
             NeedRIGHT();
             break;
 
         case T_opts:
-            while( ( token = NextTok() ) != T_RIGHT && token != T_EOF );
+            NeedSYMBOLorNUMBER();
+            plugin.Options.Add( FromUTF8() );
+            NeedRIGHT();
             break;
 
         default:
@@ -146,23 +167,16 @@
         }
     }
 
-    if( ! title.IsEmpty() )
-    {
-        m_pluginsList->Add( title );
-        m_pluginsList->Add( command );
-    }
+    if( ! plugin.Name.IsEmpty() )
+        m_pluginsList->Add( plugin );
 }
 
-// The main dialog frame tu run scripts to build bom
+// The main dialog frame to run scripts to build bom
 class DIALOG_BOM : public DIALOG_BOM_BASE
 {
 private:
     SCH_EDIT_FRAME*   m_parent;
-    // The list of scripts (or plugins):
-    // a script descr uses 2 lines:
-    // the first is the title
-    // the second is the command line
-    wxArrayString     m_plugins;
+    BOM_PLUGIN_ARRAY  m_plugins;
     wxConfigBase*     m_config;         // to store the "plugins"
 
 public:
@@ -180,6 +194,7 @@
     void OnEditPlugin( wxCommandEvent& event );
     void OnCommandLineEdited( wxCommandEvent& event );
     void OnNameEdited( wxCommandEvent& event );
+    void OnShowConsoleChanged( wxCommandEvent& event );
 
     void pluginInit();
     void installPluginsList();
@@ -218,6 +233,10 @@
     m_config = Kiface().KifaceSettings();
     installPluginsList();
 
+#ifdef __WINDOWS__
+    m_checkBoxShowConsole->Show( true );
+#endif
+
     GetSizer()->Fit( this );
     Centre();
 }
@@ -228,18 +247,27 @@
     // the config stores only one string.
     // plugins are saved inside a S expr:
     // ( plugins
-    //    ( plugin "plugin name" (cmd "command line") )
+    //    ( plugin "plugin name 1" (cmd "command line 1") )
+    //    ( plugin "plugin name 2" (cmd "command line 2") (opts "option1") (opts "option2") )
     //     ....
     // )
 
     STRING_FORMATTER writer;
     writer.Print( 0, "(plugins" );
 
-    for( unsigned ii = 0; ii < m_plugins.GetCount(); ii += 2 )
+    for( unsigned ii = 0; ii < m_plugins.GetCount(); ii++ )
     {
-        writer.Print( 1, "(plugin %s (cmd %s))",
-                      writer.Quotew( m_plugins[ii] ).c_str(),
-                      writer.Quotew( m_plugins[ii+1] ).c_str() );
+        writer.Print( 1, "(plugin %s (cmd %s)",
+                      writer.Quotew( m_plugins.Item( ii ).Name ).c_str(),
+                      writer.Quotew( m_plugins.Item( ii ).Command ).c_str() );
+
+        for( unsigned jj = 0; jj < m_plugins.Item( ii ).Options.GetCount(); jj++ )
+        {
+            writer.Print( 1, "(opts %s)",
+                          writer.Quotew( m_plugins.Item( ii ).Options.Item( jj ) ).c_str() );
+        }
+
+        writer.Print( 0, ")" );
     }
 
     writer.Print( 0, ")" );
@@ -277,12 +305,12 @@
     }
 
     // Populate list box
-    for( unsigned ii = 0; ii < m_plugins.GetCount(); ii+=2 )
+    for( unsigned ii = 0; ii < m_plugins.GetCount(); ii++ )
     {
-        m_lbPlugins->Append( m_plugins[ii] );
+        m_lbPlugins->Append( m_plugins.Item( ii ).Name );
 
-        if( active_plugin_name == m_plugins[ii] )
-            m_lbPlugins->SetSelection( ii/2 );
+        if( active_plugin_name == m_plugins.Item( ii ).Name )
+            m_lbPlugins->SetSelection( ii );
     }
 
     pluginInit();
@@ -305,8 +333,15 @@
         return;
     }
 
-    m_textCtrlName->SetValue( m_plugins[2 * ii] );
-    m_textCtrlCommand->SetValue( m_plugins[(2 * ii)+1] );
+    m_textCtrlName->SetValue( m_plugins.Item( ii ).Name );
+    m_textCtrlCommand->SetValue( m_plugins.Item( ii ).Command );
+
+#ifdef __WINDOWS__
+    if( m_plugins.Item( ii ).Options.Index( wxT( "show_console" ) ) == wxNOT_FOUND )
+        m_checkBoxShowConsole->SetValue( false );
+    else
+        m_checkBoxShowConsole->SetValue( true );
+#endif
 
     wxString pluginName = getPluginFileName( m_textCtrlCommand->GetValue() );
 
@@ -392,6 +427,12 @@
     wxString reportmsg;
     WX_STRING_REPORTER reporter( &reportmsg );
     m_parent->SetNetListerCommand( m_textCtrlCommand->GetValue() );
+
+#ifdef __WINDOWS__
+    if( m_checkBoxShowConsole->IsChecked() )
+        m_parent->SetExecFlags( wxEXEC_SHOW_CONSOLE );
+#endif
+
     m_parent->CreateNetlist( -1, fullfilename, 0, &reporter );
 
     m_Messages->SetValue( reportmsg );
@@ -417,7 +458,7 @@
 
     m_lbPlugins->Delete( ii );
 
-    m_plugins.RemoveAt( 2*ii, 2 ); // Remove title and command line
+    m_plugins.RemoveAt( ii );
 
     // Select the next item, if exists
     if( (int)m_lbPlugins->GetCount() >= ii )
@@ -436,6 +477,7 @@
 void DIALOG_BOM::OnAddPlugin( wxCommandEvent& event )
 {
     wxString cmdLine = choosePlugin();
+    BOM_PLUGIN newPlugin;
 
     if( cmdLine.IsEmpty() )
         return;
@@ -451,18 +493,19 @@
         return;
 
     // Verify if it does not exists
-    for( unsigned ii = 0; ii < m_plugins.GetCount(); ii += 2 )
+    for( unsigned ii = 0; ii < m_plugins.GetCount(); ii++ )
     {
-        if( name == m_plugins[ii] )
+        if( name == m_plugins.Item( ii ).Name )
         {
             wxMessageBox( _("This name already exists. Abort") );
             return;
         }
     }
 
-    // Eppend the new plugin
-    m_plugins.Add( name );
-    m_plugins.Add( wxEmptyString );
+    // Append the new plugin
+    newPlugin.Name = name;
+    newPlugin.Command = wxEmptyString;
+    m_plugins.Add( newPlugin );
     m_lbPlugins->SetSelection( m_lbPlugins->GetCount() - 1 );
     m_lbPlugins->Append( name );
     m_lbPlugins->SetSelection( m_lbPlugins->GetCount() - 1 );
@@ -497,7 +540,7 @@
     // Creates a default command line,
     // suitable to run the external tool xslproc or python
     // The default command line depending on plugin extension, currently
-    // "xsl" or "exe" or "py"
+    // "xsl" or "exe" or "py" or "pyw"
     wxString    cmdLine;
     wxFileName  fn( fullFileName );
     wxString    ext = fn.GetExt();
@@ -508,6 +551,12 @@
         cmdLine.Printf(wxT("\"%s\" < \"%%I\" > \"%%O\""), GetChars( fullFileName ) );
     else if( ext == wxT("py" ) || ext.IsEmpty() )
         cmdLine.Printf(wxT("python \"%s\" \"%%I\" \"%%O\""), GetChars( fullFileName ) );
+    else if( ext == wxT("pyw" ) || ext.IsEmpty() )
+#ifdef __WINDOWS__
+        cmdLine.Printf(wxT("pythonw \"%s\" \"%%I\" \"%%O\""), GetChars( fullFileName ) );
+#else
+        cmdLine.Printf(wxT("python \"%s\" \"%%I\" \"%%O\""), GetChars( fullFileName ) );
+#endif
     else
         cmdLine.Printf(wxT("\"%s\""), GetChars( fullFileName ) );
 
@@ -520,13 +569,17 @@
     wxString pluginName;
 
     // Try to find the plugin name.
-    // This is possible if the name ends by .py or .xsl
+    // This is possible if the name ends by .py or .pyw or .xsl or .exe
     int pos = -1;
 
-    if( (pos = aCommand.Find( wxT(".py") )) != wxNOT_FOUND )
+    if( (pos = aCommand.Find( wxT(".pyw") )) != wxNOT_FOUND )
+        pos += 3;
+    else if( (pos = aCommand.Find( wxT(".py") )) != wxNOT_FOUND )
         pos += 2;
     else if( (pos = aCommand.Find( wxT(".xsl") )) != wxNOT_FOUND )
         pos += 3;
+    else if( (pos = aCommand.Find( wxT(".exe") )) != wxNOT_FOUND )
+        pos += 3;
 
     // the end of plugin name is at position pos.
     if( pos > 0 )
@@ -604,7 +657,7 @@
     if( ii < 0 )
         return;
 
-    m_plugins[(2 * ii)+1] = m_textCtrlCommand->GetValue();
+    m_plugins.Item( ii ).Command = m_textCtrlCommand->GetValue();
 }
 
 void DIALOG_BOM::OnNameEdited( wxCommandEvent& event )
@@ -614,6 +667,26 @@
     if( ii < 0 )
         return;
 
-    m_plugins[2 * ii] = m_textCtrlName->GetValue();
-    m_lbPlugins->SetString( ii, m_plugins[2 * ii] );
+    m_plugins.Item( ii ).Name = m_textCtrlName->GetValue();
+    m_lbPlugins->SetString( ii, m_plugins.Item( ii ).Name );
+}
+
+void DIALOG_BOM::OnShowConsoleChanged( wxCommandEvent& event )
+{
+#ifdef __WINDOWS__
+    int ii = m_lbPlugins->GetSelection();
+
+    if( ii < 0 )
+        return;
+
+    if( m_checkBoxShowConsole->IsChecked() )
+    {
+        if( m_plugins.Item( ii ).Options.Index( wxT( "show_console" ) ) == wxNOT_FOUND )
+            m_plugins.Item( ii ).Options.Add( wxT( "show_console" ) );
+    }
+    else
+    {
+        m_plugins.Item( ii ).Options.Remove( wxT( "show_console" ) );
+    }
+#endif
 }

=== modified file 'eeschema/dialogs/dialog_bom_base.cpp'
--- eeschema/dialogs/dialog_bom_base.cpp	2016-02-19 23:25:03 +0000
+++ eeschema/dialogs/dialog_bom_base.cpp	2016-03-23 13:54:42 +0000
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Mar 28 2015)
+// C++ code generated with wxFormBuilder (version Mar 22 2016)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO "NOT" EDIT THIS FILE!
@@ -19,6 +19,7 @@
 	EVT_BUTTON( ID_REMOVEL_PLUGIN, DIALOG_BOM_BASE::_wxFB_OnRemovePlugin )
 	EVT_BUTTON( wxID_ANY, DIALOG_BOM_BASE::_wxFB_OnEditPlugin )
 	EVT_TEXT( ID_CMDLINE, DIALOG_BOM_BASE::_wxFB_OnCommandLineEdited )
+	EVT_CHECKBOX( wxID_ANY, DIALOG_BOM_BASE::_wxFB_OnShowConsoleChanged )
 END_EVENT_TABLE()
 
 DIALOG_BOM_BASE::DIALOG_BOM_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
@@ -46,7 +47,6 @@
 	bLeftSizer->Add( m_staticTextName, 0, wxRIGHT|wxLEFT, 5 );
 	
 	m_textCtrlName = new wxTextCtrl( this, IN_NAMELINE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
-	m_textCtrlName->SetMaxLength( 0 ); 
 	bLeftSizer->Add( m_textCtrlName, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
 	
 	
@@ -91,11 +91,16 @@
 	bbottomSizer->Add( m_staticTextCmd, 0, wxRIGHT|wxLEFT, 5 );
 	
 	m_textCtrlCommand = new wxTextCtrl( this, ID_CMDLINE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
-	m_textCtrlCommand->SetMaxLength( 0 ); 
 	m_textCtrlCommand->SetMinSize( wxSize( 380,-1 ) );
 	
 	bbottomSizer->Add( m_textCtrlCommand, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
 	
+	m_checkBoxShowConsole = new wxCheckBox( this, wxID_ANY, _("Show console window"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_checkBoxShowConsole->Hide();
+	m_checkBoxShowConsole->SetToolTip( _("By default, command line runs with hidden console window and output is redirected to \"Plugin info\" field. Set this option to show the window of the running command.") );
+	
+	bbottomSizer->Add( m_checkBoxShowConsole, 0, wxBOTTOM|wxLEFT, 5 );
+	
 	
 	bMainSizer->Add( bbottomSizer, 0, wxEXPAND, 5 );
 	

=== modified file 'eeschema/dialogs/dialog_bom_base.fbp'
--- eeschema/dialogs/dialog_bom_base.fbp	2015-06-15 13:54:58 +0000
+++ eeschema/dialogs/dialog_bom_base.fbp	2016-03-23 13:54:55 +0000
@@ -1263,6 +1263,94 @@
                                 <event name="OnUpdateUI"></event>
                             </object>
                         </object>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxBOTTOM|wxLEFT</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">1</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">Show console window</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_checkBoxShowConsole</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">By default, command line runs with hidden console window and output is redirected to &quot;Plugin info&quot; field. Set this option to show the window of the running command.</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">OnShowConsoleChanged</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">
@@ -1383,7 +1471,7 @@
                         <property name="max_size"></property>
                         <property name="maximize_button">0</property>
                         <property name="maximum_size"></property>
-                        <property name="maxlength"></property>
+                        <property name="maxlength">0</property>
                         <property name="min_size"></property>
                         <property name="minimize_button">0</property>
                         <property name="minimum_size"></property>

=== modified file 'eeschema/dialogs/dialog_bom_base.h'
--- eeschema/dialogs/dialog_bom_base.h	2016-02-19 23:25:03 +0000
+++ eeschema/dialogs/dialog_bom_base.h	2016-03-23 12:36:53 +0000
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Mar 28 2015)
+// C++ code generated with wxFormBuilder (version Mar 22 2016)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO "NOT" EDIT THIS FILE!
@@ -25,6 +25,7 @@
 #include <wx/sizer.h>
 #include <wx/button.h>
 #include <wx/statline.h>
+#include <wx/checkbox.h>
 #include <wx/dialog.h>
 
 ///////////////////////////////////////////////////////////////////////////
@@ -47,6 +48,7 @@
 		void _wxFB_OnRemovePlugin( wxCommandEvent& event ){ OnRemovePlugin( event ); }
 		void _wxFB_OnEditPlugin( wxCommandEvent& event ){ OnEditPlugin( event ); }
 		void _wxFB_OnCommandLineEdited( wxCommandEvent& event ){ OnCommandLineEdited( event ); }
+		void _wxFB_OnShowConsoleChanged( wxCommandEvent& event ){ OnShowConsoleChanged( event ); }
 		
 	
 	protected:
@@ -73,6 +75,7 @@
 		wxButton* m_buttonEdit;
 		wxStaticText* m_staticTextCmd;
 		wxTextCtrl* m_textCtrlCommand;
+		wxCheckBox* m_checkBoxShowConsole;
 		wxStaticText* m_staticTextInfo;
 		wxTextCtrl* m_Messages;
 		
@@ -86,6 +89,7 @@
 		virtual void OnRemovePlugin( wxCommandEvent& event ) { event.Skip(); }
 		virtual void OnEditPlugin( wxCommandEvent& event ) { event.Skip(); }
 		virtual void OnCommandLineEdited( wxCommandEvent& event ) { event.Skip(); }
+		virtual void OnShowConsoleChanged( wxCommandEvent& event ) { event.Skip(); }
 		
 	
 	public:

=== modified file 'eeschema/dialogs/dialog_bom_help.html'
--- eeschema/dialogs/dialog_bom_help.html	2015-06-29 16:34:31 +0000
+++ eeschema/dialogs/dialog_bom_help.html	2016-03-24 08:16:35 +0000
@@ -109,6 +109,10 @@
 	command line to launch the converter (usually a script).</font></font></p>
 </ul>
 <p lang="en-US" class="western" style="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
+<font face="Times New Roman, serif"><font size="3" style="font-size: 12pt"><b><i>Note (Windows only):</i></b></font></font></p>
+<p lang="en-US" class="western" style="margin-bottom: 0cm; margin-top: 0cm; margin-left: 1cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
+<font face="Times New Roman, serif"><font size="3" style="font-size: 12pt"><i>By default, command line runs with hidden console window and output is redirected to "Plugin info" field. To show the window of the running command, set the checkbox "Show console window".</i></font></font></p>
+<p lang="en-US" class="western" style="margin-bottom: 0cm; widows: 0; orphans: 0; page-break-before: auto; page-break-after: auto">
 <font face="Times New Roman, serif"><font size="3" style="font-size: 12pt">Once
 you click on the generate button the following will happen:</font></font></p>
 <ol>

=== modified file 'eeschema/netform.cpp'
--- eeschema/netform.cpp	2015-07-01 10:55:41 +0000
+++ eeschema/netform.cpp	2016-03-24 09:12:10 +0000
@@ -104,7 +104,7 @@
         if( aReporter )
         {
             wxArrayString output, errors;
-            int diag = wxExecute( commandLine, output, errors, wxEXEC_SYNC );
+            int diag = wxExecute( commandLine, output, errors, m_exec_flags );
 
             wxString msg;
 
@@ -142,7 +142,9 @@
             }
         }
         else
-            ProcessExecute( commandLine, wxEXEC_SYNC );
+            ProcessExecute( commandLine, m_exec_flags );
+
+        DefaultExecFlags(); // Reset flags to default after executing
     }
 
     return res;

=== modified file 'eeschema/schframe.cpp'
--- eeschema/schframe.cpp	2016-03-06 21:22:01 +0000
+++ eeschema/schframe.cpp	2016-03-24 05:17:25 +0000
@@ -420,6 +420,9 @@
     GetScreen()->SetZoom( BestZoom() );
 
     Zoom_Automatique( false );
+
+    // Net list generator
+    DefaultExecFlags();
 }
 
 

=== modified file 'eeschema/schframe.h'
--- eeschema/schframe.h	2016-02-28 18:16:59 +0000
+++ eeschema/schframe.h	2016-03-24 05:17:08 +0000
@@ -145,6 +145,8 @@
                                                   ///< simulator (gnucap, spice, ...)
     wxString                m_netListerCommand;   ///< Command line to call a custom net list
                                                   ///< generator.
+    int                     m_exec_flags;         ///< Flags of the wxExecute() function
+                                                  ///< to call a custom net list generator.
 
     bool                    m_forceHVLines;       ///< force H or V directions for wires, bus, line
 
@@ -522,7 +524,7 @@
     bool CreateNetlist( int             aFormat,
                         const wxString& aFullFileName,
                         unsigned        aNetlistOptions,
-                        REPORTER* aReporter = NULL );
+                        REPORTER*       aReporter = NULL );
 
     /**
      * Function  WriteNetListFile
@@ -1353,6 +1355,12 @@
 
     void SetNetListerCommand( const wxString& aCommand ) { m_netListerCommand = aCommand; }
 
+    void DefaultExecFlags() { m_exec_flags = wxEXEC_SYNC; }
+
+    void SetExecFlags( const int aFlags ) { m_exec_flags |= aFlags; }
+
+    void ClearExecFlags( const int aFlags ) { m_exec_flags &= ~( aFlags ); }
+
     wxString GetNetListerCommand() const { return m_netListerCommand; }
 
     DECLARE_EVENT_TABLE()


Follow ups

References