← Back to team overview

kicad-developers team mailing list archive

[RFC / Patch] Connector pin style

 

As part of standardising the visual style of connectors, the standard KiCad
libraries now draw connectors with special art on each pin.

I have made a small patch which adds a 'Connector' pin visual style to the
available options, which removes the need for hand-drawn art and makes this
process easier.

gallery:

https://imgur.com/a/HIecX

Patch file attached. Is this something that will be appreciated?

Oliver
From 52210ca4c651fd20527261d931581b96effa2fdb Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@xxxxxxxxx>
Date: Thu, 19 Oct 2017 00:12:53 +1100
Subject: [PATCH] Added 'connector' pin style

- Draws small rectangle with entry pin
- Save / load
- Icon
---
 bitmaps_png/CMakeLists.txt                 |  1 +
 bitmaps_png/cpp_16/pinshape_connector.cpp  | 22 +++++++++
 bitmaps_png/sources/pinshape_connector.svg | 75 ++++++++++++++++++++++++++++++
 eeschema/class_library.h                   |  3 +-
 eeschema/lib_pin.cpp                       | 49 +++++++++++++++++++
 eeschema/pin_shape.cpp                     |  6 +++
 eeschema/pin_shape.h                       |  1 +
 eeschema/sch_legacy_plugin.cpp             | 49 +++++++++++--------
 include/bitmaps.h                          |  1 +
 9 files changed, 186 insertions(+), 21 deletions(-)
 create mode 100644 bitmaps_png/cpp_16/pinshape_connector.cpp
 create mode 100644 bitmaps_png/sources/pinshape_connector.svg

diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt
index 7e88233..581ded2 100644
--- a/bitmaps_png/CMakeLists.txt
+++ b/bitmaps_png/CMakeLists.txt
@@ -86,6 +86,7 @@ set( BMAPS_SMALL
     pinshape_clock_active_low
     pinshape_active_low_output
     pinshape_clock_fall
+    pinshape_connector
     pinshape_nonlogic
     pintype_input
     pintype_output
diff --git a/bitmaps_png/cpp_16/pinshape_connector.cpp b/bitmaps_png/cpp_16/pinshape_connector.cpp
new file mode 100644
index 0000000..4efbe45
--- /dev/null
+++ b/bitmaps_png/cpp_16/pinshape_connector.cpp
@@ -0,0 +1,22 @@
+
+/* Do not modify this file, it was automatically generated by the
+ * PNG2cpp CMake script, using a *.png file as input.
+ */
+
+#include <bitmaps.h>
+
+static const unsigned char png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff,
+ 0x61, 0x00, 0x00, 0x00, 0x57, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x63, 0x60, 0xc0, 0x03, 0xa4,
+ 0xa4, 0xa4, 0xb6, 0x03, 0xf1, 0x7f, 0x09, 0x09, 0x09, 0x4f, 0x06, 0x72, 0xc0, 0x10, 0x31, 0x40,
+ 0x5c, 0x5c, 0x5c, 0x11, 0x17, 0x96, 0x96, 0x96, 0x3e, 0x40, 0xd0, 0x00, 0x90, 0x02, 0x42, 0x98,
+ 0x18, 0x03, 0xd6, 0x03, 0x6d, 0x8b, 0xc7, 0x82, 0x2f, 0x11, 0x6b, 0x40, 0x03, 0x12, 0x3f, 0x17,
+ 0xe4, 0x74, 0x28, 0x7e, 0x0b, 0x92, 0x07, 0x19, 0x84, 0x24, 0x86, 0x82, 0xa9, 0x66, 0x00, 0xc5,
+ 0x5e, 0x20, 0x3f, 0x10, 0x29, 0x8e, 0xc6, 0xd1, 0xbc, 0xc0, 0x00, 0x00, 0x4a, 0x48, 0x6a, 0xa5,
+ 0x2e, 0x78, 0x5a, 0x63, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
+};
+
+const BITMAP_OPAQUE pinshape_connector_xpm[1] = {{ png, sizeof( png ), "pinshape_connector_xpm" }};
+
+//EOF
diff --git a/bitmaps_png/sources/pinshape_connector.svg b/bitmaps_png/sources/pinshape_connector.svg
new file mode 100644
index 0000000..3b8fc0d
--- /dev/null
+++ b/bitmaps_png/sources/pinshape_connector.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   height="16"
+   width="16"
+   version="1.1"
+   id="svg2"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="pinshape_connector.svg">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs20" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1855"
+     inkscape:window-height="1056"
+     id="namedview18"
+     showgrid="true"
+     inkscape:zoom="17.65625"
+     inkscape:cx="14.358419"
+     inkscape:cy="-1.1268556"
+     inkscape:window-x="65"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2999"
+       empspacing="2"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <path
+     d="m 8.2839791,0 0,16"
+     id="path12"
+     inkscape:connector-curvature="0"
+     style="fill:none;stroke:#1a1a1a;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none"
+     sodipodi:nodetypes="cc" />
+  <path
+     d="M 4.4286266,8 16,8"
+     id="path14"
+     inkscape:connector-curvature="0"
+     style="fill:none;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none"
+     sodipodi:nodetypes="cc" />
+  <path
+     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+     d="m 8.3392612,5.6192035 -7.5892612,0 0,4.7615935 8.2119976,0"
+     id="path4136"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/eeschema/class_library.h b/eeschema/class_library.h
index 23bbe8f..cac4f40 100644
--- a/eeschema/class_library.h
+++ b/eeschema/class_library.h
@@ -53,7 +53,8 @@ class SCH_PLUGIN;
  * Part Library version and file header  macros.
  */
 #define LIB_VERSION_MAJOR 2
