← Back to team overview

kicad-developers team mailing list archive

[PATCH]: pcbnew array numbering for submodules

 

Hi all,

this patch fixes a bug in the function GetReferencePrefix and also adds
a new numbering scheme in the array creation dialog. It will allow to
increment the reference number by 100 or 1000 starting with the name of
the original.

I also attached a small sample project to demonstrate the behaviour:
- The first submodule page is already routed (D201, D202, R201, R202)
- Create an array of the routed submodule and select submodule numbering
- The name of the copies will each now be incremented by 100 (or 1000),
thus reflecting the reference names in the schematic
- Reimport the netlist in order to correct the ratsnest
- Done


The signal name of fills are currently untouched, so it will currently
require manual editing.

Hopefully this is useful for those who do not want to use the
layout-cloner python scripts anymore :)

Regards,
Chris


PS: This is my first submission, I am no C++ programmer and have never
used wxWidgets before, so please excuse potentially dirty code
=== modified file 'pcbnew/class_module.cpp'
--- pcbnew/class_module.cpp	2016-01-29 14:43:40 +0000
+++ pcbnew/class_module.cpp	2016-02-13 00:40:38 +0000
@@ -1247,13 +1247,13 @@
         const wxUniChar chr = prefix.GetChar( strIndex );
 
         // numeric suffix
-        if( chr >= '0' && chr <= '9' )
+        if( !isdigit( chr ) )
             break;
 
         strIndex--;
     }
 
-    prefix = prefix.Mid( 0, strIndex );
+    prefix = prefix.Mid( 0, strIndex + 1 );
 
     return prefix;
 }

=== modified file 'pcbnew/dialogs/dialog_create_array.cpp'
--- pcbnew/dialogs/dialog_create_array.cpp	2015-07-11 23:11:34 +0000
+++ pcbnew/dialogs/dialog_create_array.cpp	2016-02-13 02:12:19 +0000
@@ -86,7 +86,7 @@
 
     Add( m_gridTypeNotebook, m_options.m_arrayTypeTab );
 
-    Add( m_radioBoxGridNumberingScheme, m_options.m_grid2dArrayNumbering );
+    Add( m_radioBoxGridNumberingScheme, m_options.m_gridNumberingScheme );
     Add( m_choicePriAxisNumbering, m_options.m_gridPriAxisNumScheme );
     Add( m_choiceSecAxisNumbering, m_options.m_gridSecAxisNumScheme );
 
@@ -239,7 +239,7 @@
         newGrid->m_horizontalThenVertical = m_radioBoxGridNumberingAxis->GetSelection() == 0;
         newGrid->m_reverseNumberingAlternate = m_checkBoxGridReverseNumbering->GetValue();
 
-        newGrid->m_2dArrayNumbering = m_radioBoxGridNumberingScheme->GetSelection() != 0;
+        newGrid->m_numberingScheme = (ARRAY_NUMBERING_SCHEME_T) m_radioBoxGridNumberingScheme->GetSelection();
 
         // this is only correct if you set the choice up according to the enum size and order
         ok = ok && m_choicePriAxisNumbering->GetSelection() < NUMBERING_TYPE_Max
@@ -259,7 +259,7 @@
                 m_entryGridPriNumberingOffset->GetValue().ToStdString(),
                 newGrid->m_priAxisNumType, newGrid->m_numberingOffsetX );
 
-        if( newGrid->m_2dArrayNumbering )
+        if( newGrid->m_numberingScheme == NUMBERING_SCHEME_COORDINATE )
             ok = ok && getNumberingOffset(
                     m_entryGridSecNumberingOffset->GetValue().ToStdString(),
                     newGrid->m_secAxisNumType, newGrid->m_numberingOffsetY );
@@ -326,21 +326,25 @@
     // If we're not renumbering, we can't set the numbering scheme
     // or axis numbering types
     m_radioBoxGridNumberingScheme->Enable( renumber );
-    m_labelPriAxisNumbering->Enable( renumber );
-    m_choicePriAxisNumbering->Enable( renumber );
 
     // Disable the secondary axis numbering option if the
     // numbering scheme doesn't have two axes
