← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Eeschema wire/bus selection logic

 

No worries.  Here's the patch rebased to current master.

-S

On Mon, Dec 4, 2017 at 5:01 AM, Wayne Stambaugh <stambaughw@xxxxxxxxx>
wrote:

> Seth,
>
> I thought I merged all of your wire/bus patches.  I cannot find this one
> in my inbox.  Please resend this patch when you get a chance.
>
> Thanks,
>
> Wayne
>
> On 12/3/2017 10:57 PM, Seth Hillbrand wrote:
> > Gentle ping.
> >
> > Wayne, this is the wire-drag fix you requested last week.
> >
> > -Seth
> >
> > On Thu, Nov 30, 2017 at 6:53 PM, Jon Evans <jon@xxxxxxxxxxxxx
> > <mailto:jon@xxxxxxxxxxxxx>> wrote:
> >
> >     Gave this a shot, I like this logic, thanks!
> >
> >     On Thu, Nov 30, 2017 at 8:55 PM, Seth Hillbrand
> >     <seth.hillbrand@xxxxxxxxx <mailto:seth.hillbrand@xxxxxxxxx>> wrote:
> >
> >         ​Attached is a patch to correct the wire/bus connection logic.
> >         Currently, Eeschema will register wires and busses as being
> >         connected if their endpoints touch.  They will drag together and
> >         their endpoints will not show the "unconnected" symbols.
> >
> >         The attached patch implements the following logic.  The logic is
> >         largely based on how I like to work with entries, so please
> >         shout if you feel this is backwards somehow.
> >         ​
> >         Dragging:
> >             - busses and bus-bus entries drag each other when connected
> >         at endpoints
> >             - wires and wire-bus entries drag each other when connected
> >         at endpoints
> >             - entries do not drag wires or busses when connected to wire
> >         middles
> >             - wire-bus entries do not drag busses
> >
> >         Connections:
> >             - bus-bus entries connect busses to busses but not wires
> >             - wire-bus entries connect wires to busses but not wire to
> >         wires or busses to busses
> >         ​
> >         ​Best-
> >         Seth​
> >
> >
> >         _______________________________________________
> >         Mailing list: https://launchpad.net/~kicad-developers
> >         <https://launchpad.net/~kicad-developers>
> >         Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> >         <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
> >         Unsubscribe : https://launchpad.net/~kicad-developers
> >         <https://launchpad.net/~kicad-developers>
> >         More help   : https://help.launchpad.net/ListHelp
> >         <https://help.launchpad.net/ListHelp>
> >
> >
> >
> >
> >
> > _______________________________________________
> > Mailing list: https://launchpad.net/~kicad-developers
> > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> > Unsubscribe : https://launchpad.net/~kicad-developers
> > More help   : https://help.launchpad.net/ListHelp
> >
>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp
>
From aa43a41e550f491601435d7e745c149e34afb6a0 Mon Sep 17 00:00:00 2001
From: Seth Hillbrand <hillbrand@xxxxxxxxxxx>
Date: Thu, 30 Nov 2017 17:21:23 -0800
Subject: [PATCH] Eeschema: Correct wire/bus/entry connections

Fixes the connection display and dragging behavior of wires,
busses and their entries.

The implemented drag logic is:
-busses and bus-bus entries drag each other when connected at endpoints
-wires and wire-bus entries drag each other when connected at endpoints
-entries do not drag wires or busses when connected to wire middles
-wire-bus entries do not drag busses

The implemented connection logic is:
-bus-bus entries connect busses to busses but not wires
-wire-bus entries connect wires to busses but not wire to wires or
busses to busses
---
 eeschema/class_sch_screen.h |  3 ++-
 eeschema/sch_bus_entry.cpp  | 36 ++++++++++++++++++++++++++----------
 eeschema/sch_bus_entry.h    | 11 +++++++++--
 eeschema/sch_item_struct.h  |  5 ++++-
 eeschema/sch_line.cpp       |  5 ++++-
 eeschema/sch_screen.cpp     | 12 +++++++++---
 6 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/eeschema/class_sch_screen.h b/eeschema/class_sch_screen.h