-#define LIB_VERSION_MINOR 4
+//#define LIB_VERSION_MINOR 4
+#define LIB_VERSION_MINOR 5  // Added 'connector' pin graphical style Oct 2017
 
 /* Must be the first line of part library (.lib) files. */
 #define LIBFILE_IDENT     "EESchema-LIBRARY Version"
diff --git a/eeschema/lib_pin.cpp b/eeschema/lib_pin.cpp
index 1f99840..7c898a3 100644
--- a/eeschema/lib_pin.cpp
+++ b/eeschema/lib_pin.cpp
@@ -658,6 +658,11 @@ bool LIB_PIN::Save( OUTPUTFORMATTER& aFormatter )
             return false;
         break;
 
+    case PINSHAPE_CONNECTOR:
+        if( aFormatter.Print( 0, "P" ) < 0 )
+            return false;
+        break;
+
     case PINSHAPE_NONLOGIC:
         if( aFormatter.Print( 0, "X" ) < 0 )
             return false;
@@ -1099,6 +1104,50 @@ void LIB_PIN::DrawPinSymbol( EDA_DRAW_PANEL* aPanel,
         }
     }
 
+    if( m_shape == PINSHAPE_CONNECTOR )
+    {
+        const int conn_size = InternalPinDecoSize( *this );
+
+        // Dimensions of internal U shape
+        const int L = conn_size * 1.5;
+        const int W = conn_size * 0.75;
+
+        if( MapY1 == 0 ) /* MapX1 = +- 1 */
+        {
+            // Draw the small line inside the 'U' shape
+            GRMoveTo( x1, y1 );
+            GRLineTo( clipbox, aDC, x1 - MapX1 * conn_size * 0.75, y1,
+                      width, color );
+
+            // Draw the 'U' shape
+            GRMoveTo( x1, y1 - W );
+            GRLineTo( clipbox, aDC, x1 - MapX1 * L, y1 - W,
+                      width, color );
+
+            GRLineTo( clipbox, aDC, x1 - MapX1 * L, y1 + W,
+                      width, color );
+
+            GRLineTo( clipbox, aDC, x1, y1 + W,
+                      width, color );
+        }
+        else    /* MapX1 = 0 */
+        {
+            // Draw the small line inside the 'U' shape
+            GRMoveTo( x1, y1 );
+            GRLineTo( clipbox, aDC, x1, y1 - MapY1 * conn_size * 0.75,
+                      width, color );
+
+            // Draw the 'U' shape
+            GRMoveTo( x1 - W, y1 );
+            GRLineTo( clipbox, aDC, x1 - W, y1 - MapY1 * L,
+                      width, color );
+            GRLineTo( clipbox, aDC, x1 + W, y1 - MapY1 * L,
+                      width, color );
+            GRLineTo( clipbox, aDC, x1 + W, y1,
+                      width, color );
+        }
+    }
+
     if( m_shape == PINSHAPE_INPUT_LOW || m_shape == PINSHAPE_CLOCK_LOW )
     {
         const int symbol_size = ExternalPinDecoSize( *this );
diff --git a/eeschema/pin_shape.cpp b/eeschema/pin_shape.cpp
index f59dbb4..570d895 100644
--- a/eeschema/pin_shape.cpp
+++ b/eeschema/pin_shape.cpp
@@ -58,6 +58,9 @@ wxString GetText( GRAPHIC_PINSHAPE shape )
     case PINSHAPE_FALLING_EDGE_CLOCK:
         return _( "Falling edge clock" );
 
+    case PINSHAPE_CONNECTOR:
+        return _( "Connector" );
+
     case PINSHAPE_NONLOGIC:
         return _( "NonLogic" );
     }
