IPC-2581: use schematic revision for BOM
The BOM revision in IPC-2581 export was hardcoded to "1.0" instead of reflecting the actual design revision. The project file stores two separate fields: bomRev for explicit user overrides set in the PCBnew export dialog or via --bom-rev on the CLI, and schRevision for the value auto-propagated from eeschema.
This commit is contained in:
@@ -47,7 +47,8 @@ JOB_EXPORT_PCB_IPC2581::JOB_EXPORT_PCB_IPC2581() :
|
||||
m_colMfgPn(),
|
||||
m_colMfg(),
|
||||
m_colDistPn(),
|
||||
m_colDist()
|
||||
m_colDist(),
|
||||
m_bomRev()
|
||||
{
|
||||
m_params.emplace_back( new JOB_PARAM<wxString>( "drawing_sheet", &m_drawingSheet, m_drawingSheet ) );
|
||||
m_params.emplace_back( new JOB_PARAM<IPC2581_UNITS>( "units", &m_units, m_units ) );
|
||||
@@ -64,6 +65,7 @@ JOB_EXPORT_PCB_IPC2581::JOB_EXPORT_PCB_IPC2581() :
|
||||
&m_colDistPn,
|
||||
m_colDistPn ) );
|
||||
m_params.emplace_back( new JOB_PARAM<wxString>( "field_bom_map.dist", &m_colDist, m_colDist ) );
|
||||
m_params.emplace_back( new JOB_PARAM<wxString>( "bom_rev", &m_bomRev, m_bomRev ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ public:
|
||||
wxString m_colMfg;
|
||||
wxString m_colDistPn;
|
||||
wxString m_colDist;
|
||||
wxString m_bomRev;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -195,6 +195,12 @@ PROJECT_FILE::PROJECT_FILE( const wxString& aFullPath ) :
|
||||
m_params.emplace_back( new PARAM<wxString>( "board.ipc2581.dist",
|
||||
&m_IP2581Bom.dist, wxEmptyString ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<wxString>( "board.ipc2581.bom_rev",
|
||||
&m_IP2581Bom.bomRev, wxEmptyString ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<wxString>( "board.ipc2581.sch_revision",
|
||||
&m_IP2581Bom.schRevision, wxEmptyString ) );
|
||||
|
||||
|
||||
registerMigration( 1, 2, std::bind( &PROJECT_FILE::migrateSchema1To2, this ) );
|
||||
registerMigration( 2, 3, std::bind( &PROJECT_FILE::migrateSchema2To3, this ) );
|
||||
|
||||
@@ -223,6 +223,13 @@ void SCH_EDIT_FRAME::saveProjectSettings()
|
||||
}
|
||||
}
|
||||
|
||||
// Propagate the root schematic revision to the project file for IPC-2581 BOM export
|
||||
if( Schematic().RootScreen() )
|
||||
{
|
||||
Prj().GetProjectFile().m_IP2581Bom.schRevision =
|
||||
Schematic().RootScreen()->GetTitleBlock().GetRevision();
|
||||
}
|
||||
|
||||
// Update top-level sheets information in the project file
|
||||
const std::vector<SCH_SHEET*>& topLevelSheets = Schematic().GetTopLevelSheets();
|
||||
|
||||
|
||||
@@ -143,10 +143,12 @@ enum class RATSNEST_MODE
|
||||
struct KICOMMON_API IP2581_BOM
|
||||
{
|
||||
wxString mfg; ///< Manufacturer name column
|
||||
wxString MPN; ///< Manufacturer part number column
|
||||
wxString MPN; ///< Manufacturer part number column
|
||||
wxString dist; ///< Distributor name column
|
||||
wxString distPN; ///< Distributor part number column
|
||||
wxString id; ///< Internal ID column
|
||||
wxString bomRev; ///< Explicit BOM revision override set by user
|
||||
wxString schRevision; ///< Auto-propagated schematic title block revision
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#define ARG_BOM_COL_MFG "--bom-col-mfg"
|
||||
#define ARG_BOM_COL_DIST_PN "--bom-col-dist-pn"
|
||||
#define ARG_BOM_COL_DIST "--bom-col-dist"
|
||||
#define ARG_BOM_REV "--bom-rev"
|
||||
#define ARG_UNITS "--units"
|
||||
|
||||
CLI::PCB_EXPORT_IPC2581_COMMAND::PCB_EXPORT_IPC2581_COMMAND() :
|
||||
@@ -97,6 +98,12 @@ CLI::PCB_EXPORT_IPC2581_COMMAND::PCB_EXPORT_IPC2581_COMMAND() :
|
||||
"Material Distributor Column" ) )
|
||||
.metavar( "FIELD_NAME" );
|
||||
|
||||
m_argParser.add_argument( ARG_BOM_REV )
|
||||
.default_value( std::string() )
|
||||
.help( std::string( "BOM revision to use in the output file. "
|
||||
"Defaults to schematic revision from the project file" ) )
|
||||
.metavar( "REVISION" );
|
||||
|
||||
addVariantsArg();
|
||||
}
|
||||
|
||||
@@ -143,6 +150,8 @@ int CLI::PCB_EXPORT_IPC2581_COMMAND::doPerform( KIWAY& aKiway )
|
||||
From_UTF8( m_argParser.get<std::string>( ARG_BOM_COL_DIST_PN ).c_str() );
|
||||
ipc2581Job->m_colDist =
|
||||
From_UTF8( m_argParser.get<std::string>( ARG_BOM_COL_DIST ).c_str() );
|
||||
ipc2581Job->m_bomRev =
|
||||
From_UTF8( m_argParser.get<std::string>( ARG_BOM_REV ).c_str() );
|
||||
|
||||
LOCALE_IO dummy;
|
||||
return aKiway.ProcessJob( KIWAY::FACE_PCB, ipc2581Job.get() );
|
||||
|
||||
@@ -272,6 +272,11 @@ void DIALOG_EXPORT_2581::onOKClick( wxCommandEvent& event )
|
||||
props[ "dist" ] = TO_UTF8( GetDist() );
|
||||
props[ "distpn" ] = TO_UTF8( GetDistPN() );
|
||||
|
||||
wxString bomRev = m_textBomRev->GetValue();
|
||||
|
||||
if( !bomRev.IsEmpty() )
|
||||
props[ "bomrev" ] = TO_UTF8( bomRev );
|
||||
|
||||
try
|
||||
{
|
||||
IO_RELEASER<PCB_IO> pi( PCB_IO_MGR::FindPlugin( PCB_IO_MGR::IPC2581 ) );
|
||||
@@ -369,6 +374,12 @@ bool DIALOG_EXPORT_2581::TransferDataToWindow()
|
||||
distPnCol = prj.m_IP2581Bom.distPN;
|
||||
mfgCol = prj.m_IP2581Bom.mfg;
|
||||
distCol = prj.m_IP2581Bom.dist;
|
||||
wxString bomRev = prj.m_IP2581Bom.bomRev;
|
||||
|
||||
if( bomRev.IsEmpty() )
|
||||
bomRev = prj.m_IP2581Bom.schRevision;
|
||||
|
||||
m_textBomRev->SetValue( bomRev );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -377,6 +388,7 @@ bool DIALOG_EXPORT_2581::TransferDataToWindow()
|
||||
distPnCol = m_job->m_colDistPn;
|
||||
mfgCol = m_job->m_colMfg;
|
||||
distCol = m_job->m_colDist;
|
||||
m_textBomRev->SetValue( m_job->m_bomRev );
|
||||
}
|
||||
|
||||
if( !m_choiceMPN->SetStringSelection( internalIdCol ) )
|
||||
@@ -433,6 +445,7 @@ bool DIALOG_EXPORT_2581::TransferDataFromWindow()
|
||||
prj.m_IP2581Bom.MPN = GetMPN();
|
||||
prj.m_IP2581Bom.distPN = GetDistPN();
|
||||
prj.m_IP2581Bom.dist = GetDist();
|
||||
prj.m_IP2581Bom.bomRev = m_textBomRev->GetValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -443,6 +456,7 @@ bool DIALOG_EXPORT_2581::TransferDataFromWindow()
|
||||
m_job->m_colDistPn = GetDistPN();
|
||||
m_job->m_colMfg = GetMfg();
|
||||
m_job->m_colMfgPn = GetMPN();
|
||||
m_job->m_bomRev = m_textBomRev->GetValue();
|
||||
|
||||
m_job->m_version = GetVersion() == 'B' ? JOB_EXPORT_PCB_IPC2581::IPC2581_VERSION::B
|
||||
: JOB_EXPORT_PCB_IPC2581::IPC2581_VERSION::C;
|
||||
|
||||
@@ -897,6 +897,135 @@
|
||||
<event name="OnCheckBox">onCompressCheck</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="gbsizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
<property name="column">0</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP</property>
|
||||
<property name="row">4</property>
|
||||
<property name="rowspan">1</property>
|
||||
<object class="wxStaticText" expanded="false">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer">0</property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position">0</property>
|
||||
<property name="aui_row">0</property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="drag_accept_files">0</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">BOM revision:</property>
|
||||
<property name="markup">0</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_lblBomRev</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">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip">Revision string for the BOM section. Auto-populated from schematic title block revision</property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="gbsizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="colspan">1</property>
|
||||
<property name="column">1</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxTOP</property>
|
||||
<property name="row">4</property>
|
||||
<property name="rowspan">1</property>
|
||||
<object class="wxTextCtrl" expanded="false">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer">0</property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position">0</property>
|
||||
<property name="aui_row">0</property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="drag_accept_files">0</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength">0</property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_textBomRev</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">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip">Revision string for the BOM section. Auto-populated from schematic title block revision</property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
||||
@@ -91,6 +91,17 @@ DIALOG_EXPORT_2581_BASE::DIALOG_EXPORT_2581_BASE( wxWindow* parent, wxWindowID i
|
||||
|
||||
gbSizer1->Add( m_cbCompress, wxGBPosition( 3, 0 ), wxGBSpan( 1, 2 ), wxTOP, 5 );
|
||||
|
||||
m_lblBomRev = new wxStaticText( this, wxID_ANY, _("BOM revision:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_lblBomRev->Wrap( -1 );
|
||||
m_lblBomRev->SetToolTip( _("Revision string for the BOM section. Auto-populated from schematic title block revision") );
|
||||
|
||||
gbSizer1->Add( m_lblBomRev, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 );
|
||||
|
||||
m_textBomRev = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_textBomRev->SetToolTip( _("Revision string for the BOM section. Auto-populated from schematic title block revision") );
|
||||
|
||||
gbSizer1->Add( m_textBomRev, wxGBPosition( 4, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxTOP, 5 );
|
||||
|
||||
|
||||
gbSizer1->AddGrowableCol( 1 );
|
||||
|
||||
|
||||
@@ -58,6 +58,8 @@ class DIALOG_EXPORT_2581_BASE : public DIALOG_SHIM
|
||||
wxStaticText* m_lblVersion;
|
||||
wxChoice* m_versionChoice;
|
||||
wxCheckBox* m_cbCompress;
|
||||
wxStaticText* m_lblBomRev;
|
||||
wxTextCtrl* m_textBomRev;
|
||||
wxStaticText* m_columnsLabel;
|
||||
wxStaticLine* m_staticline2;
|
||||
wxStaticText* m_lblOEM;
|
||||
|
||||
@@ -1579,7 +1579,15 @@ wxXmlNode* PCB_IO_IPC2581::generateBOMSection( wxXmlNode* aEcadNode )
|
||||
addAttribute( bomNode, "name", genString( fn.GetName(), "BOM" ) );
|
||||
|
||||
wxXmlNode* bomHeaderNode = appendNode( bomNode, "BomHeader" );
|
||||
addAttribute( bomHeaderNode, "revision", "1.0" );
|
||||
wxString bomRevision = m_bomRev;
|
||||
|
||||
if( bomRevision.IsEmpty() )
|
||||
bomRevision = m_board->GetTitleBlock().GetRevision();
|
||||
|
||||
if( bomRevision.IsEmpty() )
|
||||
bomRevision = wxS( "1.0" );
|
||||
|
||||
addAttribute( bomHeaderNode, "revision", bomRevision );
|
||||
addAttribute( bomHeaderNode, "assembly", genString( fn.GetName() ) );
|
||||
|
||||
wxXmlNode* stepRefNode = appendNode( bomHeaderNode, "StepRef" );
|
||||
@@ -4031,6 +4039,9 @@ void PCB_IO_IPC2581::SaveBoard( const wxString& aFileName, BOARD* aBoard,
|
||||
if( auto it = aProperties->find( "distpn" ); it != aProperties->end() )
|
||||
m_distpn = it->second.wx_str();
|
||||
|
||||
if( auto it = aProperties->find( "bomrev" ); it != aProperties->end() )
|
||||
m_bomRev = it->second.wx_str();
|
||||
|
||||
if( m_version == 'B' )
|
||||
{
|
||||
for( char c = 'a'; c <= 'z'; ++c )
|
||||
|
||||
@@ -302,6 +302,7 @@ private:
|
||||
wxString m_mfg; //<! If set, field name containing the part manufacturer
|
||||
wxString m_distpn; //<! If set, field name containing the distributor part number
|
||||
wxString m_dist; //<! If set, field name containing the distributor name
|
||||
wxString m_bomRev; //<! BOM revision string for the BomHeader element
|
||||
|
||||
// Node pointer to the main enterprise node to be used for adding
|
||||
// enterprises later when forming the AVL
|
||||
|
||||
@@ -2538,6 +2538,20 @@ int PCBNEW_JOBS_HANDLER::JobExportIpc2581( JOB* aJob )
|
||||
props["dist"] = job->m_colDist;
|
||||
props["distpn"] = job->m_colDistPn;
|
||||
|
||||
wxString bomRev = job->m_bomRev;
|
||||
|
||||
if( bomRev.IsEmpty() && brd->GetProject() )
|
||||
{
|
||||
const IP2581_BOM& bomSettings = brd->GetProject()->GetProjectFile().m_IP2581Bom;
|
||||
bomRev = bomSettings.bomRev;
|
||||
|
||||
if( bomRev.IsEmpty() )
|
||||
bomRev = bomSettings.schRevision;
|
||||
}
|
||||
|
||||
if( !bomRev.IsEmpty() )
|
||||
props["bomrev"] = bomRev;
|
||||
|
||||
wxString tempFile = wxFileName::CreateTempFileName( wxS( "pcbnew_ipc" ) );
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user