On 9/6/10, Peter Clifton <pc...@cam.ac.uk> 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 <ine...@users.berlios.de> 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@moria.seul.org http://www.seul.org/cgi-bin/mailman/listinfo/geda-user