@@ -95,6 +98,9 @@ BITMAP_DEF GetBitmap( GRAPHIC_PINSHAPE shape )
     case PINSHAPE_FALLING_EDGE_CLOCK:
         return pinshape_clock_fall_xpm;
 
+    case PINSHAPE_CONNECTOR:
+        return pinshape_connector_xpm;
+
     case PINSHAPE_NONLOGIC:
         return pinshape_nonlogic_xpm;
     }
diff --git a/eeschema/pin_shape.h b/eeschema/pin_shape.h
index 25f11b9..9bb2a5c 100644
--- a/eeschema/pin_shape.h
+++ b/eeschema/pin_shape.h
@@ -42,6 +42,7 @@ enum GRAPHIC_PINSHAPE
     PINSHAPE_CLOCK_LOW,
     PINSHAPE_OUTPUT_LOW,
     PINSHAPE_FALLING_EDGE_CLOCK,
+    PINSHAPE_CONNECTOR,
     PINSHAPE_NONLOGIC
 };
 
diff --git a/eeschema/sch_legacy_plugin.cpp b/eeschema/sch_legacy_plugin.cpp
index c73dad3..1537333 100644
--- a/eeschema/sch_legacy_plugin.cpp
+++ b/eeschema/sch_legacy_plugin.cpp
@@ -3102,12 +3102,13 @@ LIB_PIN* SCH_LEGACY_PLUGIN_CACHE::loadPin( std::unique_ptr< LIB_PART >& aPart,
     {
         enum
         {
-            INVERTED        = 1 << 0,
-            CLOCK           = 1 << 1,
-            LOWLEVEL_IN     = 1 << 2,
-            LOWLEVEL_OUT    = 1 << 3,
-            FALLING_EDGE    = 1 << 4,
-            NONLOGIC        = 1 << 5
+            PIN_ATTR_INVERTED        = 1 << 0,
+            PIN_ATTR_CLOCK           = 1 << 1,
+            PIN_ATTR_LOWLEVEL_IN     = 1 << 2,
+            PIN_ATTR_LOWLEVEL_OUT    = 1 << 3,
+            PIN_ATTR_FALLING_EDGE    = 1 << 4,
+            PIN_ATTR_CONNECTOR       = 1 << 5,
+            PIN_ATTR_NONLOGIC        = 1 << 6
         };
 
         int flags = 0;
@@ -3124,27 +3125,31 @@ LIB_PIN* SCH_LEGACY_PLUGIN_CACHE::loadPin( std::unique_ptr< LIB_PART >& aPart,
                 break;
 
             case 'I':
-                flags |= INVERTED;
+                flags |= PIN_ATTR_INVERTED;
                 break;
 
             case 'C':
-                flags |= CLOCK;
+                flags |= PIN_ATTR_CLOCK;
                 break;
 
             case 'L':
-                flags |= LOWLEVEL_IN;
+                flags |= PIN_ATTR_LOWLEVEL_IN;
                 break;
 
             case 'V':
-                flags |= LOWLEVEL_OUT;
+                flags |= PIN_ATTR_LOWLEVEL_OUT;
                 break;
 
             case 'F':
-                flags |= FALLING_EDGE;
+                flags |= PIN_ATTR_FALLING_EDGE;
                 break;
 
             case 'X':
-                flags |= NONLOGIC;
+                flags |= PIN_ATTR_NONLOGIC;
+                break;
+
+            case 'P':
+                flags |= PIN_ATTR_CONNECTOR;
                 break;
 
             default:
@@ -3158,35 +3163,39 @@ LIB_PIN* SCH_LEGACY_PLUGIN_CACHE::loadPin( std::unique_ptr< LIB_PART >& aPart,
             pin->SetShape( PINSHAPE_LINE );
             break;
 
-        case INVERTED:
+        case PIN_ATTR_INVERTED:
             pin->SetShape( PINSHAPE_INVERTED );
             break;
 
-        case CLOCK:
+        case PIN_ATTR_CLOCK:
             pin->SetShape( PINSHAPE_CLOCK );
             break;
 
-        case INVERTED | CLOCK:
+        case PIN_ATTR_INVERTED | PIN_ATTR_CLOCK:
             pin->SetShape( PINSHAPE_INVERTED_CLOCK );
             break;
 
-        case LOWLEVEL_IN:
+        case PIN_ATTR_LOWLEVEL_IN:
             pin->SetShape( PINSHAPE_INPUT_LOW );
             break;
 
-        case LOWLEVEL_IN | CLOCK:
+        case PIN_ATTR_LOWLEVEL_IN | PIN_ATTR_CLOCK:
             pin->SetShape( PINSHAPE_CLOCK_LOW );
             break;
 
-        case LOWLEVEL_OUT:
+        case PIN_ATTR_LOWLEVEL_OUT:
             pin->SetShape( PINSHAPE_OUTPUT_LOW );
             break;
 
-        case FALLING_EDGE:
+        case PIN_ATTR_FALLING_EDGE:
             pin->SetShape( PINSHAPE_FALLING_EDGE_CLOCK );
             break;
 
-        case NONLOGIC:
+        case PIN_ATTR_CONNECTOR:
+            pin->SetShape( PINSHAPE_CONNECTOR );
+            break;
+
+        case PIN_ATTR_NONLOGIC:
             pin->SetShape( PINSHAPE_NONLOGIC );
             break;
 
diff --git a/include/bitmaps.h b/include/bitmaps.h
index 800ec2d..0c81548 100644
--- a/include/bitmaps.h
+++ b/include/bitmaps.h
@@ -368,6 +368,7 @@ EXTERN_BITMAP( pinshape_invert_xpm )
 EXTERN_BITMAP( pinshape_clock_fall_xpm )
 EXTERN_BITMAP( pinshape_clock_normal_xpm )
 EXTERN_BITMAP( pinshape_clock_invert_xpm )
+EXTERN_BITMAP( pinshape_connector_xpm )
 EXTERN_BITMAP( pinshape_active_low_input_xpm )
 EXTERN_BITMAP( pinshape_clock_active_low_xpm )
 EXTERN_BITMAP( pinshape_active_low_output_xpm )
-- 
2.7.4


Follow ups