-    const bool num2d = m_radioBoxGridNumberingScheme->GetSelection() != 0;
+    const bool num2d = m_radioBoxGridNumberingScheme->GetSelection() == NUMBERING_SCHEME_COORDINATE;
+    const bool numSub = m_radioBoxGridNumberingScheme->GetSelection() != NUMBERING_SCHEME_SUBMODULE;
 
-    m_labelSecAxisNumbering->Enable( renumber && num2d );
-    m_choiceSecAxisNumbering->Enable( renumber && num2d );
+    m_labelPriAxisNumbering->Enable( renumber && numSub );
+    m_choicePriAxisNumbering->Enable( renumber && numSub );
+    m_labelSecAxisNumbering->Enable( renumber && num2d && numSub );
+    m_choiceSecAxisNumbering->Enable( renumber && num2d && numSub );
 
     // We can only set an offset if we renumber
-    m_labelGridNumberingOffset->Enable( renumber );
-    m_entryGridPriNumberingOffset->Enable( renumber );
-    m_entryGridSecNumberingOffset->Enable( renumber && num2d );
+    m_labelGridNumberingOffset->Enable( renumber && numSub );
+    m_entryGridPriNumberingOffset->Enable( renumber && numSub );
+    m_entryGridSecNumberingOffset->Enable( renumber && num2d && numSub );
 
+    m_labelStagger->Enable( numSub );
+    m_entryStagger->Enable( numSub );
+    m_radioBoxGridStaggerType->Enable( numSub );
 
     // Circular array options
     const bool circRenumber = m_checkBoxCircRestartNumbering->GetValue();
@@ -399,7 +403,7 @@
         int aN, const wxString& aPattern ) const
 {
     wxString newStr( aPattern );
-    newStr.Replace( "%s", GetItemNumber( aN ), false );
+    newStr.Replace( "%s", GetItemNumber( aN, 1 ), false );
 
     return newStr;
 }
@@ -460,20 +464,36 @@
 }
 
 
-wxString DIALOG_CREATE_ARRAY::ARRAY_GRID_OPTIONS::GetItemNumber( int n ) const
+wxString DIALOG_CREATE_ARRAY::ARRAY_GRID_OPTIONS::GetItemNumber( int n, int r ) const
 {
     wxString itemNum;
+    wxPoint coords;
+    int increment;
 
-    if( m_2dArrayNumbering )
+    switch( m_numberingScheme )
     {
-        wxPoint coords = getGridCoords( n );
+    case NUMBERING_SCHEME_COORDINATE:
+        coords = getGridCoords( n );
 
         itemNum += getCoordinateNumber( coords.x + m_numberingOffsetX, m_priAxisNumType );
         itemNum += getCoordinateNumber( coords.y + m_numberingOffsetY, m_secAxisNumType );
-    }
-    else
-    {
+        break;
+
+    case NUMBERING_SCHEME_SUBMODULE:
+    	/* determine the increment based on the current reference number r */
+    	if( r >= 1000 )
+    		increment = 1000;
+    	else if( r >= 100 )
+    		increment = 100;
+    	else
+    		increment = 1;
+
+    	itemNum += wxString::Format( "%i", ( r + increment * n ) );
+    	break;
+
+    default: /* continous numbering */
         itemNum += getCoordinateNumber( n + m_numberingOffsetX, m_priAxisNumType );
+        break;
     }
 
     return itemNum;
@@ -506,7 +526,7 @@
 }
 
 
-wxString DIALOG_CREATE_ARRAY::ARRAY_CIRCULAR_OPTIONS::GetItemNumber( int aN ) const
+wxString DIALOG_CREATE_ARRAY::ARRAY_CIRCULAR_OPTIONS::GetItemNumber( int aN, int aR ) const
 {
     return getCoordinateNumber( aN + m_numberingOffset, m_numberingType );
 }