index a90763f35..d3aa93d9b 100644
--- a/eeschema/class_sch_screen.h
+++ b/eeschema/class_sch_screen.h
@@ -92,9 +92,10 @@ private:
      * \a aPosition and adds them to the block selection pick list.  This is used when a block
      * drag is being performed to ensure connections to items in the block are not lost.
      *</p>
+     * @param aItem = The item we are connecting from
      * @param aPosition = The connection point to test.
      */
-    void addConnectedItemsToBlock( const wxPoint& aPosition );
+    void addConnectedItemsToBlock( const SCH_ITEM* aItem, const wxPoint& aPosition );
 
 public:
 
diff --git a/eeschema/sch_bus_entry.cpp b/eeschema/sch_bus_entry.cpp
index 7f0af6b85..a9708103c 100644
--- a/eeschema/sch_bus_entry.cpp
+++ b/eeschema/sch_bus_entry.cpp
@@ -78,6 +78,12 @@ EDA_ITEM* SCH_BUS_BUS_ENTRY::Clone() const
 }
 
 
+bool SCH_BUS_ENTRY_BASE::doIsConnected( const wxPoint& aPosition ) const
+{
+    return ( m_pos == aPosition || m_End() == aPosition );
+}
+
+
 wxPoint SCH_BUS_ENTRY_BASE::m_End() const
 {
     return wxPoint( m_pos.x + m_size.x, m_pos.y + m_size.y );
@@ -120,6 +126,26 @@ int SCH_BUS_BUS_ENTRY::GetPenSize() const
 }
 
 
+void SCH_BUS_WIRE_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
+{
+    DANGLING_END_ITEM item( WIRE_ENTRY_END, this, m_pos );
+    aItemList.push_back( item );
+
+    DANGLING_END_ITEM item1( WIRE_ENTRY_END, this, m_End() );
+    aItemList.push_back( item1 );
+}
+
+
+void SCH_BUS_BUS_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
+{
+    DANGLING_END_ITEM item( BUS_ENTRY_END, this, m_pos );
+    aItemList.push_back( item );
+
+    DANGLING_END_ITEM item1( BUS_ENTRY_END, this, m_End() );
+    aItemList.push_back( item1 );
+}
+
+
 void SCH_BUS_ENTRY_BASE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
                           GR_DRAWMODE aDrawMode, COLOR4D aColor )
 {
@@ -175,16 +201,6 @@ void SCH_BUS_ENTRY_BASE::Rotate( wxPoint aPosition )
 }
 
 
-void SCH_BUS_ENTRY_BASE::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
-{
-    DANGLING_END_ITEM item( ENTRY_END, this, m_pos );
-    aItemList.push_back( item );
-
-    DANGLING_END_ITEM item1( ENTRY_END, this, m_End() );
-    aItemList.push_back( item1 );
-}
-
-
 bool SCH_BUS_ENTRY_BASE::IsDanglingStateChanged( std::vector<DANGLING_END_ITEM>& aItemList )
 {
     bool previousStateStart = m_isDanglingStart;
diff --git a/eeschema/sch_bus_entry.h b/eeschema/sch_bus_entry.h
index 90bc07407..bfe18cecd 100644
--- a/eeschema/sch_bus_entry.h
+++ b/eeschema/sch_bus_entry.h
@@ -97,12 +97,12 @@ public:
 
     void Rotate( wxPoint aPosition ) override;
 
-    void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList ) override;
-
     bool IsDanglingStateChanged( std::vector<DANGLING_END_ITEM>& aItemList ) override;
 
     bool IsDangling() const override;
 
+    bool IsUnconnected() const override { return m_isDanglingEnd && m_isDanglingStart; }
+
     bool IsSelectStateChanged( const wxRect& aRect ) override;
 
     bool IsConnectable() const override { return true; }
