Auto-fill new net global / local label names from connectivity
Currently, new global or local net labels are auto-filled with the
net name if the wire is driven by a global or local label. This
currently happens recursively within SCH_LINE. This fix moves this
to determining the driver from the connectivity graph, and removes
the determination from the SCH_LINE code where it does not belong.
(cherry picked from commit b01796cb84)
This commit is contained in:
@@ -101,47 +101,6 @@ wxString SCH_LINE::GetFriendlyName() const
|
||||
}
|
||||
|
||||
|
||||
wxString SCH_LINE::GetNetname( const SCH_SHEET_PATH& aSheet )
|
||||
{
|
||||
std::list<const SCH_LINE *> checkedLines;
|
||||
checkedLines.push_back(this);
|
||||
return FindWireSegmentNetNameRecursive( this, checkedLines, aSheet );
|
||||
}
|
||||
|
||||
|
||||
wxString SCH_LINE::FindWireSegmentNetNameRecursive( SCH_LINE *line,
|
||||
std::list<const SCH_LINE *> &checkedLines,
|
||||
const SCH_SHEET_PATH& aSheet ) const
|
||||
{
|
||||
for ( auto connected : line->ConnectedItems( aSheet ) )
|
||||
{
|
||||
if( connected->Type() == SCH_LINE_T )
|
||||
{
|
||||
if( std::find(checkedLines.begin(), checkedLines.end(),
|
||||
connected ) == checkedLines.end() )
|
||||
{
|
||||
SCH_LINE* connectedLine = static_cast<SCH_LINE*>( connected );
|
||||
checkedLines.push_back( connectedLine );
|
||||
|
||||
wxString netName = FindWireSegmentNetNameRecursive( connectedLine, checkedLines,
|
||||
aSheet );
|
||||
|
||||
if( !netName.IsEmpty() )
|
||||
return netName;
|
||||
}
|
||||
}
|
||||
else if( connected->Type() == SCH_LABEL_T
|
||||
|| connected->Type() == SCH_GLOBAL_LABEL_T
|
||||
|| connected->Type() == SCH_DIRECTIVE_LABEL_T)
|
||||
{
|
||||
return static_cast<SCH_TEXT*>( connected )->GetText();
|
||||
}
|
||||
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
EDA_ITEM* SCH_LINE::Clone() const
|
||||
{
|
||||
return new SCH_LINE( *this );
|
||||
|
||||
@@ -63,14 +63,6 @@ public:
|
||||
|
||||
wxString GetFriendlyName() const override;
|
||||
|
||||
/**
|
||||
* @brief This function travel though all the connected wire segments
|
||||
* to look for connected labels.
|
||||
* @param aSheet - the sheet where the current wire segment is located
|
||||
* @return returns the name of the wire if connected labels found, otherwise empty string
|
||||
*/
|
||||
wxString GetNetname(const SCH_SHEET_PATH &aSheet);
|
||||
|
||||
bool IsType( const std::vector<KICAD_T>& aScanTypes ) const override
|
||||
{
|
||||
if( SCH_ITEM::IsType( aScanTypes ) )
|
||||
|
||||
@@ -1184,6 +1184,24 @@ SCH_LINE* SCH_DRAWING_TOOLS::findWire( const VECTOR2I& aPosition )
|
||||
}
|
||||
|
||||
|
||||
wxString SCH_DRAWING_TOOLS::findWireLabelDriverName( SCH_LINE* aWire )
|
||||
{
|
||||
wxASSERT( aWire->IsWire() );
|
||||
|
||||
SCH_SHEET_PATH sheetPath = m_frame->GetCurrentSheet();
|
||||
|
||||
if( SCH_CONNECTION* wireConnection = aWire->Connection( &sheetPath ) )
|
||||
{
|
||||
SCH_ITEM* wireDriver = wireConnection->Driver();
|
||||
|
||||
if( wireDriver && wireDriver->IsType( { SCH_LABEL_T, SCH_GLOBAL_LABEL_T } ) )
|
||||
return wireConnection->LocalName();
|
||||
}
|
||||
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
SCH_TEXT* SCH_DRAWING_TOOLS::createNewText( const VECTOR2I& aPosition, int aType )
|
||||
{
|
||||
SCHEMATIC* schematic = getModel<SCHEMATIC>();
|
||||
@@ -1203,7 +1221,7 @@ SCH_TEXT* SCH_DRAWING_TOOLS::createNewText( const VECTOR2I& aPosition, int aType
|
||||
textItem = labelItem;
|
||||
|
||||
if( SCH_LINE* wire = findWire( aPosition ) )
|
||||
netName = wire->GetNetname( m_frame->GetCurrentSheet() );
|
||||
netName = findWireLabelDriverName( wire );
|
||||
|
||||
break;
|
||||
|
||||
@@ -1231,7 +1249,7 @@ SCH_TEXT* SCH_DRAWING_TOOLS::createNewText( const VECTOR2I& aPosition, int aType
|
||||
textItem = labelItem;
|
||||
|
||||
if( SCH_LINE* wire = findWire( aPosition ) )
|
||||
netName = wire->GetNetname( m_frame->GetCurrentSheet() );
|
||||
netName = findWireLabelDriverName( wire );
|
||||
|
||||
break;
|
||||
|
||||
|
||||
@@ -60,6 +60,9 @@ public:
|
||||
private:
|
||||
SCH_LINE* findWire( const VECTOR2I& aPosition );
|
||||
|
||||
///< Gets the (global) label name driving this wire, if it is driven by a label
|
||||
wxString findWireLabelDriverName( SCH_LINE* aWire );
|
||||
|
||||
SCH_TEXT* createNewText( const VECTOR2I& aPosition, int aType );
|
||||
|
||||
SCH_HIERLABEL* importHierLabel( SCH_SHEET* aSheet );
|
||||
|
||||
Reference in New Issue
Block a user