diff --git a/eeschema/sch_bus_entry.h b/eeschema/sch_bus_entry.h index 7703837e1e..6f105049aa 100644 --- a/eeschema/sch_bus_entry.h +++ b/eeschema/sch_bus_entry.h @@ -43,6 +43,8 @@ public: bool IsDanglingStart() const { return m_isDanglingStart; } bool IsDanglingEnd() const { return m_isDanglingEnd; } + void SetEndDangling( bool aDanglingState ) { m_isDanglingEnd = aDanglingState; } + // Do not create a copy constructor. The one generated by the compiler is adequate. ~SCH_BUS_ENTRY_BASE() { } diff --git a/eeschema/tools/sch_line_wire_bus_tool.cpp b/eeschema/tools/sch_line_wire_bus_tool.cpp index 0a73c054d8..fdafd1712b 100644 --- a/eeschema/tools/sch_line_wire_bus_tool.cpp +++ b/eeschema/tools/sch_line_wire_bus_tool.cpp @@ -375,6 +375,7 @@ int SCH_LINE_WIRE_BUS_TOOL::UnfoldBus( const TOOL_EVENT& aEvent ) SCH_LINE* SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus( const wxString& aNet, const VECTOR2I& aPos ) { SCHEMATIC_SETTINGS& cfg = getModel()->Settings(); + SCH_SCREEN* screen = m_frame->GetScreen(); VECTOR2I pos = aPos; @@ -384,7 +385,7 @@ SCH_LINE* SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus( const wxString& aNet, const VECTO m_toolMgr->RunAction( EE_ACTIONS::clearSelection ); m_busUnfold.entry = new SCH_BUS_WIRE_ENTRY( pos ); - m_busUnfold.entry->SetParent( m_frame->GetScreen() ); + m_busUnfold.entry->SetParent( screen ); m_frame->AddToScreen( m_busUnfold.entry, m_frame->GetScreen() ); m_busUnfold.label = new SCH_LABEL( m_busUnfold.entry->GetEnd(), aNet ); @@ -399,6 +400,15 @@ SCH_LINE* SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus( const wxString& aNet, const VECTO getViewControls()->SetCrossHairCursorPosition( m_busUnfold.entry->GetEnd(), false ); + std::vector endPoints; + + for( SCH_ITEM* item : screen->Items().Overlapping( m_busUnfold.entry->GetBoundingBox() ) ) + item->GetEndPoints( endPoints ); + + m_busUnfold.entry->UpdateDanglingState( endPoints ); + m_busUnfold.entry->SetEndDangling( false ); + m_busUnfold.label->SetIsDangling( false ); + return startSegments( LAYER_WIRE, m_busUnfold.entry->GetEnd() ); }