@@ -122,6 +122,9 @@ public:
 #if defined(DEBUG)
     void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
 #endif
+
+private:
+    bool doIsConnected( const wxPoint& aPosition ) const override;
 };
 
 /**
@@ -141,6 +144,8 @@ public:
 
     int GetPenSize() const override;
 
+    void GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList ) override;
+
     wxString GetSelectMenuText() const override;
 
     EDA_ITEM* Clone() const override;
@@ -165,6 +170,8 @@ public:
 
     int GetPenSize() const override;
 
+    void GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList ) override;
+
     wxString GetSelectMenuText() const override;
 
     EDA_ITEM* Clone() const override;
diff --git a/eeschema/sch_item_struct.h b/eeschema/sch_item_struct.h
index c28922daa..7daadb14a 100644
--- a/eeschema/sch_item_struct.h
+++ b/eeschema/sch_item_struct.h
@@ -63,7 +63,8 @@ enum DANGLING_END_T {
     JUNCTION_END,
     PIN_END,
     LABEL_END,
-    ENTRY_END,
+    BUS_ENTRY_END,
+    WIRE_ENTRY_END,
     SHEET_LABEL_END,
     NO_CONNECT_END,
 };
@@ -253,6 +254,8 @@ public:
 
     virtual bool IsDangling() const { return false; }
 
+    virtual bool IsUnconnected() const { return false; }
+
     /**
      * Function IsSelectStateChanged
      * checks if the selection state of an item inside \a aRect has changed.
diff --git a/eeschema/sch_line.cpp b/eeschema/sch_line.cpp
index ce4ba4cb0..bd1deef88 100644
--- a/eeschema/sch_line.cpp
+++ b/eeschema/sch_line.cpp
@@ -509,7 +509,10 @@ bool SCH_LINE::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi
             if( item.GetItem() == this )
                 continue;
 
-            if( item.GetType() == NO_CONNECT_END )
+            if(     item.GetType() == NO_CONNECT_END ||
+                    item.GetType() == BUS_START_END ||
+                    item.GetType() == BUS_END_END  ||
+                    item.GetType() == BUS_ENTRY_END )
                 continue;
 
             if( m_start == item.GetPosition() )
diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp
index f3f26b07d..dc52d8d2f 100644
--- a/eeschema/sch_screen.cpp
+++ b/eeschema/sch_screen.cpp
@@ -717,7 +717,7 @@ void SCH_SCREEN::SelectBlockItems()
         std::vector< wxPoint > connections;
         item->GetConnectionPoints( connections );
         for( auto conn : connections )
-            addConnectedItemsToBlock( conn );
+            addConnectedItemsToBlock( item, conn );
     };
 
     PICKED_ITEMS_LIST* pickedlist = &m_BlockLocate.GetItems();
@@ -785,23 +785,29 @@ void SCH_SCREEN::SelectBlockItems()
 }
 
 
-void SCH_SCREEN::addConnectedItemsToBlock( const wxPoint& position )
+void SCH_SCREEN::addConnectedItemsToBlock( const SCH_ITEM* aItem, const wxPoint& position )
 {
     SCH_ITEM* item;
     ITEM_PICKER picker;
 
+    if( aItem->IsUnconnected() )
+        return;
+
     for( item = m_drawList.begin(); item; item = item->Next() )
     {
         bool addinlist = true;
         picker.SetItem( item );
 
         if( !item->IsConnectable() || !item->IsConnected( position )
-            || (item->GetFlags() & SKIP_STRUCT) )
+            || (item->GetFlags() & SKIP_STRUCT) || item->IsUnconnected() )
             continue;
 
         if( item->IsSelected() && item->Type() != SCH_LINE_T )
             continue;
 
+        if( item->GetLayer() != aItem->GetLayer() )
+            continue;
+
         // A line having 2 ends, it can be tested twice: one time per end
         if( item->Type() == SCH_LINE_T )
         {
-- 
2.11.0


Follow ups

References