[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: Color silk layers in pcb



On 9/6/10, Peter Clifton <pcjc2@xxxxxxxxx> wrote:
...
> confusing "non-copper" with "skip-drc" is
> probably a bad idea.
...

Thank you, your suggestion is really reasonable.

I renamed the attribute to PCB::non-copper
and corrected the variable name and comments accordingly;
probably it does not make the patch perfect,
but I have no better idea at the moment.

Regards,
Ineiev
From 5ec7e281f01fa09b041537e4f4eb8237cda1cc9c Mon Sep 17 00:00:00 2001
From: Ineiev <ineiev@xxxxxxxxxxxxxxxx>
Date: Tue, 7 Sep 2010 10:30:44 +0400
Subject: [PATCH] recognize PCB::non-copper layer attribute

layers with `PCB::non-copper' attribute are excluded
from DRC (both copper- and silkscreen-specific) and connection lookup
---
 src/action.c |    2 +-
 src/action.h |    2 ++
 src/find.c   |   23 +++++++++++++++++++++--
 src/global.h |    2 ++
 4 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/action.c b/src/action.c
index 32e294c..2936080 100644
--- a/src/action.c
+++ b/src/action.c
@@ -6957,7 +6957,7 @@ find_element_by_refdes (char *refdes)
   return NULL;
 }
 
-static AttributeType *
+AttributeType *
 lookup_attr (AttributeListTypePtr list, const char *name)
 {
   int i;
diff --git a/src/action.h b/src/action.h
index ee116e8..7b64e05 100644
--- a/src/action.h
+++ b/src/action.h
@@ -46,4 +46,6 @@ void warpNoWhere (void);
 /* In gui-misc.c */
 bool ActionGetLocation (char *);
 void ActionGetXY (char *);
+AttributeType * lookup_attr (AttributeListTypePtr list, const char *name);
+
 #endif
diff --git a/src/find.c b/src/find.c
index 593be70..17f042f 100644
--- a/src/find.c
+++ b/src/find.c
@@ -81,6 +81,7 @@
 
 #include "global.h"
 
+#include "action.h"
 #include "crosshair.h"
 #include "data.h"
 #include "draw.h"
@@ -826,6 +827,8 @@ LookupLOConnectionsToPVList (bool AndRats)
       /* now all lines, arcs and polygons of the several layers */
       for (layer = 0; layer < max_layer; layer++)
         {
+	  if (LAYER_PTR (layer)->non_copper)
+	    continue;
           info.layer = layer;
           /* add touching lines */
           if (setjmp (info.env) == 0)
@@ -1173,6 +1176,8 @@ LookupPVConnectionsToLOList (bool AndRats)
   /* loop over all layers */
   for (layer = 0; layer < max_layer; layer++)
     {
+      if (LAYER_PTR (layer)->non_copper)
+	continue;
       /* do nothing if there are no PV's */
       if (TotalP + TotalV == 0)
         {
@@ -2900,6 +2905,18 @@ ListsEmpty (bool AndRats)
   return (empty);
 }
 
+static void
+reassign_non_copper_flags (void)
+{
+  int layer;
+
+  for (layer = 0; layer < max_layer; layer++)
+    {
+      LayerTypePtr l = LAYER_PTR (layer);
+      l->non_copper = lookup_attr (&(l->Attributes), "PCB::non-copper") != NULL;
+    }
+}
+
 /* ---------------------------------------------------------------------------
  * loops till no more connections are found 
  */
@@ -2907,6 +2924,7 @@ static bool
 DoIt (bool AndRats, bool AndDraw)
 {
   bool new = false;
+  reassign_non_copper_flags ();
   do
     {
       /* lookup connections; these are the steps (2) to (4)
@@ -3349,6 +3367,7 @@ LookupConnection (LocationType X, LocationType Y, bool AndDraw,
 
   /* check if there are any pins or pads at that position */
 
+  reassign_non_copper_flags ();
 
   type
     = SearchObjectByLocation (LOOKUP_FIRST, &ptr1, &ptr2, &ptr3, X, Y, Range);
@@ -3365,8 +3384,8 @@ LookupConnection (LocationType X, LocationType Y, bool AndDraw,
           int laynum = GetLayerNumber (PCB->Data,
                                        (LayerTypePtr) ptr1);
 
-          /* don't mess with silk objects! */
-          if (laynum >= max_layer)
+          /* don't mess with silk and other non-conducting objects! */
+          if (laynum >= max_layer || ((LayerTypePtr)ptr1)->non_copper)
             return;
         }
     }
diff --git a/src/global.h b/src/global.h
index bb78abc..bb82b79 100644
--- a/src/global.h
+++ b/src/global.h
@@ -301,6 +301,8 @@ typedef struct			/* holds information about one layer */
   char *Color,			/* color */
    *SelectedColor;
   AttributeListType Attributes;
+  int non_copper; /* whether to ignore the layer when looking up connections
+		     and checking against copper-specific design rules */
 }
 LayerType, *LayerTypePtr;
 
-- 
1.6.0.4


_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user