mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 10:13:19 +02:00
PCB array tool: don't count array source pad as reserving its number
Fixes: https://gitlab.com/kicad/code/kicad/-/issues/20722
This commit is contained in:
parent
874fad4846
commit
1b1623885c
@ -26,7 +26,7 @@
|
|||||||
#include <pad.h>
|
#include <pad.h>
|
||||||
|
|
||||||
|
|
||||||
ARRAY_PAD_NUMBER_PROVIDER::ARRAY_PAD_NUMBER_PROVIDER( const FOOTPRINT* aFootprint,
|
ARRAY_PAD_NUMBER_PROVIDER::ARRAY_PAD_NUMBER_PROVIDER( const std::set<wxString>& aExistingPadNumbers,
|
||||||
const ARRAY_OPTIONS& aArrayOpts )
|
const ARRAY_OPTIONS& aArrayOpts )
|
||||||
: m_arrayOpts( aArrayOpts )
|
: m_arrayOpts( aArrayOpts )
|
||||||
{
|
{
|
||||||
@ -41,13 +41,7 @@ ARRAY_PAD_NUMBER_PROVIDER::ARRAY_PAD_NUMBER_PROVIDER( const FOOTPRINT* aFootprin
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no footprint, no reserved names either
|
m_existing_pad_numbers = aExistingPadNumbers;
|
||||||
if( aFootprint )
|
|
||||||
{
|
|
||||||
// reserve the name of each existing pad
|
|
||||||
for( PAD* pad : aFootprint->Pads() )
|
|
||||||
m_existing_pad_numbers.insert( pad->GetNumber() );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ public:
|
|||||||
* @param aFootprint the footprint to gather existing numbers from (nullptr for no footprint)
|
* @param aFootprint the footprint to gather existing numbers from (nullptr for no footprint)
|
||||||
* @param aArrayOpts the array options that provide the candidate numbers
|
* @param aArrayOpts the array options that provide the candidate numbers
|
||||||
*/
|
*/
|
||||||
ARRAY_PAD_NUMBER_PROVIDER( const FOOTPRINT* aFootprint, const ARRAY_OPTIONS& aArrayOpts );
|
ARRAY_PAD_NUMBER_PROVIDER( const std::set<wxString>& aExistingPadNumbers, const ARRAY_OPTIONS& aArrayOpts );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the next available pad name.
|
* Get the next available pad name.
|
||||||
|
@ -130,7 +130,21 @@ void ARRAY_TOOL::onDialogClosed( wxCloseEvent& aEvent )
|
|||||||
FOOTPRINT* const fp =
|
FOOTPRINT* const fp =
|
||||||
m_isFootprintEditor ? editFrame->GetBoard()->GetFirstFootprint() : nullptr;
|
m_isFootprintEditor ? editFrame->GetBoard()->GetFirstFootprint() : nullptr;
|
||||||
|
|
||||||
ARRAY_PAD_NUMBER_PROVIDER pad_number_provider( fp, *m_array_opts );
|
// Collect a list of pad numbers that will _not_ be counted as "used"
|
||||||
|
// when finding the next pad numbers.
|
||||||
|
// Things that are selected are fair game, as they'll give up their numbers.
|
||||||
|
// Keeps numbers used by both selected and unselected pads as "reserved".
|
||||||
|
std::set<wxString> unchangingPadNumbers;
|
||||||
|
if( fp )
|
||||||
|
{
|
||||||
|
for( PAD* pad : fp->Pads() )
|
||||||
|
{
|
||||||
|
if( !pad->IsSelected() )
|
||||||
|
unchangingPadNumbers.insert( pad->GetNumber() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ARRAY_PAD_NUMBER_PROVIDER pad_number_provider( unchangingPadNumbers, *m_array_opts );
|
||||||
|
|
||||||
EDA_ITEMS all_added_items;
|
EDA_ITEMS all_added_items;
|
||||||
|
|
||||||
|
@ -30,24 +30,6 @@
|
|||||||
#include <footprint.h>
|
#include <footprint.h>
|
||||||
#include <pad.h>
|
#include <pad.h>
|
||||||
|
|
||||||
/**
|
|
||||||
* Make a footprint with a given list of named pads
|
|
||||||
*/
|
|
||||||
static std::unique_ptr<FOOTPRINT> FootprintWithPads( const std::vector<wxString> aNames )
|
|
||||||
{
|
|
||||||
std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>( nullptr );
|
|
||||||
|
|
||||||
for( const wxString& name : aNames )
|
|
||||||
{
|
|
||||||
std::unique_ptr<PAD> pad = std::make_unique<PAD>( footprint.get() );
|
|
||||||
|
|
||||||
pad->SetNumber( name );
|
|
||||||
|
|
||||||
footprint->Add( pad.release() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return footprint;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Declare the test suite
|
* Declare the test suite
|
||||||
@ -58,8 +40,7 @@ BOOST_AUTO_TEST_SUITE( ArrayPadNumberProv )
|
|||||||
struct APNP_CASE
|
struct APNP_CASE
|
||||||
{
|
{
|
||||||
std::string m_case_name;
|
std::string m_case_name;
|
||||||
bool m_using_footprint;
|
std::set<wxString> m_existing_pad_numbers;
|
||||||
std::vector<wxString> m_existing_pads;
|
|
||||||
std::unique_ptr<ARRAY_OPTIONS> m_arr_opts;
|
std::unique_ptr<ARRAY_OPTIONS> m_arr_opts;
|
||||||
std::vector<wxString> m_expected_numbers;
|
std::vector<wxString> m_expected_numbers;
|
||||||
};
|
};
|
||||||
@ -82,7 +63,6 @@ std::vector<APNP_CASE> GetFootprintAPNPCases()
|
|||||||
|
|
||||||
cases.push_back( {
|
cases.push_back( {
|
||||||
"Simple linear, skip some",
|
"Simple linear, skip some",
|
||||||
true,
|
|
||||||
{ "1", "3" },
|
{ "1", "3" },
|
||||||
std::move( opts ),
|
std::move( opts ),
|
||||||
{ "2", "4", "5", "6", "7" },
|
{ "2", "4", "5", "6", "7" },
|
||||||
@ -98,7 +78,6 @@ std::vector<APNP_CASE> GetFootprintAPNPCases()
|
|||||||
|
|
||||||
cases.push_back( {
|
cases.push_back( {
|
||||||
"Simple linear, no footprint",
|
"Simple linear, no footprint",
|
||||||
false,
|
|
||||||
{}, // not used
|
{}, // not used
|
||||||
std::move( opts ),
|
std::move( opts ),
|
||||||
{ "1", "2", "3", "4", "5" },
|
{ "1", "2", "3", "4", "5" },
|
||||||
@ -137,10 +116,7 @@ BOOST_AUTO_TEST_CASE( FootprintCases )
|
|||||||
{
|
{
|
||||||
std::unique_ptr<FOOTPRINT> footprint;
|
std::unique_ptr<FOOTPRINT> footprint;
|
||||||
|
|
||||||
if( c.m_using_footprint )
|
ARRAY_PAD_NUMBER_PROVIDER apnp( c.m_existing_pad_numbers, *c.m_arr_opts );
|
||||||
footprint = FootprintWithPads( c.m_existing_pads );
|
|
||||||
|
|
||||||
ARRAY_PAD_NUMBER_PROVIDER apnp( footprint.get(), *c.m_arr_opts );
|
|
||||||
|
|
||||||
CheckPadNumberProvider( apnp, c.m_expected_numbers );
|
CheckPadNumberProvider( apnp, c.m_expected_numbers );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user