=== modified file 'pcbnew/dialogs/dialog_create_array.h'
--- pcbnew/dialogs/dialog_create_array.h	2015-04-22 16:39:49 +0000
+++ pcbnew/dialogs/dialog_create_array.h	2016-02-13 02:21:50 +0000
@@ -193,6 +193,15 @@
         NUMBERING_TYPE_Max          ///< Invalid maximum value, insert above here
     };
 
+    enum ARRAY_NUMBERING_SCHEME_T
+	{
+    	NUMBERING_SCHEME_CONTINOUS = 0,
+		NUMBERING_SCHEME_COORDINATE,
+		NUMBERING_SCHEME_SUBMODULE,
+		NUMBERING_SCHEME_TYPE_Max
+	};
+
+
     /**
      * Persistent dialog options
      */
@@ -218,7 +227,7 @@
         virtual void TransformItem( int n, BOARD_ITEM* item,
                 const wxPoint& rotPoint ) const = 0;
         virtual int         GetArraySize() const = 0;
-        virtual wxString GetItemNumber( int n ) const = 0;
+        virtual wxString GetItemNumber( int n, int r ) const = 0;
         virtual wxString InterpolateNumberIntoString( int n, const wxString& pattern ) const;
 
         bool        ShouldRenumberItems() const
@@ -239,7 +248,7 @@
             m_reverseNumberingAlternate( false ),
             m_stagger( 0 ),
             m_stagger_rows( true ),
-            m_2dArrayNumbering( false ),
+            m_numberingScheme( NUMBERING_SCHEME_CONTINOUS ),
             m_numberingOffsetX( 0 ),
             m_numberingOffsetY( 0 ),
             m_priAxisNumType( NUMBERING_NUMERIC ),
@@ -252,13 +261,13 @@
         wxPoint m_offset;
         long    m_stagger;
         bool    m_stagger_rows;
-        bool    m_2dArrayNumbering;
+        ARRAY_NUMBERING_SCHEME_T m_numberingScheme;
         int     m_numberingOffsetX, m_numberingOffsetY;
         ARRAY_NUMBERING_TYPE_T m_priAxisNumType, m_secAxisNumType;
 
         void        TransformItem( int n, BOARD_ITEM* item, const wxPoint& rotPoint ) const;    // override virtual
         int         GetArraySize() const;                                                       // override virtual
-        wxString    GetItemNumber( int n ) const;                                               // override virtual
+        wxString    GetItemNumber( int n, int r ) const;                                               // override virtual
 
 private:
         wxPoint getGridCoords( int n ) const;
@@ -284,7 +293,7 @@
 
         void        TransformItem( int n, BOARD_ITEM* item, const wxPoint& rotPoint ) const;    // override virtual
         int         GetArraySize() const;                                                       // override virtual
-        wxString    GetItemNumber( int n ) const;                                               // override virtual
+        wxString    GetItemNumber( int n, int r ) const;                                               // override virtual
     };
 
     // Constructor and destructor
@@ -319,7 +328,7 @@
             m_gridStaggerType( 0 ),
             m_gridNumberingAxis( 0 ),
             m_gridNumberingReverseAlternate( false ),
-            m_grid2dArrayNumbering( 0 ),
+            m_gridNumberingScheme( 0 ),
             m_gridPriAxisNumScheme( 0 ),
             m_gridSecAxisNumScheme( 0 ),
             m_circRotate( false ),
@@ -335,7 +344,7 @@
 
         int m_gridStaggerType, m_gridNumberingAxis;
         bool    m_gridNumberingReverseAlternate;
-        int     m_grid2dArrayNumbering;
+        int     m_gridNumberingScheme;
         int     m_gridPriAxisNumScheme, m_gridSecAxisNumScheme;
         std::string m_gridPriNumberingOffset, m_gridSecNumberingOffset;
 

=== modified file 'pcbnew/dialogs/dialog_create_array_base.cpp'
--- pcbnew/dialogs/dialog_create_array_base.cpp	2015-11-22 10:21:14 +0000
+++ pcbnew/dialogs/dialog_create_array_base.cpp	2016-02-13 02:14:09 +0000
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Feb 12 2016)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO "NOT" EDIT THIS FILE!
@@ -30,7 +30,7 @@
 	m_labelNx->Wrap( -1 );
 	gbSizer1->Add( m_labelNx, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
 	
-	m_entryNx = new wxTextCtrl( m_gridPanel, wxID_ANY, _("5"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_entryNx = new wxTextCtrl( m_gridPanel, wxID_ANY, _("1"), wxDefaultPosition, wxDefaultSize, 0 );
 	gbSizer1->Add( m_entryNx, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
 	
 	m_labelNy = new wxStaticText( m_gridPanel, wxID_ANY, _("Vertical count:"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -116,10 +116,10 @@
 	m_checkBoxGridRestartNumbering->SetValue(true); 
 	bSizer3->Add( m_checkBoxGridRestartNumbering, 0, wxALL, 5 );
 	
-	wxString m_radioBoxGridNumberingSchemeChoices[] = { _("Continuous (1, 2, 3...)"), _("Coordinate (A1, A2, ... B1, ...)") };
+	wxString m_radioBoxGridNumberingSchemeChoices[] = { _("Continuous (1, 2, 3...)"), _("Coordinate (A1, A2, ... B1, ...)"), _("Submodule (101, 201, ...)") };
 	int m_radioBoxGridNumberingSchemeNChoices = sizeof( m_radioBoxGridNumberingSchemeChoices ) / sizeof( wxString );
 	m_radioBoxGridNumberingScheme = new wxRadioBox( m_gridPanel, wxID_ANY, _("Numbering Scheme"), wxDefaultPosition, wxDefaultSize, m_radioBoxGridNumberingSchemeNChoices, m_radioBoxGridNumberingSchemeChoices, 1, wxRA_SPECIFY_COLS );
-	m_radioBoxGridNumberingScheme->SetSelection( 1 );
+	m_radioBoxGridNumberingScheme->SetSelection( 0 );
 	bSizer3->Add( m_radioBoxGridNumberingScheme, 0, wxALL|wxEXPAND, 5 );
 	
 	m_labelPriAxisNumbering = new wxStaticText( m_gridPanel, wxID_ANY, _("Primary axis numbering:"), wxDefaultPosition, wxDefaultSize, 0 );

=== modified file 'pcbnew/dialogs/dialog_create_array_base.fbp'
--- pcbnew/dialogs/dialog_create_array_base.fbp	2015-11-22 10:21:14 +0000
+++ pcbnew/dialogs/dialog_create_array_base.fbp	2016-02-13 02:14:05 +0000
@@ -258,11 +258,11 @@
                                     <property name="name">bSizer2</property>
                                     <property name="orient">wxHORIZONTAL</property>
                                     <property name="permission">none</property>
-                                    <object class="sizeritem" expanded="0">
+                                    <object class="sizeritem" expanded="1">
                                         <property name="border">5</property>
                                         <property name="flag">wxEXPAND</property>
                                         <property name="proportion">1</property>
-                                        <object class="wxGridBagSizer" expanded="0">
+                                        <object class="wxGridBagSizer" expanded="1">
                                             <property name="empty_cell_size"></property>
                                             <property name="flexible_direction">wxBOTH</property>
                                             <property name="growablecols"></property>
@@ -420,7 +420,7 @@
                                                     <property name="validator_style">wxFILTER_NONE</property>
                                                     <property name="validator_type">wxDefaultValidator</property>
                                                     <property name="validator_variable"></property>
-                                                    <property name="value">5</property>
+                                                    <property name="value">1</property>
                                                     <property name="window_extra_style"></property>
                                                     <property name="window_name"></property>
                                                     <property name="window_style"></property>
@@ -899,14 +899,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">0</property>
                                                 <property name="flag">wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">3</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -985,14 +985,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">1</property>
                                                 <property name="flag">wxALL</property>
                                                 <property name="row">3</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxTextCtrl" expanded="0">
+                                                <object class="wxTextCtrl" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1079,14 +1079,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">2</property>
                                                 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">3</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1165,14 +1165,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">0</property>
                                                 <property name="flag">wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">4</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1251,14 +1251,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">1</property>
                                                 <property name="flag">wxALL</property>
                                                 <property name="row">4</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxTextCtrl" expanded="0">
+                                                <object class="wxTextCtrl" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1345,14 +1345,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">2</property>
                                                 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">4</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1431,14 +1431,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">0</property>
                                                 <property name="flag">wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">5</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1517,14 +1517,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">1</property>
                                                 <property name="flag">wxALL</property>
                                                 <property name="row">5</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxTextCtrl" expanded="0">
+                                                <object class="wxTextCtrl" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1611,14 +1611,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">2</property>
                                                 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">5</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1697,14 +1697,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">0</property>
                                                 <property name="flag">wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</property>
                                                 <property name="row">6</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxStaticText" expanded="0">
+                                                <object class="wxStaticText" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1783,14 +1783,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">1</property>
                                                 <property name="column">1</property>
                                                 <property name="flag">wxALL</property>
                                                 <property name="row">6</property>
                                                 <property name="rowspan">1</property>
-                                                <object class="wxTextCtrl" expanded="0">
+                                                <object class="wxTextCtrl" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -1877,14 +1877,14 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="gbsizeritem" expanded="0">
+                                            <object class="gbsizeritem" expanded="1">
                                                 <property name="border">5</property>
                                                 <property name="colspan">2</property>
                                                 <property name="column">0</property>
                                                 <property name="flag">wxALL|wxEXPAND</property>
                                                 <property name="row">7</property>
                                                 <property name="rowspan">2</property>
-                                                <object class="wxRadioBox" expanded="0">
+                                                <object class="wxRadioBox" expanded="1">
                                                     <property name="BottomDockable">1</property>
                                                     <property name="LeftDockable">1</property>
                                                     <property name="RightDockable">1</property>
@@ -2265,7 +2265,7 @@
                                                     <property name="caption"></property>
                                                     <property name="caption_visible">1</property>
                                                     <property name="center_pane">0</property>
-                                                    <property name="choices">&quot;Continuous (1, 2, 3...)&quot; &quot;Coordinate (A1, A2, ... B1, ...)&quot;</property>
+                                                    <property name="choices">&quot;Continuous (1, 2, 3...)&quot; &quot;Coordinate (A1, A2, ... B1, ...)&quot; &quot;Submodule (101, 201, ...)&quot;</property>
                                                     <property name="close_button">1</property>
                                                     <property name="context_help"></property>
                                                     <property name="context_menu">1</property>
@@ -2297,7 +2297,7 @@
                                                     <property name="pin_button">1</property>
                                                     <property name="pos"></property>
                                                     <property name="resize">Resizable</property>
-                                                    <property name="selection">1</property>
+                                                    <property name="selection">0</property>
                                                     <property name="show">1</property>
                                                     <property name="size"></property>
                                                     <property name="style">wxRA_SPECIFY_COLS</property>
@@ -3038,7 +3038,7 @@
                                 <event name="OnSetFocus"></event>
                                 <event name="OnSize"></event>
                                 <event name="OnUpdateUI"></event>
-                                <object class="wxBoxSizer" expanded="1">
+                                <object class="wxBoxSizer" expanded="0">
                                     <property name="minimum_size"></property>
                                     <property name="name">bSizer4</property>
                                     <property name="orient">wxHORIZONTAL</property>
@@ -4387,11 +4387,11 @@
                                             </object>
                                         </object>
                                     </object>
-                                    <object class="sizeritem" expanded="1">
+                                    <object class="sizeritem" expanded="0">
                                         <property name="border">5</property>
                                         <property name="flag">wxALL|wxEXPAND</property>
                                         <property name="proportion">1</property>
-                                        <object class="wxBoxSizer" expanded="1">
+                                        <object class="wxBoxSizer" expanded="0">
                                             <property name="minimum_size"></property>
                                             <property name="name">bSizer6</property>
                                             <property name="orient">wxVERTICAL</property>
@@ -4655,11 +4655,11 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
-                                            <object class="sizeritem" expanded="1">
+                                            <object class="sizeritem" expanded="0">
                                                 <property name="border">5</property>
                                                 <property name="flag">wxEXPAND</property>
                                                 <property name="proportion">0</property>
-                                                <object class="wxBoxSizer" expanded="1">
+                                                <object class="wxBoxSizer" expanded="0">
                                                     <property name="minimum_size"></property>
                                                     <property name="name">bSizer7</property>
                                                     <property name="orient">wxHORIZONTAL</property>
@@ -4847,11 +4847,11 @@
                         </object>
                     </object>
                 </object>
-                <object class="sizeritem" expanded="0">
+                <object class="sizeritem" expanded="1">
                     <property name="border">5</property>
                     <property name="flag">wxALL|wxEXPAND</property>
                     <property name="proportion">0</property>
-                    <object class="wxStdDialogButtonSizer" expanded="0">
+                    <object class="wxStdDialogButtonSizer" expanded="1">
                         <property name="Apply">0</property>
                         <property name="Cancel">1</property>
                         <property name="ContextHelp">0</property>

=== modified file 'pcbnew/dialogs/dialog_create_array_base.h'
--- pcbnew/dialogs/dialog_create_array_base.h	2015-11-22 10:21:14 +0000
+++ pcbnew/dialogs/dialog_create_array_base.h	2016-02-12 21:08:13 +0000
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Feb 12 2016)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO "NOT" EDIT THIS FILE!

=== modified file 'pcbnew/edit.cpp'
--- pcbnew/edit.cpp	2015-12-20 18:47:52 +0000
+++ pcbnew/edit.cpp	2016-02-12 23:15:15 +0000
@@ -1690,14 +1690,14 @@
             }
             case PCB_MODULE_T:
             {
-                const wxString padName = array_opts->GetItemNumber( ptN );
+                const wxString padName = array_opts->GetItemNumber( ptN, 0 );
                 static_cast<MODULE*>( new_item )->SetReference( cachedString + padName );
 
                 break;
             }
             case PCB_PAD_T:
             {
-                const wxString padName = array_opts->GetItemNumber( ptN );
+                const wxString padName = array_opts->GetItemNumber( ptN, 0 );
                 static_cast<D_PAD*>( new_item )->SetPadName( padName );
 
                 break;

=== modified file 'pcbnew/tools/edit_tool.cpp'
--- pcbnew/tools/edit_tool.cpp	2016-01-11 22:12:11 +0000
+++ pcbnew/tools/edit_tool.cpp	2016-02-13 01:50:06 +0000
@@ -841,10 +841,18 @@
                 continue;
 
             wxString cachedString;
+            long int refNumber;
 
             if( item->Type() == PCB_MODULE_T )
             {
+                wxString refString;
+
+                refString = static_cast<MODULE*>( item )->GetReference();
                 cachedString = static_cast<MODULE*>( item )->GetReferencePrefix();
+
+                // Extract reference number from reference text
+                refString.Replace( cachedString, "", false ); /* it is probably better to get the reference number from the item object */
+                refString.ToLong( &refNumber, 10 );
             }
             else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( item ) )
             {
@@ -912,7 +920,7 @@
                     {
                     case PCB_PAD_T:
                     {
-                        const wxString padName = array_opts->GetItemNumber( ptN );
+                        const wxString padName = array_opts->GetItemNumber( ptN, 0 );
                         static_cast<D_PAD*>( newItem )->SetPadName( padName );
 
                         originalItemsModified = true;
@@ -920,7 +928,7 @@
                     }
                     case PCB_MODULE_T:
                     {
-                        const wxString moduleName = array_opts->GetItemNumber( ptN );
+                        const wxString moduleName = array_opts->GetItemNumber( ptN, refNumber );
                         MODULE* module = static_cast<MODULE*>( newItem );
                         module->SetReference( cachedString + moduleName );
 

Attachment: submodule_test.zip
Description: Zip archive